1*62c56f98SSadaf Ebrahimi /*
2*62c56f98SSadaf Ebrahimi * TLS 1.3 functionality shared between client and server
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 #include "common.h"
9*62c56f98SSadaf Ebrahimi
10*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_TLS_C) && defined(MBEDTLS_SSL_PROTO_TLS1_3)
11*62c56f98SSadaf Ebrahimi
12*62c56f98SSadaf Ebrahimi #include <string.h>
13*62c56f98SSadaf Ebrahimi
14*62c56f98SSadaf Ebrahimi #include "mbedtls/error.h"
15*62c56f98SSadaf Ebrahimi #include "mbedtls/debug.h"
16*62c56f98SSadaf Ebrahimi #include "mbedtls/oid.h"
17*62c56f98SSadaf Ebrahimi #include "mbedtls/platform.h"
18*62c56f98SSadaf Ebrahimi #include "mbedtls/constant_time.h"
19*62c56f98SSadaf Ebrahimi #include "psa/crypto.h"
20*62c56f98SSadaf Ebrahimi #include "md_psa.h"
21*62c56f98SSadaf Ebrahimi
22*62c56f98SSadaf Ebrahimi #include "ssl_misc.h"
23*62c56f98SSadaf Ebrahimi #include "ssl_tls13_invasive.h"
24*62c56f98SSadaf Ebrahimi #include "ssl_tls13_keys.h"
25*62c56f98SSadaf Ebrahimi #include "ssl_debug_helpers.h"
26*62c56f98SSadaf Ebrahimi
27*62c56f98SSadaf Ebrahimi #include "psa/crypto.h"
28*62c56f98SSadaf Ebrahimi #include "psa_util_internal.h"
29*62c56f98SSadaf Ebrahimi
30*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_EPHEMERAL_ENABLED)
31*62c56f98SSadaf Ebrahimi /* Define a local translating function to save code size by not using too many
32*62c56f98SSadaf Ebrahimi * arguments in each translating place. */
local_err_translation(psa_status_t status)33*62c56f98SSadaf Ebrahimi static int local_err_translation(psa_status_t status)
34*62c56f98SSadaf Ebrahimi {
35*62c56f98SSadaf Ebrahimi return psa_status_to_mbedtls(status, psa_to_ssl_errors,
36*62c56f98SSadaf Ebrahimi ARRAY_LENGTH(psa_to_ssl_errors),
37*62c56f98SSadaf Ebrahimi psa_generic_status_to_mbedtls);
38*62c56f98SSadaf Ebrahimi }
39*62c56f98SSadaf Ebrahimi #define PSA_TO_MBEDTLS_ERR(status) local_err_translation(status)
40*62c56f98SSadaf Ebrahimi #endif
41*62c56f98SSadaf Ebrahimi
42*62c56f98SSadaf Ebrahimi const uint8_t mbedtls_ssl_tls13_hello_retry_request_magic[
43*62c56f98SSadaf Ebrahimi MBEDTLS_SERVER_HELLO_RANDOM_LEN] =
44*62c56f98SSadaf Ebrahimi { 0xCF, 0x21, 0xAD, 0x74, 0xE5, 0x9A, 0x61, 0x11,
45*62c56f98SSadaf Ebrahimi 0xBE, 0x1D, 0x8C, 0x02, 0x1E, 0x65, 0xB8, 0x91,
46*62c56f98SSadaf Ebrahimi 0xC2, 0xA2, 0x11, 0x16, 0x7A, 0xBB, 0x8C, 0x5E,
47*62c56f98SSadaf Ebrahimi 0x07, 0x9E, 0x09, 0xE2, 0xC8, 0xA8, 0x33, 0x9C };
48*62c56f98SSadaf Ebrahimi
mbedtls_ssl_tls13_fetch_handshake_msg(mbedtls_ssl_context * ssl,unsigned hs_type,unsigned char ** buf,size_t * buf_len)49*62c56f98SSadaf Ebrahimi int mbedtls_ssl_tls13_fetch_handshake_msg(mbedtls_ssl_context *ssl,
50*62c56f98SSadaf Ebrahimi unsigned hs_type,
51*62c56f98SSadaf Ebrahimi unsigned char **buf,
52*62c56f98SSadaf Ebrahimi size_t *buf_len)
53*62c56f98SSadaf Ebrahimi {
54*62c56f98SSadaf Ebrahimi int ret;
55*62c56f98SSadaf Ebrahimi
56*62c56f98SSadaf Ebrahimi if ((ret = mbedtls_ssl_read_record(ssl, 0)) != 0) {
57*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_read_record", ret);
58*62c56f98SSadaf Ebrahimi goto cleanup;
59*62c56f98SSadaf Ebrahimi }
60*62c56f98SSadaf Ebrahimi
61*62c56f98SSadaf Ebrahimi if (ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE ||
62*62c56f98SSadaf Ebrahimi ssl->in_msg[0] != hs_type) {
63*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(1, ("Receive unexpected handshake message."));
64*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE,
65*62c56f98SSadaf Ebrahimi MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE);
66*62c56f98SSadaf Ebrahimi ret = MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
67*62c56f98SSadaf Ebrahimi goto cleanup;
68*62c56f98SSadaf Ebrahimi }
69*62c56f98SSadaf Ebrahimi
70*62c56f98SSadaf Ebrahimi /*
71*62c56f98SSadaf Ebrahimi * Jump handshake header (4 bytes, see Section 4 of RFC 8446).
72*62c56f98SSadaf Ebrahimi * ...
73*62c56f98SSadaf Ebrahimi * HandshakeType msg_type;
74*62c56f98SSadaf Ebrahimi * uint24 length;
75*62c56f98SSadaf Ebrahimi * ...
76*62c56f98SSadaf Ebrahimi */
77*62c56f98SSadaf Ebrahimi *buf = ssl->in_msg + 4;
78*62c56f98SSadaf Ebrahimi *buf_len = ssl->in_hslen - 4;
79*62c56f98SSadaf Ebrahimi
80*62c56f98SSadaf Ebrahimi cleanup:
81*62c56f98SSadaf Ebrahimi
82*62c56f98SSadaf Ebrahimi return ret;
83*62c56f98SSadaf Ebrahimi }
84*62c56f98SSadaf Ebrahimi
mbedtls_ssl_tls13_is_supported_versions_ext_present_in_exts(mbedtls_ssl_context * ssl,const unsigned char * buf,const unsigned char * end,const unsigned char ** supported_versions_data,const unsigned char ** supported_versions_data_end)85*62c56f98SSadaf Ebrahimi int mbedtls_ssl_tls13_is_supported_versions_ext_present_in_exts(
86*62c56f98SSadaf Ebrahimi mbedtls_ssl_context *ssl,
87*62c56f98SSadaf Ebrahimi const unsigned char *buf, const unsigned char *end,
88*62c56f98SSadaf Ebrahimi const unsigned char **supported_versions_data,
89*62c56f98SSadaf Ebrahimi const unsigned char **supported_versions_data_end)
90*62c56f98SSadaf Ebrahimi {
91*62c56f98SSadaf Ebrahimi const unsigned char *p = buf;
92*62c56f98SSadaf Ebrahimi size_t extensions_len;
93*62c56f98SSadaf Ebrahimi const unsigned char *extensions_end;
94*62c56f98SSadaf Ebrahimi
95*62c56f98SSadaf Ebrahimi *supported_versions_data = NULL;
96*62c56f98SSadaf Ebrahimi *supported_versions_data_end = NULL;
97*62c56f98SSadaf Ebrahimi
98*62c56f98SSadaf Ebrahimi /* Case of no extension */
99*62c56f98SSadaf Ebrahimi if (p == end) {
100*62c56f98SSadaf Ebrahimi return 0;
101*62c56f98SSadaf Ebrahimi }
102*62c56f98SSadaf Ebrahimi
103*62c56f98SSadaf Ebrahimi /* ...
104*62c56f98SSadaf Ebrahimi * Extension extensions<x..2^16-1>;
105*62c56f98SSadaf Ebrahimi * ...
106*62c56f98SSadaf Ebrahimi * struct {
107*62c56f98SSadaf Ebrahimi * ExtensionType extension_type; (2 bytes)
108*62c56f98SSadaf Ebrahimi * opaque extension_data<0..2^16-1>;
109*62c56f98SSadaf Ebrahimi * } Extension;
110*62c56f98SSadaf Ebrahimi */
111*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 2);
112*62c56f98SSadaf Ebrahimi extensions_len = MBEDTLS_GET_UINT16_BE(p, 0);
113*62c56f98SSadaf Ebrahimi p += 2;
114*62c56f98SSadaf Ebrahimi
115*62c56f98SSadaf Ebrahimi /* Check extensions do not go beyond the buffer of data. */
116*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, extensions_len);
117*62c56f98SSadaf Ebrahimi extensions_end = p + extensions_len;
118*62c56f98SSadaf Ebrahimi
119*62c56f98SSadaf Ebrahimi while (p < extensions_end) {
120*62c56f98SSadaf Ebrahimi unsigned int extension_type;
121*62c56f98SSadaf Ebrahimi size_t extension_data_len;
122*62c56f98SSadaf Ebrahimi
123*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_CHK_BUF_READ_PTR(p, extensions_end, 4);
124*62c56f98SSadaf Ebrahimi extension_type = MBEDTLS_GET_UINT16_BE(p, 0);
125*62c56f98SSadaf Ebrahimi extension_data_len = MBEDTLS_GET_UINT16_BE(p, 2);
126*62c56f98SSadaf Ebrahimi p += 4;
127*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_CHK_BUF_READ_PTR(p, extensions_end, extension_data_len);
128*62c56f98SSadaf Ebrahimi
129*62c56f98SSadaf Ebrahimi if (extension_type == MBEDTLS_TLS_EXT_SUPPORTED_VERSIONS) {
130*62c56f98SSadaf Ebrahimi *supported_versions_data = p;
131*62c56f98SSadaf Ebrahimi *supported_versions_data_end = p + extension_data_len;
132*62c56f98SSadaf Ebrahimi return 1;
133*62c56f98SSadaf Ebrahimi }
134*62c56f98SSadaf Ebrahimi p += extension_data_len;
135*62c56f98SSadaf Ebrahimi }
136*62c56f98SSadaf Ebrahimi
137*62c56f98SSadaf Ebrahimi return 0;
138*62c56f98SSadaf Ebrahimi }
139*62c56f98SSadaf Ebrahimi
140*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED)
141*62c56f98SSadaf Ebrahimi /*
142*62c56f98SSadaf Ebrahimi * STATE HANDLING: Read CertificateVerify
143*62c56f98SSadaf Ebrahimi */
144*62c56f98SSadaf Ebrahimi /* Macro to express the maximum length of the verify structure.
145*62c56f98SSadaf Ebrahimi *
146*62c56f98SSadaf Ebrahimi * The structure is computed per TLS 1.3 specification as:
147*62c56f98SSadaf Ebrahimi * - 64 bytes of octet 32,
148*62c56f98SSadaf Ebrahimi * - 33 bytes for the context string
149*62c56f98SSadaf Ebrahimi * (which is either "TLS 1.3, client CertificateVerify"
150*62c56f98SSadaf Ebrahimi * or "TLS 1.3, server CertificateVerify"),
151*62c56f98SSadaf Ebrahimi * - 1 byte for the octet 0x0, which serves as a separator,
152*62c56f98SSadaf Ebrahimi * - 32 or 48 bytes for the Transcript-Hash(Handshake Context, Certificate)
153*62c56f98SSadaf Ebrahimi * (depending on the size of the transcript_hash)
154*62c56f98SSadaf Ebrahimi *
155*62c56f98SSadaf Ebrahimi * This results in a total size of
156*62c56f98SSadaf Ebrahimi * - 130 bytes for a SHA256-based transcript hash, or
157*62c56f98SSadaf Ebrahimi * (64 + 33 + 1 + 32 bytes)
158*62c56f98SSadaf Ebrahimi * - 146 bytes for a SHA384-based transcript hash.
159*62c56f98SSadaf Ebrahimi * (64 + 33 + 1 + 48 bytes)
160*62c56f98SSadaf Ebrahimi *
161*62c56f98SSadaf Ebrahimi */
162*62c56f98SSadaf Ebrahimi #define SSL_VERIFY_STRUCT_MAX_SIZE (64 + \
163*62c56f98SSadaf Ebrahimi 33 + \
164*62c56f98SSadaf Ebrahimi 1 + \
165*62c56f98SSadaf Ebrahimi MBEDTLS_TLS1_3_MD_MAX_SIZE \
166*62c56f98SSadaf Ebrahimi )
167*62c56f98SSadaf Ebrahimi
168*62c56f98SSadaf Ebrahimi /*
169*62c56f98SSadaf Ebrahimi * The ssl_tls13_create_verify_structure() creates the verify structure.
170*62c56f98SSadaf Ebrahimi * As input, it requires the transcript hash.
171*62c56f98SSadaf Ebrahimi *
172*62c56f98SSadaf Ebrahimi * The caller has to ensure that the buffer has size at least
173*62c56f98SSadaf Ebrahimi * SSL_VERIFY_STRUCT_MAX_SIZE bytes.
174*62c56f98SSadaf Ebrahimi */
ssl_tls13_create_verify_structure(const unsigned char * transcript_hash,size_t transcript_hash_len,unsigned char * verify_buffer,size_t * verify_buffer_len,int from)175*62c56f98SSadaf Ebrahimi static void ssl_tls13_create_verify_structure(const unsigned char *transcript_hash,
176*62c56f98SSadaf Ebrahimi size_t transcript_hash_len,
177*62c56f98SSadaf Ebrahimi unsigned char *verify_buffer,
178*62c56f98SSadaf Ebrahimi size_t *verify_buffer_len,
179*62c56f98SSadaf Ebrahimi int from)
180*62c56f98SSadaf Ebrahimi {
181*62c56f98SSadaf Ebrahimi size_t idx;
182*62c56f98SSadaf Ebrahimi
183*62c56f98SSadaf Ebrahimi /* RFC 8446, Section 4.4.3:
184*62c56f98SSadaf Ebrahimi *
185*62c56f98SSadaf Ebrahimi * The digital signature [in the CertificateVerify message] is then
186*62c56f98SSadaf Ebrahimi * computed over the concatenation of:
187*62c56f98SSadaf Ebrahimi * - A string that consists of octet 32 (0x20) repeated 64 times
188*62c56f98SSadaf Ebrahimi * - The context string
189*62c56f98SSadaf Ebrahimi * - A single 0 byte which serves as the separator
190*62c56f98SSadaf Ebrahimi * - The content to be signed
191*62c56f98SSadaf Ebrahimi */
192*62c56f98SSadaf Ebrahimi memset(verify_buffer, 0x20, 64);
193*62c56f98SSadaf Ebrahimi idx = 64;
194*62c56f98SSadaf Ebrahimi
195*62c56f98SSadaf Ebrahimi if (from == MBEDTLS_SSL_IS_CLIENT) {
196*62c56f98SSadaf Ebrahimi memcpy(verify_buffer + idx, MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN(client_cv));
197*62c56f98SSadaf Ebrahimi idx += MBEDTLS_SSL_TLS1_3_LBL_LEN(client_cv);
198*62c56f98SSadaf Ebrahimi } else { /* from == MBEDTLS_SSL_IS_SERVER */
199*62c56f98SSadaf Ebrahimi memcpy(verify_buffer + idx, MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN(server_cv));
200*62c56f98SSadaf Ebrahimi idx += MBEDTLS_SSL_TLS1_3_LBL_LEN(server_cv);
201*62c56f98SSadaf Ebrahimi }
202*62c56f98SSadaf Ebrahimi
203*62c56f98SSadaf Ebrahimi verify_buffer[idx++] = 0x0;
204*62c56f98SSadaf Ebrahimi
205*62c56f98SSadaf Ebrahimi memcpy(verify_buffer + idx, transcript_hash, transcript_hash_len);
206*62c56f98SSadaf Ebrahimi idx += transcript_hash_len;
207*62c56f98SSadaf Ebrahimi
208*62c56f98SSadaf Ebrahimi *verify_buffer_len = idx;
209*62c56f98SSadaf Ebrahimi }
210*62c56f98SSadaf Ebrahimi
211*62c56f98SSadaf Ebrahimi MBEDTLS_CHECK_RETURN_CRITICAL
ssl_tls13_parse_certificate_verify(mbedtls_ssl_context * ssl,const unsigned char * buf,const unsigned char * end,const unsigned char * verify_buffer,size_t verify_buffer_len)212*62c56f98SSadaf Ebrahimi static int ssl_tls13_parse_certificate_verify(mbedtls_ssl_context *ssl,
213*62c56f98SSadaf Ebrahimi const unsigned char *buf,
214*62c56f98SSadaf Ebrahimi const unsigned char *end,
215*62c56f98SSadaf Ebrahimi const unsigned char *verify_buffer,
216*62c56f98SSadaf Ebrahimi size_t verify_buffer_len)
217*62c56f98SSadaf Ebrahimi {
218*62c56f98SSadaf Ebrahimi int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
219*62c56f98SSadaf Ebrahimi psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
220*62c56f98SSadaf Ebrahimi const unsigned char *p = buf;
221*62c56f98SSadaf Ebrahimi uint16_t algorithm;
222*62c56f98SSadaf Ebrahimi size_t signature_len;
223*62c56f98SSadaf Ebrahimi mbedtls_pk_type_t sig_alg;
224*62c56f98SSadaf Ebrahimi mbedtls_md_type_t md_alg;
225*62c56f98SSadaf Ebrahimi psa_algorithm_t hash_alg = PSA_ALG_NONE;
226*62c56f98SSadaf Ebrahimi unsigned char verify_hash[PSA_HASH_MAX_SIZE];
227*62c56f98SSadaf Ebrahimi size_t verify_hash_len;
228*62c56f98SSadaf Ebrahimi
229*62c56f98SSadaf Ebrahimi void const *options = NULL;
230*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT)
231*62c56f98SSadaf Ebrahimi mbedtls_pk_rsassa_pss_options rsassa_pss_options;
232*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_X509_RSASSA_PSS_SUPPORT */
233*62c56f98SSadaf Ebrahimi
234*62c56f98SSadaf Ebrahimi /*
235*62c56f98SSadaf Ebrahimi * struct {
236*62c56f98SSadaf Ebrahimi * SignatureScheme algorithm;
237*62c56f98SSadaf Ebrahimi * opaque signature<0..2^16-1>;
238*62c56f98SSadaf Ebrahimi * } CertificateVerify;
239*62c56f98SSadaf Ebrahimi */
240*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 2);
241*62c56f98SSadaf Ebrahimi algorithm = MBEDTLS_GET_UINT16_BE(p, 0);
242*62c56f98SSadaf Ebrahimi p += 2;
243*62c56f98SSadaf Ebrahimi
244*62c56f98SSadaf Ebrahimi /* RFC 8446 section 4.4.3
245*62c56f98SSadaf Ebrahimi *
246*62c56f98SSadaf Ebrahimi * If the CertificateVerify message is sent by a server, the signature
247*62c56f98SSadaf Ebrahimi * algorithm MUST be one offered in the client's "signature_algorithms"
248*62c56f98SSadaf Ebrahimi * extension unless no valid certificate chain can be produced without
249*62c56f98SSadaf Ebrahimi * unsupported algorithms
250*62c56f98SSadaf Ebrahimi *
251*62c56f98SSadaf Ebrahimi * RFC 8446 section 4.4.2.2
252*62c56f98SSadaf Ebrahimi *
253*62c56f98SSadaf Ebrahimi * If the client cannot construct an acceptable chain using the provided
254*62c56f98SSadaf Ebrahimi * certificates and decides to abort the handshake, then it MUST abort the
255*62c56f98SSadaf Ebrahimi * handshake with an appropriate certificate-related alert
256*62c56f98SSadaf Ebrahimi * (by default, "unsupported_certificate").
257*62c56f98SSadaf Ebrahimi *
258*62c56f98SSadaf Ebrahimi * Check if algorithm is an offered signature algorithm.
259*62c56f98SSadaf Ebrahimi */
260*62c56f98SSadaf Ebrahimi if (!mbedtls_ssl_sig_alg_is_offered(ssl, algorithm)) {
261*62c56f98SSadaf Ebrahimi /* algorithm not in offered signature algorithms list */
262*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(1, ("Received signature algorithm(%04x) is not "
263*62c56f98SSadaf Ebrahimi "offered.",
264*62c56f98SSadaf Ebrahimi (unsigned int) algorithm));
265*62c56f98SSadaf Ebrahimi goto error;
266*62c56f98SSadaf Ebrahimi }
267*62c56f98SSadaf Ebrahimi
268*62c56f98SSadaf Ebrahimi if (mbedtls_ssl_get_pk_type_and_md_alg_from_sig_alg(
269*62c56f98SSadaf Ebrahimi algorithm, &sig_alg, &md_alg) != 0) {
270*62c56f98SSadaf Ebrahimi goto error;
271*62c56f98SSadaf Ebrahimi }
272*62c56f98SSadaf Ebrahimi
273*62c56f98SSadaf Ebrahimi hash_alg = mbedtls_md_psa_alg_from_type(md_alg);
274*62c56f98SSadaf Ebrahimi if (hash_alg == 0) {
275*62c56f98SSadaf Ebrahimi goto error;
276*62c56f98SSadaf Ebrahimi }
277*62c56f98SSadaf Ebrahimi
278*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(3, ("Certificate Verify: Signature algorithm ( %04x )",
279*62c56f98SSadaf Ebrahimi (unsigned int) algorithm));
280*62c56f98SSadaf Ebrahimi
281*62c56f98SSadaf Ebrahimi /*
282*62c56f98SSadaf Ebrahimi * Check the certificate's key type matches the signature alg
283*62c56f98SSadaf Ebrahimi */
284*62c56f98SSadaf Ebrahimi if (!mbedtls_pk_can_do(&ssl->session_negotiate->peer_cert->pk, sig_alg)) {
285*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(1, ("signature algorithm doesn't match cert key"));
286*62c56f98SSadaf Ebrahimi goto error;
287*62c56f98SSadaf Ebrahimi }
288*62c56f98SSadaf Ebrahimi
289*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 2);
290*62c56f98SSadaf Ebrahimi signature_len = MBEDTLS_GET_UINT16_BE(p, 0);
291*62c56f98SSadaf Ebrahimi p += 2;
292*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, signature_len);
293*62c56f98SSadaf Ebrahimi
294*62c56f98SSadaf Ebrahimi status = psa_hash_compute(hash_alg,
295*62c56f98SSadaf Ebrahimi verify_buffer,
296*62c56f98SSadaf Ebrahimi verify_buffer_len,
297*62c56f98SSadaf Ebrahimi verify_hash,
298*62c56f98SSadaf Ebrahimi sizeof(verify_hash),
299*62c56f98SSadaf Ebrahimi &verify_hash_len);
300*62c56f98SSadaf Ebrahimi if (status != PSA_SUCCESS) {
301*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_RET(1, "hash computation PSA error", status);
302*62c56f98SSadaf Ebrahimi goto error;
303*62c56f98SSadaf Ebrahimi }
304*62c56f98SSadaf Ebrahimi
305*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_BUF(3, "verify hash", verify_hash, verify_hash_len);
306*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT)
307*62c56f98SSadaf Ebrahimi if (sig_alg == MBEDTLS_PK_RSASSA_PSS) {
308*62c56f98SSadaf Ebrahimi rsassa_pss_options.mgf1_hash_id = md_alg;
309*62c56f98SSadaf Ebrahimi
310*62c56f98SSadaf Ebrahimi rsassa_pss_options.expected_salt_len = PSA_HASH_LENGTH(hash_alg);
311*62c56f98SSadaf Ebrahimi options = (const void *) &rsassa_pss_options;
312*62c56f98SSadaf Ebrahimi }
313*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_X509_RSASSA_PSS_SUPPORT */
314*62c56f98SSadaf Ebrahimi
315*62c56f98SSadaf Ebrahimi if ((ret = mbedtls_pk_verify_ext(sig_alg, options,
316*62c56f98SSadaf Ebrahimi &ssl->session_negotiate->peer_cert->pk,
317*62c56f98SSadaf Ebrahimi md_alg, verify_hash, verify_hash_len,
318*62c56f98SSadaf Ebrahimi p, signature_len)) == 0) {
319*62c56f98SSadaf Ebrahimi return 0;
320*62c56f98SSadaf Ebrahimi }
321*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_pk_verify_ext", ret);
322*62c56f98SSadaf Ebrahimi
323*62c56f98SSadaf Ebrahimi error:
324*62c56f98SSadaf Ebrahimi /* RFC 8446 section 4.4.3
325*62c56f98SSadaf Ebrahimi *
326*62c56f98SSadaf Ebrahimi * If the verification fails, the receiver MUST terminate the handshake
327*62c56f98SSadaf Ebrahimi * with a "decrypt_error" alert.
328*62c56f98SSadaf Ebrahimi */
329*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_DECRYPT_ERROR,
330*62c56f98SSadaf Ebrahimi MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE);
331*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
332*62c56f98SSadaf Ebrahimi
333*62c56f98SSadaf Ebrahimi }
334*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED */
335*62c56f98SSadaf Ebrahimi
mbedtls_ssl_tls13_process_certificate_verify(mbedtls_ssl_context * ssl)336*62c56f98SSadaf Ebrahimi int mbedtls_ssl_tls13_process_certificate_verify(mbedtls_ssl_context *ssl)
337*62c56f98SSadaf Ebrahimi {
338*62c56f98SSadaf Ebrahimi
339*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED)
340*62c56f98SSadaf Ebrahimi int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
341*62c56f98SSadaf Ebrahimi unsigned char verify_buffer[SSL_VERIFY_STRUCT_MAX_SIZE];
342*62c56f98SSadaf Ebrahimi size_t verify_buffer_len;
343*62c56f98SSadaf Ebrahimi unsigned char transcript[MBEDTLS_TLS1_3_MD_MAX_SIZE];
344*62c56f98SSadaf Ebrahimi size_t transcript_len;
345*62c56f98SSadaf Ebrahimi unsigned char *buf;
346*62c56f98SSadaf Ebrahimi size_t buf_len;
347*62c56f98SSadaf Ebrahimi
348*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse certificate verify"));
349*62c56f98SSadaf Ebrahimi
350*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_PROC_CHK(
351*62c56f98SSadaf Ebrahimi mbedtls_ssl_tls13_fetch_handshake_msg(
352*62c56f98SSadaf Ebrahimi ssl, MBEDTLS_SSL_HS_CERTIFICATE_VERIFY, &buf, &buf_len));
353*62c56f98SSadaf Ebrahimi
354*62c56f98SSadaf Ebrahimi /* Need to calculate the hash of the transcript first
355*62c56f98SSadaf Ebrahimi * before reading the message since otherwise it gets
356*62c56f98SSadaf Ebrahimi * included in the transcript
357*62c56f98SSadaf Ebrahimi */
358*62c56f98SSadaf Ebrahimi ret = mbedtls_ssl_get_handshake_transcript(
359*62c56f98SSadaf Ebrahimi ssl,
360*62c56f98SSadaf Ebrahimi ssl->handshake->ciphersuite_info->mac,
361*62c56f98SSadaf Ebrahimi transcript, sizeof(transcript),
362*62c56f98SSadaf Ebrahimi &transcript_len);
363*62c56f98SSadaf Ebrahimi if (ret != 0) {
364*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_PEND_FATAL_ALERT(
365*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR,
366*62c56f98SSadaf Ebrahimi MBEDTLS_ERR_SSL_INTERNAL_ERROR);
367*62c56f98SSadaf Ebrahimi return ret;
368*62c56f98SSadaf Ebrahimi }
369*62c56f98SSadaf Ebrahimi
370*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_BUF(3, "handshake hash", transcript, transcript_len);
371*62c56f98SSadaf Ebrahimi
372*62c56f98SSadaf Ebrahimi /* Create verify structure */
373*62c56f98SSadaf Ebrahimi ssl_tls13_create_verify_structure(transcript,
374*62c56f98SSadaf Ebrahimi transcript_len,
375*62c56f98SSadaf Ebrahimi verify_buffer,
376*62c56f98SSadaf Ebrahimi &verify_buffer_len,
377*62c56f98SSadaf Ebrahimi (ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT) ?
378*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_IS_SERVER :
379*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_IS_CLIENT);
380*62c56f98SSadaf Ebrahimi
381*62c56f98SSadaf Ebrahimi /* Process the message contents */
382*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_PROC_CHK(ssl_tls13_parse_certificate_verify(
383*62c56f98SSadaf Ebrahimi ssl, buf, buf + buf_len,
384*62c56f98SSadaf Ebrahimi verify_buffer, verify_buffer_len));
385*62c56f98SSadaf Ebrahimi
386*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_add_hs_msg_to_checksum(
387*62c56f98SSadaf Ebrahimi ssl, MBEDTLS_SSL_HS_CERTIFICATE_VERIFY,
388*62c56f98SSadaf Ebrahimi buf, buf_len));
389*62c56f98SSadaf Ebrahimi
390*62c56f98SSadaf Ebrahimi cleanup:
391*62c56f98SSadaf Ebrahimi
392*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse certificate verify"));
393*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_tls13_process_certificate_verify", ret);
394*62c56f98SSadaf Ebrahimi return ret;
395*62c56f98SSadaf Ebrahimi #else
396*62c56f98SSadaf Ebrahimi ((void) ssl);
397*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
398*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
399*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED */
400*62c56f98SSadaf Ebrahimi }
401*62c56f98SSadaf Ebrahimi
402*62c56f98SSadaf Ebrahimi /*
403*62c56f98SSadaf Ebrahimi *
404*62c56f98SSadaf Ebrahimi * STATE HANDLING: Incoming Certificate.
405*62c56f98SSadaf Ebrahimi *
406*62c56f98SSadaf Ebrahimi */
407*62c56f98SSadaf Ebrahimi
408*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED)
409*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
410*62c56f98SSadaf Ebrahimi /*
411*62c56f98SSadaf Ebrahimi * Structure of Certificate message:
412*62c56f98SSadaf Ebrahimi *
413*62c56f98SSadaf Ebrahimi * enum {
414*62c56f98SSadaf Ebrahimi * X509(0),
415*62c56f98SSadaf Ebrahimi * RawPublicKey(2),
416*62c56f98SSadaf Ebrahimi * (255)
417*62c56f98SSadaf Ebrahimi * } CertificateType;
418*62c56f98SSadaf Ebrahimi *
419*62c56f98SSadaf Ebrahimi * struct {
420*62c56f98SSadaf Ebrahimi * select (certificate_type) {
421*62c56f98SSadaf Ebrahimi * case RawPublicKey:
422*62c56f98SSadaf Ebrahimi * * From RFC 7250 ASN.1_subjectPublicKeyInfo *
423*62c56f98SSadaf Ebrahimi * opaque ASN1_subjectPublicKeyInfo<1..2^24-1>;
424*62c56f98SSadaf Ebrahimi * case X509:
425*62c56f98SSadaf Ebrahimi * opaque cert_data<1..2^24-1>;
426*62c56f98SSadaf Ebrahimi * };
427*62c56f98SSadaf Ebrahimi * Extension extensions<0..2^16-1>;
428*62c56f98SSadaf Ebrahimi * } CertificateEntry;
429*62c56f98SSadaf Ebrahimi *
430*62c56f98SSadaf Ebrahimi * struct {
431*62c56f98SSadaf Ebrahimi * opaque certificate_request_context<0..2^8-1>;
432*62c56f98SSadaf Ebrahimi * CertificateEntry certificate_list<0..2^24-1>;
433*62c56f98SSadaf Ebrahimi * } Certificate;
434*62c56f98SSadaf Ebrahimi *
435*62c56f98SSadaf Ebrahimi */
436*62c56f98SSadaf Ebrahimi
437*62c56f98SSadaf Ebrahimi /* Parse certificate chain send by the server. */
438*62c56f98SSadaf Ebrahimi MBEDTLS_CHECK_RETURN_CRITICAL
439*62c56f98SSadaf Ebrahimi MBEDTLS_STATIC_TESTABLE
mbedtls_ssl_tls13_parse_certificate(mbedtls_ssl_context * ssl,const unsigned char * buf,const unsigned char * end)440*62c56f98SSadaf Ebrahimi int mbedtls_ssl_tls13_parse_certificate(mbedtls_ssl_context *ssl,
441*62c56f98SSadaf Ebrahimi const unsigned char *buf,
442*62c56f98SSadaf Ebrahimi const unsigned char *end)
443*62c56f98SSadaf Ebrahimi {
444*62c56f98SSadaf Ebrahimi int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
445*62c56f98SSadaf Ebrahimi size_t certificate_request_context_len = 0;
446*62c56f98SSadaf Ebrahimi size_t certificate_list_len = 0;
447*62c56f98SSadaf Ebrahimi const unsigned char *p = buf;
448*62c56f98SSadaf Ebrahimi const unsigned char *certificate_list_end;
449*62c56f98SSadaf Ebrahimi mbedtls_ssl_handshake_params *handshake = ssl->handshake;
450*62c56f98SSadaf Ebrahimi
451*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 4);
452*62c56f98SSadaf Ebrahimi certificate_request_context_len = p[0];
453*62c56f98SSadaf Ebrahimi certificate_list_len = MBEDTLS_GET_UINT24_BE(p, 1);
454*62c56f98SSadaf Ebrahimi p += 4;
455*62c56f98SSadaf Ebrahimi
456*62c56f98SSadaf Ebrahimi /* In theory, the certificate list can be up to 2^24 Bytes, but we don't
457*62c56f98SSadaf Ebrahimi * support anything beyond 2^16 = 64K.
458*62c56f98SSadaf Ebrahimi */
459*62c56f98SSadaf Ebrahimi if ((certificate_request_context_len != 0) ||
460*62c56f98SSadaf Ebrahimi (certificate_list_len >= 0x10000)) {
461*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate message"));
462*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR,
463*62c56f98SSadaf Ebrahimi MBEDTLS_ERR_SSL_DECODE_ERROR);
464*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_DECODE_ERROR;
465*62c56f98SSadaf Ebrahimi }
466*62c56f98SSadaf Ebrahimi
467*62c56f98SSadaf Ebrahimi /* In case we tried to reuse a session but it failed */
468*62c56f98SSadaf Ebrahimi if (ssl->session_negotiate->peer_cert != NULL) {
469*62c56f98SSadaf Ebrahimi mbedtls_x509_crt_free(ssl->session_negotiate->peer_cert);
470*62c56f98SSadaf Ebrahimi mbedtls_free(ssl->session_negotiate->peer_cert);
471*62c56f98SSadaf Ebrahimi }
472*62c56f98SSadaf Ebrahimi
473*62c56f98SSadaf Ebrahimi if (certificate_list_len == 0) {
474*62c56f98SSadaf Ebrahimi ssl->session_negotiate->peer_cert = NULL;
475*62c56f98SSadaf Ebrahimi ret = 0;
476*62c56f98SSadaf Ebrahimi goto exit;
477*62c56f98SSadaf Ebrahimi }
478*62c56f98SSadaf Ebrahimi
479*62c56f98SSadaf Ebrahimi if ((ssl->session_negotiate->peer_cert =
480*62c56f98SSadaf Ebrahimi mbedtls_calloc(1, sizeof(mbedtls_x509_crt))) == NULL) {
481*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(1, ("alloc( %" MBEDTLS_PRINTF_SIZET " bytes ) failed",
482*62c56f98SSadaf Ebrahimi sizeof(mbedtls_x509_crt)));
483*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR,
484*62c56f98SSadaf Ebrahimi MBEDTLS_ERR_SSL_ALLOC_FAILED);
485*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_ALLOC_FAILED;
486*62c56f98SSadaf Ebrahimi }
487*62c56f98SSadaf Ebrahimi
488*62c56f98SSadaf Ebrahimi mbedtls_x509_crt_init(ssl->session_negotiate->peer_cert);
489*62c56f98SSadaf Ebrahimi
490*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, certificate_list_len);
491*62c56f98SSadaf Ebrahimi certificate_list_end = p + certificate_list_len;
492*62c56f98SSadaf Ebrahimi while (p < certificate_list_end) {
493*62c56f98SSadaf Ebrahimi size_t cert_data_len, extensions_len;
494*62c56f98SSadaf Ebrahimi const unsigned char *extensions_end;
495*62c56f98SSadaf Ebrahimi
496*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_CHK_BUF_READ_PTR(p, certificate_list_end, 3);
497*62c56f98SSadaf Ebrahimi cert_data_len = MBEDTLS_GET_UINT24_BE(p, 0);
498*62c56f98SSadaf Ebrahimi p += 3;
499*62c56f98SSadaf Ebrahimi
500*62c56f98SSadaf Ebrahimi /* In theory, the CRT can be up to 2^24 Bytes, but we don't support
501*62c56f98SSadaf Ebrahimi * anything beyond 2^16 = 64K. Otherwise as in the TLS 1.2 code,
502*62c56f98SSadaf Ebrahimi * check that we have a minimum of 128 bytes of data, this is not
503*62c56f98SSadaf Ebrahimi * clear why we need that though.
504*62c56f98SSadaf Ebrahimi */
505*62c56f98SSadaf Ebrahimi if ((cert_data_len < 128) || (cert_data_len >= 0x10000)) {
506*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(1, ("bad Certificate message"));
507*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR,
508*62c56f98SSadaf Ebrahimi MBEDTLS_ERR_SSL_DECODE_ERROR);
509*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_DECODE_ERROR;
510*62c56f98SSadaf Ebrahimi }
511*62c56f98SSadaf Ebrahimi
512*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_CHK_BUF_READ_PTR(p, certificate_list_end, cert_data_len);
513*62c56f98SSadaf Ebrahimi ret = mbedtls_x509_crt_parse_der(ssl->session_negotiate->peer_cert,
514*62c56f98SSadaf Ebrahimi p, cert_data_len);
515*62c56f98SSadaf Ebrahimi
516*62c56f98SSadaf Ebrahimi switch (ret) {
517*62c56f98SSadaf Ebrahimi case 0: /*ok*/
518*62c56f98SSadaf Ebrahimi break;
519*62c56f98SSadaf Ebrahimi case MBEDTLS_ERR_X509_UNKNOWN_SIG_ALG + MBEDTLS_ERR_OID_NOT_FOUND:
520*62c56f98SSadaf Ebrahimi /* Ignore certificate with an unknown algorithm: maybe a
521*62c56f98SSadaf Ebrahimi prior certificate was already trusted. */
522*62c56f98SSadaf Ebrahimi break;
523*62c56f98SSadaf Ebrahimi
524*62c56f98SSadaf Ebrahimi case MBEDTLS_ERR_X509_ALLOC_FAILED:
525*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR,
526*62c56f98SSadaf Ebrahimi MBEDTLS_ERR_X509_ALLOC_FAILED);
527*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_RET(1, " mbedtls_x509_crt_parse_der", ret);
528*62c56f98SSadaf Ebrahimi return ret;
529*62c56f98SSadaf Ebrahimi
530*62c56f98SSadaf Ebrahimi case MBEDTLS_ERR_X509_UNKNOWN_VERSION:
531*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT,
532*62c56f98SSadaf Ebrahimi MBEDTLS_ERR_X509_UNKNOWN_VERSION);
533*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_RET(1, " mbedtls_x509_crt_parse_der", ret);
534*62c56f98SSadaf Ebrahimi return ret;
535*62c56f98SSadaf Ebrahimi
536*62c56f98SSadaf Ebrahimi default:
537*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_BAD_CERT,
538*62c56f98SSadaf Ebrahimi ret);
539*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_RET(1, " mbedtls_x509_crt_parse_der", ret);
540*62c56f98SSadaf Ebrahimi return ret;
541*62c56f98SSadaf Ebrahimi }
542*62c56f98SSadaf Ebrahimi
543*62c56f98SSadaf Ebrahimi p += cert_data_len;
544*62c56f98SSadaf Ebrahimi
545*62c56f98SSadaf Ebrahimi /* Certificate extensions length */
546*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_CHK_BUF_READ_PTR(p, certificate_list_end, 2);
547*62c56f98SSadaf Ebrahimi extensions_len = MBEDTLS_GET_UINT16_BE(p, 0);
548*62c56f98SSadaf Ebrahimi p += 2;
549*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_CHK_BUF_READ_PTR(p, certificate_list_end, extensions_len);
550*62c56f98SSadaf Ebrahimi
551*62c56f98SSadaf Ebrahimi extensions_end = p + extensions_len;
552*62c56f98SSadaf Ebrahimi handshake->received_extensions = MBEDTLS_SSL_EXT_MASK_NONE;
553*62c56f98SSadaf Ebrahimi
554*62c56f98SSadaf Ebrahimi while (p < extensions_end) {
555*62c56f98SSadaf Ebrahimi unsigned int extension_type;
556*62c56f98SSadaf Ebrahimi size_t extension_data_len;
557*62c56f98SSadaf Ebrahimi
558*62c56f98SSadaf Ebrahimi /*
559*62c56f98SSadaf Ebrahimi * struct {
560*62c56f98SSadaf Ebrahimi * ExtensionType extension_type; (2 bytes)
561*62c56f98SSadaf Ebrahimi * opaque extension_data<0..2^16-1>;
562*62c56f98SSadaf Ebrahimi * } Extension;
563*62c56f98SSadaf Ebrahimi */
564*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_CHK_BUF_READ_PTR(p, extensions_end, 4);
565*62c56f98SSadaf Ebrahimi extension_type = MBEDTLS_GET_UINT16_BE(p, 0);
566*62c56f98SSadaf Ebrahimi extension_data_len = MBEDTLS_GET_UINT16_BE(p, 2);
567*62c56f98SSadaf Ebrahimi p += 4;
568*62c56f98SSadaf Ebrahimi
569*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_CHK_BUF_READ_PTR(p, extensions_end, extension_data_len);
570*62c56f98SSadaf Ebrahimi
571*62c56f98SSadaf Ebrahimi ret = mbedtls_ssl_tls13_check_received_extension(
572*62c56f98SSadaf Ebrahimi ssl, MBEDTLS_SSL_HS_CERTIFICATE, extension_type,
573*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_TLS1_3_ALLOWED_EXTS_OF_CT);
574*62c56f98SSadaf Ebrahimi if (ret != 0) {
575*62c56f98SSadaf Ebrahimi return ret;
576*62c56f98SSadaf Ebrahimi }
577*62c56f98SSadaf Ebrahimi
578*62c56f98SSadaf Ebrahimi switch (extension_type) {
579*62c56f98SSadaf Ebrahimi default:
580*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_PRINT_EXT(
581*62c56f98SSadaf Ebrahimi 3, MBEDTLS_SSL_HS_CERTIFICATE,
582*62c56f98SSadaf Ebrahimi extension_type, "( ignored )");
583*62c56f98SSadaf Ebrahimi break;
584*62c56f98SSadaf Ebrahimi }
585*62c56f98SSadaf Ebrahimi
586*62c56f98SSadaf Ebrahimi p += extension_data_len;
587*62c56f98SSadaf Ebrahimi }
588*62c56f98SSadaf Ebrahimi
589*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_PRINT_EXTS(3, MBEDTLS_SSL_HS_CERTIFICATE,
590*62c56f98SSadaf Ebrahimi handshake->received_extensions);
591*62c56f98SSadaf Ebrahimi }
592*62c56f98SSadaf Ebrahimi
593*62c56f98SSadaf Ebrahimi exit:
594*62c56f98SSadaf Ebrahimi /* Check that all the message is consumed. */
595*62c56f98SSadaf Ebrahimi if (p != end) {
596*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(1, ("bad Certificate message"));
597*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR,
598*62c56f98SSadaf Ebrahimi MBEDTLS_ERR_SSL_DECODE_ERROR);
599*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_DECODE_ERROR;
600*62c56f98SSadaf Ebrahimi }
601*62c56f98SSadaf Ebrahimi
602*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_CRT(3, "peer certificate",
603*62c56f98SSadaf Ebrahimi ssl->session_negotiate->peer_cert);
604*62c56f98SSadaf Ebrahimi
605*62c56f98SSadaf Ebrahimi return ret;
606*62c56f98SSadaf Ebrahimi }
607*62c56f98SSadaf Ebrahimi #else
608*62c56f98SSadaf Ebrahimi MBEDTLS_CHECK_RETURN_CRITICAL
609*62c56f98SSadaf Ebrahimi MBEDTLS_STATIC_TESTABLE
mbedtls_ssl_tls13_parse_certificate(mbedtls_ssl_context * ssl,const unsigned char * buf,const unsigned char * end)610*62c56f98SSadaf Ebrahimi int mbedtls_ssl_tls13_parse_certificate(mbedtls_ssl_context *ssl,
611*62c56f98SSadaf Ebrahimi const unsigned char *buf,
612*62c56f98SSadaf Ebrahimi const unsigned char *end)
613*62c56f98SSadaf Ebrahimi {
614*62c56f98SSadaf Ebrahimi ((void) ssl);
615*62c56f98SSadaf Ebrahimi ((void) buf);
616*62c56f98SSadaf Ebrahimi ((void) end);
617*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
618*62c56f98SSadaf Ebrahimi }
619*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
620*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED */
621*62c56f98SSadaf Ebrahimi
622*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED)
623*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
624*62c56f98SSadaf Ebrahimi /* Validate certificate chain sent by the server. */
625*62c56f98SSadaf Ebrahimi MBEDTLS_CHECK_RETURN_CRITICAL
ssl_tls13_validate_certificate(mbedtls_ssl_context * ssl)626*62c56f98SSadaf Ebrahimi static int ssl_tls13_validate_certificate(mbedtls_ssl_context *ssl)
627*62c56f98SSadaf Ebrahimi {
628*62c56f98SSadaf Ebrahimi int ret = 0;
629*62c56f98SSadaf Ebrahimi int authmode = MBEDTLS_SSL_VERIFY_REQUIRED;
630*62c56f98SSadaf Ebrahimi mbedtls_x509_crt *ca_chain;
631*62c56f98SSadaf Ebrahimi mbedtls_x509_crl *ca_crl;
632*62c56f98SSadaf Ebrahimi const char *ext_oid;
633*62c56f98SSadaf Ebrahimi size_t ext_len;
634*62c56f98SSadaf Ebrahimi uint32_t verify_result = 0;
635*62c56f98SSadaf Ebrahimi
636*62c56f98SSadaf Ebrahimi /* If SNI was used, overwrite authentication mode
637*62c56f98SSadaf Ebrahimi * from the configuration. */
638*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_SRV_C)
639*62c56f98SSadaf Ebrahimi if (ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER) {
640*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
641*62c56f98SSadaf Ebrahimi if (ssl->handshake->sni_authmode != MBEDTLS_SSL_VERIFY_UNSET) {
642*62c56f98SSadaf Ebrahimi authmode = ssl->handshake->sni_authmode;
643*62c56f98SSadaf Ebrahimi } else
644*62c56f98SSadaf Ebrahimi #endif
645*62c56f98SSadaf Ebrahimi authmode = ssl->conf->authmode;
646*62c56f98SSadaf Ebrahimi }
647*62c56f98SSadaf Ebrahimi #endif
648*62c56f98SSadaf Ebrahimi
649*62c56f98SSadaf Ebrahimi /*
650*62c56f98SSadaf Ebrahimi * If the peer hasn't sent a certificate ( i.e. it sent
651*62c56f98SSadaf Ebrahimi * an empty certificate chain ), this is reflected in the peer CRT
652*62c56f98SSadaf Ebrahimi * structure being unset.
653*62c56f98SSadaf Ebrahimi * Check for that and handle it depending on the
654*62c56f98SSadaf Ebrahimi * authentication mode.
655*62c56f98SSadaf Ebrahimi */
656*62c56f98SSadaf Ebrahimi if (ssl->session_negotiate->peer_cert == NULL) {
657*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(1, ("peer has no certificate"));
658*62c56f98SSadaf Ebrahimi
659*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_SRV_C)
660*62c56f98SSadaf Ebrahimi if (ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER) {
661*62c56f98SSadaf Ebrahimi /* The client was asked for a certificate but didn't send
662*62c56f98SSadaf Ebrahimi * one. The client should know what's going on, so we
663*62c56f98SSadaf Ebrahimi * don't send an alert.
664*62c56f98SSadaf Ebrahimi */
665*62c56f98SSadaf Ebrahimi ssl->session_negotiate->verify_result = MBEDTLS_X509_BADCERT_MISSING;
666*62c56f98SSadaf Ebrahimi if (authmode == MBEDTLS_SSL_VERIFY_OPTIONAL) {
667*62c56f98SSadaf Ebrahimi return 0;
668*62c56f98SSadaf Ebrahimi } else {
669*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_PEND_FATAL_ALERT(
670*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_ALERT_MSG_NO_CERT,
671*62c56f98SSadaf Ebrahimi MBEDTLS_ERR_SSL_NO_CLIENT_CERTIFICATE);
672*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_NO_CLIENT_CERTIFICATE;
673*62c56f98SSadaf Ebrahimi }
674*62c56f98SSadaf Ebrahimi }
675*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_SRV_C */
676*62c56f98SSadaf Ebrahimi
677*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_CLI_C)
678*62c56f98SSadaf Ebrahimi if (ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT) {
679*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_NO_CERT,
680*62c56f98SSadaf Ebrahimi MBEDTLS_ERR_SSL_FATAL_ALERT_MESSAGE);
681*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_FATAL_ALERT_MESSAGE;
682*62c56f98SSadaf Ebrahimi }
683*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_CLI_C */
684*62c56f98SSadaf Ebrahimi }
685*62c56f98SSadaf Ebrahimi
686*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
687*62c56f98SSadaf Ebrahimi if (ssl->handshake->sni_ca_chain != NULL) {
688*62c56f98SSadaf Ebrahimi ca_chain = ssl->handshake->sni_ca_chain;
689*62c56f98SSadaf Ebrahimi ca_crl = ssl->handshake->sni_ca_crl;
690*62c56f98SSadaf Ebrahimi } else
691*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
692*62c56f98SSadaf Ebrahimi {
693*62c56f98SSadaf Ebrahimi ca_chain = ssl->conf->ca_chain;
694*62c56f98SSadaf Ebrahimi ca_crl = ssl->conf->ca_crl;
695*62c56f98SSadaf Ebrahimi }
696*62c56f98SSadaf Ebrahimi
697*62c56f98SSadaf Ebrahimi /*
698*62c56f98SSadaf Ebrahimi * Main check: verify certificate
699*62c56f98SSadaf Ebrahimi */
700*62c56f98SSadaf Ebrahimi ret = mbedtls_x509_crt_verify_with_profile(
701*62c56f98SSadaf Ebrahimi ssl->session_negotiate->peer_cert,
702*62c56f98SSadaf Ebrahimi ca_chain, ca_crl,
703*62c56f98SSadaf Ebrahimi ssl->conf->cert_profile,
704*62c56f98SSadaf Ebrahimi ssl->hostname,
705*62c56f98SSadaf Ebrahimi &verify_result,
706*62c56f98SSadaf Ebrahimi ssl->conf->f_vrfy, ssl->conf->p_vrfy);
707*62c56f98SSadaf Ebrahimi
708*62c56f98SSadaf Ebrahimi if (ret != 0) {
709*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_RET(1, "x509_verify_cert", ret);
710*62c56f98SSadaf Ebrahimi }
711*62c56f98SSadaf Ebrahimi
712*62c56f98SSadaf Ebrahimi /*
713*62c56f98SSadaf Ebrahimi * Secondary checks: always done, but change 'ret' only if it was 0
714*62c56f98SSadaf Ebrahimi */
715*62c56f98SSadaf Ebrahimi if (ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT) {
716*62c56f98SSadaf Ebrahimi ext_oid = MBEDTLS_OID_SERVER_AUTH;
717*62c56f98SSadaf Ebrahimi ext_len = MBEDTLS_OID_SIZE(MBEDTLS_OID_SERVER_AUTH);
718*62c56f98SSadaf Ebrahimi } else {
719*62c56f98SSadaf Ebrahimi ext_oid = MBEDTLS_OID_CLIENT_AUTH;
720*62c56f98SSadaf Ebrahimi ext_len = MBEDTLS_OID_SIZE(MBEDTLS_OID_CLIENT_AUTH);
721*62c56f98SSadaf Ebrahimi }
722*62c56f98SSadaf Ebrahimi
723*62c56f98SSadaf Ebrahimi if ((mbedtls_x509_crt_check_key_usage(
724*62c56f98SSadaf Ebrahimi ssl->session_negotiate->peer_cert,
725*62c56f98SSadaf Ebrahimi MBEDTLS_X509_KU_DIGITAL_SIGNATURE) != 0) ||
726*62c56f98SSadaf Ebrahimi (mbedtls_x509_crt_check_extended_key_usage(
727*62c56f98SSadaf Ebrahimi ssl->session_negotiate->peer_cert,
728*62c56f98SSadaf Ebrahimi ext_oid, ext_len) != 0)) {
729*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate (usage extensions)"));
730*62c56f98SSadaf Ebrahimi if (ret == 0) {
731*62c56f98SSadaf Ebrahimi ret = MBEDTLS_ERR_SSL_BAD_CERTIFICATE;
732*62c56f98SSadaf Ebrahimi }
733*62c56f98SSadaf Ebrahimi }
734*62c56f98SSadaf Ebrahimi
735*62c56f98SSadaf Ebrahimi /* mbedtls_x509_crt_verify_with_profile is supposed to report a
736*62c56f98SSadaf Ebrahimi * verification failure through MBEDTLS_ERR_X509_CERT_VERIFY_FAILED,
737*62c56f98SSadaf Ebrahimi * with details encoded in the verification flags. All other kinds
738*62c56f98SSadaf Ebrahimi * of error codes, including those from the user provided f_vrfy
739*62c56f98SSadaf Ebrahimi * functions, are treated as fatal and lead to a failure of
740*62c56f98SSadaf Ebrahimi * mbedtls_ssl_tls13_parse_certificate even if verification was optional.
741*62c56f98SSadaf Ebrahimi */
742*62c56f98SSadaf Ebrahimi if (authmode == MBEDTLS_SSL_VERIFY_OPTIONAL &&
743*62c56f98SSadaf Ebrahimi (ret == MBEDTLS_ERR_X509_CERT_VERIFY_FAILED ||
744*62c56f98SSadaf Ebrahimi ret == MBEDTLS_ERR_SSL_BAD_CERTIFICATE)) {
745*62c56f98SSadaf Ebrahimi ret = 0;
746*62c56f98SSadaf Ebrahimi }
747*62c56f98SSadaf Ebrahimi
748*62c56f98SSadaf Ebrahimi if (ca_chain == NULL && authmode == MBEDTLS_SSL_VERIFY_REQUIRED) {
749*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(1, ("got no CA chain"));
750*62c56f98SSadaf Ebrahimi ret = MBEDTLS_ERR_SSL_CA_CHAIN_REQUIRED;
751*62c56f98SSadaf Ebrahimi }
752*62c56f98SSadaf Ebrahimi
753*62c56f98SSadaf Ebrahimi if (ret != 0) {
754*62c56f98SSadaf Ebrahimi /* The certificate may have been rejected for several reasons.
755*62c56f98SSadaf Ebrahimi Pick one and send the corresponding alert. Which alert to send
756*62c56f98SSadaf Ebrahimi may be a subject of debate in some cases. */
757*62c56f98SSadaf Ebrahimi if (verify_result & MBEDTLS_X509_BADCERT_OTHER) {
758*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_PEND_FATAL_ALERT(
759*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_ALERT_MSG_ACCESS_DENIED, ret);
760*62c56f98SSadaf Ebrahimi } else if (verify_result & MBEDTLS_X509_BADCERT_CN_MISMATCH) {
761*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_BAD_CERT, ret);
762*62c56f98SSadaf Ebrahimi } else if (verify_result & (MBEDTLS_X509_BADCERT_KEY_USAGE |
763*62c56f98SSadaf Ebrahimi MBEDTLS_X509_BADCERT_EXT_KEY_USAGE |
764*62c56f98SSadaf Ebrahimi MBEDTLS_X509_BADCERT_NS_CERT_TYPE |
765*62c56f98SSadaf Ebrahimi MBEDTLS_X509_BADCERT_BAD_PK |
766*62c56f98SSadaf Ebrahimi MBEDTLS_X509_BADCERT_BAD_KEY)) {
767*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_PEND_FATAL_ALERT(
768*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT, ret);
769*62c56f98SSadaf Ebrahimi } else if (verify_result & MBEDTLS_X509_BADCERT_EXPIRED) {
770*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_PEND_FATAL_ALERT(
771*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_ALERT_MSG_CERT_EXPIRED, ret);
772*62c56f98SSadaf Ebrahimi } else if (verify_result & MBEDTLS_X509_BADCERT_REVOKED) {
773*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_PEND_FATAL_ALERT(
774*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_ALERT_MSG_CERT_REVOKED, ret);
775*62c56f98SSadaf Ebrahimi } else if (verify_result & MBEDTLS_X509_BADCERT_NOT_TRUSTED) {
776*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_UNKNOWN_CA, ret);
777*62c56f98SSadaf Ebrahimi } else {
778*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_PEND_FATAL_ALERT(
779*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_ALERT_MSG_CERT_UNKNOWN, ret);
780*62c56f98SSadaf Ebrahimi }
781*62c56f98SSadaf Ebrahimi }
782*62c56f98SSadaf Ebrahimi
783*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_DEBUG_C)
784*62c56f98SSadaf Ebrahimi if (verify_result != 0) {
785*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(3, ("! Certificate verification flags %08x",
786*62c56f98SSadaf Ebrahimi (unsigned int) verify_result));
787*62c56f98SSadaf Ebrahimi } else {
788*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(3, ("Certificate verification flags clear"));
789*62c56f98SSadaf Ebrahimi }
790*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_DEBUG_C */
791*62c56f98SSadaf Ebrahimi
792*62c56f98SSadaf Ebrahimi ssl->session_negotiate->verify_result = verify_result;
793*62c56f98SSadaf Ebrahimi return ret;
794*62c56f98SSadaf Ebrahimi }
795*62c56f98SSadaf Ebrahimi #else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
796*62c56f98SSadaf Ebrahimi MBEDTLS_CHECK_RETURN_CRITICAL
ssl_tls13_validate_certificate(mbedtls_ssl_context * ssl)797*62c56f98SSadaf Ebrahimi static int ssl_tls13_validate_certificate(mbedtls_ssl_context *ssl)
798*62c56f98SSadaf Ebrahimi {
799*62c56f98SSadaf Ebrahimi ((void) ssl);
800*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
801*62c56f98SSadaf Ebrahimi }
802*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
803*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED */
804*62c56f98SSadaf Ebrahimi
mbedtls_ssl_tls13_process_certificate(mbedtls_ssl_context * ssl)805*62c56f98SSadaf Ebrahimi int mbedtls_ssl_tls13_process_certificate(mbedtls_ssl_context *ssl)
806*62c56f98SSadaf Ebrahimi {
807*62c56f98SSadaf Ebrahimi int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
808*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse certificate"));
809*62c56f98SSadaf Ebrahimi
810*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED)
811*62c56f98SSadaf Ebrahimi unsigned char *buf;
812*62c56f98SSadaf Ebrahimi size_t buf_len;
813*62c56f98SSadaf Ebrahimi
814*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_tls13_fetch_handshake_msg(
815*62c56f98SSadaf Ebrahimi ssl, MBEDTLS_SSL_HS_CERTIFICATE,
816*62c56f98SSadaf Ebrahimi &buf, &buf_len));
817*62c56f98SSadaf Ebrahimi
818*62c56f98SSadaf Ebrahimi /* Parse the certificate chain sent by the peer. */
819*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_tls13_parse_certificate(ssl, buf,
820*62c56f98SSadaf Ebrahimi buf + buf_len));
821*62c56f98SSadaf Ebrahimi /* Validate the certificate chain and set the verification results. */
822*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_PROC_CHK(ssl_tls13_validate_certificate(ssl));
823*62c56f98SSadaf Ebrahimi
824*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_add_hs_msg_to_checksum(
825*62c56f98SSadaf Ebrahimi ssl, MBEDTLS_SSL_HS_CERTIFICATE, buf, buf_len));
826*62c56f98SSadaf Ebrahimi
827*62c56f98SSadaf Ebrahimi cleanup:
828*62c56f98SSadaf Ebrahimi #else /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED */
829*62c56f98SSadaf Ebrahimi (void) ssl;
830*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED */
831*62c56f98SSadaf Ebrahimi
832*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse certificate"));
833*62c56f98SSadaf Ebrahimi return ret;
834*62c56f98SSadaf Ebrahimi }
835*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED)
836*62c56f98SSadaf Ebrahimi /*
837*62c56f98SSadaf Ebrahimi * enum {
838*62c56f98SSadaf Ebrahimi * X509(0),
839*62c56f98SSadaf Ebrahimi * RawPublicKey(2),
840*62c56f98SSadaf Ebrahimi * (255)
841*62c56f98SSadaf Ebrahimi * } CertificateType;
842*62c56f98SSadaf Ebrahimi *
843*62c56f98SSadaf Ebrahimi * struct {
844*62c56f98SSadaf Ebrahimi * select (certificate_type) {
845*62c56f98SSadaf Ebrahimi * case RawPublicKey:
846*62c56f98SSadaf Ebrahimi * // From RFC 7250 ASN.1_subjectPublicKeyInfo
847*62c56f98SSadaf Ebrahimi * opaque ASN1_subjectPublicKeyInfo<1..2^24-1>;
848*62c56f98SSadaf Ebrahimi *
849*62c56f98SSadaf Ebrahimi * case X509:
850*62c56f98SSadaf Ebrahimi * opaque cert_data<1..2^24-1>;
851*62c56f98SSadaf Ebrahimi * };
852*62c56f98SSadaf Ebrahimi * Extension extensions<0..2^16-1>;
853*62c56f98SSadaf Ebrahimi * } CertificateEntry;
854*62c56f98SSadaf Ebrahimi *
855*62c56f98SSadaf Ebrahimi * struct {
856*62c56f98SSadaf Ebrahimi * opaque certificate_request_context<0..2^8-1>;
857*62c56f98SSadaf Ebrahimi * CertificateEntry certificate_list<0..2^24-1>;
858*62c56f98SSadaf Ebrahimi * } Certificate;
859*62c56f98SSadaf Ebrahimi */
860*62c56f98SSadaf Ebrahimi MBEDTLS_CHECK_RETURN_CRITICAL
ssl_tls13_write_certificate_body(mbedtls_ssl_context * ssl,unsigned char * buf,unsigned char * end,size_t * out_len)861*62c56f98SSadaf Ebrahimi static int ssl_tls13_write_certificate_body(mbedtls_ssl_context *ssl,
862*62c56f98SSadaf Ebrahimi unsigned char *buf,
863*62c56f98SSadaf Ebrahimi unsigned char *end,
864*62c56f98SSadaf Ebrahimi size_t *out_len)
865*62c56f98SSadaf Ebrahimi {
866*62c56f98SSadaf Ebrahimi const mbedtls_x509_crt *crt = mbedtls_ssl_own_cert(ssl);
867*62c56f98SSadaf Ebrahimi unsigned char *p = buf;
868*62c56f98SSadaf Ebrahimi unsigned char *certificate_request_context =
869*62c56f98SSadaf Ebrahimi ssl->handshake->certificate_request_context;
870*62c56f98SSadaf Ebrahimi unsigned char certificate_request_context_len =
871*62c56f98SSadaf Ebrahimi ssl->handshake->certificate_request_context_len;
872*62c56f98SSadaf Ebrahimi unsigned char *p_certificate_list_len;
873*62c56f98SSadaf Ebrahimi
874*62c56f98SSadaf Ebrahimi
875*62c56f98SSadaf Ebrahimi /* ...
876*62c56f98SSadaf Ebrahimi * opaque certificate_request_context<0..2^8-1>;
877*62c56f98SSadaf Ebrahimi * ...
878*62c56f98SSadaf Ebrahimi */
879*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_CHK_BUF_PTR(p, end, certificate_request_context_len + 1);
880*62c56f98SSadaf Ebrahimi *p++ = certificate_request_context_len;
881*62c56f98SSadaf Ebrahimi if (certificate_request_context_len > 0) {
882*62c56f98SSadaf Ebrahimi memcpy(p, certificate_request_context, certificate_request_context_len);
883*62c56f98SSadaf Ebrahimi p += certificate_request_context_len;
884*62c56f98SSadaf Ebrahimi }
885*62c56f98SSadaf Ebrahimi
886*62c56f98SSadaf Ebrahimi /* ...
887*62c56f98SSadaf Ebrahimi * CertificateEntry certificate_list<0..2^24-1>;
888*62c56f98SSadaf Ebrahimi * ...
889*62c56f98SSadaf Ebrahimi */
890*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_CHK_BUF_PTR(p, end, 3);
891*62c56f98SSadaf Ebrahimi p_certificate_list_len = p;
892*62c56f98SSadaf Ebrahimi p += 3;
893*62c56f98SSadaf Ebrahimi
894*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_CRT(3, "own certificate", crt);
895*62c56f98SSadaf Ebrahimi
896*62c56f98SSadaf Ebrahimi while (crt != NULL) {
897*62c56f98SSadaf Ebrahimi size_t cert_data_len = crt->raw.len;
898*62c56f98SSadaf Ebrahimi
899*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_CHK_BUF_PTR(p, end, cert_data_len + 3 + 2);
900*62c56f98SSadaf Ebrahimi MBEDTLS_PUT_UINT24_BE(cert_data_len, p, 0);
901*62c56f98SSadaf Ebrahimi p += 3;
902*62c56f98SSadaf Ebrahimi
903*62c56f98SSadaf Ebrahimi memcpy(p, crt->raw.p, cert_data_len);
904*62c56f98SSadaf Ebrahimi p += cert_data_len;
905*62c56f98SSadaf Ebrahimi crt = crt->next;
906*62c56f98SSadaf Ebrahimi
907*62c56f98SSadaf Ebrahimi /* Currently, we don't have any certificate extensions defined.
908*62c56f98SSadaf Ebrahimi * Hence, we are sending an empty extension with length zero.
909*62c56f98SSadaf Ebrahimi */
910*62c56f98SSadaf Ebrahimi MBEDTLS_PUT_UINT16_BE(0, p, 0);
911*62c56f98SSadaf Ebrahimi p += 2;
912*62c56f98SSadaf Ebrahimi }
913*62c56f98SSadaf Ebrahimi
914*62c56f98SSadaf Ebrahimi MBEDTLS_PUT_UINT24_BE(p - p_certificate_list_len - 3,
915*62c56f98SSadaf Ebrahimi p_certificate_list_len, 0);
916*62c56f98SSadaf Ebrahimi
917*62c56f98SSadaf Ebrahimi *out_len = p - buf;
918*62c56f98SSadaf Ebrahimi
919*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_PRINT_EXTS(
920*62c56f98SSadaf Ebrahimi 3, MBEDTLS_SSL_HS_CERTIFICATE, ssl->handshake->sent_extensions);
921*62c56f98SSadaf Ebrahimi
922*62c56f98SSadaf Ebrahimi return 0;
923*62c56f98SSadaf Ebrahimi }
924*62c56f98SSadaf Ebrahimi
mbedtls_ssl_tls13_write_certificate(mbedtls_ssl_context * ssl)925*62c56f98SSadaf Ebrahimi int mbedtls_ssl_tls13_write_certificate(mbedtls_ssl_context *ssl)
926*62c56f98SSadaf Ebrahimi {
927*62c56f98SSadaf Ebrahimi int ret;
928*62c56f98SSadaf Ebrahimi unsigned char *buf;
929*62c56f98SSadaf Ebrahimi size_t buf_len, msg_len;
930*62c56f98SSadaf Ebrahimi
931*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(2, ("=> write certificate"));
932*62c56f98SSadaf Ebrahimi
933*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_start_handshake_msg(
934*62c56f98SSadaf Ebrahimi ssl, MBEDTLS_SSL_HS_CERTIFICATE, &buf, &buf_len));
935*62c56f98SSadaf Ebrahimi
936*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_PROC_CHK(ssl_tls13_write_certificate_body(ssl,
937*62c56f98SSadaf Ebrahimi buf,
938*62c56f98SSadaf Ebrahimi buf + buf_len,
939*62c56f98SSadaf Ebrahimi &msg_len));
940*62c56f98SSadaf Ebrahimi
941*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_add_hs_msg_to_checksum(
942*62c56f98SSadaf Ebrahimi ssl, MBEDTLS_SSL_HS_CERTIFICATE, buf, msg_len));
943*62c56f98SSadaf Ebrahimi
944*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_finish_handshake_msg(
945*62c56f98SSadaf Ebrahimi ssl, buf_len, msg_len));
946*62c56f98SSadaf Ebrahimi cleanup:
947*62c56f98SSadaf Ebrahimi
948*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(2, ("<= write certificate"));
949*62c56f98SSadaf Ebrahimi return ret;
950*62c56f98SSadaf Ebrahimi }
951*62c56f98SSadaf Ebrahimi
952*62c56f98SSadaf Ebrahimi /*
953*62c56f98SSadaf Ebrahimi * STATE HANDLING: Output Certificate Verify
954*62c56f98SSadaf Ebrahimi */
mbedtls_ssl_tls13_check_sig_alg_cert_key_match(uint16_t sig_alg,mbedtls_pk_context * key)955*62c56f98SSadaf Ebrahimi int mbedtls_ssl_tls13_check_sig_alg_cert_key_match(uint16_t sig_alg,
956*62c56f98SSadaf Ebrahimi mbedtls_pk_context *key)
957*62c56f98SSadaf Ebrahimi {
958*62c56f98SSadaf Ebrahimi mbedtls_pk_type_t pk_type = mbedtls_ssl_sig_from_pk(key);
959*62c56f98SSadaf Ebrahimi size_t key_size = mbedtls_pk_get_bitlen(key);
960*62c56f98SSadaf Ebrahimi
961*62c56f98SSadaf Ebrahimi switch (pk_type) {
962*62c56f98SSadaf Ebrahimi case MBEDTLS_SSL_SIG_ECDSA:
963*62c56f98SSadaf Ebrahimi switch (key_size) {
964*62c56f98SSadaf Ebrahimi case 256:
965*62c56f98SSadaf Ebrahimi return
966*62c56f98SSadaf Ebrahimi sig_alg == MBEDTLS_TLS1_3_SIG_ECDSA_SECP256R1_SHA256;
967*62c56f98SSadaf Ebrahimi
968*62c56f98SSadaf Ebrahimi case 384:
969*62c56f98SSadaf Ebrahimi return
970*62c56f98SSadaf Ebrahimi sig_alg == MBEDTLS_TLS1_3_SIG_ECDSA_SECP384R1_SHA384;
971*62c56f98SSadaf Ebrahimi
972*62c56f98SSadaf Ebrahimi case 521:
973*62c56f98SSadaf Ebrahimi return
974*62c56f98SSadaf Ebrahimi sig_alg == MBEDTLS_TLS1_3_SIG_ECDSA_SECP521R1_SHA512;
975*62c56f98SSadaf Ebrahimi default:
976*62c56f98SSadaf Ebrahimi break;
977*62c56f98SSadaf Ebrahimi }
978*62c56f98SSadaf Ebrahimi break;
979*62c56f98SSadaf Ebrahimi
980*62c56f98SSadaf Ebrahimi case MBEDTLS_SSL_SIG_RSA:
981*62c56f98SSadaf Ebrahimi switch (sig_alg) {
982*62c56f98SSadaf Ebrahimi case MBEDTLS_TLS1_3_SIG_RSA_PSS_RSAE_SHA256: /* Intentional fallthrough */
983*62c56f98SSadaf Ebrahimi case MBEDTLS_TLS1_3_SIG_RSA_PSS_RSAE_SHA384: /* Intentional fallthrough */
984*62c56f98SSadaf Ebrahimi case MBEDTLS_TLS1_3_SIG_RSA_PSS_RSAE_SHA512:
985*62c56f98SSadaf Ebrahimi return 1;
986*62c56f98SSadaf Ebrahimi
987*62c56f98SSadaf Ebrahimi default:
988*62c56f98SSadaf Ebrahimi break;
989*62c56f98SSadaf Ebrahimi }
990*62c56f98SSadaf Ebrahimi break;
991*62c56f98SSadaf Ebrahimi
992*62c56f98SSadaf Ebrahimi default:
993*62c56f98SSadaf Ebrahimi break;
994*62c56f98SSadaf Ebrahimi }
995*62c56f98SSadaf Ebrahimi
996*62c56f98SSadaf Ebrahimi return 0;
997*62c56f98SSadaf Ebrahimi }
998*62c56f98SSadaf Ebrahimi
999*62c56f98SSadaf Ebrahimi MBEDTLS_CHECK_RETURN_CRITICAL
ssl_tls13_write_certificate_verify_body(mbedtls_ssl_context * ssl,unsigned char * buf,unsigned char * end,size_t * out_len)1000*62c56f98SSadaf Ebrahimi static int ssl_tls13_write_certificate_verify_body(mbedtls_ssl_context *ssl,
1001*62c56f98SSadaf Ebrahimi unsigned char *buf,
1002*62c56f98SSadaf Ebrahimi unsigned char *end,
1003*62c56f98SSadaf Ebrahimi size_t *out_len)
1004*62c56f98SSadaf Ebrahimi {
1005*62c56f98SSadaf Ebrahimi int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1006*62c56f98SSadaf Ebrahimi unsigned char *p = buf;
1007*62c56f98SSadaf Ebrahimi mbedtls_pk_context *own_key;
1008*62c56f98SSadaf Ebrahimi
1009*62c56f98SSadaf Ebrahimi unsigned char handshake_hash[MBEDTLS_TLS1_3_MD_MAX_SIZE];
1010*62c56f98SSadaf Ebrahimi size_t handshake_hash_len;
1011*62c56f98SSadaf Ebrahimi unsigned char verify_buffer[SSL_VERIFY_STRUCT_MAX_SIZE];
1012*62c56f98SSadaf Ebrahimi size_t verify_buffer_len;
1013*62c56f98SSadaf Ebrahimi
1014*62c56f98SSadaf Ebrahimi uint16_t *sig_alg = ssl->handshake->received_sig_algs;
1015*62c56f98SSadaf Ebrahimi size_t signature_len = 0;
1016*62c56f98SSadaf Ebrahimi
1017*62c56f98SSadaf Ebrahimi *out_len = 0;
1018*62c56f98SSadaf Ebrahimi
1019*62c56f98SSadaf Ebrahimi own_key = mbedtls_ssl_own_key(ssl);
1020*62c56f98SSadaf Ebrahimi if (own_key == NULL) {
1021*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
1022*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
1023*62c56f98SSadaf Ebrahimi }
1024*62c56f98SSadaf Ebrahimi
1025*62c56f98SSadaf Ebrahimi ret = mbedtls_ssl_get_handshake_transcript(
1026*62c56f98SSadaf Ebrahimi ssl, ssl->handshake->ciphersuite_info->mac,
1027*62c56f98SSadaf Ebrahimi handshake_hash, sizeof(handshake_hash), &handshake_hash_len);
1028*62c56f98SSadaf Ebrahimi if (ret != 0) {
1029*62c56f98SSadaf Ebrahimi return ret;
1030*62c56f98SSadaf Ebrahimi }
1031*62c56f98SSadaf Ebrahimi
1032*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_BUF(3, "handshake hash",
1033*62c56f98SSadaf Ebrahimi handshake_hash,
1034*62c56f98SSadaf Ebrahimi handshake_hash_len);
1035*62c56f98SSadaf Ebrahimi
1036*62c56f98SSadaf Ebrahimi ssl_tls13_create_verify_structure(handshake_hash, handshake_hash_len,
1037*62c56f98SSadaf Ebrahimi verify_buffer, &verify_buffer_len,
1038*62c56f98SSadaf Ebrahimi ssl->conf->endpoint);
1039*62c56f98SSadaf Ebrahimi
1040*62c56f98SSadaf Ebrahimi /*
1041*62c56f98SSadaf Ebrahimi * struct {
1042*62c56f98SSadaf Ebrahimi * SignatureScheme algorithm;
1043*62c56f98SSadaf Ebrahimi * opaque signature<0..2^16-1>;
1044*62c56f98SSadaf Ebrahimi * } CertificateVerify;
1045*62c56f98SSadaf Ebrahimi */
1046*62c56f98SSadaf Ebrahimi /* Check there is space for the algorithm identifier (2 bytes) and the
1047*62c56f98SSadaf Ebrahimi * signature length (2 bytes).
1048*62c56f98SSadaf Ebrahimi */
1049*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_CHK_BUF_PTR(p, end, 4);
1050*62c56f98SSadaf Ebrahimi
1051*62c56f98SSadaf Ebrahimi for (; *sig_alg != MBEDTLS_TLS1_3_SIG_NONE; sig_alg++) {
1052*62c56f98SSadaf Ebrahimi psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1053*62c56f98SSadaf Ebrahimi mbedtls_pk_type_t pk_type = MBEDTLS_PK_NONE;
1054*62c56f98SSadaf Ebrahimi mbedtls_md_type_t md_alg = MBEDTLS_MD_NONE;
1055*62c56f98SSadaf Ebrahimi psa_algorithm_t psa_algorithm = PSA_ALG_NONE;
1056*62c56f98SSadaf Ebrahimi unsigned char verify_hash[PSA_HASH_MAX_SIZE];
1057*62c56f98SSadaf Ebrahimi size_t verify_hash_len;
1058*62c56f98SSadaf Ebrahimi
1059*62c56f98SSadaf Ebrahimi if (!mbedtls_ssl_sig_alg_is_offered(ssl, *sig_alg)) {
1060*62c56f98SSadaf Ebrahimi continue;
1061*62c56f98SSadaf Ebrahimi }
1062*62c56f98SSadaf Ebrahimi
1063*62c56f98SSadaf Ebrahimi if (!mbedtls_ssl_tls13_sig_alg_for_cert_verify_is_supported(*sig_alg)) {
1064*62c56f98SSadaf Ebrahimi continue;
1065*62c56f98SSadaf Ebrahimi }
1066*62c56f98SSadaf Ebrahimi
1067*62c56f98SSadaf Ebrahimi if (!mbedtls_ssl_tls13_check_sig_alg_cert_key_match(*sig_alg, own_key)) {
1068*62c56f98SSadaf Ebrahimi continue;
1069*62c56f98SSadaf Ebrahimi }
1070*62c56f98SSadaf Ebrahimi
1071*62c56f98SSadaf Ebrahimi if (mbedtls_ssl_get_pk_type_and_md_alg_from_sig_alg(
1072*62c56f98SSadaf Ebrahimi *sig_alg, &pk_type, &md_alg) != 0) {
1073*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
1074*62c56f98SSadaf Ebrahimi }
1075*62c56f98SSadaf Ebrahimi
1076*62c56f98SSadaf Ebrahimi /* Hash verify buffer with indicated hash function */
1077*62c56f98SSadaf Ebrahimi psa_algorithm = mbedtls_md_psa_alg_from_type(md_alg);
1078*62c56f98SSadaf Ebrahimi status = psa_hash_compute(psa_algorithm,
1079*62c56f98SSadaf Ebrahimi verify_buffer,
1080*62c56f98SSadaf Ebrahimi verify_buffer_len,
1081*62c56f98SSadaf Ebrahimi verify_hash, sizeof(verify_hash),
1082*62c56f98SSadaf Ebrahimi &verify_hash_len);
1083*62c56f98SSadaf Ebrahimi if (status != PSA_SUCCESS) {
1084*62c56f98SSadaf Ebrahimi return PSA_TO_MBEDTLS_ERR(status);
1085*62c56f98SSadaf Ebrahimi }
1086*62c56f98SSadaf Ebrahimi
1087*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_BUF(3, "verify hash", verify_hash, verify_hash_len);
1088*62c56f98SSadaf Ebrahimi
1089*62c56f98SSadaf Ebrahimi if ((ret = mbedtls_pk_sign_ext(pk_type, own_key,
1090*62c56f98SSadaf Ebrahimi md_alg, verify_hash, verify_hash_len,
1091*62c56f98SSadaf Ebrahimi p + 4, (size_t) (end - (p + 4)), &signature_len,
1092*62c56f98SSadaf Ebrahimi ssl->conf->f_rng, ssl->conf->p_rng)) != 0) {
1093*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(2, ("CertificateVerify signature failed with %s",
1094*62c56f98SSadaf Ebrahimi mbedtls_ssl_sig_alg_to_str(*sig_alg)));
1095*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_RET(2, "mbedtls_pk_sign_ext", ret);
1096*62c56f98SSadaf Ebrahimi
1097*62c56f98SSadaf Ebrahimi /* The signature failed. This is possible if the private key
1098*62c56f98SSadaf Ebrahimi * was not suitable for the signature operation as purposely we
1099*62c56f98SSadaf Ebrahimi * did not check its suitability completely. Let's try with
1100*62c56f98SSadaf Ebrahimi * another signature algorithm.
1101*62c56f98SSadaf Ebrahimi */
1102*62c56f98SSadaf Ebrahimi continue;
1103*62c56f98SSadaf Ebrahimi }
1104*62c56f98SSadaf Ebrahimi
1105*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(2, ("CertificateVerify signature with %s",
1106*62c56f98SSadaf Ebrahimi mbedtls_ssl_sig_alg_to_str(*sig_alg)));
1107*62c56f98SSadaf Ebrahimi
1108*62c56f98SSadaf Ebrahimi break;
1109*62c56f98SSadaf Ebrahimi }
1110*62c56f98SSadaf Ebrahimi
1111*62c56f98SSadaf Ebrahimi if (*sig_alg == MBEDTLS_TLS1_3_SIG_NONE) {
1112*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(1, ("no suitable signature algorithm"));
1113*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE,
1114*62c56f98SSadaf Ebrahimi MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE);
1115*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
1116*62c56f98SSadaf Ebrahimi }
1117*62c56f98SSadaf Ebrahimi
1118*62c56f98SSadaf Ebrahimi MBEDTLS_PUT_UINT16_BE(*sig_alg, p, 0);
1119*62c56f98SSadaf Ebrahimi MBEDTLS_PUT_UINT16_BE(signature_len, p, 2);
1120*62c56f98SSadaf Ebrahimi
1121*62c56f98SSadaf Ebrahimi *out_len = 4 + signature_len;
1122*62c56f98SSadaf Ebrahimi
1123*62c56f98SSadaf Ebrahimi return 0;
1124*62c56f98SSadaf Ebrahimi }
1125*62c56f98SSadaf Ebrahimi
mbedtls_ssl_tls13_write_certificate_verify(mbedtls_ssl_context * ssl)1126*62c56f98SSadaf Ebrahimi int mbedtls_ssl_tls13_write_certificate_verify(mbedtls_ssl_context *ssl)
1127*62c56f98SSadaf Ebrahimi {
1128*62c56f98SSadaf Ebrahimi int ret = 0;
1129*62c56f98SSadaf Ebrahimi unsigned char *buf;
1130*62c56f98SSadaf Ebrahimi size_t buf_len, msg_len;
1131*62c56f98SSadaf Ebrahimi
1132*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(2, ("=> write certificate verify"));
1133*62c56f98SSadaf Ebrahimi
1134*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_start_handshake_msg(
1135*62c56f98SSadaf Ebrahimi ssl, MBEDTLS_SSL_HS_CERTIFICATE_VERIFY,
1136*62c56f98SSadaf Ebrahimi &buf, &buf_len));
1137*62c56f98SSadaf Ebrahimi
1138*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_PROC_CHK(ssl_tls13_write_certificate_verify_body(
1139*62c56f98SSadaf Ebrahimi ssl, buf, buf + buf_len, &msg_len));
1140*62c56f98SSadaf Ebrahimi
1141*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_add_hs_msg_to_checksum(
1142*62c56f98SSadaf Ebrahimi ssl, MBEDTLS_SSL_HS_CERTIFICATE_VERIFY,
1143*62c56f98SSadaf Ebrahimi buf, msg_len));
1144*62c56f98SSadaf Ebrahimi
1145*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_finish_handshake_msg(
1146*62c56f98SSadaf Ebrahimi ssl, buf_len, msg_len));
1147*62c56f98SSadaf Ebrahimi
1148*62c56f98SSadaf Ebrahimi cleanup:
1149*62c56f98SSadaf Ebrahimi
1150*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(2, ("<= write certificate verify"));
1151*62c56f98SSadaf Ebrahimi return ret;
1152*62c56f98SSadaf Ebrahimi }
1153*62c56f98SSadaf Ebrahimi
1154*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED */
1155*62c56f98SSadaf Ebrahimi
1156*62c56f98SSadaf Ebrahimi /*
1157*62c56f98SSadaf Ebrahimi *
1158*62c56f98SSadaf Ebrahimi * STATE HANDLING: Incoming Finished message.
1159*62c56f98SSadaf Ebrahimi */
1160*62c56f98SSadaf Ebrahimi /*
1161*62c56f98SSadaf Ebrahimi * Implementation
1162*62c56f98SSadaf Ebrahimi */
1163*62c56f98SSadaf Ebrahimi
1164*62c56f98SSadaf Ebrahimi MBEDTLS_CHECK_RETURN_CRITICAL
ssl_tls13_preprocess_finished_message(mbedtls_ssl_context * ssl)1165*62c56f98SSadaf Ebrahimi static int ssl_tls13_preprocess_finished_message(mbedtls_ssl_context *ssl)
1166*62c56f98SSadaf Ebrahimi {
1167*62c56f98SSadaf Ebrahimi int ret;
1168*62c56f98SSadaf Ebrahimi
1169*62c56f98SSadaf Ebrahimi ret = mbedtls_ssl_tls13_calculate_verify_data(
1170*62c56f98SSadaf Ebrahimi ssl,
1171*62c56f98SSadaf Ebrahimi ssl->handshake->state_local.finished_in.digest,
1172*62c56f98SSadaf Ebrahimi sizeof(ssl->handshake->state_local.finished_in.digest),
1173*62c56f98SSadaf Ebrahimi &ssl->handshake->state_local.finished_in.digest_len,
1174*62c56f98SSadaf Ebrahimi ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT ?
1175*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_IS_SERVER : MBEDTLS_SSL_IS_CLIENT);
1176*62c56f98SSadaf Ebrahimi if (ret != 0) {
1177*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_tls13_calculate_verify_data", ret);
1178*62c56f98SSadaf Ebrahimi return ret;
1179*62c56f98SSadaf Ebrahimi }
1180*62c56f98SSadaf Ebrahimi
1181*62c56f98SSadaf Ebrahimi return 0;
1182*62c56f98SSadaf Ebrahimi }
1183*62c56f98SSadaf Ebrahimi
1184*62c56f98SSadaf Ebrahimi MBEDTLS_CHECK_RETURN_CRITICAL
ssl_tls13_parse_finished_message(mbedtls_ssl_context * ssl,const unsigned char * buf,const unsigned char * end)1185*62c56f98SSadaf Ebrahimi static int ssl_tls13_parse_finished_message(mbedtls_ssl_context *ssl,
1186*62c56f98SSadaf Ebrahimi const unsigned char *buf,
1187*62c56f98SSadaf Ebrahimi const unsigned char *end)
1188*62c56f98SSadaf Ebrahimi {
1189*62c56f98SSadaf Ebrahimi /*
1190*62c56f98SSadaf Ebrahimi * struct {
1191*62c56f98SSadaf Ebrahimi * opaque verify_data[Hash.length];
1192*62c56f98SSadaf Ebrahimi * } Finished;
1193*62c56f98SSadaf Ebrahimi */
1194*62c56f98SSadaf Ebrahimi const unsigned char *expected_verify_data =
1195*62c56f98SSadaf Ebrahimi ssl->handshake->state_local.finished_in.digest;
1196*62c56f98SSadaf Ebrahimi size_t expected_verify_data_len =
1197*62c56f98SSadaf Ebrahimi ssl->handshake->state_local.finished_in.digest_len;
1198*62c56f98SSadaf Ebrahimi /* Structural validation */
1199*62c56f98SSadaf Ebrahimi if ((size_t) (end - buf) != expected_verify_data_len) {
1200*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(1, ("bad finished message"));
1201*62c56f98SSadaf Ebrahimi
1202*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR,
1203*62c56f98SSadaf Ebrahimi MBEDTLS_ERR_SSL_DECODE_ERROR);
1204*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_DECODE_ERROR;
1205*62c56f98SSadaf Ebrahimi }
1206*62c56f98SSadaf Ebrahimi
1207*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_BUF(4, "verify_data (self-computed):",
1208*62c56f98SSadaf Ebrahimi expected_verify_data,
1209*62c56f98SSadaf Ebrahimi expected_verify_data_len);
1210*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_BUF(4, "verify_data (received message):", buf,
1211*62c56f98SSadaf Ebrahimi expected_verify_data_len);
1212*62c56f98SSadaf Ebrahimi
1213*62c56f98SSadaf Ebrahimi /* Semantic validation */
1214*62c56f98SSadaf Ebrahimi if (mbedtls_ct_memcmp(buf,
1215*62c56f98SSadaf Ebrahimi expected_verify_data,
1216*62c56f98SSadaf Ebrahimi expected_verify_data_len) != 0) {
1217*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(1, ("bad finished message"));
1218*62c56f98SSadaf Ebrahimi
1219*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_DECRYPT_ERROR,
1220*62c56f98SSadaf Ebrahimi MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE);
1221*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
1222*62c56f98SSadaf Ebrahimi }
1223*62c56f98SSadaf Ebrahimi return 0;
1224*62c56f98SSadaf Ebrahimi }
1225*62c56f98SSadaf Ebrahimi
mbedtls_ssl_tls13_process_finished_message(mbedtls_ssl_context * ssl)1226*62c56f98SSadaf Ebrahimi int mbedtls_ssl_tls13_process_finished_message(mbedtls_ssl_context *ssl)
1227*62c56f98SSadaf Ebrahimi {
1228*62c56f98SSadaf Ebrahimi int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1229*62c56f98SSadaf Ebrahimi unsigned char *buf;
1230*62c56f98SSadaf Ebrahimi size_t buf_len;
1231*62c56f98SSadaf Ebrahimi
1232*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse finished message"));
1233*62c56f98SSadaf Ebrahimi
1234*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_tls13_fetch_handshake_msg(
1235*62c56f98SSadaf Ebrahimi ssl, MBEDTLS_SSL_HS_FINISHED, &buf, &buf_len));
1236*62c56f98SSadaf Ebrahimi
1237*62c56f98SSadaf Ebrahimi /* Preprocessing step: Compute handshake digest */
1238*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_PROC_CHK(ssl_tls13_preprocess_finished_message(ssl));
1239*62c56f98SSadaf Ebrahimi
1240*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_PROC_CHK(ssl_tls13_parse_finished_message(
1241*62c56f98SSadaf Ebrahimi ssl, buf, buf + buf_len));
1242*62c56f98SSadaf Ebrahimi
1243*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_add_hs_msg_to_checksum(
1244*62c56f98SSadaf Ebrahimi ssl, MBEDTLS_SSL_HS_FINISHED, buf, buf_len));
1245*62c56f98SSadaf Ebrahimi
1246*62c56f98SSadaf Ebrahimi cleanup:
1247*62c56f98SSadaf Ebrahimi
1248*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse finished message"));
1249*62c56f98SSadaf Ebrahimi return ret;
1250*62c56f98SSadaf Ebrahimi }
1251*62c56f98SSadaf Ebrahimi
1252*62c56f98SSadaf Ebrahimi /*
1253*62c56f98SSadaf Ebrahimi *
1254*62c56f98SSadaf Ebrahimi * STATE HANDLING: Write and send Finished message.
1255*62c56f98SSadaf Ebrahimi *
1256*62c56f98SSadaf Ebrahimi */
1257*62c56f98SSadaf Ebrahimi /*
1258*62c56f98SSadaf Ebrahimi * Implement
1259*62c56f98SSadaf Ebrahimi */
1260*62c56f98SSadaf Ebrahimi
1261*62c56f98SSadaf Ebrahimi MBEDTLS_CHECK_RETURN_CRITICAL
ssl_tls13_prepare_finished_message(mbedtls_ssl_context * ssl)1262*62c56f98SSadaf Ebrahimi static int ssl_tls13_prepare_finished_message(mbedtls_ssl_context *ssl)
1263*62c56f98SSadaf Ebrahimi {
1264*62c56f98SSadaf Ebrahimi int ret;
1265*62c56f98SSadaf Ebrahimi
1266*62c56f98SSadaf Ebrahimi /* Compute transcript of handshake up to now. */
1267*62c56f98SSadaf Ebrahimi ret = mbedtls_ssl_tls13_calculate_verify_data(ssl,
1268*62c56f98SSadaf Ebrahimi ssl->handshake->state_local.finished_out.digest,
1269*62c56f98SSadaf Ebrahimi sizeof(ssl->handshake->state_local.finished_out.
1270*62c56f98SSadaf Ebrahimi digest),
1271*62c56f98SSadaf Ebrahimi &ssl->handshake->state_local.finished_out.digest_len,
1272*62c56f98SSadaf Ebrahimi ssl->conf->endpoint);
1273*62c56f98SSadaf Ebrahimi
1274*62c56f98SSadaf Ebrahimi if (ret != 0) {
1275*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_RET(1, "calculate_verify_data failed", ret);
1276*62c56f98SSadaf Ebrahimi return ret;
1277*62c56f98SSadaf Ebrahimi }
1278*62c56f98SSadaf Ebrahimi
1279*62c56f98SSadaf Ebrahimi return 0;
1280*62c56f98SSadaf Ebrahimi }
1281*62c56f98SSadaf Ebrahimi
1282*62c56f98SSadaf Ebrahimi MBEDTLS_CHECK_RETURN_CRITICAL
ssl_tls13_write_finished_message_body(mbedtls_ssl_context * ssl,unsigned char * buf,unsigned char * end,size_t * out_len)1283*62c56f98SSadaf Ebrahimi static int ssl_tls13_write_finished_message_body(mbedtls_ssl_context *ssl,
1284*62c56f98SSadaf Ebrahimi unsigned char *buf,
1285*62c56f98SSadaf Ebrahimi unsigned char *end,
1286*62c56f98SSadaf Ebrahimi size_t *out_len)
1287*62c56f98SSadaf Ebrahimi {
1288*62c56f98SSadaf Ebrahimi size_t verify_data_len = ssl->handshake->state_local.finished_out.digest_len;
1289*62c56f98SSadaf Ebrahimi /*
1290*62c56f98SSadaf Ebrahimi * struct {
1291*62c56f98SSadaf Ebrahimi * opaque verify_data[Hash.length];
1292*62c56f98SSadaf Ebrahimi * } Finished;
1293*62c56f98SSadaf Ebrahimi */
1294*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_CHK_BUF_PTR(buf, end, verify_data_len);
1295*62c56f98SSadaf Ebrahimi
1296*62c56f98SSadaf Ebrahimi memcpy(buf, ssl->handshake->state_local.finished_out.digest,
1297*62c56f98SSadaf Ebrahimi verify_data_len);
1298*62c56f98SSadaf Ebrahimi
1299*62c56f98SSadaf Ebrahimi *out_len = verify_data_len;
1300*62c56f98SSadaf Ebrahimi return 0;
1301*62c56f98SSadaf Ebrahimi }
1302*62c56f98SSadaf Ebrahimi
1303*62c56f98SSadaf Ebrahimi /* Main entry point: orchestrates the other functions */
mbedtls_ssl_tls13_write_finished_message(mbedtls_ssl_context * ssl)1304*62c56f98SSadaf Ebrahimi int mbedtls_ssl_tls13_write_finished_message(mbedtls_ssl_context *ssl)
1305*62c56f98SSadaf Ebrahimi {
1306*62c56f98SSadaf Ebrahimi int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1307*62c56f98SSadaf Ebrahimi unsigned char *buf;
1308*62c56f98SSadaf Ebrahimi size_t buf_len, msg_len;
1309*62c56f98SSadaf Ebrahimi
1310*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(2, ("=> write finished message"));
1311*62c56f98SSadaf Ebrahimi
1312*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_PROC_CHK(ssl_tls13_prepare_finished_message(ssl));
1313*62c56f98SSadaf Ebrahimi
1314*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_start_handshake_msg(ssl,
1315*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_HS_FINISHED, &buf, &buf_len));
1316*62c56f98SSadaf Ebrahimi
1317*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_PROC_CHK(ssl_tls13_write_finished_message_body(
1318*62c56f98SSadaf Ebrahimi ssl, buf, buf + buf_len, &msg_len));
1319*62c56f98SSadaf Ebrahimi
1320*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_add_hs_msg_to_checksum(ssl,
1321*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_HS_FINISHED, buf, msg_len));
1322*62c56f98SSadaf Ebrahimi
1323*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_finish_handshake_msg(
1324*62c56f98SSadaf Ebrahimi ssl, buf_len, msg_len));
1325*62c56f98SSadaf Ebrahimi cleanup:
1326*62c56f98SSadaf Ebrahimi
1327*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(2, ("<= write finished message"));
1328*62c56f98SSadaf Ebrahimi return ret;
1329*62c56f98SSadaf Ebrahimi }
1330*62c56f98SSadaf Ebrahimi
mbedtls_ssl_tls13_handshake_wrapup(mbedtls_ssl_context * ssl)1331*62c56f98SSadaf Ebrahimi void mbedtls_ssl_tls13_handshake_wrapup(mbedtls_ssl_context *ssl)
1332*62c56f98SSadaf Ebrahimi {
1333*62c56f98SSadaf Ebrahimi
1334*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(3, ("=> handshake wrapup"));
1335*62c56f98SSadaf Ebrahimi
1336*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(1, ("Switch to application keys for inbound traffic"));
1337*62c56f98SSadaf Ebrahimi mbedtls_ssl_set_inbound_transform(ssl, ssl->transform_application);
1338*62c56f98SSadaf Ebrahimi
1339*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(1, ("Switch to application keys for outbound traffic"));
1340*62c56f98SSadaf Ebrahimi mbedtls_ssl_set_outbound_transform(ssl, ssl->transform_application);
1341*62c56f98SSadaf Ebrahimi
1342*62c56f98SSadaf Ebrahimi /*
1343*62c56f98SSadaf Ebrahimi * Free the previous session and switch to the current one.
1344*62c56f98SSadaf Ebrahimi */
1345*62c56f98SSadaf Ebrahimi if (ssl->session) {
1346*62c56f98SSadaf Ebrahimi mbedtls_ssl_session_free(ssl->session);
1347*62c56f98SSadaf Ebrahimi mbedtls_free(ssl->session);
1348*62c56f98SSadaf Ebrahimi }
1349*62c56f98SSadaf Ebrahimi ssl->session = ssl->session_negotiate;
1350*62c56f98SSadaf Ebrahimi ssl->session_negotiate = NULL;
1351*62c56f98SSadaf Ebrahimi
1352*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(3, ("<= handshake wrapup"));
1353*62c56f98SSadaf Ebrahimi }
1354*62c56f98SSadaf Ebrahimi
1355*62c56f98SSadaf Ebrahimi /*
1356*62c56f98SSadaf Ebrahimi *
1357*62c56f98SSadaf Ebrahimi * STATE HANDLING: Write ChangeCipherSpec
1358*62c56f98SSadaf Ebrahimi *
1359*62c56f98SSadaf Ebrahimi */
1360*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE)
1361*62c56f98SSadaf Ebrahimi MBEDTLS_CHECK_RETURN_CRITICAL
ssl_tls13_write_change_cipher_spec_body(mbedtls_ssl_context * ssl,unsigned char * buf,unsigned char * end,size_t * olen)1362*62c56f98SSadaf Ebrahimi static int ssl_tls13_write_change_cipher_spec_body(mbedtls_ssl_context *ssl,
1363*62c56f98SSadaf Ebrahimi unsigned char *buf,
1364*62c56f98SSadaf Ebrahimi unsigned char *end,
1365*62c56f98SSadaf Ebrahimi size_t *olen)
1366*62c56f98SSadaf Ebrahimi {
1367*62c56f98SSadaf Ebrahimi ((void) ssl);
1368*62c56f98SSadaf Ebrahimi
1369*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_CHK_BUF_PTR(buf, end, 1);
1370*62c56f98SSadaf Ebrahimi buf[0] = 1;
1371*62c56f98SSadaf Ebrahimi *olen = 1;
1372*62c56f98SSadaf Ebrahimi
1373*62c56f98SSadaf Ebrahimi return 0;
1374*62c56f98SSadaf Ebrahimi }
1375*62c56f98SSadaf Ebrahimi
mbedtls_ssl_tls13_write_change_cipher_spec(mbedtls_ssl_context * ssl)1376*62c56f98SSadaf Ebrahimi int mbedtls_ssl_tls13_write_change_cipher_spec(mbedtls_ssl_context *ssl)
1377*62c56f98SSadaf Ebrahimi {
1378*62c56f98SSadaf Ebrahimi int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1379*62c56f98SSadaf Ebrahimi
1380*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(2, ("=> write change cipher spec"));
1381*62c56f98SSadaf Ebrahimi
1382*62c56f98SSadaf Ebrahimi /* Write CCS message */
1383*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_PROC_CHK(ssl_tls13_write_change_cipher_spec_body(
1384*62c56f98SSadaf Ebrahimi ssl, ssl->out_msg,
1385*62c56f98SSadaf Ebrahimi ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN,
1386*62c56f98SSadaf Ebrahimi &ssl->out_msglen));
1387*62c56f98SSadaf Ebrahimi
1388*62c56f98SSadaf Ebrahimi ssl->out_msgtype = MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC;
1389*62c56f98SSadaf Ebrahimi
1390*62c56f98SSadaf Ebrahimi /* Dispatch message */
1391*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_write_record(ssl, 0));
1392*62c56f98SSadaf Ebrahimi
1393*62c56f98SSadaf Ebrahimi cleanup:
1394*62c56f98SSadaf Ebrahimi
1395*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(2, ("<= write change cipher spec"));
1396*62c56f98SSadaf Ebrahimi return ret;
1397*62c56f98SSadaf Ebrahimi }
1398*62c56f98SSadaf Ebrahimi
1399*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE */
1400*62c56f98SSadaf Ebrahimi
1401*62c56f98SSadaf Ebrahimi /* Early Data Indication Extension
1402*62c56f98SSadaf Ebrahimi *
1403*62c56f98SSadaf Ebrahimi * struct {
1404*62c56f98SSadaf Ebrahimi * select ( Handshake.msg_type ) {
1405*62c56f98SSadaf Ebrahimi * ...
1406*62c56f98SSadaf Ebrahimi * case client_hello: Empty;
1407*62c56f98SSadaf Ebrahimi * case encrypted_extensions: Empty;
1408*62c56f98SSadaf Ebrahimi * };
1409*62c56f98SSadaf Ebrahimi * } EarlyDataIndication;
1410*62c56f98SSadaf Ebrahimi */
1411*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_EARLY_DATA)
mbedtls_ssl_tls13_write_early_data_ext(mbedtls_ssl_context * ssl,unsigned char * buf,const unsigned char * end,size_t * out_len)1412*62c56f98SSadaf Ebrahimi int mbedtls_ssl_tls13_write_early_data_ext(mbedtls_ssl_context *ssl,
1413*62c56f98SSadaf Ebrahimi unsigned char *buf,
1414*62c56f98SSadaf Ebrahimi const unsigned char *end,
1415*62c56f98SSadaf Ebrahimi size_t *out_len)
1416*62c56f98SSadaf Ebrahimi {
1417*62c56f98SSadaf Ebrahimi unsigned char *p = buf;
1418*62c56f98SSadaf Ebrahimi *out_len = 0;
1419*62c56f98SSadaf Ebrahimi ((void) ssl);
1420*62c56f98SSadaf Ebrahimi
1421*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_CHK_BUF_PTR(p, end, 4);
1422*62c56f98SSadaf Ebrahimi
1423*62c56f98SSadaf Ebrahimi MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_EARLY_DATA, p, 0);
1424*62c56f98SSadaf Ebrahimi MBEDTLS_PUT_UINT16_BE(0, p, 2);
1425*62c56f98SSadaf Ebrahimi
1426*62c56f98SSadaf Ebrahimi *out_len = 4;
1427*62c56f98SSadaf Ebrahimi
1428*62c56f98SSadaf Ebrahimi mbedtls_ssl_tls13_set_hs_sent_ext_mask(ssl, MBEDTLS_TLS_EXT_EARLY_DATA);
1429*62c56f98SSadaf Ebrahimi
1430*62c56f98SSadaf Ebrahimi return 0;
1431*62c56f98SSadaf Ebrahimi }
1432*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_EARLY_DATA */
1433*62c56f98SSadaf Ebrahimi
1434*62c56f98SSadaf Ebrahimi /* Reset SSL context and update hash for handling HRR.
1435*62c56f98SSadaf Ebrahimi *
1436*62c56f98SSadaf Ebrahimi * Replace Transcript-Hash(X) by
1437*62c56f98SSadaf Ebrahimi * Transcript-Hash( message_hash ||
1438*62c56f98SSadaf Ebrahimi * 00 00 Hash.length ||
1439*62c56f98SSadaf Ebrahimi * X )
1440*62c56f98SSadaf Ebrahimi * A few states of the handshake are preserved, including:
1441*62c56f98SSadaf Ebrahimi * - session ID
1442*62c56f98SSadaf Ebrahimi * - session ticket
1443*62c56f98SSadaf Ebrahimi * - negotiated ciphersuite
1444*62c56f98SSadaf Ebrahimi */
mbedtls_ssl_reset_transcript_for_hrr(mbedtls_ssl_context * ssl)1445*62c56f98SSadaf Ebrahimi int mbedtls_ssl_reset_transcript_for_hrr(mbedtls_ssl_context *ssl)
1446*62c56f98SSadaf Ebrahimi {
1447*62c56f98SSadaf Ebrahimi int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1448*62c56f98SSadaf Ebrahimi unsigned char hash_transcript[PSA_HASH_MAX_SIZE + 4];
1449*62c56f98SSadaf Ebrahimi size_t hash_len;
1450*62c56f98SSadaf Ebrahimi const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
1451*62c56f98SSadaf Ebrahimi ssl->handshake->ciphersuite_info;
1452*62c56f98SSadaf Ebrahimi
1453*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(3, ("Reset SSL session for HRR"));
1454*62c56f98SSadaf Ebrahimi
1455*62c56f98SSadaf Ebrahimi ret = mbedtls_ssl_get_handshake_transcript(ssl, ciphersuite_info->mac,
1456*62c56f98SSadaf Ebrahimi hash_transcript + 4,
1457*62c56f98SSadaf Ebrahimi PSA_HASH_MAX_SIZE,
1458*62c56f98SSadaf Ebrahimi &hash_len);
1459*62c56f98SSadaf Ebrahimi if (ret != 0) {
1460*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_get_handshake_transcript", ret);
1461*62c56f98SSadaf Ebrahimi return ret;
1462*62c56f98SSadaf Ebrahimi }
1463*62c56f98SSadaf Ebrahimi
1464*62c56f98SSadaf Ebrahimi hash_transcript[0] = MBEDTLS_SSL_HS_MESSAGE_HASH;
1465*62c56f98SSadaf Ebrahimi hash_transcript[1] = 0;
1466*62c56f98SSadaf Ebrahimi hash_transcript[2] = 0;
1467*62c56f98SSadaf Ebrahimi hash_transcript[3] = (unsigned char) hash_len;
1468*62c56f98SSadaf Ebrahimi
1469*62c56f98SSadaf Ebrahimi hash_len += 4;
1470*62c56f98SSadaf Ebrahimi
1471*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_BUF(4, "Truncated handshake transcript",
1472*62c56f98SSadaf Ebrahimi hash_transcript, hash_len);
1473*62c56f98SSadaf Ebrahimi
1474*62c56f98SSadaf Ebrahimi /* Reset running hash and replace it with a hash of the transcript */
1475*62c56f98SSadaf Ebrahimi ret = mbedtls_ssl_reset_checksum(ssl);
1476*62c56f98SSadaf Ebrahimi if (ret != 0) {
1477*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_reset_checksum", ret);
1478*62c56f98SSadaf Ebrahimi return ret;
1479*62c56f98SSadaf Ebrahimi }
1480*62c56f98SSadaf Ebrahimi ret = ssl->handshake->update_checksum(ssl, hash_transcript, hash_len);
1481*62c56f98SSadaf Ebrahimi if (ret != 0) {
1482*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_RET(1, "update_checksum", ret);
1483*62c56f98SSadaf Ebrahimi return ret;
1484*62c56f98SSadaf Ebrahimi }
1485*62c56f98SSadaf Ebrahimi
1486*62c56f98SSadaf Ebrahimi return ret;
1487*62c56f98SSadaf Ebrahimi }
1488*62c56f98SSadaf Ebrahimi
1489*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_EPHEMERAL_ENABLED)
1490*62c56f98SSadaf Ebrahimi
mbedtls_ssl_tls13_read_public_xxdhe_share(mbedtls_ssl_context * ssl,const unsigned char * buf,size_t buf_len)1491*62c56f98SSadaf Ebrahimi int mbedtls_ssl_tls13_read_public_xxdhe_share(mbedtls_ssl_context *ssl,
1492*62c56f98SSadaf Ebrahimi const unsigned char *buf,
1493*62c56f98SSadaf Ebrahimi size_t buf_len)
1494*62c56f98SSadaf Ebrahimi {
1495*62c56f98SSadaf Ebrahimi uint8_t *p = (uint8_t *) buf;
1496*62c56f98SSadaf Ebrahimi const uint8_t *end = buf + buf_len;
1497*62c56f98SSadaf Ebrahimi mbedtls_ssl_handshake_params *handshake = ssl->handshake;
1498*62c56f98SSadaf Ebrahimi
1499*62c56f98SSadaf Ebrahimi /* Get size of the TLS opaque key_exchange field of the KeyShareEntry struct. */
1500*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 2);
1501*62c56f98SSadaf Ebrahimi uint16_t peerkey_len = MBEDTLS_GET_UINT16_BE(p, 0);
1502*62c56f98SSadaf Ebrahimi p += 2;
1503*62c56f98SSadaf Ebrahimi
1504*62c56f98SSadaf Ebrahimi /* Check if key size is consistent with given buffer length. */
1505*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, peerkey_len);
1506*62c56f98SSadaf Ebrahimi
1507*62c56f98SSadaf Ebrahimi /* Store peer's ECDH/FFDH public key. */
1508*62c56f98SSadaf Ebrahimi if (peerkey_len > sizeof(handshake->xxdh_psa_peerkey)) {
1509*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid public key length: %u > %" MBEDTLS_PRINTF_SIZET,
1510*62c56f98SSadaf Ebrahimi (unsigned) peerkey_len,
1511*62c56f98SSadaf Ebrahimi sizeof(handshake->xxdh_psa_peerkey)));
1512*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
1513*62c56f98SSadaf Ebrahimi }
1514*62c56f98SSadaf Ebrahimi memcpy(handshake->xxdh_psa_peerkey, p, peerkey_len);
1515*62c56f98SSadaf Ebrahimi handshake->xxdh_psa_peerkey_len = peerkey_len;
1516*62c56f98SSadaf Ebrahimi
1517*62c56f98SSadaf Ebrahimi return 0;
1518*62c56f98SSadaf Ebrahimi }
1519*62c56f98SSadaf Ebrahimi
1520*62c56f98SSadaf Ebrahimi #if defined(PSA_WANT_ALG_FFDH)
mbedtls_ssl_get_psa_ffdh_info_from_tls_id(uint16_t tls_id,size_t * bits,psa_key_type_t * key_type)1521*62c56f98SSadaf Ebrahimi static psa_status_t mbedtls_ssl_get_psa_ffdh_info_from_tls_id(
1522*62c56f98SSadaf Ebrahimi uint16_t tls_id, size_t *bits, psa_key_type_t *key_type)
1523*62c56f98SSadaf Ebrahimi {
1524*62c56f98SSadaf Ebrahimi switch (tls_id) {
1525*62c56f98SSadaf Ebrahimi case MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE2048:
1526*62c56f98SSadaf Ebrahimi *bits = 2048;
1527*62c56f98SSadaf Ebrahimi *key_type = PSA_KEY_TYPE_DH_KEY_PAIR(PSA_DH_FAMILY_RFC7919);
1528*62c56f98SSadaf Ebrahimi return PSA_SUCCESS;
1529*62c56f98SSadaf Ebrahimi case MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE3072:
1530*62c56f98SSadaf Ebrahimi *bits = 3072;
1531*62c56f98SSadaf Ebrahimi *key_type = PSA_KEY_TYPE_DH_KEY_PAIR(PSA_DH_FAMILY_RFC7919);
1532*62c56f98SSadaf Ebrahimi return PSA_SUCCESS;
1533*62c56f98SSadaf Ebrahimi case MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE4096:
1534*62c56f98SSadaf Ebrahimi *bits = 4096;
1535*62c56f98SSadaf Ebrahimi *key_type = PSA_KEY_TYPE_DH_KEY_PAIR(PSA_DH_FAMILY_RFC7919);
1536*62c56f98SSadaf Ebrahimi return PSA_SUCCESS;
1537*62c56f98SSadaf Ebrahimi case MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE6144:
1538*62c56f98SSadaf Ebrahimi *bits = 6144;
1539*62c56f98SSadaf Ebrahimi *key_type = PSA_KEY_TYPE_DH_KEY_PAIR(PSA_DH_FAMILY_RFC7919);
1540*62c56f98SSadaf Ebrahimi return PSA_SUCCESS;
1541*62c56f98SSadaf Ebrahimi case MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE8192:
1542*62c56f98SSadaf Ebrahimi *bits = 8192;
1543*62c56f98SSadaf Ebrahimi *key_type = PSA_KEY_TYPE_DH_KEY_PAIR(PSA_DH_FAMILY_RFC7919);
1544*62c56f98SSadaf Ebrahimi return PSA_SUCCESS;
1545*62c56f98SSadaf Ebrahimi default:
1546*62c56f98SSadaf Ebrahimi return PSA_ERROR_NOT_SUPPORTED;
1547*62c56f98SSadaf Ebrahimi }
1548*62c56f98SSadaf Ebrahimi }
1549*62c56f98SSadaf Ebrahimi #endif /* PSA_WANT_ALG_FFDH */
1550*62c56f98SSadaf Ebrahimi
mbedtls_ssl_tls13_generate_and_write_xxdh_key_exchange(mbedtls_ssl_context * ssl,uint16_t named_group,unsigned char * buf,unsigned char * end,size_t * out_len)1551*62c56f98SSadaf Ebrahimi int mbedtls_ssl_tls13_generate_and_write_xxdh_key_exchange(
1552*62c56f98SSadaf Ebrahimi mbedtls_ssl_context *ssl,
1553*62c56f98SSadaf Ebrahimi uint16_t named_group,
1554*62c56f98SSadaf Ebrahimi unsigned char *buf,
1555*62c56f98SSadaf Ebrahimi unsigned char *end,
1556*62c56f98SSadaf Ebrahimi size_t *out_len)
1557*62c56f98SSadaf Ebrahimi {
1558*62c56f98SSadaf Ebrahimi psa_status_t status = PSA_ERROR_GENERIC_ERROR;
1559*62c56f98SSadaf Ebrahimi int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
1560*62c56f98SSadaf Ebrahimi psa_key_attributes_t key_attributes;
1561*62c56f98SSadaf Ebrahimi size_t own_pubkey_len;
1562*62c56f98SSadaf Ebrahimi mbedtls_ssl_handshake_params *handshake = ssl->handshake;
1563*62c56f98SSadaf Ebrahimi size_t bits = 0;
1564*62c56f98SSadaf Ebrahimi psa_key_type_t key_type = PSA_KEY_TYPE_NONE;
1565*62c56f98SSadaf Ebrahimi psa_algorithm_t alg = PSA_ALG_NONE;
1566*62c56f98SSadaf Ebrahimi size_t buf_size = (size_t) (end - buf);
1567*62c56f98SSadaf Ebrahimi
1568*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(1, ("Perform PSA-based ECDH/FFDH computation."));
1569*62c56f98SSadaf Ebrahimi
1570*62c56f98SSadaf Ebrahimi /* Convert EC's TLS ID to PSA key type. */
1571*62c56f98SSadaf Ebrahimi #if defined(PSA_WANT_ALG_ECDH)
1572*62c56f98SSadaf Ebrahimi if (mbedtls_ssl_get_psa_curve_info_from_tls_id(
1573*62c56f98SSadaf Ebrahimi named_group, &key_type, &bits) == PSA_SUCCESS) {
1574*62c56f98SSadaf Ebrahimi alg = PSA_ALG_ECDH;
1575*62c56f98SSadaf Ebrahimi }
1576*62c56f98SSadaf Ebrahimi #endif
1577*62c56f98SSadaf Ebrahimi #if defined(PSA_WANT_ALG_FFDH)
1578*62c56f98SSadaf Ebrahimi if (mbedtls_ssl_get_psa_ffdh_info_from_tls_id(named_group, &bits,
1579*62c56f98SSadaf Ebrahimi &key_type) == PSA_SUCCESS) {
1580*62c56f98SSadaf Ebrahimi alg = PSA_ALG_FFDH;
1581*62c56f98SSadaf Ebrahimi }
1582*62c56f98SSadaf Ebrahimi #endif
1583*62c56f98SSadaf Ebrahimi
1584*62c56f98SSadaf Ebrahimi if (key_type == PSA_KEY_TYPE_NONE) {
1585*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
1586*62c56f98SSadaf Ebrahimi }
1587*62c56f98SSadaf Ebrahimi
1588*62c56f98SSadaf Ebrahimi if (buf_size < PSA_BITS_TO_BYTES(bits)) {
1589*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL;
1590*62c56f98SSadaf Ebrahimi }
1591*62c56f98SSadaf Ebrahimi
1592*62c56f98SSadaf Ebrahimi handshake->xxdh_psa_type = key_type;
1593*62c56f98SSadaf Ebrahimi ssl->handshake->xxdh_psa_bits = bits;
1594*62c56f98SSadaf Ebrahimi
1595*62c56f98SSadaf Ebrahimi key_attributes = psa_key_attributes_init();
1596*62c56f98SSadaf Ebrahimi psa_set_key_usage_flags(&key_attributes, PSA_KEY_USAGE_DERIVE);
1597*62c56f98SSadaf Ebrahimi psa_set_key_algorithm(&key_attributes, alg);
1598*62c56f98SSadaf Ebrahimi psa_set_key_type(&key_attributes, handshake->xxdh_psa_type);
1599*62c56f98SSadaf Ebrahimi psa_set_key_bits(&key_attributes, handshake->xxdh_psa_bits);
1600*62c56f98SSadaf Ebrahimi
1601*62c56f98SSadaf Ebrahimi /* Generate ECDH/FFDH private key. */
1602*62c56f98SSadaf Ebrahimi status = psa_generate_key(&key_attributes,
1603*62c56f98SSadaf Ebrahimi &handshake->xxdh_psa_privkey);
1604*62c56f98SSadaf Ebrahimi if (status != PSA_SUCCESS) {
1605*62c56f98SSadaf Ebrahimi ret = PSA_TO_MBEDTLS_ERR(status);
1606*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_RET(1, "psa_generate_key", ret);
1607*62c56f98SSadaf Ebrahimi return ret;
1608*62c56f98SSadaf Ebrahimi
1609*62c56f98SSadaf Ebrahimi }
1610*62c56f98SSadaf Ebrahimi
1611*62c56f98SSadaf Ebrahimi /* Export the public part of the ECDH/FFDH private key from PSA. */
1612*62c56f98SSadaf Ebrahimi status = psa_export_public_key(handshake->xxdh_psa_privkey,
1613*62c56f98SSadaf Ebrahimi buf, buf_size,
1614*62c56f98SSadaf Ebrahimi &own_pubkey_len);
1615*62c56f98SSadaf Ebrahimi
1616*62c56f98SSadaf Ebrahimi if (status != PSA_SUCCESS) {
1617*62c56f98SSadaf Ebrahimi ret = PSA_TO_MBEDTLS_ERR(status);
1618*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_RET(1, "psa_export_public_key", ret);
1619*62c56f98SSadaf Ebrahimi return ret;
1620*62c56f98SSadaf Ebrahimi }
1621*62c56f98SSadaf Ebrahimi
1622*62c56f98SSadaf Ebrahimi *out_len = own_pubkey_len;
1623*62c56f98SSadaf Ebrahimi
1624*62c56f98SSadaf Ebrahimi return 0;
1625*62c56f98SSadaf Ebrahimi }
1626*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_EPHEMERAL_ENABLED */
1627*62c56f98SSadaf Ebrahimi
1628*62c56f98SSadaf Ebrahimi /* RFC 8446 section 4.2
1629*62c56f98SSadaf Ebrahimi *
1630*62c56f98SSadaf Ebrahimi * If an implementation receives an extension which it recognizes and which is
1631*62c56f98SSadaf Ebrahimi * not specified for the message in which it appears, it MUST abort the handshake
1632*62c56f98SSadaf Ebrahimi * with an "illegal_parameter" alert.
1633*62c56f98SSadaf Ebrahimi *
1634*62c56f98SSadaf Ebrahimi */
mbedtls_ssl_tls13_check_received_extension(mbedtls_ssl_context * ssl,int hs_msg_type,unsigned int received_extension_type,uint32_t hs_msg_allowed_extensions_mask)1635*62c56f98SSadaf Ebrahimi int mbedtls_ssl_tls13_check_received_extension(
1636*62c56f98SSadaf Ebrahimi mbedtls_ssl_context *ssl,
1637*62c56f98SSadaf Ebrahimi int hs_msg_type,
1638*62c56f98SSadaf Ebrahimi unsigned int received_extension_type,
1639*62c56f98SSadaf Ebrahimi uint32_t hs_msg_allowed_extensions_mask)
1640*62c56f98SSadaf Ebrahimi {
1641*62c56f98SSadaf Ebrahimi uint32_t extension_mask = mbedtls_ssl_get_extension_mask(
1642*62c56f98SSadaf Ebrahimi received_extension_type);
1643*62c56f98SSadaf Ebrahimi
1644*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_PRINT_EXT(
1645*62c56f98SSadaf Ebrahimi 3, hs_msg_type, received_extension_type, "received");
1646*62c56f98SSadaf Ebrahimi
1647*62c56f98SSadaf Ebrahimi if ((extension_mask & hs_msg_allowed_extensions_mask) == 0) {
1648*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_PRINT_EXT(
1649*62c56f98SSadaf Ebrahimi 3, hs_msg_type, received_extension_type, "is illegal");
1650*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_PEND_FATAL_ALERT(
1651*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER,
1652*62c56f98SSadaf Ebrahimi MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER);
1653*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
1654*62c56f98SSadaf Ebrahimi }
1655*62c56f98SSadaf Ebrahimi
1656*62c56f98SSadaf Ebrahimi ssl->handshake->received_extensions |= extension_mask;
1657*62c56f98SSadaf Ebrahimi /*
1658*62c56f98SSadaf Ebrahimi * If it is a message containing extension responses, check that we
1659*62c56f98SSadaf Ebrahimi * previously sent the extension.
1660*62c56f98SSadaf Ebrahimi */
1661*62c56f98SSadaf Ebrahimi switch (hs_msg_type) {
1662*62c56f98SSadaf Ebrahimi case MBEDTLS_SSL_HS_SERVER_HELLO:
1663*62c56f98SSadaf Ebrahimi case MBEDTLS_SSL_TLS1_3_HS_HELLO_RETRY_REQUEST:
1664*62c56f98SSadaf Ebrahimi case MBEDTLS_SSL_HS_ENCRYPTED_EXTENSIONS:
1665*62c56f98SSadaf Ebrahimi case MBEDTLS_SSL_HS_CERTIFICATE:
1666*62c56f98SSadaf Ebrahimi /* Check if the received extension is sent by peer message.*/
1667*62c56f98SSadaf Ebrahimi if ((ssl->handshake->sent_extensions & extension_mask) != 0) {
1668*62c56f98SSadaf Ebrahimi return 0;
1669*62c56f98SSadaf Ebrahimi }
1670*62c56f98SSadaf Ebrahimi break;
1671*62c56f98SSadaf Ebrahimi default:
1672*62c56f98SSadaf Ebrahimi return 0;
1673*62c56f98SSadaf Ebrahimi }
1674*62c56f98SSadaf Ebrahimi
1675*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_PRINT_EXT(
1676*62c56f98SSadaf Ebrahimi 3, hs_msg_type, received_extension_type, "is unsupported");
1677*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_PEND_FATAL_ALERT(
1678*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_EXT,
1679*62c56f98SSadaf Ebrahimi MBEDTLS_ERR_SSL_UNSUPPORTED_EXTENSION);
1680*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_UNSUPPORTED_EXTENSION;
1681*62c56f98SSadaf Ebrahimi }
1682*62c56f98SSadaf Ebrahimi
1683*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_RECORD_SIZE_LIMIT)
1684*62c56f98SSadaf Ebrahimi /* RFC 8449, section 4:
1685*62c56f98SSadaf Ebrahimi *
1686*62c56f98SSadaf Ebrahimi * The ExtensionData of the "record_size_limit" extension is
1687*62c56f98SSadaf Ebrahimi * RecordSizeLimit:
1688*62c56f98SSadaf Ebrahimi * uint16 RecordSizeLimit;
1689*62c56f98SSadaf Ebrahimi */
1690*62c56f98SSadaf Ebrahimi MBEDTLS_CHECK_RETURN_CRITICAL
mbedtls_ssl_tls13_parse_record_size_limit_ext(mbedtls_ssl_context * ssl,const unsigned char * buf,const unsigned char * end)1691*62c56f98SSadaf Ebrahimi int mbedtls_ssl_tls13_parse_record_size_limit_ext(mbedtls_ssl_context *ssl,
1692*62c56f98SSadaf Ebrahimi const unsigned char *buf,
1693*62c56f98SSadaf Ebrahimi const unsigned char *end)
1694*62c56f98SSadaf Ebrahimi {
1695*62c56f98SSadaf Ebrahimi const unsigned char *p = buf;
1696*62c56f98SSadaf Ebrahimi uint16_t record_size_limit;
1697*62c56f98SSadaf Ebrahimi const size_t extension_data_len = end - buf;
1698*62c56f98SSadaf Ebrahimi
1699*62c56f98SSadaf Ebrahimi if (extension_data_len !=
1700*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_RECORD_SIZE_LIMIT_EXTENSION_DATA_LENGTH) {
1701*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(2,
1702*62c56f98SSadaf Ebrahimi ("record_size_limit extension has invalid length: %"
1703*62c56f98SSadaf Ebrahimi MBEDTLS_PRINTF_SIZET " Bytes",
1704*62c56f98SSadaf Ebrahimi extension_data_len));
1705*62c56f98SSadaf Ebrahimi
1706*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_PEND_FATAL_ALERT(
1707*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER,
1708*62c56f98SSadaf Ebrahimi MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER);
1709*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
1710*62c56f98SSadaf Ebrahimi }
1711*62c56f98SSadaf Ebrahimi
1712*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 2);
1713*62c56f98SSadaf Ebrahimi record_size_limit = MBEDTLS_GET_UINT16_BE(p, 0);
1714*62c56f98SSadaf Ebrahimi
1715*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(2, ("RecordSizeLimit: %u Bytes", record_size_limit));
1716*62c56f98SSadaf Ebrahimi
1717*62c56f98SSadaf Ebrahimi /* RFC 8449, section 4
1718*62c56f98SSadaf Ebrahimi *
1719*62c56f98SSadaf Ebrahimi * Endpoints MUST NOT send a "record_size_limit" extension with a value
1720*62c56f98SSadaf Ebrahimi * smaller than 64. An endpoint MUST treat receipt of a smaller value
1721*62c56f98SSadaf Ebrahimi * as a fatal error and generate an "illegal_parameter" alert.
1722*62c56f98SSadaf Ebrahimi */
1723*62c56f98SSadaf Ebrahimi if (record_size_limit < MBEDTLS_SSL_RECORD_SIZE_LIMIT_MIN) {
1724*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_PEND_FATAL_ALERT(
1725*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER,
1726*62c56f98SSadaf Ebrahimi MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER);
1727*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
1728*62c56f98SSadaf Ebrahimi }
1729*62c56f98SSadaf Ebrahimi
1730*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_DEBUG_MSG(
1731*62c56f98SSadaf Ebrahimi 2, ("record_size_limit extension is still in development. Aborting handshake."));
1732*62c56f98SSadaf Ebrahimi
1733*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_PEND_FATAL_ALERT(
1734*62c56f98SSadaf Ebrahimi MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_EXT,
1735*62c56f98SSadaf Ebrahimi MBEDTLS_ERR_SSL_UNSUPPORTED_EXTENSION);
1736*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_SSL_UNSUPPORTED_EXTENSION;
1737*62c56f98SSadaf Ebrahimi }
1738*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_RECORD_SIZE_LIMIT */
1739*62c56f98SSadaf Ebrahimi
1740*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_TLS_C && MBEDTLS_SSL_PROTO_TLS1_3 */
1741