1*62c56f98SSadaf Ebrahimi /*
2*62c56f98SSadaf Ebrahimi * TLS shared functions
3*62c56f98SSadaf Ebrahimi *
4*62c56f98SSadaf Ebrahimi * Copyright The Mbed TLS Contributors
5*62c56f98SSadaf Ebrahimi * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
6*62c56f98SSadaf Ebrahimi */
7*62c56f98SSadaf Ebrahimi /*
8*62c56f98SSadaf Ebrahimi * http://www.ietf.org/rfc/rfc2246.txt
9*62c56f98SSadaf Ebrahimi * http://www.ietf.org/rfc/rfc4346.txt
10*62c56f98SSadaf Ebrahimi */
11*62c56f98SSadaf Ebrahimi
12*62c56f98SSadaf Ebrahimi #include "common.h"
13*62c56f98SSadaf Ebrahimi
14*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_TLS_C)
15*62c56f98SSadaf Ebrahimi
16*62c56f98SSadaf Ebrahimi #include "mbedtls/platform.h"
17*62c56f98SSadaf Ebrahimi
18*62c56f98SSadaf Ebrahimi #include "mbedtls/ssl.h"
19*62c56f98SSadaf Ebrahimi #include "ssl_client.h"
20*62c56f98SSadaf Ebrahimi #include "ssl_debug_helpers.h"
21*62c56f98SSadaf Ebrahimi #include "ssl_misc.h"
22*62c56f98SSadaf Ebrahimi
23*62c56f98SSadaf Ebrahimi #include "mbedtls/debug.h"
24*62c56f98SSadaf Ebrahimi #include "mbedtls/error.h"
25*62c56f98SSadaf Ebrahimi #include "mbedtls/platform_util.h"
26*62c56f98SSadaf Ebrahimi #include "mbedtls/version.h"
27*62c56f98SSadaf Ebrahimi #include "mbedtls/constant_time.h"
28*62c56f98SSadaf Ebrahimi
29*62c56f98SSadaf Ebrahimi #include <string.h>
30*62c56f98SSadaf Ebrahimi
31*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO)
32*62c56f98SSadaf Ebrahimi #include "md_psa.h"
33*62c56f98SSadaf Ebrahimi #include "psa_util_internal.h"
34*62c56f98SSadaf Ebrahimi #include "psa/crypto.h"
35*62c56f98SSadaf Ebrahimi #endif
36*62c56f98SSadaf Ebrahimi
37*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_X509_CRT_PARSE_C)
38*62c56f98SSadaf Ebrahimi #include "mbedtls/oid.h"
39*62c56f98SSadaf Ebrahimi #endif
40*62c56f98SSadaf Ebrahimi
41*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO)
42*62c56f98SSadaf Ebrahimi /* Define local translating functions to save code size by not using too many
43*62c56f98SSadaf Ebrahimi * arguments in each translating place. */
local_err_translation(psa_status_t status)44*62c56f98SSadaf Ebrahimi static int local_err_translation(psa_status_t status)
45*62c56f98SSadaf Ebrahimi {
46*62c56f98SSadaf Ebrahimi return psa_status_to_mbedtls(status, psa_to_ssl_errors,
47*62c56f98SSadaf Ebrahimi ARRAY_LENGTH(psa_to_ssl_errors),
48*62c56f98SSadaf Ebrahimi psa_generic_status_to_mbedtls);
49*62c56f98SSadaf Ebrahimi }
50*62c56f98SSadaf Ebrahimi #define PSA_TO_MBEDTLS_ERR(status) local_err_translation(status)
51*62c56f98SSadaf Ebrahimi #endif
52*62c56f98SSadaf Ebrahimi
53*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_TEST_HOOKS)
54*62c56f98SSadaf Ebrahimi static mbedtls_ssl_chk_buf_ptr_args chk_buf_ptr_fail_args;
55*62c56f98SSadaf Ebrahimi
mbedtls_ssl_set_chk_buf_ptr_fail_args(const uint8_t * cur,const uint8_t * end,size_t need)56*62c56f98SSadaf Ebrahimi void mbedtls_ssl_set_chk_buf_ptr_fail_args(
57*62c56f98SSadaf Ebrahimi const uint8_t *cur, const uint8_t *end, size_t need)
58*62c56f98SSadaf Ebrahimi {
59*62c56f98SSadaf Ebrahimi chk_buf_ptr_fail_args.cur = cur;
60*62c56f98SSadaf Ebrahimi chk_buf_ptr_fail_args.end = end;
61*62c56f98SSadaf Ebrahimi chk_buf_ptr_fail_args.need = need;
62*62c56f98SSadaf Ebrahimi }
63*62c56f98SSadaf Ebrahimi
mbedtls_ssl_reset_chk_buf_ptr_fail_args(void)64*62c56f98SSadaf Ebrahimi void mbedtls_ssl_reset_chk_buf_ptr_fail_args(void)
65*62c56f98SSadaf Ebrahimi {
66*62c56f98SSadaf Ebrahimi memset(&chk_buf_ptr_fail_args, 0, sizeof(chk_buf_ptr_fail_args));
67*62c56f98SSadaf Ebrahimi }
68*62c56f98SSadaf Ebrahimi
mbedtls_ssl_cmp_chk_buf_ptr_fail_args(mbedtls_ssl_chk_buf_ptr_args * args)69*62c56f98SSadaf Ebrahimi int mbedtls_ssl_cmp_chk_buf_ptr_fail_args(mbedtls_ssl_chk_buf_ptr_args *args)
70*62c56f98SSadaf Ebrahimi {
71*62c56f98SSadaf Ebrahimi return (chk_buf_ptr_fail_args.cur != args->cur) ||
72*62c56f98SSadaf Ebrahimi (chk_buf_ptr_fail_args.end != args->end) ||
73*62c56f98SSadaf Ebrahimi (chk_buf_ptr_fail_args.need != args->need);
74*62c56f98SSadaf Ebrahimi }
75*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_TEST_HOOKS */
76*62c56f98SSadaf Ebrahimi
77*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_DTLS)
78*62c56f98SSadaf Ebrahimi
79*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
80*62c56f98SSadaf Ebrahimi /* Top-level Connection ID API */
81*62c56f98SSadaf Ebrahimi
mbedtls_ssl_conf_cid(mbedtls_ssl_config * conf,size_t len,int ignore_other_cid)82*62c56f98SSadaf Ebrahimi int mbedtls_ssl_conf_cid(mbedtls_ssl_config *conf,
83*62c56f98SSadaf Ebrahimi size_t len,
84*62c56f98SSadaf Ebrahimi int ignore_other_cid)
85*62c56f98SSadaf Ebrahimi {
86*62c56f98SSadaf Ebrahimi if (len > MBEDTLS_SSL_CID_IN_LEN_MAX) {
87*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
88*62c56f98SSadaf Ebrahimi }
89*62c56f98SSadaf Ebrahimi
90*62c56f98SSadaf Ebrahimi if (ignore_other_cid != MBEDTLS_SSL_UNEXPECTED_CID_FAIL &&
91*62c56f98SSadaf Ebrahimi ignore_other_cid != MBEDTLS_SSL_UNEXPECTED_CID_IGNORE) {
92*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
93*62c56f98SSadaf Ebrahimi }
94*62c56f98SSadaf Ebrahimi
95*62c56f98SSadaf Ebrahimi conf->ignore_unexpected_cid = ignore_other_cid;
96*62c56f98SSadaf Ebrahimi conf->cid_len = len;
97*62c56f98SSadaf Ebrahimi return 0;
98*62c56f98SSadaf Ebrahimi }
99*62c56f98SSadaf Ebrahimi
mbedtls_ssl_set_cid(mbedtls_ssl_context * ssl,int enable,unsigned char const * own_cid,size_t own_cid_len)100*62c56f98SSadaf Ebrahimi int mbedtls_ssl_set_cid(mbedtls_ssl_context *ssl,
101*62c56f98SSadaf Ebrahimi int enable,
102*62c56f98SSadaf Ebrahimi unsigned char const *own_cid,
103*62c56f98SSadaf Ebrahimi size_t own_cid_len)
104*62c56f98SSadaf Ebrahimi {
105*62c56f98SSadaf Ebrahimi if (ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
106*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
107*62c56f98SSadaf Ebrahimi }
108*62c56f98SSadaf Ebrahimi
109*62c56f98SSadaf Ebrahimi ssl->negotiate_cid = enable;
110*62c56f98SSadaf Ebrahimi if (enable == MBEDTLS_SSL_CID_DISABLED) {
111*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(3, ("Disable use of CID extension."));
112*62c56f98SSadaf Ebrahimi return 0;
113*62c56f98SSadaf Ebrahimi }
114*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(3, ("Enable use of CID extension."));
115*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_BUF(3, "Own CID", own_cid, own_cid_len);
116*62c56f98SSadaf Ebrahimi
117*62c56f98SSadaf Ebrahimi if (own_cid_len != ssl->conf->cid_len) {
118*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(3, ("CID length %u does not match CID length %u in config",
119*62c56f98SSadaf Ebrahimi (unsigned) own_cid_len,
120*62c56f98SSadaf Ebrahimi (unsigned) ssl->conf->cid_len));
121*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
122*62c56f98SSadaf Ebrahimi }
123*62c56f98SSadaf Ebrahimi
124*62c56f98SSadaf Ebrahimi memcpy(ssl->own_cid, own_cid, own_cid_len);
125*62c56f98SSadaf Ebrahimi /* Truncation is not an issue here because
126*62c56f98SSadaf Ebrahimi * MBEDTLS_SSL_CID_IN_LEN_MAX at most 255. */
127*62c56f98SSadaf Ebrahimi ssl->own_cid_len = (uint8_t) own_cid_len;
128*62c56f98SSadaf Ebrahimi
129*62c56f98SSadaf Ebrahimi return 0;
130*62c56f98SSadaf Ebrahimi }
131*62c56f98SSadaf Ebrahimi
mbedtls_ssl_get_own_cid(mbedtls_ssl_context * ssl,int * enabled,unsigned char own_cid[MBEDTLS_SSL_CID_OUT_LEN_MAX],size_t * own_cid_len)132*62c56f98SSadaf Ebrahimi int mbedtls_ssl_get_own_cid(mbedtls_ssl_context *ssl,
133*62c56f98SSadaf Ebrahimi int *enabled,
134*62c56f98SSadaf Ebrahimi unsigned char own_cid[MBEDTLS_SSL_CID_OUT_LEN_MAX],
135*62c56f98SSadaf Ebrahimi size_t *own_cid_len)
136*62c56f98SSadaf Ebrahimi {
137*62c56f98SSadaf Ebrahimi *enabled = MBEDTLS_SSL_CID_DISABLED;
138*62c56f98SSadaf Ebrahimi
139*62c56f98SSadaf Ebrahimi if (ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
140*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
141*62c56f98SSadaf Ebrahimi }
142*62c56f98SSadaf Ebrahimi
143*62c56f98SSadaf Ebrahimi /* We report MBEDTLS_SSL_CID_DISABLED in case the CID length is
144*62c56f98SSadaf Ebrahimi * zero as this is indistinguishable from not requesting to use
145*62c56f98SSadaf Ebrahimi * the CID extension. */
146*62c56f98SSadaf Ebrahimi if (ssl->own_cid_len == 0 || ssl->negotiate_cid == MBEDTLS_SSL_CID_DISABLED) {
147*62c56f98SSadaf Ebrahimi return 0;
148*62c56f98SSadaf Ebrahimi }
149*62c56f98SSadaf Ebrahimi
150*62c56f98SSadaf Ebrahimi if (own_cid_len != NULL) {
151*62c56f98SSadaf Ebrahimi *own_cid_len = ssl->own_cid_len;
152*62c56f98SSadaf Ebrahimi if (own_cid != NULL) {
153*62c56f98SSadaf Ebrahimi memcpy(own_cid, ssl->own_cid, ssl->own_cid_len);
154*62c56f98SSadaf Ebrahimi }
155*62c56f98SSadaf Ebrahimi }
156*62c56f98SSadaf Ebrahimi
157*62c56f98SSadaf Ebrahimi *enabled = MBEDTLS_SSL_CID_ENABLED;
158*62c56f98SSadaf Ebrahimi
159*62c56f98SSadaf Ebrahimi return 0;
160*62c56f98SSadaf Ebrahimi }
161*62c56f98SSadaf Ebrahimi
mbedtls_ssl_get_peer_cid(mbedtls_ssl_context * ssl,int * enabled,unsigned char peer_cid[MBEDTLS_SSL_CID_OUT_LEN_MAX],size_t * peer_cid_len)162*62c56f98SSadaf Ebrahimi int mbedtls_ssl_get_peer_cid(mbedtls_ssl_context *ssl,
163*62c56f98SSadaf Ebrahimi int *enabled,
164*62c56f98SSadaf Ebrahimi unsigned char peer_cid[MBEDTLS_SSL_CID_OUT_LEN_MAX],
165*62c56f98SSadaf Ebrahimi size_t *peer_cid_len)
166*62c56f98SSadaf Ebrahimi {
167*62c56f98SSadaf Ebrahimi *enabled = MBEDTLS_SSL_CID_DISABLED;
168*62c56f98SSadaf Ebrahimi
169*62c56f98SSadaf Ebrahimi if (ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM ||
170*62c56f98SSadaf Ebrahimi mbedtls_ssl_is_handshake_over(ssl) == 0) {
171*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
172*62c56f98SSadaf Ebrahimi }
173*62c56f98SSadaf Ebrahimi
174*62c56f98SSadaf Ebrahimi /* We report MBEDTLS_SSL_CID_DISABLED in case the CID extensions
175*62c56f98SSadaf Ebrahimi * were used, but client and server requested the empty CID.
176*62c56f98SSadaf Ebrahimi * This is indistinguishable from not using the CID extension
177*62c56f98SSadaf Ebrahimi * in the first place. */
178*62c56f98SSadaf Ebrahimi if (ssl->transform_in->in_cid_len == 0 &&
179*62c56f98SSadaf Ebrahimi ssl->transform_in->out_cid_len == 0) {
180*62c56f98SSadaf Ebrahimi return 0;
181*62c56f98SSadaf Ebrahimi }
182*62c56f98SSadaf Ebrahimi
183*62c56f98SSadaf Ebrahimi if (peer_cid_len != NULL) {
184*62c56f98SSadaf Ebrahimi *peer_cid_len = ssl->transform_in->out_cid_len;
185*62c56f98SSadaf Ebrahimi if (peer_cid != NULL) {
186*62c56f98SSadaf Ebrahimi memcpy(peer_cid, ssl->transform_in->out_cid,
187*62c56f98SSadaf Ebrahimi ssl->transform_in->out_cid_len);
188*62c56f98SSadaf Ebrahimi }
189*62c56f98SSadaf Ebrahimi }
190*62c56f98SSadaf Ebrahimi
191*62c56f98SSadaf Ebrahimi *enabled = MBEDTLS_SSL_CID_ENABLED;
192*62c56f98SSadaf Ebrahimi
193*62c56f98SSadaf Ebrahimi return 0;
194*62c56f98SSadaf Ebrahimi }
195*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
196*62c56f98SSadaf Ebrahimi
197*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_PROTO_DTLS */
198*62c56f98SSadaf Ebrahimi
199*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
200*62c56f98SSadaf Ebrahimi /*
201*62c56f98SSadaf Ebrahimi * Convert max_fragment_length codes to length.
202*62c56f98SSadaf Ebrahimi * RFC 6066 says:
203*62c56f98SSadaf Ebrahimi * enum{
204*62c56f98SSadaf Ebrahimi * 2^9(1), 2^10(2), 2^11(3), 2^12(4), (255)
205*62c56f98SSadaf Ebrahimi * } MaxFragmentLength;
206*62c56f98SSadaf Ebrahimi * and we add 0 -> extension unused
207*62c56f98SSadaf Ebrahimi */
ssl_mfl_code_to_length(int mfl)208*62c56f98SSadaf Ebrahimi static unsigned int ssl_mfl_code_to_length(int mfl)
209*62c56f98SSadaf Ebrahimi {
210*62c56f98SSadaf Ebrahimi switch (mfl) {
211*62c56f98SSadaf Ebrahimi case MBEDTLS_SSL_MAX_FRAG_LEN_NONE:
212*62c56f98SSadaf Ebrahimi return MBEDTLS_TLS_EXT_ADV_CONTENT_LEN;
213*62c56f98SSadaf Ebrahimi case MBEDTLS_SSL_MAX_FRAG_LEN_512:
214*62c56f98SSadaf Ebrahimi return 512;
215*62c56f98SSadaf Ebrahimi case MBEDTLS_SSL_MAX_FRAG_LEN_1024:
216*62c56f98SSadaf Ebrahimi return 1024;
217*62c56f98SSadaf Ebrahimi case MBEDTLS_SSL_MAX_FRAG_LEN_2048:
218*62c56f98SSadaf Ebrahimi return 2048;
219*62c56f98SSadaf Ebrahimi case MBEDTLS_SSL_MAX_FRAG_LEN_4096:
220*62c56f98SSadaf Ebrahimi return 4096;
221*62c56f98SSadaf Ebrahimi default:
222*62c56f98SSadaf Ebrahimi return MBEDTLS_TLS_EXT_ADV_CONTENT_LEN;
223*62c56f98SSadaf Ebrahimi }
224*62c56f98SSadaf Ebrahimi }
225*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
226*62c56f98SSadaf Ebrahimi
mbedtls_ssl_session_copy(mbedtls_ssl_session * dst,const mbedtls_ssl_session * src)227*62c56f98SSadaf Ebrahimi int mbedtls_ssl_session_copy(mbedtls_ssl_session *dst,
228*62c56f98SSadaf Ebrahimi const mbedtls_ssl_session *src)
229*62c56f98SSadaf Ebrahimi {
230*62c56f98SSadaf Ebrahimi mbedtls_ssl_session_free(dst);
231*62c56f98SSadaf Ebrahimi memcpy(dst, src, sizeof(mbedtls_ssl_session));
232*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C)
233*62c56f98SSadaf Ebrahimi dst->ticket = NULL;
234*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_TLS1_3) && \
235*62c56f98SSadaf Ebrahimi defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
236*62c56f98SSadaf Ebrahimi dst->hostname = NULL;
237*62c56f98SSadaf Ebrahimi #endif
238*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_CLI_C */
239*62c56f98SSadaf Ebrahimi
240*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_X509_CRT_PARSE_C)
241*62c56f98SSadaf Ebrahimi
242*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
243*62c56f98SSadaf Ebrahimi if (src->peer_cert != NULL) {
244*62c56f98SSadaf Ebrahimi int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
245*62c56f98SSadaf Ebrahimi
246*62c56f98SSadaf Ebrahimi dst->peer_cert = mbedtls_calloc(1, sizeof(mbedtls_x509_crt));
247*62c56f98SSadaf Ebrahimi if (dst->peer_cert == NULL) {
248*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_ALLOC_FAILED;
249*62c56f98SSadaf Ebrahimi }
250*62c56f98SSadaf Ebrahimi
251*62c56f98SSadaf Ebrahimi mbedtls_x509_crt_init(dst->peer_cert);
252*62c56f98SSadaf Ebrahimi
253*62c56f98SSadaf Ebrahimi if ((ret = mbedtls_x509_crt_parse_der(dst->peer_cert, src->peer_cert->raw.p,
254*62c56f98SSadaf Ebrahimi src->peer_cert->raw.len)) != 0) {
255*62c56f98SSadaf Ebrahimi mbedtls_free(dst->peer_cert);
256*62c56f98SSadaf Ebrahimi dst->peer_cert = NULL;
257*62c56f98SSadaf Ebrahimi return ret;
258*62c56f98SSadaf Ebrahimi }
259*62c56f98SSadaf Ebrahimi }
260*62c56f98SSadaf Ebrahimi #else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
261*62c56f98SSadaf Ebrahimi if (src->peer_cert_digest != NULL) {
262*62c56f98SSadaf Ebrahimi dst->peer_cert_digest =
263*62c56f98SSadaf Ebrahimi mbedtls_calloc(1, src->peer_cert_digest_len);
264*62c56f98SSadaf Ebrahimi if (dst->peer_cert_digest == NULL) {
265*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_ALLOC_FAILED;
266*62c56f98SSadaf Ebrahimi }
267*62c56f98SSadaf Ebrahimi
268*62c56f98SSadaf Ebrahimi memcpy(dst->peer_cert_digest, src->peer_cert_digest,
269*62c56f98SSadaf Ebrahimi src->peer_cert_digest_len);
270*62c56f98SSadaf Ebrahimi dst->peer_cert_digest_type = src->peer_cert_digest_type;
271*62c56f98SSadaf Ebrahimi dst->peer_cert_digest_len = src->peer_cert_digest_len;
272*62c56f98SSadaf Ebrahimi }
273*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
274*62c56f98SSadaf Ebrahimi
275*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_X509_CRT_PARSE_C */
276*62c56f98SSadaf Ebrahimi
277*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C)
278*62c56f98SSadaf Ebrahimi if (src->ticket != NULL) {
279*62c56f98SSadaf Ebrahimi dst->ticket = mbedtls_calloc(1, src->ticket_len);
280*62c56f98SSadaf Ebrahimi if (dst->ticket == NULL) {
281*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_ALLOC_FAILED;
282*62c56f98SSadaf Ebrahimi }
283*62c56f98SSadaf Ebrahimi
284*62c56f98SSadaf Ebrahimi memcpy(dst->ticket, src->ticket, src->ticket_len);
285*62c56f98SSadaf Ebrahimi }
286*62c56f98SSadaf Ebrahimi
287*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_TLS1_3) && \
288*62c56f98SSadaf Ebrahimi defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
289*62c56f98SSadaf Ebrahimi if (src->endpoint == MBEDTLS_SSL_IS_CLIENT) {
290*62c56f98SSadaf Ebrahimi int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
291*62c56f98SSadaf Ebrahimi ret = mbedtls_ssl_session_set_hostname(dst, src->hostname);
292*62c56f98SSadaf Ebrahimi if (ret != 0) {
293*62c56f98SSadaf Ebrahimi return ret;
294*62c56f98SSadaf Ebrahimi }
295*62c56f98SSadaf Ebrahimi }
296*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_PROTO_TLS1_3 &&
297*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_SERVER_NAME_INDICATION */
298*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_CLI_C */
299*62c56f98SSadaf Ebrahimi
300*62c56f98SSadaf Ebrahimi return 0;
301*62c56f98SSadaf Ebrahimi }
302*62c56f98SSadaf Ebrahimi
303*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
304*62c56f98SSadaf Ebrahimi MBEDTLS_CHECK_RETURN_CRITICAL
resize_buffer(unsigned char ** buffer,size_t len_new,size_t * len_old)305*62c56f98SSadaf Ebrahimi static int resize_buffer(unsigned char **buffer, size_t len_new, size_t *len_old)
306*62c56f98SSadaf Ebrahimi {
307*62c56f98SSadaf Ebrahimi unsigned char *resized_buffer = mbedtls_calloc(1, len_new);
308*62c56f98SSadaf Ebrahimi if (resized_buffer == NULL) {
309*62c56f98SSadaf Ebrahimi return -1;
310*62c56f98SSadaf Ebrahimi }
311*62c56f98SSadaf Ebrahimi
312*62c56f98SSadaf Ebrahimi /* We want to copy len_new bytes when downsizing the buffer, and
313*62c56f98SSadaf Ebrahimi * len_old bytes when upsizing, so we choose the smaller of two sizes,
314*62c56f98SSadaf Ebrahimi * to fit one buffer into another. Size checks, ensuring that no data is
315*62c56f98SSadaf Ebrahimi * lost, are done outside of this function. */
316*62c56f98SSadaf Ebrahimi memcpy(resized_buffer, *buffer,
317*62c56f98SSadaf Ebrahimi (len_new < *len_old) ? len_new : *len_old);
318*62c56f98SSadaf Ebrahimi mbedtls_zeroize_and_free(*buffer, *len_old);
319*62c56f98SSadaf Ebrahimi
320*62c56f98SSadaf Ebrahimi *buffer = resized_buffer;
321*62c56f98SSadaf Ebrahimi *len_old = len_new;
322*62c56f98SSadaf Ebrahimi
323*62c56f98SSadaf Ebrahimi return 0;
324*62c56f98SSadaf Ebrahimi }
325*62c56f98SSadaf Ebrahimi
handle_buffer_resizing(mbedtls_ssl_context * ssl,int downsizing,size_t in_buf_new_len,size_t out_buf_new_len)326*62c56f98SSadaf Ebrahimi static void handle_buffer_resizing(mbedtls_ssl_context *ssl, int downsizing,
327*62c56f98SSadaf Ebrahimi size_t in_buf_new_len,
328*62c56f98SSadaf Ebrahimi size_t out_buf_new_len)
329*62c56f98SSadaf Ebrahimi {
330*62c56f98SSadaf Ebrahimi int modified = 0;
331*62c56f98SSadaf Ebrahimi size_t written_in = 0, iv_offset_in = 0, len_offset_in = 0;
332*62c56f98SSadaf Ebrahimi size_t written_out = 0, iv_offset_out = 0, len_offset_out = 0;
333*62c56f98SSadaf Ebrahimi if (ssl->in_buf != NULL) {
334*62c56f98SSadaf Ebrahimi written_in = ssl->in_msg - ssl->in_buf;
335*62c56f98SSadaf Ebrahimi iv_offset_in = ssl->in_iv - ssl->in_buf;
336*62c56f98SSadaf Ebrahimi len_offset_in = ssl->in_len - ssl->in_buf;
337*62c56f98SSadaf Ebrahimi if (downsizing ?
338*62c56f98SSadaf Ebrahimi ssl->in_buf_len > in_buf_new_len && ssl->in_left < in_buf_new_len :
339*62c56f98SSadaf Ebrahimi ssl->in_buf_len < in_buf_new_len) {
340*62c56f98SSadaf Ebrahimi if (resize_buffer(&ssl->in_buf, in_buf_new_len, &ssl->in_buf_len) != 0) {
341*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(1, ("input buffer resizing failed - out of memory"));
342*62c56f98SSadaf Ebrahimi } else {
343*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(2, ("Reallocating in_buf to %" MBEDTLS_PRINTF_SIZET,
344*62c56f98SSadaf Ebrahimi in_buf_new_len));
345*62c56f98SSadaf Ebrahimi modified = 1;
346*62c56f98SSadaf Ebrahimi }
347*62c56f98SSadaf Ebrahimi }
348*62c56f98SSadaf Ebrahimi }
349*62c56f98SSadaf Ebrahimi
350*62c56f98SSadaf Ebrahimi if (ssl->out_buf != NULL) {
351*62c56f98SSadaf Ebrahimi written_out = ssl->out_msg - ssl->out_buf;
352*62c56f98SSadaf Ebrahimi iv_offset_out = ssl->out_iv - ssl->out_buf;
353*62c56f98SSadaf Ebrahimi len_offset_out = ssl->out_len - ssl->out_buf;
354*62c56f98SSadaf Ebrahimi if (downsizing ?
355*62c56f98SSadaf Ebrahimi ssl->out_buf_len > out_buf_new_len && ssl->out_left < out_buf_new_len :
356*62c56f98SSadaf Ebrahimi ssl->out_buf_len < out_buf_new_len) {
357*62c56f98SSadaf Ebrahimi if (resize_buffer(&ssl->out_buf, out_buf_new_len, &ssl->out_buf_len) != 0) {
358*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(1, ("output buffer resizing failed - out of memory"));
359*62c56f98SSadaf Ebrahimi } else {
360*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(2, ("Reallocating out_buf to %" MBEDTLS_PRINTF_SIZET,
361*62c56f98SSadaf Ebrahimi out_buf_new_len));
362*62c56f98SSadaf Ebrahimi modified = 1;
363*62c56f98SSadaf Ebrahimi }
364*62c56f98SSadaf Ebrahimi }
365*62c56f98SSadaf Ebrahimi }
366*62c56f98SSadaf Ebrahimi if (modified) {
367*62c56f98SSadaf Ebrahimi /* Update pointers here to avoid doing it twice. */
368*62c56f98SSadaf Ebrahimi mbedtls_ssl_reset_in_out_pointers(ssl);
369*62c56f98SSadaf Ebrahimi /* Fields below might not be properly updated with record
370*62c56f98SSadaf Ebrahimi * splitting or with CID, so they are manually updated here. */
371*62c56f98SSadaf Ebrahimi ssl->out_msg = ssl->out_buf + written_out;
372*62c56f98SSadaf Ebrahimi ssl->out_len = ssl->out_buf + len_offset_out;
373*62c56f98SSadaf Ebrahimi ssl->out_iv = ssl->out_buf + iv_offset_out;
374*62c56f98SSadaf Ebrahimi
375*62c56f98SSadaf Ebrahimi ssl->in_msg = ssl->in_buf + written_in;
376*62c56f98SSadaf Ebrahimi ssl->in_len = ssl->in_buf + len_offset_in;
377*62c56f98SSadaf Ebrahimi ssl->in_iv = ssl->in_buf + iv_offset_in;
378*62c56f98SSadaf Ebrahimi }
379*62c56f98SSadaf Ebrahimi }
380*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH */
381*62c56f98SSadaf Ebrahimi
382*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
383*62c56f98SSadaf Ebrahimi
384*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_CONTEXT_SERIALIZATION)
385*62c56f98SSadaf Ebrahimi typedef int (*tls_prf_fn)(const unsigned char *secret, size_t slen,
386*62c56f98SSadaf Ebrahimi const char *label,
387*62c56f98SSadaf Ebrahimi const unsigned char *random, size_t rlen,
388*62c56f98SSadaf Ebrahimi unsigned char *dstbuf, size_t dlen);
389*62c56f98SSadaf Ebrahimi
390*62c56f98SSadaf Ebrahimi static tls_prf_fn ssl_tls12prf_from_cs(int ciphersuite_id);
391*62c56f98SSadaf Ebrahimi
392*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_CONTEXT_SERIALIZATION */
393*62c56f98SSadaf Ebrahimi
394*62c56f98SSadaf Ebrahimi /* Type for the TLS PRF */
395*62c56f98SSadaf Ebrahimi typedef int ssl_tls_prf_t(const unsigned char *, size_t, const char *,
396*62c56f98SSadaf Ebrahimi const unsigned char *, size_t,
397*62c56f98SSadaf Ebrahimi unsigned char *, size_t);
398*62c56f98SSadaf Ebrahimi
399*62c56f98SSadaf Ebrahimi MBEDTLS_CHECK_RETURN_CRITICAL
400*62c56f98SSadaf Ebrahimi static int ssl_tls12_populate_transform(mbedtls_ssl_transform *transform,
401*62c56f98SSadaf Ebrahimi int ciphersuite,
402*62c56f98SSadaf Ebrahimi const unsigned char master[48],
403*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM)
404*62c56f98SSadaf Ebrahimi int encrypt_then_mac,
405*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM */
406*62c56f98SSadaf Ebrahimi ssl_tls_prf_t tls_prf,
407*62c56f98SSadaf Ebrahimi const unsigned char randbytes[64],
408*62c56f98SSadaf Ebrahimi mbedtls_ssl_protocol_version tls_version,
409*62c56f98SSadaf Ebrahimi unsigned endpoint,
410*62c56f98SSadaf Ebrahimi const mbedtls_ssl_context *ssl);
411*62c56f98SSadaf Ebrahimi
412*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA256)
413*62c56f98SSadaf Ebrahimi MBEDTLS_CHECK_RETURN_CRITICAL
414*62c56f98SSadaf Ebrahimi static int tls_prf_sha256(const unsigned char *secret, size_t slen,
415*62c56f98SSadaf Ebrahimi const char *label,
416*62c56f98SSadaf Ebrahimi const unsigned char *random, size_t rlen,
417*62c56f98SSadaf Ebrahimi unsigned char *dstbuf, size_t dlen);
418*62c56f98SSadaf Ebrahimi static int ssl_calc_verify_tls_sha256(const mbedtls_ssl_context *, unsigned char *, size_t *);
419*62c56f98SSadaf Ebrahimi static int ssl_calc_finished_tls_sha256(mbedtls_ssl_context *, unsigned char *, int);
420*62c56f98SSadaf Ebrahimi
421*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_MD_CAN_SHA256*/
422*62c56f98SSadaf Ebrahimi
423*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA384)
424*62c56f98SSadaf Ebrahimi MBEDTLS_CHECK_RETURN_CRITICAL
425*62c56f98SSadaf Ebrahimi static int tls_prf_sha384(const unsigned char *secret, size_t slen,
426*62c56f98SSadaf Ebrahimi const char *label,
427*62c56f98SSadaf Ebrahimi const unsigned char *random, size_t rlen,
428*62c56f98SSadaf Ebrahimi unsigned char *dstbuf, size_t dlen);
429*62c56f98SSadaf Ebrahimi
430*62c56f98SSadaf Ebrahimi static int ssl_calc_verify_tls_sha384(const mbedtls_ssl_context *, unsigned char *, size_t *);
431*62c56f98SSadaf Ebrahimi static int ssl_calc_finished_tls_sha384(mbedtls_ssl_context *, unsigned char *, int);
432*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_MD_CAN_SHA384*/
433*62c56f98SSadaf Ebrahimi
434*62c56f98SSadaf Ebrahimi static size_t ssl_tls12_session_save(const mbedtls_ssl_session *session,
435*62c56f98SSadaf Ebrahimi unsigned char *buf,
436*62c56f98SSadaf Ebrahimi size_t buf_len);
437*62c56f98SSadaf Ebrahimi
438*62c56f98SSadaf Ebrahimi MBEDTLS_CHECK_RETURN_CRITICAL
439*62c56f98SSadaf Ebrahimi static int ssl_tls12_session_load(mbedtls_ssl_session *session,
440*62c56f98SSadaf Ebrahimi const unsigned char *buf,
441*62c56f98SSadaf Ebrahimi size_t len);
442*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
443*62c56f98SSadaf Ebrahimi
444*62c56f98SSadaf Ebrahimi static int ssl_update_checksum_start(mbedtls_ssl_context *, const unsigned char *, size_t);
445*62c56f98SSadaf Ebrahimi
446*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA256)
447*62c56f98SSadaf Ebrahimi static int ssl_update_checksum_sha256(mbedtls_ssl_context *, const unsigned char *, size_t);
448*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_MD_CAN_SHA256*/
449*62c56f98SSadaf Ebrahimi
450*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA384)
451*62c56f98SSadaf Ebrahimi static int ssl_update_checksum_sha384(mbedtls_ssl_context *, const unsigned char *, size_t);
452*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_MD_CAN_SHA384*/
453*62c56f98SSadaf Ebrahimi
mbedtls_ssl_tls_prf(const mbedtls_tls_prf_types prf,const unsigned char * secret,size_t slen,const char * label,const unsigned char * random,size_t rlen,unsigned char * dstbuf,size_t dlen)454*62c56f98SSadaf Ebrahimi int mbedtls_ssl_tls_prf(const mbedtls_tls_prf_types prf,
455*62c56f98SSadaf Ebrahimi const unsigned char *secret, size_t slen,
456*62c56f98SSadaf Ebrahimi const char *label,
457*62c56f98SSadaf Ebrahimi const unsigned char *random, size_t rlen,
458*62c56f98SSadaf Ebrahimi unsigned char *dstbuf, size_t dlen)
459*62c56f98SSadaf Ebrahimi {
460*62c56f98SSadaf Ebrahimi mbedtls_ssl_tls_prf_cb *tls_prf = NULL;
461*62c56f98SSadaf Ebrahimi
462*62c56f98SSadaf Ebrahimi switch (prf) {
463*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
464*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA384)
465*62c56f98SSadaf Ebrahimi case MBEDTLS_SSL_TLS_PRF_SHA384:
466*62c56f98SSadaf Ebrahimi tls_prf = tls_prf_sha384;
467*62c56f98SSadaf Ebrahimi break;
468*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_MD_CAN_SHA384*/
469*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA256)
470*62c56f98SSadaf Ebrahimi case MBEDTLS_SSL_TLS_PRF_SHA256:
471*62c56f98SSadaf Ebrahimi tls_prf = tls_prf_sha256;
472*62c56f98SSadaf Ebrahimi break;
473*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_MD_CAN_SHA256*/
474*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
475*62c56f98SSadaf Ebrahimi default:
476*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
477*62c56f98SSadaf Ebrahimi }
478*62c56f98SSadaf Ebrahimi
479*62c56f98SSadaf Ebrahimi return tls_prf(secret, slen, label, random, rlen, dstbuf, dlen);
480*62c56f98SSadaf Ebrahimi }
481*62c56f98SSadaf Ebrahimi
482*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_X509_CRT_PARSE_C)
ssl_clear_peer_cert(mbedtls_ssl_session * session)483*62c56f98SSadaf Ebrahimi static void ssl_clear_peer_cert(mbedtls_ssl_session *session)
484*62c56f98SSadaf Ebrahimi {
485*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
486*62c56f98SSadaf Ebrahimi if (session->peer_cert != NULL) {
487*62c56f98SSadaf Ebrahimi mbedtls_x509_crt_free(session->peer_cert);
488*62c56f98SSadaf Ebrahimi mbedtls_free(session->peer_cert);
489*62c56f98SSadaf Ebrahimi session->peer_cert = NULL;
490*62c56f98SSadaf Ebrahimi }
491*62c56f98SSadaf Ebrahimi #else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
492*62c56f98SSadaf Ebrahimi if (session->peer_cert_digest != NULL) {
493*62c56f98SSadaf Ebrahimi /* Zeroization is not necessary. */
494*62c56f98SSadaf Ebrahimi mbedtls_free(session->peer_cert_digest);
495*62c56f98SSadaf Ebrahimi session->peer_cert_digest = NULL;
496*62c56f98SSadaf Ebrahimi session->peer_cert_digest_type = MBEDTLS_MD_NONE;
497*62c56f98SSadaf Ebrahimi session->peer_cert_digest_len = 0;
498*62c56f98SSadaf Ebrahimi }
499*62c56f98SSadaf Ebrahimi #endif /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
500*62c56f98SSadaf Ebrahimi }
501*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_X509_CRT_PARSE_C */
502*62c56f98SSadaf Ebrahimi
mbedtls_ssl_get_extension_id(unsigned int extension_type)503*62c56f98SSadaf Ebrahimi uint32_t mbedtls_ssl_get_extension_id(unsigned int extension_type)
504*62c56f98SSadaf Ebrahimi {
505*62c56f98SSadaf Ebrahimi switch (extension_type) {
506*62c56f98SSadaf Ebrahimi case MBEDTLS_TLS_EXT_SERVERNAME:
507*62c56f98SSadaf Ebrahimi return MBEDTLS_SSL_EXT_ID_SERVERNAME;
508*62c56f98SSadaf Ebrahimi
509*62c56f98SSadaf Ebrahimi case MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH:
510*62c56f98SSadaf Ebrahimi return MBEDTLS_SSL_EXT_ID_MAX_FRAGMENT_LENGTH;
511*62c56f98SSadaf Ebrahimi
512*62c56f98SSadaf Ebrahimi case MBEDTLS_TLS_EXT_STATUS_REQUEST:
513*62c56f98SSadaf Ebrahimi return MBEDTLS_SSL_EXT_ID_STATUS_REQUEST;
514*62c56f98SSadaf Ebrahimi
515*62c56f98SSadaf Ebrahimi case MBEDTLS_TLS_EXT_SUPPORTED_GROUPS:
516*62c56f98SSadaf Ebrahimi return MBEDTLS_SSL_EXT_ID_SUPPORTED_GROUPS;
517*62c56f98SSadaf Ebrahimi
518*62c56f98SSadaf Ebrahimi case MBEDTLS_TLS_EXT_SIG_ALG:
519*62c56f98SSadaf Ebrahimi return MBEDTLS_SSL_EXT_ID_SIG_ALG;
520*62c56f98SSadaf Ebrahimi
521*62c56f98SSadaf Ebrahimi case MBEDTLS_TLS_EXT_USE_SRTP:
522*62c56f98SSadaf Ebrahimi return MBEDTLS_SSL_EXT_ID_USE_SRTP;
523*62c56f98SSadaf Ebrahimi
524*62c56f98SSadaf Ebrahimi case MBEDTLS_TLS_EXT_HEARTBEAT:
525*62c56f98SSadaf Ebrahimi return MBEDTLS_SSL_EXT_ID_HEARTBEAT;
526*62c56f98SSadaf Ebrahimi
527*62c56f98SSadaf Ebrahimi case MBEDTLS_TLS_EXT_ALPN:
528*62c56f98SSadaf Ebrahimi return MBEDTLS_SSL_EXT_ID_ALPN;
529*62c56f98SSadaf Ebrahimi
530*62c56f98SSadaf Ebrahimi case MBEDTLS_TLS_EXT_SCT:
531*62c56f98SSadaf Ebrahimi return MBEDTLS_SSL_EXT_ID_SCT;
532*62c56f98SSadaf Ebrahimi
533*62c56f98SSadaf Ebrahimi case MBEDTLS_TLS_EXT_CLI_CERT_TYPE:
534*62c56f98SSadaf Ebrahimi return MBEDTLS_SSL_EXT_ID_CLI_CERT_TYPE;
535*62c56f98SSadaf Ebrahimi
536*62c56f98SSadaf Ebrahimi case MBEDTLS_TLS_EXT_SERV_CERT_TYPE:
537*62c56f98SSadaf Ebrahimi return MBEDTLS_SSL_EXT_ID_SERV_CERT_TYPE;
538*62c56f98SSadaf Ebrahimi
539*62c56f98SSadaf Ebrahimi case MBEDTLS_TLS_EXT_PADDING:
540*62c56f98SSadaf Ebrahimi return MBEDTLS_SSL_EXT_ID_PADDING;
541*62c56f98SSadaf Ebrahimi
542*62c56f98SSadaf Ebrahimi case MBEDTLS_TLS_EXT_PRE_SHARED_KEY:
543*62c56f98SSadaf Ebrahimi return MBEDTLS_SSL_EXT_ID_PRE_SHARED_KEY;
544*62c56f98SSadaf Ebrahimi
545*62c56f98SSadaf Ebrahimi case MBEDTLS_TLS_EXT_EARLY_DATA:
546*62c56f98SSadaf Ebrahimi return MBEDTLS_SSL_EXT_ID_EARLY_DATA;
547*62c56f98SSadaf Ebrahimi
548*62c56f98SSadaf Ebrahimi case MBEDTLS_TLS_EXT_SUPPORTED_VERSIONS:
549*62c56f98SSadaf Ebrahimi return MBEDTLS_SSL_EXT_ID_SUPPORTED_VERSIONS;
550*62c56f98SSadaf Ebrahimi
551*62c56f98SSadaf Ebrahimi case MBEDTLS_TLS_EXT_COOKIE:
552*62c56f98SSadaf Ebrahimi return MBEDTLS_SSL_EXT_ID_COOKIE;
553*62c56f98SSadaf Ebrahimi
554*62c56f98SSadaf Ebrahimi case MBEDTLS_TLS_EXT_PSK_KEY_EXCHANGE_MODES:
555*62c56f98SSadaf Ebrahimi return MBEDTLS_SSL_EXT_ID_PSK_KEY_EXCHANGE_MODES;
556*62c56f98SSadaf Ebrahimi
557*62c56f98SSadaf Ebrahimi case MBEDTLS_TLS_EXT_CERT_AUTH:
558*62c56f98SSadaf Ebrahimi return MBEDTLS_SSL_EXT_ID_CERT_AUTH;
559*62c56f98SSadaf Ebrahimi
560*62c56f98SSadaf Ebrahimi case MBEDTLS_TLS_EXT_OID_FILTERS:
561*62c56f98SSadaf Ebrahimi return MBEDTLS_SSL_EXT_ID_OID_FILTERS;
562*62c56f98SSadaf Ebrahimi
563*62c56f98SSadaf Ebrahimi case MBEDTLS_TLS_EXT_POST_HANDSHAKE_AUTH:
564*62c56f98SSadaf Ebrahimi return MBEDTLS_SSL_EXT_ID_POST_HANDSHAKE_AUTH;
565*62c56f98SSadaf Ebrahimi
566*62c56f98SSadaf Ebrahimi case MBEDTLS_TLS_EXT_SIG_ALG_CERT:
567*62c56f98SSadaf Ebrahimi return MBEDTLS_SSL_EXT_ID_SIG_ALG_CERT;
568*62c56f98SSadaf Ebrahimi
569*62c56f98SSadaf Ebrahimi case MBEDTLS_TLS_EXT_KEY_SHARE:
570*62c56f98SSadaf Ebrahimi return MBEDTLS_SSL_EXT_ID_KEY_SHARE;
571*62c56f98SSadaf Ebrahimi
572*62c56f98SSadaf Ebrahimi case MBEDTLS_TLS_EXT_TRUNCATED_HMAC:
573*62c56f98SSadaf Ebrahimi return MBEDTLS_SSL_EXT_ID_TRUNCATED_HMAC;
574*62c56f98SSadaf Ebrahimi
575*62c56f98SSadaf Ebrahimi case MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS:
576*62c56f98SSadaf Ebrahimi return MBEDTLS_SSL_EXT_ID_SUPPORTED_POINT_FORMATS;
577*62c56f98SSadaf Ebrahimi
578*62c56f98SSadaf Ebrahimi case MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC:
579*62c56f98SSadaf Ebrahimi return MBEDTLS_SSL_EXT_ID_ENCRYPT_THEN_MAC;
580*62c56f98SSadaf Ebrahimi
581*62c56f98SSadaf Ebrahimi case MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET:
582*62c56f98SSadaf Ebrahimi return MBEDTLS_SSL_EXT_ID_EXTENDED_MASTER_SECRET;
583*62c56f98SSadaf Ebrahimi
584*62c56f98SSadaf Ebrahimi case MBEDTLS_TLS_EXT_RECORD_SIZE_LIMIT:
585*62c56f98SSadaf Ebrahimi return MBEDTLS_SSL_EXT_ID_RECORD_SIZE_LIMIT;
586*62c56f98SSadaf Ebrahimi
587*62c56f98SSadaf Ebrahimi case MBEDTLS_TLS_EXT_SESSION_TICKET:
588*62c56f98SSadaf Ebrahimi return MBEDTLS_SSL_EXT_ID_SESSION_TICKET;
589*62c56f98SSadaf Ebrahimi
590*62c56f98SSadaf Ebrahimi }
591*62c56f98SSadaf Ebrahimi
592*62c56f98SSadaf Ebrahimi return MBEDTLS_SSL_EXT_ID_UNRECOGNIZED;
593*62c56f98SSadaf Ebrahimi }
594*62c56f98SSadaf Ebrahimi
mbedtls_ssl_get_extension_mask(unsigned int extension_type)595*62c56f98SSadaf Ebrahimi uint32_t mbedtls_ssl_get_extension_mask(unsigned int extension_type)
596*62c56f98SSadaf Ebrahimi {
597*62c56f98SSadaf Ebrahimi return 1 << mbedtls_ssl_get_extension_id(extension_type);
598*62c56f98SSadaf Ebrahimi }
599*62c56f98SSadaf Ebrahimi
600*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_DEBUG_C)
601*62c56f98SSadaf Ebrahimi static const char *extension_name_table[] = {
602*62c56f98SSadaf Ebrahimi [MBEDTLS_SSL_EXT_ID_UNRECOGNIZED] = "unrecognized",
603*62c56f98SSadaf Ebrahimi [MBEDTLS_SSL_EXT_ID_SERVERNAME] = "server_name",
604*62c56f98SSadaf Ebrahimi [MBEDTLS_SSL_EXT_ID_MAX_FRAGMENT_LENGTH] = "max_fragment_length",
605*62c56f98SSadaf Ebrahimi [MBEDTLS_SSL_EXT_ID_STATUS_REQUEST] = "status_request",
606*62c56f98SSadaf Ebrahimi [MBEDTLS_SSL_EXT_ID_SUPPORTED_GROUPS] = "supported_groups",
607*62c56f98SSadaf Ebrahimi [MBEDTLS_SSL_EXT_ID_SIG_ALG] = "signature_algorithms",
608*62c56f98SSadaf Ebrahimi [MBEDTLS_SSL_EXT_ID_USE_SRTP] = "use_srtp",
609*62c56f98SSadaf Ebrahimi [MBEDTLS_SSL_EXT_ID_HEARTBEAT] = "heartbeat",
610*62c56f98SSadaf Ebrahimi [MBEDTLS_SSL_EXT_ID_ALPN] = "application_layer_protocol_negotiation",
611*62c56f98SSadaf Ebrahimi [MBEDTLS_SSL_EXT_ID_SCT] = "signed_certificate_timestamp",
612*62c56f98SSadaf Ebrahimi [MBEDTLS_SSL_EXT_ID_CLI_CERT_TYPE] = "client_certificate_type",
613*62c56f98SSadaf Ebrahimi [MBEDTLS_SSL_EXT_ID_SERV_CERT_TYPE] = "server_certificate_type",
614*62c56f98SSadaf Ebrahimi [MBEDTLS_SSL_EXT_ID_PADDING] = "padding",
615*62c56f98SSadaf Ebrahimi [MBEDTLS_SSL_EXT_ID_PRE_SHARED_KEY] = "pre_shared_key",
616*62c56f98SSadaf Ebrahimi [MBEDTLS_SSL_EXT_ID_EARLY_DATA] = "early_data",
617*62c56f98SSadaf Ebrahimi [MBEDTLS_SSL_EXT_ID_SUPPORTED_VERSIONS] = "supported_versions",
618*62c56f98SSadaf Ebrahimi [MBEDTLS_SSL_EXT_ID_COOKIE] = "cookie",
619*62c56f98SSadaf Ebrahimi [MBEDTLS_SSL_EXT_ID_PSK_KEY_EXCHANGE_MODES] = "psk_key_exchange_modes",
620*62c56f98SSadaf Ebrahimi [MBEDTLS_SSL_EXT_ID_CERT_AUTH] = "certificate_authorities",
621*62c56f98SSadaf Ebrahimi [MBEDTLS_SSL_EXT_ID_OID_FILTERS] = "oid_filters",
622*62c56f98SSadaf Ebrahimi [MBEDTLS_SSL_EXT_ID_POST_HANDSHAKE_AUTH] = "post_handshake_auth",
623*62c56f98SSadaf Ebrahimi [MBEDTLS_SSL_EXT_ID_SIG_ALG_CERT] = "signature_algorithms_cert",
624*62c56f98SSadaf Ebrahimi [MBEDTLS_SSL_EXT_ID_KEY_SHARE] = "key_share",
625*62c56f98SSadaf Ebrahimi [MBEDTLS_SSL_EXT_ID_TRUNCATED_HMAC] = "truncated_hmac",
626*62c56f98SSadaf Ebrahimi [MBEDTLS_SSL_EXT_ID_SUPPORTED_POINT_FORMATS] = "supported_point_formats",
627*62c56f98SSadaf Ebrahimi [MBEDTLS_SSL_EXT_ID_ENCRYPT_THEN_MAC] = "encrypt_then_mac",
628*62c56f98SSadaf Ebrahimi [MBEDTLS_SSL_EXT_ID_EXTENDED_MASTER_SECRET] = "extended_master_secret",
629*62c56f98SSadaf Ebrahimi [MBEDTLS_SSL_EXT_ID_SESSION_TICKET] = "session_ticket",
630*62c56f98SSadaf Ebrahimi [MBEDTLS_SSL_EXT_ID_RECORD_SIZE_LIMIT] = "record_size_limit"
631*62c56f98SSadaf Ebrahimi };
632*62c56f98SSadaf Ebrahimi
633*62c56f98SSadaf Ebrahimi static unsigned int extension_type_table[] = {
634*62c56f98SSadaf Ebrahimi [MBEDTLS_SSL_EXT_ID_UNRECOGNIZED] = 0xff,
635*62c56f98SSadaf Ebrahimi [MBEDTLS_SSL_EXT_ID_SERVERNAME] = MBEDTLS_TLS_EXT_SERVERNAME,
636*62c56f98SSadaf Ebrahimi [MBEDTLS_SSL_EXT_ID_MAX_FRAGMENT_LENGTH] = MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH,
637*62c56f98SSadaf Ebrahimi [MBEDTLS_SSL_EXT_ID_STATUS_REQUEST] = MBEDTLS_TLS_EXT_STATUS_REQUEST,
638*62c56f98SSadaf Ebrahimi [MBEDTLS_SSL_EXT_ID_SUPPORTED_GROUPS] = MBEDTLS_TLS_EXT_SUPPORTED_GROUPS,
639*62c56f98SSadaf Ebrahimi [MBEDTLS_SSL_EXT_ID_SIG_ALG] = MBEDTLS_TLS_EXT_SIG_ALG,
640*62c56f98SSadaf Ebrahimi [MBEDTLS_SSL_EXT_ID_USE_SRTP] = MBEDTLS_TLS_EXT_USE_SRTP,
641*62c56f98SSadaf Ebrahimi [MBEDTLS_SSL_EXT_ID_HEARTBEAT] = MBEDTLS_TLS_EXT_HEARTBEAT,
642*62c56f98SSadaf Ebrahimi [MBEDTLS_SSL_EXT_ID_ALPN] = MBEDTLS_TLS_EXT_ALPN,
643*62c56f98SSadaf Ebrahimi [MBEDTLS_SSL_EXT_ID_SCT] = MBEDTLS_TLS_EXT_SCT,
644*62c56f98SSadaf Ebrahimi [MBEDTLS_SSL_EXT_ID_CLI_CERT_TYPE] = MBEDTLS_TLS_EXT_CLI_CERT_TYPE,
645*62c56f98SSadaf Ebrahimi [MBEDTLS_SSL_EXT_ID_SERV_CERT_TYPE] = MBEDTLS_TLS_EXT_SERV_CERT_TYPE,
646*62c56f98SSadaf Ebrahimi [MBEDTLS_SSL_EXT_ID_PADDING] = MBEDTLS_TLS_EXT_PADDING,
647*62c56f98SSadaf Ebrahimi [MBEDTLS_SSL_EXT_ID_PRE_SHARED_KEY] = MBEDTLS_TLS_EXT_PRE_SHARED_KEY,
648*62c56f98SSadaf Ebrahimi [MBEDTLS_SSL_EXT_ID_EARLY_DATA] = MBEDTLS_TLS_EXT_EARLY_DATA,
649*62c56f98SSadaf Ebrahimi [MBEDTLS_SSL_EXT_ID_SUPPORTED_VERSIONS] = MBEDTLS_TLS_EXT_SUPPORTED_VERSIONS,
650*62c56f98SSadaf Ebrahimi [MBEDTLS_SSL_EXT_ID_COOKIE] = MBEDTLS_TLS_EXT_COOKIE,
651*62c56f98SSadaf Ebrahimi [MBEDTLS_SSL_EXT_ID_PSK_KEY_EXCHANGE_MODES] = MBEDTLS_TLS_EXT_PSK_KEY_EXCHANGE_MODES,
652*62c56f98SSadaf Ebrahimi [MBEDTLS_SSL_EXT_ID_CERT_AUTH] = MBEDTLS_TLS_EXT_CERT_AUTH,
653*62c56f98SSadaf Ebrahimi [MBEDTLS_SSL_EXT_ID_OID_FILTERS] = MBEDTLS_TLS_EXT_OID_FILTERS,
654*62c56f98SSadaf Ebrahimi [MBEDTLS_SSL_EXT_ID_POST_HANDSHAKE_AUTH] = MBEDTLS_TLS_EXT_POST_HANDSHAKE_AUTH,
655*62c56f98SSadaf Ebrahimi [MBEDTLS_SSL_EXT_ID_SIG_ALG_CERT] = MBEDTLS_TLS_EXT_SIG_ALG_CERT,
656*62c56f98SSadaf Ebrahimi [MBEDTLS_SSL_EXT_ID_KEY_SHARE] = MBEDTLS_TLS_EXT_KEY_SHARE,
657*62c56f98SSadaf Ebrahimi [MBEDTLS_SSL_EXT_ID_TRUNCATED_HMAC] = MBEDTLS_TLS_EXT_TRUNCATED_HMAC,
658*62c56f98SSadaf Ebrahimi [MBEDTLS_SSL_EXT_ID_SUPPORTED_POINT_FORMATS] = MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS,
659*62c56f98SSadaf Ebrahimi [MBEDTLS_SSL_EXT_ID_ENCRYPT_THEN_MAC] = MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC,
660*62c56f98SSadaf Ebrahimi [MBEDTLS_SSL_EXT_ID_EXTENDED_MASTER_SECRET] = MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET,
661*62c56f98SSadaf Ebrahimi [MBEDTLS_SSL_EXT_ID_SESSION_TICKET] = MBEDTLS_TLS_EXT_SESSION_TICKET,
662*62c56f98SSadaf Ebrahimi [MBEDTLS_SSL_EXT_ID_RECORD_SIZE_LIMIT] = MBEDTLS_TLS_EXT_RECORD_SIZE_LIMIT
663*62c56f98SSadaf Ebrahimi };
664*62c56f98SSadaf Ebrahimi
mbedtls_ssl_get_extension_name(unsigned int extension_type)665*62c56f98SSadaf Ebrahimi const char *mbedtls_ssl_get_extension_name(unsigned int extension_type)
666*62c56f98SSadaf Ebrahimi {
667*62c56f98SSadaf Ebrahimi return extension_name_table[
668*62c56f98SSadaf Ebrahimi mbedtls_ssl_get_extension_id(extension_type)];
669*62c56f98SSadaf Ebrahimi }
670*62c56f98SSadaf Ebrahimi
ssl_tls13_get_hs_msg_name(int hs_msg_type)671*62c56f98SSadaf Ebrahimi static const char *ssl_tls13_get_hs_msg_name(int hs_msg_type)
672*62c56f98SSadaf Ebrahimi {
673*62c56f98SSadaf Ebrahimi switch (hs_msg_type) {
674*62c56f98SSadaf Ebrahimi case MBEDTLS_SSL_HS_CLIENT_HELLO:
675*62c56f98SSadaf Ebrahimi return "ClientHello";
676*62c56f98SSadaf Ebrahimi case MBEDTLS_SSL_HS_SERVER_HELLO:
677*62c56f98SSadaf Ebrahimi return "ServerHello";
678*62c56f98SSadaf Ebrahimi case MBEDTLS_SSL_TLS1_3_HS_HELLO_RETRY_REQUEST:
679*62c56f98SSadaf Ebrahimi return "HelloRetryRequest";
680*62c56f98SSadaf Ebrahimi case MBEDTLS_SSL_HS_NEW_SESSION_TICKET:
681*62c56f98SSadaf Ebrahimi return "NewSessionTicket";
682*62c56f98SSadaf Ebrahimi case MBEDTLS_SSL_HS_ENCRYPTED_EXTENSIONS:
683*62c56f98SSadaf Ebrahimi return "EncryptedExtensions";
684*62c56f98SSadaf Ebrahimi case MBEDTLS_SSL_HS_CERTIFICATE:
685*62c56f98SSadaf Ebrahimi return "Certificate";
686*62c56f98SSadaf Ebrahimi case MBEDTLS_SSL_HS_CERTIFICATE_REQUEST:
687*62c56f98SSadaf Ebrahimi return "CertificateRequest";
688*62c56f98SSadaf Ebrahimi }
689*62c56f98SSadaf Ebrahimi return "Unknown";
690*62c56f98SSadaf Ebrahimi }
691*62c56f98SSadaf Ebrahimi
mbedtls_ssl_print_extension(const mbedtls_ssl_context * ssl,int level,const char * file,int line,int hs_msg_type,unsigned int extension_type,const char * extra_msg0,const char * extra_msg1)692*62c56f98SSadaf Ebrahimi void mbedtls_ssl_print_extension(const mbedtls_ssl_context *ssl,
693*62c56f98SSadaf Ebrahimi int level, const char *file, int line,
694*62c56f98SSadaf Ebrahimi int hs_msg_type, unsigned int extension_type,
695*62c56f98SSadaf Ebrahimi const char *extra_msg0, const char *extra_msg1)
696*62c56f98SSadaf Ebrahimi {
697*62c56f98SSadaf Ebrahimi const char *extra_msg;
698*62c56f98SSadaf Ebrahimi if (extra_msg0 && extra_msg1) {
699*62c56f98SSadaf Ebrahimi mbedtls_debug_print_msg(
700*62c56f98SSadaf Ebrahimi ssl, level, file, line,
701*62c56f98SSadaf Ebrahimi "%s: %s(%u) extension %s %s.",
702*62c56f98SSadaf Ebrahimi ssl_tls13_get_hs_msg_name(hs_msg_type),
703*62c56f98SSadaf Ebrahimi mbedtls_ssl_get_extension_name(extension_type),
704*62c56f98SSadaf Ebrahimi extension_type,
705*62c56f98SSadaf Ebrahimi extra_msg0, extra_msg1);
706*62c56f98SSadaf Ebrahimi return;
707*62c56f98SSadaf Ebrahimi }
708*62c56f98SSadaf Ebrahimi
709*62c56f98SSadaf Ebrahimi extra_msg = extra_msg0 ? extra_msg0 : extra_msg1;
710*62c56f98SSadaf Ebrahimi if (extra_msg) {
711*62c56f98SSadaf Ebrahimi mbedtls_debug_print_msg(
712*62c56f98SSadaf Ebrahimi ssl, level, file, line,
713*62c56f98SSadaf Ebrahimi "%s: %s(%u) extension %s.", ssl_tls13_get_hs_msg_name(hs_msg_type),
714*62c56f98SSadaf Ebrahimi mbedtls_ssl_get_extension_name(extension_type), extension_type,
715*62c56f98SSadaf Ebrahimi extra_msg);
716*62c56f98SSadaf Ebrahimi return;
717*62c56f98SSadaf Ebrahimi }
718*62c56f98SSadaf Ebrahimi
719*62c56f98SSadaf Ebrahimi mbedtls_debug_print_msg(
720*62c56f98SSadaf Ebrahimi ssl, level, file, line,
721*62c56f98SSadaf Ebrahimi "%s: %s(%u) extension.", ssl_tls13_get_hs_msg_name(hs_msg_type),
722*62c56f98SSadaf Ebrahimi mbedtls_ssl_get_extension_name(extension_type), extension_type);
723*62c56f98SSadaf Ebrahimi }
724*62c56f98SSadaf Ebrahimi
mbedtls_ssl_print_extensions(const mbedtls_ssl_context * ssl,int level,const char * file,int line,int hs_msg_type,uint32_t extensions_mask,const char * extra)725*62c56f98SSadaf Ebrahimi void mbedtls_ssl_print_extensions(const mbedtls_ssl_context *ssl,
726*62c56f98SSadaf Ebrahimi int level, const char *file, int line,
727*62c56f98SSadaf Ebrahimi int hs_msg_type, uint32_t extensions_mask,
728*62c56f98SSadaf Ebrahimi const char *extra)
729*62c56f98SSadaf Ebrahimi {
730*62c56f98SSadaf Ebrahimi
731*62c56f98SSadaf Ebrahimi for (unsigned i = 0;
732*62c56f98SSadaf Ebrahimi i < sizeof(extension_name_table) / sizeof(extension_name_table[0]);
733*62c56f98SSadaf Ebrahimi i++) {
734*62c56f98SSadaf Ebrahimi mbedtls_ssl_print_extension(
735*62c56f98SSadaf Ebrahimi ssl, level, file, line, hs_msg_type, extension_type_table[i],
736*62c56f98SSadaf Ebrahimi extensions_mask & (1 << i) ? "exists" : "does not exist", extra);
737*62c56f98SSadaf Ebrahimi }
738*62c56f98SSadaf Ebrahimi }
739*62c56f98SSadaf Ebrahimi
740*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_TLS1_3) && defined(MBEDTLS_SSL_SESSION_TICKETS)
741*62c56f98SSadaf Ebrahimi static const char *ticket_flag_name_table[] =
742*62c56f98SSadaf Ebrahimi {
743*62c56f98SSadaf Ebrahimi [0] = "ALLOW_PSK_RESUMPTION",
744*62c56f98SSadaf Ebrahimi [2] = "ALLOW_PSK_EPHEMERAL_RESUMPTION",
745*62c56f98SSadaf Ebrahimi [3] = "ALLOW_EARLY_DATA",
746*62c56f98SSadaf Ebrahimi };
747*62c56f98SSadaf Ebrahimi
mbedtls_ssl_print_ticket_flags(const mbedtls_ssl_context * ssl,int level,const char * file,int line,unsigned int flags)748*62c56f98SSadaf Ebrahimi void mbedtls_ssl_print_ticket_flags(const mbedtls_ssl_context *ssl,
749*62c56f98SSadaf Ebrahimi int level, const char *file, int line,
750*62c56f98SSadaf Ebrahimi unsigned int flags)
751*62c56f98SSadaf Ebrahimi {
752*62c56f98SSadaf Ebrahimi size_t i;
753*62c56f98SSadaf Ebrahimi
754*62c56f98SSadaf Ebrahimi mbedtls_debug_print_msg(ssl, level, file, line,
755*62c56f98SSadaf Ebrahimi "print ticket_flags (0x%02x)", flags);
756*62c56f98SSadaf Ebrahimi
757*62c56f98SSadaf Ebrahimi flags = flags & MBEDTLS_SSL_TLS1_3_TICKET_FLAGS_MASK;
758*62c56f98SSadaf Ebrahimi
759*62c56f98SSadaf Ebrahimi for (i = 0; i < ARRAY_LENGTH(ticket_flag_name_table); i++) {
760*62c56f98SSadaf Ebrahimi if ((flags & (1 << i))) {
761*62c56f98SSadaf Ebrahimi mbedtls_debug_print_msg(ssl, level, file, line, "- %s is set.",
762*62c56f98SSadaf Ebrahimi ticket_flag_name_table[i]);
763*62c56f98SSadaf Ebrahimi }
764*62c56f98SSadaf Ebrahimi }
765*62c56f98SSadaf Ebrahimi }
766*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_PROTO_TLS1_3 && MBEDTLS_SSL_SESSION_TICKETS */
767*62c56f98SSadaf Ebrahimi
768*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_DEBUG_C */
769*62c56f98SSadaf Ebrahimi
mbedtls_ssl_optimize_checksum(mbedtls_ssl_context * ssl,const mbedtls_ssl_ciphersuite_t * ciphersuite_info)770*62c56f98SSadaf Ebrahimi void mbedtls_ssl_optimize_checksum(mbedtls_ssl_context *ssl,
771*62c56f98SSadaf Ebrahimi const mbedtls_ssl_ciphersuite_t *ciphersuite_info)
772*62c56f98SSadaf Ebrahimi {
773*62c56f98SSadaf Ebrahimi ((void) ciphersuite_info);
774*62c56f98SSadaf Ebrahimi
775*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA384)
776*62c56f98SSadaf Ebrahimi if (ciphersuite_info->mac == MBEDTLS_MD_SHA384) {
777*62c56f98SSadaf Ebrahimi ssl->handshake->update_checksum = ssl_update_checksum_sha384;
778*62c56f98SSadaf Ebrahimi } else
779*62c56f98SSadaf Ebrahimi #endif
780*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA256)
781*62c56f98SSadaf Ebrahimi if (ciphersuite_info->mac != MBEDTLS_MD_SHA384) {
782*62c56f98SSadaf Ebrahimi ssl->handshake->update_checksum = ssl_update_checksum_sha256;
783*62c56f98SSadaf Ebrahimi } else
784*62c56f98SSadaf Ebrahimi #endif
785*62c56f98SSadaf Ebrahimi {
786*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
787*62c56f98SSadaf Ebrahimi return;
788*62c56f98SSadaf Ebrahimi }
789*62c56f98SSadaf Ebrahimi }
790*62c56f98SSadaf Ebrahimi
mbedtls_ssl_add_hs_hdr_to_checksum(mbedtls_ssl_context * ssl,unsigned hs_type,size_t total_hs_len)791*62c56f98SSadaf Ebrahimi int mbedtls_ssl_add_hs_hdr_to_checksum(mbedtls_ssl_context *ssl,
792*62c56f98SSadaf Ebrahimi unsigned hs_type,
793*62c56f98SSadaf Ebrahimi size_t total_hs_len)
794*62c56f98SSadaf Ebrahimi {
795*62c56f98SSadaf Ebrahimi unsigned char hs_hdr[4];
796*62c56f98SSadaf Ebrahimi
797*62c56f98SSadaf Ebrahimi /* Build HS header for checksum update. */
798*62c56f98SSadaf Ebrahimi hs_hdr[0] = MBEDTLS_BYTE_0(hs_type);
799*62c56f98SSadaf Ebrahimi hs_hdr[1] = MBEDTLS_BYTE_2(total_hs_len);
800*62c56f98SSadaf Ebrahimi hs_hdr[2] = MBEDTLS_BYTE_1(total_hs_len);
801*62c56f98SSadaf Ebrahimi hs_hdr[3] = MBEDTLS_BYTE_0(total_hs_len);
802*62c56f98SSadaf Ebrahimi
803*62c56f98SSadaf Ebrahimi return ssl->handshake->update_checksum(ssl, hs_hdr, sizeof(hs_hdr));
804*62c56f98SSadaf Ebrahimi }
805*62c56f98SSadaf Ebrahimi
mbedtls_ssl_add_hs_msg_to_checksum(mbedtls_ssl_context * ssl,unsigned hs_type,unsigned char const * msg,size_t msg_len)806*62c56f98SSadaf Ebrahimi int mbedtls_ssl_add_hs_msg_to_checksum(mbedtls_ssl_context *ssl,
807*62c56f98SSadaf Ebrahimi unsigned hs_type,
808*62c56f98SSadaf Ebrahimi unsigned char const *msg,
809*62c56f98SSadaf Ebrahimi size_t msg_len)
810*62c56f98SSadaf Ebrahimi {
811*62c56f98SSadaf Ebrahimi int ret;
812*62c56f98SSadaf Ebrahimi ret = mbedtls_ssl_add_hs_hdr_to_checksum(ssl, hs_type, msg_len);
813*62c56f98SSadaf Ebrahimi if (ret != 0) {
814*62c56f98SSadaf Ebrahimi return ret;
815*62c56f98SSadaf Ebrahimi }
816*62c56f98SSadaf Ebrahimi return ssl->handshake->update_checksum(ssl, msg, msg_len);
817*62c56f98SSadaf Ebrahimi }
818*62c56f98SSadaf Ebrahimi
mbedtls_ssl_reset_checksum(mbedtls_ssl_context * ssl)819*62c56f98SSadaf Ebrahimi int mbedtls_ssl_reset_checksum(mbedtls_ssl_context *ssl)
820*62c56f98SSadaf Ebrahimi {
821*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA256) || \
822*62c56f98SSadaf Ebrahimi defined(MBEDTLS_MD_CAN_SHA384)
823*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO)
824*62c56f98SSadaf Ebrahimi psa_status_t status;
825*62c56f98SSadaf Ebrahimi #else
826*62c56f98SSadaf Ebrahimi int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
827*62c56f98SSadaf Ebrahimi #endif
828*62c56f98SSadaf Ebrahimi #else /* SHA-256 or SHA-384 */
829*62c56f98SSadaf Ebrahimi ((void) ssl);
830*62c56f98SSadaf Ebrahimi #endif /* SHA-256 or SHA-384 */
831*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA256)
832*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO)
833*62c56f98SSadaf Ebrahimi status = psa_hash_abort(&ssl->handshake->fin_sha256_psa);
834*62c56f98SSadaf Ebrahimi if (status != PSA_SUCCESS) {
835*62c56f98SSadaf Ebrahimi return mbedtls_md_error_from_psa(status);
836*62c56f98SSadaf Ebrahimi }
837*62c56f98SSadaf Ebrahimi status = psa_hash_setup(&ssl->handshake->fin_sha256_psa, PSA_ALG_SHA_256);
838*62c56f98SSadaf Ebrahimi if (status != PSA_SUCCESS) {
839*62c56f98SSadaf Ebrahimi return mbedtls_md_error_from_psa(status);
840*62c56f98SSadaf Ebrahimi }
841*62c56f98SSadaf Ebrahimi #else
842*62c56f98SSadaf Ebrahimi mbedtls_md_free(&ssl->handshake->fin_sha256);
843*62c56f98SSadaf Ebrahimi mbedtls_md_init(&ssl->handshake->fin_sha256);
844*62c56f98SSadaf Ebrahimi ret = mbedtls_md_setup(&ssl->handshake->fin_sha256,
845*62c56f98SSadaf Ebrahimi mbedtls_md_info_from_type(MBEDTLS_MD_SHA256),
846*62c56f98SSadaf Ebrahimi 0);
847*62c56f98SSadaf Ebrahimi if (ret != 0) {
848*62c56f98SSadaf Ebrahimi return ret;
849*62c56f98SSadaf Ebrahimi }
850*62c56f98SSadaf Ebrahimi ret = mbedtls_md_starts(&ssl->handshake->fin_sha256);
851*62c56f98SSadaf Ebrahimi if (ret != 0) {
852*62c56f98SSadaf Ebrahimi return ret;
853*62c56f98SSadaf Ebrahimi }
854*62c56f98SSadaf Ebrahimi #endif
855*62c56f98SSadaf Ebrahimi #endif
856*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA384)
857*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO)
858*62c56f98SSadaf Ebrahimi status = psa_hash_abort(&ssl->handshake->fin_sha384_psa);
859*62c56f98SSadaf Ebrahimi if (status != PSA_SUCCESS) {
860*62c56f98SSadaf Ebrahimi return mbedtls_md_error_from_psa(status);
861*62c56f98SSadaf Ebrahimi }
862*62c56f98SSadaf Ebrahimi status = psa_hash_setup(&ssl->handshake->fin_sha384_psa, PSA_ALG_SHA_384);
863*62c56f98SSadaf Ebrahimi if (status != PSA_SUCCESS) {
864*62c56f98SSadaf Ebrahimi return mbedtls_md_error_from_psa(status);
865*62c56f98SSadaf Ebrahimi }
866*62c56f98SSadaf Ebrahimi #else
867*62c56f98SSadaf Ebrahimi mbedtls_md_free(&ssl->handshake->fin_sha384);
868*62c56f98SSadaf Ebrahimi mbedtls_md_init(&ssl->handshake->fin_sha384);
869*62c56f98SSadaf Ebrahimi ret = mbedtls_md_setup(&ssl->handshake->fin_sha384,
870*62c56f98SSadaf Ebrahimi mbedtls_md_info_from_type(MBEDTLS_MD_SHA384), 0);
871*62c56f98SSadaf Ebrahimi if (ret != 0) {
872*62c56f98SSadaf Ebrahimi return ret;
873*62c56f98SSadaf Ebrahimi }
874*62c56f98SSadaf Ebrahimi ret = mbedtls_md_starts(&ssl->handshake->fin_sha384);
875*62c56f98SSadaf Ebrahimi if (ret != 0) {
876*62c56f98SSadaf Ebrahimi return ret;
877*62c56f98SSadaf Ebrahimi }
878*62c56f98SSadaf Ebrahimi #endif
879*62c56f98SSadaf Ebrahimi #endif
880*62c56f98SSadaf Ebrahimi return 0;
881*62c56f98SSadaf Ebrahimi }
882*62c56f98SSadaf Ebrahimi
ssl_update_checksum_start(mbedtls_ssl_context * ssl,const unsigned char * buf,size_t len)883*62c56f98SSadaf Ebrahimi static int ssl_update_checksum_start(mbedtls_ssl_context *ssl,
884*62c56f98SSadaf Ebrahimi const unsigned char *buf, size_t len)
885*62c56f98SSadaf Ebrahimi {
886*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA256) || \
887*62c56f98SSadaf Ebrahimi defined(MBEDTLS_MD_CAN_SHA384)
888*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO)
889*62c56f98SSadaf Ebrahimi psa_status_t status;
890*62c56f98SSadaf Ebrahimi #else
891*62c56f98SSadaf Ebrahimi int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
892*62c56f98SSadaf Ebrahimi #endif
893*62c56f98SSadaf Ebrahimi #else /* SHA-256 or SHA-384 */
894*62c56f98SSadaf Ebrahimi ((void) ssl);
895*62c56f98SSadaf Ebrahimi (void) buf;
896*62c56f98SSadaf Ebrahimi (void) len;
897*62c56f98SSadaf Ebrahimi #endif /* SHA-256 or SHA-384 */
898*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA256)
899*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO)
900*62c56f98SSadaf Ebrahimi status = psa_hash_update(&ssl->handshake->fin_sha256_psa, buf, len);
901*62c56f98SSadaf Ebrahimi if (status != PSA_SUCCESS) {
902*62c56f98SSadaf Ebrahimi return mbedtls_md_error_from_psa(status);
903*62c56f98SSadaf Ebrahimi }
904*62c56f98SSadaf Ebrahimi #else
905*62c56f98SSadaf Ebrahimi ret = mbedtls_md_update(&ssl->handshake->fin_sha256, buf, len);
906*62c56f98SSadaf Ebrahimi if (ret != 0) {
907*62c56f98SSadaf Ebrahimi return ret;
908*62c56f98SSadaf Ebrahimi }
909*62c56f98SSadaf Ebrahimi #endif
910*62c56f98SSadaf Ebrahimi #endif
911*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA384)
912*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO)
913*62c56f98SSadaf Ebrahimi status = psa_hash_update(&ssl->handshake->fin_sha384_psa, buf, len);
914*62c56f98SSadaf Ebrahimi if (status != PSA_SUCCESS) {
915*62c56f98SSadaf Ebrahimi return mbedtls_md_error_from_psa(status);
916*62c56f98SSadaf Ebrahimi }
917*62c56f98SSadaf Ebrahimi #else
918*62c56f98SSadaf Ebrahimi ret = mbedtls_md_update(&ssl->handshake->fin_sha384, buf, len);
919*62c56f98SSadaf Ebrahimi if (ret != 0) {
920*62c56f98SSadaf Ebrahimi return ret;
921*62c56f98SSadaf Ebrahimi }
922*62c56f98SSadaf Ebrahimi #endif
923*62c56f98SSadaf Ebrahimi #endif
924*62c56f98SSadaf Ebrahimi return 0;
925*62c56f98SSadaf Ebrahimi }
926*62c56f98SSadaf Ebrahimi
927*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA256)
ssl_update_checksum_sha256(mbedtls_ssl_context * ssl,const unsigned char * buf,size_t len)928*62c56f98SSadaf Ebrahimi static int ssl_update_checksum_sha256(mbedtls_ssl_context *ssl,
929*62c56f98SSadaf Ebrahimi const unsigned char *buf, size_t len)
930*62c56f98SSadaf Ebrahimi {
931*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO)
932*62c56f98SSadaf Ebrahimi return mbedtls_md_error_from_psa(psa_hash_update(
933*62c56f98SSadaf Ebrahimi &ssl->handshake->fin_sha256_psa, buf, len));
934*62c56f98SSadaf Ebrahimi #else
935*62c56f98SSadaf Ebrahimi return mbedtls_md_update(&ssl->handshake->fin_sha256, buf, len);
936*62c56f98SSadaf Ebrahimi #endif
937*62c56f98SSadaf Ebrahimi }
938*62c56f98SSadaf Ebrahimi #endif
939*62c56f98SSadaf Ebrahimi
940*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA384)
ssl_update_checksum_sha384(mbedtls_ssl_context * ssl,const unsigned char * buf,size_t len)941*62c56f98SSadaf Ebrahimi static int ssl_update_checksum_sha384(mbedtls_ssl_context *ssl,
942*62c56f98SSadaf Ebrahimi const unsigned char *buf, size_t len)
943*62c56f98SSadaf Ebrahimi {
944*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO)
945*62c56f98SSadaf Ebrahimi return mbedtls_md_error_from_psa(psa_hash_update(
946*62c56f98SSadaf Ebrahimi &ssl->handshake->fin_sha384_psa, buf, len));
947*62c56f98SSadaf Ebrahimi #else
948*62c56f98SSadaf Ebrahimi return mbedtls_md_update(&ssl->handshake->fin_sha384, buf, len);
949*62c56f98SSadaf Ebrahimi #endif
950*62c56f98SSadaf Ebrahimi }
951*62c56f98SSadaf Ebrahimi #endif
952*62c56f98SSadaf Ebrahimi
ssl_handshake_params_init(mbedtls_ssl_handshake_params * handshake)953*62c56f98SSadaf Ebrahimi static void ssl_handshake_params_init(mbedtls_ssl_handshake_params *handshake)
954*62c56f98SSadaf Ebrahimi {
955*62c56f98SSadaf Ebrahimi memset(handshake, 0, sizeof(mbedtls_ssl_handshake_params));
956*62c56f98SSadaf Ebrahimi
957*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA256)
958*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO)
959*62c56f98SSadaf Ebrahimi handshake->fin_sha256_psa = psa_hash_operation_init();
960*62c56f98SSadaf Ebrahimi #else
961*62c56f98SSadaf Ebrahimi mbedtls_md_init(&handshake->fin_sha256);
962*62c56f98SSadaf Ebrahimi #endif
963*62c56f98SSadaf Ebrahimi #endif
964*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA384)
965*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO)
966*62c56f98SSadaf Ebrahimi handshake->fin_sha384_psa = psa_hash_operation_init();
967*62c56f98SSadaf Ebrahimi #else
968*62c56f98SSadaf Ebrahimi mbedtls_md_init(&handshake->fin_sha384);
969*62c56f98SSadaf Ebrahimi #endif
970*62c56f98SSadaf Ebrahimi #endif
971*62c56f98SSadaf Ebrahimi
972*62c56f98SSadaf Ebrahimi handshake->update_checksum = ssl_update_checksum_start;
973*62c56f98SSadaf Ebrahimi
974*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_DHM_C)
975*62c56f98SSadaf Ebrahimi mbedtls_dhm_init(&handshake->dhm_ctx);
976*62c56f98SSadaf Ebrahimi #endif
977*62c56f98SSadaf Ebrahimi #if !defined(MBEDTLS_USE_PSA_CRYPTO) && \
978*62c56f98SSadaf Ebrahimi defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED)
979*62c56f98SSadaf Ebrahimi mbedtls_ecdh_init(&handshake->ecdh_ctx);
980*62c56f98SSadaf Ebrahimi #endif
981*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
982*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO)
983*62c56f98SSadaf Ebrahimi handshake->psa_pake_ctx = psa_pake_operation_init();
984*62c56f98SSadaf Ebrahimi handshake->psa_pake_password = MBEDTLS_SVC_KEY_ID_INIT;
985*62c56f98SSadaf Ebrahimi #else
986*62c56f98SSadaf Ebrahimi mbedtls_ecjpake_init(&handshake->ecjpake_ctx);
987*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_USE_PSA_CRYPTO */
988*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_CLI_C)
989*62c56f98SSadaf Ebrahimi handshake->ecjpake_cache = NULL;
990*62c56f98SSadaf Ebrahimi handshake->ecjpake_cache_len = 0;
991*62c56f98SSadaf Ebrahimi #endif
992*62c56f98SSadaf Ebrahimi #endif
993*62c56f98SSadaf Ebrahimi
994*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
995*62c56f98SSadaf Ebrahimi mbedtls_x509_crt_restart_init(&handshake->ecrs_ctx);
996*62c56f98SSadaf Ebrahimi #endif
997*62c56f98SSadaf Ebrahimi
998*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
999*62c56f98SSadaf Ebrahimi handshake->sni_authmode = MBEDTLS_SSL_VERIFY_UNSET;
1000*62c56f98SSadaf Ebrahimi #endif
1001*62c56f98SSadaf Ebrahimi
1002*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_X509_CRT_PARSE_C) && \
1003*62c56f98SSadaf Ebrahimi !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
1004*62c56f98SSadaf Ebrahimi mbedtls_pk_init(&handshake->peer_pubkey);
1005*62c56f98SSadaf Ebrahimi #endif
1006*62c56f98SSadaf Ebrahimi }
1007*62c56f98SSadaf Ebrahimi
mbedtls_ssl_transform_init(mbedtls_ssl_transform * transform)1008*62c56f98SSadaf Ebrahimi void mbedtls_ssl_transform_init(mbedtls_ssl_transform *transform)
1009*62c56f98SSadaf Ebrahimi {
1010*62c56f98SSadaf Ebrahimi memset(transform, 0, sizeof(mbedtls_ssl_transform));
1011*62c56f98SSadaf Ebrahimi
1012*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO)
1013*62c56f98SSadaf Ebrahimi transform->psa_key_enc = MBEDTLS_SVC_KEY_ID_INIT;
1014*62c56f98SSadaf Ebrahimi transform->psa_key_dec = MBEDTLS_SVC_KEY_ID_INIT;
1015*62c56f98SSadaf Ebrahimi #else
1016*62c56f98SSadaf Ebrahimi mbedtls_cipher_init(&transform->cipher_ctx_enc);
1017*62c56f98SSadaf Ebrahimi mbedtls_cipher_init(&transform->cipher_ctx_dec);
1018*62c56f98SSadaf Ebrahimi #endif
1019*62c56f98SSadaf Ebrahimi
1020*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_SOME_SUITES_USE_MAC)
1021*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO)
1022*62c56f98SSadaf Ebrahimi transform->psa_mac_enc = MBEDTLS_SVC_KEY_ID_INIT;
1023*62c56f98SSadaf Ebrahimi transform->psa_mac_dec = MBEDTLS_SVC_KEY_ID_INIT;
1024*62c56f98SSadaf Ebrahimi #else
1025*62c56f98SSadaf Ebrahimi mbedtls_md_init(&transform->md_ctx_enc);
1026*62c56f98SSadaf Ebrahimi mbedtls_md_init(&transform->md_ctx_dec);
1027*62c56f98SSadaf Ebrahimi #endif
1028*62c56f98SSadaf Ebrahimi #endif
1029*62c56f98SSadaf Ebrahimi }
1030*62c56f98SSadaf Ebrahimi
mbedtls_ssl_session_init(mbedtls_ssl_session * session)1031*62c56f98SSadaf Ebrahimi void mbedtls_ssl_session_init(mbedtls_ssl_session *session)
1032*62c56f98SSadaf Ebrahimi {
1033*62c56f98SSadaf Ebrahimi memset(session, 0, sizeof(mbedtls_ssl_session));
1034*62c56f98SSadaf Ebrahimi }
1035*62c56f98SSadaf Ebrahimi
1036*62c56f98SSadaf Ebrahimi MBEDTLS_CHECK_RETURN_CRITICAL
ssl_handshake_init(mbedtls_ssl_context * ssl)1037*62c56f98SSadaf Ebrahimi static int ssl_handshake_init(mbedtls_ssl_context *ssl)
1038*62c56f98SSadaf Ebrahimi {
1039*62c56f98SSadaf Ebrahimi int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1040*62c56f98SSadaf Ebrahimi
1041*62c56f98SSadaf Ebrahimi /* Clear old handshake information if present */
1042*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
1043*62c56f98SSadaf Ebrahimi if (ssl->transform_negotiate) {
1044*62c56f98SSadaf Ebrahimi mbedtls_ssl_transform_free(ssl->transform_negotiate);
1045*62c56f98SSadaf Ebrahimi }
1046*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
1047*62c56f98SSadaf Ebrahimi if (ssl->session_negotiate) {
1048*62c56f98SSadaf Ebrahimi mbedtls_ssl_session_free(ssl->session_negotiate);
1049*62c56f98SSadaf Ebrahimi }
1050*62c56f98SSadaf Ebrahimi if (ssl->handshake) {
1051*62c56f98SSadaf Ebrahimi mbedtls_ssl_handshake_free(ssl);
1052*62c56f98SSadaf Ebrahimi }
1053*62c56f98SSadaf Ebrahimi
1054*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
1055*62c56f98SSadaf Ebrahimi /*
1056*62c56f98SSadaf Ebrahimi * Either the pointers are now NULL or cleared properly and can be freed.
1057*62c56f98SSadaf Ebrahimi * Now allocate missing structures.
1058*62c56f98SSadaf Ebrahimi */
1059*62c56f98SSadaf Ebrahimi if (ssl->transform_negotiate == NULL) {
1060*62c56f98SSadaf Ebrahimi ssl->transform_negotiate = mbedtls_calloc(1, sizeof(mbedtls_ssl_transform));
1061*62c56f98SSadaf Ebrahimi }
1062*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
1063*62c56f98SSadaf Ebrahimi
1064*62c56f98SSadaf Ebrahimi if (ssl->session_negotiate == NULL) {
1065*62c56f98SSadaf Ebrahimi ssl->session_negotiate = mbedtls_calloc(1, sizeof(mbedtls_ssl_session));
1066*62c56f98SSadaf Ebrahimi }
1067*62c56f98SSadaf Ebrahimi
1068*62c56f98SSadaf Ebrahimi if (ssl->handshake == NULL) {
1069*62c56f98SSadaf Ebrahimi ssl->handshake = mbedtls_calloc(1, sizeof(mbedtls_ssl_handshake_params));
1070*62c56f98SSadaf Ebrahimi }
1071*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
1072*62c56f98SSadaf Ebrahimi /* If the buffers are too small - reallocate */
1073*62c56f98SSadaf Ebrahimi
1074*62c56f98SSadaf Ebrahimi handle_buffer_resizing(ssl, 0, MBEDTLS_SSL_IN_BUFFER_LEN,
1075*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_OUT_BUFFER_LEN);
1076*62c56f98SSadaf Ebrahimi #endif
1077*62c56f98SSadaf Ebrahimi
1078*62c56f98SSadaf Ebrahimi /* All pointers should exist and can be directly freed without issue */
1079*62c56f98SSadaf Ebrahimi if (ssl->handshake == NULL ||
1080*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
1081*62c56f98SSadaf Ebrahimi ssl->transform_negotiate == NULL ||
1082*62c56f98SSadaf Ebrahimi #endif
1083*62c56f98SSadaf Ebrahimi ssl->session_negotiate == NULL) {
1084*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(1, ("alloc() of ssl sub-contexts failed"));
1085*62c56f98SSadaf Ebrahimi
1086*62c56f98SSadaf Ebrahimi mbedtls_free(ssl->handshake);
1087*62c56f98SSadaf Ebrahimi ssl->handshake = NULL;
1088*62c56f98SSadaf Ebrahimi
1089*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
1090*62c56f98SSadaf Ebrahimi mbedtls_free(ssl->transform_negotiate);
1091*62c56f98SSadaf Ebrahimi ssl->transform_negotiate = NULL;
1092*62c56f98SSadaf Ebrahimi #endif
1093*62c56f98SSadaf Ebrahimi
1094*62c56f98SSadaf Ebrahimi mbedtls_free(ssl->session_negotiate);
1095*62c56f98SSadaf Ebrahimi ssl->session_negotiate = NULL;
1096*62c56f98SSadaf Ebrahimi
1097*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_ALLOC_FAILED;
1098*62c56f98SSadaf Ebrahimi }
1099*62c56f98SSadaf Ebrahimi
1100*62c56f98SSadaf Ebrahimi /* Initialize structures */
1101*62c56f98SSadaf Ebrahimi mbedtls_ssl_session_init(ssl->session_negotiate);
1102*62c56f98SSadaf Ebrahimi ssl_handshake_params_init(ssl->handshake);
1103*62c56f98SSadaf Ebrahimi
1104*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
1105*62c56f98SSadaf Ebrahimi mbedtls_ssl_transform_init(ssl->transform_negotiate);
1106*62c56f98SSadaf Ebrahimi #endif
1107*62c56f98SSadaf Ebrahimi
1108*62c56f98SSadaf Ebrahimi /* Setup handshake checksums */
1109*62c56f98SSadaf Ebrahimi ret = mbedtls_ssl_reset_checksum(ssl);
1110*62c56f98SSadaf Ebrahimi if (ret != 0) {
1111*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_reset_checksum", ret);
1112*62c56f98SSadaf Ebrahimi return ret;
1113*62c56f98SSadaf Ebrahimi }
1114*62c56f98SSadaf Ebrahimi
1115*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_TLS1_3) && \
1116*62c56f98SSadaf Ebrahimi defined(MBEDTLS_SSL_SRV_C) && \
1117*62c56f98SSadaf Ebrahimi defined(MBEDTLS_SSL_SESSION_TICKETS)
1118*62c56f98SSadaf Ebrahimi ssl->handshake->new_session_tickets_count =
1119*62c56f98SSadaf Ebrahimi ssl->conf->new_session_tickets_count;
1120*62c56f98SSadaf Ebrahimi #endif
1121*62c56f98SSadaf Ebrahimi
1122*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_DTLS)
1123*62c56f98SSadaf Ebrahimi if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
1124*62c56f98SSadaf Ebrahimi ssl->handshake->alt_transform_out = ssl->transform_out;
1125*62c56f98SSadaf Ebrahimi
1126*62c56f98SSadaf Ebrahimi if (ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT) {
1127*62c56f98SSadaf Ebrahimi ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_PREPARING;
1128*62c56f98SSadaf Ebrahimi } else {
1129*62c56f98SSadaf Ebrahimi ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_WAITING;
1130*62c56f98SSadaf Ebrahimi }
1131*62c56f98SSadaf Ebrahimi
1132*62c56f98SSadaf Ebrahimi mbedtls_ssl_set_timer(ssl, 0);
1133*62c56f98SSadaf Ebrahimi }
1134*62c56f98SSadaf Ebrahimi #endif
1135*62c56f98SSadaf Ebrahimi
1136*62c56f98SSadaf Ebrahimi /*
1137*62c56f98SSadaf Ebrahimi * curve_list is translated to IANA TLS group identifiers here because
1138*62c56f98SSadaf Ebrahimi * mbedtls_ssl_conf_curves returns void and so can't return
1139*62c56f98SSadaf Ebrahimi * any error codes.
1140*62c56f98SSadaf Ebrahimi */
1141*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_ECP_C)
1142*62c56f98SSadaf Ebrahimi #if !defined(MBEDTLS_DEPRECATED_REMOVED)
1143*62c56f98SSadaf Ebrahimi /* Heap allocate and translate curve_list from internal to IANA group ids */
1144*62c56f98SSadaf Ebrahimi if (ssl->conf->curve_list != NULL) {
1145*62c56f98SSadaf Ebrahimi size_t length;
1146*62c56f98SSadaf Ebrahimi const mbedtls_ecp_group_id *curve_list = ssl->conf->curve_list;
1147*62c56f98SSadaf Ebrahimi
1148*62c56f98SSadaf Ebrahimi for (length = 0; (curve_list[length] != MBEDTLS_ECP_DP_NONE); length++) {
1149*62c56f98SSadaf Ebrahimi }
1150*62c56f98SSadaf Ebrahimi
1151*62c56f98SSadaf Ebrahimi /* Leave room for zero termination */
1152*62c56f98SSadaf Ebrahimi uint16_t *group_list = mbedtls_calloc(length + 1, sizeof(uint16_t));
1153*62c56f98SSadaf Ebrahimi if (group_list == NULL) {
1154*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_ALLOC_FAILED;
1155*62c56f98SSadaf Ebrahimi }
1156*62c56f98SSadaf Ebrahimi
1157*62c56f98SSadaf Ebrahimi for (size_t i = 0; i < length; i++) {
1158*62c56f98SSadaf Ebrahimi uint16_t tls_id = mbedtls_ssl_get_tls_id_from_ecp_group_id(
1159*62c56f98SSadaf Ebrahimi curve_list[i]);
1160*62c56f98SSadaf Ebrahimi if (tls_id == 0) {
1161*62c56f98SSadaf Ebrahimi mbedtls_free(group_list);
1162*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_CONFIG;
1163*62c56f98SSadaf Ebrahimi }
1164*62c56f98SSadaf Ebrahimi group_list[i] = tls_id;
1165*62c56f98SSadaf Ebrahimi }
1166*62c56f98SSadaf Ebrahimi
1167*62c56f98SSadaf Ebrahimi group_list[length] = 0;
1168*62c56f98SSadaf Ebrahimi
1169*62c56f98SSadaf Ebrahimi ssl->handshake->group_list = group_list;
1170*62c56f98SSadaf Ebrahimi ssl->handshake->group_list_heap_allocated = 1;
1171*62c56f98SSadaf Ebrahimi } else {
1172*62c56f98SSadaf Ebrahimi ssl->handshake->group_list = ssl->conf->group_list;
1173*62c56f98SSadaf Ebrahimi ssl->handshake->group_list_heap_allocated = 0;
1174*62c56f98SSadaf Ebrahimi }
1175*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_DEPRECATED_REMOVED */
1176*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_ECP_C */
1177*62c56f98SSadaf Ebrahimi
1178*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED)
1179*62c56f98SSadaf Ebrahimi #if !defined(MBEDTLS_DEPRECATED_REMOVED)
1180*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
1181*62c56f98SSadaf Ebrahimi /* Heap allocate and translate sig_hashes from internal hash identifiers to
1182*62c56f98SSadaf Ebrahimi signature algorithms IANA identifiers. */
1183*62c56f98SSadaf Ebrahimi if (mbedtls_ssl_conf_is_tls12_only(ssl->conf) &&
1184*62c56f98SSadaf Ebrahimi ssl->conf->sig_hashes != NULL) {
1185*62c56f98SSadaf Ebrahimi const int *md;
1186*62c56f98SSadaf Ebrahimi const int *sig_hashes = ssl->conf->sig_hashes;
1187*62c56f98SSadaf Ebrahimi size_t sig_algs_len = 0;
1188*62c56f98SSadaf Ebrahimi uint16_t *p;
1189*62c56f98SSadaf Ebrahimi
1190*62c56f98SSadaf Ebrahimi MBEDTLS_STATIC_ASSERT(MBEDTLS_SSL_MAX_SIG_ALG_LIST_LEN
1191*62c56f98SSadaf Ebrahimi <= (SIZE_MAX - (2 * sizeof(uint16_t))),
1192*62c56f98SSadaf Ebrahimi "MBEDTLS_SSL_MAX_SIG_ALG_LIST_LEN too big");
1193*62c56f98SSadaf Ebrahimi
1194*62c56f98SSadaf Ebrahimi for (md = sig_hashes; *md != MBEDTLS_MD_NONE; md++) {
1195*62c56f98SSadaf Ebrahimi if (mbedtls_ssl_hash_from_md_alg(*md) == MBEDTLS_SSL_HASH_NONE) {
1196*62c56f98SSadaf Ebrahimi continue;
1197*62c56f98SSadaf Ebrahimi }
1198*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED)
1199*62c56f98SSadaf Ebrahimi sig_algs_len += sizeof(uint16_t);
1200*62c56f98SSadaf Ebrahimi #endif
1201*62c56f98SSadaf Ebrahimi
1202*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_RSA_C)
1203*62c56f98SSadaf Ebrahimi sig_algs_len += sizeof(uint16_t);
1204*62c56f98SSadaf Ebrahimi #endif
1205*62c56f98SSadaf Ebrahimi if (sig_algs_len > MBEDTLS_SSL_MAX_SIG_ALG_LIST_LEN) {
1206*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_CONFIG;
1207*62c56f98SSadaf Ebrahimi }
1208*62c56f98SSadaf Ebrahimi }
1209*62c56f98SSadaf Ebrahimi
1210*62c56f98SSadaf Ebrahimi if (sig_algs_len < MBEDTLS_SSL_MIN_SIG_ALG_LIST_LEN) {
1211*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_CONFIG;
1212*62c56f98SSadaf Ebrahimi }
1213*62c56f98SSadaf Ebrahimi
1214*62c56f98SSadaf Ebrahimi ssl->handshake->sig_algs = mbedtls_calloc(1, sig_algs_len +
1215*62c56f98SSadaf Ebrahimi sizeof(uint16_t));
1216*62c56f98SSadaf Ebrahimi if (ssl->handshake->sig_algs == NULL) {
1217*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_ALLOC_FAILED;
1218*62c56f98SSadaf Ebrahimi }
1219*62c56f98SSadaf Ebrahimi
1220*62c56f98SSadaf Ebrahimi p = (uint16_t *) ssl->handshake->sig_algs;
1221*62c56f98SSadaf Ebrahimi for (md = sig_hashes; *md != MBEDTLS_MD_NONE; md++) {
1222*62c56f98SSadaf Ebrahimi unsigned char hash = mbedtls_ssl_hash_from_md_alg(*md);
1223*62c56f98SSadaf Ebrahimi if (hash == MBEDTLS_SSL_HASH_NONE) {
1224*62c56f98SSadaf Ebrahimi continue;
1225*62c56f98SSadaf Ebrahimi }
1226*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED)
1227*62c56f98SSadaf Ebrahimi *p = ((hash << 8) | MBEDTLS_SSL_SIG_ECDSA);
1228*62c56f98SSadaf Ebrahimi p++;
1229*62c56f98SSadaf Ebrahimi #endif
1230*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_RSA_C)
1231*62c56f98SSadaf Ebrahimi *p = ((hash << 8) | MBEDTLS_SSL_SIG_RSA);
1232*62c56f98SSadaf Ebrahimi p++;
1233*62c56f98SSadaf Ebrahimi #endif
1234*62c56f98SSadaf Ebrahimi }
1235*62c56f98SSadaf Ebrahimi *p = MBEDTLS_TLS_SIG_NONE;
1236*62c56f98SSadaf Ebrahimi ssl->handshake->sig_algs_heap_allocated = 1;
1237*62c56f98SSadaf Ebrahimi } else
1238*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
1239*62c56f98SSadaf Ebrahimi {
1240*62c56f98SSadaf Ebrahimi ssl->handshake->sig_algs_heap_allocated = 0;
1241*62c56f98SSadaf Ebrahimi }
1242*62c56f98SSadaf Ebrahimi #endif /* !MBEDTLS_DEPRECATED_REMOVED */
1243*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED */
1244*62c56f98SSadaf Ebrahimi return 0;
1245*62c56f98SSadaf Ebrahimi }
1246*62c56f98SSadaf Ebrahimi
1247*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C)
1248*62c56f98SSadaf Ebrahimi /* Dummy cookie callbacks for defaults */
1249*62c56f98SSadaf Ebrahimi MBEDTLS_CHECK_RETURN_CRITICAL
ssl_cookie_write_dummy(void * ctx,unsigned char ** p,unsigned char * end,const unsigned char * cli_id,size_t cli_id_len)1250*62c56f98SSadaf Ebrahimi static int ssl_cookie_write_dummy(void *ctx,
1251*62c56f98SSadaf Ebrahimi unsigned char **p, unsigned char *end,
1252*62c56f98SSadaf Ebrahimi const unsigned char *cli_id, size_t cli_id_len)
1253*62c56f98SSadaf Ebrahimi {
1254*62c56f98SSadaf Ebrahimi ((void) ctx);
1255*62c56f98SSadaf Ebrahimi ((void) p);
1256*62c56f98SSadaf Ebrahimi ((void) end);
1257*62c56f98SSadaf Ebrahimi ((void) cli_id);
1258*62c56f98SSadaf Ebrahimi ((void) cli_id_len);
1259*62c56f98SSadaf Ebrahimi
1260*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
1261*62c56f98SSadaf Ebrahimi }
1262*62c56f98SSadaf Ebrahimi
1263*62c56f98SSadaf Ebrahimi MBEDTLS_CHECK_RETURN_CRITICAL
ssl_cookie_check_dummy(void * ctx,const unsigned char * cookie,size_t cookie_len,const unsigned char * cli_id,size_t cli_id_len)1264*62c56f98SSadaf Ebrahimi static int ssl_cookie_check_dummy(void *ctx,
1265*62c56f98SSadaf Ebrahimi const unsigned char *cookie, size_t cookie_len,
1266*62c56f98SSadaf Ebrahimi const unsigned char *cli_id, size_t cli_id_len)
1267*62c56f98SSadaf Ebrahimi {
1268*62c56f98SSadaf Ebrahimi ((void) ctx);
1269*62c56f98SSadaf Ebrahimi ((void) cookie);
1270*62c56f98SSadaf Ebrahimi ((void) cookie_len);
1271*62c56f98SSadaf Ebrahimi ((void) cli_id);
1272*62c56f98SSadaf Ebrahimi ((void) cli_id_len);
1273*62c56f98SSadaf Ebrahimi
1274*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
1275*62c56f98SSadaf Ebrahimi }
1276*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY && MBEDTLS_SSL_SRV_C */
1277*62c56f98SSadaf Ebrahimi
1278*62c56f98SSadaf Ebrahimi /*
1279*62c56f98SSadaf Ebrahimi * Initialize an SSL context
1280*62c56f98SSadaf Ebrahimi */
mbedtls_ssl_init(mbedtls_ssl_context * ssl)1281*62c56f98SSadaf Ebrahimi void mbedtls_ssl_init(mbedtls_ssl_context *ssl)
1282*62c56f98SSadaf Ebrahimi {
1283*62c56f98SSadaf Ebrahimi memset(ssl, 0, sizeof(mbedtls_ssl_context));
1284*62c56f98SSadaf Ebrahimi }
1285*62c56f98SSadaf Ebrahimi
1286*62c56f98SSadaf Ebrahimi MBEDTLS_CHECK_RETURN_CRITICAL
ssl_conf_version_check(const mbedtls_ssl_context * ssl)1287*62c56f98SSadaf Ebrahimi static int ssl_conf_version_check(const mbedtls_ssl_context *ssl)
1288*62c56f98SSadaf Ebrahimi {
1289*62c56f98SSadaf Ebrahimi const mbedtls_ssl_config *conf = ssl->conf;
1290*62c56f98SSadaf Ebrahimi
1291*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_TLS1_3)
1292*62c56f98SSadaf Ebrahimi if (mbedtls_ssl_conf_is_tls13_only(conf)) {
1293*62c56f98SSadaf Ebrahimi if (conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
1294*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(1, ("DTLS 1.3 is not yet supported."));
1295*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
1296*62c56f98SSadaf Ebrahimi }
1297*62c56f98SSadaf Ebrahimi
1298*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(4, ("The SSL configuration is tls13 only."));
1299*62c56f98SSadaf Ebrahimi return 0;
1300*62c56f98SSadaf Ebrahimi }
1301*62c56f98SSadaf Ebrahimi #endif
1302*62c56f98SSadaf Ebrahimi
1303*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
1304*62c56f98SSadaf Ebrahimi if (mbedtls_ssl_conf_is_tls12_only(conf)) {
1305*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(4, ("The SSL configuration is tls12 only."));
1306*62c56f98SSadaf Ebrahimi return 0;
1307*62c56f98SSadaf Ebrahimi }
1308*62c56f98SSadaf Ebrahimi #endif
1309*62c56f98SSadaf Ebrahimi
1310*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_TLS1_2) && defined(MBEDTLS_SSL_PROTO_TLS1_3)
1311*62c56f98SSadaf Ebrahimi if (mbedtls_ssl_conf_is_hybrid_tls12_tls13(conf)) {
1312*62c56f98SSadaf Ebrahimi if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
1313*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(1, ("DTLS not yet supported in Hybrid TLS 1.3 + TLS 1.2"));
1314*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
1315*62c56f98SSadaf Ebrahimi }
1316*62c56f98SSadaf Ebrahimi
1317*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(4, ("The SSL configuration is TLS 1.3 or TLS 1.2."));
1318*62c56f98SSadaf Ebrahimi return 0;
1319*62c56f98SSadaf Ebrahimi }
1320*62c56f98SSadaf Ebrahimi #endif
1321*62c56f98SSadaf Ebrahimi
1322*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(1, ("The SSL configuration is invalid."));
1323*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_CONFIG;
1324*62c56f98SSadaf Ebrahimi }
1325*62c56f98SSadaf Ebrahimi
1326*62c56f98SSadaf Ebrahimi MBEDTLS_CHECK_RETURN_CRITICAL
ssl_conf_check(const mbedtls_ssl_context * ssl)1327*62c56f98SSadaf Ebrahimi static int ssl_conf_check(const mbedtls_ssl_context *ssl)
1328*62c56f98SSadaf Ebrahimi {
1329*62c56f98SSadaf Ebrahimi int ret;
1330*62c56f98SSadaf Ebrahimi ret = ssl_conf_version_check(ssl);
1331*62c56f98SSadaf Ebrahimi if (ret != 0) {
1332*62c56f98SSadaf Ebrahimi return ret;
1333*62c56f98SSadaf Ebrahimi }
1334*62c56f98SSadaf Ebrahimi
1335*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_TLS1_3)
1336*62c56f98SSadaf Ebrahimi /* RFC 8446 section 4.4.3
1337*62c56f98SSadaf Ebrahimi *
1338*62c56f98SSadaf Ebrahimi * If the verification fails, the receiver MUST terminate the handshake with
1339*62c56f98SSadaf Ebrahimi * a "decrypt_error" alert.
1340*62c56f98SSadaf Ebrahimi *
1341*62c56f98SSadaf Ebrahimi * If the client is configured as TLS 1.3 only with optional verify, return
1342*62c56f98SSadaf Ebrahimi * bad config.
1343*62c56f98SSadaf Ebrahimi *
1344*62c56f98SSadaf Ebrahimi */
1345*62c56f98SSadaf Ebrahimi if (mbedtls_ssl_conf_tls13_ephemeral_enabled(
1346*62c56f98SSadaf Ebrahimi (mbedtls_ssl_context *) ssl) &&
1347*62c56f98SSadaf Ebrahimi ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT &&
1348*62c56f98SSadaf Ebrahimi ssl->conf->max_tls_version == MBEDTLS_SSL_VERSION_TLS1_3 &&
1349*62c56f98SSadaf Ebrahimi ssl->conf->min_tls_version == MBEDTLS_SSL_VERSION_TLS1_3 &&
1350*62c56f98SSadaf Ebrahimi ssl->conf->authmode == MBEDTLS_SSL_VERIFY_OPTIONAL) {
1351*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(
1352*62c56f98SSadaf Ebrahimi 1, ("Optional verify auth mode "
1353*62c56f98SSadaf Ebrahimi "is not available for TLS 1.3 client"));
1354*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_CONFIG;
1355*62c56f98SSadaf Ebrahimi }
1356*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
1357*62c56f98SSadaf Ebrahimi
1358*62c56f98SSadaf Ebrahimi /* Space for further checks */
1359*62c56f98SSadaf Ebrahimi
1360*62c56f98SSadaf Ebrahimi return 0;
1361*62c56f98SSadaf Ebrahimi }
1362*62c56f98SSadaf Ebrahimi
1363*62c56f98SSadaf Ebrahimi /*
1364*62c56f98SSadaf Ebrahimi * Setup an SSL context
1365*62c56f98SSadaf Ebrahimi */
1366*62c56f98SSadaf Ebrahimi
mbedtls_ssl_setup(mbedtls_ssl_context * ssl,const mbedtls_ssl_config * conf)1367*62c56f98SSadaf Ebrahimi int mbedtls_ssl_setup(mbedtls_ssl_context *ssl,
1368*62c56f98SSadaf Ebrahimi const mbedtls_ssl_config *conf)
1369*62c56f98SSadaf Ebrahimi {
1370*62c56f98SSadaf Ebrahimi int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1371*62c56f98SSadaf Ebrahimi size_t in_buf_len = MBEDTLS_SSL_IN_BUFFER_LEN;
1372*62c56f98SSadaf Ebrahimi size_t out_buf_len = MBEDTLS_SSL_OUT_BUFFER_LEN;
1373*62c56f98SSadaf Ebrahimi
1374*62c56f98SSadaf Ebrahimi ssl->conf = conf;
1375*62c56f98SSadaf Ebrahimi
1376*62c56f98SSadaf Ebrahimi if ((ret = ssl_conf_check(ssl)) != 0) {
1377*62c56f98SSadaf Ebrahimi return ret;
1378*62c56f98SSadaf Ebrahimi }
1379*62c56f98SSadaf Ebrahimi ssl->tls_version = ssl->conf->max_tls_version;
1380*62c56f98SSadaf Ebrahimi
1381*62c56f98SSadaf Ebrahimi /*
1382*62c56f98SSadaf Ebrahimi * Prepare base structures
1383*62c56f98SSadaf Ebrahimi */
1384*62c56f98SSadaf Ebrahimi
1385*62c56f98SSadaf Ebrahimi /* Set to NULL in case of an error condition */
1386*62c56f98SSadaf Ebrahimi ssl->out_buf = NULL;
1387*62c56f98SSadaf Ebrahimi
1388*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
1389*62c56f98SSadaf Ebrahimi ssl->in_buf_len = in_buf_len;
1390*62c56f98SSadaf Ebrahimi #endif
1391*62c56f98SSadaf Ebrahimi ssl->in_buf = mbedtls_calloc(1, in_buf_len);
1392*62c56f98SSadaf Ebrahimi if (ssl->in_buf == NULL) {
1393*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(1, ("alloc(%" MBEDTLS_PRINTF_SIZET " bytes) failed", in_buf_len));
1394*62c56f98SSadaf Ebrahimi ret = MBEDTLS_ERR_SSL_ALLOC_FAILED;
1395*62c56f98SSadaf Ebrahimi goto error;
1396*62c56f98SSadaf Ebrahimi }
1397*62c56f98SSadaf Ebrahimi
1398*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
1399*62c56f98SSadaf Ebrahimi ssl->out_buf_len = out_buf_len;
1400*62c56f98SSadaf Ebrahimi #endif
1401*62c56f98SSadaf Ebrahimi ssl->out_buf = mbedtls_calloc(1, out_buf_len);
1402*62c56f98SSadaf Ebrahimi if (ssl->out_buf == NULL) {
1403*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(1, ("alloc(%" MBEDTLS_PRINTF_SIZET " bytes) failed", out_buf_len));
1404*62c56f98SSadaf Ebrahimi ret = MBEDTLS_ERR_SSL_ALLOC_FAILED;
1405*62c56f98SSadaf Ebrahimi goto error;
1406*62c56f98SSadaf Ebrahimi }
1407*62c56f98SSadaf Ebrahimi
1408*62c56f98SSadaf Ebrahimi mbedtls_ssl_reset_in_out_pointers(ssl);
1409*62c56f98SSadaf Ebrahimi
1410*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_DTLS_SRTP)
1411*62c56f98SSadaf Ebrahimi memset(&ssl->dtls_srtp_info, 0, sizeof(ssl->dtls_srtp_info));
1412*62c56f98SSadaf Ebrahimi #endif
1413*62c56f98SSadaf Ebrahimi
1414*62c56f98SSadaf Ebrahimi if ((ret = ssl_handshake_init(ssl)) != 0) {
1415*62c56f98SSadaf Ebrahimi goto error;
1416*62c56f98SSadaf Ebrahimi }
1417*62c56f98SSadaf Ebrahimi
1418*62c56f98SSadaf Ebrahimi return 0;
1419*62c56f98SSadaf Ebrahimi
1420*62c56f98SSadaf Ebrahimi error:
1421*62c56f98SSadaf Ebrahimi mbedtls_free(ssl->in_buf);
1422*62c56f98SSadaf Ebrahimi mbedtls_free(ssl->out_buf);
1423*62c56f98SSadaf Ebrahimi
1424*62c56f98SSadaf Ebrahimi ssl->conf = NULL;
1425*62c56f98SSadaf Ebrahimi
1426*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
1427*62c56f98SSadaf Ebrahimi ssl->in_buf_len = 0;
1428*62c56f98SSadaf Ebrahimi ssl->out_buf_len = 0;
1429*62c56f98SSadaf Ebrahimi #endif
1430*62c56f98SSadaf Ebrahimi ssl->in_buf = NULL;
1431*62c56f98SSadaf Ebrahimi ssl->out_buf = NULL;
1432*62c56f98SSadaf Ebrahimi
1433*62c56f98SSadaf Ebrahimi ssl->in_hdr = NULL;
1434*62c56f98SSadaf Ebrahimi ssl->in_ctr = NULL;
1435*62c56f98SSadaf Ebrahimi ssl->in_len = NULL;
1436*62c56f98SSadaf Ebrahimi ssl->in_iv = NULL;
1437*62c56f98SSadaf Ebrahimi ssl->in_msg = NULL;
1438*62c56f98SSadaf Ebrahimi
1439*62c56f98SSadaf Ebrahimi ssl->out_hdr = NULL;
1440*62c56f98SSadaf Ebrahimi ssl->out_ctr = NULL;
1441*62c56f98SSadaf Ebrahimi ssl->out_len = NULL;
1442*62c56f98SSadaf Ebrahimi ssl->out_iv = NULL;
1443*62c56f98SSadaf Ebrahimi ssl->out_msg = NULL;
1444*62c56f98SSadaf Ebrahimi
1445*62c56f98SSadaf Ebrahimi return ret;
1446*62c56f98SSadaf Ebrahimi }
1447*62c56f98SSadaf Ebrahimi
1448*62c56f98SSadaf Ebrahimi /*
1449*62c56f98SSadaf Ebrahimi * Reset an initialized and used SSL context for re-use while retaining
1450*62c56f98SSadaf Ebrahimi * all application-set variables, function pointers and data.
1451*62c56f98SSadaf Ebrahimi *
1452*62c56f98SSadaf Ebrahimi * If partial is non-zero, keep data in the input buffer and client ID.
1453*62c56f98SSadaf Ebrahimi * (Use when a DTLS client reconnects from the same port.)
1454*62c56f98SSadaf Ebrahimi */
mbedtls_ssl_session_reset_msg_layer(mbedtls_ssl_context * ssl,int partial)1455*62c56f98SSadaf Ebrahimi void mbedtls_ssl_session_reset_msg_layer(mbedtls_ssl_context *ssl,
1456*62c56f98SSadaf Ebrahimi int partial)
1457*62c56f98SSadaf Ebrahimi {
1458*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
1459*62c56f98SSadaf Ebrahimi size_t in_buf_len = ssl->in_buf_len;
1460*62c56f98SSadaf Ebrahimi size_t out_buf_len = ssl->out_buf_len;
1461*62c56f98SSadaf Ebrahimi #else
1462*62c56f98SSadaf Ebrahimi size_t in_buf_len = MBEDTLS_SSL_IN_BUFFER_LEN;
1463*62c56f98SSadaf Ebrahimi size_t out_buf_len = MBEDTLS_SSL_OUT_BUFFER_LEN;
1464*62c56f98SSadaf Ebrahimi #endif
1465*62c56f98SSadaf Ebrahimi
1466*62c56f98SSadaf Ebrahimi #if !defined(MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE) || !defined(MBEDTLS_SSL_SRV_C)
1467*62c56f98SSadaf Ebrahimi partial = 0;
1468*62c56f98SSadaf Ebrahimi #endif
1469*62c56f98SSadaf Ebrahimi
1470*62c56f98SSadaf Ebrahimi /* Cancel any possibly running timer */
1471*62c56f98SSadaf Ebrahimi mbedtls_ssl_set_timer(ssl, 0);
1472*62c56f98SSadaf Ebrahimi
1473*62c56f98SSadaf Ebrahimi mbedtls_ssl_reset_in_out_pointers(ssl);
1474*62c56f98SSadaf Ebrahimi
1475*62c56f98SSadaf Ebrahimi /* Reset incoming message parsing */
1476*62c56f98SSadaf Ebrahimi ssl->in_offt = NULL;
1477*62c56f98SSadaf Ebrahimi ssl->nb_zero = 0;
1478*62c56f98SSadaf Ebrahimi ssl->in_msgtype = 0;
1479*62c56f98SSadaf Ebrahimi ssl->in_msglen = 0;
1480*62c56f98SSadaf Ebrahimi ssl->in_hslen = 0;
1481*62c56f98SSadaf Ebrahimi ssl->keep_current_message = 0;
1482*62c56f98SSadaf Ebrahimi ssl->transform_in = NULL;
1483*62c56f98SSadaf Ebrahimi
1484*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_DTLS)
1485*62c56f98SSadaf Ebrahimi ssl->next_record_offset = 0;
1486*62c56f98SSadaf Ebrahimi ssl->in_epoch = 0;
1487*62c56f98SSadaf Ebrahimi #endif
1488*62c56f98SSadaf Ebrahimi
1489*62c56f98SSadaf Ebrahimi /* Keep current datagram if partial == 1 */
1490*62c56f98SSadaf Ebrahimi if (partial == 0) {
1491*62c56f98SSadaf Ebrahimi ssl->in_left = 0;
1492*62c56f98SSadaf Ebrahimi memset(ssl->in_buf, 0, in_buf_len);
1493*62c56f98SSadaf Ebrahimi }
1494*62c56f98SSadaf Ebrahimi
1495*62c56f98SSadaf Ebrahimi ssl->send_alert = 0;
1496*62c56f98SSadaf Ebrahimi
1497*62c56f98SSadaf Ebrahimi /* Reset outgoing message writing */
1498*62c56f98SSadaf Ebrahimi ssl->out_msgtype = 0;
1499*62c56f98SSadaf Ebrahimi ssl->out_msglen = 0;
1500*62c56f98SSadaf Ebrahimi ssl->out_left = 0;
1501*62c56f98SSadaf Ebrahimi memset(ssl->out_buf, 0, out_buf_len);
1502*62c56f98SSadaf Ebrahimi memset(ssl->cur_out_ctr, 0, sizeof(ssl->cur_out_ctr));
1503*62c56f98SSadaf Ebrahimi ssl->transform_out = NULL;
1504*62c56f98SSadaf Ebrahimi
1505*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
1506*62c56f98SSadaf Ebrahimi mbedtls_ssl_dtls_replay_reset(ssl);
1507*62c56f98SSadaf Ebrahimi #endif
1508*62c56f98SSadaf Ebrahimi
1509*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
1510*62c56f98SSadaf Ebrahimi if (ssl->transform) {
1511*62c56f98SSadaf Ebrahimi mbedtls_ssl_transform_free(ssl->transform);
1512*62c56f98SSadaf Ebrahimi mbedtls_free(ssl->transform);
1513*62c56f98SSadaf Ebrahimi ssl->transform = NULL;
1514*62c56f98SSadaf Ebrahimi }
1515*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
1516*62c56f98SSadaf Ebrahimi
1517*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_TLS1_3)
1518*62c56f98SSadaf Ebrahimi mbedtls_ssl_transform_free(ssl->transform_application);
1519*62c56f98SSadaf Ebrahimi mbedtls_free(ssl->transform_application);
1520*62c56f98SSadaf Ebrahimi ssl->transform_application = NULL;
1521*62c56f98SSadaf Ebrahimi
1522*62c56f98SSadaf Ebrahimi if (ssl->handshake != NULL) {
1523*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_EARLY_DATA)
1524*62c56f98SSadaf Ebrahimi mbedtls_ssl_transform_free(ssl->handshake->transform_earlydata);
1525*62c56f98SSadaf Ebrahimi mbedtls_free(ssl->handshake->transform_earlydata);
1526*62c56f98SSadaf Ebrahimi ssl->handshake->transform_earlydata = NULL;
1527*62c56f98SSadaf Ebrahimi #endif
1528*62c56f98SSadaf Ebrahimi
1529*62c56f98SSadaf Ebrahimi mbedtls_ssl_transform_free(ssl->handshake->transform_handshake);
1530*62c56f98SSadaf Ebrahimi mbedtls_free(ssl->handshake->transform_handshake);
1531*62c56f98SSadaf Ebrahimi ssl->handshake->transform_handshake = NULL;
1532*62c56f98SSadaf Ebrahimi }
1533*62c56f98SSadaf Ebrahimi
1534*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
1535*62c56f98SSadaf Ebrahimi }
1536*62c56f98SSadaf Ebrahimi
mbedtls_ssl_session_reset_int(mbedtls_ssl_context * ssl,int partial)1537*62c56f98SSadaf Ebrahimi int mbedtls_ssl_session_reset_int(mbedtls_ssl_context *ssl, int partial)
1538*62c56f98SSadaf Ebrahimi {
1539*62c56f98SSadaf Ebrahimi int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1540*62c56f98SSadaf Ebrahimi
1541*62c56f98SSadaf Ebrahimi ssl->state = MBEDTLS_SSL_HELLO_REQUEST;
1542*62c56f98SSadaf Ebrahimi
1543*62c56f98SSadaf Ebrahimi mbedtls_ssl_session_reset_msg_layer(ssl, partial);
1544*62c56f98SSadaf Ebrahimi
1545*62c56f98SSadaf Ebrahimi /* Reset renegotiation state */
1546*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_RENEGOTIATION)
1547*62c56f98SSadaf Ebrahimi ssl->renego_status = MBEDTLS_SSL_INITIAL_HANDSHAKE;
1548*62c56f98SSadaf Ebrahimi ssl->renego_records_seen = 0;
1549*62c56f98SSadaf Ebrahimi
1550*62c56f98SSadaf Ebrahimi ssl->verify_data_len = 0;
1551*62c56f98SSadaf Ebrahimi memset(ssl->own_verify_data, 0, MBEDTLS_SSL_VERIFY_DATA_MAX_LEN);
1552*62c56f98SSadaf Ebrahimi memset(ssl->peer_verify_data, 0, MBEDTLS_SSL_VERIFY_DATA_MAX_LEN);
1553*62c56f98SSadaf Ebrahimi #endif
1554*62c56f98SSadaf Ebrahimi ssl->secure_renegotiation = MBEDTLS_SSL_LEGACY_RENEGOTIATION;
1555*62c56f98SSadaf Ebrahimi
1556*62c56f98SSadaf Ebrahimi ssl->session_in = NULL;
1557*62c56f98SSadaf Ebrahimi ssl->session_out = NULL;
1558*62c56f98SSadaf Ebrahimi if (ssl->session) {
1559*62c56f98SSadaf Ebrahimi mbedtls_ssl_session_free(ssl->session);
1560*62c56f98SSadaf Ebrahimi mbedtls_free(ssl->session);
1561*62c56f98SSadaf Ebrahimi ssl->session = NULL;
1562*62c56f98SSadaf Ebrahimi }
1563*62c56f98SSadaf Ebrahimi
1564*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_ALPN)
1565*62c56f98SSadaf Ebrahimi ssl->alpn_chosen = NULL;
1566*62c56f98SSadaf Ebrahimi #endif
1567*62c56f98SSadaf Ebrahimi
1568*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C)
1569*62c56f98SSadaf Ebrahimi int free_cli_id = 1;
1570*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE)
1571*62c56f98SSadaf Ebrahimi free_cli_id = (partial == 0);
1572*62c56f98SSadaf Ebrahimi #endif
1573*62c56f98SSadaf Ebrahimi if (free_cli_id) {
1574*62c56f98SSadaf Ebrahimi mbedtls_free(ssl->cli_id);
1575*62c56f98SSadaf Ebrahimi ssl->cli_id = NULL;
1576*62c56f98SSadaf Ebrahimi ssl->cli_id_len = 0;
1577*62c56f98SSadaf Ebrahimi }
1578*62c56f98SSadaf Ebrahimi #endif
1579*62c56f98SSadaf Ebrahimi
1580*62c56f98SSadaf Ebrahimi if ((ret = ssl_handshake_init(ssl)) != 0) {
1581*62c56f98SSadaf Ebrahimi return ret;
1582*62c56f98SSadaf Ebrahimi }
1583*62c56f98SSadaf Ebrahimi
1584*62c56f98SSadaf Ebrahimi return 0;
1585*62c56f98SSadaf Ebrahimi }
1586*62c56f98SSadaf Ebrahimi
1587*62c56f98SSadaf Ebrahimi /*
1588*62c56f98SSadaf Ebrahimi * Reset an initialized and used SSL context for re-use while retaining
1589*62c56f98SSadaf Ebrahimi * all application-set variables, function pointers and data.
1590*62c56f98SSadaf Ebrahimi */
mbedtls_ssl_session_reset(mbedtls_ssl_context * ssl)1591*62c56f98SSadaf Ebrahimi int mbedtls_ssl_session_reset(mbedtls_ssl_context *ssl)
1592*62c56f98SSadaf Ebrahimi {
1593*62c56f98SSadaf Ebrahimi return mbedtls_ssl_session_reset_int(ssl, 0);
1594*62c56f98SSadaf Ebrahimi }
1595*62c56f98SSadaf Ebrahimi
1596*62c56f98SSadaf Ebrahimi /*
1597*62c56f98SSadaf Ebrahimi * SSL set accessors
1598*62c56f98SSadaf Ebrahimi */
mbedtls_ssl_conf_endpoint(mbedtls_ssl_config * conf,int endpoint)1599*62c56f98SSadaf Ebrahimi void mbedtls_ssl_conf_endpoint(mbedtls_ssl_config *conf, int endpoint)
1600*62c56f98SSadaf Ebrahimi {
1601*62c56f98SSadaf Ebrahimi conf->endpoint = endpoint;
1602*62c56f98SSadaf Ebrahimi }
1603*62c56f98SSadaf Ebrahimi
mbedtls_ssl_conf_transport(mbedtls_ssl_config * conf,int transport)1604*62c56f98SSadaf Ebrahimi void mbedtls_ssl_conf_transport(mbedtls_ssl_config *conf, int transport)
1605*62c56f98SSadaf Ebrahimi {
1606*62c56f98SSadaf Ebrahimi conf->transport = transport;
1607*62c56f98SSadaf Ebrahimi }
1608*62c56f98SSadaf Ebrahimi
1609*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
mbedtls_ssl_conf_dtls_anti_replay(mbedtls_ssl_config * conf,char mode)1610*62c56f98SSadaf Ebrahimi void mbedtls_ssl_conf_dtls_anti_replay(mbedtls_ssl_config *conf, char mode)
1611*62c56f98SSadaf Ebrahimi {
1612*62c56f98SSadaf Ebrahimi conf->anti_replay = mode;
1613*62c56f98SSadaf Ebrahimi }
1614*62c56f98SSadaf Ebrahimi #endif
1615*62c56f98SSadaf Ebrahimi
mbedtls_ssl_conf_dtls_badmac_limit(mbedtls_ssl_config * conf,unsigned limit)1616*62c56f98SSadaf Ebrahimi void mbedtls_ssl_conf_dtls_badmac_limit(mbedtls_ssl_config *conf, unsigned limit)
1617*62c56f98SSadaf Ebrahimi {
1618*62c56f98SSadaf Ebrahimi conf->badmac_limit = limit;
1619*62c56f98SSadaf Ebrahimi }
1620*62c56f98SSadaf Ebrahimi
1621*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_DTLS)
1622*62c56f98SSadaf Ebrahimi
mbedtls_ssl_set_datagram_packing(mbedtls_ssl_context * ssl,unsigned allow_packing)1623*62c56f98SSadaf Ebrahimi void mbedtls_ssl_set_datagram_packing(mbedtls_ssl_context *ssl,
1624*62c56f98SSadaf Ebrahimi unsigned allow_packing)
1625*62c56f98SSadaf Ebrahimi {
1626*62c56f98SSadaf Ebrahimi ssl->disable_datagram_packing = !allow_packing;
1627*62c56f98SSadaf Ebrahimi }
1628*62c56f98SSadaf Ebrahimi
mbedtls_ssl_conf_handshake_timeout(mbedtls_ssl_config * conf,uint32_t min,uint32_t max)1629*62c56f98SSadaf Ebrahimi void mbedtls_ssl_conf_handshake_timeout(mbedtls_ssl_config *conf,
1630*62c56f98SSadaf Ebrahimi uint32_t min, uint32_t max)
1631*62c56f98SSadaf Ebrahimi {
1632*62c56f98SSadaf Ebrahimi conf->hs_timeout_min = min;
1633*62c56f98SSadaf Ebrahimi conf->hs_timeout_max = max;
1634*62c56f98SSadaf Ebrahimi }
1635*62c56f98SSadaf Ebrahimi #endif
1636*62c56f98SSadaf Ebrahimi
mbedtls_ssl_conf_authmode(mbedtls_ssl_config * conf,int authmode)1637*62c56f98SSadaf Ebrahimi void mbedtls_ssl_conf_authmode(mbedtls_ssl_config *conf, int authmode)
1638*62c56f98SSadaf Ebrahimi {
1639*62c56f98SSadaf Ebrahimi conf->authmode = authmode;
1640*62c56f98SSadaf Ebrahimi }
1641*62c56f98SSadaf Ebrahimi
1642*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_X509_CRT_PARSE_C)
mbedtls_ssl_conf_verify(mbedtls_ssl_config * conf,int (* f_vrfy)(void *,mbedtls_x509_crt *,int,uint32_t *),void * p_vrfy)1643*62c56f98SSadaf Ebrahimi void mbedtls_ssl_conf_verify(mbedtls_ssl_config *conf,
1644*62c56f98SSadaf Ebrahimi int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *),
1645*62c56f98SSadaf Ebrahimi void *p_vrfy)
1646*62c56f98SSadaf Ebrahimi {
1647*62c56f98SSadaf Ebrahimi conf->f_vrfy = f_vrfy;
1648*62c56f98SSadaf Ebrahimi conf->p_vrfy = p_vrfy;
1649*62c56f98SSadaf Ebrahimi }
1650*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_X509_CRT_PARSE_C */
1651*62c56f98SSadaf Ebrahimi
mbedtls_ssl_conf_rng(mbedtls_ssl_config * conf,int (* f_rng)(void *,unsigned char *,size_t),void * p_rng)1652*62c56f98SSadaf Ebrahimi void mbedtls_ssl_conf_rng(mbedtls_ssl_config *conf,
1653*62c56f98SSadaf Ebrahimi int (*f_rng)(void *, unsigned char *, size_t),
1654*62c56f98SSadaf Ebrahimi void *p_rng)
1655*62c56f98SSadaf Ebrahimi {
1656*62c56f98SSadaf Ebrahimi conf->f_rng = f_rng;
1657*62c56f98SSadaf Ebrahimi conf->p_rng = p_rng;
1658*62c56f98SSadaf Ebrahimi }
1659*62c56f98SSadaf Ebrahimi
mbedtls_ssl_conf_dbg(mbedtls_ssl_config * conf,void (* f_dbg)(void *,int,const char *,int,const char *),void * p_dbg)1660*62c56f98SSadaf Ebrahimi void mbedtls_ssl_conf_dbg(mbedtls_ssl_config *conf,
1661*62c56f98SSadaf Ebrahimi void (*f_dbg)(void *, int, const char *, int, const char *),
1662*62c56f98SSadaf Ebrahimi void *p_dbg)
1663*62c56f98SSadaf Ebrahimi {
1664*62c56f98SSadaf Ebrahimi conf->f_dbg = f_dbg;
1665*62c56f98SSadaf Ebrahimi conf->p_dbg = p_dbg;
1666*62c56f98SSadaf Ebrahimi }
1667*62c56f98SSadaf Ebrahimi
mbedtls_ssl_set_bio(mbedtls_ssl_context * ssl,void * p_bio,mbedtls_ssl_send_t * f_send,mbedtls_ssl_recv_t * f_recv,mbedtls_ssl_recv_timeout_t * f_recv_timeout)1668*62c56f98SSadaf Ebrahimi void mbedtls_ssl_set_bio(mbedtls_ssl_context *ssl,
1669*62c56f98SSadaf Ebrahimi void *p_bio,
1670*62c56f98SSadaf Ebrahimi mbedtls_ssl_send_t *f_send,
1671*62c56f98SSadaf Ebrahimi mbedtls_ssl_recv_t *f_recv,
1672*62c56f98SSadaf Ebrahimi mbedtls_ssl_recv_timeout_t *f_recv_timeout)
1673*62c56f98SSadaf Ebrahimi {
1674*62c56f98SSadaf Ebrahimi ssl->p_bio = p_bio;
1675*62c56f98SSadaf Ebrahimi ssl->f_send = f_send;
1676*62c56f98SSadaf Ebrahimi ssl->f_recv = f_recv;
1677*62c56f98SSadaf Ebrahimi ssl->f_recv_timeout = f_recv_timeout;
1678*62c56f98SSadaf Ebrahimi }
1679*62c56f98SSadaf Ebrahimi
1680*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_DTLS)
mbedtls_ssl_set_mtu(mbedtls_ssl_context * ssl,uint16_t mtu)1681*62c56f98SSadaf Ebrahimi void mbedtls_ssl_set_mtu(mbedtls_ssl_context *ssl, uint16_t mtu)
1682*62c56f98SSadaf Ebrahimi {
1683*62c56f98SSadaf Ebrahimi ssl->mtu = mtu;
1684*62c56f98SSadaf Ebrahimi }
1685*62c56f98SSadaf Ebrahimi #endif
1686*62c56f98SSadaf Ebrahimi
mbedtls_ssl_conf_read_timeout(mbedtls_ssl_config * conf,uint32_t timeout)1687*62c56f98SSadaf Ebrahimi void mbedtls_ssl_conf_read_timeout(mbedtls_ssl_config *conf, uint32_t timeout)
1688*62c56f98SSadaf Ebrahimi {
1689*62c56f98SSadaf Ebrahimi conf->read_timeout = timeout;
1690*62c56f98SSadaf Ebrahimi }
1691*62c56f98SSadaf Ebrahimi
mbedtls_ssl_set_timer_cb(mbedtls_ssl_context * ssl,void * p_timer,mbedtls_ssl_set_timer_t * f_set_timer,mbedtls_ssl_get_timer_t * f_get_timer)1692*62c56f98SSadaf Ebrahimi void mbedtls_ssl_set_timer_cb(mbedtls_ssl_context *ssl,
1693*62c56f98SSadaf Ebrahimi void *p_timer,
1694*62c56f98SSadaf Ebrahimi mbedtls_ssl_set_timer_t *f_set_timer,
1695*62c56f98SSadaf Ebrahimi mbedtls_ssl_get_timer_t *f_get_timer)
1696*62c56f98SSadaf Ebrahimi {
1697*62c56f98SSadaf Ebrahimi ssl->p_timer = p_timer;
1698*62c56f98SSadaf Ebrahimi ssl->f_set_timer = f_set_timer;
1699*62c56f98SSadaf Ebrahimi ssl->f_get_timer = f_get_timer;
1700*62c56f98SSadaf Ebrahimi
1701*62c56f98SSadaf Ebrahimi /* Make sure we start with no timer running */
1702*62c56f98SSadaf Ebrahimi mbedtls_ssl_set_timer(ssl, 0);
1703*62c56f98SSadaf Ebrahimi }
1704*62c56f98SSadaf Ebrahimi
1705*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_SRV_C)
mbedtls_ssl_conf_session_cache(mbedtls_ssl_config * conf,void * p_cache,mbedtls_ssl_cache_get_t * f_get_cache,mbedtls_ssl_cache_set_t * f_set_cache)1706*62c56f98SSadaf Ebrahimi void mbedtls_ssl_conf_session_cache(mbedtls_ssl_config *conf,
1707*62c56f98SSadaf Ebrahimi void *p_cache,
1708*62c56f98SSadaf Ebrahimi mbedtls_ssl_cache_get_t *f_get_cache,
1709*62c56f98SSadaf Ebrahimi mbedtls_ssl_cache_set_t *f_set_cache)
1710*62c56f98SSadaf Ebrahimi {
1711*62c56f98SSadaf Ebrahimi conf->p_cache = p_cache;
1712*62c56f98SSadaf Ebrahimi conf->f_get_cache = f_get_cache;
1713*62c56f98SSadaf Ebrahimi conf->f_set_cache = f_set_cache;
1714*62c56f98SSadaf Ebrahimi }
1715*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_SRV_C */
1716*62c56f98SSadaf Ebrahimi
1717*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_CLI_C)
mbedtls_ssl_set_session(mbedtls_ssl_context * ssl,const mbedtls_ssl_session * session)1718*62c56f98SSadaf Ebrahimi int mbedtls_ssl_set_session(mbedtls_ssl_context *ssl, const mbedtls_ssl_session *session)
1719*62c56f98SSadaf Ebrahimi {
1720*62c56f98SSadaf Ebrahimi int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1721*62c56f98SSadaf Ebrahimi
1722*62c56f98SSadaf Ebrahimi if (ssl == NULL ||
1723*62c56f98SSadaf Ebrahimi session == NULL ||
1724*62c56f98SSadaf Ebrahimi ssl->session_negotiate == NULL ||
1725*62c56f98SSadaf Ebrahimi ssl->conf->endpoint != MBEDTLS_SSL_IS_CLIENT) {
1726*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
1727*62c56f98SSadaf Ebrahimi }
1728*62c56f98SSadaf Ebrahimi
1729*62c56f98SSadaf Ebrahimi if (ssl->handshake->resume == 1) {
1730*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
1731*62c56f98SSadaf Ebrahimi }
1732*62c56f98SSadaf Ebrahimi
1733*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_TLS1_3)
1734*62c56f98SSadaf Ebrahimi if (session->tls_version == MBEDTLS_SSL_VERSION_TLS1_3) {
1735*62c56f98SSadaf Ebrahimi const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
1736*62c56f98SSadaf Ebrahimi mbedtls_ssl_ciphersuite_from_id(session->ciphersuite);
1737*62c56f98SSadaf Ebrahimi
1738*62c56f98SSadaf Ebrahimi if (mbedtls_ssl_validate_ciphersuite(
1739*62c56f98SSadaf Ebrahimi ssl, ciphersuite_info, MBEDTLS_SSL_VERSION_TLS1_3,
1740*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_VERSION_TLS1_3) != 0) {
1741*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(4, ("%d is not a valid TLS 1.3 ciphersuite.",
1742*62c56f98SSadaf Ebrahimi session->ciphersuite));
1743*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
1744*62c56f98SSadaf Ebrahimi }
1745*62c56f98SSadaf Ebrahimi }
1746*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
1747*62c56f98SSadaf Ebrahimi
1748*62c56f98SSadaf Ebrahimi if ((ret = mbedtls_ssl_session_copy(ssl->session_negotiate,
1749*62c56f98SSadaf Ebrahimi session)) != 0) {
1750*62c56f98SSadaf Ebrahimi return ret;
1751*62c56f98SSadaf Ebrahimi }
1752*62c56f98SSadaf Ebrahimi
1753*62c56f98SSadaf Ebrahimi ssl->handshake->resume = 1;
1754*62c56f98SSadaf Ebrahimi
1755*62c56f98SSadaf Ebrahimi return 0;
1756*62c56f98SSadaf Ebrahimi }
1757*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_CLI_C */
1758*62c56f98SSadaf Ebrahimi
mbedtls_ssl_conf_ciphersuites(mbedtls_ssl_config * conf,const int * ciphersuites)1759*62c56f98SSadaf Ebrahimi void mbedtls_ssl_conf_ciphersuites(mbedtls_ssl_config *conf,
1760*62c56f98SSadaf Ebrahimi const int *ciphersuites)
1761*62c56f98SSadaf Ebrahimi {
1762*62c56f98SSadaf Ebrahimi conf->ciphersuite_list = ciphersuites;
1763*62c56f98SSadaf Ebrahimi }
1764*62c56f98SSadaf Ebrahimi
1765*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_TLS1_3)
mbedtls_ssl_conf_tls13_key_exchange_modes(mbedtls_ssl_config * conf,const int kex_modes)1766*62c56f98SSadaf Ebrahimi void mbedtls_ssl_conf_tls13_key_exchange_modes(mbedtls_ssl_config *conf,
1767*62c56f98SSadaf Ebrahimi const int kex_modes)
1768*62c56f98SSadaf Ebrahimi {
1769*62c56f98SSadaf Ebrahimi conf->tls13_kex_modes = kex_modes & MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_ALL;
1770*62c56f98SSadaf Ebrahimi }
1771*62c56f98SSadaf Ebrahimi
1772*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_EARLY_DATA)
mbedtls_ssl_tls13_conf_early_data(mbedtls_ssl_config * conf,int early_data_enabled)1773*62c56f98SSadaf Ebrahimi void mbedtls_ssl_tls13_conf_early_data(mbedtls_ssl_config *conf,
1774*62c56f98SSadaf Ebrahimi int early_data_enabled)
1775*62c56f98SSadaf Ebrahimi {
1776*62c56f98SSadaf Ebrahimi conf->early_data_enabled = early_data_enabled;
1777*62c56f98SSadaf Ebrahimi }
1778*62c56f98SSadaf Ebrahimi
1779*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_SRV_C)
mbedtls_ssl_tls13_conf_max_early_data_size(mbedtls_ssl_config * conf,uint32_t max_early_data_size)1780*62c56f98SSadaf Ebrahimi void mbedtls_ssl_tls13_conf_max_early_data_size(
1781*62c56f98SSadaf Ebrahimi mbedtls_ssl_config *conf, uint32_t max_early_data_size)
1782*62c56f98SSadaf Ebrahimi {
1783*62c56f98SSadaf Ebrahimi conf->max_early_data_size = max_early_data_size;
1784*62c56f98SSadaf Ebrahimi }
1785*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_SRV_C */
1786*62c56f98SSadaf Ebrahimi
1787*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_EARLY_DATA */
1788*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
1789*62c56f98SSadaf Ebrahimi
1790*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_X509_CRT_PARSE_C)
mbedtls_ssl_conf_cert_profile(mbedtls_ssl_config * conf,const mbedtls_x509_crt_profile * profile)1791*62c56f98SSadaf Ebrahimi void mbedtls_ssl_conf_cert_profile(mbedtls_ssl_config *conf,
1792*62c56f98SSadaf Ebrahimi const mbedtls_x509_crt_profile *profile)
1793*62c56f98SSadaf Ebrahimi {
1794*62c56f98SSadaf Ebrahimi conf->cert_profile = profile;
1795*62c56f98SSadaf Ebrahimi }
1796*62c56f98SSadaf Ebrahimi
ssl_key_cert_free(mbedtls_ssl_key_cert * key_cert)1797*62c56f98SSadaf Ebrahimi static void ssl_key_cert_free(mbedtls_ssl_key_cert *key_cert)
1798*62c56f98SSadaf Ebrahimi {
1799*62c56f98SSadaf Ebrahimi mbedtls_ssl_key_cert *cur = key_cert, *next;
1800*62c56f98SSadaf Ebrahimi
1801*62c56f98SSadaf Ebrahimi while (cur != NULL) {
1802*62c56f98SSadaf Ebrahimi next = cur->next;
1803*62c56f98SSadaf Ebrahimi mbedtls_free(cur);
1804*62c56f98SSadaf Ebrahimi cur = next;
1805*62c56f98SSadaf Ebrahimi }
1806*62c56f98SSadaf Ebrahimi }
1807*62c56f98SSadaf Ebrahimi
1808*62c56f98SSadaf Ebrahimi /* Append a new keycert entry to a (possibly empty) list */
1809*62c56f98SSadaf Ebrahimi MBEDTLS_CHECK_RETURN_CRITICAL
ssl_append_key_cert(mbedtls_ssl_key_cert ** head,mbedtls_x509_crt * cert,mbedtls_pk_context * key)1810*62c56f98SSadaf Ebrahimi static int ssl_append_key_cert(mbedtls_ssl_key_cert **head,
1811*62c56f98SSadaf Ebrahimi mbedtls_x509_crt *cert,
1812*62c56f98SSadaf Ebrahimi mbedtls_pk_context *key)
1813*62c56f98SSadaf Ebrahimi {
1814*62c56f98SSadaf Ebrahimi mbedtls_ssl_key_cert *new_cert;
1815*62c56f98SSadaf Ebrahimi
1816*62c56f98SSadaf Ebrahimi if (cert == NULL) {
1817*62c56f98SSadaf Ebrahimi /* Free list if cert is null */
1818*62c56f98SSadaf Ebrahimi ssl_key_cert_free(*head);
1819*62c56f98SSadaf Ebrahimi *head = NULL;
1820*62c56f98SSadaf Ebrahimi return 0;
1821*62c56f98SSadaf Ebrahimi }
1822*62c56f98SSadaf Ebrahimi
1823*62c56f98SSadaf Ebrahimi new_cert = mbedtls_calloc(1, sizeof(mbedtls_ssl_key_cert));
1824*62c56f98SSadaf Ebrahimi if (new_cert == NULL) {
1825*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_ALLOC_FAILED;
1826*62c56f98SSadaf Ebrahimi }
1827*62c56f98SSadaf Ebrahimi
1828*62c56f98SSadaf Ebrahimi new_cert->cert = cert;
1829*62c56f98SSadaf Ebrahimi new_cert->key = key;
1830*62c56f98SSadaf Ebrahimi new_cert->next = NULL;
1831*62c56f98SSadaf Ebrahimi
1832*62c56f98SSadaf Ebrahimi /* Update head if the list was null, else add to the end */
1833*62c56f98SSadaf Ebrahimi if (*head == NULL) {
1834*62c56f98SSadaf Ebrahimi *head = new_cert;
1835*62c56f98SSadaf Ebrahimi } else {
1836*62c56f98SSadaf Ebrahimi mbedtls_ssl_key_cert *cur = *head;
1837*62c56f98SSadaf Ebrahimi while (cur->next != NULL) {
1838*62c56f98SSadaf Ebrahimi cur = cur->next;
1839*62c56f98SSadaf Ebrahimi }
1840*62c56f98SSadaf Ebrahimi cur->next = new_cert;
1841*62c56f98SSadaf Ebrahimi }
1842*62c56f98SSadaf Ebrahimi
1843*62c56f98SSadaf Ebrahimi return 0;
1844*62c56f98SSadaf Ebrahimi }
1845*62c56f98SSadaf Ebrahimi
mbedtls_ssl_conf_own_cert(mbedtls_ssl_config * conf,mbedtls_x509_crt * own_cert,mbedtls_pk_context * pk_key)1846*62c56f98SSadaf Ebrahimi int mbedtls_ssl_conf_own_cert(mbedtls_ssl_config *conf,
1847*62c56f98SSadaf Ebrahimi mbedtls_x509_crt *own_cert,
1848*62c56f98SSadaf Ebrahimi mbedtls_pk_context *pk_key)
1849*62c56f98SSadaf Ebrahimi {
1850*62c56f98SSadaf Ebrahimi return ssl_append_key_cert(&conf->key_cert, own_cert, pk_key);
1851*62c56f98SSadaf Ebrahimi }
1852*62c56f98SSadaf Ebrahimi
mbedtls_ssl_conf_ca_chain(mbedtls_ssl_config * conf,mbedtls_x509_crt * ca_chain,mbedtls_x509_crl * ca_crl)1853*62c56f98SSadaf Ebrahimi void mbedtls_ssl_conf_ca_chain(mbedtls_ssl_config *conf,
1854*62c56f98SSadaf Ebrahimi mbedtls_x509_crt *ca_chain,
1855*62c56f98SSadaf Ebrahimi mbedtls_x509_crl *ca_crl)
1856*62c56f98SSadaf Ebrahimi {
1857*62c56f98SSadaf Ebrahimi conf->ca_chain = ca_chain;
1858*62c56f98SSadaf Ebrahimi conf->ca_crl = ca_crl;
1859*62c56f98SSadaf Ebrahimi
1860*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK)
1861*62c56f98SSadaf Ebrahimi /* mbedtls_ssl_conf_ca_chain() and mbedtls_ssl_conf_ca_cb()
1862*62c56f98SSadaf Ebrahimi * cannot be used together. */
1863*62c56f98SSadaf Ebrahimi conf->f_ca_cb = NULL;
1864*62c56f98SSadaf Ebrahimi conf->p_ca_cb = NULL;
1865*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK */
1866*62c56f98SSadaf Ebrahimi }
1867*62c56f98SSadaf Ebrahimi
1868*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK)
mbedtls_ssl_conf_ca_cb(mbedtls_ssl_config * conf,mbedtls_x509_crt_ca_cb_t f_ca_cb,void * p_ca_cb)1869*62c56f98SSadaf Ebrahimi void mbedtls_ssl_conf_ca_cb(mbedtls_ssl_config *conf,
1870*62c56f98SSadaf Ebrahimi mbedtls_x509_crt_ca_cb_t f_ca_cb,
1871*62c56f98SSadaf Ebrahimi void *p_ca_cb)
1872*62c56f98SSadaf Ebrahimi {
1873*62c56f98SSadaf Ebrahimi conf->f_ca_cb = f_ca_cb;
1874*62c56f98SSadaf Ebrahimi conf->p_ca_cb = p_ca_cb;
1875*62c56f98SSadaf Ebrahimi
1876*62c56f98SSadaf Ebrahimi /* mbedtls_ssl_conf_ca_chain() and mbedtls_ssl_conf_ca_cb()
1877*62c56f98SSadaf Ebrahimi * cannot be used together. */
1878*62c56f98SSadaf Ebrahimi conf->ca_chain = NULL;
1879*62c56f98SSadaf Ebrahimi conf->ca_crl = NULL;
1880*62c56f98SSadaf Ebrahimi }
1881*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK */
1882*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_X509_CRT_PARSE_C */
1883*62c56f98SSadaf Ebrahimi
1884*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
mbedtls_ssl_get_hs_sni(mbedtls_ssl_context * ssl,size_t * name_len)1885*62c56f98SSadaf Ebrahimi const unsigned char *mbedtls_ssl_get_hs_sni(mbedtls_ssl_context *ssl,
1886*62c56f98SSadaf Ebrahimi size_t *name_len)
1887*62c56f98SSadaf Ebrahimi {
1888*62c56f98SSadaf Ebrahimi *name_len = ssl->handshake->sni_name_len;
1889*62c56f98SSadaf Ebrahimi return ssl->handshake->sni_name;
1890*62c56f98SSadaf Ebrahimi }
1891*62c56f98SSadaf Ebrahimi
mbedtls_ssl_set_hs_own_cert(mbedtls_ssl_context * ssl,mbedtls_x509_crt * own_cert,mbedtls_pk_context * pk_key)1892*62c56f98SSadaf Ebrahimi int mbedtls_ssl_set_hs_own_cert(mbedtls_ssl_context *ssl,
1893*62c56f98SSadaf Ebrahimi mbedtls_x509_crt *own_cert,
1894*62c56f98SSadaf Ebrahimi mbedtls_pk_context *pk_key)
1895*62c56f98SSadaf Ebrahimi {
1896*62c56f98SSadaf Ebrahimi return ssl_append_key_cert(&ssl->handshake->sni_key_cert,
1897*62c56f98SSadaf Ebrahimi own_cert, pk_key);
1898*62c56f98SSadaf Ebrahimi }
1899*62c56f98SSadaf Ebrahimi
mbedtls_ssl_set_hs_ca_chain(mbedtls_ssl_context * ssl,mbedtls_x509_crt * ca_chain,mbedtls_x509_crl * ca_crl)1900*62c56f98SSadaf Ebrahimi void mbedtls_ssl_set_hs_ca_chain(mbedtls_ssl_context *ssl,
1901*62c56f98SSadaf Ebrahimi mbedtls_x509_crt *ca_chain,
1902*62c56f98SSadaf Ebrahimi mbedtls_x509_crl *ca_crl)
1903*62c56f98SSadaf Ebrahimi {
1904*62c56f98SSadaf Ebrahimi ssl->handshake->sni_ca_chain = ca_chain;
1905*62c56f98SSadaf Ebrahimi ssl->handshake->sni_ca_crl = ca_crl;
1906*62c56f98SSadaf Ebrahimi }
1907*62c56f98SSadaf Ebrahimi
1908*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED)
mbedtls_ssl_set_hs_dn_hints(mbedtls_ssl_context * ssl,const mbedtls_x509_crt * crt)1909*62c56f98SSadaf Ebrahimi void mbedtls_ssl_set_hs_dn_hints(mbedtls_ssl_context *ssl,
1910*62c56f98SSadaf Ebrahimi const mbedtls_x509_crt *crt)
1911*62c56f98SSadaf Ebrahimi {
1912*62c56f98SSadaf Ebrahimi ssl->handshake->dn_hints = crt;
1913*62c56f98SSadaf Ebrahimi }
1914*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
1915*62c56f98SSadaf Ebrahimi
mbedtls_ssl_set_hs_authmode(mbedtls_ssl_context * ssl,int authmode)1916*62c56f98SSadaf Ebrahimi void mbedtls_ssl_set_hs_authmode(mbedtls_ssl_context *ssl,
1917*62c56f98SSadaf Ebrahimi int authmode)
1918*62c56f98SSadaf Ebrahimi {
1919*62c56f98SSadaf Ebrahimi ssl->handshake->sni_authmode = authmode;
1920*62c56f98SSadaf Ebrahimi }
1921*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
1922*62c56f98SSadaf Ebrahimi
1923*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_X509_CRT_PARSE_C)
mbedtls_ssl_set_verify(mbedtls_ssl_context * ssl,int (* f_vrfy)(void *,mbedtls_x509_crt *,int,uint32_t *),void * p_vrfy)1924*62c56f98SSadaf Ebrahimi void mbedtls_ssl_set_verify(mbedtls_ssl_context *ssl,
1925*62c56f98SSadaf Ebrahimi int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *),
1926*62c56f98SSadaf Ebrahimi void *p_vrfy)
1927*62c56f98SSadaf Ebrahimi {
1928*62c56f98SSadaf Ebrahimi ssl->f_vrfy = f_vrfy;
1929*62c56f98SSadaf Ebrahimi ssl->p_vrfy = p_vrfy;
1930*62c56f98SSadaf Ebrahimi }
1931*62c56f98SSadaf Ebrahimi #endif
1932*62c56f98SSadaf Ebrahimi
1933*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
1934*62c56f98SSadaf Ebrahimi
1935*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO)
1936*62c56f98SSadaf Ebrahimi static const uint8_t jpake_server_id[] = { 's', 'e', 'r', 'v', 'e', 'r' };
1937*62c56f98SSadaf Ebrahimi static const uint8_t jpake_client_id[] = { 'c', 'l', 'i', 'e', 'n', 't' };
1938*62c56f98SSadaf Ebrahimi
mbedtls_ssl_set_hs_ecjpake_password_common(mbedtls_ssl_context * ssl,mbedtls_svc_key_id_t pwd)1939*62c56f98SSadaf Ebrahimi static psa_status_t mbedtls_ssl_set_hs_ecjpake_password_common(
1940*62c56f98SSadaf Ebrahimi mbedtls_ssl_context *ssl,
1941*62c56f98SSadaf Ebrahimi mbedtls_svc_key_id_t pwd)
1942*62c56f98SSadaf Ebrahimi {
1943*62c56f98SSadaf Ebrahimi psa_status_t status;
1944*62c56f98SSadaf Ebrahimi psa_pake_cipher_suite_t cipher_suite = psa_pake_cipher_suite_init();
1945*62c56f98SSadaf Ebrahimi const uint8_t *user = NULL;
1946*62c56f98SSadaf Ebrahimi size_t user_len = 0;
1947*62c56f98SSadaf Ebrahimi const uint8_t *peer = NULL;
1948*62c56f98SSadaf Ebrahimi size_t peer_len = 0;
1949*62c56f98SSadaf Ebrahimi psa_pake_cs_set_algorithm(&cipher_suite, PSA_ALG_JPAKE);
1950*62c56f98SSadaf Ebrahimi psa_pake_cs_set_primitive(&cipher_suite,
1951*62c56f98SSadaf Ebrahimi PSA_PAKE_PRIMITIVE(PSA_PAKE_PRIMITIVE_TYPE_ECC,
1952*62c56f98SSadaf Ebrahimi PSA_ECC_FAMILY_SECP_R1,
1953*62c56f98SSadaf Ebrahimi 256));
1954*62c56f98SSadaf Ebrahimi psa_pake_cs_set_hash(&cipher_suite, PSA_ALG_SHA_256);
1955*62c56f98SSadaf Ebrahimi
1956*62c56f98SSadaf Ebrahimi status = psa_pake_setup(&ssl->handshake->psa_pake_ctx, &cipher_suite);
1957*62c56f98SSadaf Ebrahimi if (status != PSA_SUCCESS) {
1958*62c56f98SSadaf Ebrahimi return status;
1959*62c56f98SSadaf Ebrahimi }
1960*62c56f98SSadaf Ebrahimi
1961*62c56f98SSadaf Ebrahimi if (ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER) {
1962*62c56f98SSadaf Ebrahimi user = jpake_server_id;
1963*62c56f98SSadaf Ebrahimi user_len = sizeof(jpake_server_id);
1964*62c56f98SSadaf Ebrahimi peer = jpake_client_id;
1965*62c56f98SSadaf Ebrahimi peer_len = sizeof(jpake_client_id);
1966*62c56f98SSadaf Ebrahimi } else {
1967*62c56f98SSadaf Ebrahimi user = jpake_client_id;
1968*62c56f98SSadaf Ebrahimi user_len = sizeof(jpake_client_id);
1969*62c56f98SSadaf Ebrahimi peer = jpake_server_id;
1970*62c56f98SSadaf Ebrahimi peer_len = sizeof(jpake_server_id);
1971*62c56f98SSadaf Ebrahimi }
1972*62c56f98SSadaf Ebrahimi
1973*62c56f98SSadaf Ebrahimi status = psa_pake_set_user(&ssl->handshake->psa_pake_ctx, user, user_len);
1974*62c56f98SSadaf Ebrahimi if (status != PSA_SUCCESS) {
1975*62c56f98SSadaf Ebrahimi return status;
1976*62c56f98SSadaf Ebrahimi }
1977*62c56f98SSadaf Ebrahimi
1978*62c56f98SSadaf Ebrahimi status = psa_pake_set_peer(&ssl->handshake->psa_pake_ctx, peer, peer_len);
1979*62c56f98SSadaf Ebrahimi if (status != PSA_SUCCESS) {
1980*62c56f98SSadaf Ebrahimi return status;
1981*62c56f98SSadaf Ebrahimi }
1982*62c56f98SSadaf Ebrahimi
1983*62c56f98SSadaf Ebrahimi status = psa_pake_set_password_key(&ssl->handshake->psa_pake_ctx, pwd);
1984*62c56f98SSadaf Ebrahimi if (status != PSA_SUCCESS) {
1985*62c56f98SSadaf Ebrahimi return status;
1986*62c56f98SSadaf Ebrahimi }
1987*62c56f98SSadaf Ebrahimi
1988*62c56f98SSadaf Ebrahimi ssl->handshake->psa_pake_ctx_is_ok = 1;
1989*62c56f98SSadaf Ebrahimi
1990*62c56f98SSadaf Ebrahimi return PSA_SUCCESS;
1991*62c56f98SSadaf Ebrahimi }
1992*62c56f98SSadaf Ebrahimi
mbedtls_ssl_set_hs_ecjpake_password(mbedtls_ssl_context * ssl,const unsigned char * pw,size_t pw_len)1993*62c56f98SSadaf Ebrahimi int mbedtls_ssl_set_hs_ecjpake_password(mbedtls_ssl_context *ssl,
1994*62c56f98SSadaf Ebrahimi const unsigned char *pw,
1995*62c56f98SSadaf Ebrahimi size_t pw_len)
1996*62c56f98SSadaf Ebrahimi {
1997*62c56f98SSadaf Ebrahimi psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
1998*62c56f98SSadaf Ebrahimi psa_status_t status;
1999*62c56f98SSadaf Ebrahimi
2000*62c56f98SSadaf Ebrahimi if (ssl->handshake == NULL || ssl->conf == NULL) {
2001*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
2002*62c56f98SSadaf Ebrahimi }
2003*62c56f98SSadaf Ebrahimi
2004*62c56f98SSadaf Ebrahimi /* Empty password is not valid */
2005*62c56f98SSadaf Ebrahimi if ((pw == NULL) || (pw_len == 0)) {
2006*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
2007*62c56f98SSadaf Ebrahimi }
2008*62c56f98SSadaf Ebrahimi
2009*62c56f98SSadaf Ebrahimi psa_set_key_usage_flags(&attributes, PSA_KEY_USAGE_DERIVE);
2010*62c56f98SSadaf Ebrahimi psa_set_key_algorithm(&attributes, PSA_ALG_JPAKE);
2011*62c56f98SSadaf Ebrahimi psa_set_key_type(&attributes, PSA_KEY_TYPE_PASSWORD);
2012*62c56f98SSadaf Ebrahimi
2013*62c56f98SSadaf Ebrahimi status = psa_import_key(&attributes, pw, pw_len,
2014*62c56f98SSadaf Ebrahimi &ssl->handshake->psa_pake_password);
2015*62c56f98SSadaf Ebrahimi if (status != PSA_SUCCESS) {
2016*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_HW_ACCEL_FAILED;
2017*62c56f98SSadaf Ebrahimi }
2018*62c56f98SSadaf Ebrahimi
2019*62c56f98SSadaf Ebrahimi status = mbedtls_ssl_set_hs_ecjpake_password_common(ssl,
2020*62c56f98SSadaf Ebrahimi ssl->handshake->psa_pake_password);
2021*62c56f98SSadaf Ebrahimi if (status != PSA_SUCCESS) {
2022*62c56f98SSadaf Ebrahimi psa_destroy_key(ssl->handshake->psa_pake_password);
2023*62c56f98SSadaf Ebrahimi psa_pake_abort(&ssl->handshake->psa_pake_ctx);
2024*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_HW_ACCEL_FAILED;
2025*62c56f98SSadaf Ebrahimi }
2026*62c56f98SSadaf Ebrahimi
2027*62c56f98SSadaf Ebrahimi return 0;
2028*62c56f98SSadaf Ebrahimi }
2029*62c56f98SSadaf Ebrahimi
mbedtls_ssl_set_hs_ecjpake_password_opaque(mbedtls_ssl_context * ssl,mbedtls_svc_key_id_t pwd)2030*62c56f98SSadaf Ebrahimi int mbedtls_ssl_set_hs_ecjpake_password_opaque(mbedtls_ssl_context *ssl,
2031*62c56f98SSadaf Ebrahimi mbedtls_svc_key_id_t pwd)
2032*62c56f98SSadaf Ebrahimi {
2033*62c56f98SSadaf Ebrahimi psa_status_t status;
2034*62c56f98SSadaf Ebrahimi
2035*62c56f98SSadaf Ebrahimi if (ssl->handshake == NULL || ssl->conf == NULL) {
2036*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
2037*62c56f98SSadaf Ebrahimi }
2038*62c56f98SSadaf Ebrahimi
2039*62c56f98SSadaf Ebrahimi if (mbedtls_svc_key_id_is_null(pwd)) {
2040*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
2041*62c56f98SSadaf Ebrahimi }
2042*62c56f98SSadaf Ebrahimi
2043*62c56f98SSadaf Ebrahimi status = mbedtls_ssl_set_hs_ecjpake_password_common(ssl, pwd);
2044*62c56f98SSadaf Ebrahimi if (status != PSA_SUCCESS) {
2045*62c56f98SSadaf Ebrahimi psa_pake_abort(&ssl->handshake->psa_pake_ctx);
2046*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_HW_ACCEL_FAILED;
2047*62c56f98SSadaf Ebrahimi }
2048*62c56f98SSadaf Ebrahimi
2049*62c56f98SSadaf Ebrahimi return 0;
2050*62c56f98SSadaf Ebrahimi }
2051*62c56f98SSadaf Ebrahimi #else /* MBEDTLS_USE_PSA_CRYPTO */
mbedtls_ssl_set_hs_ecjpake_password(mbedtls_ssl_context * ssl,const unsigned char * pw,size_t pw_len)2052*62c56f98SSadaf Ebrahimi int mbedtls_ssl_set_hs_ecjpake_password(mbedtls_ssl_context *ssl,
2053*62c56f98SSadaf Ebrahimi const unsigned char *pw,
2054*62c56f98SSadaf Ebrahimi size_t pw_len)
2055*62c56f98SSadaf Ebrahimi {
2056*62c56f98SSadaf Ebrahimi mbedtls_ecjpake_role role;
2057*62c56f98SSadaf Ebrahimi
2058*62c56f98SSadaf Ebrahimi if (ssl->handshake == NULL || ssl->conf == NULL) {
2059*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
2060*62c56f98SSadaf Ebrahimi }
2061*62c56f98SSadaf Ebrahimi
2062*62c56f98SSadaf Ebrahimi /* Empty password is not valid */
2063*62c56f98SSadaf Ebrahimi if ((pw == NULL) || (pw_len == 0)) {
2064*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
2065*62c56f98SSadaf Ebrahimi }
2066*62c56f98SSadaf Ebrahimi
2067*62c56f98SSadaf Ebrahimi if (ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER) {
2068*62c56f98SSadaf Ebrahimi role = MBEDTLS_ECJPAKE_SERVER;
2069*62c56f98SSadaf Ebrahimi } else {
2070*62c56f98SSadaf Ebrahimi role = MBEDTLS_ECJPAKE_CLIENT;
2071*62c56f98SSadaf Ebrahimi }
2072*62c56f98SSadaf Ebrahimi
2073*62c56f98SSadaf Ebrahimi return mbedtls_ecjpake_setup(&ssl->handshake->ecjpake_ctx,
2074*62c56f98SSadaf Ebrahimi role,
2075*62c56f98SSadaf Ebrahimi MBEDTLS_MD_SHA256,
2076*62c56f98SSadaf Ebrahimi MBEDTLS_ECP_DP_SECP256R1,
2077*62c56f98SSadaf Ebrahimi pw, pw_len);
2078*62c56f98SSadaf Ebrahimi }
2079*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_USE_PSA_CRYPTO */
2080*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
2081*62c56f98SSadaf Ebrahimi
2082*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_PSK_ENABLED)
mbedtls_ssl_conf_has_static_psk(mbedtls_ssl_config const * conf)2083*62c56f98SSadaf Ebrahimi int mbedtls_ssl_conf_has_static_psk(mbedtls_ssl_config const *conf)
2084*62c56f98SSadaf Ebrahimi {
2085*62c56f98SSadaf Ebrahimi if (conf->psk_identity == NULL ||
2086*62c56f98SSadaf Ebrahimi conf->psk_identity_len == 0) {
2087*62c56f98SSadaf Ebrahimi return 0;
2088*62c56f98SSadaf Ebrahimi }
2089*62c56f98SSadaf Ebrahimi
2090*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO)
2091*62c56f98SSadaf Ebrahimi if (!mbedtls_svc_key_id_is_null(conf->psk_opaque)) {
2092*62c56f98SSadaf Ebrahimi return 1;
2093*62c56f98SSadaf Ebrahimi }
2094*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_USE_PSA_CRYPTO */
2095*62c56f98SSadaf Ebrahimi
2096*62c56f98SSadaf Ebrahimi if (conf->psk != NULL && conf->psk_len != 0) {
2097*62c56f98SSadaf Ebrahimi return 1;
2098*62c56f98SSadaf Ebrahimi }
2099*62c56f98SSadaf Ebrahimi
2100*62c56f98SSadaf Ebrahimi return 0;
2101*62c56f98SSadaf Ebrahimi }
2102*62c56f98SSadaf Ebrahimi
ssl_conf_remove_psk(mbedtls_ssl_config * conf)2103*62c56f98SSadaf Ebrahimi static void ssl_conf_remove_psk(mbedtls_ssl_config *conf)
2104*62c56f98SSadaf Ebrahimi {
2105*62c56f98SSadaf Ebrahimi /* Remove reference to existing PSK, if any. */
2106*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO)
2107*62c56f98SSadaf Ebrahimi if (!mbedtls_svc_key_id_is_null(conf->psk_opaque)) {
2108*62c56f98SSadaf Ebrahimi /* The maintenance of the PSK key slot is the
2109*62c56f98SSadaf Ebrahimi * user's responsibility. */
2110*62c56f98SSadaf Ebrahimi conf->psk_opaque = MBEDTLS_SVC_KEY_ID_INIT;
2111*62c56f98SSadaf Ebrahimi }
2112*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_USE_PSA_CRYPTO */
2113*62c56f98SSadaf Ebrahimi if (conf->psk != NULL) {
2114*62c56f98SSadaf Ebrahimi mbedtls_zeroize_and_free(conf->psk, conf->psk_len);
2115*62c56f98SSadaf Ebrahimi conf->psk = NULL;
2116*62c56f98SSadaf Ebrahimi conf->psk_len = 0;
2117*62c56f98SSadaf Ebrahimi }
2118*62c56f98SSadaf Ebrahimi
2119*62c56f98SSadaf Ebrahimi /* Remove reference to PSK identity, if any. */
2120*62c56f98SSadaf Ebrahimi if (conf->psk_identity != NULL) {
2121*62c56f98SSadaf Ebrahimi mbedtls_free(conf->psk_identity);
2122*62c56f98SSadaf Ebrahimi conf->psk_identity = NULL;
2123*62c56f98SSadaf Ebrahimi conf->psk_identity_len = 0;
2124*62c56f98SSadaf Ebrahimi }
2125*62c56f98SSadaf Ebrahimi }
2126*62c56f98SSadaf Ebrahimi
2127*62c56f98SSadaf Ebrahimi /* This function assumes that PSK identity in the SSL config is unset.
2128*62c56f98SSadaf Ebrahimi * It checks that the provided identity is well-formed and attempts
2129*62c56f98SSadaf Ebrahimi * to make a copy of it in the SSL config.
2130*62c56f98SSadaf Ebrahimi * On failure, the PSK identity in the config remains unset. */
2131*62c56f98SSadaf Ebrahimi MBEDTLS_CHECK_RETURN_CRITICAL
ssl_conf_set_psk_identity(mbedtls_ssl_config * conf,unsigned char const * psk_identity,size_t psk_identity_len)2132*62c56f98SSadaf Ebrahimi static int ssl_conf_set_psk_identity(mbedtls_ssl_config *conf,
2133*62c56f98SSadaf Ebrahimi unsigned char const *psk_identity,
2134*62c56f98SSadaf Ebrahimi size_t psk_identity_len)
2135*62c56f98SSadaf Ebrahimi {
2136*62c56f98SSadaf Ebrahimi /* Identity len will be encoded on two bytes */
2137*62c56f98SSadaf Ebrahimi if (psk_identity == NULL ||
2138*62c56f98SSadaf Ebrahimi psk_identity_len == 0 ||
2139*62c56f98SSadaf Ebrahimi (psk_identity_len >> 16) != 0 ||
2140*62c56f98SSadaf Ebrahimi psk_identity_len > MBEDTLS_SSL_OUT_CONTENT_LEN) {
2141*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
2142*62c56f98SSadaf Ebrahimi }
2143*62c56f98SSadaf Ebrahimi
2144*62c56f98SSadaf Ebrahimi conf->psk_identity = mbedtls_calloc(1, psk_identity_len);
2145*62c56f98SSadaf Ebrahimi if (conf->psk_identity == NULL) {
2146*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_ALLOC_FAILED;
2147*62c56f98SSadaf Ebrahimi }
2148*62c56f98SSadaf Ebrahimi
2149*62c56f98SSadaf Ebrahimi conf->psk_identity_len = psk_identity_len;
2150*62c56f98SSadaf Ebrahimi memcpy(conf->psk_identity, psk_identity, conf->psk_identity_len);
2151*62c56f98SSadaf Ebrahimi
2152*62c56f98SSadaf Ebrahimi return 0;
2153*62c56f98SSadaf Ebrahimi }
2154*62c56f98SSadaf Ebrahimi
mbedtls_ssl_conf_psk(mbedtls_ssl_config * conf,const unsigned char * psk,size_t psk_len,const unsigned char * psk_identity,size_t psk_identity_len)2155*62c56f98SSadaf Ebrahimi int mbedtls_ssl_conf_psk(mbedtls_ssl_config *conf,
2156*62c56f98SSadaf Ebrahimi const unsigned char *psk, size_t psk_len,
2157*62c56f98SSadaf Ebrahimi const unsigned char *psk_identity, size_t psk_identity_len)
2158*62c56f98SSadaf Ebrahimi {
2159*62c56f98SSadaf Ebrahimi int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2160*62c56f98SSadaf Ebrahimi
2161*62c56f98SSadaf Ebrahimi /* We currently only support one PSK, raw or opaque. */
2162*62c56f98SSadaf Ebrahimi if (mbedtls_ssl_conf_has_static_psk(conf)) {
2163*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
2164*62c56f98SSadaf Ebrahimi }
2165*62c56f98SSadaf Ebrahimi
2166*62c56f98SSadaf Ebrahimi /* Check and set raw PSK */
2167*62c56f98SSadaf Ebrahimi if (psk == NULL) {
2168*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
2169*62c56f98SSadaf Ebrahimi }
2170*62c56f98SSadaf Ebrahimi if (psk_len == 0) {
2171*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
2172*62c56f98SSadaf Ebrahimi }
2173*62c56f98SSadaf Ebrahimi if (psk_len > MBEDTLS_PSK_MAX_LEN) {
2174*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
2175*62c56f98SSadaf Ebrahimi }
2176*62c56f98SSadaf Ebrahimi
2177*62c56f98SSadaf Ebrahimi if ((conf->psk = mbedtls_calloc(1, psk_len)) == NULL) {
2178*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_ALLOC_FAILED;
2179*62c56f98SSadaf Ebrahimi }
2180*62c56f98SSadaf Ebrahimi conf->psk_len = psk_len;
2181*62c56f98SSadaf Ebrahimi memcpy(conf->psk, psk, conf->psk_len);
2182*62c56f98SSadaf Ebrahimi
2183*62c56f98SSadaf Ebrahimi /* Check and set PSK Identity */
2184*62c56f98SSadaf Ebrahimi ret = ssl_conf_set_psk_identity(conf, psk_identity, psk_identity_len);
2185*62c56f98SSadaf Ebrahimi if (ret != 0) {
2186*62c56f98SSadaf Ebrahimi ssl_conf_remove_psk(conf);
2187*62c56f98SSadaf Ebrahimi }
2188*62c56f98SSadaf Ebrahimi
2189*62c56f98SSadaf Ebrahimi return ret;
2190*62c56f98SSadaf Ebrahimi }
2191*62c56f98SSadaf Ebrahimi
ssl_remove_psk(mbedtls_ssl_context * ssl)2192*62c56f98SSadaf Ebrahimi static void ssl_remove_psk(mbedtls_ssl_context *ssl)
2193*62c56f98SSadaf Ebrahimi {
2194*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO)
2195*62c56f98SSadaf Ebrahimi if (!mbedtls_svc_key_id_is_null(ssl->handshake->psk_opaque)) {
2196*62c56f98SSadaf Ebrahimi /* The maintenance of the external PSK key slot is the
2197*62c56f98SSadaf Ebrahimi * user's responsibility. */
2198*62c56f98SSadaf Ebrahimi if (ssl->handshake->psk_opaque_is_internal) {
2199*62c56f98SSadaf Ebrahimi psa_destroy_key(ssl->handshake->psk_opaque);
2200*62c56f98SSadaf Ebrahimi ssl->handshake->psk_opaque_is_internal = 0;
2201*62c56f98SSadaf Ebrahimi }
2202*62c56f98SSadaf Ebrahimi ssl->handshake->psk_opaque = MBEDTLS_SVC_KEY_ID_INIT;
2203*62c56f98SSadaf Ebrahimi }
2204*62c56f98SSadaf Ebrahimi #else
2205*62c56f98SSadaf Ebrahimi if (ssl->handshake->psk != NULL) {
2206*62c56f98SSadaf Ebrahimi mbedtls_zeroize_and_free(ssl->handshake->psk,
2207*62c56f98SSadaf Ebrahimi ssl->handshake->psk_len);
2208*62c56f98SSadaf Ebrahimi ssl->handshake->psk_len = 0;
2209*62c56f98SSadaf Ebrahimi }
2210*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_USE_PSA_CRYPTO */
2211*62c56f98SSadaf Ebrahimi }
2212*62c56f98SSadaf Ebrahimi
mbedtls_ssl_set_hs_psk(mbedtls_ssl_context * ssl,const unsigned char * psk,size_t psk_len)2213*62c56f98SSadaf Ebrahimi int mbedtls_ssl_set_hs_psk(mbedtls_ssl_context *ssl,
2214*62c56f98SSadaf Ebrahimi const unsigned char *psk, size_t psk_len)
2215*62c56f98SSadaf Ebrahimi {
2216*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO)
2217*62c56f98SSadaf Ebrahimi psa_key_attributes_t key_attributes = psa_key_attributes_init();
2218*62c56f98SSadaf Ebrahimi psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
2219*62c56f98SSadaf Ebrahimi psa_algorithm_t alg = PSA_ALG_NONE;
2220*62c56f98SSadaf Ebrahimi mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
2221*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_USE_PSA_CRYPTO */
2222*62c56f98SSadaf Ebrahimi
2223*62c56f98SSadaf Ebrahimi if (psk == NULL || ssl->handshake == NULL) {
2224*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
2225*62c56f98SSadaf Ebrahimi }
2226*62c56f98SSadaf Ebrahimi
2227*62c56f98SSadaf Ebrahimi if (psk_len > MBEDTLS_PSK_MAX_LEN) {
2228*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
2229*62c56f98SSadaf Ebrahimi }
2230*62c56f98SSadaf Ebrahimi
2231*62c56f98SSadaf Ebrahimi ssl_remove_psk(ssl);
2232*62c56f98SSadaf Ebrahimi
2233*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO)
2234*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
2235*62c56f98SSadaf Ebrahimi if (ssl->tls_version == MBEDTLS_SSL_VERSION_TLS1_2) {
2236*62c56f98SSadaf Ebrahimi if (ssl->handshake->ciphersuite_info->mac == MBEDTLS_MD_SHA384) {
2237*62c56f98SSadaf Ebrahimi alg = PSA_ALG_TLS12_PSK_TO_MS(PSA_ALG_SHA_384);
2238*62c56f98SSadaf Ebrahimi } else {
2239*62c56f98SSadaf Ebrahimi alg = PSA_ALG_TLS12_PSK_TO_MS(PSA_ALG_SHA_256);
2240*62c56f98SSadaf Ebrahimi }
2241*62c56f98SSadaf Ebrahimi psa_set_key_usage_flags(&key_attributes, PSA_KEY_USAGE_DERIVE);
2242*62c56f98SSadaf Ebrahimi }
2243*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
2244*62c56f98SSadaf Ebrahimi
2245*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_TLS1_3)
2246*62c56f98SSadaf Ebrahimi if (ssl->tls_version == MBEDTLS_SSL_VERSION_TLS1_3) {
2247*62c56f98SSadaf Ebrahimi alg = PSA_ALG_HKDF_EXTRACT(PSA_ALG_ANY_HASH);
2248*62c56f98SSadaf Ebrahimi psa_set_key_usage_flags(&key_attributes,
2249*62c56f98SSadaf Ebrahimi PSA_KEY_USAGE_DERIVE | PSA_KEY_USAGE_EXPORT);
2250*62c56f98SSadaf Ebrahimi }
2251*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
2252*62c56f98SSadaf Ebrahimi
2253*62c56f98SSadaf Ebrahimi psa_set_key_algorithm(&key_attributes, alg);
2254*62c56f98SSadaf Ebrahimi psa_set_key_type(&key_attributes, PSA_KEY_TYPE_DERIVE);
2255*62c56f98SSadaf Ebrahimi
2256*62c56f98SSadaf Ebrahimi status = psa_import_key(&key_attributes, psk, psk_len, &key);
2257*62c56f98SSadaf Ebrahimi if (status != PSA_SUCCESS) {
2258*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_HW_ACCEL_FAILED;
2259*62c56f98SSadaf Ebrahimi }
2260*62c56f98SSadaf Ebrahimi
2261*62c56f98SSadaf Ebrahimi /* Allow calling psa_destroy_key() on psk remove */
2262*62c56f98SSadaf Ebrahimi ssl->handshake->psk_opaque_is_internal = 1;
2263*62c56f98SSadaf Ebrahimi return mbedtls_ssl_set_hs_psk_opaque(ssl, key);
2264*62c56f98SSadaf Ebrahimi #else
2265*62c56f98SSadaf Ebrahimi if ((ssl->handshake->psk = mbedtls_calloc(1, psk_len)) == NULL) {
2266*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_ALLOC_FAILED;
2267*62c56f98SSadaf Ebrahimi }
2268*62c56f98SSadaf Ebrahimi
2269*62c56f98SSadaf Ebrahimi ssl->handshake->psk_len = psk_len;
2270*62c56f98SSadaf Ebrahimi memcpy(ssl->handshake->psk, psk, ssl->handshake->psk_len);
2271*62c56f98SSadaf Ebrahimi
2272*62c56f98SSadaf Ebrahimi return 0;
2273*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_USE_PSA_CRYPTO */
2274*62c56f98SSadaf Ebrahimi }
2275*62c56f98SSadaf Ebrahimi
2276*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO)
mbedtls_ssl_conf_psk_opaque(mbedtls_ssl_config * conf,mbedtls_svc_key_id_t psk,const unsigned char * psk_identity,size_t psk_identity_len)2277*62c56f98SSadaf Ebrahimi int mbedtls_ssl_conf_psk_opaque(mbedtls_ssl_config *conf,
2278*62c56f98SSadaf Ebrahimi mbedtls_svc_key_id_t psk,
2279*62c56f98SSadaf Ebrahimi const unsigned char *psk_identity,
2280*62c56f98SSadaf Ebrahimi size_t psk_identity_len)
2281*62c56f98SSadaf Ebrahimi {
2282*62c56f98SSadaf Ebrahimi int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2283*62c56f98SSadaf Ebrahimi
2284*62c56f98SSadaf Ebrahimi /* We currently only support one PSK, raw or opaque. */
2285*62c56f98SSadaf Ebrahimi if (mbedtls_ssl_conf_has_static_psk(conf)) {
2286*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
2287*62c56f98SSadaf Ebrahimi }
2288*62c56f98SSadaf Ebrahimi
2289*62c56f98SSadaf Ebrahimi /* Check and set opaque PSK */
2290*62c56f98SSadaf Ebrahimi if (mbedtls_svc_key_id_is_null(psk)) {
2291*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
2292*62c56f98SSadaf Ebrahimi }
2293*62c56f98SSadaf Ebrahimi conf->psk_opaque = psk;
2294*62c56f98SSadaf Ebrahimi
2295*62c56f98SSadaf Ebrahimi /* Check and set PSK Identity */
2296*62c56f98SSadaf Ebrahimi ret = ssl_conf_set_psk_identity(conf, psk_identity,
2297*62c56f98SSadaf Ebrahimi psk_identity_len);
2298*62c56f98SSadaf Ebrahimi if (ret != 0) {
2299*62c56f98SSadaf Ebrahimi ssl_conf_remove_psk(conf);
2300*62c56f98SSadaf Ebrahimi }
2301*62c56f98SSadaf Ebrahimi
2302*62c56f98SSadaf Ebrahimi return ret;
2303*62c56f98SSadaf Ebrahimi }
2304*62c56f98SSadaf Ebrahimi
mbedtls_ssl_set_hs_psk_opaque(mbedtls_ssl_context * ssl,mbedtls_svc_key_id_t psk)2305*62c56f98SSadaf Ebrahimi int mbedtls_ssl_set_hs_psk_opaque(mbedtls_ssl_context *ssl,
2306*62c56f98SSadaf Ebrahimi mbedtls_svc_key_id_t psk)
2307*62c56f98SSadaf Ebrahimi {
2308*62c56f98SSadaf Ebrahimi if ((mbedtls_svc_key_id_is_null(psk)) ||
2309*62c56f98SSadaf Ebrahimi (ssl->handshake == NULL)) {
2310*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
2311*62c56f98SSadaf Ebrahimi }
2312*62c56f98SSadaf Ebrahimi
2313*62c56f98SSadaf Ebrahimi ssl_remove_psk(ssl);
2314*62c56f98SSadaf Ebrahimi ssl->handshake->psk_opaque = psk;
2315*62c56f98SSadaf Ebrahimi return 0;
2316*62c56f98SSadaf Ebrahimi }
2317*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_USE_PSA_CRYPTO */
2318*62c56f98SSadaf Ebrahimi
2319*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_SRV_C)
mbedtls_ssl_conf_psk_cb(mbedtls_ssl_config * conf,int (* f_psk)(void *,mbedtls_ssl_context *,const unsigned char *,size_t),void * p_psk)2320*62c56f98SSadaf Ebrahimi void mbedtls_ssl_conf_psk_cb(mbedtls_ssl_config *conf,
2321*62c56f98SSadaf Ebrahimi int (*f_psk)(void *, mbedtls_ssl_context *, const unsigned char *,
2322*62c56f98SSadaf Ebrahimi size_t),
2323*62c56f98SSadaf Ebrahimi void *p_psk)
2324*62c56f98SSadaf Ebrahimi {
2325*62c56f98SSadaf Ebrahimi conf->f_psk = f_psk;
2326*62c56f98SSadaf Ebrahimi conf->p_psk = p_psk;
2327*62c56f98SSadaf Ebrahimi }
2328*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_SRV_C */
2329*62c56f98SSadaf Ebrahimi
2330*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_HANDSHAKE_WITH_PSK_ENABLED */
2331*62c56f98SSadaf Ebrahimi
2332*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO)
mbedtls_ssl_get_base_mode(psa_algorithm_t alg)2333*62c56f98SSadaf Ebrahimi static mbedtls_ssl_mode_t mbedtls_ssl_get_base_mode(
2334*62c56f98SSadaf Ebrahimi psa_algorithm_t alg)
2335*62c56f98SSadaf Ebrahimi {
2336*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_SOME_SUITES_USE_MAC)
2337*62c56f98SSadaf Ebrahimi if (alg == PSA_ALG_CBC_NO_PADDING) {
2338*62c56f98SSadaf Ebrahimi return MBEDTLS_SSL_MODE_CBC;
2339*62c56f98SSadaf Ebrahimi }
2340*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_SOME_SUITES_USE_MAC */
2341*62c56f98SSadaf Ebrahimi if (PSA_ALG_IS_AEAD(alg)) {
2342*62c56f98SSadaf Ebrahimi return MBEDTLS_SSL_MODE_AEAD;
2343*62c56f98SSadaf Ebrahimi }
2344*62c56f98SSadaf Ebrahimi return MBEDTLS_SSL_MODE_STREAM;
2345*62c56f98SSadaf Ebrahimi }
2346*62c56f98SSadaf Ebrahimi
2347*62c56f98SSadaf Ebrahimi #else /* MBEDTLS_USE_PSA_CRYPTO */
2348*62c56f98SSadaf Ebrahimi
mbedtls_ssl_get_base_mode(mbedtls_cipher_mode_t mode)2349*62c56f98SSadaf Ebrahimi static mbedtls_ssl_mode_t mbedtls_ssl_get_base_mode(
2350*62c56f98SSadaf Ebrahimi mbedtls_cipher_mode_t mode)
2351*62c56f98SSadaf Ebrahimi {
2352*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_SOME_SUITES_USE_MAC)
2353*62c56f98SSadaf Ebrahimi if (mode == MBEDTLS_MODE_CBC) {
2354*62c56f98SSadaf Ebrahimi return MBEDTLS_SSL_MODE_CBC;
2355*62c56f98SSadaf Ebrahimi }
2356*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_SOME_SUITES_USE_MAC */
2357*62c56f98SSadaf Ebrahimi
2358*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_GCM_C) || \
2359*62c56f98SSadaf Ebrahimi defined(MBEDTLS_CCM_C) || \
2360*62c56f98SSadaf Ebrahimi defined(MBEDTLS_CHACHAPOLY_C)
2361*62c56f98SSadaf Ebrahimi if (mode == MBEDTLS_MODE_GCM ||
2362*62c56f98SSadaf Ebrahimi mode == MBEDTLS_MODE_CCM ||
2363*62c56f98SSadaf Ebrahimi mode == MBEDTLS_MODE_CHACHAPOLY) {
2364*62c56f98SSadaf Ebrahimi return MBEDTLS_SSL_MODE_AEAD;
2365*62c56f98SSadaf Ebrahimi }
2366*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_GCM_C || MBEDTLS_CCM_C || MBEDTLS_CHACHAPOLY_C */
2367*62c56f98SSadaf Ebrahimi
2368*62c56f98SSadaf Ebrahimi return MBEDTLS_SSL_MODE_STREAM;
2369*62c56f98SSadaf Ebrahimi }
2370*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_USE_PSA_CRYPTO */
2371*62c56f98SSadaf Ebrahimi
mbedtls_ssl_get_actual_mode(mbedtls_ssl_mode_t base_mode,int encrypt_then_mac)2372*62c56f98SSadaf Ebrahimi static mbedtls_ssl_mode_t mbedtls_ssl_get_actual_mode(
2373*62c56f98SSadaf Ebrahimi mbedtls_ssl_mode_t base_mode,
2374*62c56f98SSadaf Ebrahimi int encrypt_then_mac)
2375*62c56f98SSadaf Ebrahimi {
2376*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM)
2377*62c56f98SSadaf Ebrahimi if (encrypt_then_mac == MBEDTLS_SSL_ETM_ENABLED &&
2378*62c56f98SSadaf Ebrahimi base_mode == MBEDTLS_SSL_MODE_CBC) {
2379*62c56f98SSadaf Ebrahimi return MBEDTLS_SSL_MODE_CBC_ETM;
2380*62c56f98SSadaf Ebrahimi }
2381*62c56f98SSadaf Ebrahimi #else
2382*62c56f98SSadaf Ebrahimi (void) encrypt_then_mac;
2383*62c56f98SSadaf Ebrahimi #endif
2384*62c56f98SSadaf Ebrahimi return base_mode;
2385*62c56f98SSadaf Ebrahimi }
2386*62c56f98SSadaf Ebrahimi
mbedtls_ssl_get_mode_from_transform(const mbedtls_ssl_transform * transform)2387*62c56f98SSadaf Ebrahimi mbedtls_ssl_mode_t mbedtls_ssl_get_mode_from_transform(
2388*62c56f98SSadaf Ebrahimi const mbedtls_ssl_transform *transform)
2389*62c56f98SSadaf Ebrahimi {
2390*62c56f98SSadaf Ebrahimi mbedtls_ssl_mode_t base_mode = mbedtls_ssl_get_base_mode(
2391*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO)
2392*62c56f98SSadaf Ebrahimi transform->psa_alg
2393*62c56f98SSadaf Ebrahimi #else
2394*62c56f98SSadaf Ebrahimi mbedtls_cipher_get_cipher_mode(&transform->cipher_ctx_enc)
2395*62c56f98SSadaf Ebrahimi #endif
2396*62c56f98SSadaf Ebrahimi );
2397*62c56f98SSadaf Ebrahimi
2398*62c56f98SSadaf Ebrahimi int encrypt_then_mac = 0;
2399*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM)
2400*62c56f98SSadaf Ebrahimi encrypt_then_mac = transform->encrypt_then_mac;
2401*62c56f98SSadaf Ebrahimi #endif
2402*62c56f98SSadaf Ebrahimi return mbedtls_ssl_get_actual_mode(base_mode, encrypt_then_mac);
2403*62c56f98SSadaf Ebrahimi }
2404*62c56f98SSadaf Ebrahimi
mbedtls_ssl_get_mode_from_ciphersuite(int encrypt_then_mac,const mbedtls_ssl_ciphersuite_t * suite)2405*62c56f98SSadaf Ebrahimi mbedtls_ssl_mode_t mbedtls_ssl_get_mode_from_ciphersuite(
2406*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM)
2407*62c56f98SSadaf Ebrahimi int encrypt_then_mac,
2408*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM */
2409*62c56f98SSadaf Ebrahimi const mbedtls_ssl_ciphersuite_t *suite)
2410*62c56f98SSadaf Ebrahimi {
2411*62c56f98SSadaf Ebrahimi mbedtls_ssl_mode_t base_mode = MBEDTLS_SSL_MODE_STREAM;
2412*62c56f98SSadaf Ebrahimi
2413*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO)
2414*62c56f98SSadaf Ebrahimi psa_status_t status;
2415*62c56f98SSadaf Ebrahimi psa_algorithm_t alg;
2416*62c56f98SSadaf Ebrahimi psa_key_type_t type;
2417*62c56f98SSadaf Ebrahimi size_t size;
2418*62c56f98SSadaf Ebrahimi status = mbedtls_ssl_cipher_to_psa(suite->cipher, 0, &alg, &type, &size);
2419*62c56f98SSadaf Ebrahimi if (status == PSA_SUCCESS) {
2420*62c56f98SSadaf Ebrahimi base_mode = mbedtls_ssl_get_base_mode(alg);
2421*62c56f98SSadaf Ebrahimi }
2422*62c56f98SSadaf Ebrahimi #else
2423*62c56f98SSadaf Ebrahimi const mbedtls_cipher_info_t *cipher =
2424*62c56f98SSadaf Ebrahimi mbedtls_cipher_info_from_type((mbedtls_cipher_type_t) suite->cipher);
2425*62c56f98SSadaf Ebrahimi if (cipher != NULL) {
2426*62c56f98SSadaf Ebrahimi base_mode =
2427*62c56f98SSadaf Ebrahimi mbedtls_ssl_get_base_mode(
2428*62c56f98SSadaf Ebrahimi mbedtls_cipher_info_get_mode(cipher));
2429*62c56f98SSadaf Ebrahimi }
2430*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_USE_PSA_CRYPTO */
2431*62c56f98SSadaf Ebrahimi
2432*62c56f98SSadaf Ebrahimi #if !defined(MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM)
2433*62c56f98SSadaf Ebrahimi int encrypt_then_mac = 0;
2434*62c56f98SSadaf Ebrahimi #endif
2435*62c56f98SSadaf Ebrahimi return mbedtls_ssl_get_actual_mode(base_mode, encrypt_then_mac);
2436*62c56f98SSadaf Ebrahimi }
2437*62c56f98SSadaf Ebrahimi
2438*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO) || defined(MBEDTLS_SSL_PROTO_TLS1_3)
2439*62c56f98SSadaf Ebrahimi
2440*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_TLS1_3)
2441*62c56f98SSadaf Ebrahimi /* Serialization of TLS 1.3 sessions:
2442*62c56f98SSadaf Ebrahimi *
2443*62c56f98SSadaf Ebrahimi * struct {
2444*62c56f98SSadaf Ebrahimi * opaque hostname<0..2^16-1>;
2445*62c56f98SSadaf Ebrahimi * uint64 ticket_received;
2446*62c56f98SSadaf Ebrahimi * uint32 ticket_lifetime;
2447*62c56f98SSadaf Ebrahimi * opaque ticket<1..2^16-1>;
2448*62c56f98SSadaf Ebrahimi * } ClientOnlyData;
2449*62c56f98SSadaf Ebrahimi *
2450*62c56f98SSadaf Ebrahimi * struct {
2451*62c56f98SSadaf Ebrahimi * uint8 endpoint;
2452*62c56f98SSadaf Ebrahimi * uint8 ciphersuite[2];
2453*62c56f98SSadaf Ebrahimi * uint32 ticket_age_add;
2454*62c56f98SSadaf Ebrahimi * uint8 ticket_flags;
2455*62c56f98SSadaf Ebrahimi * opaque resumption_key<0..255>;
2456*62c56f98SSadaf Ebrahimi * select ( endpoint ) {
2457*62c56f98SSadaf Ebrahimi * case client: ClientOnlyData;
2458*62c56f98SSadaf Ebrahimi * case server: uint64 start_time;
2459*62c56f98SSadaf Ebrahimi * };
2460*62c56f98SSadaf Ebrahimi * } serialized_session_tls13;
2461*62c56f98SSadaf Ebrahimi *
2462*62c56f98SSadaf Ebrahimi */
2463*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_SESSION_TICKETS)
2464*62c56f98SSadaf Ebrahimi MBEDTLS_CHECK_RETURN_CRITICAL
ssl_tls13_session_save(const mbedtls_ssl_session * session,unsigned char * buf,size_t buf_len,size_t * olen)2465*62c56f98SSadaf Ebrahimi static int ssl_tls13_session_save(const mbedtls_ssl_session *session,
2466*62c56f98SSadaf Ebrahimi unsigned char *buf,
2467*62c56f98SSadaf Ebrahimi size_t buf_len,
2468*62c56f98SSadaf Ebrahimi size_t *olen)
2469*62c56f98SSadaf Ebrahimi {
2470*62c56f98SSadaf Ebrahimi unsigned char *p = buf;
2471*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_CLI_C) && \
2472*62c56f98SSadaf Ebrahimi defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
2473*62c56f98SSadaf Ebrahimi size_t hostname_len = (session->hostname == NULL) ?
2474*62c56f98SSadaf Ebrahimi 0 : strlen(session->hostname) + 1;
2475*62c56f98SSadaf Ebrahimi #endif
2476*62c56f98SSadaf Ebrahimi size_t needed = 1 /* endpoint */
2477*62c56f98SSadaf Ebrahimi + 2 /* ciphersuite */
2478*62c56f98SSadaf Ebrahimi + 4 /* ticket_age_add */
2479*62c56f98SSadaf Ebrahimi + 1 /* ticket_flags */
2480*62c56f98SSadaf Ebrahimi + 1; /* resumption_key length */
2481*62c56f98SSadaf Ebrahimi *olen = 0;
2482*62c56f98SSadaf Ebrahimi
2483*62c56f98SSadaf Ebrahimi if (session->resumption_key_len > MBEDTLS_SSL_TLS1_3_TICKET_RESUMPTION_KEY_LEN) {
2484*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
2485*62c56f98SSadaf Ebrahimi }
2486*62c56f98SSadaf Ebrahimi needed += session->resumption_key_len; /* resumption_key */
2487*62c56f98SSadaf Ebrahimi
2488*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_HAVE_TIME)
2489*62c56f98SSadaf Ebrahimi needed += 8; /* start_time or ticket_received */
2490*62c56f98SSadaf Ebrahimi #endif
2491*62c56f98SSadaf Ebrahimi
2492*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_CLI_C)
2493*62c56f98SSadaf Ebrahimi if (session->endpoint == MBEDTLS_SSL_IS_CLIENT) {
2494*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
2495*62c56f98SSadaf Ebrahimi needed += 2 /* hostname_len */
2496*62c56f98SSadaf Ebrahimi + hostname_len; /* hostname */
2497*62c56f98SSadaf Ebrahimi #endif
2498*62c56f98SSadaf Ebrahimi
2499*62c56f98SSadaf Ebrahimi needed += 4 /* ticket_lifetime */
2500*62c56f98SSadaf Ebrahimi + 2; /* ticket_len */
2501*62c56f98SSadaf Ebrahimi
2502*62c56f98SSadaf Ebrahimi /* Check size_t overflow */
2503*62c56f98SSadaf Ebrahimi if (session->ticket_len > SIZE_MAX - needed) {
2504*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
2505*62c56f98SSadaf Ebrahimi }
2506*62c56f98SSadaf Ebrahimi
2507*62c56f98SSadaf Ebrahimi needed += session->ticket_len; /* ticket */
2508*62c56f98SSadaf Ebrahimi }
2509*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_CLI_C */
2510*62c56f98SSadaf Ebrahimi
2511*62c56f98SSadaf Ebrahimi *olen = needed;
2512*62c56f98SSadaf Ebrahimi if (needed > buf_len) {
2513*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL;
2514*62c56f98SSadaf Ebrahimi }
2515*62c56f98SSadaf Ebrahimi
2516*62c56f98SSadaf Ebrahimi p[0] = session->endpoint;
2517*62c56f98SSadaf Ebrahimi MBEDTLS_PUT_UINT16_BE(session->ciphersuite, p, 1);
2518*62c56f98SSadaf Ebrahimi MBEDTLS_PUT_UINT32_BE(session->ticket_age_add, p, 3);
2519*62c56f98SSadaf Ebrahimi p[7] = session->ticket_flags;
2520*62c56f98SSadaf Ebrahimi
2521*62c56f98SSadaf Ebrahimi /* save resumption_key */
2522*62c56f98SSadaf Ebrahimi p[8] = session->resumption_key_len;
2523*62c56f98SSadaf Ebrahimi p += 9;
2524*62c56f98SSadaf Ebrahimi memcpy(p, session->resumption_key, session->resumption_key_len);
2525*62c56f98SSadaf Ebrahimi p += session->resumption_key_len;
2526*62c56f98SSadaf Ebrahimi
2527*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_HAVE_TIME) && defined(MBEDTLS_SSL_SRV_C)
2528*62c56f98SSadaf Ebrahimi if (session->endpoint == MBEDTLS_SSL_IS_SERVER) {
2529*62c56f98SSadaf Ebrahimi MBEDTLS_PUT_UINT64_BE((uint64_t) session->start, p, 0);
2530*62c56f98SSadaf Ebrahimi p += 8;
2531*62c56f98SSadaf Ebrahimi }
2532*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_HAVE_TIME */
2533*62c56f98SSadaf Ebrahimi
2534*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_CLI_C)
2535*62c56f98SSadaf Ebrahimi if (session->endpoint == MBEDTLS_SSL_IS_CLIENT) {
2536*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
2537*62c56f98SSadaf Ebrahimi MBEDTLS_PUT_UINT16_BE(hostname_len, p, 0);
2538*62c56f98SSadaf Ebrahimi p += 2;
2539*62c56f98SSadaf Ebrahimi if (hostname_len > 0) {
2540*62c56f98SSadaf Ebrahimi /* save host name */
2541*62c56f98SSadaf Ebrahimi memcpy(p, session->hostname, hostname_len);
2542*62c56f98SSadaf Ebrahimi p += hostname_len;
2543*62c56f98SSadaf Ebrahimi }
2544*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
2545*62c56f98SSadaf Ebrahimi
2546*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_HAVE_TIME)
2547*62c56f98SSadaf Ebrahimi MBEDTLS_PUT_UINT64_BE((uint64_t) session->ticket_received, p, 0);
2548*62c56f98SSadaf Ebrahimi p += 8;
2549*62c56f98SSadaf Ebrahimi #endif
2550*62c56f98SSadaf Ebrahimi MBEDTLS_PUT_UINT32_BE(session->ticket_lifetime, p, 0);
2551*62c56f98SSadaf Ebrahimi p += 4;
2552*62c56f98SSadaf Ebrahimi
2553*62c56f98SSadaf Ebrahimi MBEDTLS_PUT_UINT16_BE(session->ticket_len, p, 0);
2554*62c56f98SSadaf Ebrahimi p += 2;
2555*62c56f98SSadaf Ebrahimi
2556*62c56f98SSadaf Ebrahimi if (session->ticket != NULL && session->ticket_len > 0) {
2557*62c56f98SSadaf Ebrahimi memcpy(p, session->ticket, session->ticket_len);
2558*62c56f98SSadaf Ebrahimi p += session->ticket_len;
2559*62c56f98SSadaf Ebrahimi }
2560*62c56f98SSadaf Ebrahimi }
2561*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_CLI_C */
2562*62c56f98SSadaf Ebrahimi return 0;
2563*62c56f98SSadaf Ebrahimi }
2564*62c56f98SSadaf Ebrahimi
2565*62c56f98SSadaf Ebrahimi MBEDTLS_CHECK_RETURN_CRITICAL
ssl_tls13_session_load(mbedtls_ssl_session * session,const unsigned char * buf,size_t len)2566*62c56f98SSadaf Ebrahimi static int ssl_tls13_session_load(mbedtls_ssl_session *session,
2567*62c56f98SSadaf Ebrahimi const unsigned char *buf,
2568*62c56f98SSadaf Ebrahimi size_t len)
2569*62c56f98SSadaf Ebrahimi {
2570*62c56f98SSadaf Ebrahimi const unsigned char *p = buf;
2571*62c56f98SSadaf Ebrahimi const unsigned char *end = buf + len;
2572*62c56f98SSadaf Ebrahimi
2573*62c56f98SSadaf Ebrahimi if (end - p < 9) {
2574*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
2575*62c56f98SSadaf Ebrahimi }
2576*62c56f98SSadaf Ebrahimi session->endpoint = p[0];
2577*62c56f98SSadaf Ebrahimi session->ciphersuite = MBEDTLS_GET_UINT16_BE(p, 1);
2578*62c56f98SSadaf Ebrahimi session->ticket_age_add = MBEDTLS_GET_UINT32_BE(p, 3);
2579*62c56f98SSadaf Ebrahimi session->ticket_flags = p[7];
2580*62c56f98SSadaf Ebrahimi
2581*62c56f98SSadaf Ebrahimi /* load resumption_key */
2582*62c56f98SSadaf Ebrahimi session->resumption_key_len = p[8];
2583*62c56f98SSadaf Ebrahimi p += 9;
2584*62c56f98SSadaf Ebrahimi
2585*62c56f98SSadaf Ebrahimi if (end - p < session->resumption_key_len) {
2586*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
2587*62c56f98SSadaf Ebrahimi }
2588*62c56f98SSadaf Ebrahimi
2589*62c56f98SSadaf Ebrahimi if (sizeof(session->resumption_key) < session->resumption_key_len) {
2590*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
2591*62c56f98SSadaf Ebrahimi }
2592*62c56f98SSadaf Ebrahimi memcpy(session->resumption_key, p, session->resumption_key_len);
2593*62c56f98SSadaf Ebrahimi p += session->resumption_key_len;
2594*62c56f98SSadaf Ebrahimi
2595*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_HAVE_TIME) && defined(MBEDTLS_SSL_SRV_C)
2596*62c56f98SSadaf Ebrahimi if (session->endpoint == MBEDTLS_SSL_IS_SERVER) {
2597*62c56f98SSadaf Ebrahimi if (end - p < 8) {
2598*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
2599*62c56f98SSadaf Ebrahimi }
2600*62c56f98SSadaf Ebrahimi session->start = MBEDTLS_GET_UINT64_BE(p, 0);
2601*62c56f98SSadaf Ebrahimi p += 8;
2602*62c56f98SSadaf Ebrahimi }
2603*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_HAVE_TIME */
2604*62c56f98SSadaf Ebrahimi
2605*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_CLI_C)
2606*62c56f98SSadaf Ebrahimi if (session->endpoint == MBEDTLS_SSL_IS_CLIENT) {
2607*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) && \
2608*62c56f98SSadaf Ebrahimi defined(MBEDTLS_SSL_SESSION_TICKETS)
2609*62c56f98SSadaf Ebrahimi size_t hostname_len;
2610*62c56f98SSadaf Ebrahimi /* load host name */
2611*62c56f98SSadaf Ebrahimi if (end - p < 2) {
2612*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
2613*62c56f98SSadaf Ebrahimi }
2614*62c56f98SSadaf Ebrahimi hostname_len = MBEDTLS_GET_UINT16_BE(p, 0);
2615*62c56f98SSadaf Ebrahimi p += 2;
2616*62c56f98SSadaf Ebrahimi
2617*62c56f98SSadaf Ebrahimi if (end - p < (long int) hostname_len) {
2618*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
2619*62c56f98SSadaf Ebrahimi }
2620*62c56f98SSadaf Ebrahimi if (hostname_len > 0) {
2621*62c56f98SSadaf Ebrahimi session->hostname = mbedtls_calloc(1, hostname_len);
2622*62c56f98SSadaf Ebrahimi if (session->hostname == NULL) {
2623*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_ALLOC_FAILED;
2624*62c56f98SSadaf Ebrahimi }
2625*62c56f98SSadaf Ebrahimi memcpy(session->hostname, p, hostname_len);
2626*62c56f98SSadaf Ebrahimi p += hostname_len;
2627*62c56f98SSadaf Ebrahimi }
2628*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION &&
2629*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_SESSION_TICKETS */
2630*62c56f98SSadaf Ebrahimi
2631*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_HAVE_TIME)
2632*62c56f98SSadaf Ebrahimi if (end - p < 8) {
2633*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
2634*62c56f98SSadaf Ebrahimi }
2635*62c56f98SSadaf Ebrahimi session->ticket_received = MBEDTLS_GET_UINT64_BE(p, 0);
2636*62c56f98SSadaf Ebrahimi p += 8;
2637*62c56f98SSadaf Ebrahimi #endif
2638*62c56f98SSadaf Ebrahimi if (end - p < 4) {
2639*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
2640*62c56f98SSadaf Ebrahimi }
2641*62c56f98SSadaf Ebrahimi session->ticket_lifetime = MBEDTLS_GET_UINT32_BE(p, 0);
2642*62c56f98SSadaf Ebrahimi p += 4;
2643*62c56f98SSadaf Ebrahimi
2644*62c56f98SSadaf Ebrahimi if (end - p < 2) {
2645*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
2646*62c56f98SSadaf Ebrahimi }
2647*62c56f98SSadaf Ebrahimi session->ticket_len = MBEDTLS_GET_UINT16_BE(p, 0);
2648*62c56f98SSadaf Ebrahimi p += 2;
2649*62c56f98SSadaf Ebrahimi
2650*62c56f98SSadaf Ebrahimi if (end - p < (long int) session->ticket_len) {
2651*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
2652*62c56f98SSadaf Ebrahimi }
2653*62c56f98SSadaf Ebrahimi if (session->ticket_len > 0) {
2654*62c56f98SSadaf Ebrahimi session->ticket = mbedtls_calloc(1, session->ticket_len);
2655*62c56f98SSadaf Ebrahimi if (session->ticket == NULL) {
2656*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_ALLOC_FAILED;
2657*62c56f98SSadaf Ebrahimi }
2658*62c56f98SSadaf Ebrahimi memcpy(session->ticket, p, session->ticket_len);
2659*62c56f98SSadaf Ebrahimi p += session->ticket_len;
2660*62c56f98SSadaf Ebrahimi }
2661*62c56f98SSadaf Ebrahimi }
2662*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_CLI_C */
2663*62c56f98SSadaf Ebrahimi
2664*62c56f98SSadaf Ebrahimi return 0;
2665*62c56f98SSadaf Ebrahimi
2666*62c56f98SSadaf Ebrahimi }
2667*62c56f98SSadaf Ebrahimi #else /* MBEDTLS_SSL_SESSION_TICKETS */
2668*62c56f98SSadaf Ebrahimi MBEDTLS_CHECK_RETURN_CRITICAL
ssl_tls13_session_save(const mbedtls_ssl_session * session,unsigned char * buf,size_t buf_len,size_t * olen)2669*62c56f98SSadaf Ebrahimi static int ssl_tls13_session_save(const mbedtls_ssl_session *session,
2670*62c56f98SSadaf Ebrahimi unsigned char *buf,
2671*62c56f98SSadaf Ebrahimi size_t buf_len,
2672*62c56f98SSadaf Ebrahimi size_t *olen)
2673*62c56f98SSadaf Ebrahimi {
2674*62c56f98SSadaf Ebrahimi ((void) session);
2675*62c56f98SSadaf Ebrahimi ((void) buf);
2676*62c56f98SSadaf Ebrahimi ((void) buf_len);
2677*62c56f98SSadaf Ebrahimi *olen = 0;
2678*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
2679*62c56f98SSadaf Ebrahimi }
2680*62c56f98SSadaf Ebrahimi
ssl_tls13_session_load(const mbedtls_ssl_session * session,unsigned char * buf,size_t buf_len)2681*62c56f98SSadaf Ebrahimi static int ssl_tls13_session_load(const mbedtls_ssl_session *session,
2682*62c56f98SSadaf Ebrahimi unsigned char *buf,
2683*62c56f98SSadaf Ebrahimi size_t buf_len)
2684*62c56f98SSadaf Ebrahimi {
2685*62c56f98SSadaf Ebrahimi ((void) session);
2686*62c56f98SSadaf Ebrahimi ((void) buf);
2687*62c56f98SSadaf Ebrahimi ((void) buf_len);
2688*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
2689*62c56f98SSadaf Ebrahimi }
2690*62c56f98SSadaf Ebrahimi #endif /* !MBEDTLS_SSL_SESSION_TICKETS */
2691*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
2692*62c56f98SSadaf Ebrahimi
mbedtls_ssl_cipher_to_psa(mbedtls_cipher_type_t mbedtls_cipher_type,size_t taglen,psa_algorithm_t * alg,psa_key_type_t * key_type,size_t * key_size)2693*62c56f98SSadaf Ebrahimi psa_status_t mbedtls_ssl_cipher_to_psa(mbedtls_cipher_type_t mbedtls_cipher_type,
2694*62c56f98SSadaf Ebrahimi size_t taglen,
2695*62c56f98SSadaf Ebrahimi psa_algorithm_t *alg,
2696*62c56f98SSadaf Ebrahimi psa_key_type_t *key_type,
2697*62c56f98SSadaf Ebrahimi size_t *key_size)
2698*62c56f98SSadaf Ebrahimi {
2699*62c56f98SSadaf Ebrahimi switch (mbedtls_cipher_type) {
2700*62c56f98SSadaf Ebrahimi case MBEDTLS_CIPHER_AES_128_CBC:
2701*62c56f98SSadaf Ebrahimi *alg = PSA_ALG_CBC_NO_PADDING;
2702*62c56f98SSadaf Ebrahimi *key_type = PSA_KEY_TYPE_AES;
2703*62c56f98SSadaf Ebrahimi *key_size = 128;
2704*62c56f98SSadaf Ebrahimi break;
2705*62c56f98SSadaf Ebrahimi case MBEDTLS_CIPHER_AES_128_CCM:
2706*62c56f98SSadaf Ebrahimi *alg = taglen ? PSA_ALG_AEAD_WITH_SHORTENED_TAG(PSA_ALG_CCM, taglen) : PSA_ALG_CCM;
2707*62c56f98SSadaf Ebrahimi *key_type = PSA_KEY_TYPE_AES;
2708*62c56f98SSadaf Ebrahimi *key_size = 128;
2709*62c56f98SSadaf Ebrahimi break;
2710*62c56f98SSadaf Ebrahimi case MBEDTLS_CIPHER_AES_128_GCM:
2711*62c56f98SSadaf Ebrahimi *alg = PSA_ALG_GCM;
2712*62c56f98SSadaf Ebrahimi *key_type = PSA_KEY_TYPE_AES;
2713*62c56f98SSadaf Ebrahimi *key_size = 128;
2714*62c56f98SSadaf Ebrahimi break;
2715*62c56f98SSadaf Ebrahimi case MBEDTLS_CIPHER_AES_192_CCM:
2716*62c56f98SSadaf Ebrahimi *alg = taglen ? PSA_ALG_AEAD_WITH_SHORTENED_TAG(PSA_ALG_CCM, taglen) : PSA_ALG_CCM;
2717*62c56f98SSadaf Ebrahimi *key_type = PSA_KEY_TYPE_AES;
2718*62c56f98SSadaf Ebrahimi *key_size = 192;
2719*62c56f98SSadaf Ebrahimi break;
2720*62c56f98SSadaf Ebrahimi case MBEDTLS_CIPHER_AES_192_GCM:
2721*62c56f98SSadaf Ebrahimi *alg = PSA_ALG_GCM;
2722*62c56f98SSadaf Ebrahimi *key_type = PSA_KEY_TYPE_AES;
2723*62c56f98SSadaf Ebrahimi *key_size = 192;
2724*62c56f98SSadaf Ebrahimi break;
2725*62c56f98SSadaf Ebrahimi case MBEDTLS_CIPHER_AES_256_CBC:
2726*62c56f98SSadaf Ebrahimi *alg = PSA_ALG_CBC_NO_PADDING;
2727*62c56f98SSadaf Ebrahimi *key_type = PSA_KEY_TYPE_AES;
2728*62c56f98SSadaf Ebrahimi *key_size = 256;
2729*62c56f98SSadaf Ebrahimi break;
2730*62c56f98SSadaf Ebrahimi case MBEDTLS_CIPHER_AES_256_CCM:
2731*62c56f98SSadaf Ebrahimi *alg = taglen ? PSA_ALG_AEAD_WITH_SHORTENED_TAG(PSA_ALG_CCM, taglen) : PSA_ALG_CCM;
2732*62c56f98SSadaf Ebrahimi *key_type = PSA_KEY_TYPE_AES;
2733*62c56f98SSadaf Ebrahimi *key_size = 256;
2734*62c56f98SSadaf Ebrahimi break;
2735*62c56f98SSadaf Ebrahimi case MBEDTLS_CIPHER_AES_256_GCM:
2736*62c56f98SSadaf Ebrahimi *alg = PSA_ALG_GCM;
2737*62c56f98SSadaf Ebrahimi *key_type = PSA_KEY_TYPE_AES;
2738*62c56f98SSadaf Ebrahimi *key_size = 256;
2739*62c56f98SSadaf Ebrahimi break;
2740*62c56f98SSadaf Ebrahimi case MBEDTLS_CIPHER_ARIA_128_CBC:
2741*62c56f98SSadaf Ebrahimi *alg = PSA_ALG_CBC_NO_PADDING;
2742*62c56f98SSadaf Ebrahimi *key_type = PSA_KEY_TYPE_ARIA;
2743*62c56f98SSadaf Ebrahimi *key_size = 128;
2744*62c56f98SSadaf Ebrahimi break;
2745*62c56f98SSadaf Ebrahimi case MBEDTLS_CIPHER_ARIA_128_CCM:
2746*62c56f98SSadaf Ebrahimi *alg = taglen ? PSA_ALG_AEAD_WITH_SHORTENED_TAG(PSA_ALG_CCM, taglen) : PSA_ALG_CCM;
2747*62c56f98SSadaf Ebrahimi *key_type = PSA_KEY_TYPE_ARIA;
2748*62c56f98SSadaf Ebrahimi *key_size = 128;
2749*62c56f98SSadaf Ebrahimi break;
2750*62c56f98SSadaf Ebrahimi case MBEDTLS_CIPHER_ARIA_128_GCM:
2751*62c56f98SSadaf Ebrahimi *alg = PSA_ALG_GCM;
2752*62c56f98SSadaf Ebrahimi *key_type = PSA_KEY_TYPE_ARIA;
2753*62c56f98SSadaf Ebrahimi *key_size = 128;
2754*62c56f98SSadaf Ebrahimi break;
2755*62c56f98SSadaf Ebrahimi case MBEDTLS_CIPHER_ARIA_192_CCM:
2756*62c56f98SSadaf Ebrahimi *alg = taglen ? PSA_ALG_AEAD_WITH_SHORTENED_TAG(PSA_ALG_CCM, taglen) : PSA_ALG_CCM;
2757*62c56f98SSadaf Ebrahimi *key_type = PSA_KEY_TYPE_ARIA;
2758*62c56f98SSadaf Ebrahimi *key_size = 192;
2759*62c56f98SSadaf Ebrahimi break;
2760*62c56f98SSadaf Ebrahimi case MBEDTLS_CIPHER_ARIA_192_GCM:
2761*62c56f98SSadaf Ebrahimi *alg = PSA_ALG_GCM;
2762*62c56f98SSadaf Ebrahimi *key_type = PSA_KEY_TYPE_ARIA;
2763*62c56f98SSadaf Ebrahimi *key_size = 192;
2764*62c56f98SSadaf Ebrahimi break;
2765*62c56f98SSadaf Ebrahimi case MBEDTLS_CIPHER_ARIA_256_CBC:
2766*62c56f98SSadaf Ebrahimi *alg = PSA_ALG_CBC_NO_PADDING;
2767*62c56f98SSadaf Ebrahimi *key_type = PSA_KEY_TYPE_ARIA;
2768*62c56f98SSadaf Ebrahimi *key_size = 256;
2769*62c56f98SSadaf Ebrahimi break;
2770*62c56f98SSadaf Ebrahimi case MBEDTLS_CIPHER_ARIA_256_CCM:
2771*62c56f98SSadaf Ebrahimi *alg = taglen ? PSA_ALG_AEAD_WITH_SHORTENED_TAG(PSA_ALG_CCM, taglen) : PSA_ALG_CCM;
2772*62c56f98SSadaf Ebrahimi *key_type = PSA_KEY_TYPE_ARIA;
2773*62c56f98SSadaf Ebrahimi *key_size = 256;
2774*62c56f98SSadaf Ebrahimi break;
2775*62c56f98SSadaf Ebrahimi case MBEDTLS_CIPHER_ARIA_256_GCM:
2776*62c56f98SSadaf Ebrahimi *alg = PSA_ALG_GCM;
2777*62c56f98SSadaf Ebrahimi *key_type = PSA_KEY_TYPE_ARIA;
2778*62c56f98SSadaf Ebrahimi *key_size = 256;
2779*62c56f98SSadaf Ebrahimi break;
2780*62c56f98SSadaf Ebrahimi case MBEDTLS_CIPHER_CAMELLIA_128_CBC:
2781*62c56f98SSadaf Ebrahimi *alg = PSA_ALG_CBC_NO_PADDING;
2782*62c56f98SSadaf Ebrahimi *key_type = PSA_KEY_TYPE_CAMELLIA;
2783*62c56f98SSadaf Ebrahimi *key_size = 128;
2784*62c56f98SSadaf Ebrahimi break;
2785*62c56f98SSadaf Ebrahimi case MBEDTLS_CIPHER_CAMELLIA_128_CCM:
2786*62c56f98SSadaf Ebrahimi *alg = taglen ? PSA_ALG_AEAD_WITH_SHORTENED_TAG(PSA_ALG_CCM, taglen) : PSA_ALG_CCM;
2787*62c56f98SSadaf Ebrahimi *key_type = PSA_KEY_TYPE_CAMELLIA;
2788*62c56f98SSadaf Ebrahimi *key_size = 128;
2789*62c56f98SSadaf Ebrahimi break;
2790*62c56f98SSadaf Ebrahimi case MBEDTLS_CIPHER_CAMELLIA_128_GCM:
2791*62c56f98SSadaf Ebrahimi *alg = PSA_ALG_GCM;
2792*62c56f98SSadaf Ebrahimi *key_type = PSA_KEY_TYPE_CAMELLIA;
2793*62c56f98SSadaf Ebrahimi *key_size = 128;
2794*62c56f98SSadaf Ebrahimi break;
2795*62c56f98SSadaf Ebrahimi case MBEDTLS_CIPHER_CAMELLIA_192_CCM:
2796*62c56f98SSadaf Ebrahimi *alg = taglen ? PSA_ALG_AEAD_WITH_SHORTENED_TAG(PSA_ALG_CCM, taglen) : PSA_ALG_CCM;
2797*62c56f98SSadaf Ebrahimi *key_type = PSA_KEY_TYPE_CAMELLIA;
2798*62c56f98SSadaf Ebrahimi *key_size = 192;
2799*62c56f98SSadaf Ebrahimi break;
2800*62c56f98SSadaf Ebrahimi case MBEDTLS_CIPHER_CAMELLIA_192_GCM:
2801*62c56f98SSadaf Ebrahimi *alg = PSA_ALG_GCM;
2802*62c56f98SSadaf Ebrahimi *key_type = PSA_KEY_TYPE_CAMELLIA;
2803*62c56f98SSadaf Ebrahimi *key_size = 192;
2804*62c56f98SSadaf Ebrahimi break;
2805*62c56f98SSadaf Ebrahimi case MBEDTLS_CIPHER_CAMELLIA_256_CBC:
2806*62c56f98SSadaf Ebrahimi *alg = PSA_ALG_CBC_NO_PADDING;
2807*62c56f98SSadaf Ebrahimi *key_type = PSA_KEY_TYPE_CAMELLIA;
2808*62c56f98SSadaf Ebrahimi *key_size = 256;
2809*62c56f98SSadaf Ebrahimi break;
2810*62c56f98SSadaf Ebrahimi case MBEDTLS_CIPHER_CAMELLIA_256_CCM:
2811*62c56f98SSadaf Ebrahimi *alg = taglen ? PSA_ALG_AEAD_WITH_SHORTENED_TAG(PSA_ALG_CCM, taglen) : PSA_ALG_CCM;
2812*62c56f98SSadaf Ebrahimi *key_type = PSA_KEY_TYPE_CAMELLIA;
2813*62c56f98SSadaf Ebrahimi *key_size = 256;
2814*62c56f98SSadaf Ebrahimi break;
2815*62c56f98SSadaf Ebrahimi case MBEDTLS_CIPHER_CAMELLIA_256_GCM:
2816*62c56f98SSadaf Ebrahimi *alg = PSA_ALG_GCM;
2817*62c56f98SSadaf Ebrahimi *key_type = PSA_KEY_TYPE_CAMELLIA;
2818*62c56f98SSadaf Ebrahimi *key_size = 256;
2819*62c56f98SSadaf Ebrahimi break;
2820*62c56f98SSadaf Ebrahimi case MBEDTLS_CIPHER_CHACHA20_POLY1305:
2821*62c56f98SSadaf Ebrahimi *alg = PSA_ALG_CHACHA20_POLY1305;
2822*62c56f98SSadaf Ebrahimi *key_type = PSA_KEY_TYPE_CHACHA20;
2823*62c56f98SSadaf Ebrahimi *key_size = 256;
2824*62c56f98SSadaf Ebrahimi break;
2825*62c56f98SSadaf Ebrahimi case MBEDTLS_CIPHER_NULL:
2826*62c56f98SSadaf Ebrahimi *alg = MBEDTLS_SSL_NULL_CIPHER;
2827*62c56f98SSadaf Ebrahimi *key_type = 0;
2828*62c56f98SSadaf Ebrahimi *key_size = 0;
2829*62c56f98SSadaf Ebrahimi break;
2830*62c56f98SSadaf Ebrahimi default:
2831*62c56f98SSadaf Ebrahimi return PSA_ERROR_NOT_SUPPORTED;
2832*62c56f98SSadaf Ebrahimi }
2833*62c56f98SSadaf Ebrahimi
2834*62c56f98SSadaf Ebrahimi return PSA_SUCCESS;
2835*62c56f98SSadaf Ebrahimi }
2836*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_USE_PSA_CRYPTO || MBEDTLS_SSL_PROTO_TLS1_3 */
2837*62c56f98SSadaf Ebrahimi
2838*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_SRV_C)
mbedtls_ssl_conf_dh_param_bin(mbedtls_ssl_config * conf,const unsigned char * dhm_P,size_t P_len,const unsigned char * dhm_G,size_t G_len)2839*62c56f98SSadaf Ebrahimi int mbedtls_ssl_conf_dh_param_bin(mbedtls_ssl_config *conf,
2840*62c56f98SSadaf Ebrahimi const unsigned char *dhm_P, size_t P_len,
2841*62c56f98SSadaf Ebrahimi const unsigned char *dhm_G, size_t G_len)
2842*62c56f98SSadaf Ebrahimi {
2843*62c56f98SSadaf Ebrahimi int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2844*62c56f98SSadaf Ebrahimi
2845*62c56f98SSadaf Ebrahimi mbedtls_mpi_free(&conf->dhm_P);
2846*62c56f98SSadaf Ebrahimi mbedtls_mpi_free(&conf->dhm_G);
2847*62c56f98SSadaf Ebrahimi
2848*62c56f98SSadaf Ebrahimi if ((ret = mbedtls_mpi_read_binary(&conf->dhm_P, dhm_P, P_len)) != 0 ||
2849*62c56f98SSadaf Ebrahimi (ret = mbedtls_mpi_read_binary(&conf->dhm_G, dhm_G, G_len)) != 0) {
2850*62c56f98SSadaf Ebrahimi mbedtls_mpi_free(&conf->dhm_P);
2851*62c56f98SSadaf Ebrahimi mbedtls_mpi_free(&conf->dhm_G);
2852*62c56f98SSadaf Ebrahimi return ret;
2853*62c56f98SSadaf Ebrahimi }
2854*62c56f98SSadaf Ebrahimi
2855*62c56f98SSadaf Ebrahimi return 0;
2856*62c56f98SSadaf Ebrahimi }
2857*62c56f98SSadaf Ebrahimi
mbedtls_ssl_conf_dh_param_ctx(mbedtls_ssl_config * conf,mbedtls_dhm_context * dhm_ctx)2858*62c56f98SSadaf Ebrahimi int mbedtls_ssl_conf_dh_param_ctx(mbedtls_ssl_config *conf, mbedtls_dhm_context *dhm_ctx)
2859*62c56f98SSadaf Ebrahimi {
2860*62c56f98SSadaf Ebrahimi int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2861*62c56f98SSadaf Ebrahimi
2862*62c56f98SSadaf Ebrahimi mbedtls_mpi_free(&conf->dhm_P);
2863*62c56f98SSadaf Ebrahimi mbedtls_mpi_free(&conf->dhm_G);
2864*62c56f98SSadaf Ebrahimi
2865*62c56f98SSadaf Ebrahimi if ((ret = mbedtls_dhm_get_value(dhm_ctx, MBEDTLS_DHM_PARAM_P,
2866*62c56f98SSadaf Ebrahimi &conf->dhm_P)) != 0 ||
2867*62c56f98SSadaf Ebrahimi (ret = mbedtls_dhm_get_value(dhm_ctx, MBEDTLS_DHM_PARAM_G,
2868*62c56f98SSadaf Ebrahimi &conf->dhm_G)) != 0) {
2869*62c56f98SSadaf Ebrahimi mbedtls_mpi_free(&conf->dhm_P);
2870*62c56f98SSadaf Ebrahimi mbedtls_mpi_free(&conf->dhm_G);
2871*62c56f98SSadaf Ebrahimi return ret;
2872*62c56f98SSadaf Ebrahimi }
2873*62c56f98SSadaf Ebrahimi
2874*62c56f98SSadaf Ebrahimi return 0;
2875*62c56f98SSadaf Ebrahimi }
2876*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_DHM_C && MBEDTLS_SSL_SRV_C */
2877*62c56f98SSadaf Ebrahimi
2878*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_CLI_C)
2879*62c56f98SSadaf Ebrahimi /*
2880*62c56f98SSadaf Ebrahimi * Set the minimum length for Diffie-Hellman parameters
2881*62c56f98SSadaf Ebrahimi */
mbedtls_ssl_conf_dhm_min_bitlen(mbedtls_ssl_config * conf,unsigned int bitlen)2882*62c56f98SSadaf Ebrahimi void mbedtls_ssl_conf_dhm_min_bitlen(mbedtls_ssl_config *conf,
2883*62c56f98SSadaf Ebrahimi unsigned int bitlen)
2884*62c56f98SSadaf Ebrahimi {
2885*62c56f98SSadaf Ebrahimi conf->dhm_min_bitlen = bitlen;
2886*62c56f98SSadaf Ebrahimi }
2887*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_DHM_C && MBEDTLS_SSL_CLI_C */
2888*62c56f98SSadaf Ebrahimi
2889*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED)
2890*62c56f98SSadaf Ebrahimi #if !defined(MBEDTLS_DEPRECATED_REMOVED) && defined(MBEDTLS_SSL_PROTO_TLS1_2)
2891*62c56f98SSadaf Ebrahimi /*
2892*62c56f98SSadaf Ebrahimi * Set allowed/preferred hashes for handshake signatures
2893*62c56f98SSadaf Ebrahimi */
mbedtls_ssl_conf_sig_hashes(mbedtls_ssl_config * conf,const int * hashes)2894*62c56f98SSadaf Ebrahimi void mbedtls_ssl_conf_sig_hashes(mbedtls_ssl_config *conf,
2895*62c56f98SSadaf Ebrahimi const int *hashes)
2896*62c56f98SSadaf Ebrahimi {
2897*62c56f98SSadaf Ebrahimi conf->sig_hashes = hashes;
2898*62c56f98SSadaf Ebrahimi }
2899*62c56f98SSadaf Ebrahimi #endif /* !MBEDTLS_DEPRECATED_REMOVED && MBEDTLS_SSL_PROTO_TLS1_2 */
2900*62c56f98SSadaf Ebrahimi
2901*62c56f98SSadaf Ebrahimi /* Configure allowed signature algorithms for handshake */
mbedtls_ssl_conf_sig_algs(mbedtls_ssl_config * conf,const uint16_t * sig_algs)2902*62c56f98SSadaf Ebrahimi void mbedtls_ssl_conf_sig_algs(mbedtls_ssl_config *conf,
2903*62c56f98SSadaf Ebrahimi const uint16_t *sig_algs)
2904*62c56f98SSadaf Ebrahimi {
2905*62c56f98SSadaf Ebrahimi #if !defined(MBEDTLS_DEPRECATED_REMOVED)
2906*62c56f98SSadaf Ebrahimi conf->sig_hashes = NULL;
2907*62c56f98SSadaf Ebrahimi #endif /* !MBEDTLS_DEPRECATED_REMOVED */
2908*62c56f98SSadaf Ebrahimi conf->sig_algs = sig_algs;
2909*62c56f98SSadaf Ebrahimi }
2910*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED */
2911*62c56f98SSadaf Ebrahimi
2912*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_ECP_C)
2913*62c56f98SSadaf Ebrahimi #if !defined(MBEDTLS_DEPRECATED_REMOVED)
2914*62c56f98SSadaf Ebrahimi /*
2915*62c56f98SSadaf Ebrahimi * Set the allowed elliptic curves
2916*62c56f98SSadaf Ebrahimi *
2917*62c56f98SSadaf Ebrahimi * mbedtls_ssl_setup() takes the provided list
2918*62c56f98SSadaf Ebrahimi * and translates it to a list of IANA TLS group identifiers,
2919*62c56f98SSadaf Ebrahimi * stored in ssl->handshake->group_list.
2920*62c56f98SSadaf Ebrahimi *
2921*62c56f98SSadaf Ebrahimi */
mbedtls_ssl_conf_curves(mbedtls_ssl_config * conf,const mbedtls_ecp_group_id * curve_list)2922*62c56f98SSadaf Ebrahimi void mbedtls_ssl_conf_curves(mbedtls_ssl_config *conf,
2923*62c56f98SSadaf Ebrahimi const mbedtls_ecp_group_id *curve_list)
2924*62c56f98SSadaf Ebrahimi {
2925*62c56f98SSadaf Ebrahimi conf->curve_list = curve_list;
2926*62c56f98SSadaf Ebrahimi conf->group_list = NULL;
2927*62c56f98SSadaf Ebrahimi }
2928*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_DEPRECATED_REMOVED */
2929*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_ECP_C */
2930*62c56f98SSadaf Ebrahimi
2931*62c56f98SSadaf Ebrahimi /*
2932*62c56f98SSadaf Ebrahimi * Set the allowed groups
2933*62c56f98SSadaf Ebrahimi */
mbedtls_ssl_conf_groups(mbedtls_ssl_config * conf,const uint16_t * group_list)2934*62c56f98SSadaf Ebrahimi void mbedtls_ssl_conf_groups(mbedtls_ssl_config *conf,
2935*62c56f98SSadaf Ebrahimi const uint16_t *group_list)
2936*62c56f98SSadaf Ebrahimi {
2937*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_ECP_C) && !defined(MBEDTLS_DEPRECATED_REMOVED)
2938*62c56f98SSadaf Ebrahimi conf->curve_list = NULL;
2939*62c56f98SSadaf Ebrahimi #endif
2940*62c56f98SSadaf Ebrahimi conf->group_list = group_list;
2941*62c56f98SSadaf Ebrahimi }
2942*62c56f98SSadaf Ebrahimi
2943*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_X509_CRT_PARSE_C)
mbedtls_ssl_set_hostname(mbedtls_ssl_context * ssl,const char * hostname)2944*62c56f98SSadaf Ebrahimi int mbedtls_ssl_set_hostname(mbedtls_ssl_context *ssl, const char *hostname)
2945*62c56f98SSadaf Ebrahimi {
2946*62c56f98SSadaf Ebrahimi /* Initialize to suppress unnecessary compiler warning */
2947*62c56f98SSadaf Ebrahimi size_t hostname_len = 0;
2948*62c56f98SSadaf Ebrahimi
2949*62c56f98SSadaf Ebrahimi /* Check if new hostname is valid before
2950*62c56f98SSadaf Ebrahimi * making any change to current one */
2951*62c56f98SSadaf Ebrahimi if (hostname != NULL) {
2952*62c56f98SSadaf Ebrahimi hostname_len = strlen(hostname);
2953*62c56f98SSadaf Ebrahimi
2954*62c56f98SSadaf Ebrahimi if (hostname_len > MBEDTLS_SSL_MAX_HOST_NAME_LEN) {
2955*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
2956*62c56f98SSadaf Ebrahimi }
2957*62c56f98SSadaf Ebrahimi }
2958*62c56f98SSadaf Ebrahimi
2959*62c56f98SSadaf Ebrahimi /* Now it's clear that we will overwrite the old hostname,
2960*62c56f98SSadaf Ebrahimi * so we can free it safely */
2961*62c56f98SSadaf Ebrahimi
2962*62c56f98SSadaf Ebrahimi if (ssl->hostname != NULL) {
2963*62c56f98SSadaf Ebrahimi mbedtls_zeroize_and_free(ssl->hostname, strlen(ssl->hostname));
2964*62c56f98SSadaf Ebrahimi }
2965*62c56f98SSadaf Ebrahimi
2966*62c56f98SSadaf Ebrahimi /* Passing NULL as hostname shall clear the old one */
2967*62c56f98SSadaf Ebrahimi
2968*62c56f98SSadaf Ebrahimi if (hostname == NULL) {
2969*62c56f98SSadaf Ebrahimi ssl->hostname = NULL;
2970*62c56f98SSadaf Ebrahimi } else {
2971*62c56f98SSadaf Ebrahimi ssl->hostname = mbedtls_calloc(1, hostname_len + 1);
2972*62c56f98SSadaf Ebrahimi if (ssl->hostname == NULL) {
2973*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_ALLOC_FAILED;
2974*62c56f98SSadaf Ebrahimi }
2975*62c56f98SSadaf Ebrahimi
2976*62c56f98SSadaf Ebrahimi memcpy(ssl->hostname, hostname, hostname_len);
2977*62c56f98SSadaf Ebrahimi
2978*62c56f98SSadaf Ebrahimi ssl->hostname[hostname_len] = '\0';
2979*62c56f98SSadaf Ebrahimi }
2980*62c56f98SSadaf Ebrahimi
2981*62c56f98SSadaf Ebrahimi return 0;
2982*62c56f98SSadaf Ebrahimi }
2983*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_X509_CRT_PARSE_C */
2984*62c56f98SSadaf Ebrahimi
2985*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
mbedtls_ssl_conf_sni(mbedtls_ssl_config * conf,int (* f_sni)(void *,mbedtls_ssl_context *,const unsigned char *,size_t),void * p_sni)2986*62c56f98SSadaf Ebrahimi void mbedtls_ssl_conf_sni(mbedtls_ssl_config *conf,
2987*62c56f98SSadaf Ebrahimi int (*f_sni)(void *, mbedtls_ssl_context *,
2988*62c56f98SSadaf Ebrahimi const unsigned char *, size_t),
2989*62c56f98SSadaf Ebrahimi void *p_sni)
2990*62c56f98SSadaf Ebrahimi {
2991*62c56f98SSadaf Ebrahimi conf->f_sni = f_sni;
2992*62c56f98SSadaf Ebrahimi conf->p_sni = p_sni;
2993*62c56f98SSadaf Ebrahimi }
2994*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
2995*62c56f98SSadaf Ebrahimi
2996*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_ALPN)
mbedtls_ssl_conf_alpn_protocols(mbedtls_ssl_config * conf,const char ** protos)2997*62c56f98SSadaf Ebrahimi int mbedtls_ssl_conf_alpn_protocols(mbedtls_ssl_config *conf, const char **protos)
2998*62c56f98SSadaf Ebrahimi {
2999*62c56f98SSadaf Ebrahimi size_t cur_len, tot_len;
3000*62c56f98SSadaf Ebrahimi const char **p;
3001*62c56f98SSadaf Ebrahimi
3002*62c56f98SSadaf Ebrahimi /*
3003*62c56f98SSadaf Ebrahimi * RFC 7301 3.1: "Empty strings MUST NOT be included and byte strings
3004*62c56f98SSadaf Ebrahimi * MUST NOT be truncated."
3005*62c56f98SSadaf Ebrahimi * We check lengths now rather than later.
3006*62c56f98SSadaf Ebrahimi */
3007*62c56f98SSadaf Ebrahimi tot_len = 0;
3008*62c56f98SSadaf Ebrahimi for (p = protos; *p != NULL; p++) {
3009*62c56f98SSadaf Ebrahimi cur_len = strlen(*p);
3010*62c56f98SSadaf Ebrahimi tot_len += cur_len;
3011*62c56f98SSadaf Ebrahimi
3012*62c56f98SSadaf Ebrahimi if ((cur_len == 0) ||
3013*62c56f98SSadaf Ebrahimi (cur_len > MBEDTLS_SSL_MAX_ALPN_NAME_LEN) ||
3014*62c56f98SSadaf Ebrahimi (tot_len > MBEDTLS_SSL_MAX_ALPN_LIST_LEN)) {
3015*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
3016*62c56f98SSadaf Ebrahimi }
3017*62c56f98SSadaf Ebrahimi }
3018*62c56f98SSadaf Ebrahimi
3019*62c56f98SSadaf Ebrahimi conf->alpn_list = protos;
3020*62c56f98SSadaf Ebrahimi
3021*62c56f98SSadaf Ebrahimi return 0;
3022*62c56f98SSadaf Ebrahimi }
3023*62c56f98SSadaf Ebrahimi
mbedtls_ssl_get_alpn_protocol(const mbedtls_ssl_context * ssl)3024*62c56f98SSadaf Ebrahimi const char *mbedtls_ssl_get_alpn_protocol(const mbedtls_ssl_context *ssl)
3025*62c56f98SSadaf Ebrahimi {
3026*62c56f98SSadaf Ebrahimi return ssl->alpn_chosen;
3027*62c56f98SSadaf Ebrahimi }
3028*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_ALPN */
3029*62c56f98SSadaf Ebrahimi
3030*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_DTLS_SRTP)
mbedtls_ssl_conf_srtp_mki_value_supported(mbedtls_ssl_config * conf,int support_mki_value)3031*62c56f98SSadaf Ebrahimi void mbedtls_ssl_conf_srtp_mki_value_supported(mbedtls_ssl_config *conf,
3032*62c56f98SSadaf Ebrahimi int support_mki_value)
3033*62c56f98SSadaf Ebrahimi {
3034*62c56f98SSadaf Ebrahimi conf->dtls_srtp_mki_support = support_mki_value;
3035*62c56f98SSadaf Ebrahimi }
3036*62c56f98SSadaf Ebrahimi
mbedtls_ssl_dtls_srtp_set_mki_value(mbedtls_ssl_context * ssl,unsigned char * mki_value,uint16_t mki_len)3037*62c56f98SSadaf Ebrahimi int mbedtls_ssl_dtls_srtp_set_mki_value(mbedtls_ssl_context *ssl,
3038*62c56f98SSadaf Ebrahimi unsigned char *mki_value,
3039*62c56f98SSadaf Ebrahimi uint16_t mki_len)
3040*62c56f98SSadaf Ebrahimi {
3041*62c56f98SSadaf Ebrahimi if (mki_len > MBEDTLS_TLS_SRTP_MAX_MKI_LENGTH) {
3042*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
3043*62c56f98SSadaf Ebrahimi }
3044*62c56f98SSadaf Ebrahimi
3045*62c56f98SSadaf Ebrahimi if (ssl->conf->dtls_srtp_mki_support == MBEDTLS_SSL_DTLS_SRTP_MKI_UNSUPPORTED) {
3046*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
3047*62c56f98SSadaf Ebrahimi }
3048*62c56f98SSadaf Ebrahimi
3049*62c56f98SSadaf Ebrahimi memcpy(ssl->dtls_srtp_info.mki_value, mki_value, mki_len);
3050*62c56f98SSadaf Ebrahimi ssl->dtls_srtp_info.mki_len = mki_len;
3051*62c56f98SSadaf Ebrahimi return 0;
3052*62c56f98SSadaf Ebrahimi }
3053*62c56f98SSadaf Ebrahimi
mbedtls_ssl_conf_dtls_srtp_protection_profiles(mbedtls_ssl_config * conf,const mbedtls_ssl_srtp_profile * profiles)3054*62c56f98SSadaf Ebrahimi int mbedtls_ssl_conf_dtls_srtp_protection_profiles(mbedtls_ssl_config *conf,
3055*62c56f98SSadaf Ebrahimi const mbedtls_ssl_srtp_profile *profiles)
3056*62c56f98SSadaf Ebrahimi {
3057*62c56f98SSadaf Ebrahimi const mbedtls_ssl_srtp_profile *p;
3058*62c56f98SSadaf Ebrahimi size_t list_size = 0;
3059*62c56f98SSadaf Ebrahimi
3060*62c56f98SSadaf Ebrahimi /* check the profiles list: all entry must be valid,
3061*62c56f98SSadaf Ebrahimi * its size cannot be more than the total number of supported profiles, currently 4 */
3062*62c56f98SSadaf Ebrahimi for (p = profiles; *p != MBEDTLS_TLS_SRTP_UNSET &&
3063*62c56f98SSadaf Ebrahimi list_size <= MBEDTLS_TLS_SRTP_MAX_PROFILE_LIST_LENGTH;
3064*62c56f98SSadaf Ebrahimi p++) {
3065*62c56f98SSadaf Ebrahimi if (mbedtls_ssl_check_srtp_profile_value(*p) != MBEDTLS_TLS_SRTP_UNSET) {
3066*62c56f98SSadaf Ebrahimi list_size++;
3067*62c56f98SSadaf Ebrahimi } else {
3068*62c56f98SSadaf Ebrahimi /* unsupported value, stop parsing and set the size to an error value */
3069*62c56f98SSadaf Ebrahimi list_size = MBEDTLS_TLS_SRTP_MAX_PROFILE_LIST_LENGTH + 1;
3070*62c56f98SSadaf Ebrahimi }
3071*62c56f98SSadaf Ebrahimi }
3072*62c56f98SSadaf Ebrahimi
3073*62c56f98SSadaf Ebrahimi if (list_size > MBEDTLS_TLS_SRTP_MAX_PROFILE_LIST_LENGTH) {
3074*62c56f98SSadaf Ebrahimi conf->dtls_srtp_profile_list = NULL;
3075*62c56f98SSadaf Ebrahimi conf->dtls_srtp_profile_list_len = 0;
3076*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
3077*62c56f98SSadaf Ebrahimi }
3078*62c56f98SSadaf Ebrahimi
3079*62c56f98SSadaf Ebrahimi conf->dtls_srtp_profile_list = profiles;
3080*62c56f98SSadaf Ebrahimi conf->dtls_srtp_profile_list_len = list_size;
3081*62c56f98SSadaf Ebrahimi
3082*62c56f98SSadaf Ebrahimi return 0;
3083*62c56f98SSadaf Ebrahimi }
3084*62c56f98SSadaf Ebrahimi
mbedtls_ssl_get_dtls_srtp_negotiation_result(const mbedtls_ssl_context * ssl,mbedtls_dtls_srtp_info * dtls_srtp_info)3085*62c56f98SSadaf Ebrahimi void mbedtls_ssl_get_dtls_srtp_negotiation_result(const mbedtls_ssl_context *ssl,
3086*62c56f98SSadaf Ebrahimi mbedtls_dtls_srtp_info *dtls_srtp_info)
3087*62c56f98SSadaf Ebrahimi {
3088*62c56f98SSadaf Ebrahimi dtls_srtp_info->chosen_dtls_srtp_profile = ssl->dtls_srtp_info.chosen_dtls_srtp_profile;
3089*62c56f98SSadaf Ebrahimi /* do not copy the mki value if there is no chosen profile */
3090*62c56f98SSadaf Ebrahimi if (dtls_srtp_info->chosen_dtls_srtp_profile == MBEDTLS_TLS_SRTP_UNSET) {
3091*62c56f98SSadaf Ebrahimi dtls_srtp_info->mki_len = 0;
3092*62c56f98SSadaf Ebrahimi } else {
3093*62c56f98SSadaf Ebrahimi dtls_srtp_info->mki_len = ssl->dtls_srtp_info.mki_len;
3094*62c56f98SSadaf Ebrahimi memcpy(dtls_srtp_info->mki_value, ssl->dtls_srtp_info.mki_value,
3095*62c56f98SSadaf Ebrahimi ssl->dtls_srtp_info.mki_len);
3096*62c56f98SSadaf Ebrahimi }
3097*62c56f98SSadaf Ebrahimi }
3098*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_DTLS_SRTP */
3099*62c56f98SSadaf Ebrahimi
3100*62c56f98SSadaf Ebrahimi #if !defined(MBEDTLS_DEPRECATED_REMOVED)
mbedtls_ssl_conf_max_version(mbedtls_ssl_config * conf,int major,int minor)3101*62c56f98SSadaf Ebrahimi void mbedtls_ssl_conf_max_version(mbedtls_ssl_config *conf, int major, int minor)
3102*62c56f98SSadaf Ebrahimi {
3103*62c56f98SSadaf Ebrahimi conf->max_tls_version = (mbedtls_ssl_protocol_version) ((major << 8) | minor);
3104*62c56f98SSadaf Ebrahimi }
3105*62c56f98SSadaf Ebrahimi
mbedtls_ssl_conf_min_version(mbedtls_ssl_config * conf,int major,int minor)3106*62c56f98SSadaf Ebrahimi void mbedtls_ssl_conf_min_version(mbedtls_ssl_config *conf, int major, int minor)
3107*62c56f98SSadaf Ebrahimi {
3108*62c56f98SSadaf Ebrahimi conf->min_tls_version = (mbedtls_ssl_protocol_version) ((major << 8) | minor);
3109*62c56f98SSadaf Ebrahimi }
3110*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_DEPRECATED_REMOVED */
3111*62c56f98SSadaf Ebrahimi
3112*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_SRV_C)
mbedtls_ssl_conf_cert_req_ca_list(mbedtls_ssl_config * conf,char cert_req_ca_list)3113*62c56f98SSadaf Ebrahimi void mbedtls_ssl_conf_cert_req_ca_list(mbedtls_ssl_config *conf,
3114*62c56f98SSadaf Ebrahimi char cert_req_ca_list)
3115*62c56f98SSadaf Ebrahimi {
3116*62c56f98SSadaf Ebrahimi conf->cert_req_ca_list = cert_req_ca_list;
3117*62c56f98SSadaf Ebrahimi }
3118*62c56f98SSadaf Ebrahimi #endif
3119*62c56f98SSadaf Ebrahimi
3120*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
mbedtls_ssl_conf_encrypt_then_mac(mbedtls_ssl_config * conf,char etm)3121*62c56f98SSadaf Ebrahimi void mbedtls_ssl_conf_encrypt_then_mac(mbedtls_ssl_config *conf, char etm)
3122*62c56f98SSadaf Ebrahimi {
3123*62c56f98SSadaf Ebrahimi conf->encrypt_then_mac = etm;
3124*62c56f98SSadaf Ebrahimi }
3125*62c56f98SSadaf Ebrahimi #endif
3126*62c56f98SSadaf Ebrahimi
3127*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
mbedtls_ssl_conf_extended_master_secret(mbedtls_ssl_config * conf,char ems)3128*62c56f98SSadaf Ebrahimi void mbedtls_ssl_conf_extended_master_secret(mbedtls_ssl_config *conf, char ems)
3129*62c56f98SSadaf Ebrahimi {
3130*62c56f98SSadaf Ebrahimi conf->extended_ms = ems;
3131*62c56f98SSadaf Ebrahimi }
3132*62c56f98SSadaf Ebrahimi #endif
3133*62c56f98SSadaf Ebrahimi
3134*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
mbedtls_ssl_conf_max_frag_len(mbedtls_ssl_config * conf,unsigned char mfl_code)3135*62c56f98SSadaf Ebrahimi int mbedtls_ssl_conf_max_frag_len(mbedtls_ssl_config *conf, unsigned char mfl_code)
3136*62c56f98SSadaf Ebrahimi {
3137*62c56f98SSadaf Ebrahimi if (mfl_code >= MBEDTLS_SSL_MAX_FRAG_LEN_INVALID ||
3138*62c56f98SSadaf Ebrahimi ssl_mfl_code_to_length(mfl_code) > MBEDTLS_TLS_EXT_ADV_CONTENT_LEN) {
3139*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
3140*62c56f98SSadaf Ebrahimi }
3141*62c56f98SSadaf Ebrahimi
3142*62c56f98SSadaf Ebrahimi conf->mfl_code = mfl_code;
3143*62c56f98SSadaf Ebrahimi
3144*62c56f98SSadaf Ebrahimi return 0;
3145*62c56f98SSadaf Ebrahimi }
3146*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
3147*62c56f98SSadaf Ebrahimi
mbedtls_ssl_conf_legacy_renegotiation(mbedtls_ssl_config * conf,int allow_legacy)3148*62c56f98SSadaf Ebrahimi void mbedtls_ssl_conf_legacy_renegotiation(mbedtls_ssl_config *conf, int allow_legacy)
3149*62c56f98SSadaf Ebrahimi {
3150*62c56f98SSadaf Ebrahimi conf->allow_legacy_renegotiation = allow_legacy;
3151*62c56f98SSadaf Ebrahimi }
3152*62c56f98SSadaf Ebrahimi
3153*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_RENEGOTIATION)
mbedtls_ssl_conf_renegotiation(mbedtls_ssl_config * conf,int renegotiation)3154*62c56f98SSadaf Ebrahimi void mbedtls_ssl_conf_renegotiation(mbedtls_ssl_config *conf, int renegotiation)
3155*62c56f98SSadaf Ebrahimi {
3156*62c56f98SSadaf Ebrahimi conf->disable_renegotiation = renegotiation;
3157*62c56f98SSadaf Ebrahimi }
3158*62c56f98SSadaf Ebrahimi
mbedtls_ssl_conf_renegotiation_enforced(mbedtls_ssl_config * conf,int max_records)3159*62c56f98SSadaf Ebrahimi void mbedtls_ssl_conf_renegotiation_enforced(mbedtls_ssl_config *conf, int max_records)
3160*62c56f98SSadaf Ebrahimi {
3161*62c56f98SSadaf Ebrahimi conf->renego_max_records = max_records;
3162*62c56f98SSadaf Ebrahimi }
3163*62c56f98SSadaf Ebrahimi
mbedtls_ssl_conf_renegotiation_period(mbedtls_ssl_config * conf,const unsigned char period[8])3164*62c56f98SSadaf Ebrahimi void mbedtls_ssl_conf_renegotiation_period(mbedtls_ssl_config *conf,
3165*62c56f98SSadaf Ebrahimi const unsigned char period[8])
3166*62c56f98SSadaf Ebrahimi {
3167*62c56f98SSadaf Ebrahimi memcpy(conf->renego_period, period, 8);
3168*62c56f98SSadaf Ebrahimi }
3169*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_RENEGOTIATION */
3170*62c56f98SSadaf Ebrahimi
3171*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_SESSION_TICKETS)
3172*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_CLI_C)
mbedtls_ssl_conf_session_tickets(mbedtls_ssl_config * conf,int use_tickets)3173*62c56f98SSadaf Ebrahimi void mbedtls_ssl_conf_session_tickets(mbedtls_ssl_config *conf, int use_tickets)
3174*62c56f98SSadaf Ebrahimi {
3175*62c56f98SSadaf Ebrahimi conf->session_tickets = use_tickets;
3176*62c56f98SSadaf Ebrahimi }
3177*62c56f98SSadaf Ebrahimi #endif
3178*62c56f98SSadaf Ebrahimi
3179*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_SRV_C)
3180*62c56f98SSadaf Ebrahimi
3181*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_TLS1_3) && defined(MBEDTLS_SSL_SESSION_TICKETS)
mbedtls_ssl_conf_new_session_tickets(mbedtls_ssl_config * conf,uint16_t num_tickets)3182*62c56f98SSadaf Ebrahimi void mbedtls_ssl_conf_new_session_tickets(mbedtls_ssl_config *conf,
3183*62c56f98SSadaf Ebrahimi uint16_t num_tickets)
3184*62c56f98SSadaf Ebrahimi {
3185*62c56f98SSadaf Ebrahimi conf->new_session_tickets_count = num_tickets;
3186*62c56f98SSadaf Ebrahimi }
3187*62c56f98SSadaf Ebrahimi #endif
3188*62c56f98SSadaf Ebrahimi
mbedtls_ssl_conf_session_tickets_cb(mbedtls_ssl_config * conf,mbedtls_ssl_ticket_write_t * f_ticket_write,mbedtls_ssl_ticket_parse_t * f_ticket_parse,void * p_ticket)3189*62c56f98SSadaf Ebrahimi void mbedtls_ssl_conf_session_tickets_cb(mbedtls_ssl_config *conf,
3190*62c56f98SSadaf Ebrahimi mbedtls_ssl_ticket_write_t *f_ticket_write,
3191*62c56f98SSadaf Ebrahimi mbedtls_ssl_ticket_parse_t *f_ticket_parse,
3192*62c56f98SSadaf Ebrahimi void *p_ticket)
3193*62c56f98SSadaf Ebrahimi {
3194*62c56f98SSadaf Ebrahimi conf->f_ticket_write = f_ticket_write;
3195*62c56f98SSadaf Ebrahimi conf->f_ticket_parse = f_ticket_parse;
3196*62c56f98SSadaf Ebrahimi conf->p_ticket = p_ticket;
3197*62c56f98SSadaf Ebrahimi }
3198*62c56f98SSadaf Ebrahimi #endif
3199*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_SESSION_TICKETS */
3200*62c56f98SSadaf Ebrahimi
mbedtls_ssl_set_export_keys_cb(mbedtls_ssl_context * ssl,mbedtls_ssl_export_keys_t * f_export_keys,void * p_export_keys)3201*62c56f98SSadaf Ebrahimi void mbedtls_ssl_set_export_keys_cb(mbedtls_ssl_context *ssl,
3202*62c56f98SSadaf Ebrahimi mbedtls_ssl_export_keys_t *f_export_keys,
3203*62c56f98SSadaf Ebrahimi void *p_export_keys)
3204*62c56f98SSadaf Ebrahimi {
3205*62c56f98SSadaf Ebrahimi ssl->f_export_keys = f_export_keys;
3206*62c56f98SSadaf Ebrahimi ssl->p_export_keys = p_export_keys;
3207*62c56f98SSadaf Ebrahimi }
3208*62c56f98SSadaf Ebrahimi
3209*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
mbedtls_ssl_conf_async_private_cb(mbedtls_ssl_config * conf,mbedtls_ssl_async_sign_t * f_async_sign,mbedtls_ssl_async_decrypt_t * f_async_decrypt,mbedtls_ssl_async_resume_t * f_async_resume,mbedtls_ssl_async_cancel_t * f_async_cancel,void * async_config_data)3210*62c56f98SSadaf Ebrahimi void mbedtls_ssl_conf_async_private_cb(
3211*62c56f98SSadaf Ebrahimi mbedtls_ssl_config *conf,
3212*62c56f98SSadaf Ebrahimi mbedtls_ssl_async_sign_t *f_async_sign,
3213*62c56f98SSadaf Ebrahimi mbedtls_ssl_async_decrypt_t *f_async_decrypt,
3214*62c56f98SSadaf Ebrahimi mbedtls_ssl_async_resume_t *f_async_resume,
3215*62c56f98SSadaf Ebrahimi mbedtls_ssl_async_cancel_t *f_async_cancel,
3216*62c56f98SSadaf Ebrahimi void *async_config_data)
3217*62c56f98SSadaf Ebrahimi {
3218*62c56f98SSadaf Ebrahimi conf->f_async_sign_start = f_async_sign;
3219*62c56f98SSadaf Ebrahimi conf->f_async_decrypt_start = f_async_decrypt;
3220*62c56f98SSadaf Ebrahimi conf->f_async_resume = f_async_resume;
3221*62c56f98SSadaf Ebrahimi conf->f_async_cancel = f_async_cancel;
3222*62c56f98SSadaf Ebrahimi conf->p_async_config_data = async_config_data;
3223*62c56f98SSadaf Ebrahimi }
3224*62c56f98SSadaf Ebrahimi
mbedtls_ssl_conf_get_async_config_data(const mbedtls_ssl_config * conf)3225*62c56f98SSadaf Ebrahimi void *mbedtls_ssl_conf_get_async_config_data(const mbedtls_ssl_config *conf)
3226*62c56f98SSadaf Ebrahimi {
3227*62c56f98SSadaf Ebrahimi return conf->p_async_config_data;
3228*62c56f98SSadaf Ebrahimi }
3229*62c56f98SSadaf Ebrahimi
mbedtls_ssl_get_async_operation_data(const mbedtls_ssl_context * ssl)3230*62c56f98SSadaf Ebrahimi void *mbedtls_ssl_get_async_operation_data(const mbedtls_ssl_context *ssl)
3231*62c56f98SSadaf Ebrahimi {
3232*62c56f98SSadaf Ebrahimi if (ssl->handshake == NULL) {
3233*62c56f98SSadaf Ebrahimi return NULL;
3234*62c56f98SSadaf Ebrahimi } else {
3235*62c56f98SSadaf Ebrahimi return ssl->handshake->user_async_ctx;
3236*62c56f98SSadaf Ebrahimi }
3237*62c56f98SSadaf Ebrahimi }
3238*62c56f98SSadaf Ebrahimi
mbedtls_ssl_set_async_operation_data(mbedtls_ssl_context * ssl,void * ctx)3239*62c56f98SSadaf Ebrahimi void mbedtls_ssl_set_async_operation_data(mbedtls_ssl_context *ssl,
3240*62c56f98SSadaf Ebrahimi void *ctx)
3241*62c56f98SSadaf Ebrahimi {
3242*62c56f98SSadaf Ebrahimi if (ssl->handshake != NULL) {
3243*62c56f98SSadaf Ebrahimi ssl->handshake->user_async_ctx = ctx;
3244*62c56f98SSadaf Ebrahimi }
3245*62c56f98SSadaf Ebrahimi }
3246*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
3247*62c56f98SSadaf Ebrahimi
3248*62c56f98SSadaf Ebrahimi /*
3249*62c56f98SSadaf Ebrahimi * SSL get accessors
3250*62c56f98SSadaf Ebrahimi */
mbedtls_ssl_get_verify_result(const mbedtls_ssl_context * ssl)3251*62c56f98SSadaf Ebrahimi uint32_t mbedtls_ssl_get_verify_result(const mbedtls_ssl_context *ssl)
3252*62c56f98SSadaf Ebrahimi {
3253*62c56f98SSadaf Ebrahimi if (ssl->session != NULL) {
3254*62c56f98SSadaf Ebrahimi return ssl->session->verify_result;
3255*62c56f98SSadaf Ebrahimi }
3256*62c56f98SSadaf Ebrahimi
3257*62c56f98SSadaf Ebrahimi if (ssl->session_negotiate != NULL) {
3258*62c56f98SSadaf Ebrahimi return ssl->session_negotiate->verify_result;
3259*62c56f98SSadaf Ebrahimi }
3260*62c56f98SSadaf Ebrahimi
3261*62c56f98SSadaf Ebrahimi return 0xFFFFFFFF;
3262*62c56f98SSadaf Ebrahimi }
3263*62c56f98SSadaf Ebrahimi
mbedtls_ssl_get_ciphersuite_id_from_ssl(const mbedtls_ssl_context * ssl)3264*62c56f98SSadaf Ebrahimi int mbedtls_ssl_get_ciphersuite_id_from_ssl(const mbedtls_ssl_context *ssl)
3265*62c56f98SSadaf Ebrahimi {
3266*62c56f98SSadaf Ebrahimi if (ssl == NULL || ssl->session == NULL) {
3267*62c56f98SSadaf Ebrahimi return 0;
3268*62c56f98SSadaf Ebrahimi }
3269*62c56f98SSadaf Ebrahimi
3270*62c56f98SSadaf Ebrahimi return ssl->session->ciphersuite;
3271*62c56f98SSadaf Ebrahimi }
3272*62c56f98SSadaf Ebrahimi
mbedtls_ssl_get_ciphersuite(const mbedtls_ssl_context * ssl)3273*62c56f98SSadaf Ebrahimi const char *mbedtls_ssl_get_ciphersuite(const mbedtls_ssl_context *ssl)
3274*62c56f98SSadaf Ebrahimi {
3275*62c56f98SSadaf Ebrahimi if (ssl == NULL || ssl->session == NULL) {
3276*62c56f98SSadaf Ebrahimi return NULL;
3277*62c56f98SSadaf Ebrahimi }
3278*62c56f98SSadaf Ebrahimi
3279*62c56f98SSadaf Ebrahimi return mbedtls_ssl_get_ciphersuite_name(ssl->session->ciphersuite);
3280*62c56f98SSadaf Ebrahimi }
3281*62c56f98SSadaf Ebrahimi
mbedtls_ssl_get_version(const mbedtls_ssl_context * ssl)3282*62c56f98SSadaf Ebrahimi const char *mbedtls_ssl_get_version(const mbedtls_ssl_context *ssl)
3283*62c56f98SSadaf Ebrahimi {
3284*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_DTLS)
3285*62c56f98SSadaf Ebrahimi if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
3286*62c56f98SSadaf Ebrahimi switch (ssl->tls_version) {
3287*62c56f98SSadaf Ebrahimi case MBEDTLS_SSL_VERSION_TLS1_2:
3288*62c56f98SSadaf Ebrahimi return "DTLSv1.2";
3289*62c56f98SSadaf Ebrahimi default:
3290*62c56f98SSadaf Ebrahimi return "unknown (DTLS)";
3291*62c56f98SSadaf Ebrahimi }
3292*62c56f98SSadaf Ebrahimi }
3293*62c56f98SSadaf Ebrahimi #endif
3294*62c56f98SSadaf Ebrahimi
3295*62c56f98SSadaf Ebrahimi switch (ssl->tls_version) {
3296*62c56f98SSadaf Ebrahimi case MBEDTLS_SSL_VERSION_TLS1_2:
3297*62c56f98SSadaf Ebrahimi return "TLSv1.2";
3298*62c56f98SSadaf Ebrahimi case MBEDTLS_SSL_VERSION_TLS1_3:
3299*62c56f98SSadaf Ebrahimi return "TLSv1.3";
3300*62c56f98SSadaf Ebrahimi default:
3301*62c56f98SSadaf Ebrahimi return "unknown";
3302*62c56f98SSadaf Ebrahimi }
3303*62c56f98SSadaf Ebrahimi }
3304*62c56f98SSadaf Ebrahimi
3305*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
mbedtls_ssl_get_input_max_frag_len(const mbedtls_ssl_context * ssl)3306*62c56f98SSadaf Ebrahimi size_t mbedtls_ssl_get_input_max_frag_len(const mbedtls_ssl_context *ssl)
3307*62c56f98SSadaf Ebrahimi {
3308*62c56f98SSadaf Ebrahimi size_t max_len = MBEDTLS_SSL_IN_CONTENT_LEN;
3309*62c56f98SSadaf Ebrahimi size_t read_mfl;
3310*62c56f98SSadaf Ebrahimi
3311*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
3312*62c56f98SSadaf Ebrahimi /* Use the configured MFL for the client if we're past SERVER_HELLO_DONE */
3313*62c56f98SSadaf Ebrahimi if (ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT &&
3314*62c56f98SSadaf Ebrahimi ssl->state >= MBEDTLS_SSL_SERVER_HELLO_DONE) {
3315*62c56f98SSadaf Ebrahimi return ssl_mfl_code_to_length(ssl->conf->mfl_code);
3316*62c56f98SSadaf Ebrahimi }
3317*62c56f98SSadaf Ebrahimi #endif
3318*62c56f98SSadaf Ebrahimi
3319*62c56f98SSadaf Ebrahimi /* Check if a smaller max length was negotiated */
3320*62c56f98SSadaf Ebrahimi if (ssl->session_out != NULL) {
3321*62c56f98SSadaf Ebrahimi read_mfl = ssl_mfl_code_to_length(ssl->session_out->mfl_code);
3322*62c56f98SSadaf Ebrahimi if (read_mfl < max_len) {
3323*62c56f98SSadaf Ebrahimi max_len = read_mfl;
3324*62c56f98SSadaf Ebrahimi }
3325*62c56f98SSadaf Ebrahimi }
3326*62c56f98SSadaf Ebrahimi
3327*62c56f98SSadaf Ebrahimi /* During a handshake, use the value being negotiated */
3328*62c56f98SSadaf Ebrahimi if (ssl->session_negotiate != NULL) {
3329*62c56f98SSadaf Ebrahimi read_mfl = ssl_mfl_code_to_length(ssl->session_negotiate->mfl_code);
3330*62c56f98SSadaf Ebrahimi if (read_mfl < max_len) {
3331*62c56f98SSadaf Ebrahimi max_len = read_mfl;
3332*62c56f98SSadaf Ebrahimi }
3333*62c56f98SSadaf Ebrahimi }
3334*62c56f98SSadaf Ebrahimi
3335*62c56f98SSadaf Ebrahimi return max_len;
3336*62c56f98SSadaf Ebrahimi }
3337*62c56f98SSadaf Ebrahimi
mbedtls_ssl_get_output_max_frag_len(const mbedtls_ssl_context * ssl)3338*62c56f98SSadaf Ebrahimi size_t mbedtls_ssl_get_output_max_frag_len(const mbedtls_ssl_context *ssl)
3339*62c56f98SSadaf Ebrahimi {
3340*62c56f98SSadaf Ebrahimi size_t max_len;
3341*62c56f98SSadaf Ebrahimi
3342*62c56f98SSadaf Ebrahimi /*
3343*62c56f98SSadaf Ebrahimi * Assume mfl_code is correct since it was checked when set
3344*62c56f98SSadaf Ebrahimi */
3345*62c56f98SSadaf Ebrahimi max_len = ssl_mfl_code_to_length(ssl->conf->mfl_code);
3346*62c56f98SSadaf Ebrahimi
3347*62c56f98SSadaf Ebrahimi /* Check if a smaller max length was negotiated */
3348*62c56f98SSadaf Ebrahimi if (ssl->session_out != NULL &&
3349*62c56f98SSadaf Ebrahimi ssl_mfl_code_to_length(ssl->session_out->mfl_code) < max_len) {
3350*62c56f98SSadaf Ebrahimi max_len = ssl_mfl_code_to_length(ssl->session_out->mfl_code);
3351*62c56f98SSadaf Ebrahimi }
3352*62c56f98SSadaf Ebrahimi
3353*62c56f98SSadaf Ebrahimi /* During a handshake, use the value being negotiated */
3354*62c56f98SSadaf Ebrahimi if (ssl->session_negotiate != NULL &&
3355*62c56f98SSadaf Ebrahimi ssl_mfl_code_to_length(ssl->session_negotiate->mfl_code) < max_len) {
3356*62c56f98SSadaf Ebrahimi max_len = ssl_mfl_code_to_length(ssl->session_negotiate->mfl_code);
3357*62c56f98SSadaf Ebrahimi }
3358*62c56f98SSadaf Ebrahimi
3359*62c56f98SSadaf Ebrahimi return max_len;
3360*62c56f98SSadaf Ebrahimi }
3361*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
3362*62c56f98SSadaf Ebrahimi
3363*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_DTLS)
mbedtls_ssl_get_current_mtu(const mbedtls_ssl_context * ssl)3364*62c56f98SSadaf Ebrahimi size_t mbedtls_ssl_get_current_mtu(const mbedtls_ssl_context *ssl)
3365*62c56f98SSadaf Ebrahimi {
3366*62c56f98SSadaf Ebrahimi /* Return unlimited mtu for client hello messages to avoid fragmentation. */
3367*62c56f98SSadaf Ebrahimi if (ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT &&
3368*62c56f98SSadaf Ebrahimi (ssl->state == MBEDTLS_SSL_CLIENT_HELLO ||
3369*62c56f98SSadaf Ebrahimi ssl->state == MBEDTLS_SSL_SERVER_HELLO)) {
3370*62c56f98SSadaf Ebrahimi return 0;
3371*62c56f98SSadaf Ebrahimi }
3372*62c56f98SSadaf Ebrahimi
3373*62c56f98SSadaf Ebrahimi if (ssl->handshake == NULL || ssl->handshake->mtu == 0) {
3374*62c56f98SSadaf Ebrahimi return ssl->mtu;
3375*62c56f98SSadaf Ebrahimi }
3376*62c56f98SSadaf Ebrahimi
3377*62c56f98SSadaf Ebrahimi if (ssl->mtu == 0) {
3378*62c56f98SSadaf Ebrahimi return ssl->handshake->mtu;
3379*62c56f98SSadaf Ebrahimi }
3380*62c56f98SSadaf Ebrahimi
3381*62c56f98SSadaf Ebrahimi return ssl->mtu < ssl->handshake->mtu ?
3382*62c56f98SSadaf Ebrahimi ssl->mtu : ssl->handshake->mtu;
3383*62c56f98SSadaf Ebrahimi }
3384*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_PROTO_DTLS */
3385*62c56f98SSadaf Ebrahimi
mbedtls_ssl_get_max_out_record_payload(const mbedtls_ssl_context * ssl)3386*62c56f98SSadaf Ebrahimi int mbedtls_ssl_get_max_out_record_payload(const mbedtls_ssl_context *ssl)
3387*62c56f98SSadaf Ebrahimi {
3388*62c56f98SSadaf Ebrahimi size_t max_len = MBEDTLS_SSL_OUT_CONTENT_LEN;
3389*62c56f98SSadaf Ebrahimi
3390*62c56f98SSadaf Ebrahimi #if !defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) && \
3391*62c56f98SSadaf Ebrahimi !defined(MBEDTLS_SSL_PROTO_DTLS)
3392*62c56f98SSadaf Ebrahimi (void) ssl;
3393*62c56f98SSadaf Ebrahimi #endif
3394*62c56f98SSadaf Ebrahimi
3395*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
3396*62c56f98SSadaf Ebrahimi const size_t mfl = mbedtls_ssl_get_output_max_frag_len(ssl);
3397*62c56f98SSadaf Ebrahimi
3398*62c56f98SSadaf Ebrahimi if (max_len > mfl) {
3399*62c56f98SSadaf Ebrahimi max_len = mfl;
3400*62c56f98SSadaf Ebrahimi }
3401*62c56f98SSadaf Ebrahimi #endif
3402*62c56f98SSadaf Ebrahimi
3403*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_DTLS)
3404*62c56f98SSadaf Ebrahimi if (mbedtls_ssl_get_current_mtu(ssl) != 0) {
3405*62c56f98SSadaf Ebrahimi const size_t mtu = mbedtls_ssl_get_current_mtu(ssl);
3406*62c56f98SSadaf Ebrahimi const int ret = mbedtls_ssl_get_record_expansion(ssl);
3407*62c56f98SSadaf Ebrahimi const size_t overhead = (size_t) ret;
3408*62c56f98SSadaf Ebrahimi
3409*62c56f98SSadaf Ebrahimi if (ret < 0) {
3410*62c56f98SSadaf Ebrahimi return ret;
3411*62c56f98SSadaf Ebrahimi }
3412*62c56f98SSadaf Ebrahimi
3413*62c56f98SSadaf Ebrahimi if (mtu <= overhead) {
3414*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(1, ("MTU too low for record expansion"));
3415*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
3416*62c56f98SSadaf Ebrahimi }
3417*62c56f98SSadaf Ebrahimi
3418*62c56f98SSadaf Ebrahimi if (max_len > mtu - overhead) {
3419*62c56f98SSadaf Ebrahimi max_len = mtu - overhead;
3420*62c56f98SSadaf Ebrahimi }
3421*62c56f98SSadaf Ebrahimi }
3422*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_PROTO_DTLS */
3423*62c56f98SSadaf Ebrahimi
3424*62c56f98SSadaf Ebrahimi #if !defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) && \
3425*62c56f98SSadaf Ebrahimi !defined(MBEDTLS_SSL_PROTO_DTLS)
3426*62c56f98SSadaf Ebrahimi ((void) ssl);
3427*62c56f98SSadaf Ebrahimi #endif
3428*62c56f98SSadaf Ebrahimi
3429*62c56f98SSadaf Ebrahimi return (int) max_len;
3430*62c56f98SSadaf Ebrahimi }
3431*62c56f98SSadaf Ebrahimi
mbedtls_ssl_get_max_in_record_payload(const mbedtls_ssl_context * ssl)3432*62c56f98SSadaf Ebrahimi int mbedtls_ssl_get_max_in_record_payload(const mbedtls_ssl_context *ssl)
3433*62c56f98SSadaf Ebrahimi {
3434*62c56f98SSadaf Ebrahimi size_t max_len = MBEDTLS_SSL_IN_CONTENT_LEN;
3435*62c56f98SSadaf Ebrahimi
3436*62c56f98SSadaf Ebrahimi #if !defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
3437*62c56f98SSadaf Ebrahimi (void) ssl;
3438*62c56f98SSadaf Ebrahimi #endif
3439*62c56f98SSadaf Ebrahimi
3440*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
3441*62c56f98SSadaf Ebrahimi const size_t mfl = mbedtls_ssl_get_input_max_frag_len(ssl);
3442*62c56f98SSadaf Ebrahimi
3443*62c56f98SSadaf Ebrahimi if (max_len > mfl) {
3444*62c56f98SSadaf Ebrahimi max_len = mfl;
3445*62c56f98SSadaf Ebrahimi }
3446*62c56f98SSadaf Ebrahimi #endif
3447*62c56f98SSadaf Ebrahimi
3448*62c56f98SSadaf Ebrahimi return (int) max_len;
3449*62c56f98SSadaf Ebrahimi }
3450*62c56f98SSadaf Ebrahimi
3451*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_X509_CRT_PARSE_C)
mbedtls_ssl_get_peer_cert(const mbedtls_ssl_context * ssl)3452*62c56f98SSadaf Ebrahimi const mbedtls_x509_crt *mbedtls_ssl_get_peer_cert(const mbedtls_ssl_context *ssl)
3453*62c56f98SSadaf Ebrahimi {
3454*62c56f98SSadaf Ebrahimi if (ssl == NULL || ssl->session == NULL) {
3455*62c56f98SSadaf Ebrahimi return NULL;
3456*62c56f98SSadaf Ebrahimi }
3457*62c56f98SSadaf Ebrahimi
3458*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
3459*62c56f98SSadaf Ebrahimi return ssl->session->peer_cert;
3460*62c56f98SSadaf Ebrahimi #else
3461*62c56f98SSadaf Ebrahimi return NULL;
3462*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
3463*62c56f98SSadaf Ebrahimi }
3464*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_X509_CRT_PARSE_C */
3465*62c56f98SSadaf Ebrahimi
3466*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_CLI_C)
mbedtls_ssl_get_session(const mbedtls_ssl_context * ssl,mbedtls_ssl_session * dst)3467*62c56f98SSadaf Ebrahimi int mbedtls_ssl_get_session(const mbedtls_ssl_context *ssl,
3468*62c56f98SSadaf Ebrahimi mbedtls_ssl_session *dst)
3469*62c56f98SSadaf Ebrahimi {
3470*62c56f98SSadaf Ebrahimi int ret;
3471*62c56f98SSadaf Ebrahimi
3472*62c56f98SSadaf Ebrahimi if (ssl == NULL ||
3473*62c56f98SSadaf Ebrahimi dst == NULL ||
3474*62c56f98SSadaf Ebrahimi ssl->session == NULL ||
3475*62c56f98SSadaf Ebrahimi ssl->conf->endpoint != MBEDTLS_SSL_IS_CLIENT) {
3476*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
3477*62c56f98SSadaf Ebrahimi }
3478*62c56f98SSadaf Ebrahimi
3479*62c56f98SSadaf Ebrahimi /* Since Mbed TLS 3.0, mbedtls_ssl_get_session() is no longer
3480*62c56f98SSadaf Ebrahimi * idempotent: Each session can only be exported once.
3481*62c56f98SSadaf Ebrahimi *
3482*62c56f98SSadaf Ebrahimi * (This is in preparation for TLS 1.3 support where we will
3483*62c56f98SSadaf Ebrahimi * need the ability to export multiple sessions (aka tickets),
3484*62c56f98SSadaf Ebrahimi * which will be achieved by calling mbedtls_ssl_get_session()
3485*62c56f98SSadaf Ebrahimi * multiple times until it fails.)
3486*62c56f98SSadaf Ebrahimi *
3487*62c56f98SSadaf Ebrahimi * Check whether we have already exported the current session,
3488*62c56f98SSadaf Ebrahimi * and fail if so.
3489*62c56f98SSadaf Ebrahimi */
3490*62c56f98SSadaf Ebrahimi if (ssl->session->exported == 1) {
3491*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
3492*62c56f98SSadaf Ebrahimi }
3493*62c56f98SSadaf Ebrahimi
3494*62c56f98SSadaf Ebrahimi ret = mbedtls_ssl_session_copy(dst, ssl->session);
3495*62c56f98SSadaf Ebrahimi if (ret != 0) {
3496*62c56f98SSadaf Ebrahimi return ret;
3497*62c56f98SSadaf Ebrahimi }
3498*62c56f98SSadaf Ebrahimi
3499*62c56f98SSadaf Ebrahimi /* Remember that we've exported the session. */
3500*62c56f98SSadaf Ebrahimi ssl->session->exported = 1;
3501*62c56f98SSadaf Ebrahimi return 0;
3502*62c56f98SSadaf Ebrahimi }
3503*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_CLI_C */
3504*62c56f98SSadaf Ebrahimi
3505*62c56f98SSadaf Ebrahimi /*
3506*62c56f98SSadaf Ebrahimi * Define ticket header determining Mbed TLS version
3507*62c56f98SSadaf Ebrahimi * and structure of the ticket.
3508*62c56f98SSadaf Ebrahimi */
3509*62c56f98SSadaf Ebrahimi
3510*62c56f98SSadaf Ebrahimi /*
3511*62c56f98SSadaf Ebrahimi * Define bitflag determining compile-time settings influencing
3512*62c56f98SSadaf Ebrahimi * structure of serialized SSL sessions.
3513*62c56f98SSadaf Ebrahimi */
3514*62c56f98SSadaf Ebrahimi
3515*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_HAVE_TIME)
3516*62c56f98SSadaf Ebrahimi #define SSL_SERIALIZED_SESSION_CONFIG_TIME 1
3517*62c56f98SSadaf Ebrahimi #else
3518*62c56f98SSadaf Ebrahimi #define SSL_SERIALIZED_SESSION_CONFIG_TIME 0
3519*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_HAVE_TIME */
3520*62c56f98SSadaf Ebrahimi
3521*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_X509_CRT_PARSE_C)
3522*62c56f98SSadaf Ebrahimi #define SSL_SERIALIZED_SESSION_CONFIG_CRT 1
3523*62c56f98SSadaf Ebrahimi #else
3524*62c56f98SSadaf Ebrahimi #define SSL_SERIALIZED_SESSION_CONFIG_CRT 0
3525*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_X509_CRT_PARSE_C */
3526*62c56f98SSadaf Ebrahimi
3527*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_CLI_C) && defined(MBEDTLS_SSL_SESSION_TICKETS)
3528*62c56f98SSadaf Ebrahimi #define SSL_SERIALIZED_SESSION_CONFIG_CLIENT_TICKET 1
3529*62c56f98SSadaf Ebrahimi #else
3530*62c56f98SSadaf Ebrahimi #define SSL_SERIALIZED_SESSION_CONFIG_CLIENT_TICKET 0
3531*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_CLI_C && MBEDTLS_SSL_SESSION_TICKETS */
3532*62c56f98SSadaf Ebrahimi
3533*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
3534*62c56f98SSadaf Ebrahimi #define SSL_SERIALIZED_SESSION_CONFIG_MFL 1
3535*62c56f98SSadaf Ebrahimi #else
3536*62c56f98SSadaf Ebrahimi #define SSL_SERIALIZED_SESSION_CONFIG_MFL 0
3537*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
3538*62c56f98SSadaf Ebrahimi
3539*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
3540*62c56f98SSadaf Ebrahimi #define SSL_SERIALIZED_SESSION_CONFIG_ETM 1
3541*62c56f98SSadaf Ebrahimi #else
3542*62c56f98SSadaf Ebrahimi #define SSL_SERIALIZED_SESSION_CONFIG_ETM 0
3543*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
3544*62c56f98SSadaf Ebrahimi
3545*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_SESSION_TICKETS)
3546*62c56f98SSadaf Ebrahimi #define SSL_SERIALIZED_SESSION_CONFIG_TICKET 1
3547*62c56f98SSadaf Ebrahimi #else
3548*62c56f98SSadaf Ebrahimi #define SSL_SERIALIZED_SESSION_CONFIG_TICKET 0
3549*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_SESSION_TICKETS */
3550*62c56f98SSadaf Ebrahimi
3551*62c56f98SSadaf Ebrahimi #define SSL_SERIALIZED_SESSION_CONFIG_TIME_BIT 0
3552*62c56f98SSadaf Ebrahimi #define SSL_SERIALIZED_SESSION_CONFIG_CRT_BIT 1
3553*62c56f98SSadaf Ebrahimi #define SSL_SERIALIZED_SESSION_CONFIG_CLIENT_TICKET_BIT 2
3554*62c56f98SSadaf Ebrahimi #define SSL_SERIALIZED_SESSION_CONFIG_MFL_BIT 3
3555*62c56f98SSadaf Ebrahimi #define SSL_SERIALIZED_SESSION_CONFIG_ETM_BIT 4
3556*62c56f98SSadaf Ebrahimi #define SSL_SERIALIZED_SESSION_CONFIG_TICKET_BIT 5
3557*62c56f98SSadaf Ebrahimi
3558*62c56f98SSadaf Ebrahimi #define SSL_SERIALIZED_SESSION_CONFIG_BITFLAG \
3559*62c56f98SSadaf Ebrahimi ((uint16_t) ( \
3560*62c56f98SSadaf Ebrahimi (SSL_SERIALIZED_SESSION_CONFIG_TIME << SSL_SERIALIZED_SESSION_CONFIG_TIME_BIT) | \
3561*62c56f98SSadaf Ebrahimi (SSL_SERIALIZED_SESSION_CONFIG_CRT << SSL_SERIALIZED_SESSION_CONFIG_CRT_BIT) | \
3562*62c56f98SSadaf Ebrahimi (SSL_SERIALIZED_SESSION_CONFIG_CLIENT_TICKET << \
3563*62c56f98SSadaf Ebrahimi SSL_SERIALIZED_SESSION_CONFIG_CLIENT_TICKET_BIT) | \
3564*62c56f98SSadaf Ebrahimi (SSL_SERIALIZED_SESSION_CONFIG_MFL << SSL_SERIALIZED_SESSION_CONFIG_MFL_BIT) | \
3565*62c56f98SSadaf Ebrahimi (SSL_SERIALIZED_SESSION_CONFIG_ETM << SSL_SERIALIZED_SESSION_CONFIG_ETM_BIT) | \
3566*62c56f98SSadaf Ebrahimi (SSL_SERIALIZED_SESSION_CONFIG_TICKET << SSL_SERIALIZED_SESSION_CONFIG_TICKET_BIT)))
3567*62c56f98SSadaf Ebrahimi
3568*62c56f98SSadaf Ebrahimi static unsigned char ssl_serialized_session_header[] = {
3569*62c56f98SSadaf Ebrahimi MBEDTLS_VERSION_MAJOR,
3570*62c56f98SSadaf Ebrahimi MBEDTLS_VERSION_MINOR,
3571*62c56f98SSadaf Ebrahimi MBEDTLS_VERSION_PATCH,
3572*62c56f98SSadaf Ebrahimi MBEDTLS_BYTE_1(SSL_SERIALIZED_SESSION_CONFIG_BITFLAG),
3573*62c56f98SSadaf Ebrahimi MBEDTLS_BYTE_0(SSL_SERIALIZED_SESSION_CONFIG_BITFLAG),
3574*62c56f98SSadaf Ebrahimi };
3575*62c56f98SSadaf Ebrahimi
3576*62c56f98SSadaf Ebrahimi /*
3577*62c56f98SSadaf Ebrahimi * Serialize a session in the following format:
3578*62c56f98SSadaf Ebrahimi * (in the presentation language of TLS, RFC 8446 section 3)
3579*62c56f98SSadaf Ebrahimi *
3580*62c56f98SSadaf Ebrahimi * struct {
3581*62c56f98SSadaf Ebrahimi *
3582*62c56f98SSadaf Ebrahimi * opaque mbedtls_version[3]; // library version: major, minor, patch
3583*62c56f98SSadaf Ebrahimi * opaque session_format[2]; // library-version specific 16-bit field
3584*62c56f98SSadaf Ebrahimi * // determining the format of the remaining
3585*62c56f98SSadaf Ebrahimi * // serialized data.
3586*62c56f98SSadaf Ebrahimi *
3587*62c56f98SSadaf Ebrahimi * Note: When updating the format, remember to keep
3588*62c56f98SSadaf Ebrahimi * these version+format bytes.
3589*62c56f98SSadaf Ebrahimi *
3590*62c56f98SSadaf Ebrahimi * // In this version, `session_format` determines
3591*62c56f98SSadaf Ebrahimi * // the setting of those compile-time
3592*62c56f98SSadaf Ebrahimi * // configuration options which influence
3593*62c56f98SSadaf Ebrahimi * // the structure of mbedtls_ssl_session.
3594*62c56f98SSadaf Ebrahimi *
3595*62c56f98SSadaf Ebrahimi * uint8_t minor_ver; // Protocol minor version. Possible values:
3596*62c56f98SSadaf Ebrahimi * // - TLS 1.2 (0x0303)
3597*62c56f98SSadaf Ebrahimi * // - TLS 1.3 (0x0304)
3598*62c56f98SSadaf Ebrahimi *
3599*62c56f98SSadaf Ebrahimi * select (serialized_session.tls_version) {
3600*62c56f98SSadaf Ebrahimi *
3601*62c56f98SSadaf Ebrahimi * case MBEDTLS_SSL_VERSION_TLS1_2:
3602*62c56f98SSadaf Ebrahimi * serialized_session_tls12 data;
3603*62c56f98SSadaf Ebrahimi * case MBEDTLS_SSL_VERSION_TLS1_3:
3604*62c56f98SSadaf Ebrahimi * serialized_session_tls13 data;
3605*62c56f98SSadaf Ebrahimi *
3606*62c56f98SSadaf Ebrahimi * };
3607*62c56f98SSadaf Ebrahimi *
3608*62c56f98SSadaf Ebrahimi * } serialized_session;
3609*62c56f98SSadaf Ebrahimi *
3610*62c56f98SSadaf Ebrahimi */
3611*62c56f98SSadaf Ebrahimi
3612*62c56f98SSadaf Ebrahimi MBEDTLS_CHECK_RETURN_CRITICAL
ssl_session_save(const mbedtls_ssl_session * session,unsigned char omit_header,unsigned char * buf,size_t buf_len,size_t * olen)3613*62c56f98SSadaf Ebrahimi static int ssl_session_save(const mbedtls_ssl_session *session,
3614*62c56f98SSadaf Ebrahimi unsigned char omit_header,
3615*62c56f98SSadaf Ebrahimi unsigned char *buf,
3616*62c56f98SSadaf Ebrahimi size_t buf_len,
3617*62c56f98SSadaf Ebrahimi size_t *olen)
3618*62c56f98SSadaf Ebrahimi {
3619*62c56f98SSadaf Ebrahimi unsigned char *p = buf;
3620*62c56f98SSadaf Ebrahimi size_t used = 0;
3621*62c56f98SSadaf Ebrahimi size_t remaining_len;
3622*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_TLS1_3)
3623*62c56f98SSadaf Ebrahimi size_t out_len;
3624*62c56f98SSadaf Ebrahimi int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
3625*62c56f98SSadaf Ebrahimi #endif
3626*62c56f98SSadaf Ebrahimi if (session == NULL) {
3627*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
3628*62c56f98SSadaf Ebrahimi }
3629*62c56f98SSadaf Ebrahimi
3630*62c56f98SSadaf Ebrahimi if (!omit_header) {
3631*62c56f98SSadaf Ebrahimi /*
3632*62c56f98SSadaf Ebrahimi * Add Mbed TLS version identifier
3633*62c56f98SSadaf Ebrahimi */
3634*62c56f98SSadaf Ebrahimi used += sizeof(ssl_serialized_session_header);
3635*62c56f98SSadaf Ebrahimi
3636*62c56f98SSadaf Ebrahimi if (used <= buf_len) {
3637*62c56f98SSadaf Ebrahimi memcpy(p, ssl_serialized_session_header,
3638*62c56f98SSadaf Ebrahimi sizeof(ssl_serialized_session_header));
3639*62c56f98SSadaf Ebrahimi p += sizeof(ssl_serialized_session_header);
3640*62c56f98SSadaf Ebrahimi }
3641*62c56f98SSadaf Ebrahimi }
3642*62c56f98SSadaf Ebrahimi
3643*62c56f98SSadaf Ebrahimi /*
3644*62c56f98SSadaf Ebrahimi * TLS version identifier
3645*62c56f98SSadaf Ebrahimi */
3646*62c56f98SSadaf Ebrahimi used += 1;
3647*62c56f98SSadaf Ebrahimi if (used <= buf_len) {
3648*62c56f98SSadaf Ebrahimi *p++ = MBEDTLS_BYTE_0(session->tls_version);
3649*62c56f98SSadaf Ebrahimi }
3650*62c56f98SSadaf Ebrahimi
3651*62c56f98SSadaf Ebrahimi /* Forward to version-specific serialization routine. */
3652*62c56f98SSadaf Ebrahimi remaining_len = (buf_len >= used) ? buf_len - used : 0;
3653*62c56f98SSadaf Ebrahimi switch (session->tls_version) {
3654*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
3655*62c56f98SSadaf Ebrahimi case MBEDTLS_SSL_VERSION_TLS1_2:
3656*62c56f98SSadaf Ebrahimi used += ssl_tls12_session_save(session, p, remaining_len);
3657*62c56f98SSadaf Ebrahimi break;
3658*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
3659*62c56f98SSadaf Ebrahimi
3660*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_TLS1_3)
3661*62c56f98SSadaf Ebrahimi case MBEDTLS_SSL_VERSION_TLS1_3:
3662*62c56f98SSadaf Ebrahimi ret = ssl_tls13_session_save(session, p, remaining_len, &out_len);
3663*62c56f98SSadaf Ebrahimi if (ret != 0 && ret != MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL) {
3664*62c56f98SSadaf Ebrahimi return ret;
3665*62c56f98SSadaf Ebrahimi }
3666*62c56f98SSadaf Ebrahimi used += out_len;
3667*62c56f98SSadaf Ebrahimi break;
3668*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
3669*62c56f98SSadaf Ebrahimi
3670*62c56f98SSadaf Ebrahimi default:
3671*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
3672*62c56f98SSadaf Ebrahimi }
3673*62c56f98SSadaf Ebrahimi
3674*62c56f98SSadaf Ebrahimi *olen = used;
3675*62c56f98SSadaf Ebrahimi if (used > buf_len) {
3676*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL;
3677*62c56f98SSadaf Ebrahimi }
3678*62c56f98SSadaf Ebrahimi
3679*62c56f98SSadaf Ebrahimi return 0;
3680*62c56f98SSadaf Ebrahimi }
3681*62c56f98SSadaf Ebrahimi
3682*62c56f98SSadaf Ebrahimi /*
3683*62c56f98SSadaf Ebrahimi * Public wrapper for ssl_session_save()
3684*62c56f98SSadaf Ebrahimi */
mbedtls_ssl_session_save(const mbedtls_ssl_session * session,unsigned char * buf,size_t buf_len,size_t * olen)3685*62c56f98SSadaf Ebrahimi int mbedtls_ssl_session_save(const mbedtls_ssl_session *session,
3686*62c56f98SSadaf Ebrahimi unsigned char *buf,
3687*62c56f98SSadaf Ebrahimi size_t buf_len,
3688*62c56f98SSadaf Ebrahimi size_t *olen)
3689*62c56f98SSadaf Ebrahimi {
3690*62c56f98SSadaf Ebrahimi return ssl_session_save(session, 0, buf, buf_len, olen);
3691*62c56f98SSadaf Ebrahimi }
3692*62c56f98SSadaf Ebrahimi
3693*62c56f98SSadaf Ebrahimi /*
3694*62c56f98SSadaf Ebrahimi * Deserialize session, see mbedtls_ssl_session_save() for format.
3695*62c56f98SSadaf Ebrahimi *
3696*62c56f98SSadaf Ebrahimi * This internal version is wrapped by a public function that cleans up in
3697*62c56f98SSadaf Ebrahimi * case of error, and has an extra option omit_header.
3698*62c56f98SSadaf Ebrahimi */
3699*62c56f98SSadaf Ebrahimi MBEDTLS_CHECK_RETURN_CRITICAL
ssl_session_load(mbedtls_ssl_session * session,unsigned char omit_header,const unsigned char * buf,size_t len)3700*62c56f98SSadaf Ebrahimi static int ssl_session_load(mbedtls_ssl_session *session,
3701*62c56f98SSadaf Ebrahimi unsigned char omit_header,
3702*62c56f98SSadaf Ebrahimi const unsigned char *buf,
3703*62c56f98SSadaf Ebrahimi size_t len)
3704*62c56f98SSadaf Ebrahimi {
3705*62c56f98SSadaf Ebrahimi const unsigned char *p = buf;
3706*62c56f98SSadaf Ebrahimi const unsigned char * const end = buf + len;
3707*62c56f98SSadaf Ebrahimi size_t remaining_len;
3708*62c56f98SSadaf Ebrahimi
3709*62c56f98SSadaf Ebrahimi
3710*62c56f98SSadaf Ebrahimi if (session == NULL) {
3711*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
3712*62c56f98SSadaf Ebrahimi }
3713*62c56f98SSadaf Ebrahimi
3714*62c56f98SSadaf Ebrahimi if (!omit_header) {
3715*62c56f98SSadaf Ebrahimi /*
3716*62c56f98SSadaf Ebrahimi * Check Mbed TLS version identifier
3717*62c56f98SSadaf Ebrahimi */
3718*62c56f98SSadaf Ebrahimi
3719*62c56f98SSadaf Ebrahimi if ((size_t) (end - p) < sizeof(ssl_serialized_session_header)) {
3720*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
3721*62c56f98SSadaf Ebrahimi }
3722*62c56f98SSadaf Ebrahimi
3723*62c56f98SSadaf Ebrahimi if (memcmp(p, ssl_serialized_session_header,
3724*62c56f98SSadaf Ebrahimi sizeof(ssl_serialized_session_header)) != 0) {
3725*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_VERSION_MISMATCH;
3726*62c56f98SSadaf Ebrahimi }
3727*62c56f98SSadaf Ebrahimi p += sizeof(ssl_serialized_session_header);
3728*62c56f98SSadaf Ebrahimi }
3729*62c56f98SSadaf Ebrahimi
3730*62c56f98SSadaf Ebrahimi /*
3731*62c56f98SSadaf Ebrahimi * TLS version identifier
3732*62c56f98SSadaf Ebrahimi */
3733*62c56f98SSadaf Ebrahimi if (1 > (size_t) (end - p)) {
3734*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
3735*62c56f98SSadaf Ebrahimi }
3736*62c56f98SSadaf Ebrahimi session->tls_version = (mbedtls_ssl_protocol_version) (0x0300 | *p++);
3737*62c56f98SSadaf Ebrahimi
3738*62c56f98SSadaf Ebrahimi /* Dispatch according to TLS version. */
3739*62c56f98SSadaf Ebrahimi remaining_len = (end - p);
3740*62c56f98SSadaf Ebrahimi switch (session->tls_version) {
3741*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
3742*62c56f98SSadaf Ebrahimi case MBEDTLS_SSL_VERSION_TLS1_2:
3743*62c56f98SSadaf Ebrahimi return ssl_tls12_session_load(session, p, remaining_len);
3744*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
3745*62c56f98SSadaf Ebrahimi
3746*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_TLS1_3)
3747*62c56f98SSadaf Ebrahimi case MBEDTLS_SSL_VERSION_TLS1_3:
3748*62c56f98SSadaf Ebrahimi return ssl_tls13_session_load(session, p, remaining_len);
3749*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
3750*62c56f98SSadaf Ebrahimi
3751*62c56f98SSadaf Ebrahimi default:
3752*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
3753*62c56f98SSadaf Ebrahimi }
3754*62c56f98SSadaf Ebrahimi }
3755*62c56f98SSadaf Ebrahimi
3756*62c56f98SSadaf Ebrahimi /*
3757*62c56f98SSadaf Ebrahimi * Deserialize session: public wrapper for error cleaning
3758*62c56f98SSadaf Ebrahimi */
mbedtls_ssl_session_load(mbedtls_ssl_session * session,const unsigned char * buf,size_t len)3759*62c56f98SSadaf Ebrahimi int mbedtls_ssl_session_load(mbedtls_ssl_session *session,
3760*62c56f98SSadaf Ebrahimi const unsigned char *buf,
3761*62c56f98SSadaf Ebrahimi size_t len)
3762*62c56f98SSadaf Ebrahimi {
3763*62c56f98SSadaf Ebrahimi int ret = ssl_session_load(session, 0, buf, len);
3764*62c56f98SSadaf Ebrahimi
3765*62c56f98SSadaf Ebrahimi if (ret != 0) {
3766*62c56f98SSadaf Ebrahimi mbedtls_ssl_session_free(session);
3767*62c56f98SSadaf Ebrahimi }
3768*62c56f98SSadaf Ebrahimi
3769*62c56f98SSadaf Ebrahimi return ret;
3770*62c56f98SSadaf Ebrahimi }
3771*62c56f98SSadaf Ebrahimi
3772*62c56f98SSadaf Ebrahimi /*
3773*62c56f98SSadaf Ebrahimi * Perform a single step of the SSL handshake
3774*62c56f98SSadaf Ebrahimi */
3775*62c56f98SSadaf Ebrahimi MBEDTLS_CHECK_RETURN_CRITICAL
ssl_prepare_handshake_step(mbedtls_ssl_context * ssl)3776*62c56f98SSadaf Ebrahimi static int ssl_prepare_handshake_step(mbedtls_ssl_context *ssl)
3777*62c56f98SSadaf Ebrahimi {
3778*62c56f98SSadaf Ebrahimi int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
3779*62c56f98SSadaf Ebrahimi
3780*62c56f98SSadaf Ebrahimi /*
3781*62c56f98SSadaf Ebrahimi * We may have not been able to send to the peer all the handshake data
3782*62c56f98SSadaf Ebrahimi * that were written into the output buffer by the previous handshake step,
3783*62c56f98SSadaf Ebrahimi * if the write to the network callback returned with the
3784*62c56f98SSadaf Ebrahimi * #MBEDTLS_ERR_SSL_WANT_WRITE error code.
3785*62c56f98SSadaf Ebrahimi * We proceed to the next handshake step only when all data from the
3786*62c56f98SSadaf Ebrahimi * previous one have been sent to the peer, thus we make sure that this is
3787*62c56f98SSadaf Ebrahimi * the case here by calling `mbedtls_ssl_flush_output()`. The function may
3788*62c56f98SSadaf Ebrahimi * return with the #MBEDTLS_ERR_SSL_WANT_WRITE error code in which case
3789*62c56f98SSadaf Ebrahimi * we have to wait before to go ahead.
3790*62c56f98SSadaf Ebrahimi * In the case of TLS 1.3, handshake step handlers do not send data to the
3791*62c56f98SSadaf Ebrahimi * peer. Data are only sent here and through
3792*62c56f98SSadaf Ebrahimi * `mbedtls_ssl_handle_pending_alert` in case an error that triggered an
3793*62c56f98SSadaf Ebrahimi * alert occurred.
3794*62c56f98SSadaf Ebrahimi */
3795*62c56f98SSadaf Ebrahimi if ((ret = mbedtls_ssl_flush_output(ssl)) != 0) {
3796*62c56f98SSadaf Ebrahimi return ret;
3797*62c56f98SSadaf Ebrahimi }
3798*62c56f98SSadaf Ebrahimi
3799*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_DTLS)
3800*62c56f98SSadaf Ebrahimi if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
3801*62c56f98SSadaf Ebrahimi ssl->handshake->retransmit_state == MBEDTLS_SSL_RETRANS_SENDING) {
3802*62c56f98SSadaf Ebrahimi if ((ret = mbedtls_ssl_flight_transmit(ssl)) != 0) {
3803*62c56f98SSadaf Ebrahimi return ret;
3804*62c56f98SSadaf Ebrahimi }
3805*62c56f98SSadaf Ebrahimi }
3806*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_PROTO_DTLS */
3807*62c56f98SSadaf Ebrahimi
3808*62c56f98SSadaf Ebrahimi return ret;
3809*62c56f98SSadaf Ebrahimi }
3810*62c56f98SSadaf Ebrahimi
mbedtls_ssl_handshake_step(mbedtls_ssl_context * ssl)3811*62c56f98SSadaf Ebrahimi int mbedtls_ssl_handshake_step(mbedtls_ssl_context *ssl)
3812*62c56f98SSadaf Ebrahimi {
3813*62c56f98SSadaf Ebrahimi int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
3814*62c56f98SSadaf Ebrahimi
3815*62c56f98SSadaf Ebrahimi if (ssl == NULL ||
3816*62c56f98SSadaf Ebrahimi ssl->conf == NULL ||
3817*62c56f98SSadaf Ebrahimi ssl->handshake == NULL ||
3818*62c56f98SSadaf Ebrahimi ssl->state == MBEDTLS_SSL_HANDSHAKE_OVER) {
3819*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
3820*62c56f98SSadaf Ebrahimi }
3821*62c56f98SSadaf Ebrahimi
3822*62c56f98SSadaf Ebrahimi ret = ssl_prepare_handshake_step(ssl);
3823*62c56f98SSadaf Ebrahimi if (ret != 0) {
3824*62c56f98SSadaf Ebrahimi return ret;
3825*62c56f98SSadaf Ebrahimi }
3826*62c56f98SSadaf Ebrahimi
3827*62c56f98SSadaf Ebrahimi ret = mbedtls_ssl_handle_pending_alert(ssl);
3828*62c56f98SSadaf Ebrahimi if (ret != 0) {
3829*62c56f98SSadaf Ebrahimi goto cleanup;
3830*62c56f98SSadaf Ebrahimi }
3831*62c56f98SSadaf Ebrahimi
3832*62c56f98SSadaf Ebrahimi /* If ssl->conf->endpoint is not one of MBEDTLS_SSL_IS_CLIENT or
3833*62c56f98SSadaf Ebrahimi * MBEDTLS_SSL_IS_SERVER, this is the return code we give */
3834*62c56f98SSadaf Ebrahimi ret = MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
3835*62c56f98SSadaf Ebrahimi
3836*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_CLI_C)
3837*62c56f98SSadaf Ebrahimi if (ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT) {
3838*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(2, ("client state: %s",
3839*62c56f98SSadaf Ebrahimi mbedtls_ssl_states_str((mbedtls_ssl_states) ssl->state)));
3840*62c56f98SSadaf Ebrahimi
3841*62c56f98SSadaf Ebrahimi switch (ssl->state) {
3842*62c56f98SSadaf Ebrahimi case MBEDTLS_SSL_HELLO_REQUEST:
3843*62c56f98SSadaf Ebrahimi ssl->state = MBEDTLS_SSL_CLIENT_HELLO;
3844*62c56f98SSadaf Ebrahimi ret = 0;
3845*62c56f98SSadaf Ebrahimi break;
3846*62c56f98SSadaf Ebrahimi
3847*62c56f98SSadaf Ebrahimi case MBEDTLS_SSL_CLIENT_HELLO:
3848*62c56f98SSadaf Ebrahimi ret = mbedtls_ssl_write_client_hello(ssl);
3849*62c56f98SSadaf Ebrahimi break;
3850*62c56f98SSadaf Ebrahimi
3851*62c56f98SSadaf Ebrahimi default:
3852*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_TLS1_2) && defined(MBEDTLS_SSL_PROTO_TLS1_3)
3853*62c56f98SSadaf Ebrahimi if (ssl->tls_version == MBEDTLS_SSL_VERSION_TLS1_3) {
3854*62c56f98SSadaf Ebrahimi ret = mbedtls_ssl_tls13_handshake_client_step(ssl);
3855*62c56f98SSadaf Ebrahimi } else {
3856*62c56f98SSadaf Ebrahimi ret = mbedtls_ssl_handshake_client_step(ssl);
3857*62c56f98SSadaf Ebrahimi }
3858*62c56f98SSadaf Ebrahimi #elif defined(MBEDTLS_SSL_PROTO_TLS1_2)
3859*62c56f98SSadaf Ebrahimi ret = mbedtls_ssl_handshake_client_step(ssl);
3860*62c56f98SSadaf Ebrahimi #else
3861*62c56f98SSadaf Ebrahimi ret = mbedtls_ssl_tls13_handshake_client_step(ssl);
3862*62c56f98SSadaf Ebrahimi #endif
3863*62c56f98SSadaf Ebrahimi }
3864*62c56f98SSadaf Ebrahimi }
3865*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_CLI_C */
3866*62c56f98SSadaf Ebrahimi
3867*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_SRV_C)
3868*62c56f98SSadaf Ebrahimi if (ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER) {
3869*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_TLS1_2) && defined(MBEDTLS_SSL_PROTO_TLS1_3)
3870*62c56f98SSadaf Ebrahimi if (ssl->tls_version == MBEDTLS_SSL_VERSION_TLS1_3) {
3871*62c56f98SSadaf Ebrahimi ret = mbedtls_ssl_tls13_handshake_server_step(ssl);
3872*62c56f98SSadaf Ebrahimi } else {
3873*62c56f98SSadaf Ebrahimi ret = mbedtls_ssl_handshake_server_step(ssl);
3874*62c56f98SSadaf Ebrahimi }
3875*62c56f98SSadaf Ebrahimi #elif defined(MBEDTLS_SSL_PROTO_TLS1_2)
3876*62c56f98SSadaf Ebrahimi ret = mbedtls_ssl_handshake_server_step(ssl);
3877*62c56f98SSadaf Ebrahimi #else
3878*62c56f98SSadaf Ebrahimi ret = mbedtls_ssl_tls13_handshake_server_step(ssl);
3879*62c56f98SSadaf Ebrahimi #endif
3880*62c56f98SSadaf Ebrahimi }
3881*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_SRV_C */
3882*62c56f98SSadaf Ebrahimi
3883*62c56f98SSadaf Ebrahimi if (ret != 0) {
3884*62c56f98SSadaf Ebrahimi /* handshake_step return error. And it is same
3885*62c56f98SSadaf Ebrahimi * with alert_reason.
3886*62c56f98SSadaf Ebrahimi */
3887*62c56f98SSadaf Ebrahimi if (ssl->send_alert) {
3888*62c56f98SSadaf Ebrahimi ret = mbedtls_ssl_handle_pending_alert(ssl);
3889*62c56f98SSadaf Ebrahimi goto cleanup;
3890*62c56f98SSadaf Ebrahimi }
3891*62c56f98SSadaf Ebrahimi }
3892*62c56f98SSadaf Ebrahimi
3893*62c56f98SSadaf Ebrahimi cleanup:
3894*62c56f98SSadaf Ebrahimi return ret;
3895*62c56f98SSadaf Ebrahimi }
3896*62c56f98SSadaf Ebrahimi
3897*62c56f98SSadaf Ebrahimi /*
3898*62c56f98SSadaf Ebrahimi * Perform the SSL handshake
3899*62c56f98SSadaf Ebrahimi */
mbedtls_ssl_handshake(mbedtls_ssl_context * ssl)3900*62c56f98SSadaf Ebrahimi int mbedtls_ssl_handshake(mbedtls_ssl_context *ssl)
3901*62c56f98SSadaf Ebrahimi {
3902*62c56f98SSadaf Ebrahimi int ret = 0;
3903*62c56f98SSadaf Ebrahimi
3904*62c56f98SSadaf Ebrahimi /* Sanity checks */
3905*62c56f98SSadaf Ebrahimi
3906*62c56f98SSadaf Ebrahimi if (ssl == NULL || ssl->conf == NULL) {
3907*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
3908*62c56f98SSadaf Ebrahimi }
3909*62c56f98SSadaf Ebrahimi
3910*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_DTLS)
3911*62c56f98SSadaf Ebrahimi if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
3912*62c56f98SSadaf Ebrahimi (ssl->f_set_timer == NULL || ssl->f_get_timer == NULL)) {
3913*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(1, ("You must use "
3914*62c56f98SSadaf Ebrahimi "mbedtls_ssl_set_timer_cb() for DTLS"));
3915*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
3916*62c56f98SSadaf Ebrahimi }
3917*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_PROTO_DTLS */
3918*62c56f98SSadaf Ebrahimi
3919*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(2, ("=> handshake"));
3920*62c56f98SSadaf Ebrahimi
3921*62c56f98SSadaf Ebrahimi /* Main handshake loop */
3922*62c56f98SSadaf Ebrahimi while (ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER) {
3923*62c56f98SSadaf Ebrahimi ret = mbedtls_ssl_handshake_step(ssl);
3924*62c56f98SSadaf Ebrahimi
3925*62c56f98SSadaf Ebrahimi if (ret != 0) {
3926*62c56f98SSadaf Ebrahimi break;
3927*62c56f98SSadaf Ebrahimi }
3928*62c56f98SSadaf Ebrahimi }
3929*62c56f98SSadaf Ebrahimi
3930*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(2, ("<= handshake"));
3931*62c56f98SSadaf Ebrahimi
3932*62c56f98SSadaf Ebrahimi return ret;
3933*62c56f98SSadaf Ebrahimi }
3934*62c56f98SSadaf Ebrahimi
3935*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_RENEGOTIATION)
3936*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_SRV_C)
3937*62c56f98SSadaf Ebrahimi /*
3938*62c56f98SSadaf Ebrahimi * Write HelloRequest to request renegotiation on server
3939*62c56f98SSadaf Ebrahimi */
3940*62c56f98SSadaf Ebrahimi MBEDTLS_CHECK_RETURN_CRITICAL
ssl_write_hello_request(mbedtls_ssl_context * ssl)3941*62c56f98SSadaf Ebrahimi static int ssl_write_hello_request(mbedtls_ssl_context *ssl)
3942*62c56f98SSadaf Ebrahimi {
3943*62c56f98SSadaf Ebrahimi int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
3944*62c56f98SSadaf Ebrahimi
3945*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(2, ("=> write hello request"));
3946*62c56f98SSadaf Ebrahimi
3947*62c56f98SSadaf Ebrahimi ssl->out_msglen = 4;
3948*62c56f98SSadaf Ebrahimi ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
3949*62c56f98SSadaf Ebrahimi ssl->out_msg[0] = MBEDTLS_SSL_HS_HELLO_REQUEST;
3950*62c56f98SSadaf Ebrahimi
3951*62c56f98SSadaf Ebrahimi if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
3952*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
3953*62c56f98SSadaf Ebrahimi return ret;
3954*62c56f98SSadaf Ebrahimi }
3955*62c56f98SSadaf Ebrahimi
3956*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(2, ("<= write hello request"));
3957*62c56f98SSadaf Ebrahimi
3958*62c56f98SSadaf Ebrahimi return 0;
3959*62c56f98SSadaf Ebrahimi }
3960*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_SRV_C */
3961*62c56f98SSadaf Ebrahimi
3962*62c56f98SSadaf Ebrahimi /*
3963*62c56f98SSadaf Ebrahimi * Actually renegotiate current connection, triggered by either:
3964*62c56f98SSadaf Ebrahimi * - any side: calling mbedtls_ssl_renegotiate(),
3965*62c56f98SSadaf Ebrahimi * - client: receiving a HelloRequest during mbedtls_ssl_read(),
3966*62c56f98SSadaf Ebrahimi * - server: receiving any handshake message on server during mbedtls_ssl_read() after
3967*62c56f98SSadaf Ebrahimi * the initial handshake is completed.
3968*62c56f98SSadaf Ebrahimi * If the handshake doesn't complete due to waiting for I/O, it will continue
3969*62c56f98SSadaf Ebrahimi * during the next calls to mbedtls_ssl_renegotiate() or mbedtls_ssl_read() respectively.
3970*62c56f98SSadaf Ebrahimi */
mbedtls_ssl_start_renegotiation(mbedtls_ssl_context * ssl)3971*62c56f98SSadaf Ebrahimi int mbedtls_ssl_start_renegotiation(mbedtls_ssl_context *ssl)
3972*62c56f98SSadaf Ebrahimi {
3973*62c56f98SSadaf Ebrahimi int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
3974*62c56f98SSadaf Ebrahimi
3975*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(2, ("=> renegotiate"));
3976*62c56f98SSadaf Ebrahimi
3977*62c56f98SSadaf Ebrahimi if ((ret = ssl_handshake_init(ssl)) != 0) {
3978*62c56f98SSadaf Ebrahimi return ret;
3979*62c56f98SSadaf Ebrahimi }
3980*62c56f98SSadaf Ebrahimi
3981*62c56f98SSadaf Ebrahimi /* RFC 6347 4.2.2: "[...] the HelloRequest will have message_seq = 0 and
3982*62c56f98SSadaf Ebrahimi * the ServerHello will have message_seq = 1" */
3983*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_DTLS)
3984*62c56f98SSadaf Ebrahimi if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
3985*62c56f98SSadaf Ebrahimi ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_PENDING) {
3986*62c56f98SSadaf Ebrahimi if (ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER) {
3987*62c56f98SSadaf Ebrahimi ssl->handshake->out_msg_seq = 1;
3988*62c56f98SSadaf Ebrahimi } else {
3989*62c56f98SSadaf Ebrahimi ssl->handshake->in_msg_seq = 1;
3990*62c56f98SSadaf Ebrahimi }
3991*62c56f98SSadaf Ebrahimi }
3992*62c56f98SSadaf Ebrahimi #endif
3993*62c56f98SSadaf Ebrahimi
3994*62c56f98SSadaf Ebrahimi ssl->state = MBEDTLS_SSL_HELLO_REQUEST;
3995*62c56f98SSadaf Ebrahimi ssl->renego_status = MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS;
3996*62c56f98SSadaf Ebrahimi
3997*62c56f98SSadaf Ebrahimi if ((ret = mbedtls_ssl_handshake(ssl)) != 0) {
3998*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_handshake", ret);
3999*62c56f98SSadaf Ebrahimi return ret;
4000*62c56f98SSadaf Ebrahimi }
4001*62c56f98SSadaf Ebrahimi
4002*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(2, ("<= renegotiate"));
4003*62c56f98SSadaf Ebrahimi
4004*62c56f98SSadaf Ebrahimi return 0;
4005*62c56f98SSadaf Ebrahimi }
4006*62c56f98SSadaf Ebrahimi
4007*62c56f98SSadaf Ebrahimi /*
4008*62c56f98SSadaf Ebrahimi * Renegotiate current connection on client,
4009*62c56f98SSadaf Ebrahimi * or request renegotiation on server
4010*62c56f98SSadaf Ebrahimi */
mbedtls_ssl_renegotiate(mbedtls_ssl_context * ssl)4011*62c56f98SSadaf Ebrahimi int mbedtls_ssl_renegotiate(mbedtls_ssl_context *ssl)
4012*62c56f98SSadaf Ebrahimi {
4013*62c56f98SSadaf Ebrahimi int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
4014*62c56f98SSadaf Ebrahimi
4015*62c56f98SSadaf Ebrahimi if (ssl == NULL || ssl->conf == NULL) {
4016*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
4017*62c56f98SSadaf Ebrahimi }
4018*62c56f98SSadaf Ebrahimi
4019*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_SRV_C)
4020*62c56f98SSadaf Ebrahimi /* On server, just send the request */
4021*62c56f98SSadaf Ebrahimi if (ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER) {
4022*62c56f98SSadaf Ebrahimi if (mbedtls_ssl_is_handshake_over(ssl) == 0) {
4023*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
4024*62c56f98SSadaf Ebrahimi }
4025*62c56f98SSadaf Ebrahimi
4026*62c56f98SSadaf Ebrahimi ssl->renego_status = MBEDTLS_SSL_RENEGOTIATION_PENDING;
4027*62c56f98SSadaf Ebrahimi
4028*62c56f98SSadaf Ebrahimi /* Did we already try/start sending HelloRequest? */
4029*62c56f98SSadaf Ebrahimi if (ssl->out_left != 0) {
4030*62c56f98SSadaf Ebrahimi return mbedtls_ssl_flush_output(ssl);
4031*62c56f98SSadaf Ebrahimi }
4032*62c56f98SSadaf Ebrahimi
4033*62c56f98SSadaf Ebrahimi return ssl_write_hello_request(ssl);
4034*62c56f98SSadaf Ebrahimi }
4035*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_SRV_C */
4036*62c56f98SSadaf Ebrahimi
4037*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_CLI_C)
4038*62c56f98SSadaf Ebrahimi /*
4039*62c56f98SSadaf Ebrahimi * On client, either start the renegotiation process or,
4040*62c56f98SSadaf Ebrahimi * if already in progress, continue the handshake
4041*62c56f98SSadaf Ebrahimi */
4042*62c56f98SSadaf Ebrahimi if (ssl->renego_status != MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS) {
4043*62c56f98SSadaf Ebrahimi if (mbedtls_ssl_is_handshake_over(ssl) == 0) {
4044*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
4045*62c56f98SSadaf Ebrahimi }
4046*62c56f98SSadaf Ebrahimi
4047*62c56f98SSadaf Ebrahimi if ((ret = mbedtls_ssl_start_renegotiation(ssl)) != 0) {
4048*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_start_renegotiation", ret);
4049*62c56f98SSadaf Ebrahimi return ret;
4050*62c56f98SSadaf Ebrahimi }
4051*62c56f98SSadaf Ebrahimi } else {
4052*62c56f98SSadaf Ebrahimi if ((ret = mbedtls_ssl_handshake(ssl)) != 0) {
4053*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_handshake", ret);
4054*62c56f98SSadaf Ebrahimi return ret;
4055*62c56f98SSadaf Ebrahimi }
4056*62c56f98SSadaf Ebrahimi }
4057*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_CLI_C */
4058*62c56f98SSadaf Ebrahimi
4059*62c56f98SSadaf Ebrahimi return ret;
4060*62c56f98SSadaf Ebrahimi }
4061*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_RENEGOTIATION */
4062*62c56f98SSadaf Ebrahimi
mbedtls_ssl_handshake_free(mbedtls_ssl_context * ssl)4063*62c56f98SSadaf Ebrahimi void mbedtls_ssl_handshake_free(mbedtls_ssl_context *ssl)
4064*62c56f98SSadaf Ebrahimi {
4065*62c56f98SSadaf Ebrahimi mbedtls_ssl_handshake_params *handshake = ssl->handshake;
4066*62c56f98SSadaf Ebrahimi
4067*62c56f98SSadaf Ebrahimi if (handshake == NULL) {
4068*62c56f98SSadaf Ebrahimi return;
4069*62c56f98SSadaf Ebrahimi }
4070*62c56f98SSadaf Ebrahimi
4071*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PK_HAVE_ECC_KEYS)
4072*62c56f98SSadaf Ebrahimi #if !defined(MBEDTLS_DEPRECATED_REMOVED)
4073*62c56f98SSadaf Ebrahimi if (ssl->handshake->group_list_heap_allocated) {
4074*62c56f98SSadaf Ebrahimi mbedtls_free((void *) handshake->group_list);
4075*62c56f98SSadaf Ebrahimi }
4076*62c56f98SSadaf Ebrahimi handshake->group_list = NULL;
4077*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_DEPRECATED_REMOVED */
4078*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_PK_HAVE_ECC_KEYS */
4079*62c56f98SSadaf Ebrahimi
4080*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED)
4081*62c56f98SSadaf Ebrahimi #if !defined(MBEDTLS_DEPRECATED_REMOVED)
4082*62c56f98SSadaf Ebrahimi if (ssl->handshake->sig_algs_heap_allocated) {
4083*62c56f98SSadaf Ebrahimi mbedtls_free((void *) handshake->sig_algs);
4084*62c56f98SSadaf Ebrahimi }
4085*62c56f98SSadaf Ebrahimi handshake->sig_algs = NULL;
4086*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_DEPRECATED_REMOVED */
4087*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_TLS1_3)
4088*62c56f98SSadaf Ebrahimi if (ssl->handshake->certificate_request_context) {
4089*62c56f98SSadaf Ebrahimi mbedtls_free((void *) handshake->certificate_request_context);
4090*62c56f98SSadaf Ebrahimi }
4091*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
4092*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED */
4093*62c56f98SSadaf Ebrahimi
4094*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
4095*62c56f98SSadaf Ebrahimi if (ssl->conf->f_async_cancel != NULL && handshake->async_in_progress != 0) {
4096*62c56f98SSadaf Ebrahimi ssl->conf->f_async_cancel(ssl);
4097*62c56f98SSadaf Ebrahimi handshake->async_in_progress = 0;
4098*62c56f98SSadaf Ebrahimi }
4099*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
4100*62c56f98SSadaf Ebrahimi
4101*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA256)
4102*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO)
4103*62c56f98SSadaf Ebrahimi psa_hash_abort(&handshake->fin_sha256_psa);
4104*62c56f98SSadaf Ebrahimi #else
4105*62c56f98SSadaf Ebrahimi mbedtls_md_free(&handshake->fin_sha256);
4106*62c56f98SSadaf Ebrahimi #endif
4107*62c56f98SSadaf Ebrahimi #endif
4108*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA384)
4109*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO)
4110*62c56f98SSadaf Ebrahimi psa_hash_abort(&handshake->fin_sha384_psa);
4111*62c56f98SSadaf Ebrahimi #else
4112*62c56f98SSadaf Ebrahimi mbedtls_md_free(&handshake->fin_sha384);
4113*62c56f98SSadaf Ebrahimi #endif
4114*62c56f98SSadaf Ebrahimi #endif
4115*62c56f98SSadaf Ebrahimi
4116*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_DHM_C)
4117*62c56f98SSadaf Ebrahimi mbedtls_dhm_free(&handshake->dhm_ctx);
4118*62c56f98SSadaf Ebrahimi #endif
4119*62c56f98SSadaf Ebrahimi #if !defined(MBEDTLS_USE_PSA_CRYPTO) && \
4120*62c56f98SSadaf Ebrahimi defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED)
4121*62c56f98SSadaf Ebrahimi mbedtls_ecdh_free(&handshake->ecdh_ctx);
4122*62c56f98SSadaf Ebrahimi #endif
4123*62c56f98SSadaf Ebrahimi
4124*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
4125*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO)
4126*62c56f98SSadaf Ebrahimi psa_pake_abort(&handshake->psa_pake_ctx);
4127*62c56f98SSadaf Ebrahimi /*
4128*62c56f98SSadaf Ebrahimi * Opaque keys are not stored in the handshake's data and it's the user
4129*62c56f98SSadaf Ebrahimi * responsibility to destroy them. Clear ones, instead, are created by
4130*62c56f98SSadaf Ebrahimi * the TLS library and should be destroyed at the same level
4131*62c56f98SSadaf Ebrahimi */
4132*62c56f98SSadaf Ebrahimi if (!mbedtls_svc_key_id_is_null(handshake->psa_pake_password)) {
4133*62c56f98SSadaf Ebrahimi psa_destroy_key(handshake->psa_pake_password);
4134*62c56f98SSadaf Ebrahimi }
4135*62c56f98SSadaf Ebrahimi handshake->psa_pake_password = MBEDTLS_SVC_KEY_ID_INIT;
4136*62c56f98SSadaf Ebrahimi #else
4137*62c56f98SSadaf Ebrahimi mbedtls_ecjpake_free(&handshake->ecjpake_ctx);
4138*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_USE_PSA_CRYPTO */
4139*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_CLI_C)
4140*62c56f98SSadaf Ebrahimi mbedtls_free(handshake->ecjpake_cache);
4141*62c56f98SSadaf Ebrahimi handshake->ecjpake_cache = NULL;
4142*62c56f98SSadaf Ebrahimi handshake->ecjpake_cache_len = 0;
4143*62c56f98SSadaf Ebrahimi #endif
4144*62c56f98SSadaf Ebrahimi #endif
4145*62c56f98SSadaf Ebrahimi
4146*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_ANY_ENABLED) || \
4147*62c56f98SSadaf Ebrahimi defined(MBEDTLS_KEY_EXCHANGE_WITH_ECDSA_ANY_ENABLED) || \
4148*62c56f98SSadaf Ebrahimi defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
4149*62c56f98SSadaf Ebrahimi /* explicit void pointer cast for buggy MS compiler */
4150*62c56f98SSadaf Ebrahimi mbedtls_free((void *) handshake->curves_tls_id);
4151*62c56f98SSadaf Ebrahimi #endif
4152*62c56f98SSadaf Ebrahimi
4153*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_PSK_ENABLED)
4154*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO)
4155*62c56f98SSadaf Ebrahimi if (!mbedtls_svc_key_id_is_null(ssl->handshake->psk_opaque)) {
4156*62c56f98SSadaf Ebrahimi /* The maintenance of the external PSK key slot is the
4157*62c56f98SSadaf Ebrahimi * user's responsibility. */
4158*62c56f98SSadaf Ebrahimi if (ssl->handshake->psk_opaque_is_internal) {
4159*62c56f98SSadaf Ebrahimi psa_destroy_key(ssl->handshake->psk_opaque);
4160*62c56f98SSadaf Ebrahimi ssl->handshake->psk_opaque_is_internal = 0;
4161*62c56f98SSadaf Ebrahimi }
4162*62c56f98SSadaf Ebrahimi ssl->handshake->psk_opaque = MBEDTLS_SVC_KEY_ID_INIT;
4163*62c56f98SSadaf Ebrahimi }
4164*62c56f98SSadaf Ebrahimi #else
4165*62c56f98SSadaf Ebrahimi if (handshake->psk != NULL) {
4166*62c56f98SSadaf Ebrahimi mbedtls_zeroize_and_free(handshake->psk, handshake->psk_len);
4167*62c56f98SSadaf Ebrahimi }
4168*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_USE_PSA_CRYPTO */
4169*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_HANDSHAKE_WITH_PSK_ENABLED */
4170*62c56f98SSadaf Ebrahimi
4171*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_X509_CRT_PARSE_C) && \
4172*62c56f98SSadaf Ebrahimi defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
4173*62c56f98SSadaf Ebrahimi /*
4174*62c56f98SSadaf Ebrahimi * Free only the linked list wrapper, not the keys themselves
4175*62c56f98SSadaf Ebrahimi * since the belong to the SNI callback
4176*62c56f98SSadaf Ebrahimi */
4177*62c56f98SSadaf Ebrahimi ssl_key_cert_free(handshake->sni_key_cert);
4178*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_X509_CRT_PARSE_C && MBEDTLS_SSL_SERVER_NAME_INDICATION */
4179*62c56f98SSadaf Ebrahimi
4180*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
4181*62c56f98SSadaf Ebrahimi mbedtls_x509_crt_restart_free(&handshake->ecrs_ctx);
4182*62c56f98SSadaf Ebrahimi if (handshake->ecrs_peer_cert != NULL) {
4183*62c56f98SSadaf Ebrahimi mbedtls_x509_crt_free(handshake->ecrs_peer_cert);
4184*62c56f98SSadaf Ebrahimi mbedtls_free(handshake->ecrs_peer_cert);
4185*62c56f98SSadaf Ebrahimi }
4186*62c56f98SSadaf Ebrahimi #endif
4187*62c56f98SSadaf Ebrahimi
4188*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_X509_CRT_PARSE_C) && \
4189*62c56f98SSadaf Ebrahimi !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
4190*62c56f98SSadaf Ebrahimi mbedtls_pk_free(&handshake->peer_pubkey);
4191*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_X509_CRT_PARSE_C && !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
4192*62c56f98SSadaf Ebrahimi
4193*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_CLI_C) && \
4194*62c56f98SSadaf Ebrahimi (defined(MBEDTLS_SSL_PROTO_DTLS) || defined(MBEDTLS_SSL_PROTO_TLS1_3))
4195*62c56f98SSadaf Ebrahimi mbedtls_free(handshake->cookie);
4196*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_CLI_C &&
4197*62c56f98SSadaf Ebrahimi ( MBEDTLS_SSL_PROTO_DTLS || MBEDTLS_SSL_PROTO_TLS1_3 ) */
4198*62c56f98SSadaf Ebrahimi
4199*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_DTLS)
4200*62c56f98SSadaf Ebrahimi mbedtls_ssl_flight_free(handshake->flight);
4201*62c56f98SSadaf Ebrahimi mbedtls_ssl_buffering_free(ssl);
4202*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_PROTO_DTLS */
4203*62c56f98SSadaf Ebrahimi
4204*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_KEY_EXCHANGE_SOME_XXDH_PSA_ANY_ENABLED)
4205*62c56f98SSadaf Ebrahimi if (handshake->xxdh_psa_privkey_is_external == 0) {
4206*62c56f98SSadaf Ebrahimi psa_destroy_key(handshake->xxdh_psa_privkey);
4207*62c56f98SSadaf Ebrahimi }
4208*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_KEY_EXCHANGE_SOME_XXDH_PSA_ANY_ENABLED */
4209*62c56f98SSadaf Ebrahimi
4210*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_TLS1_3)
4211*62c56f98SSadaf Ebrahimi mbedtls_ssl_transform_free(handshake->transform_handshake);
4212*62c56f98SSadaf Ebrahimi mbedtls_free(handshake->transform_handshake);
4213*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_EARLY_DATA)
4214*62c56f98SSadaf Ebrahimi mbedtls_ssl_transform_free(handshake->transform_earlydata);
4215*62c56f98SSadaf Ebrahimi mbedtls_free(handshake->transform_earlydata);
4216*62c56f98SSadaf Ebrahimi #endif
4217*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
4218*62c56f98SSadaf Ebrahimi
4219*62c56f98SSadaf Ebrahimi
4220*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
4221*62c56f98SSadaf Ebrahimi /* If the buffers are too big - reallocate. Because of the way Mbed TLS
4222*62c56f98SSadaf Ebrahimi * processes datagrams and the fact that a datagram is allowed to have
4223*62c56f98SSadaf Ebrahimi * several records in it, it is possible that the I/O buffers are not
4224*62c56f98SSadaf Ebrahimi * empty at this stage */
4225*62c56f98SSadaf Ebrahimi handle_buffer_resizing(ssl, 1, mbedtls_ssl_get_input_buflen(ssl),
4226*62c56f98SSadaf Ebrahimi mbedtls_ssl_get_output_buflen(ssl));
4227*62c56f98SSadaf Ebrahimi #endif
4228*62c56f98SSadaf Ebrahimi
4229*62c56f98SSadaf Ebrahimi /* mbedtls_platform_zeroize MUST be last one in this function */
4230*62c56f98SSadaf Ebrahimi mbedtls_platform_zeroize(handshake,
4231*62c56f98SSadaf Ebrahimi sizeof(mbedtls_ssl_handshake_params));
4232*62c56f98SSadaf Ebrahimi }
4233*62c56f98SSadaf Ebrahimi
mbedtls_ssl_session_free(mbedtls_ssl_session * session)4234*62c56f98SSadaf Ebrahimi void mbedtls_ssl_session_free(mbedtls_ssl_session *session)
4235*62c56f98SSadaf Ebrahimi {
4236*62c56f98SSadaf Ebrahimi if (session == NULL) {
4237*62c56f98SSadaf Ebrahimi return;
4238*62c56f98SSadaf Ebrahimi }
4239*62c56f98SSadaf Ebrahimi
4240*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_X509_CRT_PARSE_C)
4241*62c56f98SSadaf Ebrahimi ssl_clear_peer_cert(session);
4242*62c56f98SSadaf Ebrahimi #endif
4243*62c56f98SSadaf Ebrahimi
4244*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C)
4245*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_TLS1_3) && \
4246*62c56f98SSadaf Ebrahimi defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
4247*62c56f98SSadaf Ebrahimi mbedtls_free(session->hostname);
4248*62c56f98SSadaf Ebrahimi #endif
4249*62c56f98SSadaf Ebrahimi mbedtls_free(session->ticket);
4250*62c56f98SSadaf Ebrahimi #endif
4251*62c56f98SSadaf Ebrahimi
4252*62c56f98SSadaf Ebrahimi mbedtls_platform_zeroize(session, sizeof(mbedtls_ssl_session));
4253*62c56f98SSadaf Ebrahimi }
4254*62c56f98SSadaf Ebrahimi
4255*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_CONTEXT_SERIALIZATION)
4256*62c56f98SSadaf Ebrahimi
4257*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
4258*62c56f98SSadaf Ebrahimi #define SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_CONNECTION_ID 1u
4259*62c56f98SSadaf Ebrahimi #else
4260*62c56f98SSadaf Ebrahimi #define SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_CONNECTION_ID 0u
4261*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
4262*62c56f98SSadaf Ebrahimi
4263*62c56f98SSadaf Ebrahimi #define SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_BADMAC_LIMIT 1u
4264*62c56f98SSadaf Ebrahimi
4265*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
4266*62c56f98SSadaf Ebrahimi #define SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_ANTI_REPLAY 1u
4267*62c56f98SSadaf Ebrahimi #else
4268*62c56f98SSadaf Ebrahimi #define SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_ANTI_REPLAY 0u
4269*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_DTLS_ANTI_REPLAY */
4270*62c56f98SSadaf Ebrahimi
4271*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_ALPN)
4272*62c56f98SSadaf Ebrahimi #define SSL_SERIALIZED_CONTEXT_CONFIG_ALPN 1u
4273*62c56f98SSadaf Ebrahimi #else
4274*62c56f98SSadaf Ebrahimi #define SSL_SERIALIZED_CONTEXT_CONFIG_ALPN 0u
4275*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_ALPN */
4276*62c56f98SSadaf Ebrahimi
4277*62c56f98SSadaf Ebrahimi #define SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_CONNECTION_ID_BIT 0
4278*62c56f98SSadaf Ebrahimi #define SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_BADMAC_LIMIT_BIT 1
4279*62c56f98SSadaf Ebrahimi #define SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_ANTI_REPLAY_BIT 2
4280*62c56f98SSadaf Ebrahimi #define SSL_SERIALIZED_CONTEXT_CONFIG_ALPN_BIT 3
4281*62c56f98SSadaf Ebrahimi
4282*62c56f98SSadaf Ebrahimi #define SSL_SERIALIZED_CONTEXT_CONFIG_BITFLAG \
4283*62c56f98SSadaf Ebrahimi ((uint32_t) ( \
4284*62c56f98SSadaf Ebrahimi (SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_CONNECTION_ID << \
4285*62c56f98SSadaf Ebrahimi SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_CONNECTION_ID_BIT) | \
4286*62c56f98SSadaf Ebrahimi (SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_BADMAC_LIMIT << \
4287*62c56f98SSadaf Ebrahimi SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_BADMAC_LIMIT_BIT) | \
4288*62c56f98SSadaf Ebrahimi (SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_ANTI_REPLAY << \
4289*62c56f98SSadaf Ebrahimi SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_ANTI_REPLAY_BIT) | \
4290*62c56f98SSadaf Ebrahimi (SSL_SERIALIZED_CONTEXT_CONFIG_ALPN << SSL_SERIALIZED_CONTEXT_CONFIG_ALPN_BIT) | \
4291*62c56f98SSadaf Ebrahimi 0u))
4292*62c56f98SSadaf Ebrahimi
4293*62c56f98SSadaf Ebrahimi static unsigned char ssl_serialized_context_header[] = {
4294*62c56f98SSadaf Ebrahimi MBEDTLS_VERSION_MAJOR,
4295*62c56f98SSadaf Ebrahimi MBEDTLS_VERSION_MINOR,
4296*62c56f98SSadaf Ebrahimi MBEDTLS_VERSION_PATCH,
4297*62c56f98SSadaf Ebrahimi MBEDTLS_BYTE_1(SSL_SERIALIZED_SESSION_CONFIG_BITFLAG),
4298*62c56f98SSadaf Ebrahimi MBEDTLS_BYTE_0(SSL_SERIALIZED_SESSION_CONFIG_BITFLAG),
4299*62c56f98SSadaf Ebrahimi MBEDTLS_BYTE_2(SSL_SERIALIZED_CONTEXT_CONFIG_BITFLAG),
4300*62c56f98SSadaf Ebrahimi MBEDTLS_BYTE_1(SSL_SERIALIZED_CONTEXT_CONFIG_BITFLAG),
4301*62c56f98SSadaf Ebrahimi MBEDTLS_BYTE_0(SSL_SERIALIZED_CONTEXT_CONFIG_BITFLAG),
4302*62c56f98SSadaf Ebrahimi };
4303*62c56f98SSadaf Ebrahimi
4304*62c56f98SSadaf Ebrahimi /*
4305*62c56f98SSadaf Ebrahimi * Serialize a full SSL context
4306*62c56f98SSadaf Ebrahimi *
4307*62c56f98SSadaf Ebrahimi * The format of the serialized data is:
4308*62c56f98SSadaf Ebrahimi * (in the presentation language of TLS, RFC 8446 section 3)
4309*62c56f98SSadaf Ebrahimi *
4310*62c56f98SSadaf Ebrahimi * // header
4311*62c56f98SSadaf Ebrahimi * opaque mbedtls_version[3]; // major, minor, patch
4312*62c56f98SSadaf Ebrahimi * opaque context_format[5]; // version-specific field determining
4313*62c56f98SSadaf Ebrahimi * // the format of the remaining
4314*62c56f98SSadaf Ebrahimi * // serialized data.
4315*62c56f98SSadaf Ebrahimi * Note: When updating the format, remember to keep these
4316*62c56f98SSadaf Ebrahimi * version+format bytes. (We may make their size part of the API.)
4317*62c56f98SSadaf Ebrahimi *
4318*62c56f98SSadaf Ebrahimi * // session sub-structure
4319*62c56f98SSadaf Ebrahimi * opaque session<1..2^32-1>; // see mbedtls_ssl_session_save()
4320*62c56f98SSadaf Ebrahimi * // transform sub-structure
4321*62c56f98SSadaf Ebrahimi * uint8 random[64]; // ServerHello.random+ClientHello.random
4322*62c56f98SSadaf Ebrahimi * uint8 in_cid<0..2^8-1> // Connection ID: expected incoming value
4323*62c56f98SSadaf Ebrahimi * uint8 out_cid<0..2^8-1> // Connection ID: outgoing value to use
4324*62c56f98SSadaf Ebrahimi * // fields from ssl_context
4325*62c56f98SSadaf Ebrahimi * uint32 badmac_seen; // DTLS: number of records with failing MAC
4326*62c56f98SSadaf Ebrahimi * uint64 in_window_top; // DTLS: last validated record seq_num
4327*62c56f98SSadaf Ebrahimi * uint64 in_window; // DTLS: bitmask for replay protection
4328*62c56f98SSadaf Ebrahimi * uint8 disable_datagram_packing; // DTLS: only one record per datagram
4329*62c56f98SSadaf Ebrahimi * uint64 cur_out_ctr; // Record layer: outgoing sequence number
4330*62c56f98SSadaf Ebrahimi * uint16 mtu; // DTLS: path mtu (max outgoing fragment size)
4331*62c56f98SSadaf Ebrahimi * uint8 alpn_chosen<0..2^8-1> // ALPN: negotiated application protocol
4332*62c56f98SSadaf Ebrahimi *
4333*62c56f98SSadaf Ebrahimi * Note that many fields of the ssl_context or sub-structures are not
4334*62c56f98SSadaf Ebrahimi * serialized, as they fall in one of the following categories:
4335*62c56f98SSadaf Ebrahimi *
4336*62c56f98SSadaf Ebrahimi * 1. forced value (eg in_left must be 0)
4337*62c56f98SSadaf Ebrahimi * 2. pointer to dynamically-allocated memory (eg session, transform)
4338*62c56f98SSadaf Ebrahimi * 3. value can be re-derived from other data (eg session keys from MS)
4339*62c56f98SSadaf Ebrahimi * 4. value was temporary (eg content of input buffer)
4340*62c56f98SSadaf Ebrahimi * 5. value will be provided by the user again (eg I/O callbacks and context)
4341*62c56f98SSadaf Ebrahimi */
mbedtls_ssl_context_save(mbedtls_ssl_context * ssl,unsigned char * buf,size_t buf_len,size_t * olen)4342*62c56f98SSadaf Ebrahimi int mbedtls_ssl_context_save(mbedtls_ssl_context *ssl,
4343*62c56f98SSadaf Ebrahimi unsigned char *buf,
4344*62c56f98SSadaf Ebrahimi size_t buf_len,
4345*62c56f98SSadaf Ebrahimi size_t *olen)
4346*62c56f98SSadaf Ebrahimi {
4347*62c56f98SSadaf Ebrahimi unsigned char *p = buf;
4348*62c56f98SSadaf Ebrahimi size_t used = 0;
4349*62c56f98SSadaf Ebrahimi size_t session_len;
4350*62c56f98SSadaf Ebrahimi int ret = 0;
4351*62c56f98SSadaf Ebrahimi
4352*62c56f98SSadaf Ebrahimi /*
4353*62c56f98SSadaf Ebrahimi * Enforce usage restrictions, see "return BAD_INPUT_DATA" in
4354*62c56f98SSadaf Ebrahimi * this function's documentation.
4355*62c56f98SSadaf Ebrahimi *
4356*62c56f98SSadaf Ebrahimi * These are due to assumptions/limitations in the implementation. Some of
4357*62c56f98SSadaf Ebrahimi * them are likely to stay (no handshake in progress) some might go away
4358*62c56f98SSadaf Ebrahimi * (only DTLS) but are currently used to simplify the implementation.
4359*62c56f98SSadaf Ebrahimi */
4360*62c56f98SSadaf Ebrahimi /* The initial handshake must be over */
4361*62c56f98SSadaf Ebrahimi if (mbedtls_ssl_is_handshake_over(ssl) == 0) {
4362*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(1, ("Initial handshake isn't over"));
4363*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
4364*62c56f98SSadaf Ebrahimi }
4365*62c56f98SSadaf Ebrahimi if (ssl->handshake != NULL) {
4366*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(1, ("Handshake isn't completed"));
4367*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
4368*62c56f98SSadaf Ebrahimi }
4369*62c56f98SSadaf Ebrahimi /* Double-check that sub-structures are indeed ready */
4370*62c56f98SSadaf Ebrahimi if (ssl->transform == NULL || ssl->session == NULL) {
4371*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(1, ("Serialised structures aren't ready"));
4372*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
4373*62c56f98SSadaf Ebrahimi }
4374*62c56f98SSadaf Ebrahimi /* There must be no pending incoming or outgoing data */
4375*62c56f98SSadaf Ebrahimi if (mbedtls_ssl_check_pending(ssl) != 0) {
4376*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(1, ("There is pending incoming data"));
4377*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
4378*62c56f98SSadaf Ebrahimi }
4379*62c56f98SSadaf Ebrahimi if (ssl->out_left != 0) {
4380*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(1, ("There is pending outgoing data"));
4381*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
4382*62c56f98SSadaf Ebrahimi }
4383*62c56f98SSadaf Ebrahimi /* Protocol must be DTLS, not TLS */
4384*62c56f98SSadaf Ebrahimi if (ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
4385*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(1, ("Only DTLS is supported"));
4386*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
4387*62c56f98SSadaf Ebrahimi }
4388*62c56f98SSadaf Ebrahimi /* Version must be 1.2 */
4389*62c56f98SSadaf Ebrahimi if (ssl->tls_version != MBEDTLS_SSL_VERSION_TLS1_2) {
4390*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(1, ("Only version 1.2 supported"));
4391*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
4392*62c56f98SSadaf Ebrahimi }
4393*62c56f98SSadaf Ebrahimi /* We must be using an AEAD ciphersuite */
4394*62c56f98SSadaf Ebrahimi if (mbedtls_ssl_transform_uses_aead(ssl->transform) != 1) {
4395*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(1, ("Only AEAD ciphersuites supported"));
4396*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
4397*62c56f98SSadaf Ebrahimi }
4398*62c56f98SSadaf Ebrahimi /* Renegotiation must not be enabled */
4399*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_RENEGOTIATION)
4400*62c56f98SSadaf Ebrahimi if (ssl->conf->disable_renegotiation != MBEDTLS_SSL_RENEGOTIATION_DISABLED) {
4401*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(1, ("Renegotiation must not be enabled"));
4402*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
4403*62c56f98SSadaf Ebrahimi }
4404*62c56f98SSadaf Ebrahimi #endif
4405*62c56f98SSadaf Ebrahimi
4406*62c56f98SSadaf Ebrahimi /*
4407*62c56f98SSadaf Ebrahimi * Version and format identifier
4408*62c56f98SSadaf Ebrahimi */
4409*62c56f98SSadaf Ebrahimi used += sizeof(ssl_serialized_context_header);
4410*62c56f98SSadaf Ebrahimi
4411*62c56f98SSadaf Ebrahimi if (used <= buf_len) {
4412*62c56f98SSadaf Ebrahimi memcpy(p, ssl_serialized_context_header,
4413*62c56f98SSadaf Ebrahimi sizeof(ssl_serialized_context_header));
4414*62c56f98SSadaf Ebrahimi p += sizeof(ssl_serialized_context_header);
4415*62c56f98SSadaf Ebrahimi }
4416*62c56f98SSadaf Ebrahimi
4417*62c56f98SSadaf Ebrahimi /*
4418*62c56f98SSadaf Ebrahimi * Session (length + data)
4419*62c56f98SSadaf Ebrahimi */
4420*62c56f98SSadaf Ebrahimi ret = ssl_session_save(ssl->session, 1, NULL, 0, &session_len);
4421*62c56f98SSadaf Ebrahimi if (ret != MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL) {
4422*62c56f98SSadaf Ebrahimi return ret;
4423*62c56f98SSadaf Ebrahimi }
4424*62c56f98SSadaf Ebrahimi
4425*62c56f98SSadaf Ebrahimi used += 4 + session_len;
4426*62c56f98SSadaf Ebrahimi if (used <= buf_len) {
4427*62c56f98SSadaf Ebrahimi MBEDTLS_PUT_UINT32_BE(session_len, p, 0);
4428*62c56f98SSadaf Ebrahimi p += 4;
4429*62c56f98SSadaf Ebrahimi
4430*62c56f98SSadaf Ebrahimi ret = ssl_session_save(ssl->session, 1,
4431*62c56f98SSadaf Ebrahimi p, session_len, &session_len);
4432*62c56f98SSadaf Ebrahimi if (ret != 0) {
4433*62c56f98SSadaf Ebrahimi return ret;
4434*62c56f98SSadaf Ebrahimi }
4435*62c56f98SSadaf Ebrahimi
4436*62c56f98SSadaf Ebrahimi p += session_len;
4437*62c56f98SSadaf Ebrahimi }
4438*62c56f98SSadaf Ebrahimi
4439*62c56f98SSadaf Ebrahimi /*
4440*62c56f98SSadaf Ebrahimi * Transform
4441*62c56f98SSadaf Ebrahimi */
4442*62c56f98SSadaf Ebrahimi used += sizeof(ssl->transform->randbytes);
4443*62c56f98SSadaf Ebrahimi if (used <= buf_len) {
4444*62c56f98SSadaf Ebrahimi memcpy(p, ssl->transform->randbytes,
4445*62c56f98SSadaf Ebrahimi sizeof(ssl->transform->randbytes));
4446*62c56f98SSadaf Ebrahimi p += sizeof(ssl->transform->randbytes);
4447*62c56f98SSadaf Ebrahimi }
4448*62c56f98SSadaf Ebrahimi
4449*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
4450*62c56f98SSadaf Ebrahimi used += 2 + ssl->transform->in_cid_len + ssl->transform->out_cid_len;
4451*62c56f98SSadaf Ebrahimi if (used <= buf_len) {
4452*62c56f98SSadaf Ebrahimi *p++ = ssl->transform->in_cid_len;
4453*62c56f98SSadaf Ebrahimi memcpy(p, ssl->transform->in_cid, ssl->transform->in_cid_len);
4454*62c56f98SSadaf Ebrahimi p += ssl->transform->in_cid_len;
4455*62c56f98SSadaf Ebrahimi
4456*62c56f98SSadaf Ebrahimi *p++ = ssl->transform->out_cid_len;
4457*62c56f98SSadaf Ebrahimi memcpy(p, ssl->transform->out_cid, ssl->transform->out_cid_len);
4458*62c56f98SSadaf Ebrahimi p += ssl->transform->out_cid_len;
4459*62c56f98SSadaf Ebrahimi }
4460*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
4461*62c56f98SSadaf Ebrahimi
4462*62c56f98SSadaf Ebrahimi /*
4463*62c56f98SSadaf Ebrahimi * Saved fields from top-level ssl_context structure
4464*62c56f98SSadaf Ebrahimi */
4465*62c56f98SSadaf Ebrahimi used += 4;
4466*62c56f98SSadaf Ebrahimi if (used <= buf_len) {
4467*62c56f98SSadaf Ebrahimi MBEDTLS_PUT_UINT32_BE(ssl->badmac_seen, p, 0);
4468*62c56f98SSadaf Ebrahimi p += 4;
4469*62c56f98SSadaf Ebrahimi }
4470*62c56f98SSadaf Ebrahimi
4471*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
4472*62c56f98SSadaf Ebrahimi used += 16;
4473*62c56f98SSadaf Ebrahimi if (used <= buf_len) {
4474*62c56f98SSadaf Ebrahimi MBEDTLS_PUT_UINT64_BE(ssl->in_window_top, p, 0);
4475*62c56f98SSadaf Ebrahimi p += 8;
4476*62c56f98SSadaf Ebrahimi
4477*62c56f98SSadaf Ebrahimi MBEDTLS_PUT_UINT64_BE(ssl->in_window, p, 0);
4478*62c56f98SSadaf Ebrahimi p += 8;
4479*62c56f98SSadaf Ebrahimi }
4480*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_DTLS_ANTI_REPLAY */
4481*62c56f98SSadaf Ebrahimi
4482*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_DTLS)
4483*62c56f98SSadaf Ebrahimi used += 1;
4484*62c56f98SSadaf Ebrahimi if (used <= buf_len) {
4485*62c56f98SSadaf Ebrahimi *p++ = ssl->disable_datagram_packing;
4486*62c56f98SSadaf Ebrahimi }
4487*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_PROTO_DTLS */
4488*62c56f98SSadaf Ebrahimi
4489*62c56f98SSadaf Ebrahimi used += MBEDTLS_SSL_SEQUENCE_NUMBER_LEN;
4490*62c56f98SSadaf Ebrahimi if (used <= buf_len) {
4491*62c56f98SSadaf Ebrahimi memcpy(p, ssl->cur_out_ctr, MBEDTLS_SSL_SEQUENCE_NUMBER_LEN);
4492*62c56f98SSadaf Ebrahimi p += MBEDTLS_SSL_SEQUENCE_NUMBER_LEN;
4493*62c56f98SSadaf Ebrahimi }
4494*62c56f98SSadaf Ebrahimi
4495*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_DTLS)
4496*62c56f98SSadaf Ebrahimi used += 2;
4497*62c56f98SSadaf Ebrahimi if (used <= buf_len) {
4498*62c56f98SSadaf Ebrahimi MBEDTLS_PUT_UINT16_BE(ssl->mtu, p, 0);
4499*62c56f98SSadaf Ebrahimi p += 2;
4500*62c56f98SSadaf Ebrahimi }
4501*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_PROTO_DTLS */
4502*62c56f98SSadaf Ebrahimi
4503*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_ALPN)
4504*62c56f98SSadaf Ebrahimi {
4505*62c56f98SSadaf Ebrahimi const uint8_t alpn_len = ssl->alpn_chosen
4506*62c56f98SSadaf Ebrahimi ? (uint8_t) strlen(ssl->alpn_chosen)
4507*62c56f98SSadaf Ebrahimi : 0;
4508*62c56f98SSadaf Ebrahimi
4509*62c56f98SSadaf Ebrahimi used += 1 + alpn_len;
4510*62c56f98SSadaf Ebrahimi if (used <= buf_len) {
4511*62c56f98SSadaf Ebrahimi *p++ = alpn_len;
4512*62c56f98SSadaf Ebrahimi
4513*62c56f98SSadaf Ebrahimi if (ssl->alpn_chosen != NULL) {
4514*62c56f98SSadaf Ebrahimi memcpy(p, ssl->alpn_chosen, alpn_len);
4515*62c56f98SSadaf Ebrahimi p += alpn_len;
4516*62c56f98SSadaf Ebrahimi }
4517*62c56f98SSadaf Ebrahimi }
4518*62c56f98SSadaf Ebrahimi }
4519*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_ALPN */
4520*62c56f98SSadaf Ebrahimi
4521*62c56f98SSadaf Ebrahimi /*
4522*62c56f98SSadaf Ebrahimi * Done
4523*62c56f98SSadaf Ebrahimi */
4524*62c56f98SSadaf Ebrahimi *olen = used;
4525*62c56f98SSadaf Ebrahimi
4526*62c56f98SSadaf Ebrahimi if (used > buf_len) {
4527*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL;
4528*62c56f98SSadaf Ebrahimi }
4529*62c56f98SSadaf Ebrahimi
4530*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_BUF(4, "saved context", buf, used);
4531*62c56f98SSadaf Ebrahimi
4532*62c56f98SSadaf Ebrahimi return mbedtls_ssl_session_reset_int(ssl, 0);
4533*62c56f98SSadaf Ebrahimi }
4534*62c56f98SSadaf Ebrahimi
4535*62c56f98SSadaf Ebrahimi /*
4536*62c56f98SSadaf Ebrahimi * Deserialize context, see mbedtls_ssl_context_save() for format.
4537*62c56f98SSadaf Ebrahimi *
4538*62c56f98SSadaf Ebrahimi * This internal version is wrapped by a public function that cleans up in
4539*62c56f98SSadaf Ebrahimi * case of error.
4540*62c56f98SSadaf Ebrahimi */
4541*62c56f98SSadaf Ebrahimi MBEDTLS_CHECK_RETURN_CRITICAL
ssl_context_load(mbedtls_ssl_context * ssl,const unsigned char * buf,size_t len)4542*62c56f98SSadaf Ebrahimi static int ssl_context_load(mbedtls_ssl_context *ssl,
4543*62c56f98SSadaf Ebrahimi const unsigned char *buf,
4544*62c56f98SSadaf Ebrahimi size_t len)
4545*62c56f98SSadaf Ebrahimi {
4546*62c56f98SSadaf Ebrahimi const unsigned char *p = buf;
4547*62c56f98SSadaf Ebrahimi const unsigned char * const end = buf + len;
4548*62c56f98SSadaf Ebrahimi size_t session_len;
4549*62c56f98SSadaf Ebrahimi int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
4550*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
4551*62c56f98SSadaf Ebrahimi tls_prf_fn prf_func = NULL;
4552*62c56f98SSadaf Ebrahimi #endif
4553*62c56f98SSadaf Ebrahimi
4554*62c56f98SSadaf Ebrahimi /*
4555*62c56f98SSadaf Ebrahimi * The context should have been freshly setup or reset.
4556*62c56f98SSadaf Ebrahimi * Give the user an error in case of obvious misuse.
4557*62c56f98SSadaf Ebrahimi * (Checking session is useful because it won't be NULL if we're
4558*62c56f98SSadaf Ebrahimi * renegotiating, or if the user mistakenly loaded a session first.)
4559*62c56f98SSadaf Ebrahimi */
4560*62c56f98SSadaf Ebrahimi if (ssl->state != MBEDTLS_SSL_HELLO_REQUEST ||
4561*62c56f98SSadaf Ebrahimi ssl->session != NULL) {
4562*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
4563*62c56f98SSadaf Ebrahimi }
4564*62c56f98SSadaf Ebrahimi
4565*62c56f98SSadaf Ebrahimi /*
4566*62c56f98SSadaf Ebrahimi * We can't check that the config matches the initial one, but we can at
4567*62c56f98SSadaf Ebrahimi * least check it matches the requirements for serializing.
4568*62c56f98SSadaf Ebrahimi */
4569*62c56f98SSadaf Ebrahimi if (
4570*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_RENEGOTIATION)
4571*62c56f98SSadaf Ebrahimi ssl->conf->disable_renegotiation != MBEDTLS_SSL_RENEGOTIATION_DISABLED ||
4572*62c56f98SSadaf Ebrahimi #endif
4573*62c56f98SSadaf Ebrahimi ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM ||
4574*62c56f98SSadaf Ebrahimi ssl->conf->max_tls_version < MBEDTLS_SSL_VERSION_TLS1_2 ||
4575*62c56f98SSadaf Ebrahimi ssl->conf->min_tls_version > MBEDTLS_SSL_VERSION_TLS1_2
4576*62c56f98SSadaf Ebrahimi ) {
4577*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
4578*62c56f98SSadaf Ebrahimi }
4579*62c56f98SSadaf Ebrahimi
4580*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_BUF(4, "context to load", buf, len);
4581*62c56f98SSadaf Ebrahimi
4582*62c56f98SSadaf Ebrahimi /*
4583*62c56f98SSadaf Ebrahimi * Check version identifier
4584*62c56f98SSadaf Ebrahimi */
4585*62c56f98SSadaf Ebrahimi if ((size_t) (end - p) < sizeof(ssl_serialized_context_header)) {
4586*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
4587*62c56f98SSadaf Ebrahimi }
4588*62c56f98SSadaf Ebrahimi
4589*62c56f98SSadaf Ebrahimi if (memcmp(p, ssl_serialized_context_header,
4590*62c56f98SSadaf Ebrahimi sizeof(ssl_serialized_context_header)) != 0) {
4591*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_VERSION_MISMATCH;
4592*62c56f98SSadaf Ebrahimi }
4593*62c56f98SSadaf Ebrahimi p += sizeof(ssl_serialized_context_header);
4594*62c56f98SSadaf Ebrahimi
4595*62c56f98SSadaf Ebrahimi /*
4596*62c56f98SSadaf Ebrahimi * Session
4597*62c56f98SSadaf Ebrahimi */
4598*62c56f98SSadaf Ebrahimi if ((size_t) (end - p) < 4) {
4599*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
4600*62c56f98SSadaf Ebrahimi }
4601*62c56f98SSadaf Ebrahimi
4602*62c56f98SSadaf Ebrahimi session_len = MBEDTLS_GET_UINT32_BE(p, 0);
4603*62c56f98SSadaf Ebrahimi p += 4;
4604*62c56f98SSadaf Ebrahimi
4605*62c56f98SSadaf Ebrahimi /* This has been allocated by ssl_handshake_init(), called by
4606*62c56f98SSadaf Ebrahimi * by either mbedtls_ssl_session_reset_int() or mbedtls_ssl_setup(). */
4607*62c56f98SSadaf Ebrahimi ssl->session = ssl->session_negotiate;
4608*62c56f98SSadaf Ebrahimi ssl->session_in = ssl->session;
4609*62c56f98SSadaf Ebrahimi ssl->session_out = ssl->session;
4610*62c56f98SSadaf Ebrahimi ssl->session_negotiate = NULL;
4611*62c56f98SSadaf Ebrahimi
4612*62c56f98SSadaf Ebrahimi if ((size_t) (end - p) < session_len) {
4613*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
4614*62c56f98SSadaf Ebrahimi }
4615*62c56f98SSadaf Ebrahimi
4616*62c56f98SSadaf Ebrahimi ret = ssl_session_load(ssl->session, 1, p, session_len);
4617*62c56f98SSadaf Ebrahimi if (ret != 0) {
4618*62c56f98SSadaf Ebrahimi mbedtls_ssl_session_free(ssl->session);
4619*62c56f98SSadaf Ebrahimi return ret;
4620*62c56f98SSadaf Ebrahimi }
4621*62c56f98SSadaf Ebrahimi
4622*62c56f98SSadaf Ebrahimi p += session_len;
4623*62c56f98SSadaf Ebrahimi
4624*62c56f98SSadaf Ebrahimi /*
4625*62c56f98SSadaf Ebrahimi * Transform
4626*62c56f98SSadaf Ebrahimi */
4627*62c56f98SSadaf Ebrahimi
4628*62c56f98SSadaf Ebrahimi /* This has been allocated by ssl_handshake_init(), called by
4629*62c56f98SSadaf Ebrahimi * by either mbedtls_ssl_session_reset_int() or mbedtls_ssl_setup(). */
4630*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
4631*62c56f98SSadaf Ebrahimi ssl->transform = ssl->transform_negotiate;
4632*62c56f98SSadaf Ebrahimi ssl->transform_in = ssl->transform;
4633*62c56f98SSadaf Ebrahimi ssl->transform_out = ssl->transform;
4634*62c56f98SSadaf Ebrahimi ssl->transform_negotiate = NULL;
4635*62c56f98SSadaf Ebrahimi #endif
4636*62c56f98SSadaf Ebrahimi
4637*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
4638*62c56f98SSadaf Ebrahimi prf_func = ssl_tls12prf_from_cs(ssl->session->ciphersuite);
4639*62c56f98SSadaf Ebrahimi if (prf_func == NULL) {
4640*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
4641*62c56f98SSadaf Ebrahimi }
4642*62c56f98SSadaf Ebrahimi
4643*62c56f98SSadaf Ebrahimi /* Read random bytes and populate structure */
4644*62c56f98SSadaf Ebrahimi if ((size_t) (end - p) < sizeof(ssl->transform->randbytes)) {
4645*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
4646*62c56f98SSadaf Ebrahimi }
4647*62c56f98SSadaf Ebrahimi
4648*62c56f98SSadaf Ebrahimi ret = ssl_tls12_populate_transform(ssl->transform,
4649*62c56f98SSadaf Ebrahimi ssl->session->ciphersuite,
4650*62c56f98SSadaf Ebrahimi ssl->session->master,
4651*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM)
4652*62c56f98SSadaf Ebrahimi ssl->session->encrypt_then_mac,
4653*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM */
4654*62c56f98SSadaf Ebrahimi prf_func,
4655*62c56f98SSadaf Ebrahimi p, /* currently pointing to randbytes */
4656*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_VERSION_TLS1_2, /* (D)TLS 1.2 is forced */
4657*62c56f98SSadaf Ebrahimi ssl->conf->endpoint,
4658*62c56f98SSadaf Ebrahimi ssl);
4659*62c56f98SSadaf Ebrahimi if (ret != 0) {
4660*62c56f98SSadaf Ebrahimi return ret;
4661*62c56f98SSadaf Ebrahimi }
4662*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
4663*62c56f98SSadaf Ebrahimi p += sizeof(ssl->transform->randbytes);
4664*62c56f98SSadaf Ebrahimi
4665*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
4666*62c56f98SSadaf Ebrahimi /* Read connection IDs and store them */
4667*62c56f98SSadaf Ebrahimi if ((size_t) (end - p) < 1) {
4668*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
4669*62c56f98SSadaf Ebrahimi }
4670*62c56f98SSadaf Ebrahimi
4671*62c56f98SSadaf Ebrahimi ssl->transform->in_cid_len = *p++;
4672*62c56f98SSadaf Ebrahimi
4673*62c56f98SSadaf Ebrahimi if ((size_t) (end - p) < ssl->transform->in_cid_len + 1u) {
4674*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
4675*62c56f98SSadaf Ebrahimi }
4676*62c56f98SSadaf Ebrahimi
4677*62c56f98SSadaf Ebrahimi memcpy(ssl->transform->in_cid, p, ssl->transform->in_cid_len);
4678*62c56f98SSadaf Ebrahimi p += ssl->transform->in_cid_len;
4679*62c56f98SSadaf Ebrahimi
4680*62c56f98SSadaf Ebrahimi ssl->transform->out_cid_len = *p++;
4681*62c56f98SSadaf Ebrahimi
4682*62c56f98SSadaf Ebrahimi if ((size_t) (end - p) < ssl->transform->out_cid_len) {
4683*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
4684*62c56f98SSadaf Ebrahimi }
4685*62c56f98SSadaf Ebrahimi
4686*62c56f98SSadaf Ebrahimi memcpy(ssl->transform->out_cid, p, ssl->transform->out_cid_len);
4687*62c56f98SSadaf Ebrahimi p += ssl->transform->out_cid_len;
4688*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
4689*62c56f98SSadaf Ebrahimi
4690*62c56f98SSadaf Ebrahimi /*
4691*62c56f98SSadaf Ebrahimi * Saved fields from top-level ssl_context structure
4692*62c56f98SSadaf Ebrahimi */
4693*62c56f98SSadaf Ebrahimi if ((size_t) (end - p) < 4) {
4694*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
4695*62c56f98SSadaf Ebrahimi }
4696*62c56f98SSadaf Ebrahimi
4697*62c56f98SSadaf Ebrahimi ssl->badmac_seen = MBEDTLS_GET_UINT32_BE(p, 0);
4698*62c56f98SSadaf Ebrahimi p += 4;
4699*62c56f98SSadaf Ebrahimi
4700*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
4701*62c56f98SSadaf Ebrahimi if ((size_t) (end - p) < 16) {
4702*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
4703*62c56f98SSadaf Ebrahimi }
4704*62c56f98SSadaf Ebrahimi
4705*62c56f98SSadaf Ebrahimi ssl->in_window_top = MBEDTLS_GET_UINT64_BE(p, 0);
4706*62c56f98SSadaf Ebrahimi p += 8;
4707*62c56f98SSadaf Ebrahimi
4708*62c56f98SSadaf Ebrahimi ssl->in_window = MBEDTLS_GET_UINT64_BE(p, 0);
4709*62c56f98SSadaf Ebrahimi p += 8;
4710*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_DTLS_ANTI_REPLAY */
4711*62c56f98SSadaf Ebrahimi
4712*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_DTLS)
4713*62c56f98SSadaf Ebrahimi if ((size_t) (end - p) < 1) {
4714*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
4715*62c56f98SSadaf Ebrahimi }
4716*62c56f98SSadaf Ebrahimi
4717*62c56f98SSadaf Ebrahimi ssl->disable_datagram_packing = *p++;
4718*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_PROTO_DTLS */
4719*62c56f98SSadaf Ebrahimi
4720*62c56f98SSadaf Ebrahimi if ((size_t) (end - p) < sizeof(ssl->cur_out_ctr)) {
4721*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
4722*62c56f98SSadaf Ebrahimi }
4723*62c56f98SSadaf Ebrahimi memcpy(ssl->cur_out_ctr, p, sizeof(ssl->cur_out_ctr));
4724*62c56f98SSadaf Ebrahimi p += sizeof(ssl->cur_out_ctr);
4725*62c56f98SSadaf Ebrahimi
4726*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_DTLS)
4727*62c56f98SSadaf Ebrahimi if ((size_t) (end - p) < 2) {
4728*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
4729*62c56f98SSadaf Ebrahimi }
4730*62c56f98SSadaf Ebrahimi
4731*62c56f98SSadaf Ebrahimi ssl->mtu = (p[0] << 8) | p[1];
4732*62c56f98SSadaf Ebrahimi p += 2;
4733*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_PROTO_DTLS */
4734*62c56f98SSadaf Ebrahimi
4735*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_ALPN)
4736*62c56f98SSadaf Ebrahimi {
4737*62c56f98SSadaf Ebrahimi uint8_t alpn_len;
4738*62c56f98SSadaf Ebrahimi const char **cur;
4739*62c56f98SSadaf Ebrahimi
4740*62c56f98SSadaf Ebrahimi if ((size_t) (end - p) < 1) {
4741*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
4742*62c56f98SSadaf Ebrahimi }
4743*62c56f98SSadaf Ebrahimi
4744*62c56f98SSadaf Ebrahimi alpn_len = *p++;
4745*62c56f98SSadaf Ebrahimi
4746*62c56f98SSadaf Ebrahimi if (alpn_len != 0 && ssl->conf->alpn_list != NULL) {
4747*62c56f98SSadaf Ebrahimi /* alpn_chosen should point to an item in the configured list */
4748*62c56f98SSadaf Ebrahimi for (cur = ssl->conf->alpn_list; *cur != NULL; cur++) {
4749*62c56f98SSadaf Ebrahimi if (strlen(*cur) == alpn_len &&
4750*62c56f98SSadaf Ebrahimi memcmp(p, cur, alpn_len) == 0) {
4751*62c56f98SSadaf Ebrahimi ssl->alpn_chosen = *cur;
4752*62c56f98SSadaf Ebrahimi break;
4753*62c56f98SSadaf Ebrahimi }
4754*62c56f98SSadaf Ebrahimi }
4755*62c56f98SSadaf Ebrahimi }
4756*62c56f98SSadaf Ebrahimi
4757*62c56f98SSadaf Ebrahimi /* can only happen on conf mismatch */
4758*62c56f98SSadaf Ebrahimi if (alpn_len != 0 && ssl->alpn_chosen == NULL) {
4759*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
4760*62c56f98SSadaf Ebrahimi }
4761*62c56f98SSadaf Ebrahimi
4762*62c56f98SSadaf Ebrahimi p += alpn_len;
4763*62c56f98SSadaf Ebrahimi }
4764*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_ALPN */
4765*62c56f98SSadaf Ebrahimi
4766*62c56f98SSadaf Ebrahimi /*
4767*62c56f98SSadaf Ebrahimi * Forced fields from top-level ssl_context structure
4768*62c56f98SSadaf Ebrahimi *
4769*62c56f98SSadaf Ebrahimi * Most of them already set to the correct value by mbedtls_ssl_init() and
4770*62c56f98SSadaf Ebrahimi * mbedtls_ssl_reset(), so we only need to set the remaining ones.
4771*62c56f98SSadaf Ebrahimi */
4772*62c56f98SSadaf Ebrahimi ssl->state = MBEDTLS_SSL_HANDSHAKE_OVER;
4773*62c56f98SSadaf Ebrahimi ssl->tls_version = MBEDTLS_SSL_VERSION_TLS1_2;
4774*62c56f98SSadaf Ebrahimi
4775*62c56f98SSadaf Ebrahimi /* Adjust pointers for header fields of outgoing records to
4776*62c56f98SSadaf Ebrahimi * the given transform, accounting for explicit IV and CID. */
4777*62c56f98SSadaf Ebrahimi mbedtls_ssl_update_out_pointers(ssl, ssl->transform);
4778*62c56f98SSadaf Ebrahimi
4779*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_DTLS)
4780*62c56f98SSadaf Ebrahimi ssl->in_epoch = 1;
4781*62c56f98SSadaf Ebrahimi #endif
4782*62c56f98SSadaf Ebrahimi
4783*62c56f98SSadaf Ebrahimi /* mbedtls_ssl_reset() leaves the handshake sub-structure allocated,
4784*62c56f98SSadaf Ebrahimi * which we don't want - otherwise we'd end up freeing the wrong transform
4785*62c56f98SSadaf Ebrahimi * by calling mbedtls_ssl_handshake_wrapup_free_hs_transform()
4786*62c56f98SSadaf Ebrahimi * inappropriately. */
4787*62c56f98SSadaf Ebrahimi if (ssl->handshake != NULL) {
4788*62c56f98SSadaf Ebrahimi mbedtls_ssl_handshake_free(ssl);
4789*62c56f98SSadaf Ebrahimi mbedtls_free(ssl->handshake);
4790*62c56f98SSadaf Ebrahimi ssl->handshake = NULL;
4791*62c56f98SSadaf Ebrahimi }
4792*62c56f98SSadaf Ebrahimi
4793*62c56f98SSadaf Ebrahimi /*
4794*62c56f98SSadaf Ebrahimi * Done - should have consumed entire buffer
4795*62c56f98SSadaf Ebrahimi */
4796*62c56f98SSadaf Ebrahimi if (p != end) {
4797*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
4798*62c56f98SSadaf Ebrahimi }
4799*62c56f98SSadaf Ebrahimi
4800*62c56f98SSadaf Ebrahimi return 0;
4801*62c56f98SSadaf Ebrahimi }
4802*62c56f98SSadaf Ebrahimi
4803*62c56f98SSadaf Ebrahimi /*
4804*62c56f98SSadaf Ebrahimi * Deserialize context: public wrapper for error cleaning
4805*62c56f98SSadaf Ebrahimi */
mbedtls_ssl_context_load(mbedtls_ssl_context * context,const unsigned char * buf,size_t len)4806*62c56f98SSadaf Ebrahimi int mbedtls_ssl_context_load(mbedtls_ssl_context *context,
4807*62c56f98SSadaf Ebrahimi const unsigned char *buf,
4808*62c56f98SSadaf Ebrahimi size_t len)
4809*62c56f98SSadaf Ebrahimi {
4810*62c56f98SSadaf Ebrahimi int ret = ssl_context_load(context, buf, len);
4811*62c56f98SSadaf Ebrahimi
4812*62c56f98SSadaf Ebrahimi if (ret != 0) {
4813*62c56f98SSadaf Ebrahimi mbedtls_ssl_free(context);
4814*62c56f98SSadaf Ebrahimi }
4815*62c56f98SSadaf Ebrahimi
4816*62c56f98SSadaf Ebrahimi return ret;
4817*62c56f98SSadaf Ebrahimi }
4818*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_CONTEXT_SERIALIZATION */
4819*62c56f98SSadaf Ebrahimi
4820*62c56f98SSadaf Ebrahimi /*
4821*62c56f98SSadaf Ebrahimi * Free an SSL context
4822*62c56f98SSadaf Ebrahimi */
mbedtls_ssl_free(mbedtls_ssl_context * ssl)4823*62c56f98SSadaf Ebrahimi void mbedtls_ssl_free(mbedtls_ssl_context *ssl)
4824*62c56f98SSadaf Ebrahimi {
4825*62c56f98SSadaf Ebrahimi if (ssl == NULL) {
4826*62c56f98SSadaf Ebrahimi return;
4827*62c56f98SSadaf Ebrahimi }
4828*62c56f98SSadaf Ebrahimi
4829*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(2, ("=> free"));
4830*62c56f98SSadaf Ebrahimi
4831*62c56f98SSadaf Ebrahimi if (ssl->out_buf != NULL) {
4832*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
4833*62c56f98SSadaf Ebrahimi size_t out_buf_len = ssl->out_buf_len;
4834*62c56f98SSadaf Ebrahimi #else
4835*62c56f98SSadaf Ebrahimi size_t out_buf_len = MBEDTLS_SSL_OUT_BUFFER_LEN;
4836*62c56f98SSadaf Ebrahimi #endif
4837*62c56f98SSadaf Ebrahimi
4838*62c56f98SSadaf Ebrahimi mbedtls_zeroize_and_free(ssl->out_buf, out_buf_len);
4839*62c56f98SSadaf Ebrahimi ssl->out_buf = NULL;
4840*62c56f98SSadaf Ebrahimi }
4841*62c56f98SSadaf Ebrahimi
4842*62c56f98SSadaf Ebrahimi if (ssl->in_buf != NULL) {
4843*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
4844*62c56f98SSadaf Ebrahimi size_t in_buf_len = ssl->in_buf_len;
4845*62c56f98SSadaf Ebrahimi #else
4846*62c56f98SSadaf Ebrahimi size_t in_buf_len = MBEDTLS_SSL_IN_BUFFER_LEN;
4847*62c56f98SSadaf Ebrahimi #endif
4848*62c56f98SSadaf Ebrahimi
4849*62c56f98SSadaf Ebrahimi mbedtls_zeroize_and_free(ssl->in_buf, in_buf_len);
4850*62c56f98SSadaf Ebrahimi ssl->in_buf = NULL;
4851*62c56f98SSadaf Ebrahimi }
4852*62c56f98SSadaf Ebrahimi
4853*62c56f98SSadaf Ebrahimi if (ssl->transform) {
4854*62c56f98SSadaf Ebrahimi mbedtls_ssl_transform_free(ssl->transform);
4855*62c56f98SSadaf Ebrahimi mbedtls_free(ssl->transform);
4856*62c56f98SSadaf Ebrahimi }
4857*62c56f98SSadaf Ebrahimi
4858*62c56f98SSadaf Ebrahimi if (ssl->handshake) {
4859*62c56f98SSadaf Ebrahimi mbedtls_ssl_handshake_free(ssl);
4860*62c56f98SSadaf Ebrahimi mbedtls_free(ssl->handshake);
4861*62c56f98SSadaf Ebrahimi
4862*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
4863*62c56f98SSadaf Ebrahimi mbedtls_ssl_transform_free(ssl->transform_negotiate);
4864*62c56f98SSadaf Ebrahimi mbedtls_free(ssl->transform_negotiate);
4865*62c56f98SSadaf Ebrahimi #endif
4866*62c56f98SSadaf Ebrahimi
4867*62c56f98SSadaf Ebrahimi mbedtls_ssl_session_free(ssl->session_negotiate);
4868*62c56f98SSadaf Ebrahimi mbedtls_free(ssl->session_negotiate);
4869*62c56f98SSadaf Ebrahimi }
4870*62c56f98SSadaf Ebrahimi
4871*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_TLS1_3)
4872*62c56f98SSadaf Ebrahimi mbedtls_ssl_transform_free(ssl->transform_application);
4873*62c56f98SSadaf Ebrahimi mbedtls_free(ssl->transform_application);
4874*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
4875*62c56f98SSadaf Ebrahimi
4876*62c56f98SSadaf Ebrahimi if (ssl->session) {
4877*62c56f98SSadaf Ebrahimi mbedtls_ssl_session_free(ssl->session);
4878*62c56f98SSadaf Ebrahimi mbedtls_free(ssl->session);
4879*62c56f98SSadaf Ebrahimi }
4880*62c56f98SSadaf Ebrahimi
4881*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_X509_CRT_PARSE_C)
4882*62c56f98SSadaf Ebrahimi if (ssl->hostname != NULL) {
4883*62c56f98SSadaf Ebrahimi mbedtls_zeroize_and_free(ssl->hostname, strlen(ssl->hostname));
4884*62c56f98SSadaf Ebrahimi }
4885*62c56f98SSadaf Ebrahimi #endif
4886*62c56f98SSadaf Ebrahimi
4887*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C)
4888*62c56f98SSadaf Ebrahimi mbedtls_free(ssl->cli_id);
4889*62c56f98SSadaf Ebrahimi #endif
4890*62c56f98SSadaf Ebrahimi
4891*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(2, ("<= free"));
4892*62c56f98SSadaf Ebrahimi
4893*62c56f98SSadaf Ebrahimi /* Actually clear after last debug message */
4894*62c56f98SSadaf Ebrahimi mbedtls_platform_zeroize(ssl, sizeof(mbedtls_ssl_context));
4895*62c56f98SSadaf Ebrahimi }
4896*62c56f98SSadaf Ebrahimi
4897*62c56f98SSadaf Ebrahimi /*
4898*62c56f98SSadaf Ebrahimi * Initialize mbedtls_ssl_config
4899*62c56f98SSadaf Ebrahimi */
mbedtls_ssl_config_init(mbedtls_ssl_config * conf)4900*62c56f98SSadaf Ebrahimi void mbedtls_ssl_config_init(mbedtls_ssl_config *conf)
4901*62c56f98SSadaf Ebrahimi {
4902*62c56f98SSadaf Ebrahimi memset(conf, 0, sizeof(mbedtls_ssl_config));
4903*62c56f98SSadaf Ebrahimi }
4904*62c56f98SSadaf Ebrahimi
4905*62c56f98SSadaf Ebrahimi /* The selection should be the same as mbedtls_x509_crt_profile_default in
4906*62c56f98SSadaf Ebrahimi * x509_crt.c, plus Montgomery curves for ECDHE. Here, the order matters:
4907*62c56f98SSadaf Ebrahimi * curves with a lower resource usage come first.
4908*62c56f98SSadaf Ebrahimi * See the documentation of mbedtls_ssl_conf_curves() for what we promise
4909*62c56f98SSadaf Ebrahimi * about this list.
4910*62c56f98SSadaf Ebrahimi */
4911*62c56f98SSadaf Ebrahimi static uint16_t ssl_preset_default_groups[] = {
4912*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_ECP_HAVE_CURVE25519)
4913*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_IANA_TLS_GROUP_X25519,
4914*62c56f98SSadaf Ebrahimi #endif
4915*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_ECP_HAVE_SECP256R1)
4916*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_IANA_TLS_GROUP_SECP256R1,
4917*62c56f98SSadaf Ebrahimi #endif
4918*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_ECP_HAVE_SECP384R1)
4919*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_IANA_TLS_GROUP_SECP384R1,
4920*62c56f98SSadaf Ebrahimi #endif
4921*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_ECP_HAVE_CURVE448)
4922*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_IANA_TLS_GROUP_X448,
4923*62c56f98SSadaf Ebrahimi #endif
4924*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_ECP_HAVE_SECP521R1)
4925*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_IANA_TLS_GROUP_SECP521R1,
4926*62c56f98SSadaf Ebrahimi #endif
4927*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_ECP_HAVE_BP256R1)
4928*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_IANA_TLS_GROUP_BP256R1,
4929*62c56f98SSadaf Ebrahimi #endif
4930*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_ECP_HAVE_BP384R1)
4931*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_IANA_TLS_GROUP_BP384R1,
4932*62c56f98SSadaf Ebrahimi #endif
4933*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_ECP_HAVE_BP512R1)
4934*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_IANA_TLS_GROUP_BP512R1,
4935*62c56f98SSadaf Ebrahimi #endif
4936*62c56f98SSadaf Ebrahimi #if defined(PSA_WANT_ALG_FFDH)
4937*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE2048,
4938*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE3072,
4939*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE4096,
4940*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE6144,
4941*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE8192,
4942*62c56f98SSadaf Ebrahimi #endif
4943*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_IANA_TLS_GROUP_NONE
4944*62c56f98SSadaf Ebrahimi };
4945*62c56f98SSadaf Ebrahimi
4946*62c56f98SSadaf Ebrahimi static const int ssl_preset_suiteb_ciphersuites[] = {
4947*62c56f98SSadaf Ebrahimi MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
4948*62c56f98SSadaf Ebrahimi MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
4949*62c56f98SSadaf Ebrahimi 0
4950*62c56f98SSadaf Ebrahimi };
4951*62c56f98SSadaf Ebrahimi
4952*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED)
4953*62c56f98SSadaf Ebrahimi
4954*62c56f98SSadaf Ebrahimi /* NOTICE:
4955*62c56f98SSadaf Ebrahimi * For ssl_preset_*_sig_algs and ssl_tls12_preset_*_sig_algs, the following
4956*62c56f98SSadaf Ebrahimi * rules SHOULD be upheld.
4957*62c56f98SSadaf Ebrahimi * - No duplicate entries.
4958*62c56f98SSadaf Ebrahimi * - But if there is a good reason, do not change the order of the algorithms.
4959*62c56f98SSadaf Ebrahimi * - ssl_tls12_preset* is for TLS 1.2 use only.
4960*62c56f98SSadaf Ebrahimi * - ssl_preset_* is for TLS 1.3 only or hybrid TLS 1.3/1.2 handshakes.
4961*62c56f98SSadaf Ebrahimi */
4962*62c56f98SSadaf Ebrahimi static uint16_t ssl_preset_default_sig_algs[] = {
4963*62c56f98SSadaf Ebrahimi
4964*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ANY_ALLOWED_ENABLED) && \
4965*62c56f98SSadaf Ebrahimi defined(MBEDTLS_MD_CAN_SHA256) && \
4966*62c56f98SSadaf Ebrahimi defined(PSA_WANT_ECC_SECP_R1_256)
4967*62c56f98SSadaf Ebrahimi MBEDTLS_TLS1_3_SIG_ECDSA_SECP256R1_SHA256,
4968*62c56f98SSadaf Ebrahimi // == MBEDTLS_SSL_TLS12_SIG_AND_HASH_ALG(MBEDTLS_SSL_SIG_ECDSA, MBEDTLS_SSL_HASH_SHA256)
4969*62c56f98SSadaf Ebrahimi #endif
4970*62c56f98SSadaf Ebrahimi
4971*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ANY_ALLOWED_ENABLED) && \
4972*62c56f98SSadaf Ebrahimi defined(MBEDTLS_MD_CAN_SHA384) && \
4973*62c56f98SSadaf Ebrahimi defined(PSA_WANT_ECC_SECP_R1_384)
4974*62c56f98SSadaf Ebrahimi MBEDTLS_TLS1_3_SIG_ECDSA_SECP384R1_SHA384,
4975*62c56f98SSadaf Ebrahimi // == MBEDTLS_SSL_TLS12_SIG_AND_HASH_ALG(MBEDTLS_SSL_SIG_ECDSA, MBEDTLS_SSL_HASH_SHA384)
4976*62c56f98SSadaf Ebrahimi #endif
4977*62c56f98SSadaf Ebrahimi
4978*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ANY_ALLOWED_ENABLED) && \
4979*62c56f98SSadaf Ebrahimi defined(MBEDTLS_MD_CAN_SHA512) && \
4980*62c56f98SSadaf Ebrahimi defined(PSA_WANT_ECC_SECP_R1_521)
4981*62c56f98SSadaf Ebrahimi MBEDTLS_TLS1_3_SIG_ECDSA_SECP521R1_SHA512,
4982*62c56f98SSadaf Ebrahimi // == MBEDTLS_SSL_TLS12_SIG_AND_HASH_ALG(MBEDTLS_SSL_SIG_ECDSA, MBEDTLS_SSL_HASH_SHA512)
4983*62c56f98SSadaf Ebrahimi #endif
4984*62c56f98SSadaf Ebrahimi
4985*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT) && \
4986*62c56f98SSadaf Ebrahimi defined(MBEDTLS_MD_CAN_SHA512)
4987*62c56f98SSadaf Ebrahimi MBEDTLS_TLS1_3_SIG_RSA_PSS_RSAE_SHA512,
4988*62c56f98SSadaf Ebrahimi #endif \
4989*62c56f98SSadaf Ebrahimi /* MBEDTLS_X509_RSASSA_PSS_SUPPORT && MBEDTLS_MD_CAN_SHA512 */
4990*62c56f98SSadaf Ebrahimi
4991*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT) && \
4992*62c56f98SSadaf Ebrahimi defined(MBEDTLS_MD_CAN_SHA384)
4993*62c56f98SSadaf Ebrahimi MBEDTLS_TLS1_3_SIG_RSA_PSS_RSAE_SHA384,
4994*62c56f98SSadaf Ebrahimi #endif \
4995*62c56f98SSadaf Ebrahimi /* MBEDTLS_X509_RSASSA_PSS_SUPPORT && MBEDTLS_MD_CAN_SHA384 */
4996*62c56f98SSadaf Ebrahimi
4997*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT) && \
4998*62c56f98SSadaf Ebrahimi defined(MBEDTLS_MD_CAN_SHA256)
4999*62c56f98SSadaf Ebrahimi MBEDTLS_TLS1_3_SIG_RSA_PSS_RSAE_SHA256,
5000*62c56f98SSadaf Ebrahimi #endif \
5001*62c56f98SSadaf Ebrahimi /* MBEDTLS_X509_RSASSA_PSS_SUPPORT && MBEDTLS_MD_CAN_SHA256 */
5002*62c56f98SSadaf Ebrahimi
5003*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_RSA_C) && defined(MBEDTLS_MD_CAN_SHA512)
5004*62c56f98SSadaf Ebrahimi MBEDTLS_TLS1_3_SIG_RSA_PKCS1_SHA512,
5005*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_RSA_C && MBEDTLS_MD_CAN_SHA512 */
5006*62c56f98SSadaf Ebrahimi
5007*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_RSA_C) && defined(MBEDTLS_MD_CAN_SHA384)
5008*62c56f98SSadaf Ebrahimi MBEDTLS_TLS1_3_SIG_RSA_PKCS1_SHA384,
5009*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_RSA_C && MBEDTLS_MD_CAN_SHA384 */
5010*62c56f98SSadaf Ebrahimi
5011*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_RSA_C) && defined(MBEDTLS_MD_CAN_SHA256)
5012*62c56f98SSadaf Ebrahimi MBEDTLS_TLS1_3_SIG_RSA_PKCS1_SHA256,
5013*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_RSA_C && MBEDTLS_MD_CAN_SHA256 */
5014*62c56f98SSadaf Ebrahimi
5015*62c56f98SSadaf Ebrahimi MBEDTLS_TLS_SIG_NONE
5016*62c56f98SSadaf Ebrahimi };
5017*62c56f98SSadaf Ebrahimi
5018*62c56f98SSadaf Ebrahimi /* NOTICE: see above */
5019*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
5020*62c56f98SSadaf Ebrahimi static uint16_t ssl_tls12_preset_default_sig_algs[] = {
5021*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA512)
5022*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED)
5023*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_TLS12_SIG_AND_HASH_ALG(MBEDTLS_SSL_SIG_ECDSA, MBEDTLS_SSL_HASH_SHA512),
5024*62c56f98SSadaf Ebrahimi #endif
5025*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT)
5026*62c56f98SSadaf Ebrahimi MBEDTLS_TLS1_3_SIG_RSA_PSS_RSAE_SHA512,
5027*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_X509_RSASSA_PSS_SUPPORT */
5028*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_RSA_C)
5029*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_TLS12_SIG_AND_HASH_ALG(MBEDTLS_SSL_SIG_RSA, MBEDTLS_SSL_HASH_SHA512),
5030*62c56f98SSadaf Ebrahimi #endif
5031*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_MD_CAN_SHA512*/
5032*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA384)
5033*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED)
5034*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_TLS12_SIG_AND_HASH_ALG(MBEDTLS_SSL_SIG_ECDSA, MBEDTLS_SSL_HASH_SHA384),
5035*62c56f98SSadaf Ebrahimi #endif
5036*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT)
5037*62c56f98SSadaf Ebrahimi MBEDTLS_TLS1_3_SIG_RSA_PSS_RSAE_SHA384,
5038*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_X509_RSASSA_PSS_SUPPORT */
5039*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_RSA_C)
5040*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_TLS12_SIG_AND_HASH_ALG(MBEDTLS_SSL_SIG_RSA, MBEDTLS_SSL_HASH_SHA384),
5041*62c56f98SSadaf Ebrahimi #endif
5042*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_MD_CAN_SHA384*/
5043*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA256)
5044*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED)
5045*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_TLS12_SIG_AND_HASH_ALG(MBEDTLS_SSL_SIG_ECDSA, MBEDTLS_SSL_HASH_SHA256),
5046*62c56f98SSadaf Ebrahimi #endif
5047*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT)
5048*62c56f98SSadaf Ebrahimi MBEDTLS_TLS1_3_SIG_RSA_PSS_RSAE_SHA256,
5049*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_X509_RSASSA_PSS_SUPPORT */
5050*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_RSA_C)
5051*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_TLS12_SIG_AND_HASH_ALG(MBEDTLS_SSL_SIG_RSA, MBEDTLS_SSL_HASH_SHA256),
5052*62c56f98SSadaf Ebrahimi #endif
5053*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_MD_CAN_SHA256*/
5054*62c56f98SSadaf Ebrahimi MBEDTLS_TLS_SIG_NONE
5055*62c56f98SSadaf Ebrahimi };
5056*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
5057*62c56f98SSadaf Ebrahimi /* NOTICE: see above */
5058*62c56f98SSadaf Ebrahimi static uint16_t ssl_preset_suiteb_sig_algs[] = {
5059*62c56f98SSadaf Ebrahimi
5060*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ANY_ALLOWED_ENABLED) && \
5061*62c56f98SSadaf Ebrahimi defined(MBEDTLS_MD_CAN_SHA256) && \
5062*62c56f98SSadaf Ebrahimi defined(MBEDTLS_ECP_HAVE_SECP256R1)
5063*62c56f98SSadaf Ebrahimi MBEDTLS_TLS1_3_SIG_ECDSA_SECP256R1_SHA256,
5064*62c56f98SSadaf Ebrahimi // == MBEDTLS_SSL_TLS12_SIG_AND_HASH_ALG(MBEDTLS_SSL_SIG_ECDSA, MBEDTLS_SSL_HASH_SHA256)
5065*62c56f98SSadaf Ebrahimi #endif
5066*62c56f98SSadaf Ebrahimi
5067*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ANY_ALLOWED_ENABLED) && \
5068*62c56f98SSadaf Ebrahimi defined(MBEDTLS_MD_CAN_SHA384) && \
5069*62c56f98SSadaf Ebrahimi defined(MBEDTLS_ECP_HAVE_SECP384R1)
5070*62c56f98SSadaf Ebrahimi MBEDTLS_TLS1_3_SIG_ECDSA_SECP384R1_SHA384,
5071*62c56f98SSadaf Ebrahimi // == MBEDTLS_SSL_TLS12_SIG_AND_HASH_ALG(MBEDTLS_SSL_SIG_ECDSA, MBEDTLS_SSL_HASH_SHA384)
5072*62c56f98SSadaf Ebrahimi #endif
5073*62c56f98SSadaf Ebrahimi
5074*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT) && \
5075*62c56f98SSadaf Ebrahimi defined(MBEDTLS_MD_CAN_SHA256)
5076*62c56f98SSadaf Ebrahimi MBEDTLS_TLS1_3_SIG_RSA_PSS_RSAE_SHA256,
5077*62c56f98SSadaf Ebrahimi #endif \
5078*62c56f98SSadaf Ebrahimi /* MBEDTLS_X509_RSASSA_PSS_SUPPORT && MBEDTLS_MD_CAN_SHA256*/
5079*62c56f98SSadaf Ebrahimi
5080*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_RSA_C) && defined(MBEDTLS_MD_CAN_SHA256)
5081*62c56f98SSadaf Ebrahimi MBEDTLS_TLS1_3_SIG_RSA_PKCS1_SHA256,
5082*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_RSA_C && MBEDTLS_MD_CAN_SHA256*/
5083*62c56f98SSadaf Ebrahimi
5084*62c56f98SSadaf Ebrahimi MBEDTLS_TLS_SIG_NONE
5085*62c56f98SSadaf Ebrahimi };
5086*62c56f98SSadaf Ebrahimi
5087*62c56f98SSadaf Ebrahimi /* NOTICE: see above */
5088*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
5089*62c56f98SSadaf Ebrahimi static uint16_t ssl_tls12_preset_suiteb_sig_algs[] = {
5090*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA256)
5091*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED)
5092*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_TLS12_SIG_AND_HASH_ALG(MBEDTLS_SSL_SIG_ECDSA, MBEDTLS_SSL_HASH_SHA256),
5093*62c56f98SSadaf Ebrahimi #endif
5094*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_RSA_C)
5095*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_TLS12_SIG_AND_HASH_ALG(MBEDTLS_SSL_SIG_RSA, MBEDTLS_SSL_HASH_SHA256),
5096*62c56f98SSadaf Ebrahimi #endif
5097*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_MD_CAN_SHA256*/
5098*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA384)
5099*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED)
5100*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_TLS12_SIG_AND_HASH_ALG(MBEDTLS_SSL_SIG_ECDSA, MBEDTLS_SSL_HASH_SHA384),
5101*62c56f98SSadaf Ebrahimi #endif
5102*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_RSA_C)
5103*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_TLS12_SIG_AND_HASH_ALG(MBEDTLS_SSL_SIG_RSA, MBEDTLS_SSL_HASH_SHA384),
5104*62c56f98SSadaf Ebrahimi #endif
5105*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_MD_CAN_SHA256*/
5106*62c56f98SSadaf Ebrahimi MBEDTLS_TLS_SIG_NONE
5107*62c56f98SSadaf Ebrahimi };
5108*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
5109*62c56f98SSadaf Ebrahimi
5110*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED */
5111*62c56f98SSadaf Ebrahimi
5112*62c56f98SSadaf Ebrahimi static uint16_t ssl_preset_suiteb_groups[] = {
5113*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_ECP_HAVE_SECP256R1)
5114*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_IANA_TLS_GROUP_SECP256R1,
5115*62c56f98SSadaf Ebrahimi #endif
5116*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_ECP_HAVE_SECP384R1)
5117*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_IANA_TLS_GROUP_SECP384R1,
5118*62c56f98SSadaf Ebrahimi #endif
5119*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_IANA_TLS_GROUP_NONE
5120*62c56f98SSadaf Ebrahimi };
5121*62c56f98SSadaf Ebrahimi
5122*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_DEBUG_C) && defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED)
5123*62c56f98SSadaf Ebrahimi /* Function for checking `ssl_preset_*_sig_algs` and `ssl_tls12_preset_*_sig_algs`
5124*62c56f98SSadaf Ebrahimi * to make sure there are no duplicated signature algorithm entries. */
5125*62c56f98SSadaf Ebrahimi MBEDTLS_CHECK_RETURN_CRITICAL
ssl_check_no_sig_alg_duplication(uint16_t * sig_algs)5126*62c56f98SSadaf Ebrahimi static int ssl_check_no_sig_alg_duplication(uint16_t *sig_algs)
5127*62c56f98SSadaf Ebrahimi {
5128*62c56f98SSadaf Ebrahimi size_t i, j;
5129*62c56f98SSadaf Ebrahimi int ret = 0;
5130*62c56f98SSadaf Ebrahimi
5131*62c56f98SSadaf Ebrahimi for (i = 0; sig_algs[i] != MBEDTLS_TLS_SIG_NONE; i++) {
5132*62c56f98SSadaf Ebrahimi for (j = 0; j < i; j++) {
5133*62c56f98SSadaf Ebrahimi if (sig_algs[i] != sig_algs[j]) {
5134*62c56f98SSadaf Ebrahimi continue;
5135*62c56f98SSadaf Ebrahimi }
5136*62c56f98SSadaf Ebrahimi mbedtls_printf(" entry(%04x,%" MBEDTLS_PRINTF_SIZET
5137*62c56f98SSadaf Ebrahimi ") is duplicated at %" MBEDTLS_PRINTF_SIZET "\n",
5138*62c56f98SSadaf Ebrahimi sig_algs[i], j, i);
5139*62c56f98SSadaf Ebrahimi ret = -1;
5140*62c56f98SSadaf Ebrahimi }
5141*62c56f98SSadaf Ebrahimi }
5142*62c56f98SSadaf Ebrahimi return ret;
5143*62c56f98SSadaf Ebrahimi }
5144*62c56f98SSadaf Ebrahimi
5145*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_DEBUG_C && MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED */
5146*62c56f98SSadaf Ebrahimi
5147*62c56f98SSadaf Ebrahimi /*
5148*62c56f98SSadaf Ebrahimi * Load default in mbedtls_ssl_config
5149*62c56f98SSadaf Ebrahimi */
mbedtls_ssl_config_defaults(mbedtls_ssl_config * conf,int endpoint,int transport,int preset)5150*62c56f98SSadaf Ebrahimi int mbedtls_ssl_config_defaults(mbedtls_ssl_config *conf,
5151*62c56f98SSadaf Ebrahimi int endpoint, int transport, int preset)
5152*62c56f98SSadaf Ebrahimi {
5153*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_SRV_C)
5154*62c56f98SSadaf Ebrahimi int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
5155*62c56f98SSadaf Ebrahimi #endif
5156*62c56f98SSadaf Ebrahimi
5157*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_DEBUG_C) && defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED)
5158*62c56f98SSadaf Ebrahimi if (ssl_check_no_sig_alg_duplication(ssl_preset_suiteb_sig_algs)) {
5159*62c56f98SSadaf Ebrahimi mbedtls_printf("ssl_preset_suiteb_sig_algs has duplicated entries\n");
5160*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
5161*62c56f98SSadaf Ebrahimi }
5162*62c56f98SSadaf Ebrahimi
5163*62c56f98SSadaf Ebrahimi if (ssl_check_no_sig_alg_duplication(ssl_preset_default_sig_algs)) {
5164*62c56f98SSadaf Ebrahimi mbedtls_printf("ssl_preset_default_sig_algs has duplicated entries\n");
5165*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
5166*62c56f98SSadaf Ebrahimi }
5167*62c56f98SSadaf Ebrahimi
5168*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
5169*62c56f98SSadaf Ebrahimi if (ssl_check_no_sig_alg_duplication(ssl_tls12_preset_suiteb_sig_algs)) {
5170*62c56f98SSadaf Ebrahimi mbedtls_printf("ssl_tls12_preset_suiteb_sig_algs has duplicated entries\n");
5171*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
5172*62c56f98SSadaf Ebrahimi }
5173*62c56f98SSadaf Ebrahimi
5174*62c56f98SSadaf Ebrahimi if (ssl_check_no_sig_alg_duplication(ssl_tls12_preset_default_sig_algs)) {
5175*62c56f98SSadaf Ebrahimi mbedtls_printf("ssl_tls12_preset_default_sig_algs has duplicated entries\n");
5176*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
5177*62c56f98SSadaf Ebrahimi }
5178*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
5179*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_DEBUG_C && MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED */
5180*62c56f98SSadaf Ebrahimi
5181*62c56f98SSadaf Ebrahimi /* Use the functions here so that they are covered in tests,
5182*62c56f98SSadaf Ebrahimi * but otherwise access member directly for efficiency */
5183*62c56f98SSadaf Ebrahimi mbedtls_ssl_conf_endpoint(conf, endpoint);
5184*62c56f98SSadaf Ebrahimi mbedtls_ssl_conf_transport(conf, transport);
5185*62c56f98SSadaf Ebrahimi
5186*62c56f98SSadaf Ebrahimi /*
5187*62c56f98SSadaf Ebrahimi * Things that are common to all presets
5188*62c56f98SSadaf Ebrahimi */
5189*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_CLI_C)
5190*62c56f98SSadaf Ebrahimi if (endpoint == MBEDTLS_SSL_IS_CLIENT) {
5191*62c56f98SSadaf Ebrahimi conf->authmode = MBEDTLS_SSL_VERIFY_REQUIRED;
5192*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_SESSION_TICKETS)
5193*62c56f98SSadaf Ebrahimi conf->session_tickets = MBEDTLS_SSL_SESSION_TICKETS_ENABLED;
5194*62c56f98SSadaf Ebrahimi #endif
5195*62c56f98SSadaf Ebrahimi }
5196*62c56f98SSadaf Ebrahimi #endif
5197*62c56f98SSadaf Ebrahimi
5198*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
5199*62c56f98SSadaf Ebrahimi conf->encrypt_then_mac = MBEDTLS_SSL_ETM_ENABLED;
5200*62c56f98SSadaf Ebrahimi #endif
5201*62c56f98SSadaf Ebrahimi
5202*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
5203*62c56f98SSadaf Ebrahimi conf->extended_ms = MBEDTLS_SSL_EXTENDED_MS_ENABLED;
5204*62c56f98SSadaf Ebrahimi #endif
5205*62c56f98SSadaf Ebrahimi
5206*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C)
5207*62c56f98SSadaf Ebrahimi conf->f_cookie_write = ssl_cookie_write_dummy;
5208*62c56f98SSadaf Ebrahimi conf->f_cookie_check = ssl_cookie_check_dummy;
5209*62c56f98SSadaf Ebrahimi #endif
5210*62c56f98SSadaf Ebrahimi
5211*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
5212*62c56f98SSadaf Ebrahimi conf->anti_replay = MBEDTLS_SSL_ANTI_REPLAY_ENABLED;
5213*62c56f98SSadaf Ebrahimi #endif
5214*62c56f98SSadaf Ebrahimi
5215*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_SRV_C)
5216*62c56f98SSadaf Ebrahimi conf->cert_req_ca_list = MBEDTLS_SSL_CERT_REQ_CA_LIST_ENABLED;
5217*62c56f98SSadaf Ebrahimi conf->respect_cli_pref = MBEDTLS_SSL_SRV_CIPHERSUITE_ORDER_SERVER;
5218*62c56f98SSadaf Ebrahimi #endif
5219*62c56f98SSadaf Ebrahimi
5220*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_DTLS)
5221*62c56f98SSadaf Ebrahimi conf->hs_timeout_min = MBEDTLS_SSL_DTLS_TIMEOUT_DFL_MIN;
5222*62c56f98SSadaf Ebrahimi conf->hs_timeout_max = MBEDTLS_SSL_DTLS_TIMEOUT_DFL_MAX;
5223*62c56f98SSadaf Ebrahimi #endif
5224*62c56f98SSadaf Ebrahimi
5225*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_RENEGOTIATION)
5226*62c56f98SSadaf Ebrahimi conf->renego_max_records = MBEDTLS_SSL_RENEGO_MAX_RECORDS_DEFAULT;
5227*62c56f98SSadaf Ebrahimi memset(conf->renego_period, 0x00, 2);
5228*62c56f98SSadaf Ebrahimi memset(conf->renego_period + 2, 0xFF, 6);
5229*62c56f98SSadaf Ebrahimi #endif
5230*62c56f98SSadaf Ebrahimi
5231*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_SRV_C)
5232*62c56f98SSadaf Ebrahimi if (endpoint == MBEDTLS_SSL_IS_SERVER) {
5233*62c56f98SSadaf Ebrahimi const unsigned char dhm_p[] =
5234*62c56f98SSadaf Ebrahimi MBEDTLS_DHM_RFC3526_MODP_2048_P_BIN;
5235*62c56f98SSadaf Ebrahimi const unsigned char dhm_g[] =
5236*62c56f98SSadaf Ebrahimi MBEDTLS_DHM_RFC3526_MODP_2048_G_BIN;
5237*62c56f98SSadaf Ebrahimi
5238*62c56f98SSadaf Ebrahimi if ((ret = mbedtls_ssl_conf_dh_param_bin(conf,
5239*62c56f98SSadaf Ebrahimi dhm_p, sizeof(dhm_p),
5240*62c56f98SSadaf Ebrahimi dhm_g, sizeof(dhm_g))) != 0) {
5241*62c56f98SSadaf Ebrahimi return ret;
5242*62c56f98SSadaf Ebrahimi }
5243*62c56f98SSadaf Ebrahimi }
5244*62c56f98SSadaf Ebrahimi #endif
5245*62c56f98SSadaf Ebrahimi
5246*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_TLS1_3)
5247*62c56f98SSadaf Ebrahimi
5248*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_EARLY_DATA)
5249*62c56f98SSadaf Ebrahimi mbedtls_ssl_tls13_conf_early_data(conf, MBEDTLS_SSL_EARLY_DATA_DISABLED);
5250*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_SRV_C)
5251*62c56f98SSadaf Ebrahimi mbedtls_ssl_tls13_conf_max_early_data_size(
5252*62c56f98SSadaf Ebrahimi conf, MBEDTLS_SSL_MAX_EARLY_DATA_SIZE);
5253*62c56f98SSadaf Ebrahimi #endif
5254*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_EARLY_DATA */
5255*62c56f98SSadaf Ebrahimi
5256*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_SRV_C) && defined(MBEDTLS_SSL_SESSION_TICKETS)
5257*62c56f98SSadaf Ebrahimi mbedtls_ssl_conf_new_session_tickets(
5258*62c56f98SSadaf Ebrahimi conf, MBEDTLS_SSL_TLS1_3_DEFAULT_NEW_SESSION_TICKETS);
5259*62c56f98SSadaf Ebrahimi #endif
5260*62c56f98SSadaf Ebrahimi /*
5261*62c56f98SSadaf Ebrahimi * Allow all TLS 1.3 key exchange modes by default.
5262*62c56f98SSadaf Ebrahimi */
5263*62c56f98SSadaf Ebrahimi conf->tls13_kex_modes = MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_ALL;
5264*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
5265*62c56f98SSadaf Ebrahimi
5266*62c56f98SSadaf Ebrahimi if (transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
5267*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
5268*62c56f98SSadaf Ebrahimi conf->min_tls_version = MBEDTLS_SSL_VERSION_TLS1_2;
5269*62c56f98SSadaf Ebrahimi conf->max_tls_version = MBEDTLS_SSL_VERSION_TLS1_2;
5270*62c56f98SSadaf Ebrahimi #else
5271*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
5272*62c56f98SSadaf Ebrahimi #endif
5273*62c56f98SSadaf Ebrahimi } else {
5274*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_TLS1_2) && defined(MBEDTLS_SSL_PROTO_TLS1_3)
5275*62c56f98SSadaf Ebrahimi conf->min_tls_version = MBEDTLS_SSL_VERSION_TLS1_2;
5276*62c56f98SSadaf Ebrahimi conf->max_tls_version = MBEDTLS_SSL_VERSION_TLS1_3;
5277*62c56f98SSadaf Ebrahimi #elif defined(MBEDTLS_SSL_PROTO_TLS1_3)
5278*62c56f98SSadaf Ebrahimi conf->min_tls_version = MBEDTLS_SSL_VERSION_TLS1_3;
5279*62c56f98SSadaf Ebrahimi conf->max_tls_version = MBEDTLS_SSL_VERSION_TLS1_3;
5280*62c56f98SSadaf Ebrahimi #elif defined(MBEDTLS_SSL_PROTO_TLS1_2)
5281*62c56f98SSadaf Ebrahimi conf->min_tls_version = MBEDTLS_SSL_VERSION_TLS1_2;
5282*62c56f98SSadaf Ebrahimi conf->max_tls_version = MBEDTLS_SSL_VERSION_TLS1_2;
5283*62c56f98SSadaf Ebrahimi #else
5284*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
5285*62c56f98SSadaf Ebrahimi #endif
5286*62c56f98SSadaf Ebrahimi }
5287*62c56f98SSadaf Ebrahimi
5288*62c56f98SSadaf Ebrahimi /*
5289*62c56f98SSadaf Ebrahimi * Preset-specific defaults
5290*62c56f98SSadaf Ebrahimi */
5291*62c56f98SSadaf Ebrahimi switch (preset) {
5292*62c56f98SSadaf Ebrahimi /*
5293*62c56f98SSadaf Ebrahimi * NSA Suite B
5294*62c56f98SSadaf Ebrahimi */
5295*62c56f98SSadaf Ebrahimi case MBEDTLS_SSL_PRESET_SUITEB:
5296*62c56f98SSadaf Ebrahimi
5297*62c56f98SSadaf Ebrahimi conf->ciphersuite_list = ssl_preset_suiteb_ciphersuites;
5298*62c56f98SSadaf Ebrahimi
5299*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_X509_CRT_PARSE_C)
5300*62c56f98SSadaf Ebrahimi conf->cert_profile = &mbedtls_x509_crt_profile_suiteb;
5301*62c56f98SSadaf Ebrahimi #endif
5302*62c56f98SSadaf Ebrahimi
5303*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED)
5304*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
5305*62c56f98SSadaf Ebrahimi if (mbedtls_ssl_conf_is_tls12_only(conf)) {
5306*62c56f98SSadaf Ebrahimi conf->sig_algs = ssl_tls12_preset_suiteb_sig_algs;
5307*62c56f98SSadaf Ebrahimi } else
5308*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
5309*62c56f98SSadaf Ebrahimi conf->sig_algs = ssl_preset_suiteb_sig_algs;
5310*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED */
5311*62c56f98SSadaf Ebrahimi
5312*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_ECP_C) && !defined(MBEDTLS_DEPRECATED_REMOVED)
5313*62c56f98SSadaf Ebrahimi conf->curve_list = NULL;
5314*62c56f98SSadaf Ebrahimi #endif
5315*62c56f98SSadaf Ebrahimi conf->group_list = ssl_preset_suiteb_groups;
5316*62c56f98SSadaf Ebrahimi break;
5317*62c56f98SSadaf Ebrahimi
5318*62c56f98SSadaf Ebrahimi /*
5319*62c56f98SSadaf Ebrahimi * Default
5320*62c56f98SSadaf Ebrahimi */
5321*62c56f98SSadaf Ebrahimi default:
5322*62c56f98SSadaf Ebrahimi
5323*62c56f98SSadaf Ebrahimi conf->ciphersuite_list = mbedtls_ssl_list_ciphersuites();
5324*62c56f98SSadaf Ebrahimi
5325*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_X509_CRT_PARSE_C)
5326*62c56f98SSadaf Ebrahimi conf->cert_profile = &mbedtls_x509_crt_profile_default;
5327*62c56f98SSadaf Ebrahimi #endif
5328*62c56f98SSadaf Ebrahimi
5329*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED)
5330*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
5331*62c56f98SSadaf Ebrahimi if (mbedtls_ssl_conf_is_tls12_only(conf)) {
5332*62c56f98SSadaf Ebrahimi conf->sig_algs = ssl_tls12_preset_default_sig_algs;
5333*62c56f98SSadaf Ebrahimi } else
5334*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
5335*62c56f98SSadaf Ebrahimi conf->sig_algs = ssl_preset_default_sig_algs;
5336*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED */
5337*62c56f98SSadaf Ebrahimi
5338*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_ECP_C) && !defined(MBEDTLS_DEPRECATED_REMOVED)
5339*62c56f98SSadaf Ebrahimi conf->curve_list = NULL;
5340*62c56f98SSadaf Ebrahimi #endif
5341*62c56f98SSadaf Ebrahimi conf->group_list = ssl_preset_default_groups;
5342*62c56f98SSadaf Ebrahimi
5343*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_CLI_C)
5344*62c56f98SSadaf Ebrahimi conf->dhm_min_bitlen = 1024;
5345*62c56f98SSadaf Ebrahimi #endif
5346*62c56f98SSadaf Ebrahimi }
5347*62c56f98SSadaf Ebrahimi
5348*62c56f98SSadaf Ebrahimi return 0;
5349*62c56f98SSadaf Ebrahimi }
5350*62c56f98SSadaf Ebrahimi
5351*62c56f98SSadaf Ebrahimi /*
5352*62c56f98SSadaf Ebrahimi * Free mbedtls_ssl_config
5353*62c56f98SSadaf Ebrahimi */
mbedtls_ssl_config_free(mbedtls_ssl_config * conf)5354*62c56f98SSadaf Ebrahimi void mbedtls_ssl_config_free(mbedtls_ssl_config *conf)
5355*62c56f98SSadaf Ebrahimi {
5356*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_DHM_C)
5357*62c56f98SSadaf Ebrahimi mbedtls_mpi_free(&conf->dhm_P);
5358*62c56f98SSadaf Ebrahimi mbedtls_mpi_free(&conf->dhm_G);
5359*62c56f98SSadaf Ebrahimi #endif
5360*62c56f98SSadaf Ebrahimi
5361*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_PSK_ENABLED)
5362*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO)
5363*62c56f98SSadaf Ebrahimi if (!mbedtls_svc_key_id_is_null(conf->psk_opaque)) {
5364*62c56f98SSadaf Ebrahimi conf->psk_opaque = MBEDTLS_SVC_KEY_ID_INIT;
5365*62c56f98SSadaf Ebrahimi }
5366*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_USE_PSA_CRYPTO */
5367*62c56f98SSadaf Ebrahimi if (conf->psk != NULL) {
5368*62c56f98SSadaf Ebrahimi mbedtls_zeroize_and_free(conf->psk, conf->psk_len);
5369*62c56f98SSadaf Ebrahimi conf->psk = NULL;
5370*62c56f98SSadaf Ebrahimi conf->psk_len = 0;
5371*62c56f98SSadaf Ebrahimi }
5372*62c56f98SSadaf Ebrahimi
5373*62c56f98SSadaf Ebrahimi if (conf->psk_identity != NULL) {
5374*62c56f98SSadaf Ebrahimi mbedtls_zeroize_and_free(conf->psk_identity, conf->psk_identity_len);
5375*62c56f98SSadaf Ebrahimi conf->psk_identity = NULL;
5376*62c56f98SSadaf Ebrahimi conf->psk_identity_len = 0;
5377*62c56f98SSadaf Ebrahimi }
5378*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_HANDSHAKE_WITH_PSK_ENABLED */
5379*62c56f98SSadaf Ebrahimi
5380*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_X509_CRT_PARSE_C)
5381*62c56f98SSadaf Ebrahimi ssl_key_cert_free(conf->key_cert);
5382*62c56f98SSadaf Ebrahimi #endif
5383*62c56f98SSadaf Ebrahimi
5384*62c56f98SSadaf Ebrahimi mbedtls_platform_zeroize(conf, sizeof(mbedtls_ssl_config));
5385*62c56f98SSadaf Ebrahimi }
5386*62c56f98SSadaf Ebrahimi
5387*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PK_C) && \
5388*62c56f98SSadaf Ebrahimi (defined(MBEDTLS_RSA_C) || defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ANY_ALLOWED_ENABLED))
5389*62c56f98SSadaf Ebrahimi /*
5390*62c56f98SSadaf Ebrahimi * Convert between MBEDTLS_PK_XXX and SSL_SIG_XXX
5391*62c56f98SSadaf Ebrahimi */
mbedtls_ssl_sig_from_pk(mbedtls_pk_context * pk)5392*62c56f98SSadaf Ebrahimi unsigned char mbedtls_ssl_sig_from_pk(mbedtls_pk_context *pk)
5393*62c56f98SSadaf Ebrahimi {
5394*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_RSA_C)
5395*62c56f98SSadaf Ebrahimi if (mbedtls_pk_can_do(pk, MBEDTLS_PK_RSA)) {
5396*62c56f98SSadaf Ebrahimi return MBEDTLS_SSL_SIG_RSA;
5397*62c56f98SSadaf Ebrahimi }
5398*62c56f98SSadaf Ebrahimi #endif
5399*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ANY_ALLOWED_ENABLED)
5400*62c56f98SSadaf Ebrahimi if (mbedtls_pk_can_do(pk, MBEDTLS_PK_ECDSA)) {
5401*62c56f98SSadaf Ebrahimi return MBEDTLS_SSL_SIG_ECDSA;
5402*62c56f98SSadaf Ebrahimi }
5403*62c56f98SSadaf Ebrahimi #endif
5404*62c56f98SSadaf Ebrahimi return MBEDTLS_SSL_SIG_ANON;
5405*62c56f98SSadaf Ebrahimi }
5406*62c56f98SSadaf Ebrahimi
mbedtls_ssl_sig_from_pk_alg(mbedtls_pk_type_t type)5407*62c56f98SSadaf Ebrahimi unsigned char mbedtls_ssl_sig_from_pk_alg(mbedtls_pk_type_t type)
5408*62c56f98SSadaf Ebrahimi {
5409*62c56f98SSadaf Ebrahimi switch (type) {
5410*62c56f98SSadaf Ebrahimi case MBEDTLS_PK_RSA:
5411*62c56f98SSadaf Ebrahimi return MBEDTLS_SSL_SIG_RSA;
5412*62c56f98SSadaf Ebrahimi case MBEDTLS_PK_ECDSA:
5413*62c56f98SSadaf Ebrahimi case MBEDTLS_PK_ECKEY:
5414*62c56f98SSadaf Ebrahimi return MBEDTLS_SSL_SIG_ECDSA;
5415*62c56f98SSadaf Ebrahimi default:
5416*62c56f98SSadaf Ebrahimi return MBEDTLS_SSL_SIG_ANON;
5417*62c56f98SSadaf Ebrahimi }
5418*62c56f98SSadaf Ebrahimi }
5419*62c56f98SSadaf Ebrahimi
mbedtls_ssl_pk_alg_from_sig(unsigned char sig)5420*62c56f98SSadaf Ebrahimi mbedtls_pk_type_t mbedtls_ssl_pk_alg_from_sig(unsigned char sig)
5421*62c56f98SSadaf Ebrahimi {
5422*62c56f98SSadaf Ebrahimi switch (sig) {
5423*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_RSA_C)
5424*62c56f98SSadaf Ebrahimi case MBEDTLS_SSL_SIG_RSA:
5425*62c56f98SSadaf Ebrahimi return MBEDTLS_PK_RSA;
5426*62c56f98SSadaf Ebrahimi #endif
5427*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ANY_ALLOWED_ENABLED)
5428*62c56f98SSadaf Ebrahimi case MBEDTLS_SSL_SIG_ECDSA:
5429*62c56f98SSadaf Ebrahimi return MBEDTLS_PK_ECDSA;
5430*62c56f98SSadaf Ebrahimi #endif
5431*62c56f98SSadaf Ebrahimi default:
5432*62c56f98SSadaf Ebrahimi return MBEDTLS_PK_NONE;
5433*62c56f98SSadaf Ebrahimi }
5434*62c56f98SSadaf Ebrahimi }
5435*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_PK_C &&
5436*62c56f98SSadaf Ebrahimi ( MBEDTLS_RSA_C || MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ANY_ALLOWED_ENABLED ) */
5437*62c56f98SSadaf Ebrahimi
5438*62c56f98SSadaf Ebrahimi /*
5439*62c56f98SSadaf Ebrahimi * Convert from MBEDTLS_SSL_HASH_XXX to MBEDTLS_MD_XXX
5440*62c56f98SSadaf Ebrahimi */
mbedtls_ssl_md_alg_from_hash(unsigned char hash)5441*62c56f98SSadaf Ebrahimi mbedtls_md_type_t mbedtls_ssl_md_alg_from_hash(unsigned char hash)
5442*62c56f98SSadaf Ebrahimi {
5443*62c56f98SSadaf Ebrahimi switch (hash) {
5444*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_MD5)
5445*62c56f98SSadaf Ebrahimi case MBEDTLS_SSL_HASH_MD5:
5446*62c56f98SSadaf Ebrahimi return MBEDTLS_MD_MD5;
5447*62c56f98SSadaf Ebrahimi #endif
5448*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA1)
5449*62c56f98SSadaf Ebrahimi case MBEDTLS_SSL_HASH_SHA1:
5450*62c56f98SSadaf Ebrahimi return MBEDTLS_MD_SHA1;
5451*62c56f98SSadaf Ebrahimi #endif
5452*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA224)
5453*62c56f98SSadaf Ebrahimi case MBEDTLS_SSL_HASH_SHA224:
5454*62c56f98SSadaf Ebrahimi return MBEDTLS_MD_SHA224;
5455*62c56f98SSadaf Ebrahimi #endif
5456*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA256)
5457*62c56f98SSadaf Ebrahimi case MBEDTLS_SSL_HASH_SHA256:
5458*62c56f98SSadaf Ebrahimi return MBEDTLS_MD_SHA256;
5459*62c56f98SSadaf Ebrahimi #endif
5460*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA384)
5461*62c56f98SSadaf Ebrahimi case MBEDTLS_SSL_HASH_SHA384:
5462*62c56f98SSadaf Ebrahimi return MBEDTLS_MD_SHA384;
5463*62c56f98SSadaf Ebrahimi #endif
5464*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA512)
5465*62c56f98SSadaf Ebrahimi case MBEDTLS_SSL_HASH_SHA512:
5466*62c56f98SSadaf Ebrahimi return MBEDTLS_MD_SHA512;
5467*62c56f98SSadaf Ebrahimi #endif
5468*62c56f98SSadaf Ebrahimi default:
5469*62c56f98SSadaf Ebrahimi return MBEDTLS_MD_NONE;
5470*62c56f98SSadaf Ebrahimi }
5471*62c56f98SSadaf Ebrahimi }
5472*62c56f98SSadaf Ebrahimi
5473*62c56f98SSadaf Ebrahimi /*
5474*62c56f98SSadaf Ebrahimi * Convert from MBEDTLS_MD_XXX to MBEDTLS_SSL_HASH_XXX
5475*62c56f98SSadaf Ebrahimi */
mbedtls_ssl_hash_from_md_alg(int md)5476*62c56f98SSadaf Ebrahimi unsigned char mbedtls_ssl_hash_from_md_alg(int md)
5477*62c56f98SSadaf Ebrahimi {
5478*62c56f98SSadaf Ebrahimi switch (md) {
5479*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_MD5)
5480*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_MD5:
5481*62c56f98SSadaf Ebrahimi return MBEDTLS_SSL_HASH_MD5;
5482*62c56f98SSadaf Ebrahimi #endif
5483*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA1)
5484*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA1:
5485*62c56f98SSadaf Ebrahimi return MBEDTLS_SSL_HASH_SHA1;
5486*62c56f98SSadaf Ebrahimi #endif
5487*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA224)
5488*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA224:
5489*62c56f98SSadaf Ebrahimi return MBEDTLS_SSL_HASH_SHA224;
5490*62c56f98SSadaf Ebrahimi #endif
5491*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA256)
5492*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA256:
5493*62c56f98SSadaf Ebrahimi return MBEDTLS_SSL_HASH_SHA256;
5494*62c56f98SSadaf Ebrahimi #endif
5495*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA384)
5496*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA384:
5497*62c56f98SSadaf Ebrahimi return MBEDTLS_SSL_HASH_SHA384;
5498*62c56f98SSadaf Ebrahimi #endif
5499*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA512)
5500*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA512:
5501*62c56f98SSadaf Ebrahimi return MBEDTLS_SSL_HASH_SHA512;
5502*62c56f98SSadaf Ebrahimi #endif
5503*62c56f98SSadaf Ebrahimi default:
5504*62c56f98SSadaf Ebrahimi return MBEDTLS_SSL_HASH_NONE;
5505*62c56f98SSadaf Ebrahimi }
5506*62c56f98SSadaf Ebrahimi }
5507*62c56f98SSadaf Ebrahimi
5508*62c56f98SSadaf Ebrahimi /*
5509*62c56f98SSadaf Ebrahimi * Check if a curve proposed by the peer is in our list.
5510*62c56f98SSadaf Ebrahimi * Return 0 if we're willing to use it, -1 otherwise.
5511*62c56f98SSadaf Ebrahimi */
mbedtls_ssl_check_curve_tls_id(const mbedtls_ssl_context * ssl,uint16_t tls_id)5512*62c56f98SSadaf Ebrahimi int mbedtls_ssl_check_curve_tls_id(const mbedtls_ssl_context *ssl, uint16_t tls_id)
5513*62c56f98SSadaf Ebrahimi {
5514*62c56f98SSadaf Ebrahimi const uint16_t *group_list = mbedtls_ssl_get_groups(ssl);
5515*62c56f98SSadaf Ebrahimi
5516*62c56f98SSadaf Ebrahimi if (group_list == NULL) {
5517*62c56f98SSadaf Ebrahimi return -1;
5518*62c56f98SSadaf Ebrahimi }
5519*62c56f98SSadaf Ebrahimi
5520*62c56f98SSadaf Ebrahimi for (; *group_list != 0; group_list++) {
5521*62c56f98SSadaf Ebrahimi if (*group_list == tls_id) {
5522*62c56f98SSadaf Ebrahimi return 0;
5523*62c56f98SSadaf Ebrahimi }
5524*62c56f98SSadaf Ebrahimi }
5525*62c56f98SSadaf Ebrahimi
5526*62c56f98SSadaf Ebrahimi return -1;
5527*62c56f98SSadaf Ebrahimi }
5528*62c56f98SSadaf Ebrahimi
5529*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PK_HAVE_ECC_KEYS)
5530*62c56f98SSadaf Ebrahimi /*
5531*62c56f98SSadaf Ebrahimi * Same as mbedtls_ssl_check_curve_tls_id() but with a mbedtls_ecp_group_id.
5532*62c56f98SSadaf Ebrahimi */
mbedtls_ssl_check_curve(const mbedtls_ssl_context * ssl,mbedtls_ecp_group_id grp_id)5533*62c56f98SSadaf Ebrahimi int mbedtls_ssl_check_curve(const mbedtls_ssl_context *ssl, mbedtls_ecp_group_id grp_id)
5534*62c56f98SSadaf Ebrahimi {
5535*62c56f98SSadaf Ebrahimi uint16_t tls_id = mbedtls_ssl_get_tls_id_from_ecp_group_id(grp_id);
5536*62c56f98SSadaf Ebrahimi
5537*62c56f98SSadaf Ebrahimi if (tls_id == 0) {
5538*62c56f98SSadaf Ebrahimi return -1;
5539*62c56f98SSadaf Ebrahimi }
5540*62c56f98SSadaf Ebrahimi
5541*62c56f98SSadaf Ebrahimi return mbedtls_ssl_check_curve_tls_id(ssl, tls_id);
5542*62c56f98SSadaf Ebrahimi }
5543*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_PK_HAVE_ECC_KEYS */
5544*62c56f98SSadaf Ebrahimi
5545*62c56f98SSadaf Ebrahimi static const struct {
5546*62c56f98SSadaf Ebrahimi uint16_t tls_id;
5547*62c56f98SSadaf Ebrahimi mbedtls_ecp_group_id ecp_group_id;
5548*62c56f98SSadaf Ebrahimi psa_ecc_family_t psa_family;
5549*62c56f98SSadaf Ebrahimi uint16_t bits;
5550*62c56f98SSadaf Ebrahimi } tls_id_match_table[] =
5551*62c56f98SSadaf Ebrahimi {
5552*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_ECP_HAVE_SECP521R1)
5553*62c56f98SSadaf Ebrahimi { 25, MBEDTLS_ECP_DP_SECP521R1, PSA_ECC_FAMILY_SECP_R1, 521 },
5554*62c56f98SSadaf Ebrahimi #endif
5555*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_ECP_HAVE_BP512R1)
5556*62c56f98SSadaf Ebrahimi { 28, MBEDTLS_ECP_DP_BP512R1, PSA_ECC_FAMILY_BRAINPOOL_P_R1, 512 },
5557*62c56f98SSadaf Ebrahimi #endif
5558*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_ECP_HAVE_SECP384R1)
5559*62c56f98SSadaf Ebrahimi { 24, MBEDTLS_ECP_DP_SECP384R1, PSA_ECC_FAMILY_SECP_R1, 384 },
5560*62c56f98SSadaf Ebrahimi #endif
5561*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_ECP_HAVE_BP384R1)
5562*62c56f98SSadaf Ebrahimi { 27, MBEDTLS_ECP_DP_BP384R1, PSA_ECC_FAMILY_BRAINPOOL_P_R1, 384 },
5563*62c56f98SSadaf Ebrahimi #endif
5564*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_ECP_HAVE_SECP256R1)
5565*62c56f98SSadaf Ebrahimi { 23, MBEDTLS_ECP_DP_SECP256R1, PSA_ECC_FAMILY_SECP_R1, 256 },
5566*62c56f98SSadaf Ebrahimi #endif
5567*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_ECP_HAVE_SECP256K1)
5568*62c56f98SSadaf Ebrahimi { 22, MBEDTLS_ECP_DP_SECP256K1, PSA_ECC_FAMILY_SECP_K1, 256 },
5569*62c56f98SSadaf Ebrahimi #endif
5570*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_ECP_HAVE_BP256R1)
5571*62c56f98SSadaf Ebrahimi { 26, MBEDTLS_ECP_DP_BP256R1, PSA_ECC_FAMILY_BRAINPOOL_P_R1, 256 },
5572*62c56f98SSadaf Ebrahimi #endif
5573*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_ECP_HAVE_SECP224R1)
5574*62c56f98SSadaf Ebrahimi { 21, MBEDTLS_ECP_DP_SECP224R1, PSA_ECC_FAMILY_SECP_R1, 224 },
5575*62c56f98SSadaf Ebrahimi #endif
5576*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_ECP_HAVE_SECP224K1)
5577*62c56f98SSadaf Ebrahimi { 20, MBEDTLS_ECP_DP_SECP224K1, PSA_ECC_FAMILY_SECP_K1, 224 },
5578*62c56f98SSadaf Ebrahimi #endif
5579*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_ECP_HAVE_SECP192R1)
5580*62c56f98SSadaf Ebrahimi { 19, MBEDTLS_ECP_DP_SECP192R1, PSA_ECC_FAMILY_SECP_R1, 192 },
5581*62c56f98SSadaf Ebrahimi #endif
5582*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_ECP_HAVE_SECP192K1)
5583*62c56f98SSadaf Ebrahimi { 18, MBEDTLS_ECP_DP_SECP192K1, PSA_ECC_FAMILY_SECP_K1, 192 },
5584*62c56f98SSadaf Ebrahimi #endif
5585*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_ECP_HAVE_CURVE25519)
5586*62c56f98SSadaf Ebrahimi { 29, MBEDTLS_ECP_DP_CURVE25519, PSA_ECC_FAMILY_MONTGOMERY, 255 },
5587*62c56f98SSadaf Ebrahimi #endif
5588*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_ECP_HAVE_CURVE448)
5589*62c56f98SSadaf Ebrahimi { 30, MBEDTLS_ECP_DP_CURVE448, PSA_ECC_FAMILY_MONTGOMERY, 448 },
5590*62c56f98SSadaf Ebrahimi #endif
5591*62c56f98SSadaf Ebrahimi { 0, MBEDTLS_ECP_DP_NONE, 0, 0 },
5592*62c56f98SSadaf Ebrahimi };
5593*62c56f98SSadaf Ebrahimi
mbedtls_ssl_get_psa_curve_info_from_tls_id(uint16_t tls_id,psa_key_type_t * type,size_t * bits)5594*62c56f98SSadaf Ebrahimi int mbedtls_ssl_get_psa_curve_info_from_tls_id(uint16_t tls_id,
5595*62c56f98SSadaf Ebrahimi psa_key_type_t *type,
5596*62c56f98SSadaf Ebrahimi size_t *bits)
5597*62c56f98SSadaf Ebrahimi {
5598*62c56f98SSadaf Ebrahimi for (int i = 0; tls_id_match_table[i].tls_id != 0; i++) {
5599*62c56f98SSadaf Ebrahimi if (tls_id_match_table[i].tls_id == tls_id) {
5600*62c56f98SSadaf Ebrahimi if (type != NULL) {
5601*62c56f98SSadaf Ebrahimi *type = PSA_KEY_TYPE_ECC_KEY_PAIR(tls_id_match_table[i].psa_family);
5602*62c56f98SSadaf Ebrahimi }
5603*62c56f98SSadaf Ebrahimi if (bits != NULL) {
5604*62c56f98SSadaf Ebrahimi *bits = tls_id_match_table[i].bits;
5605*62c56f98SSadaf Ebrahimi }
5606*62c56f98SSadaf Ebrahimi return PSA_SUCCESS;
5607*62c56f98SSadaf Ebrahimi }
5608*62c56f98SSadaf Ebrahimi }
5609*62c56f98SSadaf Ebrahimi
5610*62c56f98SSadaf Ebrahimi return PSA_ERROR_NOT_SUPPORTED;
5611*62c56f98SSadaf Ebrahimi }
5612*62c56f98SSadaf Ebrahimi
mbedtls_ssl_get_ecp_group_id_from_tls_id(uint16_t tls_id)5613*62c56f98SSadaf Ebrahimi mbedtls_ecp_group_id mbedtls_ssl_get_ecp_group_id_from_tls_id(uint16_t tls_id)
5614*62c56f98SSadaf Ebrahimi {
5615*62c56f98SSadaf Ebrahimi for (int i = 0; tls_id_match_table[i].tls_id != 0; i++) {
5616*62c56f98SSadaf Ebrahimi if (tls_id_match_table[i].tls_id == tls_id) {
5617*62c56f98SSadaf Ebrahimi return tls_id_match_table[i].ecp_group_id;
5618*62c56f98SSadaf Ebrahimi }
5619*62c56f98SSadaf Ebrahimi }
5620*62c56f98SSadaf Ebrahimi
5621*62c56f98SSadaf Ebrahimi return MBEDTLS_ECP_DP_NONE;
5622*62c56f98SSadaf Ebrahimi }
5623*62c56f98SSadaf Ebrahimi
mbedtls_ssl_get_tls_id_from_ecp_group_id(mbedtls_ecp_group_id grp_id)5624*62c56f98SSadaf Ebrahimi uint16_t mbedtls_ssl_get_tls_id_from_ecp_group_id(mbedtls_ecp_group_id grp_id)
5625*62c56f98SSadaf Ebrahimi {
5626*62c56f98SSadaf Ebrahimi for (int i = 0; tls_id_match_table[i].ecp_group_id != MBEDTLS_ECP_DP_NONE;
5627*62c56f98SSadaf Ebrahimi i++) {
5628*62c56f98SSadaf Ebrahimi if (tls_id_match_table[i].ecp_group_id == grp_id) {
5629*62c56f98SSadaf Ebrahimi return tls_id_match_table[i].tls_id;
5630*62c56f98SSadaf Ebrahimi }
5631*62c56f98SSadaf Ebrahimi }
5632*62c56f98SSadaf Ebrahimi
5633*62c56f98SSadaf Ebrahimi return 0;
5634*62c56f98SSadaf Ebrahimi }
5635*62c56f98SSadaf Ebrahimi
5636*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_DEBUG_C)
5637*62c56f98SSadaf Ebrahimi static const struct {
5638*62c56f98SSadaf Ebrahimi uint16_t tls_id;
5639*62c56f98SSadaf Ebrahimi const char *name;
5640*62c56f98SSadaf Ebrahimi } tls_id_curve_name_table[] =
5641*62c56f98SSadaf Ebrahimi {
5642*62c56f98SSadaf Ebrahimi { MBEDTLS_SSL_IANA_TLS_GROUP_SECP521R1, "secp521r1" },
5643*62c56f98SSadaf Ebrahimi { MBEDTLS_SSL_IANA_TLS_GROUP_BP512R1, "brainpoolP512r1" },
5644*62c56f98SSadaf Ebrahimi { MBEDTLS_SSL_IANA_TLS_GROUP_SECP384R1, "secp384r1" },
5645*62c56f98SSadaf Ebrahimi { MBEDTLS_SSL_IANA_TLS_GROUP_BP384R1, "brainpoolP384r1" },
5646*62c56f98SSadaf Ebrahimi { MBEDTLS_SSL_IANA_TLS_GROUP_SECP256R1, "secp256r1" },
5647*62c56f98SSadaf Ebrahimi { MBEDTLS_SSL_IANA_TLS_GROUP_SECP256K1, "secp256k1" },
5648*62c56f98SSadaf Ebrahimi { MBEDTLS_SSL_IANA_TLS_GROUP_BP256R1, "brainpoolP256r1" },
5649*62c56f98SSadaf Ebrahimi { MBEDTLS_SSL_IANA_TLS_GROUP_SECP224R1, "secp224r1" },
5650*62c56f98SSadaf Ebrahimi { MBEDTLS_SSL_IANA_TLS_GROUP_SECP224K1, "secp224k1" },
5651*62c56f98SSadaf Ebrahimi { MBEDTLS_SSL_IANA_TLS_GROUP_SECP192R1, "secp192r1" },
5652*62c56f98SSadaf Ebrahimi { MBEDTLS_SSL_IANA_TLS_GROUP_SECP192K1, "secp192k1" },
5653*62c56f98SSadaf Ebrahimi { MBEDTLS_SSL_IANA_TLS_GROUP_X25519, "x25519" },
5654*62c56f98SSadaf Ebrahimi { MBEDTLS_SSL_IANA_TLS_GROUP_X448, "x448" },
5655*62c56f98SSadaf Ebrahimi { 0, NULL },
5656*62c56f98SSadaf Ebrahimi };
5657*62c56f98SSadaf Ebrahimi
mbedtls_ssl_get_curve_name_from_tls_id(uint16_t tls_id)5658*62c56f98SSadaf Ebrahimi const char *mbedtls_ssl_get_curve_name_from_tls_id(uint16_t tls_id)
5659*62c56f98SSadaf Ebrahimi {
5660*62c56f98SSadaf Ebrahimi for (int i = 0; tls_id_curve_name_table[i].tls_id != 0; i++) {
5661*62c56f98SSadaf Ebrahimi if (tls_id_curve_name_table[i].tls_id == tls_id) {
5662*62c56f98SSadaf Ebrahimi return tls_id_curve_name_table[i].name;
5663*62c56f98SSadaf Ebrahimi }
5664*62c56f98SSadaf Ebrahimi }
5665*62c56f98SSadaf Ebrahimi
5666*62c56f98SSadaf Ebrahimi return NULL;
5667*62c56f98SSadaf Ebrahimi }
5668*62c56f98SSadaf Ebrahimi #endif
5669*62c56f98SSadaf Ebrahimi
5670*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_X509_CRT_PARSE_C)
mbedtls_ssl_check_cert_usage(const mbedtls_x509_crt * cert,const mbedtls_ssl_ciphersuite_t * ciphersuite,int cert_endpoint,uint32_t * flags)5671*62c56f98SSadaf Ebrahimi int mbedtls_ssl_check_cert_usage(const mbedtls_x509_crt *cert,
5672*62c56f98SSadaf Ebrahimi const mbedtls_ssl_ciphersuite_t *ciphersuite,
5673*62c56f98SSadaf Ebrahimi int cert_endpoint,
5674*62c56f98SSadaf Ebrahimi uint32_t *flags)
5675*62c56f98SSadaf Ebrahimi {
5676*62c56f98SSadaf Ebrahimi int ret = 0;
5677*62c56f98SSadaf Ebrahimi int usage = 0;
5678*62c56f98SSadaf Ebrahimi const char *ext_oid;
5679*62c56f98SSadaf Ebrahimi size_t ext_len;
5680*62c56f98SSadaf Ebrahimi
5681*62c56f98SSadaf Ebrahimi if (cert_endpoint == MBEDTLS_SSL_IS_SERVER) {
5682*62c56f98SSadaf Ebrahimi /* Server part of the key exchange */
5683*62c56f98SSadaf Ebrahimi switch (ciphersuite->key_exchange) {
5684*62c56f98SSadaf Ebrahimi case MBEDTLS_KEY_EXCHANGE_RSA:
5685*62c56f98SSadaf Ebrahimi case MBEDTLS_KEY_EXCHANGE_RSA_PSK:
5686*62c56f98SSadaf Ebrahimi usage = MBEDTLS_X509_KU_KEY_ENCIPHERMENT;
5687*62c56f98SSadaf Ebrahimi break;
5688*62c56f98SSadaf Ebrahimi
5689*62c56f98SSadaf Ebrahimi case MBEDTLS_KEY_EXCHANGE_DHE_RSA:
5690*62c56f98SSadaf Ebrahimi case MBEDTLS_KEY_EXCHANGE_ECDHE_RSA:
5691*62c56f98SSadaf Ebrahimi case MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA:
5692*62c56f98SSadaf Ebrahimi usage = MBEDTLS_X509_KU_DIGITAL_SIGNATURE;
5693*62c56f98SSadaf Ebrahimi break;
5694*62c56f98SSadaf Ebrahimi
5695*62c56f98SSadaf Ebrahimi case MBEDTLS_KEY_EXCHANGE_ECDH_RSA:
5696*62c56f98SSadaf Ebrahimi case MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA:
5697*62c56f98SSadaf Ebrahimi usage = MBEDTLS_X509_KU_KEY_AGREEMENT;
5698*62c56f98SSadaf Ebrahimi break;
5699*62c56f98SSadaf Ebrahimi
5700*62c56f98SSadaf Ebrahimi /* Don't use default: we want warnings when adding new values */
5701*62c56f98SSadaf Ebrahimi case MBEDTLS_KEY_EXCHANGE_NONE:
5702*62c56f98SSadaf Ebrahimi case MBEDTLS_KEY_EXCHANGE_PSK:
5703*62c56f98SSadaf Ebrahimi case MBEDTLS_KEY_EXCHANGE_DHE_PSK:
5704*62c56f98SSadaf Ebrahimi case MBEDTLS_KEY_EXCHANGE_ECDHE_PSK:
5705*62c56f98SSadaf Ebrahimi case MBEDTLS_KEY_EXCHANGE_ECJPAKE:
5706*62c56f98SSadaf Ebrahimi usage = 0;
5707*62c56f98SSadaf Ebrahimi }
5708*62c56f98SSadaf Ebrahimi } else {
5709*62c56f98SSadaf Ebrahimi /* Client auth: we only implement rsa_sign and mbedtls_ecdsa_sign for now */
5710*62c56f98SSadaf Ebrahimi usage = MBEDTLS_X509_KU_DIGITAL_SIGNATURE;
5711*62c56f98SSadaf Ebrahimi }
5712*62c56f98SSadaf Ebrahimi
5713*62c56f98SSadaf Ebrahimi if (mbedtls_x509_crt_check_key_usage(cert, usage) != 0) {
5714*62c56f98SSadaf Ebrahimi *flags |= MBEDTLS_X509_BADCERT_KEY_USAGE;
5715*62c56f98SSadaf Ebrahimi ret = -1;
5716*62c56f98SSadaf Ebrahimi }
5717*62c56f98SSadaf Ebrahimi
5718*62c56f98SSadaf Ebrahimi if (cert_endpoint == MBEDTLS_SSL_IS_SERVER) {
5719*62c56f98SSadaf Ebrahimi ext_oid = MBEDTLS_OID_SERVER_AUTH;
5720*62c56f98SSadaf Ebrahimi ext_len = MBEDTLS_OID_SIZE(MBEDTLS_OID_SERVER_AUTH);
5721*62c56f98SSadaf Ebrahimi } else {
5722*62c56f98SSadaf Ebrahimi ext_oid = MBEDTLS_OID_CLIENT_AUTH;
5723*62c56f98SSadaf Ebrahimi ext_len = MBEDTLS_OID_SIZE(MBEDTLS_OID_CLIENT_AUTH);
5724*62c56f98SSadaf Ebrahimi }
5725*62c56f98SSadaf Ebrahimi
5726*62c56f98SSadaf Ebrahimi if (mbedtls_x509_crt_check_extended_key_usage(cert, ext_oid, ext_len) != 0) {
5727*62c56f98SSadaf Ebrahimi *flags |= MBEDTLS_X509_BADCERT_EXT_KEY_USAGE;
5728*62c56f98SSadaf Ebrahimi ret = -1;
5729*62c56f98SSadaf Ebrahimi }
5730*62c56f98SSadaf Ebrahimi
5731*62c56f98SSadaf Ebrahimi return ret;
5732*62c56f98SSadaf Ebrahimi }
5733*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_X509_CRT_PARSE_C */
5734*62c56f98SSadaf Ebrahimi
5735*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO)
mbedtls_ssl_get_handshake_transcript(mbedtls_ssl_context * ssl,const mbedtls_md_type_t md,unsigned char * dst,size_t dst_len,size_t * olen)5736*62c56f98SSadaf Ebrahimi int mbedtls_ssl_get_handshake_transcript(mbedtls_ssl_context *ssl,
5737*62c56f98SSadaf Ebrahimi const mbedtls_md_type_t md,
5738*62c56f98SSadaf Ebrahimi unsigned char *dst,
5739*62c56f98SSadaf Ebrahimi size_t dst_len,
5740*62c56f98SSadaf Ebrahimi size_t *olen)
5741*62c56f98SSadaf Ebrahimi {
5742*62c56f98SSadaf Ebrahimi psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
5743*62c56f98SSadaf Ebrahimi psa_hash_operation_t *hash_operation_to_clone;
5744*62c56f98SSadaf Ebrahimi psa_hash_operation_t hash_operation = psa_hash_operation_init();
5745*62c56f98SSadaf Ebrahimi
5746*62c56f98SSadaf Ebrahimi *olen = 0;
5747*62c56f98SSadaf Ebrahimi
5748*62c56f98SSadaf Ebrahimi switch (md) {
5749*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA384)
5750*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA384:
5751*62c56f98SSadaf Ebrahimi hash_operation_to_clone = &ssl->handshake->fin_sha384_psa;
5752*62c56f98SSadaf Ebrahimi break;
5753*62c56f98SSadaf Ebrahimi #endif
5754*62c56f98SSadaf Ebrahimi
5755*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA256)
5756*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA256:
5757*62c56f98SSadaf Ebrahimi hash_operation_to_clone = &ssl->handshake->fin_sha256_psa;
5758*62c56f98SSadaf Ebrahimi break;
5759*62c56f98SSadaf Ebrahimi #endif
5760*62c56f98SSadaf Ebrahimi
5761*62c56f98SSadaf Ebrahimi default:
5762*62c56f98SSadaf Ebrahimi goto exit;
5763*62c56f98SSadaf Ebrahimi }
5764*62c56f98SSadaf Ebrahimi
5765*62c56f98SSadaf Ebrahimi status = psa_hash_clone(hash_operation_to_clone, &hash_operation);
5766*62c56f98SSadaf Ebrahimi if (status != PSA_SUCCESS) {
5767*62c56f98SSadaf Ebrahimi goto exit;
5768*62c56f98SSadaf Ebrahimi }
5769*62c56f98SSadaf Ebrahimi
5770*62c56f98SSadaf Ebrahimi status = psa_hash_finish(&hash_operation, dst, dst_len, olen);
5771*62c56f98SSadaf Ebrahimi if (status != PSA_SUCCESS) {
5772*62c56f98SSadaf Ebrahimi goto exit;
5773*62c56f98SSadaf Ebrahimi }
5774*62c56f98SSadaf Ebrahimi
5775*62c56f98SSadaf Ebrahimi exit:
5776*62c56f98SSadaf Ebrahimi #if !defined(MBEDTLS_MD_CAN_SHA384) && \
5777*62c56f98SSadaf Ebrahimi !defined(MBEDTLS_MD_CAN_SHA256)
5778*62c56f98SSadaf Ebrahimi (void) ssl;
5779*62c56f98SSadaf Ebrahimi #endif
5780*62c56f98SSadaf Ebrahimi return PSA_TO_MBEDTLS_ERR(status);
5781*62c56f98SSadaf Ebrahimi }
5782*62c56f98SSadaf Ebrahimi #else /* MBEDTLS_USE_PSA_CRYPTO */
5783*62c56f98SSadaf Ebrahimi
5784*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA384)
5785*62c56f98SSadaf Ebrahimi MBEDTLS_CHECK_RETURN_CRITICAL
ssl_get_handshake_transcript_sha384(mbedtls_ssl_context * ssl,unsigned char * dst,size_t dst_len,size_t * olen)5786*62c56f98SSadaf Ebrahimi static int ssl_get_handshake_transcript_sha384(mbedtls_ssl_context *ssl,
5787*62c56f98SSadaf Ebrahimi unsigned char *dst,
5788*62c56f98SSadaf Ebrahimi size_t dst_len,
5789*62c56f98SSadaf Ebrahimi size_t *olen)
5790*62c56f98SSadaf Ebrahimi {
5791*62c56f98SSadaf Ebrahimi int ret;
5792*62c56f98SSadaf Ebrahimi mbedtls_md_context_t sha384;
5793*62c56f98SSadaf Ebrahimi
5794*62c56f98SSadaf Ebrahimi if (dst_len < 48) {
5795*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
5796*62c56f98SSadaf Ebrahimi }
5797*62c56f98SSadaf Ebrahimi
5798*62c56f98SSadaf Ebrahimi mbedtls_md_init(&sha384);
5799*62c56f98SSadaf Ebrahimi ret = mbedtls_md_setup(&sha384, mbedtls_md_info_from_type(MBEDTLS_MD_SHA384), 0);
5800*62c56f98SSadaf Ebrahimi if (ret != 0) {
5801*62c56f98SSadaf Ebrahimi goto exit;
5802*62c56f98SSadaf Ebrahimi }
5803*62c56f98SSadaf Ebrahimi ret = mbedtls_md_clone(&sha384, &ssl->handshake->fin_sha384);
5804*62c56f98SSadaf Ebrahimi if (ret != 0) {
5805*62c56f98SSadaf Ebrahimi goto exit;
5806*62c56f98SSadaf Ebrahimi }
5807*62c56f98SSadaf Ebrahimi
5808*62c56f98SSadaf Ebrahimi if ((ret = mbedtls_md_finish(&sha384, dst)) != 0) {
5809*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_md_finish", ret);
5810*62c56f98SSadaf Ebrahimi goto exit;
5811*62c56f98SSadaf Ebrahimi }
5812*62c56f98SSadaf Ebrahimi
5813*62c56f98SSadaf Ebrahimi *olen = 48;
5814*62c56f98SSadaf Ebrahimi
5815*62c56f98SSadaf Ebrahimi exit:
5816*62c56f98SSadaf Ebrahimi
5817*62c56f98SSadaf Ebrahimi mbedtls_md_free(&sha384);
5818*62c56f98SSadaf Ebrahimi return ret;
5819*62c56f98SSadaf Ebrahimi }
5820*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_MD_CAN_SHA384 */
5821*62c56f98SSadaf Ebrahimi
5822*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA256)
5823*62c56f98SSadaf Ebrahimi MBEDTLS_CHECK_RETURN_CRITICAL
ssl_get_handshake_transcript_sha256(mbedtls_ssl_context * ssl,unsigned char * dst,size_t dst_len,size_t * olen)5824*62c56f98SSadaf Ebrahimi static int ssl_get_handshake_transcript_sha256(mbedtls_ssl_context *ssl,
5825*62c56f98SSadaf Ebrahimi unsigned char *dst,
5826*62c56f98SSadaf Ebrahimi size_t dst_len,
5827*62c56f98SSadaf Ebrahimi size_t *olen)
5828*62c56f98SSadaf Ebrahimi {
5829*62c56f98SSadaf Ebrahimi int ret;
5830*62c56f98SSadaf Ebrahimi mbedtls_md_context_t sha256;
5831*62c56f98SSadaf Ebrahimi
5832*62c56f98SSadaf Ebrahimi if (dst_len < 32) {
5833*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
5834*62c56f98SSadaf Ebrahimi }
5835*62c56f98SSadaf Ebrahimi
5836*62c56f98SSadaf Ebrahimi mbedtls_md_init(&sha256);
5837*62c56f98SSadaf Ebrahimi ret = mbedtls_md_setup(&sha256, mbedtls_md_info_from_type(MBEDTLS_MD_SHA256), 0);
5838*62c56f98SSadaf Ebrahimi if (ret != 0) {
5839*62c56f98SSadaf Ebrahimi goto exit;
5840*62c56f98SSadaf Ebrahimi }
5841*62c56f98SSadaf Ebrahimi ret = mbedtls_md_clone(&sha256, &ssl->handshake->fin_sha256);
5842*62c56f98SSadaf Ebrahimi if (ret != 0) {
5843*62c56f98SSadaf Ebrahimi goto exit;
5844*62c56f98SSadaf Ebrahimi }
5845*62c56f98SSadaf Ebrahimi
5846*62c56f98SSadaf Ebrahimi if ((ret = mbedtls_md_finish(&sha256, dst)) != 0) {
5847*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_md_finish", ret);
5848*62c56f98SSadaf Ebrahimi goto exit;
5849*62c56f98SSadaf Ebrahimi }
5850*62c56f98SSadaf Ebrahimi
5851*62c56f98SSadaf Ebrahimi *olen = 32;
5852*62c56f98SSadaf Ebrahimi
5853*62c56f98SSadaf Ebrahimi exit:
5854*62c56f98SSadaf Ebrahimi
5855*62c56f98SSadaf Ebrahimi mbedtls_md_free(&sha256);
5856*62c56f98SSadaf Ebrahimi return ret;
5857*62c56f98SSadaf Ebrahimi }
5858*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_MD_CAN_SHA256 */
5859*62c56f98SSadaf Ebrahimi
mbedtls_ssl_get_handshake_transcript(mbedtls_ssl_context * ssl,const mbedtls_md_type_t md,unsigned char * dst,size_t dst_len,size_t * olen)5860*62c56f98SSadaf Ebrahimi int mbedtls_ssl_get_handshake_transcript(mbedtls_ssl_context *ssl,
5861*62c56f98SSadaf Ebrahimi const mbedtls_md_type_t md,
5862*62c56f98SSadaf Ebrahimi unsigned char *dst,
5863*62c56f98SSadaf Ebrahimi size_t dst_len,
5864*62c56f98SSadaf Ebrahimi size_t *olen)
5865*62c56f98SSadaf Ebrahimi {
5866*62c56f98SSadaf Ebrahimi switch (md) {
5867*62c56f98SSadaf Ebrahimi
5868*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA384)
5869*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA384:
5870*62c56f98SSadaf Ebrahimi return ssl_get_handshake_transcript_sha384(ssl, dst, dst_len, olen);
5871*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_MD_CAN_SHA384*/
5872*62c56f98SSadaf Ebrahimi
5873*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA256)
5874*62c56f98SSadaf Ebrahimi case MBEDTLS_MD_SHA256:
5875*62c56f98SSadaf Ebrahimi return ssl_get_handshake_transcript_sha256(ssl, dst, dst_len, olen);
5876*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_MD_CAN_SHA256*/
5877*62c56f98SSadaf Ebrahimi
5878*62c56f98SSadaf Ebrahimi default:
5879*62c56f98SSadaf Ebrahimi #if !defined(MBEDTLS_MD_CAN_SHA384) && \
5880*62c56f98SSadaf Ebrahimi !defined(MBEDTLS_MD_CAN_SHA256)
5881*62c56f98SSadaf Ebrahimi (void) ssl;
5882*62c56f98SSadaf Ebrahimi (void) dst;
5883*62c56f98SSadaf Ebrahimi (void) dst_len;
5884*62c56f98SSadaf Ebrahimi (void) olen;
5885*62c56f98SSadaf Ebrahimi #endif
5886*62c56f98SSadaf Ebrahimi break;
5887*62c56f98SSadaf Ebrahimi }
5888*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
5889*62c56f98SSadaf Ebrahimi }
5890*62c56f98SSadaf Ebrahimi
5891*62c56f98SSadaf Ebrahimi #endif /* !MBEDTLS_USE_PSA_CRYPTO */
5892*62c56f98SSadaf Ebrahimi
5893*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED)
5894*62c56f98SSadaf Ebrahimi /* mbedtls_ssl_parse_sig_alg_ext()
5895*62c56f98SSadaf Ebrahimi *
5896*62c56f98SSadaf Ebrahimi * The `extension_data` field of signature algorithm contains a `SignatureSchemeList`
5897*62c56f98SSadaf Ebrahimi * value (TLS 1.3 RFC8446):
5898*62c56f98SSadaf Ebrahimi * enum {
5899*62c56f98SSadaf Ebrahimi * ....
5900*62c56f98SSadaf Ebrahimi * ecdsa_secp256r1_sha256( 0x0403 ),
5901*62c56f98SSadaf Ebrahimi * ecdsa_secp384r1_sha384( 0x0503 ),
5902*62c56f98SSadaf Ebrahimi * ecdsa_secp521r1_sha512( 0x0603 ),
5903*62c56f98SSadaf Ebrahimi * ....
5904*62c56f98SSadaf Ebrahimi * } SignatureScheme;
5905*62c56f98SSadaf Ebrahimi *
5906*62c56f98SSadaf Ebrahimi * struct {
5907*62c56f98SSadaf Ebrahimi * SignatureScheme supported_signature_algorithms<2..2^16-2>;
5908*62c56f98SSadaf Ebrahimi * } SignatureSchemeList;
5909*62c56f98SSadaf Ebrahimi *
5910*62c56f98SSadaf Ebrahimi * The `extension_data` field of signature algorithm contains a `SignatureAndHashAlgorithm`
5911*62c56f98SSadaf Ebrahimi * value (TLS 1.2 RFC5246):
5912*62c56f98SSadaf Ebrahimi * enum {
5913*62c56f98SSadaf Ebrahimi * none(0), md5(1), sha1(2), sha224(3), sha256(4), sha384(5),
5914*62c56f98SSadaf Ebrahimi * sha512(6), (255)
5915*62c56f98SSadaf Ebrahimi * } HashAlgorithm;
5916*62c56f98SSadaf Ebrahimi *
5917*62c56f98SSadaf Ebrahimi * enum { anonymous(0), rsa(1), dsa(2), ecdsa(3), (255) }
5918*62c56f98SSadaf Ebrahimi * SignatureAlgorithm;
5919*62c56f98SSadaf Ebrahimi *
5920*62c56f98SSadaf Ebrahimi * struct {
5921*62c56f98SSadaf Ebrahimi * HashAlgorithm hash;
5922*62c56f98SSadaf Ebrahimi * SignatureAlgorithm signature;
5923*62c56f98SSadaf Ebrahimi * } SignatureAndHashAlgorithm;
5924*62c56f98SSadaf Ebrahimi *
5925*62c56f98SSadaf Ebrahimi * SignatureAndHashAlgorithm
5926*62c56f98SSadaf Ebrahimi * supported_signature_algorithms<2..2^16-2>;
5927*62c56f98SSadaf Ebrahimi *
5928*62c56f98SSadaf Ebrahimi * The TLS 1.3 signature algorithm extension was defined to be a compatible
5929*62c56f98SSadaf Ebrahimi * generalization of the TLS 1.2 signature algorithm extension.
5930*62c56f98SSadaf Ebrahimi * `SignatureAndHashAlgorithm` field of TLS 1.2 can be represented by
5931*62c56f98SSadaf Ebrahimi * `SignatureScheme` field of TLS 1.3
5932*62c56f98SSadaf Ebrahimi *
5933*62c56f98SSadaf Ebrahimi */
mbedtls_ssl_parse_sig_alg_ext(mbedtls_ssl_context * ssl,const unsigned char * buf,const unsigned char * end)5934*62c56f98SSadaf Ebrahimi int mbedtls_ssl_parse_sig_alg_ext(mbedtls_ssl_context *ssl,
5935*62c56f98SSadaf Ebrahimi const unsigned char *buf,
5936*62c56f98SSadaf Ebrahimi const unsigned char *end)
5937*62c56f98SSadaf Ebrahimi {
5938*62c56f98SSadaf Ebrahimi const unsigned char *p = buf;
5939*62c56f98SSadaf Ebrahimi size_t supported_sig_algs_len = 0;
5940*62c56f98SSadaf Ebrahimi const unsigned char *supported_sig_algs_end;
5941*62c56f98SSadaf Ebrahimi uint16_t sig_alg;
5942*62c56f98SSadaf Ebrahimi uint32_t common_idx = 0;
5943*62c56f98SSadaf Ebrahimi
5944*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 2);
5945*62c56f98SSadaf Ebrahimi supported_sig_algs_len = MBEDTLS_GET_UINT16_BE(p, 0);
5946*62c56f98SSadaf Ebrahimi p += 2;
5947*62c56f98SSadaf Ebrahimi
5948*62c56f98SSadaf Ebrahimi memset(ssl->handshake->received_sig_algs, 0,
5949*62c56f98SSadaf Ebrahimi sizeof(ssl->handshake->received_sig_algs));
5950*62c56f98SSadaf Ebrahimi
5951*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, supported_sig_algs_len);
5952*62c56f98SSadaf Ebrahimi supported_sig_algs_end = p + supported_sig_algs_len;
5953*62c56f98SSadaf Ebrahimi while (p < supported_sig_algs_end) {
5954*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_CHK_BUF_READ_PTR(p, supported_sig_algs_end, 2);
5955*62c56f98SSadaf Ebrahimi sig_alg = MBEDTLS_GET_UINT16_BE(p, 0);
5956*62c56f98SSadaf Ebrahimi p += 2;
5957*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(4, ("received signature algorithm: 0x%x %s",
5958*62c56f98SSadaf Ebrahimi sig_alg,
5959*62c56f98SSadaf Ebrahimi mbedtls_ssl_sig_alg_to_str(sig_alg)));
5960*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
5961*62c56f98SSadaf Ebrahimi if (ssl->tls_version == MBEDTLS_SSL_VERSION_TLS1_2 &&
5962*62c56f98SSadaf Ebrahimi (!(mbedtls_ssl_sig_alg_is_supported(ssl, sig_alg) &&
5963*62c56f98SSadaf Ebrahimi mbedtls_ssl_sig_alg_is_offered(ssl, sig_alg)))) {
5964*62c56f98SSadaf Ebrahimi continue;
5965*62c56f98SSadaf Ebrahimi }
5966*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
5967*62c56f98SSadaf Ebrahimi
5968*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(4, ("valid signature algorithm: %s",
5969*62c56f98SSadaf Ebrahimi mbedtls_ssl_sig_alg_to_str(sig_alg)));
5970*62c56f98SSadaf Ebrahimi
5971*62c56f98SSadaf Ebrahimi if (common_idx + 1 < MBEDTLS_RECEIVED_SIG_ALGS_SIZE) {
5972*62c56f98SSadaf Ebrahimi ssl->handshake->received_sig_algs[common_idx] = sig_alg;
5973*62c56f98SSadaf Ebrahimi common_idx += 1;
5974*62c56f98SSadaf Ebrahimi }
5975*62c56f98SSadaf Ebrahimi }
5976*62c56f98SSadaf Ebrahimi /* Check that we consumed all the message. */
5977*62c56f98SSadaf Ebrahimi if (p != end) {
5978*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(1,
5979*62c56f98SSadaf Ebrahimi ("Signature algorithms extension length misaligned"));
5980*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR,
5981*62c56f98SSadaf Ebrahimi MBEDTLS_ERR_SSL_DECODE_ERROR);
5982*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_DECODE_ERROR;
5983*62c56f98SSadaf Ebrahimi }
5984*62c56f98SSadaf Ebrahimi
5985*62c56f98SSadaf Ebrahimi if (common_idx == 0) {
5986*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(3, ("no signature algorithm in common"));
5987*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE,
5988*62c56f98SSadaf Ebrahimi MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE);
5989*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
5990*62c56f98SSadaf Ebrahimi }
5991*62c56f98SSadaf Ebrahimi
5992*62c56f98SSadaf Ebrahimi ssl->handshake->received_sig_algs[common_idx] = MBEDTLS_TLS_SIG_NONE;
5993*62c56f98SSadaf Ebrahimi return 0;
5994*62c56f98SSadaf Ebrahimi }
5995*62c56f98SSadaf Ebrahimi
5996*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED */
5997*62c56f98SSadaf Ebrahimi
5998*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
5999*62c56f98SSadaf Ebrahimi
6000*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO)
6001*62c56f98SSadaf Ebrahimi
setup_psa_key_derivation(psa_key_derivation_operation_t * derivation,mbedtls_svc_key_id_t key,psa_algorithm_t alg,const unsigned char * raw_psk,size_t raw_psk_length,const unsigned char * seed,size_t seed_length,const unsigned char * label,size_t label_length,const unsigned char * other_secret,size_t other_secret_length,size_t capacity)6002*62c56f98SSadaf Ebrahimi static psa_status_t setup_psa_key_derivation(psa_key_derivation_operation_t *derivation,
6003*62c56f98SSadaf Ebrahimi mbedtls_svc_key_id_t key,
6004*62c56f98SSadaf Ebrahimi psa_algorithm_t alg,
6005*62c56f98SSadaf Ebrahimi const unsigned char *raw_psk, size_t raw_psk_length,
6006*62c56f98SSadaf Ebrahimi const unsigned char *seed, size_t seed_length,
6007*62c56f98SSadaf Ebrahimi const unsigned char *label, size_t label_length,
6008*62c56f98SSadaf Ebrahimi const unsigned char *other_secret,
6009*62c56f98SSadaf Ebrahimi size_t other_secret_length,
6010*62c56f98SSadaf Ebrahimi size_t capacity)
6011*62c56f98SSadaf Ebrahimi {
6012*62c56f98SSadaf Ebrahimi psa_status_t status;
6013*62c56f98SSadaf Ebrahimi
6014*62c56f98SSadaf Ebrahimi status = psa_key_derivation_setup(derivation, alg);
6015*62c56f98SSadaf Ebrahimi if (status != PSA_SUCCESS) {
6016*62c56f98SSadaf Ebrahimi return status;
6017*62c56f98SSadaf Ebrahimi }
6018*62c56f98SSadaf Ebrahimi
6019*62c56f98SSadaf Ebrahimi if (PSA_ALG_IS_TLS12_PRF(alg) || PSA_ALG_IS_TLS12_PSK_TO_MS(alg)) {
6020*62c56f98SSadaf Ebrahimi status = psa_key_derivation_input_bytes(derivation,
6021*62c56f98SSadaf Ebrahimi PSA_KEY_DERIVATION_INPUT_SEED,
6022*62c56f98SSadaf Ebrahimi seed, seed_length);
6023*62c56f98SSadaf Ebrahimi if (status != PSA_SUCCESS) {
6024*62c56f98SSadaf Ebrahimi return status;
6025*62c56f98SSadaf Ebrahimi }
6026*62c56f98SSadaf Ebrahimi
6027*62c56f98SSadaf Ebrahimi if (other_secret != NULL) {
6028*62c56f98SSadaf Ebrahimi status = psa_key_derivation_input_bytes(derivation,
6029*62c56f98SSadaf Ebrahimi PSA_KEY_DERIVATION_INPUT_OTHER_SECRET,
6030*62c56f98SSadaf Ebrahimi other_secret, other_secret_length);
6031*62c56f98SSadaf Ebrahimi if (status != PSA_SUCCESS) {
6032*62c56f98SSadaf Ebrahimi return status;
6033*62c56f98SSadaf Ebrahimi }
6034*62c56f98SSadaf Ebrahimi }
6035*62c56f98SSadaf Ebrahimi
6036*62c56f98SSadaf Ebrahimi if (mbedtls_svc_key_id_is_null(key)) {
6037*62c56f98SSadaf Ebrahimi status = psa_key_derivation_input_bytes(
6038*62c56f98SSadaf Ebrahimi derivation, PSA_KEY_DERIVATION_INPUT_SECRET,
6039*62c56f98SSadaf Ebrahimi raw_psk, raw_psk_length);
6040*62c56f98SSadaf Ebrahimi } else {
6041*62c56f98SSadaf Ebrahimi status = psa_key_derivation_input_key(
6042*62c56f98SSadaf Ebrahimi derivation, PSA_KEY_DERIVATION_INPUT_SECRET, key);
6043*62c56f98SSadaf Ebrahimi }
6044*62c56f98SSadaf Ebrahimi if (status != PSA_SUCCESS) {
6045*62c56f98SSadaf Ebrahimi return status;
6046*62c56f98SSadaf Ebrahimi }
6047*62c56f98SSadaf Ebrahimi
6048*62c56f98SSadaf Ebrahimi status = psa_key_derivation_input_bytes(derivation,
6049*62c56f98SSadaf Ebrahimi PSA_KEY_DERIVATION_INPUT_LABEL,
6050*62c56f98SSadaf Ebrahimi label, label_length);
6051*62c56f98SSadaf Ebrahimi if (status != PSA_SUCCESS) {
6052*62c56f98SSadaf Ebrahimi return status;
6053*62c56f98SSadaf Ebrahimi }
6054*62c56f98SSadaf Ebrahimi } else {
6055*62c56f98SSadaf Ebrahimi return PSA_ERROR_NOT_SUPPORTED;
6056*62c56f98SSadaf Ebrahimi }
6057*62c56f98SSadaf Ebrahimi
6058*62c56f98SSadaf Ebrahimi status = psa_key_derivation_set_capacity(derivation, capacity);
6059*62c56f98SSadaf Ebrahimi if (status != PSA_SUCCESS) {
6060*62c56f98SSadaf Ebrahimi return status;
6061*62c56f98SSadaf Ebrahimi }
6062*62c56f98SSadaf Ebrahimi
6063*62c56f98SSadaf Ebrahimi return PSA_SUCCESS;
6064*62c56f98SSadaf Ebrahimi }
6065*62c56f98SSadaf Ebrahimi
6066*62c56f98SSadaf Ebrahimi #if defined(PSA_WANT_ALG_SHA_384) || \
6067*62c56f98SSadaf Ebrahimi defined(PSA_WANT_ALG_SHA_256)
6068*62c56f98SSadaf Ebrahimi MBEDTLS_CHECK_RETURN_CRITICAL
tls_prf_generic(mbedtls_md_type_t md_type,const unsigned char * secret,size_t slen,const char * label,const unsigned char * random,size_t rlen,unsigned char * dstbuf,size_t dlen)6069*62c56f98SSadaf Ebrahimi static int tls_prf_generic(mbedtls_md_type_t md_type,
6070*62c56f98SSadaf Ebrahimi const unsigned char *secret, size_t slen,
6071*62c56f98SSadaf Ebrahimi const char *label,
6072*62c56f98SSadaf Ebrahimi const unsigned char *random, size_t rlen,
6073*62c56f98SSadaf Ebrahimi unsigned char *dstbuf, size_t dlen)
6074*62c56f98SSadaf Ebrahimi {
6075*62c56f98SSadaf Ebrahimi psa_status_t status;
6076*62c56f98SSadaf Ebrahimi psa_algorithm_t alg;
6077*62c56f98SSadaf Ebrahimi mbedtls_svc_key_id_t master_key = MBEDTLS_SVC_KEY_ID_INIT;
6078*62c56f98SSadaf Ebrahimi psa_key_derivation_operation_t derivation =
6079*62c56f98SSadaf Ebrahimi PSA_KEY_DERIVATION_OPERATION_INIT;
6080*62c56f98SSadaf Ebrahimi
6081*62c56f98SSadaf Ebrahimi if (md_type == MBEDTLS_MD_SHA384) {
6082*62c56f98SSadaf Ebrahimi alg = PSA_ALG_TLS12_PRF(PSA_ALG_SHA_384);
6083*62c56f98SSadaf Ebrahimi } else {
6084*62c56f98SSadaf Ebrahimi alg = PSA_ALG_TLS12_PRF(PSA_ALG_SHA_256);
6085*62c56f98SSadaf Ebrahimi }
6086*62c56f98SSadaf Ebrahimi
6087*62c56f98SSadaf Ebrahimi /* Normally a "secret" should be long enough to be impossible to
6088*62c56f98SSadaf Ebrahimi * find by brute force, and in particular should not be empty. But
6089*62c56f98SSadaf Ebrahimi * this PRF is also used to derive an IV, in particular in EAP-TLS,
6090*62c56f98SSadaf Ebrahimi * and for this use case it makes sense to have a 0-length "secret".
6091*62c56f98SSadaf Ebrahimi * Since the key API doesn't allow importing a key of length 0,
6092*62c56f98SSadaf Ebrahimi * keep master_key=0, which setup_psa_key_derivation() understands
6093*62c56f98SSadaf Ebrahimi * to mean a 0-length "secret" input. */
6094*62c56f98SSadaf Ebrahimi if (slen != 0) {
6095*62c56f98SSadaf Ebrahimi psa_key_attributes_t key_attributes = psa_key_attributes_init();
6096*62c56f98SSadaf Ebrahimi psa_set_key_usage_flags(&key_attributes, PSA_KEY_USAGE_DERIVE);
6097*62c56f98SSadaf Ebrahimi psa_set_key_algorithm(&key_attributes, alg);
6098*62c56f98SSadaf Ebrahimi psa_set_key_type(&key_attributes, PSA_KEY_TYPE_DERIVE);
6099*62c56f98SSadaf Ebrahimi
6100*62c56f98SSadaf Ebrahimi status = psa_import_key(&key_attributes, secret, slen, &master_key);
6101*62c56f98SSadaf Ebrahimi if (status != PSA_SUCCESS) {
6102*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_HW_ACCEL_FAILED;
6103*62c56f98SSadaf Ebrahimi }
6104*62c56f98SSadaf Ebrahimi }
6105*62c56f98SSadaf Ebrahimi
6106*62c56f98SSadaf Ebrahimi status = setup_psa_key_derivation(&derivation,
6107*62c56f98SSadaf Ebrahimi master_key, alg,
6108*62c56f98SSadaf Ebrahimi NULL, 0,
6109*62c56f98SSadaf Ebrahimi random, rlen,
6110*62c56f98SSadaf Ebrahimi (unsigned char const *) label,
6111*62c56f98SSadaf Ebrahimi (size_t) strlen(label),
6112*62c56f98SSadaf Ebrahimi NULL, 0,
6113*62c56f98SSadaf Ebrahimi dlen);
6114*62c56f98SSadaf Ebrahimi if (status != PSA_SUCCESS) {
6115*62c56f98SSadaf Ebrahimi psa_key_derivation_abort(&derivation);
6116*62c56f98SSadaf Ebrahimi psa_destroy_key(master_key);
6117*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_HW_ACCEL_FAILED;
6118*62c56f98SSadaf Ebrahimi }
6119*62c56f98SSadaf Ebrahimi
6120*62c56f98SSadaf Ebrahimi status = psa_key_derivation_output_bytes(&derivation, dstbuf, dlen);
6121*62c56f98SSadaf Ebrahimi if (status != PSA_SUCCESS) {
6122*62c56f98SSadaf Ebrahimi psa_key_derivation_abort(&derivation);
6123*62c56f98SSadaf Ebrahimi psa_destroy_key(master_key);
6124*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_HW_ACCEL_FAILED;
6125*62c56f98SSadaf Ebrahimi }
6126*62c56f98SSadaf Ebrahimi
6127*62c56f98SSadaf Ebrahimi status = psa_key_derivation_abort(&derivation);
6128*62c56f98SSadaf Ebrahimi if (status != PSA_SUCCESS) {
6129*62c56f98SSadaf Ebrahimi psa_destroy_key(master_key);
6130*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_HW_ACCEL_FAILED;
6131*62c56f98SSadaf Ebrahimi }
6132*62c56f98SSadaf Ebrahimi
6133*62c56f98SSadaf Ebrahimi if (!mbedtls_svc_key_id_is_null(master_key)) {
6134*62c56f98SSadaf Ebrahimi status = psa_destroy_key(master_key);
6135*62c56f98SSadaf Ebrahimi }
6136*62c56f98SSadaf Ebrahimi if (status != PSA_SUCCESS) {
6137*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_HW_ACCEL_FAILED;
6138*62c56f98SSadaf Ebrahimi }
6139*62c56f98SSadaf Ebrahimi
6140*62c56f98SSadaf Ebrahimi return 0;
6141*62c56f98SSadaf Ebrahimi }
6142*62c56f98SSadaf Ebrahimi #endif /* PSA_WANT_ALG_SHA_256 || PSA_WANT_ALG_SHA_384 */
6143*62c56f98SSadaf Ebrahimi #else /* MBEDTLS_USE_PSA_CRYPTO */
6144*62c56f98SSadaf Ebrahimi
6145*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_C) && \
6146*62c56f98SSadaf Ebrahimi (defined(MBEDTLS_MD_CAN_SHA256) || \
6147*62c56f98SSadaf Ebrahimi defined(MBEDTLS_MD_CAN_SHA384))
6148*62c56f98SSadaf Ebrahimi MBEDTLS_CHECK_RETURN_CRITICAL
tls_prf_generic(mbedtls_md_type_t md_type,const unsigned char * secret,size_t slen,const char * label,const unsigned char * random,size_t rlen,unsigned char * dstbuf,size_t dlen)6149*62c56f98SSadaf Ebrahimi static int tls_prf_generic(mbedtls_md_type_t md_type,
6150*62c56f98SSadaf Ebrahimi const unsigned char *secret, size_t slen,
6151*62c56f98SSadaf Ebrahimi const char *label,
6152*62c56f98SSadaf Ebrahimi const unsigned char *random, size_t rlen,
6153*62c56f98SSadaf Ebrahimi unsigned char *dstbuf, size_t dlen)
6154*62c56f98SSadaf Ebrahimi {
6155*62c56f98SSadaf Ebrahimi size_t nb;
6156*62c56f98SSadaf Ebrahimi size_t i, j, k, md_len;
6157*62c56f98SSadaf Ebrahimi unsigned char *tmp;
6158*62c56f98SSadaf Ebrahimi size_t tmp_len = 0;
6159*62c56f98SSadaf Ebrahimi unsigned char h_i[MBEDTLS_MD_MAX_SIZE];
6160*62c56f98SSadaf Ebrahimi const mbedtls_md_info_t *md_info;
6161*62c56f98SSadaf Ebrahimi mbedtls_md_context_t md_ctx;
6162*62c56f98SSadaf Ebrahimi int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
6163*62c56f98SSadaf Ebrahimi
6164*62c56f98SSadaf Ebrahimi mbedtls_md_init(&md_ctx);
6165*62c56f98SSadaf Ebrahimi
6166*62c56f98SSadaf Ebrahimi if ((md_info = mbedtls_md_info_from_type(md_type)) == NULL) {
6167*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
6168*62c56f98SSadaf Ebrahimi }
6169*62c56f98SSadaf Ebrahimi
6170*62c56f98SSadaf Ebrahimi md_len = mbedtls_md_get_size(md_info);
6171*62c56f98SSadaf Ebrahimi
6172*62c56f98SSadaf Ebrahimi tmp_len = md_len + strlen(label) + rlen;
6173*62c56f98SSadaf Ebrahimi tmp = mbedtls_calloc(1, tmp_len);
6174*62c56f98SSadaf Ebrahimi if (tmp == NULL) {
6175*62c56f98SSadaf Ebrahimi ret = MBEDTLS_ERR_SSL_ALLOC_FAILED;
6176*62c56f98SSadaf Ebrahimi goto exit;
6177*62c56f98SSadaf Ebrahimi }
6178*62c56f98SSadaf Ebrahimi
6179*62c56f98SSadaf Ebrahimi nb = strlen(label);
6180*62c56f98SSadaf Ebrahimi memcpy(tmp + md_len, label, nb);
6181*62c56f98SSadaf Ebrahimi memcpy(tmp + md_len + nb, random, rlen);
6182*62c56f98SSadaf Ebrahimi nb += rlen;
6183*62c56f98SSadaf Ebrahimi
6184*62c56f98SSadaf Ebrahimi /*
6185*62c56f98SSadaf Ebrahimi * Compute P_<hash>(secret, label + random)[0..dlen]
6186*62c56f98SSadaf Ebrahimi */
6187*62c56f98SSadaf Ebrahimi if ((ret = mbedtls_md_setup(&md_ctx, md_info, 1)) != 0) {
6188*62c56f98SSadaf Ebrahimi goto exit;
6189*62c56f98SSadaf Ebrahimi }
6190*62c56f98SSadaf Ebrahimi
6191*62c56f98SSadaf Ebrahimi ret = mbedtls_md_hmac_starts(&md_ctx, secret, slen);
6192*62c56f98SSadaf Ebrahimi if (ret != 0) {
6193*62c56f98SSadaf Ebrahimi goto exit;
6194*62c56f98SSadaf Ebrahimi }
6195*62c56f98SSadaf Ebrahimi ret = mbedtls_md_hmac_update(&md_ctx, tmp + md_len, nb);
6196*62c56f98SSadaf Ebrahimi if (ret != 0) {
6197*62c56f98SSadaf Ebrahimi goto exit;
6198*62c56f98SSadaf Ebrahimi }
6199*62c56f98SSadaf Ebrahimi ret = mbedtls_md_hmac_finish(&md_ctx, tmp);
6200*62c56f98SSadaf Ebrahimi if (ret != 0) {
6201*62c56f98SSadaf Ebrahimi goto exit;
6202*62c56f98SSadaf Ebrahimi }
6203*62c56f98SSadaf Ebrahimi
6204*62c56f98SSadaf Ebrahimi for (i = 0; i < dlen; i += md_len) {
6205*62c56f98SSadaf Ebrahimi ret = mbedtls_md_hmac_reset(&md_ctx);
6206*62c56f98SSadaf Ebrahimi if (ret != 0) {
6207*62c56f98SSadaf Ebrahimi goto exit;
6208*62c56f98SSadaf Ebrahimi }
6209*62c56f98SSadaf Ebrahimi ret = mbedtls_md_hmac_update(&md_ctx, tmp, md_len + nb);
6210*62c56f98SSadaf Ebrahimi if (ret != 0) {
6211*62c56f98SSadaf Ebrahimi goto exit;
6212*62c56f98SSadaf Ebrahimi }
6213*62c56f98SSadaf Ebrahimi ret = mbedtls_md_hmac_finish(&md_ctx, h_i);
6214*62c56f98SSadaf Ebrahimi if (ret != 0) {
6215*62c56f98SSadaf Ebrahimi goto exit;
6216*62c56f98SSadaf Ebrahimi }
6217*62c56f98SSadaf Ebrahimi
6218*62c56f98SSadaf Ebrahimi ret = mbedtls_md_hmac_reset(&md_ctx);
6219*62c56f98SSadaf Ebrahimi if (ret != 0) {
6220*62c56f98SSadaf Ebrahimi goto exit;
6221*62c56f98SSadaf Ebrahimi }
6222*62c56f98SSadaf Ebrahimi ret = mbedtls_md_hmac_update(&md_ctx, tmp, md_len);
6223*62c56f98SSadaf Ebrahimi if (ret != 0) {
6224*62c56f98SSadaf Ebrahimi goto exit;
6225*62c56f98SSadaf Ebrahimi }
6226*62c56f98SSadaf Ebrahimi ret = mbedtls_md_hmac_finish(&md_ctx, tmp);
6227*62c56f98SSadaf Ebrahimi if (ret != 0) {
6228*62c56f98SSadaf Ebrahimi goto exit;
6229*62c56f98SSadaf Ebrahimi }
6230*62c56f98SSadaf Ebrahimi
6231*62c56f98SSadaf Ebrahimi k = (i + md_len > dlen) ? dlen % md_len : md_len;
6232*62c56f98SSadaf Ebrahimi
6233*62c56f98SSadaf Ebrahimi for (j = 0; j < k; j++) {
6234*62c56f98SSadaf Ebrahimi dstbuf[i + j] = h_i[j];
6235*62c56f98SSadaf Ebrahimi }
6236*62c56f98SSadaf Ebrahimi }
6237*62c56f98SSadaf Ebrahimi
6238*62c56f98SSadaf Ebrahimi exit:
6239*62c56f98SSadaf Ebrahimi mbedtls_md_free(&md_ctx);
6240*62c56f98SSadaf Ebrahimi
6241*62c56f98SSadaf Ebrahimi if (tmp != NULL) {
6242*62c56f98SSadaf Ebrahimi mbedtls_platform_zeroize(tmp, tmp_len);
6243*62c56f98SSadaf Ebrahimi }
6244*62c56f98SSadaf Ebrahimi
6245*62c56f98SSadaf Ebrahimi mbedtls_platform_zeroize(h_i, sizeof(h_i));
6246*62c56f98SSadaf Ebrahimi
6247*62c56f98SSadaf Ebrahimi mbedtls_free(tmp);
6248*62c56f98SSadaf Ebrahimi
6249*62c56f98SSadaf Ebrahimi return ret;
6250*62c56f98SSadaf Ebrahimi }
6251*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_MD_C && ( MBEDTLS_MD_CAN_SHA256 || MBEDTLS_MD_CAN_SHA384 ) */
6252*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_USE_PSA_CRYPTO */
6253*62c56f98SSadaf Ebrahimi
6254*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA256)
6255*62c56f98SSadaf Ebrahimi MBEDTLS_CHECK_RETURN_CRITICAL
tls_prf_sha256(const unsigned char * secret,size_t slen,const char * label,const unsigned char * random,size_t rlen,unsigned char * dstbuf,size_t dlen)6256*62c56f98SSadaf Ebrahimi static int tls_prf_sha256(const unsigned char *secret, size_t slen,
6257*62c56f98SSadaf Ebrahimi const char *label,
6258*62c56f98SSadaf Ebrahimi const unsigned char *random, size_t rlen,
6259*62c56f98SSadaf Ebrahimi unsigned char *dstbuf, size_t dlen)
6260*62c56f98SSadaf Ebrahimi {
6261*62c56f98SSadaf Ebrahimi return tls_prf_generic(MBEDTLS_MD_SHA256, secret, slen,
6262*62c56f98SSadaf Ebrahimi label, random, rlen, dstbuf, dlen);
6263*62c56f98SSadaf Ebrahimi }
6264*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_MD_CAN_SHA256*/
6265*62c56f98SSadaf Ebrahimi
6266*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA384)
6267*62c56f98SSadaf Ebrahimi MBEDTLS_CHECK_RETURN_CRITICAL
tls_prf_sha384(const unsigned char * secret,size_t slen,const char * label,const unsigned char * random,size_t rlen,unsigned char * dstbuf,size_t dlen)6268*62c56f98SSadaf Ebrahimi static int tls_prf_sha384(const unsigned char *secret, size_t slen,
6269*62c56f98SSadaf Ebrahimi const char *label,
6270*62c56f98SSadaf Ebrahimi const unsigned char *random, size_t rlen,
6271*62c56f98SSadaf Ebrahimi unsigned char *dstbuf, size_t dlen)
6272*62c56f98SSadaf Ebrahimi {
6273*62c56f98SSadaf Ebrahimi return tls_prf_generic(MBEDTLS_MD_SHA384, secret, slen,
6274*62c56f98SSadaf Ebrahimi label, random, rlen, dstbuf, dlen);
6275*62c56f98SSadaf Ebrahimi }
6276*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_MD_CAN_SHA384*/
6277*62c56f98SSadaf Ebrahimi
6278*62c56f98SSadaf Ebrahimi /*
6279*62c56f98SSadaf Ebrahimi * Set appropriate PRF function and other SSL / TLS1.2 functions
6280*62c56f98SSadaf Ebrahimi *
6281*62c56f98SSadaf Ebrahimi * Inputs:
6282*62c56f98SSadaf Ebrahimi * - hash associated with the ciphersuite (only used by TLS 1.2)
6283*62c56f98SSadaf Ebrahimi *
6284*62c56f98SSadaf Ebrahimi * Outputs:
6285*62c56f98SSadaf Ebrahimi * - the tls_prf, calc_verify and calc_finished members of handshake structure
6286*62c56f98SSadaf Ebrahimi */
6287*62c56f98SSadaf Ebrahimi MBEDTLS_CHECK_RETURN_CRITICAL
ssl_set_handshake_prfs(mbedtls_ssl_handshake_params * handshake,mbedtls_md_type_t hash)6288*62c56f98SSadaf Ebrahimi static int ssl_set_handshake_prfs(mbedtls_ssl_handshake_params *handshake,
6289*62c56f98SSadaf Ebrahimi mbedtls_md_type_t hash)
6290*62c56f98SSadaf Ebrahimi {
6291*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA384)
6292*62c56f98SSadaf Ebrahimi if (hash == MBEDTLS_MD_SHA384) {
6293*62c56f98SSadaf Ebrahimi handshake->tls_prf = tls_prf_sha384;
6294*62c56f98SSadaf Ebrahimi handshake->calc_verify = ssl_calc_verify_tls_sha384;
6295*62c56f98SSadaf Ebrahimi handshake->calc_finished = ssl_calc_finished_tls_sha384;
6296*62c56f98SSadaf Ebrahimi } else
6297*62c56f98SSadaf Ebrahimi #endif
6298*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA256)
6299*62c56f98SSadaf Ebrahimi {
6300*62c56f98SSadaf Ebrahimi (void) hash;
6301*62c56f98SSadaf Ebrahimi handshake->tls_prf = tls_prf_sha256;
6302*62c56f98SSadaf Ebrahimi handshake->calc_verify = ssl_calc_verify_tls_sha256;
6303*62c56f98SSadaf Ebrahimi handshake->calc_finished = ssl_calc_finished_tls_sha256;
6304*62c56f98SSadaf Ebrahimi }
6305*62c56f98SSadaf Ebrahimi #else
6306*62c56f98SSadaf Ebrahimi {
6307*62c56f98SSadaf Ebrahimi (void) handshake;
6308*62c56f98SSadaf Ebrahimi (void) hash;
6309*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
6310*62c56f98SSadaf Ebrahimi }
6311*62c56f98SSadaf Ebrahimi #endif
6312*62c56f98SSadaf Ebrahimi
6313*62c56f98SSadaf Ebrahimi return 0;
6314*62c56f98SSadaf Ebrahimi }
6315*62c56f98SSadaf Ebrahimi
6316*62c56f98SSadaf Ebrahimi /*
6317*62c56f98SSadaf Ebrahimi * Compute master secret if needed
6318*62c56f98SSadaf Ebrahimi *
6319*62c56f98SSadaf Ebrahimi * Parameters:
6320*62c56f98SSadaf Ebrahimi * [in/out] handshake
6321*62c56f98SSadaf Ebrahimi * [in] resume, premaster, extended_ms, calc_verify, tls_prf
6322*62c56f98SSadaf Ebrahimi * (PSA-PSK) ciphersuite_info, psk_opaque
6323*62c56f98SSadaf Ebrahimi * [out] premaster (cleared)
6324*62c56f98SSadaf Ebrahimi * [out] master
6325*62c56f98SSadaf Ebrahimi * [in] ssl: optionally used for debugging, EMS and PSA-PSK
6326*62c56f98SSadaf Ebrahimi * debug: conf->f_dbg, conf->p_dbg
6327*62c56f98SSadaf Ebrahimi * EMS: passed to calc_verify (debug + session_negotiate)
6328*62c56f98SSadaf Ebrahimi * PSA-PSA: conf
6329*62c56f98SSadaf Ebrahimi */
6330*62c56f98SSadaf Ebrahimi MBEDTLS_CHECK_RETURN_CRITICAL
ssl_compute_master(mbedtls_ssl_handshake_params * handshake,unsigned char * master,const mbedtls_ssl_context * ssl)6331*62c56f98SSadaf Ebrahimi static int ssl_compute_master(mbedtls_ssl_handshake_params *handshake,
6332*62c56f98SSadaf Ebrahimi unsigned char *master,
6333*62c56f98SSadaf Ebrahimi const mbedtls_ssl_context *ssl)
6334*62c56f98SSadaf Ebrahimi {
6335*62c56f98SSadaf Ebrahimi int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
6336*62c56f98SSadaf Ebrahimi
6337*62c56f98SSadaf Ebrahimi /* cf. RFC 5246, Section 8.1:
6338*62c56f98SSadaf Ebrahimi * "The master secret is always exactly 48 bytes in length." */
6339*62c56f98SSadaf Ebrahimi size_t const master_secret_len = 48;
6340*62c56f98SSadaf Ebrahimi
6341*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
6342*62c56f98SSadaf Ebrahimi unsigned char session_hash[48];
6343*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
6344*62c56f98SSadaf Ebrahimi
6345*62c56f98SSadaf Ebrahimi /* The label for the KDF used for key expansion.
6346*62c56f98SSadaf Ebrahimi * This is either "master secret" or "extended master secret"
6347*62c56f98SSadaf Ebrahimi * depending on whether the Extended Master Secret extension
6348*62c56f98SSadaf Ebrahimi * is used. */
6349*62c56f98SSadaf Ebrahimi char const *lbl = "master secret";
6350*62c56f98SSadaf Ebrahimi
6351*62c56f98SSadaf Ebrahimi /* The seed for the KDF used for key expansion.
6352*62c56f98SSadaf Ebrahimi * - If the Extended Master Secret extension is not used,
6353*62c56f98SSadaf Ebrahimi * this is ClientHello.Random + ServerHello.Random
6354*62c56f98SSadaf Ebrahimi * (see Sect. 8.1 in RFC 5246).
6355*62c56f98SSadaf Ebrahimi * - If the Extended Master Secret extension is used,
6356*62c56f98SSadaf Ebrahimi * this is the transcript of the handshake so far.
6357*62c56f98SSadaf Ebrahimi * (see Sect. 4 in RFC 7627). */
6358*62c56f98SSadaf Ebrahimi unsigned char const *seed = handshake->randbytes;
6359*62c56f98SSadaf Ebrahimi size_t seed_len = 64;
6360*62c56f98SSadaf Ebrahimi
6361*62c56f98SSadaf Ebrahimi #if !defined(MBEDTLS_DEBUG_C) && \
6362*62c56f98SSadaf Ebrahimi !defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) && \
6363*62c56f98SSadaf Ebrahimi !(defined(MBEDTLS_USE_PSA_CRYPTO) && \
6364*62c56f98SSadaf Ebrahimi defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED))
6365*62c56f98SSadaf Ebrahimi ssl = NULL; /* make sure we don't use it except for those cases */
6366*62c56f98SSadaf Ebrahimi (void) ssl;
6367*62c56f98SSadaf Ebrahimi #endif
6368*62c56f98SSadaf Ebrahimi
6369*62c56f98SSadaf Ebrahimi if (handshake->resume != 0) {
6370*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(3, ("no premaster (session resumed)"));
6371*62c56f98SSadaf Ebrahimi return 0;
6372*62c56f98SSadaf Ebrahimi }
6373*62c56f98SSadaf Ebrahimi
6374*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
6375*62c56f98SSadaf Ebrahimi if (handshake->extended_ms == MBEDTLS_SSL_EXTENDED_MS_ENABLED) {
6376*62c56f98SSadaf Ebrahimi lbl = "extended master secret";
6377*62c56f98SSadaf Ebrahimi seed = session_hash;
6378*62c56f98SSadaf Ebrahimi ret = handshake->calc_verify(ssl, session_hash, &seed_len);
6379*62c56f98SSadaf Ebrahimi if (ret != 0) {
6380*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_RET(1, "calc_verify", ret);
6381*62c56f98SSadaf Ebrahimi }
6382*62c56f98SSadaf Ebrahimi
6383*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_BUF(3, "session hash for extended master secret",
6384*62c56f98SSadaf Ebrahimi session_hash, seed_len);
6385*62c56f98SSadaf Ebrahimi }
6386*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
6387*62c56f98SSadaf Ebrahimi
6388*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO) && \
6389*62c56f98SSadaf Ebrahimi defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
6390*62c56f98SSadaf Ebrahimi if (mbedtls_ssl_ciphersuite_uses_psk(handshake->ciphersuite_info) == 1) {
6391*62c56f98SSadaf Ebrahimi /* Perform PSK-to-MS expansion in a single step. */
6392*62c56f98SSadaf Ebrahimi psa_status_t status;
6393*62c56f98SSadaf Ebrahimi psa_algorithm_t alg;
6394*62c56f98SSadaf Ebrahimi mbedtls_svc_key_id_t psk;
6395*62c56f98SSadaf Ebrahimi psa_key_derivation_operation_t derivation =
6396*62c56f98SSadaf Ebrahimi PSA_KEY_DERIVATION_OPERATION_INIT;
6397*62c56f98SSadaf Ebrahimi mbedtls_md_type_t hash_alg = handshake->ciphersuite_info->mac;
6398*62c56f98SSadaf Ebrahimi
6399*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(2, ("perform PSA-based PSK-to-MS expansion"));
6400*62c56f98SSadaf Ebrahimi
6401*62c56f98SSadaf Ebrahimi psk = mbedtls_ssl_get_opaque_psk(ssl);
6402*62c56f98SSadaf Ebrahimi
6403*62c56f98SSadaf Ebrahimi if (hash_alg == MBEDTLS_MD_SHA384) {
6404*62c56f98SSadaf Ebrahimi alg = PSA_ALG_TLS12_PSK_TO_MS(PSA_ALG_SHA_384);
6405*62c56f98SSadaf Ebrahimi } else {
6406*62c56f98SSadaf Ebrahimi alg = PSA_ALG_TLS12_PSK_TO_MS(PSA_ALG_SHA_256);
6407*62c56f98SSadaf Ebrahimi }
6408*62c56f98SSadaf Ebrahimi
6409*62c56f98SSadaf Ebrahimi size_t other_secret_len = 0;
6410*62c56f98SSadaf Ebrahimi unsigned char *other_secret = NULL;
6411*62c56f98SSadaf Ebrahimi
6412*62c56f98SSadaf Ebrahimi switch (handshake->ciphersuite_info->key_exchange) {
6413*62c56f98SSadaf Ebrahimi /* Provide other secret.
6414*62c56f98SSadaf Ebrahimi * Other secret is stored in premaster, where first 2 bytes hold the
6415*62c56f98SSadaf Ebrahimi * length of the other key.
6416*62c56f98SSadaf Ebrahimi */
6417*62c56f98SSadaf Ebrahimi case MBEDTLS_KEY_EXCHANGE_RSA_PSK:
6418*62c56f98SSadaf Ebrahimi /* For RSA-PSK other key length is always 48 bytes. */
6419*62c56f98SSadaf Ebrahimi other_secret_len = 48;
6420*62c56f98SSadaf Ebrahimi other_secret = handshake->premaster + 2;
6421*62c56f98SSadaf Ebrahimi break;
6422*62c56f98SSadaf Ebrahimi case MBEDTLS_KEY_EXCHANGE_ECDHE_PSK:
6423*62c56f98SSadaf Ebrahimi case MBEDTLS_KEY_EXCHANGE_DHE_PSK:
6424*62c56f98SSadaf Ebrahimi other_secret_len = MBEDTLS_GET_UINT16_BE(handshake->premaster, 0);
6425*62c56f98SSadaf Ebrahimi other_secret = handshake->premaster + 2;
6426*62c56f98SSadaf Ebrahimi break;
6427*62c56f98SSadaf Ebrahimi default:
6428*62c56f98SSadaf Ebrahimi break;
6429*62c56f98SSadaf Ebrahimi }
6430*62c56f98SSadaf Ebrahimi
6431*62c56f98SSadaf Ebrahimi status = setup_psa_key_derivation(&derivation, psk, alg,
6432*62c56f98SSadaf Ebrahimi ssl->conf->psk, ssl->conf->psk_len,
6433*62c56f98SSadaf Ebrahimi seed, seed_len,
6434*62c56f98SSadaf Ebrahimi (unsigned char const *) lbl,
6435*62c56f98SSadaf Ebrahimi (size_t) strlen(lbl),
6436*62c56f98SSadaf Ebrahimi other_secret, other_secret_len,
6437*62c56f98SSadaf Ebrahimi master_secret_len);
6438*62c56f98SSadaf Ebrahimi if (status != PSA_SUCCESS) {
6439*62c56f98SSadaf Ebrahimi psa_key_derivation_abort(&derivation);
6440*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_HW_ACCEL_FAILED;
6441*62c56f98SSadaf Ebrahimi }
6442*62c56f98SSadaf Ebrahimi
6443*62c56f98SSadaf Ebrahimi status = psa_key_derivation_output_bytes(&derivation,
6444*62c56f98SSadaf Ebrahimi master,
6445*62c56f98SSadaf Ebrahimi master_secret_len);
6446*62c56f98SSadaf Ebrahimi if (status != PSA_SUCCESS) {
6447*62c56f98SSadaf Ebrahimi psa_key_derivation_abort(&derivation);
6448*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_HW_ACCEL_FAILED;
6449*62c56f98SSadaf Ebrahimi }
6450*62c56f98SSadaf Ebrahimi
6451*62c56f98SSadaf Ebrahimi status = psa_key_derivation_abort(&derivation);
6452*62c56f98SSadaf Ebrahimi if (status != PSA_SUCCESS) {
6453*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_HW_ACCEL_FAILED;
6454*62c56f98SSadaf Ebrahimi }
6455*62c56f98SSadaf Ebrahimi } else
6456*62c56f98SSadaf Ebrahimi #endif
6457*62c56f98SSadaf Ebrahimi {
6458*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO) && \
6459*62c56f98SSadaf Ebrahimi defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
6460*62c56f98SSadaf Ebrahimi if (handshake->ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE) {
6461*62c56f98SSadaf Ebrahimi psa_status_t status;
6462*62c56f98SSadaf Ebrahimi psa_algorithm_t alg = PSA_ALG_TLS12_ECJPAKE_TO_PMS;
6463*62c56f98SSadaf Ebrahimi psa_key_derivation_operation_t derivation =
6464*62c56f98SSadaf Ebrahimi PSA_KEY_DERIVATION_OPERATION_INIT;
6465*62c56f98SSadaf Ebrahimi
6466*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(2, ("perform PSA-based PMS KDF for ECJPAKE"));
6467*62c56f98SSadaf Ebrahimi
6468*62c56f98SSadaf Ebrahimi handshake->pmslen = PSA_TLS12_ECJPAKE_TO_PMS_DATA_SIZE;
6469*62c56f98SSadaf Ebrahimi
6470*62c56f98SSadaf Ebrahimi status = psa_key_derivation_setup(&derivation, alg);
6471*62c56f98SSadaf Ebrahimi if (status != PSA_SUCCESS) {
6472*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_HW_ACCEL_FAILED;
6473*62c56f98SSadaf Ebrahimi }
6474*62c56f98SSadaf Ebrahimi
6475*62c56f98SSadaf Ebrahimi status = psa_key_derivation_set_capacity(&derivation,
6476*62c56f98SSadaf Ebrahimi PSA_TLS12_ECJPAKE_TO_PMS_DATA_SIZE);
6477*62c56f98SSadaf Ebrahimi if (status != PSA_SUCCESS) {
6478*62c56f98SSadaf Ebrahimi psa_key_derivation_abort(&derivation);
6479*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_HW_ACCEL_FAILED;
6480*62c56f98SSadaf Ebrahimi }
6481*62c56f98SSadaf Ebrahimi
6482*62c56f98SSadaf Ebrahimi status = psa_pake_get_implicit_key(&handshake->psa_pake_ctx,
6483*62c56f98SSadaf Ebrahimi &derivation);
6484*62c56f98SSadaf Ebrahimi if (status != PSA_SUCCESS) {
6485*62c56f98SSadaf Ebrahimi psa_key_derivation_abort(&derivation);
6486*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_HW_ACCEL_FAILED;
6487*62c56f98SSadaf Ebrahimi }
6488*62c56f98SSadaf Ebrahimi
6489*62c56f98SSadaf Ebrahimi status = psa_key_derivation_output_bytes(&derivation,
6490*62c56f98SSadaf Ebrahimi handshake->premaster,
6491*62c56f98SSadaf Ebrahimi handshake->pmslen);
6492*62c56f98SSadaf Ebrahimi if (status != PSA_SUCCESS) {
6493*62c56f98SSadaf Ebrahimi psa_key_derivation_abort(&derivation);
6494*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_HW_ACCEL_FAILED;
6495*62c56f98SSadaf Ebrahimi }
6496*62c56f98SSadaf Ebrahimi
6497*62c56f98SSadaf Ebrahimi status = psa_key_derivation_abort(&derivation);
6498*62c56f98SSadaf Ebrahimi if (status != PSA_SUCCESS) {
6499*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_HW_ACCEL_FAILED;
6500*62c56f98SSadaf Ebrahimi }
6501*62c56f98SSadaf Ebrahimi }
6502*62c56f98SSadaf Ebrahimi #endif
6503*62c56f98SSadaf Ebrahimi ret = handshake->tls_prf(handshake->premaster, handshake->pmslen,
6504*62c56f98SSadaf Ebrahimi lbl, seed, seed_len,
6505*62c56f98SSadaf Ebrahimi master,
6506*62c56f98SSadaf Ebrahimi master_secret_len);
6507*62c56f98SSadaf Ebrahimi if (ret != 0) {
6508*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_RET(1, "prf", ret);
6509*62c56f98SSadaf Ebrahimi return ret;
6510*62c56f98SSadaf Ebrahimi }
6511*62c56f98SSadaf Ebrahimi
6512*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_BUF(3, "premaster secret",
6513*62c56f98SSadaf Ebrahimi handshake->premaster,
6514*62c56f98SSadaf Ebrahimi handshake->pmslen);
6515*62c56f98SSadaf Ebrahimi
6516*62c56f98SSadaf Ebrahimi mbedtls_platform_zeroize(handshake->premaster,
6517*62c56f98SSadaf Ebrahimi sizeof(handshake->premaster));
6518*62c56f98SSadaf Ebrahimi }
6519*62c56f98SSadaf Ebrahimi
6520*62c56f98SSadaf Ebrahimi return 0;
6521*62c56f98SSadaf Ebrahimi }
6522*62c56f98SSadaf Ebrahimi
mbedtls_ssl_derive_keys(mbedtls_ssl_context * ssl)6523*62c56f98SSadaf Ebrahimi int mbedtls_ssl_derive_keys(mbedtls_ssl_context *ssl)
6524*62c56f98SSadaf Ebrahimi {
6525*62c56f98SSadaf Ebrahimi int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
6526*62c56f98SSadaf Ebrahimi const mbedtls_ssl_ciphersuite_t * const ciphersuite_info =
6527*62c56f98SSadaf Ebrahimi ssl->handshake->ciphersuite_info;
6528*62c56f98SSadaf Ebrahimi
6529*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(2, ("=> derive keys"));
6530*62c56f98SSadaf Ebrahimi
6531*62c56f98SSadaf Ebrahimi /* Set PRF, calc_verify and calc_finished function pointers */
6532*62c56f98SSadaf Ebrahimi ret = ssl_set_handshake_prfs(ssl->handshake,
6533*62c56f98SSadaf Ebrahimi (mbedtls_md_type_t) ciphersuite_info->mac);
6534*62c56f98SSadaf Ebrahimi if (ret != 0) {
6535*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_RET(1, "ssl_set_handshake_prfs", ret);
6536*62c56f98SSadaf Ebrahimi return ret;
6537*62c56f98SSadaf Ebrahimi }
6538*62c56f98SSadaf Ebrahimi
6539*62c56f98SSadaf Ebrahimi /* Compute master secret if needed */
6540*62c56f98SSadaf Ebrahimi ret = ssl_compute_master(ssl->handshake,
6541*62c56f98SSadaf Ebrahimi ssl->session_negotiate->master,
6542*62c56f98SSadaf Ebrahimi ssl);
6543*62c56f98SSadaf Ebrahimi if (ret != 0) {
6544*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_RET(1, "ssl_compute_master", ret);
6545*62c56f98SSadaf Ebrahimi return ret;
6546*62c56f98SSadaf Ebrahimi }
6547*62c56f98SSadaf Ebrahimi
6548*62c56f98SSadaf Ebrahimi /* Swap the client and server random values:
6549*62c56f98SSadaf Ebrahimi * - MS derivation wanted client+server (RFC 5246 8.1)
6550*62c56f98SSadaf Ebrahimi * - key derivation wants server+client (RFC 5246 6.3) */
6551*62c56f98SSadaf Ebrahimi {
6552*62c56f98SSadaf Ebrahimi unsigned char tmp[64];
6553*62c56f98SSadaf Ebrahimi memcpy(tmp, ssl->handshake->randbytes, 64);
6554*62c56f98SSadaf Ebrahimi memcpy(ssl->handshake->randbytes, tmp + 32, 32);
6555*62c56f98SSadaf Ebrahimi memcpy(ssl->handshake->randbytes + 32, tmp, 32);
6556*62c56f98SSadaf Ebrahimi mbedtls_platform_zeroize(tmp, sizeof(tmp));
6557*62c56f98SSadaf Ebrahimi }
6558*62c56f98SSadaf Ebrahimi
6559*62c56f98SSadaf Ebrahimi /* Populate transform structure */
6560*62c56f98SSadaf Ebrahimi ret = ssl_tls12_populate_transform(ssl->transform_negotiate,
6561*62c56f98SSadaf Ebrahimi ssl->session_negotiate->ciphersuite,
6562*62c56f98SSadaf Ebrahimi ssl->session_negotiate->master,
6563*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM)
6564*62c56f98SSadaf Ebrahimi ssl->session_negotiate->encrypt_then_mac,
6565*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM */
6566*62c56f98SSadaf Ebrahimi ssl->handshake->tls_prf,
6567*62c56f98SSadaf Ebrahimi ssl->handshake->randbytes,
6568*62c56f98SSadaf Ebrahimi ssl->tls_version,
6569*62c56f98SSadaf Ebrahimi ssl->conf->endpoint,
6570*62c56f98SSadaf Ebrahimi ssl);
6571*62c56f98SSadaf Ebrahimi if (ret != 0) {
6572*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_RET(1, "ssl_tls12_populate_transform", ret);
6573*62c56f98SSadaf Ebrahimi return ret;
6574*62c56f98SSadaf Ebrahimi }
6575*62c56f98SSadaf Ebrahimi
6576*62c56f98SSadaf Ebrahimi /* We no longer need Server/ClientHello.random values */
6577*62c56f98SSadaf Ebrahimi mbedtls_platform_zeroize(ssl->handshake->randbytes,
6578*62c56f98SSadaf Ebrahimi sizeof(ssl->handshake->randbytes));
6579*62c56f98SSadaf Ebrahimi
6580*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(2, ("<= derive keys"));
6581*62c56f98SSadaf Ebrahimi
6582*62c56f98SSadaf Ebrahimi return 0;
6583*62c56f98SSadaf Ebrahimi }
6584*62c56f98SSadaf Ebrahimi
mbedtls_ssl_set_calc_verify_md(mbedtls_ssl_context * ssl,int md)6585*62c56f98SSadaf Ebrahimi int mbedtls_ssl_set_calc_verify_md(mbedtls_ssl_context *ssl, int md)
6586*62c56f98SSadaf Ebrahimi {
6587*62c56f98SSadaf Ebrahimi switch (md) {
6588*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA384)
6589*62c56f98SSadaf Ebrahimi case MBEDTLS_SSL_HASH_SHA384:
6590*62c56f98SSadaf Ebrahimi ssl->handshake->calc_verify = ssl_calc_verify_tls_sha384;
6591*62c56f98SSadaf Ebrahimi break;
6592*62c56f98SSadaf Ebrahimi #endif
6593*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA256)
6594*62c56f98SSadaf Ebrahimi case MBEDTLS_SSL_HASH_SHA256:
6595*62c56f98SSadaf Ebrahimi ssl->handshake->calc_verify = ssl_calc_verify_tls_sha256;
6596*62c56f98SSadaf Ebrahimi break;
6597*62c56f98SSadaf Ebrahimi #endif
6598*62c56f98SSadaf Ebrahimi default:
6599*62c56f98SSadaf Ebrahimi return -1;
6600*62c56f98SSadaf Ebrahimi }
6601*62c56f98SSadaf Ebrahimi #if !defined(MBEDTLS_MD_CAN_SHA384) && \
6602*62c56f98SSadaf Ebrahimi !defined(MBEDTLS_MD_CAN_SHA256)
6603*62c56f98SSadaf Ebrahimi (void) ssl;
6604*62c56f98SSadaf Ebrahimi #endif
6605*62c56f98SSadaf Ebrahimi return 0;
6606*62c56f98SSadaf Ebrahimi }
6607*62c56f98SSadaf Ebrahimi
6608*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO)
ssl_calc_verify_tls_psa(const mbedtls_ssl_context * ssl,const psa_hash_operation_t * hs_op,size_t buffer_size,unsigned char * hash,size_t * hlen)6609*62c56f98SSadaf Ebrahimi static int ssl_calc_verify_tls_psa(const mbedtls_ssl_context *ssl,
6610*62c56f98SSadaf Ebrahimi const psa_hash_operation_t *hs_op,
6611*62c56f98SSadaf Ebrahimi size_t buffer_size,
6612*62c56f98SSadaf Ebrahimi unsigned char *hash,
6613*62c56f98SSadaf Ebrahimi size_t *hlen)
6614*62c56f98SSadaf Ebrahimi {
6615*62c56f98SSadaf Ebrahimi psa_status_t status;
6616*62c56f98SSadaf Ebrahimi psa_hash_operation_t cloned_op = psa_hash_operation_init();
6617*62c56f98SSadaf Ebrahimi
6618*62c56f98SSadaf Ebrahimi #if !defined(MBEDTLS_DEBUG_C)
6619*62c56f98SSadaf Ebrahimi (void) ssl;
6620*62c56f98SSadaf Ebrahimi #endif
6621*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(2, ("=> PSA calc verify"));
6622*62c56f98SSadaf Ebrahimi status = psa_hash_clone(hs_op, &cloned_op);
6623*62c56f98SSadaf Ebrahimi if (status != PSA_SUCCESS) {
6624*62c56f98SSadaf Ebrahimi goto exit;
6625*62c56f98SSadaf Ebrahimi }
6626*62c56f98SSadaf Ebrahimi
6627*62c56f98SSadaf Ebrahimi status = psa_hash_finish(&cloned_op, hash, buffer_size, hlen);
6628*62c56f98SSadaf Ebrahimi if (status != PSA_SUCCESS) {
6629*62c56f98SSadaf Ebrahimi goto exit;
6630*62c56f98SSadaf Ebrahimi }
6631*62c56f98SSadaf Ebrahimi
6632*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_BUF(3, "PSA calculated verify result", hash, *hlen);
6633*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(2, ("<= PSA calc verify"));
6634*62c56f98SSadaf Ebrahimi
6635*62c56f98SSadaf Ebrahimi exit:
6636*62c56f98SSadaf Ebrahimi psa_hash_abort(&cloned_op);
6637*62c56f98SSadaf Ebrahimi return mbedtls_md_error_from_psa(status);
6638*62c56f98SSadaf Ebrahimi }
6639*62c56f98SSadaf Ebrahimi #else
ssl_calc_verify_tls_legacy(const mbedtls_ssl_context * ssl,const mbedtls_md_context_t * hs_ctx,unsigned char * hash,size_t * hlen)6640*62c56f98SSadaf Ebrahimi static int ssl_calc_verify_tls_legacy(const mbedtls_ssl_context *ssl,
6641*62c56f98SSadaf Ebrahimi const mbedtls_md_context_t *hs_ctx,
6642*62c56f98SSadaf Ebrahimi unsigned char *hash,
6643*62c56f98SSadaf Ebrahimi size_t *hlen)
6644*62c56f98SSadaf Ebrahimi {
6645*62c56f98SSadaf Ebrahimi int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
6646*62c56f98SSadaf Ebrahimi mbedtls_md_context_t cloned_ctx;
6647*62c56f98SSadaf Ebrahimi
6648*62c56f98SSadaf Ebrahimi mbedtls_md_init(&cloned_ctx);
6649*62c56f98SSadaf Ebrahimi
6650*62c56f98SSadaf Ebrahimi #if !defined(MBEDTLS_DEBUG_C)
6651*62c56f98SSadaf Ebrahimi (void) ssl;
6652*62c56f98SSadaf Ebrahimi #endif
6653*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(2, ("=> calc verify"));
6654*62c56f98SSadaf Ebrahimi
6655*62c56f98SSadaf Ebrahimi ret = mbedtls_md_setup(&cloned_ctx, mbedtls_md_info_from_ctx(hs_ctx), 0);
6656*62c56f98SSadaf Ebrahimi if (ret != 0) {
6657*62c56f98SSadaf Ebrahimi goto exit;
6658*62c56f98SSadaf Ebrahimi }
6659*62c56f98SSadaf Ebrahimi ret = mbedtls_md_clone(&cloned_ctx, hs_ctx);
6660*62c56f98SSadaf Ebrahimi if (ret != 0) {
6661*62c56f98SSadaf Ebrahimi goto exit;
6662*62c56f98SSadaf Ebrahimi }
6663*62c56f98SSadaf Ebrahimi
6664*62c56f98SSadaf Ebrahimi ret = mbedtls_md_finish(&cloned_ctx, hash);
6665*62c56f98SSadaf Ebrahimi if (ret != 0) {
6666*62c56f98SSadaf Ebrahimi goto exit;
6667*62c56f98SSadaf Ebrahimi }
6668*62c56f98SSadaf Ebrahimi
6669*62c56f98SSadaf Ebrahimi *hlen = mbedtls_md_get_size(mbedtls_md_info_from_ctx(hs_ctx));
6670*62c56f98SSadaf Ebrahimi
6671*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_BUF(3, "calculated verify result", hash, *hlen);
6672*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(2, ("<= calc verify"));
6673*62c56f98SSadaf Ebrahimi
6674*62c56f98SSadaf Ebrahimi exit:
6675*62c56f98SSadaf Ebrahimi mbedtls_md_free(&cloned_ctx);
6676*62c56f98SSadaf Ebrahimi return ret;
6677*62c56f98SSadaf Ebrahimi }
6678*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_USE_PSA_CRYPTO */
6679*62c56f98SSadaf Ebrahimi
6680*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA256)
ssl_calc_verify_tls_sha256(const mbedtls_ssl_context * ssl,unsigned char * hash,size_t * hlen)6681*62c56f98SSadaf Ebrahimi int ssl_calc_verify_tls_sha256(const mbedtls_ssl_context *ssl,
6682*62c56f98SSadaf Ebrahimi unsigned char *hash,
6683*62c56f98SSadaf Ebrahimi size_t *hlen)
6684*62c56f98SSadaf Ebrahimi {
6685*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO)
6686*62c56f98SSadaf Ebrahimi return ssl_calc_verify_tls_psa(ssl, &ssl->handshake->fin_sha256_psa, 32,
6687*62c56f98SSadaf Ebrahimi hash, hlen);
6688*62c56f98SSadaf Ebrahimi #else
6689*62c56f98SSadaf Ebrahimi return ssl_calc_verify_tls_legacy(ssl, &ssl->handshake->fin_sha256,
6690*62c56f98SSadaf Ebrahimi hash, hlen);
6691*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_USE_PSA_CRYPTO */
6692*62c56f98SSadaf Ebrahimi }
6693*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_MD_CAN_SHA256 */
6694*62c56f98SSadaf Ebrahimi
6695*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA384)
ssl_calc_verify_tls_sha384(const mbedtls_ssl_context * ssl,unsigned char * hash,size_t * hlen)6696*62c56f98SSadaf Ebrahimi int ssl_calc_verify_tls_sha384(const mbedtls_ssl_context *ssl,
6697*62c56f98SSadaf Ebrahimi unsigned char *hash,
6698*62c56f98SSadaf Ebrahimi size_t *hlen)
6699*62c56f98SSadaf Ebrahimi {
6700*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO)
6701*62c56f98SSadaf Ebrahimi return ssl_calc_verify_tls_psa(ssl, &ssl->handshake->fin_sha384_psa, 48,
6702*62c56f98SSadaf Ebrahimi hash, hlen);
6703*62c56f98SSadaf Ebrahimi #else
6704*62c56f98SSadaf Ebrahimi return ssl_calc_verify_tls_legacy(ssl, &ssl->handshake->fin_sha384,
6705*62c56f98SSadaf Ebrahimi hash, hlen);
6706*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_USE_PSA_CRYPTO */
6707*62c56f98SSadaf Ebrahimi }
6708*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_MD_CAN_SHA384 */
6709*62c56f98SSadaf Ebrahimi
6710*62c56f98SSadaf Ebrahimi #if !defined(MBEDTLS_USE_PSA_CRYPTO) && \
6711*62c56f98SSadaf Ebrahimi defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
mbedtls_ssl_psk_derive_premaster(mbedtls_ssl_context * ssl,mbedtls_key_exchange_type_t key_ex)6712*62c56f98SSadaf Ebrahimi int mbedtls_ssl_psk_derive_premaster(mbedtls_ssl_context *ssl, mbedtls_key_exchange_type_t key_ex)
6713*62c56f98SSadaf Ebrahimi {
6714*62c56f98SSadaf Ebrahimi unsigned char *p = ssl->handshake->premaster;
6715*62c56f98SSadaf Ebrahimi unsigned char *end = p + sizeof(ssl->handshake->premaster);
6716*62c56f98SSadaf Ebrahimi const unsigned char *psk = NULL;
6717*62c56f98SSadaf Ebrahimi size_t psk_len = 0;
6718*62c56f98SSadaf Ebrahimi int psk_ret = mbedtls_ssl_get_psk(ssl, &psk, &psk_len);
6719*62c56f98SSadaf Ebrahimi
6720*62c56f98SSadaf Ebrahimi if (psk_ret == MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED) {
6721*62c56f98SSadaf Ebrahimi /*
6722*62c56f98SSadaf Ebrahimi * This should never happen because the existence of a PSK is always
6723*62c56f98SSadaf Ebrahimi * checked before calling this function.
6724*62c56f98SSadaf Ebrahimi *
6725*62c56f98SSadaf Ebrahimi * The exception is opaque DHE-PSK. For DHE-PSK fill premaster with
6726*62c56f98SSadaf Ebrahimi * the shared secret without PSK.
6727*62c56f98SSadaf Ebrahimi */
6728*62c56f98SSadaf Ebrahimi if (key_ex != MBEDTLS_KEY_EXCHANGE_DHE_PSK) {
6729*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
6730*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
6731*62c56f98SSadaf Ebrahimi }
6732*62c56f98SSadaf Ebrahimi }
6733*62c56f98SSadaf Ebrahimi
6734*62c56f98SSadaf Ebrahimi /*
6735*62c56f98SSadaf Ebrahimi * PMS = struct {
6736*62c56f98SSadaf Ebrahimi * opaque other_secret<0..2^16-1>;
6737*62c56f98SSadaf Ebrahimi * opaque psk<0..2^16-1>;
6738*62c56f98SSadaf Ebrahimi * };
6739*62c56f98SSadaf Ebrahimi * with "other_secret" depending on the particular key exchange
6740*62c56f98SSadaf Ebrahimi */
6741*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)
6742*62c56f98SSadaf Ebrahimi if (key_ex == MBEDTLS_KEY_EXCHANGE_PSK) {
6743*62c56f98SSadaf Ebrahimi if (end - p < 2) {
6744*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
6745*62c56f98SSadaf Ebrahimi }
6746*62c56f98SSadaf Ebrahimi
6747*62c56f98SSadaf Ebrahimi MBEDTLS_PUT_UINT16_BE(psk_len, p, 0);
6748*62c56f98SSadaf Ebrahimi p += 2;
6749*62c56f98SSadaf Ebrahimi
6750*62c56f98SSadaf Ebrahimi if (end < p || (size_t) (end - p) < psk_len) {
6751*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
6752*62c56f98SSadaf Ebrahimi }
6753*62c56f98SSadaf Ebrahimi
6754*62c56f98SSadaf Ebrahimi memset(p, 0, psk_len);
6755*62c56f98SSadaf Ebrahimi p += psk_len;
6756*62c56f98SSadaf Ebrahimi } else
6757*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED */
6758*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)
6759*62c56f98SSadaf Ebrahimi if (key_ex == MBEDTLS_KEY_EXCHANGE_RSA_PSK) {
6760*62c56f98SSadaf Ebrahimi /*
6761*62c56f98SSadaf Ebrahimi * other_secret already set by the ClientKeyExchange message,
6762*62c56f98SSadaf Ebrahimi * and is 48 bytes long
6763*62c56f98SSadaf Ebrahimi */
6764*62c56f98SSadaf Ebrahimi if (end - p < 2) {
6765*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
6766*62c56f98SSadaf Ebrahimi }
6767*62c56f98SSadaf Ebrahimi
6768*62c56f98SSadaf Ebrahimi *p++ = 0;
6769*62c56f98SSadaf Ebrahimi *p++ = 48;
6770*62c56f98SSadaf Ebrahimi p += 48;
6771*62c56f98SSadaf Ebrahimi } else
6772*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */
6773*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
6774*62c56f98SSadaf Ebrahimi if (key_ex == MBEDTLS_KEY_EXCHANGE_DHE_PSK) {
6775*62c56f98SSadaf Ebrahimi int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
6776*62c56f98SSadaf Ebrahimi size_t len;
6777*62c56f98SSadaf Ebrahimi
6778*62c56f98SSadaf Ebrahimi /* Write length only when we know the actual value */
6779*62c56f98SSadaf Ebrahimi if ((ret = mbedtls_dhm_calc_secret(&ssl->handshake->dhm_ctx,
6780*62c56f98SSadaf Ebrahimi p + 2, end - (p + 2), &len,
6781*62c56f98SSadaf Ebrahimi ssl->conf->f_rng, ssl->conf->p_rng)) != 0) {
6782*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_calc_secret", ret);
6783*62c56f98SSadaf Ebrahimi return ret;
6784*62c56f98SSadaf Ebrahimi }
6785*62c56f98SSadaf Ebrahimi MBEDTLS_PUT_UINT16_BE(len, p, 0);
6786*62c56f98SSadaf Ebrahimi p += 2 + len;
6787*62c56f98SSadaf Ebrahimi
6788*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MPI(3, "DHM: K ", &ssl->handshake->dhm_ctx.K);
6789*62c56f98SSadaf Ebrahimi } else
6790*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
6791*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
6792*62c56f98SSadaf Ebrahimi if (key_ex == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK) {
6793*62c56f98SSadaf Ebrahimi int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
6794*62c56f98SSadaf Ebrahimi size_t zlen;
6795*62c56f98SSadaf Ebrahimi
6796*62c56f98SSadaf Ebrahimi if ((ret = mbedtls_ecdh_calc_secret(&ssl->handshake->ecdh_ctx, &zlen,
6797*62c56f98SSadaf Ebrahimi p + 2, end - (p + 2),
6798*62c56f98SSadaf Ebrahimi ssl->conf->f_rng, ssl->conf->p_rng)) != 0) {
6799*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecdh_calc_secret", ret);
6800*62c56f98SSadaf Ebrahimi return ret;
6801*62c56f98SSadaf Ebrahimi }
6802*62c56f98SSadaf Ebrahimi
6803*62c56f98SSadaf Ebrahimi MBEDTLS_PUT_UINT16_BE(zlen, p, 0);
6804*62c56f98SSadaf Ebrahimi p += 2 + zlen;
6805*62c56f98SSadaf Ebrahimi
6806*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_ECDH(3, &ssl->handshake->ecdh_ctx,
6807*62c56f98SSadaf Ebrahimi MBEDTLS_DEBUG_ECDH_Z);
6808*62c56f98SSadaf Ebrahimi } else
6809*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
6810*62c56f98SSadaf Ebrahimi {
6811*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
6812*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
6813*62c56f98SSadaf Ebrahimi }
6814*62c56f98SSadaf Ebrahimi
6815*62c56f98SSadaf Ebrahimi /* opaque psk<0..2^16-1>; */
6816*62c56f98SSadaf Ebrahimi if (end - p < 2) {
6817*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
6818*62c56f98SSadaf Ebrahimi }
6819*62c56f98SSadaf Ebrahimi
6820*62c56f98SSadaf Ebrahimi MBEDTLS_PUT_UINT16_BE(psk_len, p, 0);
6821*62c56f98SSadaf Ebrahimi p += 2;
6822*62c56f98SSadaf Ebrahimi
6823*62c56f98SSadaf Ebrahimi if (end < p || (size_t) (end - p) < psk_len) {
6824*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
6825*62c56f98SSadaf Ebrahimi }
6826*62c56f98SSadaf Ebrahimi
6827*62c56f98SSadaf Ebrahimi memcpy(p, psk, psk_len);
6828*62c56f98SSadaf Ebrahimi p += psk_len;
6829*62c56f98SSadaf Ebrahimi
6830*62c56f98SSadaf Ebrahimi ssl->handshake->pmslen = p - ssl->handshake->premaster;
6831*62c56f98SSadaf Ebrahimi
6832*62c56f98SSadaf Ebrahimi return 0;
6833*62c56f98SSadaf Ebrahimi }
6834*62c56f98SSadaf Ebrahimi #endif /* !MBEDTLS_USE_PSA_CRYPTO && MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */
6835*62c56f98SSadaf Ebrahimi
6836*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_SRV_C) && defined(MBEDTLS_SSL_RENEGOTIATION)
6837*62c56f98SSadaf Ebrahimi MBEDTLS_CHECK_RETURN_CRITICAL
6838*62c56f98SSadaf Ebrahimi static int ssl_write_hello_request(mbedtls_ssl_context *ssl);
6839*62c56f98SSadaf Ebrahimi
6840*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_DTLS)
mbedtls_ssl_resend_hello_request(mbedtls_ssl_context * ssl)6841*62c56f98SSadaf Ebrahimi int mbedtls_ssl_resend_hello_request(mbedtls_ssl_context *ssl)
6842*62c56f98SSadaf Ebrahimi {
6843*62c56f98SSadaf Ebrahimi /* If renegotiation is not enforced, retransmit until we would reach max
6844*62c56f98SSadaf Ebrahimi * timeout if we were using the usual handshake doubling scheme */
6845*62c56f98SSadaf Ebrahimi if (ssl->conf->renego_max_records < 0) {
6846*62c56f98SSadaf Ebrahimi uint32_t ratio = ssl->conf->hs_timeout_max / ssl->conf->hs_timeout_min + 1;
6847*62c56f98SSadaf Ebrahimi unsigned char doublings = 1;
6848*62c56f98SSadaf Ebrahimi
6849*62c56f98SSadaf Ebrahimi while (ratio != 0) {
6850*62c56f98SSadaf Ebrahimi ++doublings;
6851*62c56f98SSadaf Ebrahimi ratio >>= 1;
6852*62c56f98SSadaf Ebrahimi }
6853*62c56f98SSadaf Ebrahimi
6854*62c56f98SSadaf Ebrahimi if (++ssl->renego_records_seen > doublings) {
6855*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(2, ("no longer retransmitting hello request"));
6856*62c56f98SSadaf Ebrahimi return 0;
6857*62c56f98SSadaf Ebrahimi }
6858*62c56f98SSadaf Ebrahimi }
6859*62c56f98SSadaf Ebrahimi
6860*62c56f98SSadaf Ebrahimi return ssl_write_hello_request(ssl);
6861*62c56f98SSadaf Ebrahimi }
6862*62c56f98SSadaf Ebrahimi #endif
6863*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_SRV_C && MBEDTLS_SSL_RENEGOTIATION */
6864*62c56f98SSadaf Ebrahimi
6865*62c56f98SSadaf Ebrahimi /*
6866*62c56f98SSadaf Ebrahimi * Handshake functions
6867*62c56f98SSadaf Ebrahimi */
6868*62c56f98SSadaf Ebrahimi #if !defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
6869*62c56f98SSadaf Ebrahimi /* No certificate support -> dummy functions */
mbedtls_ssl_write_certificate(mbedtls_ssl_context * ssl)6870*62c56f98SSadaf Ebrahimi int mbedtls_ssl_write_certificate(mbedtls_ssl_context *ssl)
6871*62c56f98SSadaf Ebrahimi {
6872*62c56f98SSadaf Ebrahimi const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
6873*62c56f98SSadaf Ebrahimi ssl->handshake->ciphersuite_info;
6874*62c56f98SSadaf Ebrahimi
6875*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(2, ("=> write certificate"));
6876*62c56f98SSadaf Ebrahimi
6877*62c56f98SSadaf Ebrahimi if (!mbedtls_ssl_ciphersuite_uses_srv_cert(ciphersuite_info)) {
6878*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write certificate"));
6879*62c56f98SSadaf Ebrahimi ssl->state++;
6880*62c56f98SSadaf Ebrahimi return 0;
6881*62c56f98SSadaf Ebrahimi }
6882*62c56f98SSadaf Ebrahimi
6883*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
6884*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
6885*62c56f98SSadaf Ebrahimi }
6886*62c56f98SSadaf Ebrahimi
mbedtls_ssl_parse_certificate(mbedtls_ssl_context * ssl)6887*62c56f98SSadaf Ebrahimi int mbedtls_ssl_parse_certificate(mbedtls_ssl_context *ssl)
6888*62c56f98SSadaf Ebrahimi {
6889*62c56f98SSadaf Ebrahimi const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
6890*62c56f98SSadaf Ebrahimi ssl->handshake->ciphersuite_info;
6891*62c56f98SSadaf Ebrahimi
6892*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse certificate"));
6893*62c56f98SSadaf Ebrahimi
6894*62c56f98SSadaf Ebrahimi if (!mbedtls_ssl_ciphersuite_uses_srv_cert(ciphersuite_info)) {
6895*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate"));
6896*62c56f98SSadaf Ebrahimi ssl->state++;
6897*62c56f98SSadaf Ebrahimi return 0;
6898*62c56f98SSadaf Ebrahimi }
6899*62c56f98SSadaf Ebrahimi
6900*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
6901*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
6902*62c56f98SSadaf Ebrahimi }
6903*62c56f98SSadaf Ebrahimi
6904*62c56f98SSadaf Ebrahimi #else /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
6905*62c56f98SSadaf Ebrahimi /* Some certificate support -> implement write and parse */
6906*62c56f98SSadaf Ebrahimi
mbedtls_ssl_write_certificate(mbedtls_ssl_context * ssl)6907*62c56f98SSadaf Ebrahimi int mbedtls_ssl_write_certificate(mbedtls_ssl_context *ssl)
6908*62c56f98SSadaf Ebrahimi {
6909*62c56f98SSadaf Ebrahimi int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
6910*62c56f98SSadaf Ebrahimi size_t i, n;
6911*62c56f98SSadaf Ebrahimi const mbedtls_x509_crt *crt;
6912*62c56f98SSadaf Ebrahimi const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
6913*62c56f98SSadaf Ebrahimi ssl->handshake->ciphersuite_info;
6914*62c56f98SSadaf Ebrahimi
6915*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(2, ("=> write certificate"));
6916*62c56f98SSadaf Ebrahimi
6917*62c56f98SSadaf Ebrahimi if (!mbedtls_ssl_ciphersuite_uses_srv_cert(ciphersuite_info)) {
6918*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write certificate"));
6919*62c56f98SSadaf Ebrahimi ssl->state++;
6920*62c56f98SSadaf Ebrahimi return 0;
6921*62c56f98SSadaf Ebrahimi }
6922*62c56f98SSadaf Ebrahimi
6923*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_CLI_C)
6924*62c56f98SSadaf Ebrahimi if (ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT) {
6925*62c56f98SSadaf Ebrahimi if (ssl->handshake->client_auth == 0) {
6926*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write certificate"));
6927*62c56f98SSadaf Ebrahimi ssl->state++;
6928*62c56f98SSadaf Ebrahimi return 0;
6929*62c56f98SSadaf Ebrahimi }
6930*62c56f98SSadaf Ebrahimi }
6931*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_CLI_C */
6932*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_SRV_C)
6933*62c56f98SSadaf Ebrahimi if (ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER) {
6934*62c56f98SSadaf Ebrahimi if (mbedtls_ssl_own_cert(ssl) == NULL) {
6935*62c56f98SSadaf Ebrahimi /* Should never happen because we shouldn't have picked the
6936*62c56f98SSadaf Ebrahimi * ciphersuite if we don't have a certificate. */
6937*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
6938*62c56f98SSadaf Ebrahimi }
6939*62c56f98SSadaf Ebrahimi }
6940*62c56f98SSadaf Ebrahimi #endif
6941*62c56f98SSadaf Ebrahimi
6942*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_CRT(3, "own certificate", mbedtls_ssl_own_cert(ssl));
6943*62c56f98SSadaf Ebrahimi
6944*62c56f98SSadaf Ebrahimi /*
6945*62c56f98SSadaf Ebrahimi * 0 . 0 handshake type
6946*62c56f98SSadaf Ebrahimi * 1 . 3 handshake length
6947*62c56f98SSadaf Ebrahimi * 4 . 6 length of all certs
6948*62c56f98SSadaf Ebrahimi * 7 . 9 length of cert. 1
6949*62c56f98SSadaf Ebrahimi * 10 . n-1 peer certificate
6950*62c56f98SSadaf Ebrahimi * n . n+2 length of cert. 2
6951*62c56f98SSadaf Ebrahimi * n+3 . ... upper level cert, etc.
6952*62c56f98SSadaf Ebrahimi */
6953*62c56f98SSadaf Ebrahimi i = 7;
6954*62c56f98SSadaf Ebrahimi crt = mbedtls_ssl_own_cert(ssl);
6955*62c56f98SSadaf Ebrahimi
6956*62c56f98SSadaf Ebrahimi while (crt != NULL) {
6957*62c56f98SSadaf Ebrahimi n = crt->raw.len;
6958*62c56f98SSadaf Ebrahimi if (n > MBEDTLS_SSL_OUT_CONTENT_LEN - 3 - i) {
6959*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(1, ("certificate too large, %" MBEDTLS_PRINTF_SIZET
6960*62c56f98SSadaf Ebrahimi " > %" MBEDTLS_PRINTF_SIZET,
6961*62c56f98SSadaf Ebrahimi i + 3 + n, (size_t) MBEDTLS_SSL_OUT_CONTENT_LEN));
6962*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL;
6963*62c56f98SSadaf Ebrahimi }
6964*62c56f98SSadaf Ebrahimi
6965*62c56f98SSadaf Ebrahimi ssl->out_msg[i] = MBEDTLS_BYTE_2(n);
6966*62c56f98SSadaf Ebrahimi ssl->out_msg[i + 1] = MBEDTLS_BYTE_1(n);
6967*62c56f98SSadaf Ebrahimi ssl->out_msg[i + 2] = MBEDTLS_BYTE_0(n);
6968*62c56f98SSadaf Ebrahimi
6969*62c56f98SSadaf Ebrahimi i += 3; memcpy(ssl->out_msg + i, crt->raw.p, n);
6970*62c56f98SSadaf Ebrahimi i += n; crt = crt->next;
6971*62c56f98SSadaf Ebrahimi }
6972*62c56f98SSadaf Ebrahimi
6973*62c56f98SSadaf Ebrahimi ssl->out_msg[4] = MBEDTLS_BYTE_2(i - 7);
6974*62c56f98SSadaf Ebrahimi ssl->out_msg[5] = MBEDTLS_BYTE_1(i - 7);
6975*62c56f98SSadaf Ebrahimi ssl->out_msg[6] = MBEDTLS_BYTE_0(i - 7);
6976*62c56f98SSadaf Ebrahimi
6977*62c56f98SSadaf Ebrahimi ssl->out_msglen = i;
6978*62c56f98SSadaf Ebrahimi ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
6979*62c56f98SSadaf Ebrahimi ssl->out_msg[0] = MBEDTLS_SSL_HS_CERTIFICATE;
6980*62c56f98SSadaf Ebrahimi
6981*62c56f98SSadaf Ebrahimi ssl->state++;
6982*62c56f98SSadaf Ebrahimi
6983*62c56f98SSadaf Ebrahimi if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
6984*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
6985*62c56f98SSadaf Ebrahimi return ret;
6986*62c56f98SSadaf Ebrahimi }
6987*62c56f98SSadaf Ebrahimi
6988*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(2, ("<= write certificate"));
6989*62c56f98SSadaf Ebrahimi
6990*62c56f98SSadaf Ebrahimi return ret;
6991*62c56f98SSadaf Ebrahimi }
6992*62c56f98SSadaf Ebrahimi
6993*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_RENEGOTIATION) && defined(MBEDTLS_SSL_CLI_C)
6994*62c56f98SSadaf Ebrahimi
6995*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
6996*62c56f98SSadaf Ebrahimi MBEDTLS_CHECK_RETURN_CRITICAL
ssl_check_peer_crt_unchanged(mbedtls_ssl_context * ssl,unsigned char * crt_buf,size_t crt_buf_len)6997*62c56f98SSadaf Ebrahimi static int ssl_check_peer_crt_unchanged(mbedtls_ssl_context *ssl,
6998*62c56f98SSadaf Ebrahimi unsigned char *crt_buf,
6999*62c56f98SSadaf Ebrahimi size_t crt_buf_len)
7000*62c56f98SSadaf Ebrahimi {
7001*62c56f98SSadaf Ebrahimi mbedtls_x509_crt const * const peer_crt = ssl->session->peer_cert;
7002*62c56f98SSadaf Ebrahimi
7003*62c56f98SSadaf Ebrahimi if (peer_crt == NULL) {
7004*62c56f98SSadaf Ebrahimi return -1;
7005*62c56f98SSadaf Ebrahimi }
7006*62c56f98SSadaf Ebrahimi
7007*62c56f98SSadaf Ebrahimi if (peer_crt->raw.len != crt_buf_len) {
7008*62c56f98SSadaf Ebrahimi return -1;
7009*62c56f98SSadaf Ebrahimi }
7010*62c56f98SSadaf Ebrahimi
7011*62c56f98SSadaf Ebrahimi return memcmp(peer_crt->raw.p, crt_buf, peer_crt->raw.len);
7012*62c56f98SSadaf Ebrahimi }
7013*62c56f98SSadaf Ebrahimi #else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
7014*62c56f98SSadaf Ebrahimi MBEDTLS_CHECK_RETURN_CRITICAL
ssl_check_peer_crt_unchanged(mbedtls_ssl_context * ssl,unsigned char * crt_buf,size_t crt_buf_len)7015*62c56f98SSadaf Ebrahimi static int ssl_check_peer_crt_unchanged(mbedtls_ssl_context *ssl,
7016*62c56f98SSadaf Ebrahimi unsigned char *crt_buf,
7017*62c56f98SSadaf Ebrahimi size_t crt_buf_len)
7018*62c56f98SSadaf Ebrahimi {
7019*62c56f98SSadaf Ebrahimi int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
7020*62c56f98SSadaf Ebrahimi unsigned char const * const peer_cert_digest =
7021*62c56f98SSadaf Ebrahimi ssl->session->peer_cert_digest;
7022*62c56f98SSadaf Ebrahimi mbedtls_md_type_t const peer_cert_digest_type =
7023*62c56f98SSadaf Ebrahimi ssl->session->peer_cert_digest_type;
7024*62c56f98SSadaf Ebrahimi mbedtls_md_info_t const * const digest_info =
7025*62c56f98SSadaf Ebrahimi mbedtls_md_info_from_type(peer_cert_digest_type);
7026*62c56f98SSadaf Ebrahimi unsigned char tmp_digest[MBEDTLS_SSL_PEER_CERT_DIGEST_MAX_LEN];
7027*62c56f98SSadaf Ebrahimi size_t digest_len;
7028*62c56f98SSadaf Ebrahimi
7029*62c56f98SSadaf Ebrahimi if (peer_cert_digest == NULL || digest_info == NULL) {
7030*62c56f98SSadaf Ebrahimi return -1;
7031*62c56f98SSadaf Ebrahimi }
7032*62c56f98SSadaf Ebrahimi
7033*62c56f98SSadaf Ebrahimi digest_len = mbedtls_md_get_size(digest_info);
7034*62c56f98SSadaf Ebrahimi if (digest_len > MBEDTLS_SSL_PEER_CERT_DIGEST_MAX_LEN) {
7035*62c56f98SSadaf Ebrahimi return -1;
7036*62c56f98SSadaf Ebrahimi }
7037*62c56f98SSadaf Ebrahimi
7038*62c56f98SSadaf Ebrahimi ret = mbedtls_md(digest_info, crt_buf, crt_buf_len, tmp_digest);
7039*62c56f98SSadaf Ebrahimi if (ret != 0) {
7040*62c56f98SSadaf Ebrahimi return -1;
7041*62c56f98SSadaf Ebrahimi }
7042*62c56f98SSadaf Ebrahimi
7043*62c56f98SSadaf Ebrahimi return memcmp(tmp_digest, peer_cert_digest, digest_len);
7044*62c56f98SSadaf Ebrahimi }
7045*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
7046*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_RENEGOTIATION && MBEDTLS_SSL_CLI_C */
7047*62c56f98SSadaf Ebrahimi
7048*62c56f98SSadaf Ebrahimi /*
7049*62c56f98SSadaf Ebrahimi * Once the certificate message is read, parse it into a cert chain and
7050*62c56f98SSadaf Ebrahimi * perform basic checks, but leave actual verification to the caller
7051*62c56f98SSadaf Ebrahimi */
7052*62c56f98SSadaf Ebrahimi MBEDTLS_CHECK_RETURN_CRITICAL
ssl_parse_certificate_chain(mbedtls_ssl_context * ssl,mbedtls_x509_crt * chain)7053*62c56f98SSadaf Ebrahimi static int ssl_parse_certificate_chain(mbedtls_ssl_context *ssl,
7054*62c56f98SSadaf Ebrahimi mbedtls_x509_crt *chain)
7055*62c56f98SSadaf Ebrahimi {
7056*62c56f98SSadaf Ebrahimi int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
7057*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_RENEGOTIATION) && defined(MBEDTLS_SSL_CLI_C)
7058*62c56f98SSadaf Ebrahimi int crt_cnt = 0;
7059*62c56f98SSadaf Ebrahimi #endif
7060*62c56f98SSadaf Ebrahimi size_t i, n;
7061*62c56f98SSadaf Ebrahimi uint8_t alert;
7062*62c56f98SSadaf Ebrahimi
7063*62c56f98SSadaf Ebrahimi if (ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE) {
7064*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate message"));
7065*62c56f98SSadaf Ebrahimi mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
7066*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE);
7067*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
7068*62c56f98SSadaf Ebrahimi }
7069*62c56f98SSadaf Ebrahimi
7070*62c56f98SSadaf Ebrahimi if (ssl->in_msg[0] != MBEDTLS_SSL_HS_CERTIFICATE) {
7071*62c56f98SSadaf Ebrahimi mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
7072*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE);
7073*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
7074*62c56f98SSadaf Ebrahimi }
7075*62c56f98SSadaf Ebrahimi
7076*62c56f98SSadaf Ebrahimi if (ssl->in_hslen < mbedtls_ssl_hs_hdr_len(ssl) + 3 + 3) {
7077*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate message"));
7078*62c56f98SSadaf Ebrahimi mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
7079*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
7080*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_DECODE_ERROR;
7081*62c56f98SSadaf Ebrahimi }
7082*62c56f98SSadaf Ebrahimi
7083*62c56f98SSadaf Ebrahimi i = mbedtls_ssl_hs_hdr_len(ssl);
7084*62c56f98SSadaf Ebrahimi
7085*62c56f98SSadaf Ebrahimi /*
7086*62c56f98SSadaf Ebrahimi * Same message structure as in mbedtls_ssl_write_certificate()
7087*62c56f98SSadaf Ebrahimi */
7088*62c56f98SSadaf Ebrahimi n = (ssl->in_msg[i+1] << 8) | ssl->in_msg[i+2];
7089*62c56f98SSadaf Ebrahimi
7090*62c56f98SSadaf Ebrahimi if (ssl->in_msg[i] != 0 ||
7091*62c56f98SSadaf Ebrahimi ssl->in_hslen != n + 3 + mbedtls_ssl_hs_hdr_len(ssl)) {
7092*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate message"));
7093*62c56f98SSadaf Ebrahimi mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
7094*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
7095*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_DECODE_ERROR;
7096*62c56f98SSadaf Ebrahimi }
7097*62c56f98SSadaf Ebrahimi
7098*62c56f98SSadaf Ebrahimi /* Make &ssl->in_msg[i] point to the beginning of the CRT chain. */
7099*62c56f98SSadaf Ebrahimi i += 3;
7100*62c56f98SSadaf Ebrahimi
7101*62c56f98SSadaf Ebrahimi /* Iterate through and parse the CRTs in the provided chain. */
7102*62c56f98SSadaf Ebrahimi while (i < ssl->in_hslen) {
7103*62c56f98SSadaf Ebrahimi /* Check that there's room for the next CRT's length fields. */
7104*62c56f98SSadaf Ebrahimi if (i + 3 > ssl->in_hslen) {
7105*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate message"));
7106*62c56f98SSadaf Ebrahimi mbedtls_ssl_send_alert_message(ssl,
7107*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_ALERT_LEVEL_FATAL,
7108*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
7109*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_DECODE_ERROR;
7110*62c56f98SSadaf Ebrahimi }
7111*62c56f98SSadaf Ebrahimi /* In theory, the CRT can be up to 2**24 Bytes, but we don't support
7112*62c56f98SSadaf Ebrahimi * anything beyond 2**16 ~ 64K. */
7113*62c56f98SSadaf Ebrahimi if (ssl->in_msg[i] != 0) {
7114*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate message"));
7115*62c56f98SSadaf Ebrahimi mbedtls_ssl_send_alert_message(ssl,
7116*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_ALERT_LEVEL_FATAL,
7117*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT);
7118*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_CERTIFICATE;
7119*62c56f98SSadaf Ebrahimi }
7120*62c56f98SSadaf Ebrahimi
7121*62c56f98SSadaf Ebrahimi /* Read length of the next CRT in the chain. */
7122*62c56f98SSadaf Ebrahimi n = ((unsigned int) ssl->in_msg[i + 1] << 8)
7123*62c56f98SSadaf Ebrahimi | (unsigned int) ssl->in_msg[i + 2];
7124*62c56f98SSadaf Ebrahimi i += 3;
7125*62c56f98SSadaf Ebrahimi
7126*62c56f98SSadaf Ebrahimi if (n < 128 || i + n > ssl->in_hslen) {
7127*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate message"));
7128*62c56f98SSadaf Ebrahimi mbedtls_ssl_send_alert_message(ssl,
7129*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_ALERT_LEVEL_FATAL,
7130*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
7131*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_DECODE_ERROR;
7132*62c56f98SSadaf Ebrahimi }
7133*62c56f98SSadaf Ebrahimi
7134*62c56f98SSadaf Ebrahimi /* Check if we're handling the first CRT in the chain. */
7135*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_RENEGOTIATION) && defined(MBEDTLS_SSL_CLI_C)
7136*62c56f98SSadaf Ebrahimi if (crt_cnt++ == 0 &&
7137*62c56f98SSadaf Ebrahimi ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT &&
7138*62c56f98SSadaf Ebrahimi ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS) {
7139*62c56f98SSadaf Ebrahimi /* During client-side renegotiation, check that the server's
7140*62c56f98SSadaf Ebrahimi * end-CRTs hasn't changed compared to the initial handshake,
7141*62c56f98SSadaf Ebrahimi * mitigating the triple handshake attack. On success, reuse
7142*62c56f98SSadaf Ebrahimi * the original end-CRT instead of parsing it again. */
7143*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(3, ("Check that peer CRT hasn't changed during renegotiation"));
7144*62c56f98SSadaf Ebrahimi if (ssl_check_peer_crt_unchanged(ssl,
7145*62c56f98SSadaf Ebrahimi &ssl->in_msg[i],
7146*62c56f98SSadaf Ebrahimi n) != 0) {
7147*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(1, ("new server cert during renegotiation"));
7148*62c56f98SSadaf Ebrahimi mbedtls_ssl_send_alert_message(ssl,
7149*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_ALERT_LEVEL_FATAL,
7150*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_ALERT_MSG_ACCESS_DENIED);
7151*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_CERTIFICATE;
7152*62c56f98SSadaf Ebrahimi }
7153*62c56f98SSadaf Ebrahimi
7154*62c56f98SSadaf Ebrahimi /* Now we can safely free the original chain. */
7155*62c56f98SSadaf Ebrahimi ssl_clear_peer_cert(ssl->session);
7156*62c56f98SSadaf Ebrahimi }
7157*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_RENEGOTIATION && MBEDTLS_SSL_CLI_C */
7158*62c56f98SSadaf Ebrahimi
7159*62c56f98SSadaf Ebrahimi /* Parse the next certificate in the chain. */
7160*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
7161*62c56f98SSadaf Ebrahimi ret = mbedtls_x509_crt_parse_der(chain, ssl->in_msg + i, n);
7162*62c56f98SSadaf Ebrahimi #else
7163*62c56f98SSadaf Ebrahimi /* If we don't need to store the CRT chain permanently, parse
7164*62c56f98SSadaf Ebrahimi * it in-place from the input buffer instead of making a copy. */
7165*62c56f98SSadaf Ebrahimi ret = mbedtls_x509_crt_parse_der_nocopy(chain, ssl->in_msg + i, n);
7166*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
7167*62c56f98SSadaf Ebrahimi switch (ret) {
7168*62c56f98SSadaf Ebrahimi case 0: /*ok*/
7169*62c56f98SSadaf Ebrahimi case MBEDTLS_ERR_X509_UNKNOWN_SIG_ALG + MBEDTLS_ERR_OID_NOT_FOUND:
7170*62c56f98SSadaf Ebrahimi /* Ignore certificate with an unknown algorithm: maybe a
7171*62c56f98SSadaf Ebrahimi prior certificate was already trusted. */
7172*62c56f98SSadaf Ebrahimi break;
7173*62c56f98SSadaf Ebrahimi
7174*62c56f98SSadaf Ebrahimi case MBEDTLS_ERR_X509_ALLOC_FAILED:
7175*62c56f98SSadaf Ebrahimi alert = MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR;
7176*62c56f98SSadaf Ebrahimi goto crt_parse_der_failed;
7177*62c56f98SSadaf Ebrahimi
7178*62c56f98SSadaf Ebrahimi case MBEDTLS_ERR_X509_UNKNOWN_VERSION:
7179*62c56f98SSadaf Ebrahimi alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT;
7180*62c56f98SSadaf Ebrahimi goto crt_parse_der_failed;
7181*62c56f98SSadaf Ebrahimi
7182*62c56f98SSadaf Ebrahimi default:
7183*62c56f98SSadaf Ebrahimi alert = MBEDTLS_SSL_ALERT_MSG_BAD_CERT;
7184*62c56f98SSadaf Ebrahimi crt_parse_der_failed:
7185*62c56f98SSadaf Ebrahimi mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, alert);
7186*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_RET(1, " mbedtls_x509_crt_parse_der", ret);
7187*62c56f98SSadaf Ebrahimi return ret;
7188*62c56f98SSadaf Ebrahimi }
7189*62c56f98SSadaf Ebrahimi
7190*62c56f98SSadaf Ebrahimi i += n;
7191*62c56f98SSadaf Ebrahimi }
7192*62c56f98SSadaf Ebrahimi
7193*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_CRT(3, "peer certificate", chain);
7194*62c56f98SSadaf Ebrahimi return 0;
7195*62c56f98SSadaf Ebrahimi }
7196*62c56f98SSadaf Ebrahimi
7197*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_SRV_C)
7198*62c56f98SSadaf Ebrahimi MBEDTLS_CHECK_RETURN_CRITICAL
ssl_srv_check_client_no_crt_notification(mbedtls_ssl_context * ssl)7199*62c56f98SSadaf Ebrahimi static int ssl_srv_check_client_no_crt_notification(mbedtls_ssl_context *ssl)
7200*62c56f98SSadaf Ebrahimi {
7201*62c56f98SSadaf Ebrahimi if (ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT) {
7202*62c56f98SSadaf Ebrahimi return -1;
7203*62c56f98SSadaf Ebrahimi }
7204*62c56f98SSadaf Ebrahimi
7205*62c56f98SSadaf Ebrahimi if (ssl->in_hslen == 3 + mbedtls_ssl_hs_hdr_len(ssl) &&
7206*62c56f98SSadaf Ebrahimi ssl->in_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE &&
7207*62c56f98SSadaf Ebrahimi ssl->in_msg[0] == MBEDTLS_SSL_HS_CERTIFICATE &&
7208*62c56f98SSadaf Ebrahimi memcmp(ssl->in_msg + mbedtls_ssl_hs_hdr_len(ssl), "\0\0\0", 3) == 0) {
7209*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(1, ("peer has no certificate"));
7210*62c56f98SSadaf Ebrahimi return 0;
7211*62c56f98SSadaf Ebrahimi }
7212*62c56f98SSadaf Ebrahimi return -1;
7213*62c56f98SSadaf Ebrahimi }
7214*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_SRV_C */
7215*62c56f98SSadaf Ebrahimi
7216*62c56f98SSadaf Ebrahimi /* Check if a certificate message is expected.
7217*62c56f98SSadaf Ebrahimi * Return either
7218*62c56f98SSadaf Ebrahimi * - SSL_CERTIFICATE_EXPECTED, or
7219*62c56f98SSadaf Ebrahimi * - SSL_CERTIFICATE_SKIP
7220*62c56f98SSadaf Ebrahimi * indicating whether a Certificate message is expected or not.
7221*62c56f98SSadaf Ebrahimi */
7222*62c56f98SSadaf Ebrahimi #define SSL_CERTIFICATE_EXPECTED 0
7223*62c56f98SSadaf Ebrahimi #define SSL_CERTIFICATE_SKIP 1
7224*62c56f98SSadaf Ebrahimi MBEDTLS_CHECK_RETURN_CRITICAL
ssl_parse_certificate_coordinate(mbedtls_ssl_context * ssl,int authmode)7225*62c56f98SSadaf Ebrahimi static int ssl_parse_certificate_coordinate(mbedtls_ssl_context *ssl,
7226*62c56f98SSadaf Ebrahimi int authmode)
7227*62c56f98SSadaf Ebrahimi {
7228*62c56f98SSadaf Ebrahimi const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
7229*62c56f98SSadaf Ebrahimi ssl->handshake->ciphersuite_info;
7230*62c56f98SSadaf Ebrahimi
7231*62c56f98SSadaf Ebrahimi if (!mbedtls_ssl_ciphersuite_uses_srv_cert(ciphersuite_info)) {
7232*62c56f98SSadaf Ebrahimi return SSL_CERTIFICATE_SKIP;
7233*62c56f98SSadaf Ebrahimi }
7234*62c56f98SSadaf Ebrahimi
7235*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_SRV_C)
7236*62c56f98SSadaf Ebrahimi if (ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER) {
7237*62c56f98SSadaf Ebrahimi if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK) {
7238*62c56f98SSadaf Ebrahimi return SSL_CERTIFICATE_SKIP;
7239*62c56f98SSadaf Ebrahimi }
7240*62c56f98SSadaf Ebrahimi
7241*62c56f98SSadaf Ebrahimi if (authmode == MBEDTLS_SSL_VERIFY_NONE) {
7242*62c56f98SSadaf Ebrahimi ssl->session_negotiate->verify_result =
7243*62c56f98SSadaf Ebrahimi MBEDTLS_X509_BADCERT_SKIP_VERIFY;
7244*62c56f98SSadaf Ebrahimi return SSL_CERTIFICATE_SKIP;
7245*62c56f98SSadaf Ebrahimi }
7246*62c56f98SSadaf Ebrahimi }
7247*62c56f98SSadaf Ebrahimi #else
7248*62c56f98SSadaf Ebrahimi ((void) authmode);
7249*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_SRV_C */
7250*62c56f98SSadaf Ebrahimi
7251*62c56f98SSadaf Ebrahimi return SSL_CERTIFICATE_EXPECTED;
7252*62c56f98SSadaf Ebrahimi }
7253*62c56f98SSadaf Ebrahimi
7254*62c56f98SSadaf Ebrahimi MBEDTLS_CHECK_RETURN_CRITICAL
ssl_parse_certificate_verify(mbedtls_ssl_context * ssl,int authmode,mbedtls_x509_crt * chain,void * rs_ctx)7255*62c56f98SSadaf Ebrahimi static int ssl_parse_certificate_verify(mbedtls_ssl_context *ssl,
7256*62c56f98SSadaf Ebrahimi int authmode,
7257*62c56f98SSadaf Ebrahimi mbedtls_x509_crt *chain,
7258*62c56f98SSadaf Ebrahimi void *rs_ctx)
7259*62c56f98SSadaf Ebrahimi {
7260*62c56f98SSadaf Ebrahimi int ret = 0;
7261*62c56f98SSadaf Ebrahimi const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
7262*62c56f98SSadaf Ebrahimi ssl->handshake->ciphersuite_info;
7263*62c56f98SSadaf Ebrahimi int have_ca_chain = 0;
7264*62c56f98SSadaf Ebrahimi
7265*62c56f98SSadaf Ebrahimi int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *);
7266*62c56f98SSadaf Ebrahimi void *p_vrfy;
7267*62c56f98SSadaf Ebrahimi
7268*62c56f98SSadaf Ebrahimi if (authmode == MBEDTLS_SSL_VERIFY_NONE) {
7269*62c56f98SSadaf Ebrahimi return 0;
7270*62c56f98SSadaf Ebrahimi }
7271*62c56f98SSadaf Ebrahimi
7272*62c56f98SSadaf Ebrahimi if (ssl->f_vrfy != NULL) {
7273*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(3, ("Use context-specific verification callback"));
7274*62c56f98SSadaf Ebrahimi f_vrfy = ssl->f_vrfy;
7275*62c56f98SSadaf Ebrahimi p_vrfy = ssl->p_vrfy;
7276*62c56f98SSadaf Ebrahimi } else {
7277*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(3, ("Use configuration-specific verification callback"));
7278*62c56f98SSadaf Ebrahimi f_vrfy = ssl->conf->f_vrfy;
7279*62c56f98SSadaf Ebrahimi p_vrfy = ssl->conf->p_vrfy;
7280*62c56f98SSadaf Ebrahimi }
7281*62c56f98SSadaf Ebrahimi
7282*62c56f98SSadaf Ebrahimi /*
7283*62c56f98SSadaf Ebrahimi * Main check: verify certificate
7284*62c56f98SSadaf Ebrahimi */
7285*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK)
7286*62c56f98SSadaf Ebrahimi if (ssl->conf->f_ca_cb != NULL) {
7287*62c56f98SSadaf Ebrahimi ((void) rs_ctx);
7288*62c56f98SSadaf Ebrahimi have_ca_chain = 1;
7289*62c56f98SSadaf Ebrahimi
7290*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(3, ("use CA callback for X.509 CRT verification"));
7291*62c56f98SSadaf Ebrahimi ret = mbedtls_x509_crt_verify_with_ca_cb(
7292*62c56f98SSadaf Ebrahimi chain,
7293*62c56f98SSadaf Ebrahimi ssl->conf->f_ca_cb,
7294*62c56f98SSadaf Ebrahimi ssl->conf->p_ca_cb,
7295*62c56f98SSadaf Ebrahimi ssl->conf->cert_profile,
7296*62c56f98SSadaf Ebrahimi ssl->hostname,
7297*62c56f98SSadaf Ebrahimi &ssl->session_negotiate->verify_result,
7298*62c56f98SSadaf Ebrahimi f_vrfy, p_vrfy);
7299*62c56f98SSadaf Ebrahimi } else
7300*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK */
7301*62c56f98SSadaf Ebrahimi {
7302*62c56f98SSadaf Ebrahimi mbedtls_x509_crt *ca_chain;
7303*62c56f98SSadaf Ebrahimi mbedtls_x509_crl *ca_crl;
7304*62c56f98SSadaf Ebrahimi
7305*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
7306*62c56f98SSadaf Ebrahimi if (ssl->handshake->sni_ca_chain != NULL) {
7307*62c56f98SSadaf Ebrahimi ca_chain = ssl->handshake->sni_ca_chain;
7308*62c56f98SSadaf Ebrahimi ca_crl = ssl->handshake->sni_ca_crl;
7309*62c56f98SSadaf Ebrahimi } else
7310*62c56f98SSadaf Ebrahimi #endif
7311*62c56f98SSadaf Ebrahimi {
7312*62c56f98SSadaf Ebrahimi ca_chain = ssl->conf->ca_chain;
7313*62c56f98SSadaf Ebrahimi ca_crl = ssl->conf->ca_crl;
7314*62c56f98SSadaf Ebrahimi }
7315*62c56f98SSadaf Ebrahimi
7316*62c56f98SSadaf Ebrahimi if (ca_chain != NULL) {
7317*62c56f98SSadaf Ebrahimi have_ca_chain = 1;
7318*62c56f98SSadaf Ebrahimi }
7319*62c56f98SSadaf Ebrahimi
7320*62c56f98SSadaf Ebrahimi ret = mbedtls_x509_crt_verify_restartable(
7321*62c56f98SSadaf Ebrahimi chain,
7322*62c56f98SSadaf Ebrahimi ca_chain, ca_crl,
7323*62c56f98SSadaf Ebrahimi ssl->conf->cert_profile,
7324*62c56f98SSadaf Ebrahimi ssl->hostname,
7325*62c56f98SSadaf Ebrahimi &ssl->session_negotiate->verify_result,
7326*62c56f98SSadaf Ebrahimi f_vrfy, p_vrfy, rs_ctx);
7327*62c56f98SSadaf Ebrahimi }
7328*62c56f98SSadaf Ebrahimi
7329*62c56f98SSadaf Ebrahimi if (ret != 0) {
7330*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_RET(1, "x509_verify_cert", ret);
7331*62c56f98SSadaf Ebrahimi }
7332*62c56f98SSadaf Ebrahimi
7333*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
7334*62c56f98SSadaf Ebrahimi if (ret == MBEDTLS_ERR_ECP_IN_PROGRESS) {
7335*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS;
7336*62c56f98SSadaf Ebrahimi }
7337*62c56f98SSadaf Ebrahimi #endif
7338*62c56f98SSadaf Ebrahimi
7339*62c56f98SSadaf Ebrahimi /*
7340*62c56f98SSadaf Ebrahimi * Secondary checks: always done, but change 'ret' only if it was 0
7341*62c56f98SSadaf Ebrahimi */
7342*62c56f98SSadaf Ebrahimi
7343*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PK_HAVE_ECC_KEYS)
7344*62c56f98SSadaf Ebrahimi {
7345*62c56f98SSadaf Ebrahimi const mbedtls_pk_context *pk = &chain->pk;
7346*62c56f98SSadaf Ebrahimi
7347*62c56f98SSadaf Ebrahimi /* If certificate uses an EC key, make sure the curve is OK.
7348*62c56f98SSadaf Ebrahimi * This is a public key, so it can't be opaque, so can_do() is a good
7349*62c56f98SSadaf Ebrahimi * enough check to ensure pk_ec() is safe to use here. */
7350*62c56f98SSadaf Ebrahimi if (mbedtls_pk_can_do(pk, MBEDTLS_PK_ECKEY)) {
7351*62c56f98SSadaf Ebrahimi /* and in the unlikely case the above assumption no longer holds
7352*62c56f98SSadaf Ebrahimi * we are making sure that pk_ec() here does not return a NULL
7353*62c56f98SSadaf Ebrahimi */
7354*62c56f98SSadaf Ebrahimi mbedtls_ecp_group_id grp_id = mbedtls_pk_get_group_id(pk);
7355*62c56f98SSadaf Ebrahimi if (grp_id == MBEDTLS_ECP_DP_NONE) {
7356*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(1, ("invalid group ID"));
7357*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
7358*62c56f98SSadaf Ebrahimi }
7359*62c56f98SSadaf Ebrahimi if (mbedtls_ssl_check_curve(ssl, grp_id) != 0) {
7360*62c56f98SSadaf Ebrahimi ssl->session_negotiate->verify_result |=
7361*62c56f98SSadaf Ebrahimi MBEDTLS_X509_BADCERT_BAD_KEY;
7362*62c56f98SSadaf Ebrahimi
7363*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate (EC key curve)"));
7364*62c56f98SSadaf Ebrahimi if (ret == 0) {
7365*62c56f98SSadaf Ebrahimi ret = MBEDTLS_ERR_SSL_BAD_CERTIFICATE;
7366*62c56f98SSadaf Ebrahimi }
7367*62c56f98SSadaf Ebrahimi }
7368*62c56f98SSadaf Ebrahimi }
7369*62c56f98SSadaf Ebrahimi }
7370*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_PK_HAVE_ECC_KEYS */
7371*62c56f98SSadaf Ebrahimi
7372*62c56f98SSadaf Ebrahimi if (mbedtls_ssl_check_cert_usage(chain,
7373*62c56f98SSadaf Ebrahimi ciphersuite_info,
7374*62c56f98SSadaf Ebrahimi !ssl->conf->endpoint,
7375*62c56f98SSadaf Ebrahimi &ssl->session_negotiate->verify_result) != 0) {
7376*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate (usage extensions)"));
7377*62c56f98SSadaf Ebrahimi if (ret == 0) {
7378*62c56f98SSadaf Ebrahimi ret = MBEDTLS_ERR_SSL_BAD_CERTIFICATE;
7379*62c56f98SSadaf Ebrahimi }
7380*62c56f98SSadaf Ebrahimi }
7381*62c56f98SSadaf Ebrahimi
7382*62c56f98SSadaf Ebrahimi /* mbedtls_x509_crt_verify_with_profile is supposed to report a
7383*62c56f98SSadaf Ebrahimi * verification failure through MBEDTLS_ERR_X509_CERT_VERIFY_FAILED,
7384*62c56f98SSadaf Ebrahimi * with details encoded in the verification flags. All other kinds
7385*62c56f98SSadaf Ebrahimi * of error codes, including those from the user provided f_vrfy
7386*62c56f98SSadaf Ebrahimi * functions, are treated as fatal and lead to a failure of
7387*62c56f98SSadaf Ebrahimi * ssl_parse_certificate even if verification was optional. */
7388*62c56f98SSadaf Ebrahimi if (authmode == MBEDTLS_SSL_VERIFY_OPTIONAL &&
7389*62c56f98SSadaf Ebrahimi (ret == MBEDTLS_ERR_X509_CERT_VERIFY_FAILED ||
7390*62c56f98SSadaf Ebrahimi ret == MBEDTLS_ERR_SSL_BAD_CERTIFICATE)) {
7391*62c56f98SSadaf Ebrahimi ret = 0;
7392*62c56f98SSadaf Ebrahimi }
7393*62c56f98SSadaf Ebrahimi
7394*62c56f98SSadaf Ebrahimi if (have_ca_chain == 0 && authmode == MBEDTLS_SSL_VERIFY_REQUIRED) {
7395*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(1, ("got no CA chain"));
7396*62c56f98SSadaf Ebrahimi ret = MBEDTLS_ERR_SSL_CA_CHAIN_REQUIRED;
7397*62c56f98SSadaf Ebrahimi }
7398*62c56f98SSadaf Ebrahimi
7399*62c56f98SSadaf Ebrahimi if (ret != 0) {
7400*62c56f98SSadaf Ebrahimi uint8_t alert;
7401*62c56f98SSadaf Ebrahimi
7402*62c56f98SSadaf Ebrahimi /* The certificate may have been rejected for several reasons.
7403*62c56f98SSadaf Ebrahimi Pick one and send the corresponding alert. Which alert to send
7404*62c56f98SSadaf Ebrahimi may be a subject of debate in some cases. */
7405*62c56f98SSadaf Ebrahimi if (ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_OTHER) {
7406*62c56f98SSadaf Ebrahimi alert = MBEDTLS_SSL_ALERT_MSG_ACCESS_DENIED;
7407*62c56f98SSadaf Ebrahimi } else if (ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_CN_MISMATCH) {
7408*62c56f98SSadaf Ebrahimi alert = MBEDTLS_SSL_ALERT_MSG_BAD_CERT;
7409*62c56f98SSadaf Ebrahimi } else if (ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_KEY_USAGE) {
7410*62c56f98SSadaf Ebrahimi alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT;
7411*62c56f98SSadaf Ebrahimi } else if (ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_EXT_KEY_USAGE) {
7412*62c56f98SSadaf Ebrahimi alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT;
7413*62c56f98SSadaf Ebrahimi } else if (ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_NS_CERT_TYPE) {
7414*62c56f98SSadaf Ebrahimi alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT;
7415*62c56f98SSadaf Ebrahimi } else if (ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_BAD_PK) {
7416*62c56f98SSadaf Ebrahimi alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT;
7417*62c56f98SSadaf Ebrahimi } else if (ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_BAD_KEY) {
7418*62c56f98SSadaf Ebrahimi alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT;
7419*62c56f98SSadaf Ebrahimi } else if (ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_EXPIRED) {
7420*62c56f98SSadaf Ebrahimi alert = MBEDTLS_SSL_ALERT_MSG_CERT_EXPIRED;
7421*62c56f98SSadaf Ebrahimi } else if (ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_REVOKED) {
7422*62c56f98SSadaf Ebrahimi alert = MBEDTLS_SSL_ALERT_MSG_CERT_REVOKED;
7423*62c56f98SSadaf Ebrahimi } else if (ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_NOT_TRUSTED) {
7424*62c56f98SSadaf Ebrahimi alert = MBEDTLS_SSL_ALERT_MSG_UNKNOWN_CA;
7425*62c56f98SSadaf Ebrahimi } else {
7426*62c56f98SSadaf Ebrahimi alert = MBEDTLS_SSL_ALERT_MSG_CERT_UNKNOWN;
7427*62c56f98SSadaf Ebrahimi }
7428*62c56f98SSadaf Ebrahimi mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
7429*62c56f98SSadaf Ebrahimi alert);
7430*62c56f98SSadaf Ebrahimi }
7431*62c56f98SSadaf Ebrahimi
7432*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_DEBUG_C)
7433*62c56f98SSadaf Ebrahimi if (ssl->session_negotiate->verify_result != 0) {
7434*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(3, ("! Certificate verification flags %08x",
7435*62c56f98SSadaf Ebrahimi (unsigned int) ssl->session_negotiate->verify_result));
7436*62c56f98SSadaf Ebrahimi } else {
7437*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(3, ("Certificate verification flags clear"));
7438*62c56f98SSadaf Ebrahimi }
7439*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_DEBUG_C */
7440*62c56f98SSadaf Ebrahimi
7441*62c56f98SSadaf Ebrahimi return ret;
7442*62c56f98SSadaf Ebrahimi }
7443*62c56f98SSadaf Ebrahimi
7444*62c56f98SSadaf Ebrahimi #if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
7445*62c56f98SSadaf Ebrahimi MBEDTLS_CHECK_RETURN_CRITICAL
ssl_remember_peer_crt_digest(mbedtls_ssl_context * ssl,unsigned char * start,size_t len)7446*62c56f98SSadaf Ebrahimi static int ssl_remember_peer_crt_digest(mbedtls_ssl_context *ssl,
7447*62c56f98SSadaf Ebrahimi unsigned char *start, size_t len)
7448*62c56f98SSadaf Ebrahimi {
7449*62c56f98SSadaf Ebrahimi int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
7450*62c56f98SSadaf Ebrahimi /* Remember digest of the peer's end-CRT. */
7451*62c56f98SSadaf Ebrahimi ssl->session_negotiate->peer_cert_digest =
7452*62c56f98SSadaf Ebrahimi mbedtls_calloc(1, MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_LEN);
7453*62c56f98SSadaf Ebrahimi if (ssl->session_negotiate->peer_cert_digest == NULL) {
7454*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(1, ("alloc(%d bytes) failed",
7455*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_LEN));
7456*62c56f98SSadaf Ebrahimi mbedtls_ssl_send_alert_message(ssl,
7457*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_ALERT_LEVEL_FATAL,
7458*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR);
7459*62c56f98SSadaf Ebrahimi
7460*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_ALLOC_FAILED;
7461*62c56f98SSadaf Ebrahimi }
7462*62c56f98SSadaf Ebrahimi
7463*62c56f98SSadaf Ebrahimi ret = mbedtls_md(mbedtls_md_info_from_type(
7464*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_TYPE),
7465*62c56f98SSadaf Ebrahimi start, len,
7466*62c56f98SSadaf Ebrahimi ssl->session_negotiate->peer_cert_digest);
7467*62c56f98SSadaf Ebrahimi
7468*62c56f98SSadaf Ebrahimi ssl->session_negotiate->peer_cert_digest_type =
7469*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_TYPE;
7470*62c56f98SSadaf Ebrahimi ssl->session_negotiate->peer_cert_digest_len =
7471*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_LEN;
7472*62c56f98SSadaf Ebrahimi
7473*62c56f98SSadaf Ebrahimi return ret;
7474*62c56f98SSadaf Ebrahimi }
7475*62c56f98SSadaf Ebrahimi
7476*62c56f98SSadaf Ebrahimi MBEDTLS_CHECK_RETURN_CRITICAL
ssl_remember_peer_pubkey(mbedtls_ssl_context * ssl,unsigned char * start,size_t len)7477*62c56f98SSadaf Ebrahimi static int ssl_remember_peer_pubkey(mbedtls_ssl_context *ssl,
7478*62c56f98SSadaf Ebrahimi unsigned char *start, size_t len)
7479*62c56f98SSadaf Ebrahimi {
7480*62c56f98SSadaf Ebrahimi unsigned char *end = start + len;
7481*62c56f98SSadaf Ebrahimi int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
7482*62c56f98SSadaf Ebrahimi
7483*62c56f98SSadaf Ebrahimi /* Make a copy of the peer's raw public key. */
7484*62c56f98SSadaf Ebrahimi mbedtls_pk_init(&ssl->handshake->peer_pubkey);
7485*62c56f98SSadaf Ebrahimi ret = mbedtls_pk_parse_subpubkey(&start, end,
7486*62c56f98SSadaf Ebrahimi &ssl->handshake->peer_pubkey);
7487*62c56f98SSadaf Ebrahimi if (ret != 0) {
7488*62c56f98SSadaf Ebrahimi /* We should have parsed the public key before. */
7489*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
7490*62c56f98SSadaf Ebrahimi }
7491*62c56f98SSadaf Ebrahimi
7492*62c56f98SSadaf Ebrahimi return 0;
7493*62c56f98SSadaf Ebrahimi }
7494*62c56f98SSadaf Ebrahimi #endif /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
7495*62c56f98SSadaf Ebrahimi
mbedtls_ssl_parse_certificate(mbedtls_ssl_context * ssl)7496*62c56f98SSadaf Ebrahimi int mbedtls_ssl_parse_certificate(mbedtls_ssl_context *ssl)
7497*62c56f98SSadaf Ebrahimi {
7498*62c56f98SSadaf Ebrahimi int ret = 0;
7499*62c56f98SSadaf Ebrahimi int crt_expected;
7500*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_SRV_C) && defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
7501*62c56f98SSadaf Ebrahimi const int authmode = ssl->handshake->sni_authmode != MBEDTLS_SSL_VERIFY_UNSET
7502*62c56f98SSadaf Ebrahimi ? ssl->handshake->sni_authmode
7503*62c56f98SSadaf Ebrahimi : ssl->conf->authmode;
7504*62c56f98SSadaf Ebrahimi #else
7505*62c56f98SSadaf Ebrahimi const int authmode = ssl->conf->authmode;
7506*62c56f98SSadaf Ebrahimi #endif
7507*62c56f98SSadaf Ebrahimi void *rs_ctx = NULL;
7508*62c56f98SSadaf Ebrahimi mbedtls_x509_crt *chain = NULL;
7509*62c56f98SSadaf Ebrahimi
7510*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse certificate"));
7511*62c56f98SSadaf Ebrahimi
7512*62c56f98SSadaf Ebrahimi crt_expected = ssl_parse_certificate_coordinate(ssl, authmode);
7513*62c56f98SSadaf Ebrahimi if (crt_expected == SSL_CERTIFICATE_SKIP) {
7514*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate"));
7515*62c56f98SSadaf Ebrahimi goto exit;
7516*62c56f98SSadaf Ebrahimi }
7517*62c56f98SSadaf Ebrahimi
7518*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
7519*62c56f98SSadaf Ebrahimi if (ssl->handshake->ecrs_enabled &&
7520*62c56f98SSadaf Ebrahimi ssl->handshake->ecrs_state == ssl_ecrs_crt_verify) {
7521*62c56f98SSadaf Ebrahimi chain = ssl->handshake->ecrs_peer_cert;
7522*62c56f98SSadaf Ebrahimi ssl->handshake->ecrs_peer_cert = NULL;
7523*62c56f98SSadaf Ebrahimi goto crt_verify;
7524*62c56f98SSadaf Ebrahimi }
7525*62c56f98SSadaf Ebrahimi #endif
7526*62c56f98SSadaf Ebrahimi
7527*62c56f98SSadaf Ebrahimi if ((ret = mbedtls_ssl_read_record(ssl, 1)) != 0) {
7528*62c56f98SSadaf Ebrahimi /* mbedtls_ssl_read_record may have sent an alert already. We
7529*62c56f98SSadaf Ebrahimi let it decide whether to alert. */
7530*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_read_record", ret);
7531*62c56f98SSadaf Ebrahimi goto exit;
7532*62c56f98SSadaf Ebrahimi }
7533*62c56f98SSadaf Ebrahimi
7534*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_SRV_C)
7535*62c56f98SSadaf Ebrahimi if (ssl_srv_check_client_no_crt_notification(ssl) == 0) {
7536*62c56f98SSadaf Ebrahimi ssl->session_negotiate->verify_result = MBEDTLS_X509_BADCERT_MISSING;
7537*62c56f98SSadaf Ebrahimi
7538*62c56f98SSadaf Ebrahimi if (authmode != MBEDTLS_SSL_VERIFY_OPTIONAL) {
7539*62c56f98SSadaf Ebrahimi ret = MBEDTLS_ERR_SSL_NO_CLIENT_CERTIFICATE;
7540*62c56f98SSadaf Ebrahimi }
7541*62c56f98SSadaf Ebrahimi
7542*62c56f98SSadaf Ebrahimi goto exit;
7543*62c56f98SSadaf Ebrahimi }
7544*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_SRV_C */
7545*62c56f98SSadaf Ebrahimi
7546*62c56f98SSadaf Ebrahimi /* Clear existing peer CRT structure in case we tried to
7547*62c56f98SSadaf Ebrahimi * reuse a session but it failed, and allocate a new one. */
7548*62c56f98SSadaf Ebrahimi ssl_clear_peer_cert(ssl->session_negotiate);
7549*62c56f98SSadaf Ebrahimi
7550*62c56f98SSadaf Ebrahimi chain = mbedtls_calloc(1, sizeof(mbedtls_x509_crt));
7551*62c56f98SSadaf Ebrahimi if (chain == NULL) {
7552*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(1, ("alloc(%" MBEDTLS_PRINTF_SIZET " bytes) failed",
7553*62c56f98SSadaf Ebrahimi sizeof(mbedtls_x509_crt)));
7554*62c56f98SSadaf Ebrahimi mbedtls_ssl_send_alert_message(ssl,
7555*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_ALERT_LEVEL_FATAL,
7556*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR);
7557*62c56f98SSadaf Ebrahimi
7558*62c56f98SSadaf Ebrahimi ret = MBEDTLS_ERR_SSL_ALLOC_FAILED;
7559*62c56f98SSadaf Ebrahimi goto exit;
7560*62c56f98SSadaf Ebrahimi }
7561*62c56f98SSadaf Ebrahimi mbedtls_x509_crt_init(chain);
7562*62c56f98SSadaf Ebrahimi
7563*62c56f98SSadaf Ebrahimi ret = ssl_parse_certificate_chain(ssl, chain);
7564*62c56f98SSadaf Ebrahimi if (ret != 0) {
7565*62c56f98SSadaf Ebrahimi goto exit;
7566*62c56f98SSadaf Ebrahimi }
7567*62c56f98SSadaf Ebrahimi
7568*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
7569*62c56f98SSadaf Ebrahimi if (ssl->handshake->ecrs_enabled) {
7570*62c56f98SSadaf Ebrahimi ssl->handshake->ecrs_state = ssl_ecrs_crt_verify;
7571*62c56f98SSadaf Ebrahimi }
7572*62c56f98SSadaf Ebrahimi
7573*62c56f98SSadaf Ebrahimi crt_verify:
7574*62c56f98SSadaf Ebrahimi if (ssl->handshake->ecrs_enabled) {
7575*62c56f98SSadaf Ebrahimi rs_ctx = &ssl->handshake->ecrs_ctx;
7576*62c56f98SSadaf Ebrahimi }
7577*62c56f98SSadaf Ebrahimi #endif
7578*62c56f98SSadaf Ebrahimi
7579*62c56f98SSadaf Ebrahimi ret = ssl_parse_certificate_verify(ssl, authmode,
7580*62c56f98SSadaf Ebrahimi chain, rs_ctx);
7581*62c56f98SSadaf Ebrahimi if (ret != 0) {
7582*62c56f98SSadaf Ebrahimi goto exit;
7583*62c56f98SSadaf Ebrahimi }
7584*62c56f98SSadaf Ebrahimi
7585*62c56f98SSadaf Ebrahimi #if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
7586*62c56f98SSadaf Ebrahimi {
7587*62c56f98SSadaf Ebrahimi unsigned char *crt_start, *pk_start;
7588*62c56f98SSadaf Ebrahimi size_t crt_len, pk_len;
7589*62c56f98SSadaf Ebrahimi
7590*62c56f98SSadaf Ebrahimi /* We parse the CRT chain without copying, so
7591*62c56f98SSadaf Ebrahimi * these pointers point into the input buffer,
7592*62c56f98SSadaf Ebrahimi * and are hence still valid after freeing the
7593*62c56f98SSadaf Ebrahimi * CRT chain. */
7594*62c56f98SSadaf Ebrahimi
7595*62c56f98SSadaf Ebrahimi crt_start = chain->raw.p;
7596*62c56f98SSadaf Ebrahimi crt_len = chain->raw.len;
7597*62c56f98SSadaf Ebrahimi
7598*62c56f98SSadaf Ebrahimi pk_start = chain->pk_raw.p;
7599*62c56f98SSadaf Ebrahimi pk_len = chain->pk_raw.len;
7600*62c56f98SSadaf Ebrahimi
7601*62c56f98SSadaf Ebrahimi /* Free the CRT structures before computing
7602*62c56f98SSadaf Ebrahimi * digest and copying the peer's public key. */
7603*62c56f98SSadaf Ebrahimi mbedtls_x509_crt_free(chain);
7604*62c56f98SSadaf Ebrahimi mbedtls_free(chain);
7605*62c56f98SSadaf Ebrahimi chain = NULL;
7606*62c56f98SSadaf Ebrahimi
7607*62c56f98SSadaf Ebrahimi ret = ssl_remember_peer_crt_digest(ssl, crt_start, crt_len);
7608*62c56f98SSadaf Ebrahimi if (ret != 0) {
7609*62c56f98SSadaf Ebrahimi goto exit;
7610*62c56f98SSadaf Ebrahimi }
7611*62c56f98SSadaf Ebrahimi
7612*62c56f98SSadaf Ebrahimi ret = ssl_remember_peer_pubkey(ssl, pk_start, pk_len);
7613*62c56f98SSadaf Ebrahimi if (ret != 0) {
7614*62c56f98SSadaf Ebrahimi goto exit;
7615*62c56f98SSadaf Ebrahimi }
7616*62c56f98SSadaf Ebrahimi }
7617*62c56f98SSadaf Ebrahimi #else /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
7618*62c56f98SSadaf Ebrahimi /* Pass ownership to session structure. */
7619*62c56f98SSadaf Ebrahimi ssl->session_negotiate->peer_cert = chain;
7620*62c56f98SSadaf Ebrahimi chain = NULL;
7621*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
7622*62c56f98SSadaf Ebrahimi
7623*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse certificate"));
7624*62c56f98SSadaf Ebrahimi
7625*62c56f98SSadaf Ebrahimi exit:
7626*62c56f98SSadaf Ebrahimi
7627*62c56f98SSadaf Ebrahimi if (ret == 0) {
7628*62c56f98SSadaf Ebrahimi ssl->state++;
7629*62c56f98SSadaf Ebrahimi }
7630*62c56f98SSadaf Ebrahimi
7631*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
7632*62c56f98SSadaf Ebrahimi if (ret == MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS) {
7633*62c56f98SSadaf Ebrahimi ssl->handshake->ecrs_peer_cert = chain;
7634*62c56f98SSadaf Ebrahimi chain = NULL;
7635*62c56f98SSadaf Ebrahimi }
7636*62c56f98SSadaf Ebrahimi #endif
7637*62c56f98SSadaf Ebrahimi
7638*62c56f98SSadaf Ebrahimi if (chain != NULL) {
7639*62c56f98SSadaf Ebrahimi mbedtls_x509_crt_free(chain);
7640*62c56f98SSadaf Ebrahimi mbedtls_free(chain);
7641*62c56f98SSadaf Ebrahimi }
7642*62c56f98SSadaf Ebrahimi
7643*62c56f98SSadaf Ebrahimi return ret;
7644*62c56f98SSadaf Ebrahimi }
7645*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
7646*62c56f98SSadaf Ebrahimi
ssl_calc_finished_tls_generic(mbedtls_ssl_context * ssl,void * ctx,unsigned char * padbuf,size_t hlen,unsigned char * buf,int from)7647*62c56f98SSadaf Ebrahimi static int ssl_calc_finished_tls_generic(mbedtls_ssl_context *ssl, void *ctx,
7648*62c56f98SSadaf Ebrahimi unsigned char *padbuf, size_t hlen,
7649*62c56f98SSadaf Ebrahimi unsigned char *buf, int from)
7650*62c56f98SSadaf Ebrahimi {
7651*62c56f98SSadaf Ebrahimi int len = 12;
7652*62c56f98SSadaf Ebrahimi const char *sender;
7653*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO)
7654*62c56f98SSadaf Ebrahimi psa_status_t status;
7655*62c56f98SSadaf Ebrahimi psa_hash_operation_t *hs_op = ctx;
7656*62c56f98SSadaf Ebrahimi psa_hash_operation_t cloned_op = PSA_HASH_OPERATION_INIT;
7657*62c56f98SSadaf Ebrahimi size_t hash_size;
7658*62c56f98SSadaf Ebrahimi #else
7659*62c56f98SSadaf Ebrahimi int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
7660*62c56f98SSadaf Ebrahimi mbedtls_md_context_t *hs_ctx = ctx;
7661*62c56f98SSadaf Ebrahimi mbedtls_md_context_t cloned_ctx;
7662*62c56f98SSadaf Ebrahimi mbedtls_md_init(&cloned_ctx);
7663*62c56f98SSadaf Ebrahimi #endif
7664*62c56f98SSadaf Ebrahimi
7665*62c56f98SSadaf Ebrahimi mbedtls_ssl_session *session = ssl->session_negotiate;
7666*62c56f98SSadaf Ebrahimi if (!session) {
7667*62c56f98SSadaf Ebrahimi session = ssl->session;
7668*62c56f98SSadaf Ebrahimi }
7669*62c56f98SSadaf Ebrahimi
7670*62c56f98SSadaf Ebrahimi sender = (from == MBEDTLS_SSL_IS_CLIENT)
7671*62c56f98SSadaf Ebrahimi ? "client finished"
7672*62c56f98SSadaf Ebrahimi : "server finished";
7673*62c56f98SSadaf Ebrahimi
7674*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO)
7675*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(2, ("=> calc PSA finished tls"));
7676*62c56f98SSadaf Ebrahimi
7677*62c56f98SSadaf Ebrahimi status = psa_hash_clone(hs_op, &cloned_op);
7678*62c56f98SSadaf Ebrahimi if (status != PSA_SUCCESS) {
7679*62c56f98SSadaf Ebrahimi goto exit;
7680*62c56f98SSadaf Ebrahimi }
7681*62c56f98SSadaf Ebrahimi
7682*62c56f98SSadaf Ebrahimi status = psa_hash_finish(&cloned_op, padbuf, hlen, &hash_size);
7683*62c56f98SSadaf Ebrahimi if (status != PSA_SUCCESS) {
7684*62c56f98SSadaf Ebrahimi goto exit;
7685*62c56f98SSadaf Ebrahimi }
7686*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_BUF(3, "PSA calculated padbuf", padbuf, hlen);
7687*62c56f98SSadaf Ebrahimi #else
7688*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(2, ("=> calc finished tls"));
7689*62c56f98SSadaf Ebrahimi
7690*62c56f98SSadaf Ebrahimi ret = mbedtls_md_setup(&cloned_ctx, mbedtls_md_info_from_ctx(hs_ctx), 0);
7691*62c56f98SSadaf Ebrahimi if (ret != 0) {
7692*62c56f98SSadaf Ebrahimi goto exit;
7693*62c56f98SSadaf Ebrahimi }
7694*62c56f98SSadaf Ebrahimi ret = mbedtls_md_clone(&cloned_ctx, hs_ctx);
7695*62c56f98SSadaf Ebrahimi if (ret != 0) {
7696*62c56f98SSadaf Ebrahimi goto exit;
7697*62c56f98SSadaf Ebrahimi }
7698*62c56f98SSadaf Ebrahimi
7699*62c56f98SSadaf Ebrahimi ret = mbedtls_md_finish(&cloned_ctx, padbuf);
7700*62c56f98SSadaf Ebrahimi if (ret != 0) {
7701*62c56f98SSadaf Ebrahimi goto exit;
7702*62c56f98SSadaf Ebrahimi }
7703*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_USE_PSA_CRYPTO */
7704*62c56f98SSadaf Ebrahimi
7705*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_BUF(4, "finished output", padbuf, hlen);
7706*62c56f98SSadaf Ebrahimi
7707*62c56f98SSadaf Ebrahimi /*
7708*62c56f98SSadaf Ebrahimi * TLSv1.2:
7709*62c56f98SSadaf Ebrahimi * hash = PRF( master, finished_label,
7710*62c56f98SSadaf Ebrahimi * Hash( handshake ) )[0.11]
7711*62c56f98SSadaf Ebrahimi */
7712*62c56f98SSadaf Ebrahimi ssl->handshake->tls_prf(session->master, 48, sender,
7713*62c56f98SSadaf Ebrahimi padbuf, hlen, buf, len);
7714*62c56f98SSadaf Ebrahimi
7715*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_BUF(3, "calc finished result", buf, len);
7716*62c56f98SSadaf Ebrahimi
7717*62c56f98SSadaf Ebrahimi mbedtls_platform_zeroize(padbuf, hlen);
7718*62c56f98SSadaf Ebrahimi
7719*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(2, ("<= calc finished"));
7720*62c56f98SSadaf Ebrahimi
7721*62c56f98SSadaf Ebrahimi exit:
7722*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO)
7723*62c56f98SSadaf Ebrahimi psa_hash_abort(&cloned_op);
7724*62c56f98SSadaf Ebrahimi return mbedtls_md_error_from_psa(status);
7725*62c56f98SSadaf Ebrahimi #else
7726*62c56f98SSadaf Ebrahimi mbedtls_md_free(&cloned_ctx);
7727*62c56f98SSadaf Ebrahimi return ret;
7728*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_USE_PSA_CRYPTO */
7729*62c56f98SSadaf Ebrahimi }
7730*62c56f98SSadaf Ebrahimi
7731*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA256)
ssl_calc_finished_tls_sha256(mbedtls_ssl_context * ssl,unsigned char * buf,int from)7732*62c56f98SSadaf Ebrahimi static int ssl_calc_finished_tls_sha256(
7733*62c56f98SSadaf Ebrahimi mbedtls_ssl_context *ssl, unsigned char *buf, int from)
7734*62c56f98SSadaf Ebrahimi {
7735*62c56f98SSadaf Ebrahimi unsigned char padbuf[32];
7736*62c56f98SSadaf Ebrahimi return ssl_calc_finished_tls_generic(ssl,
7737*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO)
7738*62c56f98SSadaf Ebrahimi &ssl->handshake->fin_sha256_psa,
7739*62c56f98SSadaf Ebrahimi #else
7740*62c56f98SSadaf Ebrahimi &ssl->handshake->fin_sha256,
7741*62c56f98SSadaf Ebrahimi #endif
7742*62c56f98SSadaf Ebrahimi padbuf, sizeof(padbuf),
7743*62c56f98SSadaf Ebrahimi buf, from);
7744*62c56f98SSadaf Ebrahimi }
7745*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_MD_CAN_SHA256*/
7746*62c56f98SSadaf Ebrahimi
7747*62c56f98SSadaf Ebrahimi
7748*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA384)
ssl_calc_finished_tls_sha384(mbedtls_ssl_context * ssl,unsigned char * buf,int from)7749*62c56f98SSadaf Ebrahimi static int ssl_calc_finished_tls_sha384(
7750*62c56f98SSadaf Ebrahimi mbedtls_ssl_context *ssl, unsigned char *buf, int from)
7751*62c56f98SSadaf Ebrahimi {
7752*62c56f98SSadaf Ebrahimi unsigned char padbuf[48];
7753*62c56f98SSadaf Ebrahimi return ssl_calc_finished_tls_generic(ssl,
7754*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO)
7755*62c56f98SSadaf Ebrahimi &ssl->handshake->fin_sha384_psa,
7756*62c56f98SSadaf Ebrahimi #else
7757*62c56f98SSadaf Ebrahimi &ssl->handshake->fin_sha384,
7758*62c56f98SSadaf Ebrahimi #endif
7759*62c56f98SSadaf Ebrahimi padbuf, sizeof(padbuf),
7760*62c56f98SSadaf Ebrahimi buf, from);
7761*62c56f98SSadaf Ebrahimi }
7762*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_MD_CAN_SHA384*/
7763*62c56f98SSadaf Ebrahimi
mbedtls_ssl_handshake_wrapup_free_hs_transform(mbedtls_ssl_context * ssl)7764*62c56f98SSadaf Ebrahimi void mbedtls_ssl_handshake_wrapup_free_hs_transform(mbedtls_ssl_context *ssl)
7765*62c56f98SSadaf Ebrahimi {
7766*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(3, ("=> handshake wrapup: final free"));
7767*62c56f98SSadaf Ebrahimi
7768*62c56f98SSadaf Ebrahimi /*
7769*62c56f98SSadaf Ebrahimi * Free our handshake params
7770*62c56f98SSadaf Ebrahimi */
7771*62c56f98SSadaf Ebrahimi mbedtls_ssl_handshake_free(ssl);
7772*62c56f98SSadaf Ebrahimi mbedtls_free(ssl->handshake);
7773*62c56f98SSadaf Ebrahimi ssl->handshake = NULL;
7774*62c56f98SSadaf Ebrahimi
7775*62c56f98SSadaf Ebrahimi /*
7776*62c56f98SSadaf Ebrahimi * Free the previous transform and switch in the current one
7777*62c56f98SSadaf Ebrahimi */
7778*62c56f98SSadaf Ebrahimi if (ssl->transform) {
7779*62c56f98SSadaf Ebrahimi mbedtls_ssl_transform_free(ssl->transform);
7780*62c56f98SSadaf Ebrahimi mbedtls_free(ssl->transform);
7781*62c56f98SSadaf Ebrahimi }
7782*62c56f98SSadaf Ebrahimi ssl->transform = ssl->transform_negotiate;
7783*62c56f98SSadaf Ebrahimi ssl->transform_negotiate = NULL;
7784*62c56f98SSadaf Ebrahimi
7785*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(3, ("<= handshake wrapup: final free"));
7786*62c56f98SSadaf Ebrahimi }
7787*62c56f98SSadaf Ebrahimi
mbedtls_ssl_handshake_wrapup(mbedtls_ssl_context * ssl)7788*62c56f98SSadaf Ebrahimi void mbedtls_ssl_handshake_wrapup(mbedtls_ssl_context *ssl)
7789*62c56f98SSadaf Ebrahimi {
7790*62c56f98SSadaf Ebrahimi int resume = ssl->handshake->resume;
7791*62c56f98SSadaf Ebrahimi
7792*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(3, ("=> handshake wrapup"));
7793*62c56f98SSadaf Ebrahimi
7794*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_RENEGOTIATION)
7795*62c56f98SSadaf Ebrahimi if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS) {
7796*62c56f98SSadaf Ebrahimi ssl->renego_status = MBEDTLS_SSL_RENEGOTIATION_DONE;
7797*62c56f98SSadaf Ebrahimi ssl->renego_records_seen = 0;
7798*62c56f98SSadaf Ebrahimi }
7799*62c56f98SSadaf Ebrahimi #endif
7800*62c56f98SSadaf Ebrahimi
7801*62c56f98SSadaf Ebrahimi /*
7802*62c56f98SSadaf Ebrahimi * Free the previous session and switch in the current one
7803*62c56f98SSadaf Ebrahimi */
7804*62c56f98SSadaf Ebrahimi if (ssl->session) {
7805*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
7806*62c56f98SSadaf Ebrahimi /* RFC 7366 3.1: keep the EtM state */
7807*62c56f98SSadaf Ebrahimi ssl->session_negotiate->encrypt_then_mac =
7808*62c56f98SSadaf Ebrahimi ssl->session->encrypt_then_mac;
7809*62c56f98SSadaf Ebrahimi #endif
7810*62c56f98SSadaf Ebrahimi
7811*62c56f98SSadaf Ebrahimi mbedtls_ssl_session_free(ssl->session);
7812*62c56f98SSadaf Ebrahimi mbedtls_free(ssl->session);
7813*62c56f98SSadaf Ebrahimi }
7814*62c56f98SSadaf Ebrahimi ssl->session = ssl->session_negotiate;
7815*62c56f98SSadaf Ebrahimi ssl->session_negotiate = NULL;
7816*62c56f98SSadaf Ebrahimi
7817*62c56f98SSadaf Ebrahimi /*
7818*62c56f98SSadaf Ebrahimi * Add cache entry
7819*62c56f98SSadaf Ebrahimi */
7820*62c56f98SSadaf Ebrahimi if (ssl->conf->f_set_cache != NULL &&
7821*62c56f98SSadaf Ebrahimi ssl->session->id_len != 0 &&
7822*62c56f98SSadaf Ebrahimi resume == 0) {
7823*62c56f98SSadaf Ebrahimi if (ssl->conf->f_set_cache(ssl->conf->p_cache,
7824*62c56f98SSadaf Ebrahimi ssl->session->id,
7825*62c56f98SSadaf Ebrahimi ssl->session->id_len,
7826*62c56f98SSadaf Ebrahimi ssl->session) != 0) {
7827*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(1, ("cache did not store session"));
7828*62c56f98SSadaf Ebrahimi }
7829*62c56f98SSadaf Ebrahimi }
7830*62c56f98SSadaf Ebrahimi
7831*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_DTLS)
7832*62c56f98SSadaf Ebrahimi if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
7833*62c56f98SSadaf Ebrahimi ssl->handshake->flight != NULL) {
7834*62c56f98SSadaf Ebrahimi /* Cancel handshake timer */
7835*62c56f98SSadaf Ebrahimi mbedtls_ssl_set_timer(ssl, 0);
7836*62c56f98SSadaf Ebrahimi
7837*62c56f98SSadaf Ebrahimi /* Keep last flight around in case we need to resend it:
7838*62c56f98SSadaf Ebrahimi * we need the handshake and transform structures for that */
7839*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(3, ("skip freeing handshake and transform"));
7840*62c56f98SSadaf Ebrahimi } else
7841*62c56f98SSadaf Ebrahimi #endif
7842*62c56f98SSadaf Ebrahimi mbedtls_ssl_handshake_wrapup_free_hs_transform(ssl);
7843*62c56f98SSadaf Ebrahimi
7844*62c56f98SSadaf Ebrahimi ssl->state = MBEDTLS_SSL_HANDSHAKE_OVER;
7845*62c56f98SSadaf Ebrahimi
7846*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(3, ("<= handshake wrapup"));
7847*62c56f98SSadaf Ebrahimi }
7848*62c56f98SSadaf Ebrahimi
mbedtls_ssl_write_finished(mbedtls_ssl_context * ssl)7849*62c56f98SSadaf Ebrahimi int mbedtls_ssl_write_finished(mbedtls_ssl_context *ssl)
7850*62c56f98SSadaf Ebrahimi {
7851*62c56f98SSadaf Ebrahimi int ret, hash_len;
7852*62c56f98SSadaf Ebrahimi
7853*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(2, ("=> write finished"));
7854*62c56f98SSadaf Ebrahimi
7855*62c56f98SSadaf Ebrahimi mbedtls_ssl_update_out_pointers(ssl, ssl->transform_negotiate);
7856*62c56f98SSadaf Ebrahimi
7857*62c56f98SSadaf Ebrahimi ret = ssl->handshake->calc_finished(ssl, ssl->out_msg + 4, ssl->conf->endpoint);
7858*62c56f98SSadaf Ebrahimi if (ret != 0) {
7859*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_RET(1, "calc_finished", ret);
7860*62c56f98SSadaf Ebrahimi }
7861*62c56f98SSadaf Ebrahimi
7862*62c56f98SSadaf Ebrahimi /*
7863*62c56f98SSadaf Ebrahimi * RFC 5246 7.4.9 (Page 63) says 12 is the default length and ciphersuites
7864*62c56f98SSadaf Ebrahimi * may define some other value. Currently (early 2016), no defined
7865*62c56f98SSadaf Ebrahimi * ciphersuite does this (and this is unlikely to change as activity has
7866*62c56f98SSadaf Ebrahimi * moved to TLS 1.3 now) so we can keep the hardcoded 12 here.
7867*62c56f98SSadaf Ebrahimi */
7868*62c56f98SSadaf Ebrahimi hash_len = 12;
7869*62c56f98SSadaf Ebrahimi
7870*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_RENEGOTIATION)
7871*62c56f98SSadaf Ebrahimi ssl->verify_data_len = hash_len;
7872*62c56f98SSadaf Ebrahimi memcpy(ssl->own_verify_data, ssl->out_msg + 4, hash_len);
7873*62c56f98SSadaf Ebrahimi #endif
7874*62c56f98SSadaf Ebrahimi
7875*62c56f98SSadaf Ebrahimi ssl->out_msglen = 4 + hash_len;
7876*62c56f98SSadaf Ebrahimi ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
7877*62c56f98SSadaf Ebrahimi ssl->out_msg[0] = MBEDTLS_SSL_HS_FINISHED;
7878*62c56f98SSadaf Ebrahimi
7879*62c56f98SSadaf Ebrahimi /*
7880*62c56f98SSadaf Ebrahimi * In case of session resuming, invert the client and server
7881*62c56f98SSadaf Ebrahimi * ChangeCipherSpec messages order.
7882*62c56f98SSadaf Ebrahimi */
7883*62c56f98SSadaf Ebrahimi if (ssl->handshake->resume != 0) {
7884*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_CLI_C)
7885*62c56f98SSadaf Ebrahimi if (ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT) {
7886*62c56f98SSadaf Ebrahimi ssl->state = MBEDTLS_SSL_HANDSHAKE_WRAPUP;
7887*62c56f98SSadaf Ebrahimi }
7888*62c56f98SSadaf Ebrahimi #endif
7889*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_SRV_C)
7890*62c56f98SSadaf Ebrahimi if (ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER) {
7891*62c56f98SSadaf Ebrahimi ssl->state = MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC;
7892*62c56f98SSadaf Ebrahimi }
7893*62c56f98SSadaf Ebrahimi #endif
7894*62c56f98SSadaf Ebrahimi } else {
7895*62c56f98SSadaf Ebrahimi ssl->state++;
7896*62c56f98SSadaf Ebrahimi }
7897*62c56f98SSadaf Ebrahimi
7898*62c56f98SSadaf Ebrahimi /*
7899*62c56f98SSadaf Ebrahimi * Switch to our negotiated transform and session parameters for outbound
7900*62c56f98SSadaf Ebrahimi * data.
7901*62c56f98SSadaf Ebrahimi */
7902*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(3, ("switching to new transform spec for outbound data"));
7903*62c56f98SSadaf Ebrahimi
7904*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_DTLS)
7905*62c56f98SSadaf Ebrahimi if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
7906*62c56f98SSadaf Ebrahimi unsigned char i;
7907*62c56f98SSadaf Ebrahimi
7908*62c56f98SSadaf Ebrahimi /* Remember current epoch settings for resending */
7909*62c56f98SSadaf Ebrahimi ssl->handshake->alt_transform_out = ssl->transform_out;
7910*62c56f98SSadaf Ebrahimi memcpy(ssl->handshake->alt_out_ctr, ssl->cur_out_ctr,
7911*62c56f98SSadaf Ebrahimi sizeof(ssl->handshake->alt_out_ctr));
7912*62c56f98SSadaf Ebrahimi
7913*62c56f98SSadaf Ebrahimi /* Set sequence_number to zero */
7914*62c56f98SSadaf Ebrahimi memset(&ssl->cur_out_ctr[2], 0, sizeof(ssl->cur_out_ctr) - 2);
7915*62c56f98SSadaf Ebrahimi
7916*62c56f98SSadaf Ebrahimi
7917*62c56f98SSadaf Ebrahimi /* Increment epoch */
7918*62c56f98SSadaf Ebrahimi for (i = 2; i > 0; i--) {
7919*62c56f98SSadaf Ebrahimi if (++ssl->cur_out_ctr[i - 1] != 0) {
7920*62c56f98SSadaf Ebrahimi break;
7921*62c56f98SSadaf Ebrahimi }
7922*62c56f98SSadaf Ebrahimi }
7923*62c56f98SSadaf Ebrahimi
7924*62c56f98SSadaf Ebrahimi /* The loop goes to its end iff the counter is wrapping */
7925*62c56f98SSadaf Ebrahimi if (i == 0) {
7926*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(1, ("DTLS epoch would wrap"));
7927*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_COUNTER_WRAPPING;
7928*62c56f98SSadaf Ebrahimi }
7929*62c56f98SSadaf Ebrahimi } else
7930*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_PROTO_DTLS */
7931*62c56f98SSadaf Ebrahimi memset(ssl->cur_out_ctr, 0, sizeof(ssl->cur_out_ctr));
7932*62c56f98SSadaf Ebrahimi
7933*62c56f98SSadaf Ebrahimi ssl->transform_out = ssl->transform_negotiate;
7934*62c56f98SSadaf Ebrahimi ssl->session_out = ssl->session_negotiate;
7935*62c56f98SSadaf Ebrahimi
7936*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_DTLS)
7937*62c56f98SSadaf Ebrahimi if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
7938*62c56f98SSadaf Ebrahimi mbedtls_ssl_send_flight_completed(ssl);
7939*62c56f98SSadaf Ebrahimi }
7940*62c56f98SSadaf Ebrahimi #endif
7941*62c56f98SSadaf Ebrahimi
7942*62c56f98SSadaf Ebrahimi if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
7943*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
7944*62c56f98SSadaf Ebrahimi return ret;
7945*62c56f98SSadaf Ebrahimi }
7946*62c56f98SSadaf Ebrahimi
7947*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_DTLS)
7948*62c56f98SSadaf Ebrahimi if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
7949*62c56f98SSadaf Ebrahimi (ret = mbedtls_ssl_flight_transmit(ssl)) != 0) {
7950*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_flight_transmit", ret);
7951*62c56f98SSadaf Ebrahimi return ret;
7952*62c56f98SSadaf Ebrahimi }
7953*62c56f98SSadaf Ebrahimi #endif
7954*62c56f98SSadaf Ebrahimi
7955*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(2, ("<= write finished"));
7956*62c56f98SSadaf Ebrahimi
7957*62c56f98SSadaf Ebrahimi return 0;
7958*62c56f98SSadaf Ebrahimi }
7959*62c56f98SSadaf Ebrahimi
7960*62c56f98SSadaf Ebrahimi #define SSL_MAX_HASH_LEN 12
7961*62c56f98SSadaf Ebrahimi
mbedtls_ssl_parse_finished(mbedtls_ssl_context * ssl)7962*62c56f98SSadaf Ebrahimi int mbedtls_ssl_parse_finished(mbedtls_ssl_context *ssl)
7963*62c56f98SSadaf Ebrahimi {
7964*62c56f98SSadaf Ebrahimi int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
7965*62c56f98SSadaf Ebrahimi unsigned int hash_len = 12;
7966*62c56f98SSadaf Ebrahimi unsigned char buf[SSL_MAX_HASH_LEN];
7967*62c56f98SSadaf Ebrahimi
7968*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse finished"));
7969*62c56f98SSadaf Ebrahimi
7970*62c56f98SSadaf Ebrahimi ret = ssl->handshake->calc_finished(ssl, buf, ssl->conf->endpoint ^ 1);
7971*62c56f98SSadaf Ebrahimi if (ret != 0) {
7972*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_RET(1, "calc_finished", ret);
7973*62c56f98SSadaf Ebrahimi }
7974*62c56f98SSadaf Ebrahimi
7975*62c56f98SSadaf Ebrahimi if ((ret = mbedtls_ssl_read_record(ssl, 1)) != 0) {
7976*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_read_record", ret);
7977*62c56f98SSadaf Ebrahimi goto exit;
7978*62c56f98SSadaf Ebrahimi }
7979*62c56f98SSadaf Ebrahimi
7980*62c56f98SSadaf Ebrahimi if (ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE) {
7981*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(1, ("bad finished message"));
7982*62c56f98SSadaf Ebrahimi mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
7983*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE);
7984*62c56f98SSadaf Ebrahimi ret = MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
7985*62c56f98SSadaf Ebrahimi goto exit;
7986*62c56f98SSadaf Ebrahimi }
7987*62c56f98SSadaf Ebrahimi
7988*62c56f98SSadaf Ebrahimi if (ssl->in_msg[0] != MBEDTLS_SSL_HS_FINISHED) {
7989*62c56f98SSadaf Ebrahimi mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
7990*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE);
7991*62c56f98SSadaf Ebrahimi ret = MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
7992*62c56f98SSadaf Ebrahimi goto exit;
7993*62c56f98SSadaf Ebrahimi }
7994*62c56f98SSadaf Ebrahimi
7995*62c56f98SSadaf Ebrahimi if (ssl->in_hslen != mbedtls_ssl_hs_hdr_len(ssl) + hash_len) {
7996*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(1, ("bad finished message"));
7997*62c56f98SSadaf Ebrahimi mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
7998*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
7999*62c56f98SSadaf Ebrahimi ret = MBEDTLS_ERR_SSL_DECODE_ERROR;
8000*62c56f98SSadaf Ebrahimi goto exit;
8001*62c56f98SSadaf Ebrahimi }
8002*62c56f98SSadaf Ebrahimi
8003*62c56f98SSadaf Ebrahimi if (mbedtls_ct_memcmp(ssl->in_msg + mbedtls_ssl_hs_hdr_len(ssl),
8004*62c56f98SSadaf Ebrahimi buf, hash_len) != 0) {
8005*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(1, ("bad finished message"));
8006*62c56f98SSadaf Ebrahimi mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
8007*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_ALERT_MSG_DECRYPT_ERROR);
8008*62c56f98SSadaf Ebrahimi ret = MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
8009*62c56f98SSadaf Ebrahimi goto exit;
8010*62c56f98SSadaf Ebrahimi }
8011*62c56f98SSadaf Ebrahimi
8012*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_RENEGOTIATION)
8013*62c56f98SSadaf Ebrahimi ssl->verify_data_len = hash_len;
8014*62c56f98SSadaf Ebrahimi memcpy(ssl->peer_verify_data, buf, hash_len);
8015*62c56f98SSadaf Ebrahimi #endif
8016*62c56f98SSadaf Ebrahimi
8017*62c56f98SSadaf Ebrahimi if (ssl->handshake->resume != 0) {
8018*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_CLI_C)
8019*62c56f98SSadaf Ebrahimi if (ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT) {
8020*62c56f98SSadaf Ebrahimi ssl->state = MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC;
8021*62c56f98SSadaf Ebrahimi }
8022*62c56f98SSadaf Ebrahimi #endif
8023*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_SRV_C)
8024*62c56f98SSadaf Ebrahimi if (ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER) {
8025*62c56f98SSadaf Ebrahimi ssl->state = MBEDTLS_SSL_HANDSHAKE_WRAPUP;
8026*62c56f98SSadaf Ebrahimi }
8027*62c56f98SSadaf Ebrahimi #endif
8028*62c56f98SSadaf Ebrahimi } else {
8029*62c56f98SSadaf Ebrahimi ssl->state++;
8030*62c56f98SSadaf Ebrahimi }
8031*62c56f98SSadaf Ebrahimi
8032*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_DTLS)
8033*62c56f98SSadaf Ebrahimi if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
8034*62c56f98SSadaf Ebrahimi mbedtls_ssl_recv_flight_completed(ssl);
8035*62c56f98SSadaf Ebrahimi }
8036*62c56f98SSadaf Ebrahimi #endif
8037*62c56f98SSadaf Ebrahimi
8038*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse finished"));
8039*62c56f98SSadaf Ebrahimi
8040*62c56f98SSadaf Ebrahimi exit:
8041*62c56f98SSadaf Ebrahimi mbedtls_platform_zeroize(buf, hash_len);
8042*62c56f98SSadaf Ebrahimi return ret;
8043*62c56f98SSadaf Ebrahimi }
8044*62c56f98SSadaf Ebrahimi
8045*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_CONTEXT_SERIALIZATION)
8046*62c56f98SSadaf Ebrahimi /*
8047*62c56f98SSadaf Ebrahimi * Helper to get TLS 1.2 PRF from ciphersuite
8048*62c56f98SSadaf Ebrahimi * (Duplicates bits of logic from ssl_set_handshake_prfs().)
8049*62c56f98SSadaf Ebrahimi */
ssl_tls12prf_from_cs(int ciphersuite_id)8050*62c56f98SSadaf Ebrahimi static tls_prf_fn ssl_tls12prf_from_cs(int ciphersuite_id)
8051*62c56f98SSadaf Ebrahimi {
8052*62c56f98SSadaf Ebrahimi const mbedtls_ssl_ciphersuite_t * const ciphersuite_info =
8053*62c56f98SSadaf Ebrahimi mbedtls_ssl_ciphersuite_from_id(ciphersuite_id);
8054*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA384)
8055*62c56f98SSadaf Ebrahimi if (ciphersuite_info != NULL && ciphersuite_info->mac == MBEDTLS_MD_SHA384) {
8056*62c56f98SSadaf Ebrahimi return tls_prf_sha384;
8057*62c56f98SSadaf Ebrahimi } else
8058*62c56f98SSadaf Ebrahimi #endif
8059*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA256)
8060*62c56f98SSadaf Ebrahimi {
8061*62c56f98SSadaf Ebrahimi if (ciphersuite_info != NULL && ciphersuite_info->mac == MBEDTLS_MD_SHA256) {
8062*62c56f98SSadaf Ebrahimi return tls_prf_sha256;
8063*62c56f98SSadaf Ebrahimi }
8064*62c56f98SSadaf Ebrahimi }
8065*62c56f98SSadaf Ebrahimi #endif
8066*62c56f98SSadaf Ebrahimi #if !defined(MBEDTLS_MD_CAN_SHA384) && \
8067*62c56f98SSadaf Ebrahimi !defined(MBEDTLS_MD_CAN_SHA256)
8068*62c56f98SSadaf Ebrahimi (void) ciphersuite_info;
8069*62c56f98SSadaf Ebrahimi #endif
8070*62c56f98SSadaf Ebrahimi
8071*62c56f98SSadaf Ebrahimi return NULL;
8072*62c56f98SSadaf Ebrahimi }
8073*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_CONTEXT_SERIALIZATION */
8074*62c56f98SSadaf Ebrahimi
tls_prf_get_type(mbedtls_ssl_tls_prf_cb * tls_prf)8075*62c56f98SSadaf Ebrahimi static mbedtls_tls_prf_types tls_prf_get_type(mbedtls_ssl_tls_prf_cb *tls_prf)
8076*62c56f98SSadaf Ebrahimi {
8077*62c56f98SSadaf Ebrahimi ((void) tls_prf);
8078*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA384)
8079*62c56f98SSadaf Ebrahimi if (tls_prf == tls_prf_sha384) {
8080*62c56f98SSadaf Ebrahimi return MBEDTLS_SSL_TLS_PRF_SHA384;
8081*62c56f98SSadaf Ebrahimi } else
8082*62c56f98SSadaf Ebrahimi #endif
8083*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_CAN_SHA256)
8084*62c56f98SSadaf Ebrahimi if (tls_prf == tls_prf_sha256) {
8085*62c56f98SSadaf Ebrahimi return MBEDTLS_SSL_TLS_PRF_SHA256;
8086*62c56f98SSadaf Ebrahimi } else
8087*62c56f98SSadaf Ebrahimi #endif
8088*62c56f98SSadaf Ebrahimi return MBEDTLS_SSL_TLS_PRF_NONE;
8089*62c56f98SSadaf Ebrahimi }
8090*62c56f98SSadaf Ebrahimi
8091*62c56f98SSadaf Ebrahimi /*
8092*62c56f98SSadaf Ebrahimi * Populate a transform structure with session keys and all the other
8093*62c56f98SSadaf Ebrahimi * necessary information.
8094*62c56f98SSadaf Ebrahimi *
8095*62c56f98SSadaf Ebrahimi * Parameters:
8096*62c56f98SSadaf Ebrahimi * - [in/out]: transform: structure to populate
8097*62c56f98SSadaf Ebrahimi * [in] must be just initialised with mbedtls_ssl_transform_init()
8098*62c56f98SSadaf Ebrahimi * [out] fully populated, ready for use by mbedtls_ssl_{en,de}crypt_buf()
8099*62c56f98SSadaf Ebrahimi * - [in] ciphersuite
8100*62c56f98SSadaf Ebrahimi * - [in] master
8101*62c56f98SSadaf Ebrahimi * - [in] encrypt_then_mac
8102*62c56f98SSadaf Ebrahimi * - [in] tls_prf: pointer to PRF to use for key derivation
8103*62c56f98SSadaf Ebrahimi * - [in] randbytes: buffer holding ServerHello.random + ClientHello.random
8104*62c56f98SSadaf Ebrahimi * - [in] tls_version: TLS version
8105*62c56f98SSadaf Ebrahimi * - [in] endpoint: client or server
8106*62c56f98SSadaf Ebrahimi * - [in] ssl: used for:
8107*62c56f98SSadaf Ebrahimi * - ssl->conf->{f,p}_export_keys
8108*62c56f98SSadaf Ebrahimi * [in] optionally used for:
8109*62c56f98SSadaf Ebrahimi * - MBEDTLS_DEBUG_C: ssl->conf->{f,p}_dbg
8110*62c56f98SSadaf Ebrahimi */
8111*62c56f98SSadaf Ebrahimi MBEDTLS_CHECK_RETURN_CRITICAL
ssl_tls12_populate_transform(mbedtls_ssl_transform * transform,int ciphersuite,const unsigned char master[48],int encrypt_then_mac,ssl_tls_prf_t tls_prf,const unsigned char randbytes[64],mbedtls_ssl_protocol_version tls_version,unsigned endpoint,const mbedtls_ssl_context * ssl)8112*62c56f98SSadaf Ebrahimi static int ssl_tls12_populate_transform(mbedtls_ssl_transform *transform,
8113*62c56f98SSadaf Ebrahimi int ciphersuite,
8114*62c56f98SSadaf Ebrahimi const unsigned char master[48],
8115*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM)
8116*62c56f98SSadaf Ebrahimi int encrypt_then_mac,
8117*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM */
8118*62c56f98SSadaf Ebrahimi ssl_tls_prf_t tls_prf,
8119*62c56f98SSadaf Ebrahimi const unsigned char randbytes[64],
8120*62c56f98SSadaf Ebrahimi mbedtls_ssl_protocol_version tls_version,
8121*62c56f98SSadaf Ebrahimi unsigned endpoint,
8122*62c56f98SSadaf Ebrahimi const mbedtls_ssl_context *ssl)
8123*62c56f98SSadaf Ebrahimi {
8124*62c56f98SSadaf Ebrahimi int ret = 0;
8125*62c56f98SSadaf Ebrahimi unsigned char keyblk[256];
8126*62c56f98SSadaf Ebrahimi unsigned char *key1;
8127*62c56f98SSadaf Ebrahimi unsigned char *key2;
8128*62c56f98SSadaf Ebrahimi unsigned char *mac_enc;
8129*62c56f98SSadaf Ebrahimi unsigned char *mac_dec;
8130*62c56f98SSadaf Ebrahimi size_t mac_key_len = 0;
8131*62c56f98SSadaf Ebrahimi size_t iv_copy_len;
8132*62c56f98SSadaf Ebrahimi size_t keylen;
8133*62c56f98SSadaf Ebrahimi const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
8134*62c56f98SSadaf Ebrahimi mbedtls_ssl_mode_t ssl_mode;
8135*62c56f98SSadaf Ebrahimi #if !defined(MBEDTLS_USE_PSA_CRYPTO)
8136*62c56f98SSadaf Ebrahimi const mbedtls_cipher_info_t *cipher_info;
8137*62c56f98SSadaf Ebrahimi const mbedtls_md_info_t *md_info;
8138*62c56f98SSadaf Ebrahimi #endif /* !MBEDTLS_USE_PSA_CRYPTO */
8139*62c56f98SSadaf Ebrahimi
8140*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO)
8141*62c56f98SSadaf Ebrahimi psa_key_type_t key_type;
8142*62c56f98SSadaf Ebrahimi psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
8143*62c56f98SSadaf Ebrahimi psa_algorithm_t alg;
8144*62c56f98SSadaf Ebrahimi psa_algorithm_t mac_alg = 0;
8145*62c56f98SSadaf Ebrahimi size_t key_bits;
8146*62c56f98SSadaf Ebrahimi psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
8147*62c56f98SSadaf Ebrahimi #endif
8148*62c56f98SSadaf Ebrahimi
8149*62c56f98SSadaf Ebrahimi #if !defined(MBEDTLS_DEBUG_C) && \
8150*62c56f98SSadaf Ebrahimi !defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
8151*62c56f98SSadaf Ebrahimi if (ssl->f_export_keys == NULL) {
8152*62c56f98SSadaf Ebrahimi ssl = NULL; /* make sure we don't use it except for these cases */
8153*62c56f98SSadaf Ebrahimi (void) ssl;
8154*62c56f98SSadaf Ebrahimi }
8155*62c56f98SSadaf Ebrahimi #endif
8156*62c56f98SSadaf Ebrahimi
8157*62c56f98SSadaf Ebrahimi /*
8158*62c56f98SSadaf Ebrahimi * Some data just needs copying into the structure
8159*62c56f98SSadaf Ebrahimi */
8160*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM)
8161*62c56f98SSadaf Ebrahimi transform->encrypt_then_mac = encrypt_then_mac;
8162*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM */
8163*62c56f98SSadaf Ebrahimi transform->tls_version = tls_version;
8164*62c56f98SSadaf Ebrahimi
8165*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_CONTEXT_SERIALIZATION)
8166*62c56f98SSadaf Ebrahimi memcpy(transform->randbytes, randbytes, sizeof(transform->randbytes));
8167*62c56f98SSadaf Ebrahimi #endif
8168*62c56f98SSadaf Ebrahimi
8169*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_TLS1_3)
8170*62c56f98SSadaf Ebrahimi if (tls_version == MBEDTLS_SSL_VERSION_TLS1_3) {
8171*62c56f98SSadaf Ebrahimi /* At the moment, we keep TLS <= 1.2 and TLS 1.3 transform
8172*62c56f98SSadaf Ebrahimi * generation separate. This should never happen. */
8173*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
8174*62c56f98SSadaf Ebrahimi }
8175*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
8176*62c56f98SSadaf Ebrahimi
8177*62c56f98SSadaf Ebrahimi /*
8178*62c56f98SSadaf Ebrahimi * Get various info structures
8179*62c56f98SSadaf Ebrahimi */
8180*62c56f98SSadaf Ebrahimi ciphersuite_info = mbedtls_ssl_ciphersuite_from_id(ciphersuite);
8181*62c56f98SSadaf Ebrahimi if (ciphersuite_info == NULL) {
8182*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(1, ("ciphersuite info for %d not found",
8183*62c56f98SSadaf Ebrahimi ciphersuite));
8184*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
8185*62c56f98SSadaf Ebrahimi }
8186*62c56f98SSadaf Ebrahimi
8187*62c56f98SSadaf Ebrahimi ssl_mode = mbedtls_ssl_get_mode_from_ciphersuite(
8188*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM)
8189*62c56f98SSadaf Ebrahimi encrypt_then_mac,
8190*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM */
8191*62c56f98SSadaf Ebrahimi ciphersuite_info);
8192*62c56f98SSadaf Ebrahimi
8193*62c56f98SSadaf Ebrahimi if (ssl_mode == MBEDTLS_SSL_MODE_AEAD) {
8194*62c56f98SSadaf Ebrahimi transform->taglen =
8195*62c56f98SSadaf Ebrahimi ciphersuite_info->flags & MBEDTLS_CIPHERSUITE_SHORT_TAG ? 8 : 16;
8196*62c56f98SSadaf Ebrahimi }
8197*62c56f98SSadaf Ebrahimi
8198*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO)
8199*62c56f98SSadaf Ebrahimi if ((status = mbedtls_ssl_cipher_to_psa(ciphersuite_info->cipher,
8200*62c56f98SSadaf Ebrahimi transform->taglen,
8201*62c56f98SSadaf Ebrahimi &alg,
8202*62c56f98SSadaf Ebrahimi &key_type,
8203*62c56f98SSadaf Ebrahimi &key_bits)) != PSA_SUCCESS) {
8204*62c56f98SSadaf Ebrahimi ret = PSA_TO_MBEDTLS_ERR(status);
8205*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_cipher_to_psa", ret);
8206*62c56f98SSadaf Ebrahimi goto end;
8207*62c56f98SSadaf Ebrahimi }
8208*62c56f98SSadaf Ebrahimi #else
8209*62c56f98SSadaf Ebrahimi cipher_info = mbedtls_cipher_info_from_type((mbedtls_cipher_type_t) ciphersuite_info->cipher);
8210*62c56f98SSadaf Ebrahimi if (cipher_info == NULL) {
8211*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(1, ("cipher info for %u not found",
8212*62c56f98SSadaf Ebrahimi ciphersuite_info->cipher));
8213*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
8214*62c56f98SSadaf Ebrahimi }
8215*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_USE_PSA_CRYPTO */
8216*62c56f98SSadaf Ebrahimi
8217*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO)
8218*62c56f98SSadaf Ebrahimi mac_alg = mbedtls_md_psa_alg_from_type(ciphersuite_info->mac);
8219*62c56f98SSadaf Ebrahimi if (mac_alg == 0) {
8220*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(1, ("mbedtls_md_psa_alg_from_type for %u not found",
8221*62c56f98SSadaf Ebrahimi (unsigned) ciphersuite_info->mac));
8222*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
8223*62c56f98SSadaf Ebrahimi }
8224*62c56f98SSadaf Ebrahimi #else
8225*62c56f98SSadaf Ebrahimi md_info = mbedtls_md_info_from_type((mbedtls_md_type_t) ciphersuite_info->mac);
8226*62c56f98SSadaf Ebrahimi if (md_info == NULL) {
8227*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(1, ("mbedtls_md info for %u not found",
8228*62c56f98SSadaf Ebrahimi (unsigned) ciphersuite_info->mac));
8229*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
8230*62c56f98SSadaf Ebrahimi }
8231*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_USE_PSA_CRYPTO */
8232*62c56f98SSadaf Ebrahimi
8233*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
8234*62c56f98SSadaf Ebrahimi /* Copy own and peer's CID if the use of the CID
8235*62c56f98SSadaf Ebrahimi * extension has been negotiated. */
8236*62c56f98SSadaf Ebrahimi if (ssl->handshake->cid_in_use == MBEDTLS_SSL_CID_ENABLED) {
8237*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(3, ("Copy CIDs into SSL transform"));
8238*62c56f98SSadaf Ebrahimi
8239*62c56f98SSadaf Ebrahimi transform->in_cid_len = ssl->own_cid_len;
8240*62c56f98SSadaf Ebrahimi memcpy(transform->in_cid, ssl->own_cid, ssl->own_cid_len);
8241*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_BUF(3, "Incoming CID", transform->in_cid,
8242*62c56f98SSadaf Ebrahimi transform->in_cid_len);
8243*62c56f98SSadaf Ebrahimi
8244*62c56f98SSadaf Ebrahimi transform->out_cid_len = ssl->handshake->peer_cid_len;
8245*62c56f98SSadaf Ebrahimi memcpy(transform->out_cid, ssl->handshake->peer_cid,
8246*62c56f98SSadaf Ebrahimi ssl->handshake->peer_cid_len);
8247*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_BUF(3, "Outgoing CID", transform->out_cid,
8248*62c56f98SSadaf Ebrahimi transform->out_cid_len);
8249*62c56f98SSadaf Ebrahimi }
8250*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
8251*62c56f98SSadaf Ebrahimi
8252*62c56f98SSadaf Ebrahimi /*
8253*62c56f98SSadaf Ebrahimi * Compute key block using the PRF
8254*62c56f98SSadaf Ebrahimi */
8255*62c56f98SSadaf Ebrahimi ret = tls_prf(master, 48, "key expansion", randbytes, 64, keyblk, 256);
8256*62c56f98SSadaf Ebrahimi if (ret != 0) {
8257*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_RET(1, "prf", ret);
8258*62c56f98SSadaf Ebrahimi return ret;
8259*62c56f98SSadaf Ebrahimi }
8260*62c56f98SSadaf Ebrahimi
8261*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite = %s",
8262*62c56f98SSadaf Ebrahimi mbedtls_ssl_get_ciphersuite_name(ciphersuite)));
8263*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_BUF(3, "master secret", master, 48);
8264*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_BUF(4, "random bytes", randbytes, 64);
8265*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_BUF(4, "key block", keyblk, 256);
8266*62c56f98SSadaf Ebrahimi
8267*62c56f98SSadaf Ebrahimi /*
8268*62c56f98SSadaf Ebrahimi * Determine the appropriate key, IV and MAC length.
8269*62c56f98SSadaf Ebrahimi */
8270*62c56f98SSadaf Ebrahimi
8271*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO)
8272*62c56f98SSadaf Ebrahimi keylen = PSA_BITS_TO_BYTES(key_bits);
8273*62c56f98SSadaf Ebrahimi #else
8274*62c56f98SSadaf Ebrahimi keylen = mbedtls_cipher_info_get_key_bitlen(cipher_info) / 8;
8275*62c56f98SSadaf Ebrahimi #endif
8276*62c56f98SSadaf Ebrahimi
8277*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_GCM_C) || \
8278*62c56f98SSadaf Ebrahimi defined(MBEDTLS_CCM_C) || \
8279*62c56f98SSadaf Ebrahimi defined(MBEDTLS_CHACHAPOLY_C)
8280*62c56f98SSadaf Ebrahimi if (ssl_mode == MBEDTLS_SSL_MODE_AEAD) {
8281*62c56f98SSadaf Ebrahimi size_t explicit_ivlen;
8282*62c56f98SSadaf Ebrahimi
8283*62c56f98SSadaf Ebrahimi transform->maclen = 0;
8284*62c56f98SSadaf Ebrahimi mac_key_len = 0;
8285*62c56f98SSadaf Ebrahimi
8286*62c56f98SSadaf Ebrahimi /* All modes haves 96-bit IVs, but the length of the static parts vary
8287*62c56f98SSadaf Ebrahimi * with mode and version:
8288*62c56f98SSadaf Ebrahimi * - For GCM and CCM in TLS 1.2, there's a static IV of 4 Bytes
8289*62c56f98SSadaf Ebrahimi * (to be concatenated with a dynamically chosen IV of 8 Bytes)
8290*62c56f98SSadaf Ebrahimi * - For ChaChaPoly in TLS 1.2, and all modes in TLS 1.3, there's
8291*62c56f98SSadaf Ebrahimi * a static IV of 12 Bytes (to be XOR'ed with the 8 Byte record
8292*62c56f98SSadaf Ebrahimi * sequence number).
8293*62c56f98SSadaf Ebrahimi */
8294*62c56f98SSadaf Ebrahimi transform->ivlen = 12;
8295*62c56f98SSadaf Ebrahimi
8296*62c56f98SSadaf Ebrahimi int is_chachapoly = 0;
8297*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO)
8298*62c56f98SSadaf Ebrahimi is_chachapoly = (key_type == PSA_KEY_TYPE_CHACHA20);
8299*62c56f98SSadaf Ebrahimi #else
8300*62c56f98SSadaf Ebrahimi is_chachapoly = (mbedtls_cipher_info_get_mode(cipher_info)
8301*62c56f98SSadaf Ebrahimi == MBEDTLS_MODE_CHACHAPOLY);
8302*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_USE_PSA_CRYPTO */
8303*62c56f98SSadaf Ebrahimi
8304*62c56f98SSadaf Ebrahimi if (is_chachapoly) {
8305*62c56f98SSadaf Ebrahimi transform->fixed_ivlen = 12;
8306*62c56f98SSadaf Ebrahimi } else {
8307*62c56f98SSadaf Ebrahimi transform->fixed_ivlen = 4;
8308*62c56f98SSadaf Ebrahimi }
8309*62c56f98SSadaf Ebrahimi
8310*62c56f98SSadaf Ebrahimi /* Minimum length of encrypted record */
8311*62c56f98SSadaf Ebrahimi explicit_ivlen = transform->ivlen - transform->fixed_ivlen;
8312*62c56f98SSadaf Ebrahimi transform->minlen = explicit_ivlen + transform->taglen;
8313*62c56f98SSadaf Ebrahimi } else
8314*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_GCM_C || MBEDTLS_CCM_C || MBEDTLS_CHACHAPOLY_C */
8315*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_SOME_SUITES_USE_MAC)
8316*62c56f98SSadaf Ebrahimi if (ssl_mode == MBEDTLS_SSL_MODE_STREAM ||
8317*62c56f98SSadaf Ebrahimi ssl_mode == MBEDTLS_SSL_MODE_CBC ||
8318*62c56f98SSadaf Ebrahimi ssl_mode == MBEDTLS_SSL_MODE_CBC_ETM) {
8319*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO)
8320*62c56f98SSadaf Ebrahimi size_t block_size = PSA_BLOCK_CIPHER_BLOCK_LENGTH(key_type);
8321*62c56f98SSadaf Ebrahimi #else
8322*62c56f98SSadaf Ebrahimi size_t block_size = mbedtls_cipher_info_get_block_size(cipher_info);
8323*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_USE_PSA_CRYPTO */
8324*62c56f98SSadaf Ebrahimi
8325*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO)
8326*62c56f98SSadaf Ebrahimi /* Get MAC length */
8327*62c56f98SSadaf Ebrahimi mac_key_len = PSA_HASH_LENGTH(mac_alg);
8328*62c56f98SSadaf Ebrahimi #else
8329*62c56f98SSadaf Ebrahimi /* Initialize HMAC contexts */
8330*62c56f98SSadaf Ebrahimi if ((ret = mbedtls_md_setup(&transform->md_ctx_enc, md_info, 1)) != 0 ||
8331*62c56f98SSadaf Ebrahimi (ret = mbedtls_md_setup(&transform->md_ctx_dec, md_info, 1)) != 0) {
8332*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_md_setup", ret);
8333*62c56f98SSadaf Ebrahimi goto end;
8334*62c56f98SSadaf Ebrahimi }
8335*62c56f98SSadaf Ebrahimi
8336*62c56f98SSadaf Ebrahimi /* Get MAC length */
8337*62c56f98SSadaf Ebrahimi mac_key_len = mbedtls_md_get_size(md_info);
8338*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_USE_PSA_CRYPTO */
8339*62c56f98SSadaf Ebrahimi transform->maclen = mac_key_len;
8340*62c56f98SSadaf Ebrahimi
8341*62c56f98SSadaf Ebrahimi /* IV length */
8342*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO)
8343*62c56f98SSadaf Ebrahimi transform->ivlen = PSA_CIPHER_IV_LENGTH(key_type, alg);
8344*62c56f98SSadaf Ebrahimi #else
8345*62c56f98SSadaf Ebrahimi transform->ivlen = mbedtls_cipher_info_get_iv_size(cipher_info);
8346*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_USE_PSA_CRYPTO */
8347*62c56f98SSadaf Ebrahimi
8348*62c56f98SSadaf Ebrahimi /* Minimum length */
8349*62c56f98SSadaf Ebrahimi if (ssl_mode == MBEDTLS_SSL_MODE_STREAM) {
8350*62c56f98SSadaf Ebrahimi transform->minlen = transform->maclen;
8351*62c56f98SSadaf Ebrahimi } else {
8352*62c56f98SSadaf Ebrahimi /*
8353*62c56f98SSadaf Ebrahimi * GenericBlockCipher:
8354*62c56f98SSadaf Ebrahimi * 1. if EtM is in use: one block plus MAC
8355*62c56f98SSadaf Ebrahimi * otherwise: * first multiple of blocklen greater than maclen
8356*62c56f98SSadaf Ebrahimi * 2. IV
8357*62c56f98SSadaf Ebrahimi */
8358*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
8359*62c56f98SSadaf Ebrahimi if (ssl_mode == MBEDTLS_SSL_MODE_CBC_ETM) {
8360*62c56f98SSadaf Ebrahimi transform->minlen = transform->maclen
8361*62c56f98SSadaf Ebrahimi + block_size;
8362*62c56f98SSadaf Ebrahimi } else
8363*62c56f98SSadaf Ebrahimi #endif
8364*62c56f98SSadaf Ebrahimi {
8365*62c56f98SSadaf Ebrahimi transform->minlen = transform->maclen
8366*62c56f98SSadaf Ebrahimi + block_size
8367*62c56f98SSadaf Ebrahimi - transform->maclen % block_size;
8368*62c56f98SSadaf Ebrahimi }
8369*62c56f98SSadaf Ebrahimi
8370*62c56f98SSadaf Ebrahimi if (tls_version == MBEDTLS_SSL_VERSION_TLS1_2) {
8371*62c56f98SSadaf Ebrahimi transform->minlen += transform->ivlen;
8372*62c56f98SSadaf Ebrahimi } else {
8373*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
8374*62c56f98SSadaf Ebrahimi ret = MBEDTLS_ERR_SSL_INTERNAL_ERROR;
8375*62c56f98SSadaf Ebrahimi goto end;
8376*62c56f98SSadaf Ebrahimi }
8377*62c56f98SSadaf Ebrahimi }
8378*62c56f98SSadaf Ebrahimi } else
8379*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_SOME_SUITES_USE_MAC */
8380*62c56f98SSadaf Ebrahimi {
8381*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
8382*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
8383*62c56f98SSadaf Ebrahimi }
8384*62c56f98SSadaf Ebrahimi
8385*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(3, ("keylen: %u, minlen: %u, ivlen: %u, maclen: %u",
8386*62c56f98SSadaf Ebrahimi (unsigned) keylen,
8387*62c56f98SSadaf Ebrahimi (unsigned) transform->minlen,
8388*62c56f98SSadaf Ebrahimi (unsigned) transform->ivlen,
8389*62c56f98SSadaf Ebrahimi (unsigned) transform->maclen));
8390*62c56f98SSadaf Ebrahimi
8391*62c56f98SSadaf Ebrahimi /*
8392*62c56f98SSadaf Ebrahimi * Finally setup the cipher contexts, IVs and MAC secrets.
8393*62c56f98SSadaf Ebrahimi */
8394*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_CLI_C)
8395*62c56f98SSadaf Ebrahimi if (endpoint == MBEDTLS_SSL_IS_CLIENT) {
8396*62c56f98SSadaf Ebrahimi key1 = keyblk + mac_key_len * 2;
8397*62c56f98SSadaf Ebrahimi key2 = keyblk + mac_key_len * 2 + keylen;
8398*62c56f98SSadaf Ebrahimi
8399*62c56f98SSadaf Ebrahimi mac_enc = keyblk;
8400*62c56f98SSadaf Ebrahimi mac_dec = keyblk + mac_key_len;
8401*62c56f98SSadaf Ebrahimi
8402*62c56f98SSadaf Ebrahimi iv_copy_len = (transform->fixed_ivlen) ?
8403*62c56f98SSadaf Ebrahimi transform->fixed_ivlen : transform->ivlen;
8404*62c56f98SSadaf Ebrahimi memcpy(transform->iv_enc, key2 + keylen, iv_copy_len);
8405*62c56f98SSadaf Ebrahimi memcpy(transform->iv_dec, key2 + keylen + iv_copy_len,
8406*62c56f98SSadaf Ebrahimi iv_copy_len);
8407*62c56f98SSadaf Ebrahimi } else
8408*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_CLI_C */
8409*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_SRV_C)
8410*62c56f98SSadaf Ebrahimi if (endpoint == MBEDTLS_SSL_IS_SERVER) {
8411*62c56f98SSadaf Ebrahimi key1 = keyblk + mac_key_len * 2 + keylen;
8412*62c56f98SSadaf Ebrahimi key2 = keyblk + mac_key_len * 2;
8413*62c56f98SSadaf Ebrahimi
8414*62c56f98SSadaf Ebrahimi mac_enc = keyblk + mac_key_len;
8415*62c56f98SSadaf Ebrahimi mac_dec = keyblk;
8416*62c56f98SSadaf Ebrahimi
8417*62c56f98SSadaf Ebrahimi iv_copy_len = (transform->fixed_ivlen) ?
8418*62c56f98SSadaf Ebrahimi transform->fixed_ivlen : transform->ivlen;
8419*62c56f98SSadaf Ebrahimi memcpy(transform->iv_dec, key1 + keylen, iv_copy_len);
8420*62c56f98SSadaf Ebrahimi memcpy(transform->iv_enc, key1 + keylen + iv_copy_len,
8421*62c56f98SSadaf Ebrahimi iv_copy_len);
8422*62c56f98SSadaf Ebrahimi } else
8423*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_SRV_C */
8424*62c56f98SSadaf Ebrahimi {
8425*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
8426*62c56f98SSadaf Ebrahimi ret = MBEDTLS_ERR_SSL_INTERNAL_ERROR;
8427*62c56f98SSadaf Ebrahimi goto end;
8428*62c56f98SSadaf Ebrahimi }
8429*62c56f98SSadaf Ebrahimi
8430*62c56f98SSadaf Ebrahimi if (ssl != NULL && ssl->f_export_keys != NULL) {
8431*62c56f98SSadaf Ebrahimi ssl->f_export_keys(ssl->p_export_keys,
8432*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_KEY_EXPORT_TLS12_MASTER_SECRET,
8433*62c56f98SSadaf Ebrahimi master, 48,
8434*62c56f98SSadaf Ebrahimi randbytes + 32,
8435*62c56f98SSadaf Ebrahimi randbytes,
8436*62c56f98SSadaf Ebrahimi tls_prf_get_type(tls_prf));
8437*62c56f98SSadaf Ebrahimi }
8438*62c56f98SSadaf Ebrahimi
8439*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO)
8440*62c56f98SSadaf Ebrahimi transform->psa_alg = alg;
8441*62c56f98SSadaf Ebrahimi
8442*62c56f98SSadaf Ebrahimi if (alg != MBEDTLS_SSL_NULL_CIPHER) {
8443*62c56f98SSadaf Ebrahimi psa_set_key_usage_flags(&attributes, PSA_KEY_USAGE_ENCRYPT);
8444*62c56f98SSadaf Ebrahimi psa_set_key_algorithm(&attributes, alg);
8445*62c56f98SSadaf Ebrahimi psa_set_key_type(&attributes, key_type);
8446*62c56f98SSadaf Ebrahimi
8447*62c56f98SSadaf Ebrahimi if ((status = psa_import_key(&attributes,
8448*62c56f98SSadaf Ebrahimi key1,
8449*62c56f98SSadaf Ebrahimi PSA_BITS_TO_BYTES(key_bits),
8450*62c56f98SSadaf Ebrahimi &transform->psa_key_enc)) != PSA_SUCCESS) {
8451*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_RET(3, "psa_import_key", (int) status);
8452*62c56f98SSadaf Ebrahimi ret = PSA_TO_MBEDTLS_ERR(status);
8453*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_RET(1, "psa_import_key", ret);
8454*62c56f98SSadaf Ebrahimi goto end;
8455*62c56f98SSadaf Ebrahimi }
8456*62c56f98SSadaf Ebrahimi
8457*62c56f98SSadaf Ebrahimi psa_set_key_usage_flags(&attributes, PSA_KEY_USAGE_DECRYPT);
8458*62c56f98SSadaf Ebrahimi
8459*62c56f98SSadaf Ebrahimi if ((status = psa_import_key(&attributes,
8460*62c56f98SSadaf Ebrahimi key2,
8461*62c56f98SSadaf Ebrahimi PSA_BITS_TO_BYTES(key_bits),
8462*62c56f98SSadaf Ebrahimi &transform->psa_key_dec)) != PSA_SUCCESS) {
8463*62c56f98SSadaf Ebrahimi ret = PSA_TO_MBEDTLS_ERR(status);
8464*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_RET(1, "psa_import_key", ret);
8465*62c56f98SSadaf Ebrahimi goto end;
8466*62c56f98SSadaf Ebrahimi }
8467*62c56f98SSadaf Ebrahimi }
8468*62c56f98SSadaf Ebrahimi #else
8469*62c56f98SSadaf Ebrahimi if ((ret = mbedtls_cipher_setup(&transform->cipher_ctx_enc,
8470*62c56f98SSadaf Ebrahimi cipher_info)) != 0) {
8471*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_cipher_setup", ret);
8472*62c56f98SSadaf Ebrahimi goto end;
8473*62c56f98SSadaf Ebrahimi }
8474*62c56f98SSadaf Ebrahimi
8475*62c56f98SSadaf Ebrahimi if ((ret = mbedtls_cipher_setup(&transform->cipher_ctx_dec,
8476*62c56f98SSadaf Ebrahimi cipher_info)) != 0) {
8477*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_cipher_setup", ret);
8478*62c56f98SSadaf Ebrahimi goto end;
8479*62c56f98SSadaf Ebrahimi }
8480*62c56f98SSadaf Ebrahimi
8481*62c56f98SSadaf Ebrahimi if ((ret = mbedtls_cipher_setkey(&transform->cipher_ctx_enc, key1,
8482*62c56f98SSadaf Ebrahimi (int) mbedtls_cipher_info_get_key_bitlen(cipher_info),
8483*62c56f98SSadaf Ebrahimi MBEDTLS_ENCRYPT)) != 0) {
8484*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_cipher_setkey", ret);
8485*62c56f98SSadaf Ebrahimi goto end;
8486*62c56f98SSadaf Ebrahimi }
8487*62c56f98SSadaf Ebrahimi
8488*62c56f98SSadaf Ebrahimi if ((ret = mbedtls_cipher_setkey(&transform->cipher_ctx_dec, key2,
8489*62c56f98SSadaf Ebrahimi (int) mbedtls_cipher_info_get_key_bitlen(cipher_info),
8490*62c56f98SSadaf Ebrahimi MBEDTLS_DECRYPT)) != 0) {
8491*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_cipher_setkey", ret);
8492*62c56f98SSadaf Ebrahimi goto end;
8493*62c56f98SSadaf Ebrahimi }
8494*62c56f98SSadaf Ebrahimi
8495*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_CIPHER_MODE_CBC)
8496*62c56f98SSadaf Ebrahimi if (mbedtls_cipher_info_get_mode(cipher_info) == MBEDTLS_MODE_CBC) {
8497*62c56f98SSadaf Ebrahimi if ((ret = mbedtls_cipher_set_padding_mode(&transform->cipher_ctx_enc,
8498*62c56f98SSadaf Ebrahimi MBEDTLS_PADDING_NONE)) != 0) {
8499*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_cipher_set_padding_mode", ret);
8500*62c56f98SSadaf Ebrahimi goto end;
8501*62c56f98SSadaf Ebrahimi }
8502*62c56f98SSadaf Ebrahimi
8503*62c56f98SSadaf Ebrahimi if ((ret = mbedtls_cipher_set_padding_mode(&transform->cipher_ctx_dec,
8504*62c56f98SSadaf Ebrahimi MBEDTLS_PADDING_NONE)) != 0) {
8505*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_cipher_set_padding_mode", ret);
8506*62c56f98SSadaf Ebrahimi goto end;
8507*62c56f98SSadaf Ebrahimi }
8508*62c56f98SSadaf Ebrahimi }
8509*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_CIPHER_MODE_CBC */
8510*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_USE_PSA_CRYPTO */
8511*62c56f98SSadaf Ebrahimi
8512*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_SOME_SUITES_USE_MAC)
8513*62c56f98SSadaf Ebrahimi /* For HMAC-based ciphersuites, initialize the HMAC transforms.
8514*62c56f98SSadaf Ebrahimi For AEAD-based ciphersuites, there is nothing to do here. */
8515*62c56f98SSadaf Ebrahimi if (mac_key_len != 0) {
8516*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO)
8517*62c56f98SSadaf Ebrahimi transform->psa_mac_alg = PSA_ALG_HMAC(mac_alg);
8518*62c56f98SSadaf Ebrahimi
8519*62c56f98SSadaf Ebrahimi psa_set_key_usage_flags(&attributes, PSA_KEY_USAGE_SIGN_MESSAGE);
8520*62c56f98SSadaf Ebrahimi psa_set_key_algorithm(&attributes, PSA_ALG_HMAC(mac_alg));
8521*62c56f98SSadaf Ebrahimi psa_set_key_type(&attributes, PSA_KEY_TYPE_HMAC);
8522*62c56f98SSadaf Ebrahimi
8523*62c56f98SSadaf Ebrahimi if ((status = psa_import_key(&attributes,
8524*62c56f98SSadaf Ebrahimi mac_enc, mac_key_len,
8525*62c56f98SSadaf Ebrahimi &transform->psa_mac_enc)) != PSA_SUCCESS) {
8526*62c56f98SSadaf Ebrahimi ret = PSA_TO_MBEDTLS_ERR(status);
8527*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_RET(1, "psa_import_mac_key", ret);
8528*62c56f98SSadaf Ebrahimi goto end;
8529*62c56f98SSadaf Ebrahimi }
8530*62c56f98SSadaf Ebrahimi
8531*62c56f98SSadaf Ebrahimi if ((transform->psa_alg == MBEDTLS_SSL_NULL_CIPHER) ||
8532*62c56f98SSadaf Ebrahimi ((transform->psa_alg == PSA_ALG_CBC_NO_PADDING)
8533*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM)
8534*62c56f98SSadaf Ebrahimi && (transform->encrypt_then_mac == MBEDTLS_SSL_ETM_DISABLED)
8535*62c56f98SSadaf Ebrahimi #endif
8536*62c56f98SSadaf Ebrahimi )) {
8537*62c56f98SSadaf Ebrahimi /* mbedtls_ct_hmac() requires the key to be exportable */
8538*62c56f98SSadaf Ebrahimi psa_set_key_usage_flags(&attributes, PSA_KEY_USAGE_EXPORT |
8539*62c56f98SSadaf Ebrahimi PSA_KEY_USAGE_VERIFY_HASH);
8540*62c56f98SSadaf Ebrahimi } else {
8541*62c56f98SSadaf Ebrahimi psa_set_key_usage_flags(&attributes, PSA_KEY_USAGE_VERIFY_HASH);
8542*62c56f98SSadaf Ebrahimi }
8543*62c56f98SSadaf Ebrahimi
8544*62c56f98SSadaf Ebrahimi if ((status = psa_import_key(&attributes,
8545*62c56f98SSadaf Ebrahimi mac_dec, mac_key_len,
8546*62c56f98SSadaf Ebrahimi &transform->psa_mac_dec)) != PSA_SUCCESS) {
8547*62c56f98SSadaf Ebrahimi ret = PSA_TO_MBEDTLS_ERR(status);
8548*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_RET(1, "psa_import_mac_key", ret);
8549*62c56f98SSadaf Ebrahimi goto end;
8550*62c56f98SSadaf Ebrahimi }
8551*62c56f98SSadaf Ebrahimi #else
8552*62c56f98SSadaf Ebrahimi ret = mbedtls_md_hmac_starts(&transform->md_ctx_enc, mac_enc, mac_key_len);
8553*62c56f98SSadaf Ebrahimi if (ret != 0) {
8554*62c56f98SSadaf Ebrahimi goto end;
8555*62c56f98SSadaf Ebrahimi }
8556*62c56f98SSadaf Ebrahimi ret = mbedtls_md_hmac_starts(&transform->md_ctx_dec, mac_dec, mac_key_len);
8557*62c56f98SSadaf Ebrahimi if (ret != 0) {
8558*62c56f98SSadaf Ebrahimi goto end;
8559*62c56f98SSadaf Ebrahimi }
8560*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_USE_PSA_CRYPTO */
8561*62c56f98SSadaf Ebrahimi }
8562*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_SOME_SUITES_USE_MAC */
8563*62c56f98SSadaf Ebrahimi
8564*62c56f98SSadaf Ebrahimi ((void) mac_dec);
8565*62c56f98SSadaf Ebrahimi ((void) mac_enc);
8566*62c56f98SSadaf Ebrahimi
8567*62c56f98SSadaf Ebrahimi end:
8568*62c56f98SSadaf Ebrahimi mbedtls_platform_zeroize(keyblk, sizeof(keyblk));
8569*62c56f98SSadaf Ebrahimi return ret;
8570*62c56f98SSadaf Ebrahimi }
8571*62c56f98SSadaf Ebrahimi
8572*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) && \
8573*62c56f98SSadaf Ebrahimi defined(MBEDTLS_USE_PSA_CRYPTO)
mbedtls_psa_ecjpake_read_round(psa_pake_operation_t * pake_ctx,const unsigned char * buf,size_t len,mbedtls_ecjpake_rounds_t round)8574*62c56f98SSadaf Ebrahimi int mbedtls_psa_ecjpake_read_round(
8575*62c56f98SSadaf Ebrahimi psa_pake_operation_t *pake_ctx,
8576*62c56f98SSadaf Ebrahimi const unsigned char *buf,
8577*62c56f98SSadaf Ebrahimi size_t len, mbedtls_ecjpake_rounds_t round)
8578*62c56f98SSadaf Ebrahimi {
8579*62c56f98SSadaf Ebrahimi psa_status_t status;
8580*62c56f98SSadaf Ebrahimi size_t input_offset = 0;
8581*62c56f98SSadaf Ebrahimi /*
8582*62c56f98SSadaf Ebrahimi * At round one repeat the KEY_SHARE, ZK_PUBLIC & ZF_PROOF twice
8583*62c56f98SSadaf Ebrahimi * At round two perform a single cycle
8584*62c56f98SSadaf Ebrahimi */
8585*62c56f98SSadaf Ebrahimi unsigned int remaining_steps = (round == MBEDTLS_ECJPAKE_ROUND_ONE) ? 2 : 1;
8586*62c56f98SSadaf Ebrahimi
8587*62c56f98SSadaf Ebrahimi for (; remaining_steps > 0; remaining_steps--) {
8588*62c56f98SSadaf Ebrahimi for (psa_pake_step_t step = PSA_PAKE_STEP_KEY_SHARE;
8589*62c56f98SSadaf Ebrahimi step <= PSA_PAKE_STEP_ZK_PROOF;
8590*62c56f98SSadaf Ebrahimi ++step) {
8591*62c56f98SSadaf Ebrahimi /* Length is stored at the first byte */
8592*62c56f98SSadaf Ebrahimi size_t length = buf[input_offset];
8593*62c56f98SSadaf Ebrahimi input_offset += 1;
8594*62c56f98SSadaf Ebrahimi
8595*62c56f98SSadaf Ebrahimi if (input_offset + length > len) {
8596*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
8597*62c56f98SSadaf Ebrahimi }
8598*62c56f98SSadaf Ebrahimi
8599*62c56f98SSadaf Ebrahimi status = psa_pake_input(pake_ctx, step,
8600*62c56f98SSadaf Ebrahimi buf + input_offset, length);
8601*62c56f98SSadaf Ebrahimi if (status != PSA_SUCCESS) {
8602*62c56f98SSadaf Ebrahimi return PSA_TO_MBEDTLS_ERR(status);
8603*62c56f98SSadaf Ebrahimi }
8604*62c56f98SSadaf Ebrahimi
8605*62c56f98SSadaf Ebrahimi input_offset += length;
8606*62c56f98SSadaf Ebrahimi }
8607*62c56f98SSadaf Ebrahimi }
8608*62c56f98SSadaf Ebrahimi
8609*62c56f98SSadaf Ebrahimi if (input_offset != len) {
8610*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
8611*62c56f98SSadaf Ebrahimi }
8612*62c56f98SSadaf Ebrahimi
8613*62c56f98SSadaf Ebrahimi return 0;
8614*62c56f98SSadaf Ebrahimi }
8615*62c56f98SSadaf Ebrahimi
mbedtls_psa_ecjpake_write_round(psa_pake_operation_t * pake_ctx,unsigned char * buf,size_t len,size_t * olen,mbedtls_ecjpake_rounds_t round)8616*62c56f98SSadaf Ebrahimi int mbedtls_psa_ecjpake_write_round(
8617*62c56f98SSadaf Ebrahimi psa_pake_operation_t *pake_ctx,
8618*62c56f98SSadaf Ebrahimi unsigned char *buf,
8619*62c56f98SSadaf Ebrahimi size_t len, size_t *olen,
8620*62c56f98SSadaf Ebrahimi mbedtls_ecjpake_rounds_t round)
8621*62c56f98SSadaf Ebrahimi {
8622*62c56f98SSadaf Ebrahimi psa_status_t status;
8623*62c56f98SSadaf Ebrahimi size_t output_offset = 0;
8624*62c56f98SSadaf Ebrahimi size_t output_len;
8625*62c56f98SSadaf Ebrahimi /*
8626*62c56f98SSadaf Ebrahimi * At round one repeat the KEY_SHARE, ZK_PUBLIC & ZF_PROOF twice
8627*62c56f98SSadaf Ebrahimi * At round two perform a single cycle
8628*62c56f98SSadaf Ebrahimi */
8629*62c56f98SSadaf Ebrahimi unsigned int remaining_steps = (round == MBEDTLS_ECJPAKE_ROUND_ONE) ? 2 : 1;
8630*62c56f98SSadaf Ebrahimi
8631*62c56f98SSadaf Ebrahimi for (; remaining_steps > 0; remaining_steps--) {
8632*62c56f98SSadaf Ebrahimi for (psa_pake_step_t step = PSA_PAKE_STEP_KEY_SHARE;
8633*62c56f98SSadaf Ebrahimi step <= PSA_PAKE_STEP_ZK_PROOF;
8634*62c56f98SSadaf Ebrahimi ++step) {
8635*62c56f98SSadaf Ebrahimi /*
8636*62c56f98SSadaf Ebrahimi * For each step, prepend 1 byte with the length of the data as
8637*62c56f98SSadaf Ebrahimi * given by psa_pake_output().
8638*62c56f98SSadaf Ebrahimi */
8639*62c56f98SSadaf Ebrahimi status = psa_pake_output(pake_ctx, step,
8640*62c56f98SSadaf Ebrahimi buf + output_offset + 1,
8641*62c56f98SSadaf Ebrahimi len - output_offset - 1,
8642*62c56f98SSadaf Ebrahimi &output_len);
8643*62c56f98SSadaf Ebrahimi if (status != PSA_SUCCESS) {
8644*62c56f98SSadaf Ebrahimi return PSA_TO_MBEDTLS_ERR(status);
8645*62c56f98SSadaf Ebrahimi }
8646*62c56f98SSadaf Ebrahimi
8647*62c56f98SSadaf Ebrahimi *(buf + output_offset) = (uint8_t) output_len;
8648*62c56f98SSadaf Ebrahimi
8649*62c56f98SSadaf Ebrahimi output_offset += output_len + 1;
8650*62c56f98SSadaf Ebrahimi }
8651*62c56f98SSadaf Ebrahimi }
8652*62c56f98SSadaf Ebrahimi
8653*62c56f98SSadaf Ebrahimi *olen = output_offset;
8654*62c56f98SSadaf Ebrahimi
8655*62c56f98SSadaf Ebrahimi return 0;
8656*62c56f98SSadaf Ebrahimi }
8657*62c56f98SSadaf Ebrahimi #endif //MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED && MBEDTLS_USE_PSA_CRYPTO
8658*62c56f98SSadaf Ebrahimi
8659*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO)
mbedtls_ssl_get_key_exchange_md_tls1_2(mbedtls_ssl_context * ssl,unsigned char * hash,size_t * hashlen,unsigned char * data,size_t data_len,mbedtls_md_type_t md_alg)8660*62c56f98SSadaf Ebrahimi int mbedtls_ssl_get_key_exchange_md_tls1_2(mbedtls_ssl_context *ssl,
8661*62c56f98SSadaf Ebrahimi unsigned char *hash, size_t *hashlen,
8662*62c56f98SSadaf Ebrahimi unsigned char *data, size_t data_len,
8663*62c56f98SSadaf Ebrahimi mbedtls_md_type_t md_alg)
8664*62c56f98SSadaf Ebrahimi {
8665*62c56f98SSadaf Ebrahimi psa_status_t status;
8666*62c56f98SSadaf Ebrahimi psa_hash_operation_t hash_operation = PSA_HASH_OPERATION_INIT;
8667*62c56f98SSadaf Ebrahimi psa_algorithm_t hash_alg = mbedtls_md_psa_alg_from_type(md_alg);
8668*62c56f98SSadaf Ebrahimi
8669*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(3, ("Perform PSA-based computation of digest of ServerKeyExchange"));
8670*62c56f98SSadaf Ebrahimi
8671*62c56f98SSadaf Ebrahimi if ((status = psa_hash_setup(&hash_operation,
8672*62c56f98SSadaf Ebrahimi hash_alg)) != PSA_SUCCESS) {
8673*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_RET(1, "psa_hash_setup", status);
8674*62c56f98SSadaf Ebrahimi goto exit;
8675*62c56f98SSadaf Ebrahimi }
8676*62c56f98SSadaf Ebrahimi
8677*62c56f98SSadaf Ebrahimi if ((status = psa_hash_update(&hash_operation, ssl->handshake->randbytes,
8678*62c56f98SSadaf Ebrahimi 64)) != PSA_SUCCESS) {
8679*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_RET(1, "psa_hash_update", status);
8680*62c56f98SSadaf Ebrahimi goto exit;
8681*62c56f98SSadaf Ebrahimi }
8682*62c56f98SSadaf Ebrahimi
8683*62c56f98SSadaf Ebrahimi if ((status = psa_hash_update(&hash_operation,
8684*62c56f98SSadaf Ebrahimi data, data_len)) != PSA_SUCCESS) {
8685*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_RET(1, "psa_hash_update", status);
8686*62c56f98SSadaf Ebrahimi goto exit;
8687*62c56f98SSadaf Ebrahimi }
8688*62c56f98SSadaf Ebrahimi
8689*62c56f98SSadaf Ebrahimi if ((status = psa_hash_finish(&hash_operation, hash, PSA_HASH_MAX_SIZE,
8690*62c56f98SSadaf Ebrahimi hashlen)) != PSA_SUCCESS) {
8691*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_RET(1, "psa_hash_finish", status);
8692*62c56f98SSadaf Ebrahimi goto exit;
8693*62c56f98SSadaf Ebrahimi }
8694*62c56f98SSadaf Ebrahimi
8695*62c56f98SSadaf Ebrahimi exit:
8696*62c56f98SSadaf Ebrahimi if (status != PSA_SUCCESS) {
8697*62c56f98SSadaf Ebrahimi mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
8698*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR);
8699*62c56f98SSadaf Ebrahimi switch (status) {
8700*62c56f98SSadaf Ebrahimi case PSA_ERROR_NOT_SUPPORTED:
8701*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_MD_FEATURE_UNAVAILABLE;
8702*62c56f98SSadaf Ebrahimi case PSA_ERROR_BAD_STATE: /* Intentional fallthrough */
8703*62c56f98SSadaf Ebrahimi case PSA_ERROR_BUFFER_TOO_SMALL:
8704*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
8705*62c56f98SSadaf Ebrahimi case PSA_ERROR_INSUFFICIENT_MEMORY:
8706*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_MD_ALLOC_FAILED;
8707*62c56f98SSadaf Ebrahimi default:
8708*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_PLATFORM_HW_ACCEL_FAILED;
8709*62c56f98SSadaf Ebrahimi }
8710*62c56f98SSadaf Ebrahimi }
8711*62c56f98SSadaf Ebrahimi return 0;
8712*62c56f98SSadaf Ebrahimi }
8713*62c56f98SSadaf Ebrahimi
8714*62c56f98SSadaf Ebrahimi #else
8715*62c56f98SSadaf Ebrahimi
mbedtls_ssl_get_key_exchange_md_tls1_2(mbedtls_ssl_context * ssl,unsigned char * hash,size_t * hashlen,unsigned char * data,size_t data_len,mbedtls_md_type_t md_alg)8716*62c56f98SSadaf Ebrahimi int mbedtls_ssl_get_key_exchange_md_tls1_2(mbedtls_ssl_context *ssl,
8717*62c56f98SSadaf Ebrahimi unsigned char *hash, size_t *hashlen,
8718*62c56f98SSadaf Ebrahimi unsigned char *data, size_t data_len,
8719*62c56f98SSadaf Ebrahimi mbedtls_md_type_t md_alg)
8720*62c56f98SSadaf Ebrahimi {
8721*62c56f98SSadaf Ebrahimi int ret = 0;
8722*62c56f98SSadaf Ebrahimi mbedtls_md_context_t ctx;
8723*62c56f98SSadaf Ebrahimi const mbedtls_md_info_t *md_info = mbedtls_md_info_from_type(md_alg);
8724*62c56f98SSadaf Ebrahimi *hashlen = mbedtls_md_get_size(md_info);
8725*62c56f98SSadaf Ebrahimi
8726*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(3, ("Perform mbedtls-based computation of digest of ServerKeyExchange"));
8727*62c56f98SSadaf Ebrahimi
8728*62c56f98SSadaf Ebrahimi mbedtls_md_init(&ctx);
8729*62c56f98SSadaf Ebrahimi
8730*62c56f98SSadaf Ebrahimi /*
8731*62c56f98SSadaf Ebrahimi * digitally-signed struct {
8732*62c56f98SSadaf Ebrahimi * opaque client_random[32];
8733*62c56f98SSadaf Ebrahimi * opaque server_random[32];
8734*62c56f98SSadaf Ebrahimi * ServerDHParams params;
8735*62c56f98SSadaf Ebrahimi * };
8736*62c56f98SSadaf Ebrahimi */
8737*62c56f98SSadaf Ebrahimi if ((ret = mbedtls_md_setup(&ctx, md_info, 0)) != 0) {
8738*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_md_setup", ret);
8739*62c56f98SSadaf Ebrahimi goto exit;
8740*62c56f98SSadaf Ebrahimi }
8741*62c56f98SSadaf Ebrahimi if ((ret = mbedtls_md_starts(&ctx)) != 0) {
8742*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_md_starts", ret);
8743*62c56f98SSadaf Ebrahimi goto exit;
8744*62c56f98SSadaf Ebrahimi }
8745*62c56f98SSadaf Ebrahimi if ((ret = mbedtls_md_update(&ctx, ssl->handshake->randbytes, 64)) != 0) {
8746*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_md_update", ret);
8747*62c56f98SSadaf Ebrahimi goto exit;
8748*62c56f98SSadaf Ebrahimi }
8749*62c56f98SSadaf Ebrahimi if ((ret = mbedtls_md_update(&ctx, data, data_len)) != 0) {
8750*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_md_update", ret);
8751*62c56f98SSadaf Ebrahimi goto exit;
8752*62c56f98SSadaf Ebrahimi }
8753*62c56f98SSadaf Ebrahimi if ((ret = mbedtls_md_finish(&ctx, hash)) != 0) {
8754*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_md_finish", ret);
8755*62c56f98SSadaf Ebrahimi goto exit;
8756*62c56f98SSadaf Ebrahimi }
8757*62c56f98SSadaf Ebrahimi
8758*62c56f98SSadaf Ebrahimi exit:
8759*62c56f98SSadaf Ebrahimi mbedtls_md_free(&ctx);
8760*62c56f98SSadaf Ebrahimi
8761*62c56f98SSadaf Ebrahimi if (ret != 0) {
8762*62c56f98SSadaf Ebrahimi mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
8763*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR);
8764*62c56f98SSadaf Ebrahimi }
8765*62c56f98SSadaf Ebrahimi
8766*62c56f98SSadaf Ebrahimi return ret;
8767*62c56f98SSadaf Ebrahimi }
8768*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_USE_PSA_CRYPTO */
8769*62c56f98SSadaf Ebrahimi
8770*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
8771*62c56f98SSadaf Ebrahimi
8772*62c56f98SSadaf Ebrahimi /* Find the preferred hash for a given signature algorithm. */
mbedtls_ssl_tls12_get_preferred_hash_for_sig_alg(mbedtls_ssl_context * ssl,unsigned int sig_alg)8773*62c56f98SSadaf Ebrahimi unsigned int mbedtls_ssl_tls12_get_preferred_hash_for_sig_alg(
8774*62c56f98SSadaf Ebrahimi mbedtls_ssl_context *ssl,
8775*62c56f98SSadaf Ebrahimi unsigned int sig_alg)
8776*62c56f98SSadaf Ebrahimi {
8777*62c56f98SSadaf Ebrahimi unsigned int i;
8778*62c56f98SSadaf Ebrahimi uint16_t *received_sig_algs = ssl->handshake->received_sig_algs;
8779*62c56f98SSadaf Ebrahimi
8780*62c56f98SSadaf Ebrahimi if (sig_alg == MBEDTLS_SSL_SIG_ANON) {
8781*62c56f98SSadaf Ebrahimi return MBEDTLS_SSL_HASH_NONE;
8782*62c56f98SSadaf Ebrahimi }
8783*62c56f98SSadaf Ebrahimi
8784*62c56f98SSadaf Ebrahimi for (i = 0; received_sig_algs[i] != MBEDTLS_TLS_SIG_NONE; i++) {
8785*62c56f98SSadaf Ebrahimi unsigned int hash_alg_received =
8786*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_TLS12_HASH_ALG_FROM_SIG_AND_HASH_ALG(
8787*62c56f98SSadaf Ebrahimi received_sig_algs[i]);
8788*62c56f98SSadaf Ebrahimi unsigned int sig_alg_received =
8789*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_TLS12_SIG_ALG_FROM_SIG_AND_HASH_ALG(
8790*62c56f98SSadaf Ebrahimi received_sig_algs[i]);
8791*62c56f98SSadaf Ebrahimi
8792*62c56f98SSadaf Ebrahimi mbedtls_md_type_t md_alg =
8793*62c56f98SSadaf Ebrahimi mbedtls_ssl_md_alg_from_hash((unsigned char) hash_alg_received);
8794*62c56f98SSadaf Ebrahimi if (md_alg == MBEDTLS_MD_NONE) {
8795*62c56f98SSadaf Ebrahimi continue;
8796*62c56f98SSadaf Ebrahimi }
8797*62c56f98SSadaf Ebrahimi
8798*62c56f98SSadaf Ebrahimi if (sig_alg == sig_alg_received) {
8799*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO)
8800*62c56f98SSadaf Ebrahimi if (ssl->handshake->key_cert && ssl->handshake->key_cert->key) {
8801*62c56f98SSadaf Ebrahimi psa_algorithm_t psa_hash_alg =
8802*62c56f98SSadaf Ebrahimi mbedtls_md_psa_alg_from_type(md_alg);
8803*62c56f98SSadaf Ebrahimi
8804*62c56f98SSadaf Ebrahimi if (sig_alg_received == MBEDTLS_SSL_SIG_ECDSA &&
8805*62c56f98SSadaf Ebrahimi !mbedtls_pk_can_do_ext(ssl->handshake->key_cert->key,
8806*62c56f98SSadaf Ebrahimi PSA_ALG_ECDSA(psa_hash_alg),
8807*62c56f98SSadaf Ebrahimi PSA_KEY_USAGE_SIGN_HASH)) {
8808*62c56f98SSadaf Ebrahimi continue;
8809*62c56f98SSadaf Ebrahimi }
8810*62c56f98SSadaf Ebrahimi
8811*62c56f98SSadaf Ebrahimi if (sig_alg_received == MBEDTLS_SSL_SIG_RSA &&
8812*62c56f98SSadaf Ebrahimi !mbedtls_pk_can_do_ext(ssl->handshake->key_cert->key,
8813*62c56f98SSadaf Ebrahimi PSA_ALG_RSA_PKCS1V15_SIGN(
8814*62c56f98SSadaf Ebrahimi psa_hash_alg),
8815*62c56f98SSadaf Ebrahimi PSA_KEY_USAGE_SIGN_HASH)) {
8816*62c56f98SSadaf Ebrahimi continue;
8817*62c56f98SSadaf Ebrahimi }
8818*62c56f98SSadaf Ebrahimi }
8819*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_USE_PSA_CRYPTO */
8820*62c56f98SSadaf Ebrahimi
8821*62c56f98SSadaf Ebrahimi return hash_alg_received;
8822*62c56f98SSadaf Ebrahimi }
8823*62c56f98SSadaf Ebrahimi }
8824*62c56f98SSadaf Ebrahimi
8825*62c56f98SSadaf Ebrahimi return MBEDTLS_SSL_HASH_NONE;
8826*62c56f98SSadaf Ebrahimi }
8827*62c56f98SSadaf Ebrahimi
8828*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
8829*62c56f98SSadaf Ebrahimi
8830*62c56f98SSadaf Ebrahimi /* Serialization of TLS 1.2 sessions:
8831*62c56f98SSadaf Ebrahimi *
8832*62c56f98SSadaf Ebrahimi * struct {
8833*62c56f98SSadaf Ebrahimi * uint64 start_time;
8834*62c56f98SSadaf Ebrahimi * uint8 ciphersuite[2]; // defined by the standard
8835*62c56f98SSadaf Ebrahimi * uint8 session_id_len; // at most 32
8836*62c56f98SSadaf Ebrahimi * opaque session_id[32];
8837*62c56f98SSadaf Ebrahimi * opaque master[48]; // fixed length in the standard
8838*62c56f98SSadaf Ebrahimi * uint32 verify_result;
8839*62c56f98SSadaf Ebrahimi * opaque peer_cert<0..2^24-1>; // length 0 means no peer cert
8840*62c56f98SSadaf Ebrahimi * opaque ticket<0..2^24-1>; // length 0 means no ticket
8841*62c56f98SSadaf Ebrahimi * uint32 ticket_lifetime;
8842*62c56f98SSadaf Ebrahimi * uint8 mfl_code; // up to 255 according to standard
8843*62c56f98SSadaf Ebrahimi * uint8 encrypt_then_mac; // 0 or 1
8844*62c56f98SSadaf Ebrahimi * } serialized_session_tls12;
8845*62c56f98SSadaf Ebrahimi *
8846*62c56f98SSadaf Ebrahimi */
ssl_tls12_session_save(const mbedtls_ssl_session * session,unsigned char * buf,size_t buf_len)8847*62c56f98SSadaf Ebrahimi static size_t ssl_tls12_session_save(const mbedtls_ssl_session *session,
8848*62c56f98SSadaf Ebrahimi unsigned char *buf,
8849*62c56f98SSadaf Ebrahimi size_t buf_len)
8850*62c56f98SSadaf Ebrahimi {
8851*62c56f98SSadaf Ebrahimi unsigned char *p = buf;
8852*62c56f98SSadaf Ebrahimi size_t used = 0;
8853*62c56f98SSadaf Ebrahimi
8854*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_HAVE_TIME)
8855*62c56f98SSadaf Ebrahimi uint64_t start;
8856*62c56f98SSadaf Ebrahimi #endif
8857*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_X509_CRT_PARSE_C)
8858*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
8859*62c56f98SSadaf Ebrahimi size_t cert_len;
8860*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
8861*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_X509_CRT_PARSE_C */
8862*62c56f98SSadaf Ebrahimi
8863*62c56f98SSadaf Ebrahimi /*
8864*62c56f98SSadaf Ebrahimi * Time
8865*62c56f98SSadaf Ebrahimi */
8866*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_HAVE_TIME)
8867*62c56f98SSadaf Ebrahimi used += 8;
8868*62c56f98SSadaf Ebrahimi
8869*62c56f98SSadaf Ebrahimi if (used <= buf_len) {
8870*62c56f98SSadaf Ebrahimi start = (uint64_t) session->start;
8871*62c56f98SSadaf Ebrahimi
8872*62c56f98SSadaf Ebrahimi MBEDTLS_PUT_UINT64_BE(start, p, 0);
8873*62c56f98SSadaf Ebrahimi p += 8;
8874*62c56f98SSadaf Ebrahimi }
8875*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_HAVE_TIME */
8876*62c56f98SSadaf Ebrahimi
8877*62c56f98SSadaf Ebrahimi /*
8878*62c56f98SSadaf Ebrahimi * Basic mandatory fields
8879*62c56f98SSadaf Ebrahimi */
8880*62c56f98SSadaf Ebrahimi used += 2 /* ciphersuite */
8881*62c56f98SSadaf Ebrahimi + 1 /* id_len */
8882*62c56f98SSadaf Ebrahimi + sizeof(session->id)
8883*62c56f98SSadaf Ebrahimi + sizeof(session->master)
8884*62c56f98SSadaf Ebrahimi + 4; /* verify_result */
8885*62c56f98SSadaf Ebrahimi
8886*62c56f98SSadaf Ebrahimi if (used <= buf_len) {
8887*62c56f98SSadaf Ebrahimi MBEDTLS_PUT_UINT16_BE(session->ciphersuite, p, 0);
8888*62c56f98SSadaf Ebrahimi p += 2;
8889*62c56f98SSadaf Ebrahimi
8890*62c56f98SSadaf Ebrahimi *p++ = MBEDTLS_BYTE_0(session->id_len);
8891*62c56f98SSadaf Ebrahimi memcpy(p, session->id, 32);
8892*62c56f98SSadaf Ebrahimi p += 32;
8893*62c56f98SSadaf Ebrahimi
8894*62c56f98SSadaf Ebrahimi memcpy(p, session->master, 48);
8895*62c56f98SSadaf Ebrahimi p += 48;
8896*62c56f98SSadaf Ebrahimi
8897*62c56f98SSadaf Ebrahimi MBEDTLS_PUT_UINT32_BE(session->verify_result, p, 0);
8898*62c56f98SSadaf Ebrahimi p += 4;
8899*62c56f98SSadaf Ebrahimi }
8900*62c56f98SSadaf Ebrahimi
8901*62c56f98SSadaf Ebrahimi /*
8902*62c56f98SSadaf Ebrahimi * Peer's end-entity certificate
8903*62c56f98SSadaf Ebrahimi */
8904*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_X509_CRT_PARSE_C)
8905*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
8906*62c56f98SSadaf Ebrahimi if (session->peer_cert == NULL) {
8907*62c56f98SSadaf Ebrahimi cert_len = 0;
8908*62c56f98SSadaf Ebrahimi } else {
8909*62c56f98SSadaf Ebrahimi cert_len = session->peer_cert->raw.len;
8910*62c56f98SSadaf Ebrahimi }
8911*62c56f98SSadaf Ebrahimi
8912*62c56f98SSadaf Ebrahimi used += 3 + cert_len;
8913*62c56f98SSadaf Ebrahimi
8914*62c56f98SSadaf Ebrahimi if (used <= buf_len) {
8915*62c56f98SSadaf Ebrahimi *p++ = MBEDTLS_BYTE_2(cert_len);
8916*62c56f98SSadaf Ebrahimi *p++ = MBEDTLS_BYTE_1(cert_len);
8917*62c56f98SSadaf Ebrahimi *p++ = MBEDTLS_BYTE_0(cert_len);
8918*62c56f98SSadaf Ebrahimi
8919*62c56f98SSadaf Ebrahimi if (session->peer_cert != NULL) {
8920*62c56f98SSadaf Ebrahimi memcpy(p, session->peer_cert->raw.p, cert_len);
8921*62c56f98SSadaf Ebrahimi p += cert_len;
8922*62c56f98SSadaf Ebrahimi }
8923*62c56f98SSadaf Ebrahimi }
8924*62c56f98SSadaf Ebrahimi #else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
8925*62c56f98SSadaf Ebrahimi if (session->peer_cert_digest != NULL) {
8926*62c56f98SSadaf Ebrahimi used += 1 /* type */ + 1 /* length */ + session->peer_cert_digest_len;
8927*62c56f98SSadaf Ebrahimi if (used <= buf_len) {
8928*62c56f98SSadaf Ebrahimi *p++ = (unsigned char) session->peer_cert_digest_type;
8929*62c56f98SSadaf Ebrahimi *p++ = (unsigned char) session->peer_cert_digest_len;
8930*62c56f98SSadaf Ebrahimi memcpy(p, session->peer_cert_digest,
8931*62c56f98SSadaf Ebrahimi session->peer_cert_digest_len);
8932*62c56f98SSadaf Ebrahimi p += session->peer_cert_digest_len;
8933*62c56f98SSadaf Ebrahimi }
8934*62c56f98SSadaf Ebrahimi } else {
8935*62c56f98SSadaf Ebrahimi used += 2;
8936*62c56f98SSadaf Ebrahimi if (used <= buf_len) {
8937*62c56f98SSadaf Ebrahimi *p++ = (unsigned char) MBEDTLS_MD_NONE;
8938*62c56f98SSadaf Ebrahimi *p++ = 0;
8939*62c56f98SSadaf Ebrahimi }
8940*62c56f98SSadaf Ebrahimi }
8941*62c56f98SSadaf Ebrahimi #endif /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
8942*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_X509_CRT_PARSE_C */
8943*62c56f98SSadaf Ebrahimi
8944*62c56f98SSadaf Ebrahimi /*
8945*62c56f98SSadaf Ebrahimi * Session ticket if any, plus associated data
8946*62c56f98SSadaf Ebrahimi */
8947*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C)
8948*62c56f98SSadaf Ebrahimi used += 3 + session->ticket_len + 4; /* len + ticket + lifetime */
8949*62c56f98SSadaf Ebrahimi
8950*62c56f98SSadaf Ebrahimi if (used <= buf_len) {
8951*62c56f98SSadaf Ebrahimi *p++ = MBEDTLS_BYTE_2(session->ticket_len);
8952*62c56f98SSadaf Ebrahimi *p++ = MBEDTLS_BYTE_1(session->ticket_len);
8953*62c56f98SSadaf Ebrahimi *p++ = MBEDTLS_BYTE_0(session->ticket_len);
8954*62c56f98SSadaf Ebrahimi
8955*62c56f98SSadaf Ebrahimi if (session->ticket != NULL) {
8956*62c56f98SSadaf Ebrahimi memcpy(p, session->ticket, session->ticket_len);
8957*62c56f98SSadaf Ebrahimi p += session->ticket_len;
8958*62c56f98SSadaf Ebrahimi }
8959*62c56f98SSadaf Ebrahimi
8960*62c56f98SSadaf Ebrahimi MBEDTLS_PUT_UINT32_BE(session->ticket_lifetime, p, 0);
8961*62c56f98SSadaf Ebrahimi p += 4;
8962*62c56f98SSadaf Ebrahimi }
8963*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_CLI_C */
8964*62c56f98SSadaf Ebrahimi
8965*62c56f98SSadaf Ebrahimi /*
8966*62c56f98SSadaf Ebrahimi * Misc extension-related info
8967*62c56f98SSadaf Ebrahimi */
8968*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
8969*62c56f98SSadaf Ebrahimi used += 1;
8970*62c56f98SSadaf Ebrahimi
8971*62c56f98SSadaf Ebrahimi if (used <= buf_len) {
8972*62c56f98SSadaf Ebrahimi *p++ = session->mfl_code;
8973*62c56f98SSadaf Ebrahimi }
8974*62c56f98SSadaf Ebrahimi #endif
8975*62c56f98SSadaf Ebrahimi
8976*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
8977*62c56f98SSadaf Ebrahimi used += 1;
8978*62c56f98SSadaf Ebrahimi
8979*62c56f98SSadaf Ebrahimi if (used <= buf_len) {
8980*62c56f98SSadaf Ebrahimi *p++ = MBEDTLS_BYTE_0(session->encrypt_then_mac);
8981*62c56f98SSadaf Ebrahimi }
8982*62c56f98SSadaf Ebrahimi #endif
8983*62c56f98SSadaf Ebrahimi
8984*62c56f98SSadaf Ebrahimi return used;
8985*62c56f98SSadaf Ebrahimi }
8986*62c56f98SSadaf Ebrahimi
8987*62c56f98SSadaf Ebrahimi MBEDTLS_CHECK_RETURN_CRITICAL
ssl_tls12_session_load(mbedtls_ssl_session * session,const unsigned char * buf,size_t len)8988*62c56f98SSadaf Ebrahimi static int ssl_tls12_session_load(mbedtls_ssl_session *session,
8989*62c56f98SSadaf Ebrahimi const unsigned char *buf,
8990*62c56f98SSadaf Ebrahimi size_t len)
8991*62c56f98SSadaf Ebrahimi {
8992*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_HAVE_TIME)
8993*62c56f98SSadaf Ebrahimi uint64_t start;
8994*62c56f98SSadaf Ebrahimi #endif
8995*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_X509_CRT_PARSE_C)
8996*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
8997*62c56f98SSadaf Ebrahimi size_t cert_len;
8998*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
8999*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_X509_CRT_PARSE_C */
9000*62c56f98SSadaf Ebrahimi
9001*62c56f98SSadaf Ebrahimi const unsigned char *p = buf;
9002*62c56f98SSadaf Ebrahimi const unsigned char * const end = buf + len;
9003*62c56f98SSadaf Ebrahimi
9004*62c56f98SSadaf Ebrahimi /*
9005*62c56f98SSadaf Ebrahimi * Time
9006*62c56f98SSadaf Ebrahimi */
9007*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_HAVE_TIME)
9008*62c56f98SSadaf Ebrahimi if (8 > (size_t) (end - p)) {
9009*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
9010*62c56f98SSadaf Ebrahimi }
9011*62c56f98SSadaf Ebrahimi
9012*62c56f98SSadaf Ebrahimi start = MBEDTLS_GET_UINT64_BE(p, 0);
9013*62c56f98SSadaf Ebrahimi p += 8;
9014*62c56f98SSadaf Ebrahimi
9015*62c56f98SSadaf Ebrahimi session->start = (time_t) start;
9016*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_HAVE_TIME */
9017*62c56f98SSadaf Ebrahimi
9018*62c56f98SSadaf Ebrahimi /*
9019*62c56f98SSadaf Ebrahimi * Basic mandatory fields
9020*62c56f98SSadaf Ebrahimi */
9021*62c56f98SSadaf Ebrahimi if (2 + 1 + 32 + 48 + 4 > (size_t) (end - p)) {
9022*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
9023*62c56f98SSadaf Ebrahimi }
9024*62c56f98SSadaf Ebrahimi
9025*62c56f98SSadaf Ebrahimi session->ciphersuite = (p[0] << 8) | p[1];
9026*62c56f98SSadaf Ebrahimi p += 2;
9027*62c56f98SSadaf Ebrahimi
9028*62c56f98SSadaf Ebrahimi session->id_len = *p++;
9029*62c56f98SSadaf Ebrahimi memcpy(session->id, p, 32);
9030*62c56f98SSadaf Ebrahimi p += 32;
9031*62c56f98SSadaf Ebrahimi
9032*62c56f98SSadaf Ebrahimi memcpy(session->master, p, 48);
9033*62c56f98SSadaf Ebrahimi p += 48;
9034*62c56f98SSadaf Ebrahimi
9035*62c56f98SSadaf Ebrahimi session->verify_result = MBEDTLS_GET_UINT32_BE(p, 0);
9036*62c56f98SSadaf Ebrahimi p += 4;
9037*62c56f98SSadaf Ebrahimi
9038*62c56f98SSadaf Ebrahimi /* Immediately clear invalid pointer values that have been read, in case
9039*62c56f98SSadaf Ebrahimi * we exit early before we replaced them with valid ones. */
9040*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_X509_CRT_PARSE_C)
9041*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
9042*62c56f98SSadaf Ebrahimi session->peer_cert = NULL;
9043*62c56f98SSadaf Ebrahimi #else
9044*62c56f98SSadaf Ebrahimi session->peer_cert_digest = NULL;
9045*62c56f98SSadaf Ebrahimi #endif /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
9046*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_X509_CRT_PARSE_C */
9047*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C)
9048*62c56f98SSadaf Ebrahimi session->ticket = NULL;
9049*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_CLI_C */
9050*62c56f98SSadaf Ebrahimi
9051*62c56f98SSadaf Ebrahimi /*
9052*62c56f98SSadaf Ebrahimi * Peer certificate
9053*62c56f98SSadaf Ebrahimi */
9054*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_X509_CRT_PARSE_C)
9055*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
9056*62c56f98SSadaf Ebrahimi /* Deserialize CRT from the end of the ticket. */
9057*62c56f98SSadaf Ebrahimi if (3 > (size_t) (end - p)) {
9058*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
9059*62c56f98SSadaf Ebrahimi }
9060*62c56f98SSadaf Ebrahimi
9061*62c56f98SSadaf Ebrahimi cert_len = (p[0] << 16) | (p[1] << 8) | p[2];
9062*62c56f98SSadaf Ebrahimi p += 3;
9063*62c56f98SSadaf Ebrahimi
9064*62c56f98SSadaf Ebrahimi if (cert_len != 0) {
9065*62c56f98SSadaf Ebrahimi int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
9066*62c56f98SSadaf Ebrahimi
9067*62c56f98SSadaf Ebrahimi if (cert_len > (size_t) (end - p)) {
9068*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
9069*62c56f98SSadaf Ebrahimi }
9070*62c56f98SSadaf Ebrahimi
9071*62c56f98SSadaf Ebrahimi session->peer_cert = mbedtls_calloc(1, sizeof(mbedtls_x509_crt));
9072*62c56f98SSadaf Ebrahimi
9073*62c56f98SSadaf Ebrahimi if (session->peer_cert == NULL) {
9074*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_ALLOC_FAILED;
9075*62c56f98SSadaf Ebrahimi }
9076*62c56f98SSadaf Ebrahimi
9077*62c56f98SSadaf Ebrahimi mbedtls_x509_crt_init(session->peer_cert);
9078*62c56f98SSadaf Ebrahimi
9079*62c56f98SSadaf Ebrahimi if ((ret = mbedtls_x509_crt_parse_der(session->peer_cert,
9080*62c56f98SSadaf Ebrahimi p, cert_len)) != 0) {
9081*62c56f98SSadaf Ebrahimi mbedtls_x509_crt_free(session->peer_cert);
9082*62c56f98SSadaf Ebrahimi mbedtls_free(session->peer_cert);
9083*62c56f98SSadaf Ebrahimi session->peer_cert = NULL;
9084*62c56f98SSadaf Ebrahimi return ret;
9085*62c56f98SSadaf Ebrahimi }
9086*62c56f98SSadaf Ebrahimi
9087*62c56f98SSadaf Ebrahimi p += cert_len;
9088*62c56f98SSadaf Ebrahimi }
9089*62c56f98SSadaf Ebrahimi #else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
9090*62c56f98SSadaf Ebrahimi /* Deserialize CRT digest from the end of the ticket. */
9091*62c56f98SSadaf Ebrahimi if (2 > (size_t) (end - p)) {
9092*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
9093*62c56f98SSadaf Ebrahimi }
9094*62c56f98SSadaf Ebrahimi
9095*62c56f98SSadaf Ebrahimi session->peer_cert_digest_type = (mbedtls_md_type_t) *p++;
9096*62c56f98SSadaf Ebrahimi session->peer_cert_digest_len = (size_t) *p++;
9097*62c56f98SSadaf Ebrahimi
9098*62c56f98SSadaf Ebrahimi if (session->peer_cert_digest_len != 0) {
9099*62c56f98SSadaf Ebrahimi const mbedtls_md_info_t *md_info =
9100*62c56f98SSadaf Ebrahimi mbedtls_md_info_from_type(session->peer_cert_digest_type);
9101*62c56f98SSadaf Ebrahimi if (md_info == NULL) {
9102*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
9103*62c56f98SSadaf Ebrahimi }
9104*62c56f98SSadaf Ebrahimi if (session->peer_cert_digest_len != mbedtls_md_get_size(md_info)) {
9105*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
9106*62c56f98SSadaf Ebrahimi }
9107*62c56f98SSadaf Ebrahimi
9108*62c56f98SSadaf Ebrahimi if (session->peer_cert_digest_len > (size_t) (end - p)) {
9109*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
9110*62c56f98SSadaf Ebrahimi }
9111*62c56f98SSadaf Ebrahimi
9112*62c56f98SSadaf Ebrahimi session->peer_cert_digest =
9113*62c56f98SSadaf Ebrahimi mbedtls_calloc(1, session->peer_cert_digest_len);
9114*62c56f98SSadaf Ebrahimi if (session->peer_cert_digest == NULL) {
9115*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_ALLOC_FAILED;
9116*62c56f98SSadaf Ebrahimi }
9117*62c56f98SSadaf Ebrahimi
9118*62c56f98SSadaf Ebrahimi memcpy(session->peer_cert_digest, p,
9119*62c56f98SSadaf Ebrahimi session->peer_cert_digest_len);
9120*62c56f98SSadaf Ebrahimi p += session->peer_cert_digest_len;
9121*62c56f98SSadaf Ebrahimi }
9122*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
9123*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_X509_CRT_PARSE_C */
9124*62c56f98SSadaf Ebrahimi
9125*62c56f98SSadaf Ebrahimi /*
9126*62c56f98SSadaf Ebrahimi * Session ticket and associated data
9127*62c56f98SSadaf Ebrahimi */
9128*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C)
9129*62c56f98SSadaf Ebrahimi if (3 > (size_t) (end - p)) {
9130*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
9131*62c56f98SSadaf Ebrahimi }
9132*62c56f98SSadaf Ebrahimi
9133*62c56f98SSadaf Ebrahimi session->ticket_len = (p[0] << 16) | (p[1] << 8) | p[2];
9134*62c56f98SSadaf Ebrahimi p += 3;
9135*62c56f98SSadaf Ebrahimi
9136*62c56f98SSadaf Ebrahimi if (session->ticket_len != 0) {
9137*62c56f98SSadaf Ebrahimi if (session->ticket_len > (size_t) (end - p)) {
9138*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
9139*62c56f98SSadaf Ebrahimi }
9140*62c56f98SSadaf Ebrahimi
9141*62c56f98SSadaf Ebrahimi session->ticket = mbedtls_calloc(1, session->ticket_len);
9142*62c56f98SSadaf Ebrahimi if (session->ticket == NULL) {
9143*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_ALLOC_FAILED;
9144*62c56f98SSadaf Ebrahimi }
9145*62c56f98SSadaf Ebrahimi
9146*62c56f98SSadaf Ebrahimi memcpy(session->ticket, p, session->ticket_len);
9147*62c56f98SSadaf Ebrahimi p += session->ticket_len;
9148*62c56f98SSadaf Ebrahimi }
9149*62c56f98SSadaf Ebrahimi
9150*62c56f98SSadaf Ebrahimi if (4 > (size_t) (end - p)) {
9151*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
9152*62c56f98SSadaf Ebrahimi }
9153*62c56f98SSadaf Ebrahimi
9154*62c56f98SSadaf Ebrahimi session->ticket_lifetime = MBEDTLS_GET_UINT32_BE(p, 0);
9155*62c56f98SSadaf Ebrahimi p += 4;
9156*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_CLI_C */
9157*62c56f98SSadaf Ebrahimi
9158*62c56f98SSadaf Ebrahimi /*
9159*62c56f98SSadaf Ebrahimi * Misc extension-related info
9160*62c56f98SSadaf Ebrahimi */
9161*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
9162*62c56f98SSadaf Ebrahimi if (1 > (size_t) (end - p)) {
9163*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
9164*62c56f98SSadaf Ebrahimi }
9165*62c56f98SSadaf Ebrahimi
9166*62c56f98SSadaf Ebrahimi session->mfl_code = *p++;
9167*62c56f98SSadaf Ebrahimi #endif
9168*62c56f98SSadaf Ebrahimi
9169*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
9170*62c56f98SSadaf Ebrahimi if (1 > (size_t) (end - p)) {
9171*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
9172*62c56f98SSadaf Ebrahimi }
9173*62c56f98SSadaf Ebrahimi
9174*62c56f98SSadaf Ebrahimi session->encrypt_then_mac = *p++;
9175*62c56f98SSadaf Ebrahimi #endif
9176*62c56f98SSadaf Ebrahimi
9177*62c56f98SSadaf Ebrahimi /* Done, should have consumed entire buffer */
9178*62c56f98SSadaf Ebrahimi if (p != end) {
9179*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
9180*62c56f98SSadaf Ebrahimi }
9181*62c56f98SSadaf Ebrahimi
9182*62c56f98SSadaf Ebrahimi return 0;
9183*62c56f98SSadaf Ebrahimi }
9184*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
9185*62c56f98SSadaf Ebrahimi
mbedtls_ssl_validate_ciphersuite(const mbedtls_ssl_context * ssl,const mbedtls_ssl_ciphersuite_t * suite_info,mbedtls_ssl_protocol_version min_tls_version,mbedtls_ssl_protocol_version max_tls_version)9186*62c56f98SSadaf Ebrahimi int mbedtls_ssl_validate_ciphersuite(
9187*62c56f98SSadaf Ebrahimi const mbedtls_ssl_context *ssl,
9188*62c56f98SSadaf Ebrahimi const mbedtls_ssl_ciphersuite_t *suite_info,
9189*62c56f98SSadaf Ebrahimi mbedtls_ssl_protocol_version min_tls_version,
9190*62c56f98SSadaf Ebrahimi mbedtls_ssl_protocol_version max_tls_version)
9191*62c56f98SSadaf Ebrahimi {
9192*62c56f98SSadaf Ebrahimi (void) ssl;
9193*62c56f98SSadaf Ebrahimi
9194*62c56f98SSadaf Ebrahimi if (suite_info == NULL) {
9195*62c56f98SSadaf Ebrahimi return -1;
9196*62c56f98SSadaf Ebrahimi }
9197*62c56f98SSadaf Ebrahimi
9198*62c56f98SSadaf Ebrahimi if ((suite_info->min_tls_version > max_tls_version) ||
9199*62c56f98SSadaf Ebrahimi (suite_info->max_tls_version < min_tls_version)) {
9200*62c56f98SSadaf Ebrahimi return -1;
9201*62c56f98SSadaf Ebrahimi }
9202*62c56f98SSadaf Ebrahimi
9203*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_TLS1_2) && defined(MBEDTLS_SSL_CLI_C)
9204*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
9205*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO)
9206*62c56f98SSadaf Ebrahimi if (suite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE &&
9207*62c56f98SSadaf Ebrahimi ssl->handshake->psa_pake_ctx_is_ok != 1)
9208*62c56f98SSadaf Ebrahimi #else
9209*62c56f98SSadaf Ebrahimi if (suite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE &&
9210*62c56f98SSadaf Ebrahimi mbedtls_ecjpake_check(&ssl->handshake->ecjpake_ctx) != 0)
9211*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_USE_PSA_CRYPTO */
9212*62c56f98SSadaf Ebrahimi {
9213*62c56f98SSadaf Ebrahimi return -1;
9214*62c56f98SSadaf Ebrahimi }
9215*62c56f98SSadaf Ebrahimi #endif
9216*62c56f98SSadaf Ebrahimi
9217*62c56f98SSadaf Ebrahimi /* Don't suggest PSK-based ciphersuite if no PSK is available. */
9218*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
9219*62c56f98SSadaf Ebrahimi if (mbedtls_ssl_ciphersuite_uses_psk(suite_info) &&
9220*62c56f98SSadaf Ebrahimi mbedtls_ssl_conf_has_static_psk(ssl->conf) == 0) {
9221*62c56f98SSadaf Ebrahimi return -1;
9222*62c56f98SSadaf Ebrahimi }
9223*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */
9224*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
9225*62c56f98SSadaf Ebrahimi
9226*62c56f98SSadaf Ebrahimi return 0;
9227*62c56f98SSadaf Ebrahimi }
9228*62c56f98SSadaf Ebrahimi
9229*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED)
9230*62c56f98SSadaf Ebrahimi /*
9231*62c56f98SSadaf Ebrahimi * Function for writing a signature algorithm extension.
9232*62c56f98SSadaf Ebrahimi *
9233*62c56f98SSadaf Ebrahimi * The `extension_data` field of signature algorithm contains a `SignatureSchemeList`
9234*62c56f98SSadaf Ebrahimi * value (TLS 1.3 RFC8446):
9235*62c56f98SSadaf Ebrahimi * enum {
9236*62c56f98SSadaf Ebrahimi * ....
9237*62c56f98SSadaf Ebrahimi * ecdsa_secp256r1_sha256( 0x0403 ),
9238*62c56f98SSadaf Ebrahimi * ecdsa_secp384r1_sha384( 0x0503 ),
9239*62c56f98SSadaf Ebrahimi * ecdsa_secp521r1_sha512( 0x0603 ),
9240*62c56f98SSadaf Ebrahimi * ....
9241*62c56f98SSadaf Ebrahimi * } SignatureScheme;
9242*62c56f98SSadaf Ebrahimi *
9243*62c56f98SSadaf Ebrahimi * struct {
9244*62c56f98SSadaf Ebrahimi * SignatureScheme supported_signature_algorithms<2..2^16-2>;
9245*62c56f98SSadaf Ebrahimi * } SignatureSchemeList;
9246*62c56f98SSadaf Ebrahimi *
9247*62c56f98SSadaf Ebrahimi * The `extension_data` field of signature algorithm contains a `SignatureAndHashAlgorithm`
9248*62c56f98SSadaf Ebrahimi * value (TLS 1.2 RFC5246):
9249*62c56f98SSadaf Ebrahimi * enum {
9250*62c56f98SSadaf Ebrahimi * none(0), md5(1), sha1(2), sha224(3), sha256(4), sha384(5),
9251*62c56f98SSadaf Ebrahimi * sha512(6), (255)
9252*62c56f98SSadaf Ebrahimi * } HashAlgorithm;
9253*62c56f98SSadaf Ebrahimi *
9254*62c56f98SSadaf Ebrahimi * enum { anonymous(0), rsa(1), dsa(2), ecdsa(3), (255) }
9255*62c56f98SSadaf Ebrahimi * SignatureAlgorithm;
9256*62c56f98SSadaf Ebrahimi *
9257*62c56f98SSadaf Ebrahimi * struct {
9258*62c56f98SSadaf Ebrahimi * HashAlgorithm hash;
9259*62c56f98SSadaf Ebrahimi * SignatureAlgorithm signature;
9260*62c56f98SSadaf Ebrahimi * } SignatureAndHashAlgorithm;
9261*62c56f98SSadaf Ebrahimi *
9262*62c56f98SSadaf Ebrahimi * SignatureAndHashAlgorithm
9263*62c56f98SSadaf Ebrahimi * supported_signature_algorithms<2..2^16-2>;
9264*62c56f98SSadaf Ebrahimi *
9265*62c56f98SSadaf Ebrahimi * The TLS 1.3 signature algorithm extension was defined to be a compatible
9266*62c56f98SSadaf Ebrahimi * generalization of the TLS 1.2 signature algorithm extension.
9267*62c56f98SSadaf Ebrahimi * `SignatureAndHashAlgorithm` field of TLS 1.2 can be represented by
9268*62c56f98SSadaf Ebrahimi * `SignatureScheme` field of TLS 1.3
9269*62c56f98SSadaf Ebrahimi *
9270*62c56f98SSadaf Ebrahimi */
mbedtls_ssl_write_sig_alg_ext(mbedtls_ssl_context * ssl,unsigned char * buf,const unsigned char * end,size_t * out_len)9271*62c56f98SSadaf Ebrahimi int mbedtls_ssl_write_sig_alg_ext(mbedtls_ssl_context *ssl, unsigned char *buf,
9272*62c56f98SSadaf Ebrahimi const unsigned char *end, size_t *out_len)
9273*62c56f98SSadaf Ebrahimi {
9274*62c56f98SSadaf Ebrahimi unsigned char *p = buf;
9275*62c56f98SSadaf Ebrahimi unsigned char *supported_sig_alg; /* Start of supported_signature_algorithms */
9276*62c56f98SSadaf Ebrahimi size_t supported_sig_alg_len = 0; /* Length of supported_signature_algorithms */
9277*62c56f98SSadaf Ebrahimi
9278*62c56f98SSadaf Ebrahimi *out_len = 0;
9279*62c56f98SSadaf Ebrahimi
9280*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(3, ("adding signature_algorithms extension"));
9281*62c56f98SSadaf Ebrahimi
9282*62c56f98SSadaf Ebrahimi /* Check if we have space for header and length field:
9283*62c56f98SSadaf Ebrahimi * - extension_type (2 bytes)
9284*62c56f98SSadaf Ebrahimi * - extension_data_length (2 bytes)
9285*62c56f98SSadaf Ebrahimi * - supported_signature_algorithms_length (2 bytes)
9286*62c56f98SSadaf Ebrahimi */
9287*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_CHK_BUF_PTR(p, end, 6);
9288*62c56f98SSadaf Ebrahimi p += 6;
9289*62c56f98SSadaf Ebrahimi
9290*62c56f98SSadaf Ebrahimi /*
9291*62c56f98SSadaf Ebrahimi * Write supported_signature_algorithms
9292*62c56f98SSadaf Ebrahimi */
9293*62c56f98SSadaf Ebrahimi supported_sig_alg = p;
9294*62c56f98SSadaf Ebrahimi const uint16_t *sig_alg = mbedtls_ssl_get_sig_algs(ssl);
9295*62c56f98SSadaf Ebrahimi if (sig_alg == NULL) {
9296*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_CONFIG;
9297*62c56f98SSadaf Ebrahimi }
9298*62c56f98SSadaf Ebrahimi
9299*62c56f98SSadaf Ebrahimi for (; *sig_alg != MBEDTLS_TLS1_3_SIG_NONE; sig_alg++) {
9300*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(3, ("got signature scheme [%x] %s",
9301*62c56f98SSadaf Ebrahimi *sig_alg,
9302*62c56f98SSadaf Ebrahimi mbedtls_ssl_sig_alg_to_str(*sig_alg)));
9303*62c56f98SSadaf Ebrahimi if (!mbedtls_ssl_sig_alg_is_supported(ssl, *sig_alg)) {
9304*62c56f98SSadaf Ebrahimi continue;
9305*62c56f98SSadaf Ebrahimi }
9306*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_CHK_BUF_PTR(p, end, 2);
9307*62c56f98SSadaf Ebrahimi MBEDTLS_PUT_UINT16_BE(*sig_alg, p, 0);
9308*62c56f98SSadaf Ebrahimi p += 2;
9309*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(3, ("sent signature scheme [%x] %s",
9310*62c56f98SSadaf Ebrahimi *sig_alg,
9311*62c56f98SSadaf Ebrahimi mbedtls_ssl_sig_alg_to_str(*sig_alg)));
9312*62c56f98SSadaf Ebrahimi }
9313*62c56f98SSadaf Ebrahimi
9314*62c56f98SSadaf Ebrahimi /* Length of supported_signature_algorithms */
9315*62c56f98SSadaf Ebrahimi supported_sig_alg_len = p - supported_sig_alg;
9316*62c56f98SSadaf Ebrahimi if (supported_sig_alg_len == 0) {
9317*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(1, ("No signature algorithms defined."));
9318*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
9319*62c56f98SSadaf Ebrahimi }
9320*62c56f98SSadaf Ebrahimi
9321*62c56f98SSadaf Ebrahimi MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_SIG_ALG, buf, 0);
9322*62c56f98SSadaf Ebrahimi MBEDTLS_PUT_UINT16_BE(supported_sig_alg_len + 2, buf, 2);
9323*62c56f98SSadaf Ebrahimi MBEDTLS_PUT_UINT16_BE(supported_sig_alg_len, buf, 4);
9324*62c56f98SSadaf Ebrahimi
9325*62c56f98SSadaf Ebrahimi *out_len = p - buf;
9326*62c56f98SSadaf Ebrahimi
9327*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_TLS1_3)
9328*62c56f98SSadaf Ebrahimi mbedtls_ssl_tls13_set_hs_sent_ext_mask(ssl, MBEDTLS_TLS_EXT_SIG_ALG);
9329*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
9330*62c56f98SSadaf Ebrahimi
9331*62c56f98SSadaf Ebrahimi return 0;
9332*62c56f98SSadaf Ebrahimi }
9333*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED */
9334*62c56f98SSadaf Ebrahimi
9335*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
9336*62c56f98SSadaf Ebrahimi /*
9337*62c56f98SSadaf Ebrahimi * mbedtls_ssl_parse_server_name_ext
9338*62c56f98SSadaf Ebrahimi *
9339*62c56f98SSadaf Ebrahimi * Structure of server_name extension:
9340*62c56f98SSadaf Ebrahimi *
9341*62c56f98SSadaf Ebrahimi * enum {
9342*62c56f98SSadaf Ebrahimi * host_name(0), (255)
9343*62c56f98SSadaf Ebrahimi * } NameType;
9344*62c56f98SSadaf Ebrahimi * opaque HostName<1..2^16-1>;
9345*62c56f98SSadaf Ebrahimi *
9346*62c56f98SSadaf Ebrahimi * struct {
9347*62c56f98SSadaf Ebrahimi * NameType name_type;
9348*62c56f98SSadaf Ebrahimi * select (name_type) {
9349*62c56f98SSadaf Ebrahimi * case host_name: HostName;
9350*62c56f98SSadaf Ebrahimi * } name;
9351*62c56f98SSadaf Ebrahimi * } ServerName;
9352*62c56f98SSadaf Ebrahimi * struct {
9353*62c56f98SSadaf Ebrahimi * ServerName server_name_list<1..2^16-1>
9354*62c56f98SSadaf Ebrahimi * } ServerNameList;
9355*62c56f98SSadaf Ebrahimi */
9356*62c56f98SSadaf Ebrahimi MBEDTLS_CHECK_RETURN_CRITICAL
mbedtls_ssl_parse_server_name_ext(mbedtls_ssl_context * ssl,const unsigned char * buf,const unsigned char * end)9357*62c56f98SSadaf Ebrahimi int mbedtls_ssl_parse_server_name_ext(mbedtls_ssl_context *ssl,
9358*62c56f98SSadaf Ebrahimi const unsigned char *buf,
9359*62c56f98SSadaf Ebrahimi const unsigned char *end)
9360*62c56f98SSadaf Ebrahimi {
9361*62c56f98SSadaf Ebrahimi int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
9362*62c56f98SSadaf Ebrahimi const unsigned char *p = buf;
9363*62c56f98SSadaf Ebrahimi size_t server_name_list_len, hostname_len;
9364*62c56f98SSadaf Ebrahimi const unsigned char *server_name_list_end;
9365*62c56f98SSadaf Ebrahimi
9366*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(3, ("parse ServerName extension"));
9367*62c56f98SSadaf Ebrahimi
9368*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 2);
9369*62c56f98SSadaf Ebrahimi server_name_list_len = MBEDTLS_GET_UINT16_BE(p, 0);
9370*62c56f98SSadaf Ebrahimi p += 2;
9371*62c56f98SSadaf Ebrahimi
9372*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, server_name_list_len);
9373*62c56f98SSadaf Ebrahimi server_name_list_end = p + server_name_list_len;
9374*62c56f98SSadaf Ebrahimi while (p < server_name_list_end) {
9375*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_CHK_BUF_READ_PTR(p, server_name_list_end, 3);
9376*62c56f98SSadaf Ebrahimi hostname_len = MBEDTLS_GET_UINT16_BE(p, 1);
9377*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_CHK_BUF_READ_PTR(p, server_name_list_end,
9378*62c56f98SSadaf Ebrahimi hostname_len + 3);
9379*62c56f98SSadaf Ebrahimi
9380*62c56f98SSadaf Ebrahimi if (p[0] == MBEDTLS_TLS_EXT_SERVERNAME_HOSTNAME) {
9381*62c56f98SSadaf Ebrahimi /* sni_name is intended to be used only during the parsing of the
9382*62c56f98SSadaf Ebrahimi * ClientHello message (it is reset to NULL before the end of
9383*62c56f98SSadaf Ebrahimi * the message parsing). Thus it is ok to just point to the
9384*62c56f98SSadaf Ebrahimi * reception buffer and not make a copy of it.
9385*62c56f98SSadaf Ebrahimi */
9386*62c56f98SSadaf Ebrahimi ssl->handshake->sni_name = p + 3;
9387*62c56f98SSadaf Ebrahimi ssl->handshake->sni_name_len = hostname_len;
9388*62c56f98SSadaf Ebrahimi if (ssl->conf->f_sni == NULL) {
9389*62c56f98SSadaf Ebrahimi return 0;
9390*62c56f98SSadaf Ebrahimi }
9391*62c56f98SSadaf Ebrahimi ret = ssl->conf->f_sni(ssl->conf->p_sni,
9392*62c56f98SSadaf Ebrahimi ssl, p + 3, hostname_len);
9393*62c56f98SSadaf Ebrahimi if (ret != 0) {
9394*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_RET(1, "ssl_sni_wrapper", ret);
9395*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_UNRECOGNIZED_NAME,
9396*62c56f98SSadaf Ebrahimi MBEDTLS_ERR_SSL_UNRECOGNIZED_NAME);
9397*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_UNRECOGNIZED_NAME;
9398*62c56f98SSadaf Ebrahimi }
9399*62c56f98SSadaf Ebrahimi return 0;
9400*62c56f98SSadaf Ebrahimi }
9401*62c56f98SSadaf Ebrahimi
9402*62c56f98SSadaf Ebrahimi p += hostname_len + 3;
9403*62c56f98SSadaf Ebrahimi }
9404*62c56f98SSadaf Ebrahimi
9405*62c56f98SSadaf Ebrahimi return 0;
9406*62c56f98SSadaf Ebrahimi }
9407*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
9408*62c56f98SSadaf Ebrahimi
9409*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_ALPN)
9410*62c56f98SSadaf Ebrahimi MBEDTLS_CHECK_RETURN_CRITICAL
mbedtls_ssl_parse_alpn_ext(mbedtls_ssl_context * ssl,const unsigned char * buf,const unsigned char * end)9411*62c56f98SSadaf Ebrahimi int mbedtls_ssl_parse_alpn_ext(mbedtls_ssl_context *ssl,
9412*62c56f98SSadaf Ebrahimi const unsigned char *buf,
9413*62c56f98SSadaf Ebrahimi const unsigned char *end)
9414*62c56f98SSadaf Ebrahimi {
9415*62c56f98SSadaf Ebrahimi const unsigned char *p = buf;
9416*62c56f98SSadaf Ebrahimi size_t protocol_name_list_len;
9417*62c56f98SSadaf Ebrahimi const unsigned char *protocol_name_list;
9418*62c56f98SSadaf Ebrahimi const unsigned char *protocol_name_list_end;
9419*62c56f98SSadaf Ebrahimi size_t protocol_name_len;
9420*62c56f98SSadaf Ebrahimi
9421*62c56f98SSadaf Ebrahimi /* If ALPN not configured, just ignore the extension */
9422*62c56f98SSadaf Ebrahimi if (ssl->conf->alpn_list == NULL) {
9423*62c56f98SSadaf Ebrahimi return 0;
9424*62c56f98SSadaf Ebrahimi }
9425*62c56f98SSadaf Ebrahimi
9426*62c56f98SSadaf Ebrahimi /*
9427*62c56f98SSadaf Ebrahimi * RFC7301, section 3.1
9428*62c56f98SSadaf Ebrahimi * opaque ProtocolName<1..2^8-1>;
9429*62c56f98SSadaf Ebrahimi *
9430*62c56f98SSadaf Ebrahimi * struct {
9431*62c56f98SSadaf Ebrahimi * ProtocolName protocol_name_list<2..2^16-1>
9432*62c56f98SSadaf Ebrahimi * } ProtocolNameList;
9433*62c56f98SSadaf Ebrahimi */
9434*62c56f98SSadaf Ebrahimi
9435*62c56f98SSadaf Ebrahimi /*
9436*62c56f98SSadaf Ebrahimi * protocol_name_list_len 2 bytes
9437*62c56f98SSadaf Ebrahimi * protocol_name_len 1 bytes
9438*62c56f98SSadaf Ebrahimi * protocol_name >=1 byte
9439*62c56f98SSadaf Ebrahimi */
9440*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 4);
9441*62c56f98SSadaf Ebrahimi
9442*62c56f98SSadaf Ebrahimi protocol_name_list_len = MBEDTLS_GET_UINT16_BE(p, 0);
9443*62c56f98SSadaf Ebrahimi p += 2;
9444*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, protocol_name_list_len);
9445*62c56f98SSadaf Ebrahimi protocol_name_list = p;
9446*62c56f98SSadaf Ebrahimi protocol_name_list_end = p + protocol_name_list_len;
9447*62c56f98SSadaf Ebrahimi
9448*62c56f98SSadaf Ebrahimi /* Validate peer's list (lengths) */
9449*62c56f98SSadaf Ebrahimi while (p < protocol_name_list_end) {
9450*62c56f98SSadaf Ebrahimi protocol_name_len = *p++;
9451*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_CHK_BUF_READ_PTR(p, protocol_name_list_end,
9452*62c56f98SSadaf Ebrahimi protocol_name_len);
9453*62c56f98SSadaf Ebrahimi if (protocol_name_len == 0) {
9454*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_PEND_FATAL_ALERT(
9455*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER,
9456*62c56f98SSadaf Ebrahimi MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER);
9457*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
9458*62c56f98SSadaf Ebrahimi }
9459*62c56f98SSadaf Ebrahimi
9460*62c56f98SSadaf Ebrahimi p += protocol_name_len;
9461*62c56f98SSadaf Ebrahimi }
9462*62c56f98SSadaf Ebrahimi
9463*62c56f98SSadaf Ebrahimi /* Use our order of preference */
9464*62c56f98SSadaf Ebrahimi for (const char **alpn = ssl->conf->alpn_list; *alpn != NULL; alpn++) {
9465*62c56f98SSadaf Ebrahimi size_t const alpn_len = strlen(*alpn);
9466*62c56f98SSadaf Ebrahimi p = protocol_name_list;
9467*62c56f98SSadaf Ebrahimi while (p < protocol_name_list_end) {
9468*62c56f98SSadaf Ebrahimi protocol_name_len = *p++;
9469*62c56f98SSadaf Ebrahimi if (protocol_name_len == alpn_len &&
9470*62c56f98SSadaf Ebrahimi memcmp(p, *alpn, alpn_len) == 0) {
9471*62c56f98SSadaf Ebrahimi ssl->alpn_chosen = *alpn;
9472*62c56f98SSadaf Ebrahimi return 0;
9473*62c56f98SSadaf Ebrahimi }
9474*62c56f98SSadaf Ebrahimi
9475*62c56f98SSadaf Ebrahimi p += protocol_name_len;
9476*62c56f98SSadaf Ebrahimi }
9477*62c56f98SSadaf Ebrahimi }
9478*62c56f98SSadaf Ebrahimi
9479*62c56f98SSadaf Ebrahimi /* If we get here, no match was found */
9480*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_PEND_FATAL_ALERT(
9481*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_ALERT_MSG_NO_APPLICATION_PROTOCOL,
9482*62c56f98SSadaf Ebrahimi MBEDTLS_ERR_SSL_NO_APPLICATION_PROTOCOL);
9483*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_NO_APPLICATION_PROTOCOL;
9484*62c56f98SSadaf Ebrahimi }
9485*62c56f98SSadaf Ebrahimi
mbedtls_ssl_write_alpn_ext(mbedtls_ssl_context * ssl,unsigned char * buf,unsigned char * end,size_t * out_len)9486*62c56f98SSadaf Ebrahimi int mbedtls_ssl_write_alpn_ext(mbedtls_ssl_context *ssl,
9487*62c56f98SSadaf Ebrahimi unsigned char *buf,
9488*62c56f98SSadaf Ebrahimi unsigned char *end,
9489*62c56f98SSadaf Ebrahimi size_t *out_len)
9490*62c56f98SSadaf Ebrahimi {
9491*62c56f98SSadaf Ebrahimi unsigned char *p = buf;
9492*62c56f98SSadaf Ebrahimi size_t protocol_name_len;
9493*62c56f98SSadaf Ebrahimi *out_len = 0;
9494*62c56f98SSadaf Ebrahimi
9495*62c56f98SSadaf Ebrahimi if (ssl->alpn_chosen == NULL) {
9496*62c56f98SSadaf Ebrahimi return 0;
9497*62c56f98SSadaf Ebrahimi }
9498*62c56f98SSadaf Ebrahimi
9499*62c56f98SSadaf Ebrahimi protocol_name_len = strlen(ssl->alpn_chosen);
9500*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_CHK_BUF_PTR(p, end, 7 + protocol_name_len);
9501*62c56f98SSadaf Ebrahimi
9502*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(3, ("server side, adding alpn extension"));
9503*62c56f98SSadaf Ebrahimi /*
9504*62c56f98SSadaf Ebrahimi * 0 . 1 ext identifier
9505*62c56f98SSadaf Ebrahimi * 2 . 3 ext length
9506*62c56f98SSadaf Ebrahimi * 4 . 5 protocol list length
9507*62c56f98SSadaf Ebrahimi * 6 . 6 protocol name length
9508*62c56f98SSadaf Ebrahimi * 7 . 7+n protocol name
9509*62c56f98SSadaf Ebrahimi */
9510*62c56f98SSadaf Ebrahimi MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_ALPN, p, 0);
9511*62c56f98SSadaf Ebrahimi
9512*62c56f98SSadaf Ebrahimi *out_len = 7 + protocol_name_len;
9513*62c56f98SSadaf Ebrahimi
9514*62c56f98SSadaf Ebrahimi MBEDTLS_PUT_UINT16_BE(protocol_name_len + 3, p, 2);
9515*62c56f98SSadaf Ebrahimi MBEDTLS_PUT_UINT16_BE(protocol_name_len + 1, p, 4);
9516*62c56f98SSadaf Ebrahimi /* Note: the length of the chosen protocol has been checked to be less
9517*62c56f98SSadaf Ebrahimi * than 255 bytes in `mbedtls_ssl_conf_alpn_protocols`.
9518*62c56f98SSadaf Ebrahimi */
9519*62c56f98SSadaf Ebrahimi p[6] = MBEDTLS_BYTE_0(protocol_name_len);
9520*62c56f98SSadaf Ebrahimi
9521*62c56f98SSadaf Ebrahimi memcpy(p + 7, ssl->alpn_chosen, protocol_name_len);
9522*62c56f98SSadaf Ebrahimi
9523*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_TLS1_3)
9524*62c56f98SSadaf Ebrahimi mbedtls_ssl_tls13_set_hs_sent_ext_mask(ssl, MBEDTLS_TLS_EXT_ALPN);
9525*62c56f98SSadaf Ebrahimi #endif
9526*62c56f98SSadaf Ebrahimi
9527*62c56f98SSadaf Ebrahimi return 0;
9528*62c56f98SSadaf Ebrahimi }
9529*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_ALPN */
9530*62c56f98SSadaf Ebrahimi
9531*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_TLS1_3) && \
9532*62c56f98SSadaf Ebrahimi defined(MBEDTLS_SSL_SESSION_TICKETS) && \
9533*62c56f98SSadaf Ebrahimi defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) && \
9534*62c56f98SSadaf Ebrahimi defined(MBEDTLS_SSL_CLI_C)
mbedtls_ssl_session_set_hostname(mbedtls_ssl_session * session,const char * hostname)9535*62c56f98SSadaf Ebrahimi int mbedtls_ssl_session_set_hostname(mbedtls_ssl_session *session,
9536*62c56f98SSadaf Ebrahimi const char *hostname)
9537*62c56f98SSadaf Ebrahimi {
9538*62c56f98SSadaf Ebrahimi /* Initialize to suppress unnecessary compiler warning */
9539*62c56f98SSadaf Ebrahimi size_t hostname_len = 0;
9540*62c56f98SSadaf Ebrahimi
9541*62c56f98SSadaf Ebrahimi /* Check if new hostname is valid before
9542*62c56f98SSadaf Ebrahimi * making any change to current one */
9543*62c56f98SSadaf Ebrahimi if (hostname != NULL) {
9544*62c56f98SSadaf Ebrahimi hostname_len = strlen(hostname);
9545*62c56f98SSadaf Ebrahimi
9546*62c56f98SSadaf Ebrahimi if (hostname_len > MBEDTLS_SSL_MAX_HOST_NAME_LEN) {
9547*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
9548*62c56f98SSadaf Ebrahimi }
9549*62c56f98SSadaf Ebrahimi }
9550*62c56f98SSadaf Ebrahimi
9551*62c56f98SSadaf Ebrahimi /* Now it's clear that we will overwrite the old hostname,
9552*62c56f98SSadaf Ebrahimi * so we can free it safely */
9553*62c56f98SSadaf Ebrahimi if (session->hostname != NULL) {
9554*62c56f98SSadaf Ebrahimi mbedtls_zeroize_and_free(session->hostname,
9555*62c56f98SSadaf Ebrahimi strlen(session->hostname));
9556*62c56f98SSadaf Ebrahimi }
9557*62c56f98SSadaf Ebrahimi
9558*62c56f98SSadaf Ebrahimi /* Passing NULL as hostname shall clear the old one */
9559*62c56f98SSadaf Ebrahimi if (hostname == NULL) {
9560*62c56f98SSadaf Ebrahimi session->hostname = NULL;
9561*62c56f98SSadaf Ebrahimi } else {
9562*62c56f98SSadaf Ebrahimi session->hostname = mbedtls_calloc(1, hostname_len + 1);
9563*62c56f98SSadaf Ebrahimi if (session->hostname == NULL) {
9564*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_ALLOC_FAILED;
9565*62c56f98SSadaf Ebrahimi }
9566*62c56f98SSadaf Ebrahimi
9567*62c56f98SSadaf Ebrahimi memcpy(session->hostname, hostname, hostname_len);
9568*62c56f98SSadaf Ebrahimi }
9569*62c56f98SSadaf Ebrahimi
9570*62c56f98SSadaf Ebrahimi return 0;
9571*62c56f98SSadaf Ebrahimi }
9572*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_PROTO_TLS1_3 &&
9573*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_SESSION_TICKETS &&
9574*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_SERVER_NAME_INDICATION &&
9575*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_CLI_C */
9576*62c56f98SSadaf Ebrahimi
9577*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_TLS_C */
9578