xref: /aosp_15_r20/external/mbedtls/library/ssl_tls13_generic.c (revision 62c56f9862f102b96d72393aff6076c951fb8148)
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