xref: /aosp_15_r20/external/mbedtls/library/ssl_tls13_keys.c (revision 62c56f9862f102b96d72393aff6076c951fb8148)
1*62c56f98SSadaf Ebrahimi /*
2*62c56f98SSadaf Ebrahimi  *  TLS 1.3 key schedule
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  *  Licensed under the Apache License, Version 2.0 ( the "License" ); you may
8*62c56f98SSadaf Ebrahimi  *  not use this file except in compliance with the License.
9*62c56f98SSadaf Ebrahimi  *  You may obtain a copy of the License at
10*62c56f98SSadaf Ebrahimi  *
11*62c56f98SSadaf Ebrahimi  *  http://www.apache.org/licenses/LICENSE-2.0
12*62c56f98SSadaf Ebrahimi  *
13*62c56f98SSadaf Ebrahimi  *  Unless required by applicable law or agreed to in writing, software
14*62c56f98SSadaf Ebrahimi  *  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
15*62c56f98SSadaf Ebrahimi  *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16*62c56f98SSadaf Ebrahimi  *  See the License for the specific language governing permissions and
17*62c56f98SSadaf Ebrahimi  *  limitations under the License.
18*62c56f98SSadaf Ebrahimi  */
19*62c56f98SSadaf Ebrahimi 
20*62c56f98SSadaf Ebrahimi #include "common.h"
21*62c56f98SSadaf Ebrahimi 
22*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_PROTO_TLS1_3)
23*62c56f98SSadaf Ebrahimi 
24*62c56f98SSadaf Ebrahimi #include <stdint.h>
25*62c56f98SSadaf Ebrahimi #include <string.h>
26*62c56f98SSadaf Ebrahimi 
27*62c56f98SSadaf Ebrahimi #include "mbedtls/hkdf.h"
28*62c56f98SSadaf Ebrahimi #include "mbedtls/debug.h"
29*62c56f98SSadaf Ebrahimi #include "mbedtls/error.h"
30*62c56f98SSadaf Ebrahimi #include "mbedtls/platform.h"
31*62c56f98SSadaf Ebrahimi 
32*62c56f98SSadaf Ebrahimi #include "ssl_misc.h"
33*62c56f98SSadaf Ebrahimi #include "ssl_tls13_keys.h"
34*62c56f98SSadaf Ebrahimi #include "ssl_tls13_invasive.h"
35*62c56f98SSadaf Ebrahimi 
36*62c56f98SSadaf Ebrahimi #include "psa/crypto.h"
37*62c56f98SSadaf Ebrahimi #include "md_psa.h"
38*62c56f98SSadaf Ebrahimi 
39*62c56f98SSadaf Ebrahimi /* Define a local translating function to save code size by not using too many
40*62c56f98SSadaf Ebrahimi  * arguments in each translating place. */
local_err_translation(psa_status_t status)41*62c56f98SSadaf Ebrahimi static int local_err_translation(psa_status_t status)
42*62c56f98SSadaf Ebrahimi {
43*62c56f98SSadaf Ebrahimi     return psa_status_to_mbedtls(status, psa_to_ssl_errors,
44*62c56f98SSadaf Ebrahimi                                  ARRAY_LENGTH(psa_to_ssl_errors),
45*62c56f98SSadaf Ebrahimi                                  psa_generic_status_to_mbedtls);
46*62c56f98SSadaf Ebrahimi }
47*62c56f98SSadaf Ebrahimi #define PSA_TO_MBEDTLS_ERR(status) local_err_translation(status)
48*62c56f98SSadaf Ebrahimi 
49*62c56f98SSadaf Ebrahimi #define MBEDTLS_SSL_TLS1_3_LABEL(name, string)       \
50*62c56f98SSadaf Ebrahimi     .name = string,
51*62c56f98SSadaf Ebrahimi 
52*62c56f98SSadaf Ebrahimi struct mbedtls_ssl_tls13_labels_struct const mbedtls_ssl_tls13_labels =
53*62c56f98SSadaf Ebrahimi {
54*62c56f98SSadaf Ebrahimi     /* This seems to work in C, despite the string literal being one
55*62c56f98SSadaf Ebrahimi      * character too long due to the 0-termination. */
56*62c56f98SSadaf Ebrahimi     MBEDTLS_SSL_TLS1_3_LABEL_LIST
57*62c56f98SSadaf Ebrahimi };
58*62c56f98SSadaf Ebrahimi 
59*62c56f98SSadaf Ebrahimi #undef MBEDTLS_SSL_TLS1_3_LABEL
60*62c56f98SSadaf Ebrahimi 
61*62c56f98SSadaf Ebrahimi /*
62*62c56f98SSadaf Ebrahimi  * This function creates a HkdfLabel structure used in the TLS 1.3 key schedule.
63*62c56f98SSadaf Ebrahimi  *
64*62c56f98SSadaf Ebrahimi  * The HkdfLabel is specified in RFC 8446 as follows:
65*62c56f98SSadaf Ebrahimi  *
66*62c56f98SSadaf Ebrahimi  * struct HkdfLabel {
67*62c56f98SSadaf Ebrahimi  *   uint16 length;            // Length of expanded key material
68*62c56f98SSadaf Ebrahimi  *   opaque label<7..255>;     // Always prefixed by "tls13 "
69*62c56f98SSadaf Ebrahimi  *   opaque context<0..255>;   // Usually a communication transcript hash
70*62c56f98SSadaf Ebrahimi  * };
71*62c56f98SSadaf Ebrahimi  *
72*62c56f98SSadaf Ebrahimi  * Parameters:
73*62c56f98SSadaf Ebrahimi  * - desired_length: Length of expanded key material
74*62c56f98SSadaf Ebrahimi  *                   Even though the standard allows expansion to up to
75*62c56f98SSadaf Ebrahimi  *                   2**16 Bytes, TLS 1.3 never uses expansion to more than
76*62c56f98SSadaf Ebrahimi  *                   255 Bytes, so we require `desired_length` to be at most
77*62c56f98SSadaf Ebrahimi  *                   255. This allows us to save a few Bytes of code by
78*62c56f98SSadaf Ebrahimi  *                   hardcoding the writing of the high bytes.
79*62c56f98SSadaf Ebrahimi  * - (label, label_len): label + label length, without "tls13 " prefix
80*62c56f98SSadaf Ebrahimi  *                       The label length MUST be less than or equal to
81*62c56f98SSadaf Ebrahimi  *                       MBEDTLS_SSL_TLS1_3_KEY_SCHEDULE_MAX_LABEL_LEN
82*62c56f98SSadaf Ebrahimi  *                       It is the caller's responsibility to ensure this.
83*62c56f98SSadaf Ebrahimi  *                       All (label, label length) pairs used in TLS 1.3
84*62c56f98SSadaf Ebrahimi  *                       can be obtained via MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN().
85*62c56f98SSadaf Ebrahimi  * - (ctx, ctx_len): context + context length
86*62c56f98SSadaf Ebrahimi  *                   The context length MUST be less than or equal to
87*62c56f98SSadaf Ebrahimi  *                   MBEDTLS_SSL_TLS1_3_KEY_SCHEDULE_MAX_CONTEXT_LEN
88*62c56f98SSadaf Ebrahimi  *                   It is the caller's responsibility to ensure this.
89*62c56f98SSadaf Ebrahimi  * - dst: Target buffer for HkdfLabel structure,
90*62c56f98SSadaf Ebrahimi  *        This MUST be a writable buffer of size
91*62c56f98SSadaf Ebrahimi  *        at least SSL_TLS1_3_KEY_SCHEDULE_MAX_HKDF_LABEL_LEN Bytes.
92*62c56f98SSadaf Ebrahimi  * - dst_len: Pointer at which to store the actual length of
93*62c56f98SSadaf Ebrahimi  *            the HkdfLabel structure on success.
94*62c56f98SSadaf Ebrahimi  */
95*62c56f98SSadaf Ebrahimi 
96*62c56f98SSadaf Ebrahimi static const char tls13_label_prefix[6] = "tls13 ";
97*62c56f98SSadaf Ebrahimi 
98*62c56f98SSadaf Ebrahimi #define SSL_TLS1_3_KEY_SCHEDULE_HKDF_LABEL_LEN(label_len, context_len) \
99*62c56f98SSadaf Ebrahimi     (2                     /* expansion length           */ \
100*62c56f98SSadaf Ebrahimi      + 1                   /* label length               */ \
101*62c56f98SSadaf Ebrahimi      + label_len                                           \
102*62c56f98SSadaf Ebrahimi      + 1                   /* context length             */ \
103*62c56f98SSadaf Ebrahimi      + context_len)
104*62c56f98SSadaf Ebrahimi 
105*62c56f98SSadaf Ebrahimi #define SSL_TLS1_3_KEY_SCHEDULE_MAX_HKDF_LABEL_LEN                      \
106*62c56f98SSadaf Ebrahimi     SSL_TLS1_3_KEY_SCHEDULE_HKDF_LABEL_LEN(                             \
107*62c56f98SSadaf Ebrahimi         sizeof(tls13_label_prefix) +                       \
108*62c56f98SSadaf Ebrahimi         MBEDTLS_SSL_TLS1_3_KEY_SCHEDULE_MAX_LABEL_LEN,     \
109*62c56f98SSadaf Ebrahimi         MBEDTLS_SSL_TLS1_3_KEY_SCHEDULE_MAX_CONTEXT_LEN)
110*62c56f98SSadaf Ebrahimi 
ssl_tls13_hkdf_encode_label(size_t desired_length,const unsigned char * label,size_t label_len,const unsigned char * ctx,size_t ctx_len,unsigned char * dst,size_t * dst_len)111*62c56f98SSadaf Ebrahimi static void ssl_tls13_hkdf_encode_label(
112*62c56f98SSadaf Ebrahimi     size_t desired_length,
113*62c56f98SSadaf Ebrahimi     const unsigned char *label, size_t label_len,
114*62c56f98SSadaf Ebrahimi     const unsigned char *ctx, size_t ctx_len,
115*62c56f98SSadaf Ebrahimi     unsigned char *dst, size_t *dst_len)
116*62c56f98SSadaf Ebrahimi {
117*62c56f98SSadaf Ebrahimi     size_t total_label_len =
118*62c56f98SSadaf Ebrahimi         sizeof(tls13_label_prefix) + label_len;
119*62c56f98SSadaf Ebrahimi     size_t total_hkdf_lbl_len =
120*62c56f98SSadaf Ebrahimi         SSL_TLS1_3_KEY_SCHEDULE_HKDF_LABEL_LEN(total_label_len, ctx_len);
121*62c56f98SSadaf Ebrahimi 
122*62c56f98SSadaf Ebrahimi     unsigned char *p = dst;
123*62c56f98SSadaf Ebrahimi 
124*62c56f98SSadaf Ebrahimi     /* Add the size of the expanded key material.
125*62c56f98SSadaf Ebrahimi      * We're hardcoding the high byte to 0 here assuming that we never use
126*62c56f98SSadaf Ebrahimi      * TLS 1.3 HKDF key expansion to more than 255 Bytes. */
127*62c56f98SSadaf Ebrahimi #if MBEDTLS_SSL_TLS1_3_KEY_SCHEDULE_MAX_EXPANSION_LEN > 255
128*62c56f98SSadaf Ebrahimi #error "The implementation of ssl_tls13_hkdf_encode_label() is not fit for the \
129*62c56f98SSadaf Ebrahimi     value of MBEDTLS_SSL_TLS1_3_KEY_SCHEDULE_MAX_EXPANSION_LEN"
130*62c56f98SSadaf Ebrahimi #endif
131*62c56f98SSadaf Ebrahimi 
132*62c56f98SSadaf Ebrahimi     *p++ = 0;
133*62c56f98SSadaf Ebrahimi     *p++ = MBEDTLS_BYTE_0(desired_length);
134*62c56f98SSadaf Ebrahimi 
135*62c56f98SSadaf Ebrahimi     /* Add label incl. prefix */
136*62c56f98SSadaf Ebrahimi     *p++ = MBEDTLS_BYTE_0(total_label_len);
137*62c56f98SSadaf Ebrahimi     memcpy(p, tls13_label_prefix, sizeof(tls13_label_prefix));
138*62c56f98SSadaf Ebrahimi     p += sizeof(tls13_label_prefix);
139*62c56f98SSadaf Ebrahimi     memcpy(p, label, label_len);
140*62c56f98SSadaf Ebrahimi     p += label_len;
141*62c56f98SSadaf Ebrahimi 
142*62c56f98SSadaf Ebrahimi     /* Add context value */
143*62c56f98SSadaf Ebrahimi     *p++ = MBEDTLS_BYTE_0(ctx_len);
144*62c56f98SSadaf Ebrahimi     if (ctx_len != 0) {
145*62c56f98SSadaf Ebrahimi         memcpy(p, ctx, ctx_len);
146*62c56f98SSadaf Ebrahimi     }
147*62c56f98SSadaf Ebrahimi 
148*62c56f98SSadaf Ebrahimi     /* Return total length to the caller.  */
149*62c56f98SSadaf Ebrahimi     *dst_len = total_hkdf_lbl_len;
150*62c56f98SSadaf Ebrahimi }
151*62c56f98SSadaf Ebrahimi 
mbedtls_ssl_tls13_hkdf_expand_label(psa_algorithm_t hash_alg,const unsigned char * secret,size_t secret_len,const unsigned char * label,size_t label_len,const unsigned char * ctx,size_t ctx_len,unsigned char * buf,size_t buf_len)152*62c56f98SSadaf Ebrahimi int mbedtls_ssl_tls13_hkdf_expand_label(
153*62c56f98SSadaf Ebrahimi     psa_algorithm_t hash_alg,
154*62c56f98SSadaf Ebrahimi     const unsigned char *secret, size_t secret_len,
155*62c56f98SSadaf Ebrahimi     const unsigned char *label, size_t label_len,
156*62c56f98SSadaf Ebrahimi     const unsigned char *ctx, size_t ctx_len,
157*62c56f98SSadaf Ebrahimi     unsigned char *buf, size_t buf_len)
158*62c56f98SSadaf Ebrahimi {
159*62c56f98SSadaf Ebrahimi     unsigned char hkdf_label[SSL_TLS1_3_KEY_SCHEDULE_MAX_HKDF_LABEL_LEN];
160*62c56f98SSadaf Ebrahimi     size_t hkdf_label_len = 0;
161*62c56f98SSadaf Ebrahimi     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
162*62c56f98SSadaf Ebrahimi     psa_status_t abort_status = PSA_ERROR_CORRUPTION_DETECTED;
163*62c56f98SSadaf Ebrahimi     psa_key_derivation_operation_t operation =
164*62c56f98SSadaf Ebrahimi         PSA_KEY_DERIVATION_OPERATION_INIT;
165*62c56f98SSadaf Ebrahimi 
166*62c56f98SSadaf Ebrahimi     if (label_len > MBEDTLS_SSL_TLS1_3_KEY_SCHEDULE_MAX_LABEL_LEN) {
167*62c56f98SSadaf Ebrahimi         /* Should never happen since this is an internal
168*62c56f98SSadaf Ebrahimi          * function, and we know statically which labels
169*62c56f98SSadaf Ebrahimi          * are allowed. */
170*62c56f98SSadaf Ebrahimi         return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
171*62c56f98SSadaf Ebrahimi     }
172*62c56f98SSadaf Ebrahimi 
173*62c56f98SSadaf Ebrahimi     if (ctx_len > MBEDTLS_SSL_TLS1_3_KEY_SCHEDULE_MAX_CONTEXT_LEN) {
174*62c56f98SSadaf Ebrahimi         /* Should not happen, as above. */
175*62c56f98SSadaf Ebrahimi         return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
176*62c56f98SSadaf Ebrahimi     }
177*62c56f98SSadaf Ebrahimi 
178*62c56f98SSadaf Ebrahimi     if (buf_len > MBEDTLS_SSL_TLS1_3_KEY_SCHEDULE_MAX_EXPANSION_LEN) {
179*62c56f98SSadaf Ebrahimi         /* Should not happen, as above. */
180*62c56f98SSadaf Ebrahimi         return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
181*62c56f98SSadaf Ebrahimi     }
182*62c56f98SSadaf Ebrahimi 
183*62c56f98SSadaf Ebrahimi     if (!PSA_ALG_IS_HASH(hash_alg)) {
184*62c56f98SSadaf Ebrahimi         return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
185*62c56f98SSadaf Ebrahimi     }
186*62c56f98SSadaf Ebrahimi 
187*62c56f98SSadaf Ebrahimi     ssl_tls13_hkdf_encode_label(buf_len,
188*62c56f98SSadaf Ebrahimi                                 label, label_len,
189*62c56f98SSadaf Ebrahimi                                 ctx, ctx_len,
190*62c56f98SSadaf Ebrahimi                                 hkdf_label,
191*62c56f98SSadaf Ebrahimi                                 &hkdf_label_len);
192*62c56f98SSadaf Ebrahimi 
193*62c56f98SSadaf Ebrahimi     status = psa_key_derivation_setup(&operation, PSA_ALG_HKDF_EXPAND(hash_alg));
194*62c56f98SSadaf Ebrahimi 
195*62c56f98SSadaf Ebrahimi     if (status != PSA_SUCCESS) {
196*62c56f98SSadaf Ebrahimi         goto cleanup;
197*62c56f98SSadaf Ebrahimi     }
198*62c56f98SSadaf Ebrahimi 
199*62c56f98SSadaf Ebrahimi     status = psa_key_derivation_input_bytes(&operation,
200*62c56f98SSadaf Ebrahimi                                             PSA_KEY_DERIVATION_INPUT_SECRET,
201*62c56f98SSadaf Ebrahimi                                             secret,
202*62c56f98SSadaf Ebrahimi                                             secret_len);
203*62c56f98SSadaf Ebrahimi 
204*62c56f98SSadaf Ebrahimi     if (status != PSA_SUCCESS) {
205*62c56f98SSadaf Ebrahimi         goto cleanup;
206*62c56f98SSadaf Ebrahimi     }
207*62c56f98SSadaf Ebrahimi 
208*62c56f98SSadaf Ebrahimi     status = psa_key_derivation_input_bytes(&operation,
209*62c56f98SSadaf Ebrahimi                                             PSA_KEY_DERIVATION_INPUT_INFO,
210*62c56f98SSadaf Ebrahimi                                             hkdf_label,
211*62c56f98SSadaf Ebrahimi                                             hkdf_label_len);
212*62c56f98SSadaf Ebrahimi 
213*62c56f98SSadaf Ebrahimi     if (status != PSA_SUCCESS) {
214*62c56f98SSadaf Ebrahimi         goto cleanup;
215*62c56f98SSadaf Ebrahimi     }
216*62c56f98SSadaf Ebrahimi 
217*62c56f98SSadaf Ebrahimi     status = psa_key_derivation_output_bytes(&operation,
218*62c56f98SSadaf Ebrahimi                                              buf,
219*62c56f98SSadaf Ebrahimi                                              buf_len);
220*62c56f98SSadaf Ebrahimi 
221*62c56f98SSadaf Ebrahimi     if (status != PSA_SUCCESS) {
222*62c56f98SSadaf Ebrahimi         goto cleanup;
223*62c56f98SSadaf Ebrahimi     }
224*62c56f98SSadaf Ebrahimi 
225*62c56f98SSadaf Ebrahimi cleanup:
226*62c56f98SSadaf Ebrahimi     abort_status = psa_key_derivation_abort(&operation);
227*62c56f98SSadaf Ebrahimi     status = (status == PSA_SUCCESS ? abort_status : status);
228*62c56f98SSadaf Ebrahimi     mbedtls_platform_zeroize(hkdf_label, hkdf_label_len);
229*62c56f98SSadaf Ebrahimi     return PSA_TO_MBEDTLS_ERR(status);
230*62c56f98SSadaf Ebrahimi }
231*62c56f98SSadaf Ebrahimi 
232*62c56f98SSadaf Ebrahimi MBEDTLS_CHECK_RETURN_CRITICAL
ssl_tls13_make_traffic_key(psa_algorithm_t hash_alg,const unsigned char * secret,size_t secret_len,unsigned char * key,size_t key_len,unsigned char * iv,size_t iv_len)233*62c56f98SSadaf Ebrahimi static int ssl_tls13_make_traffic_key(
234*62c56f98SSadaf Ebrahimi     psa_algorithm_t hash_alg,
235*62c56f98SSadaf Ebrahimi     const unsigned char *secret, size_t secret_len,
236*62c56f98SSadaf Ebrahimi     unsigned char *key, size_t key_len,
237*62c56f98SSadaf Ebrahimi     unsigned char *iv, size_t iv_len)
238*62c56f98SSadaf Ebrahimi {
239*62c56f98SSadaf Ebrahimi     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
240*62c56f98SSadaf Ebrahimi 
241*62c56f98SSadaf Ebrahimi     ret = mbedtls_ssl_tls13_hkdf_expand_label(
242*62c56f98SSadaf Ebrahimi         hash_alg,
243*62c56f98SSadaf Ebrahimi         secret, secret_len,
244*62c56f98SSadaf Ebrahimi         MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN(key),
245*62c56f98SSadaf Ebrahimi         NULL, 0,
246*62c56f98SSadaf Ebrahimi         key, key_len);
247*62c56f98SSadaf Ebrahimi     if (ret != 0) {
248*62c56f98SSadaf Ebrahimi         return ret;
249*62c56f98SSadaf Ebrahimi     }
250*62c56f98SSadaf Ebrahimi 
251*62c56f98SSadaf Ebrahimi     ret = mbedtls_ssl_tls13_hkdf_expand_label(
252*62c56f98SSadaf Ebrahimi         hash_alg,
253*62c56f98SSadaf Ebrahimi         secret, secret_len,
254*62c56f98SSadaf Ebrahimi         MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN(iv),
255*62c56f98SSadaf Ebrahimi         NULL, 0,
256*62c56f98SSadaf Ebrahimi         iv, iv_len);
257*62c56f98SSadaf Ebrahimi     return ret;
258*62c56f98SSadaf Ebrahimi }
259*62c56f98SSadaf Ebrahimi 
260*62c56f98SSadaf Ebrahimi /*
261*62c56f98SSadaf Ebrahimi  * The traffic keying material is generated from the following inputs:
262*62c56f98SSadaf Ebrahimi  *
263*62c56f98SSadaf Ebrahimi  *  - One secret value per sender.
264*62c56f98SSadaf Ebrahimi  *  - A purpose value indicating the specific value being generated
265*62c56f98SSadaf Ebrahimi  *  - The desired lengths of key and IV.
266*62c56f98SSadaf Ebrahimi  *
267*62c56f98SSadaf Ebrahimi  * The expansion itself is based on HKDF:
268*62c56f98SSadaf Ebrahimi  *
269*62c56f98SSadaf Ebrahimi  *   [sender]_write_key = HKDF-Expand-Label( Secret, "key", "", key_length )
270*62c56f98SSadaf Ebrahimi  *   [sender]_write_iv  = HKDF-Expand-Label( Secret, "iv" , "", iv_length )
271*62c56f98SSadaf Ebrahimi  *
272*62c56f98SSadaf Ebrahimi  * [sender] denotes the sending side and the Secret value is provided
273*62c56f98SSadaf Ebrahimi  * by the function caller. Note that we generate server and client side
274*62c56f98SSadaf Ebrahimi  * keys in a single function call.
275*62c56f98SSadaf Ebrahimi  */
mbedtls_ssl_tls13_make_traffic_keys(psa_algorithm_t hash_alg,const unsigned char * client_secret,const unsigned char * server_secret,size_t secret_len,size_t key_len,size_t iv_len,mbedtls_ssl_key_set * keys)276*62c56f98SSadaf Ebrahimi int mbedtls_ssl_tls13_make_traffic_keys(
277*62c56f98SSadaf Ebrahimi     psa_algorithm_t hash_alg,
278*62c56f98SSadaf Ebrahimi     const unsigned char *client_secret,
279*62c56f98SSadaf Ebrahimi     const unsigned char *server_secret, size_t secret_len,
280*62c56f98SSadaf Ebrahimi     size_t key_len, size_t iv_len,
281*62c56f98SSadaf Ebrahimi     mbedtls_ssl_key_set *keys)
282*62c56f98SSadaf Ebrahimi {
283*62c56f98SSadaf Ebrahimi     int ret = 0;
284*62c56f98SSadaf Ebrahimi 
285*62c56f98SSadaf Ebrahimi     ret = ssl_tls13_make_traffic_key(
286*62c56f98SSadaf Ebrahimi         hash_alg, client_secret, secret_len,
287*62c56f98SSadaf Ebrahimi         keys->client_write_key, key_len,
288*62c56f98SSadaf Ebrahimi         keys->client_write_iv, iv_len);
289*62c56f98SSadaf Ebrahimi     if (ret != 0) {
290*62c56f98SSadaf Ebrahimi         return ret;
291*62c56f98SSadaf Ebrahimi     }
292*62c56f98SSadaf Ebrahimi 
293*62c56f98SSadaf Ebrahimi     ret = ssl_tls13_make_traffic_key(
294*62c56f98SSadaf Ebrahimi         hash_alg, server_secret, secret_len,
295*62c56f98SSadaf Ebrahimi         keys->server_write_key, key_len,
296*62c56f98SSadaf Ebrahimi         keys->server_write_iv, iv_len);
297*62c56f98SSadaf Ebrahimi     if (ret != 0) {
298*62c56f98SSadaf Ebrahimi         return ret;
299*62c56f98SSadaf Ebrahimi     }
300*62c56f98SSadaf Ebrahimi 
301*62c56f98SSadaf Ebrahimi     keys->key_len = key_len;
302*62c56f98SSadaf Ebrahimi     keys->iv_len = iv_len;
303*62c56f98SSadaf Ebrahimi 
304*62c56f98SSadaf Ebrahimi     return 0;
305*62c56f98SSadaf Ebrahimi }
306*62c56f98SSadaf Ebrahimi 
mbedtls_ssl_tls13_derive_secret(psa_algorithm_t hash_alg,const unsigned char * secret,size_t secret_len,const unsigned char * label,size_t label_len,const unsigned char * ctx,size_t ctx_len,int ctx_hashed,unsigned char * dstbuf,size_t dstbuf_len)307*62c56f98SSadaf Ebrahimi int mbedtls_ssl_tls13_derive_secret(
308*62c56f98SSadaf Ebrahimi     psa_algorithm_t hash_alg,
309*62c56f98SSadaf Ebrahimi     const unsigned char *secret, size_t secret_len,
310*62c56f98SSadaf Ebrahimi     const unsigned char *label, size_t label_len,
311*62c56f98SSadaf Ebrahimi     const unsigned char *ctx, size_t ctx_len,
312*62c56f98SSadaf Ebrahimi     int ctx_hashed,
313*62c56f98SSadaf Ebrahimi     unsigned char *dstbuf, size_t dstbuf_len)
314*62c56f98SSadaf Ebrahimi {
315*62c56f98SSadaf Ebrahimi     int ret;
316*62c56f98SSadaf Ebrahimi     unsigned char hashed_context[PSA_HASH_MAX_SIZE];
317*62c56f98SSadaf Ebrahimi     if (ctx_hashed == MBEDTLS_SSL_TLS1_3_CONTEXT_UNHASHED) {
318*62c56f98SSadaf Ebrahimi         psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
319*62c56f98SSadaf Ebrahimi 
320*62c56f98SSadaf Ebrahimi         status = psa_hash_compute(hash_alg, ctx, ctx_len, hashed_context,
321*62c56f98SSadaf Ebrahimi                                   PSA_HASH_LENGTH(hash_alg), &ctx_len);
322*62c56f98SSadaf Ebrahimi         if (status != PSA_SUCCESS) {
323*62c56f98SSadaf Ebrahimi             ret = PSA_TO_MBEDTLS_ERR(status);
324*62c56f98SSadaf Ebrahimi             return ret;
325*62c56f98SSadaf Ebrahimi         }
326*62c56f98SSadaf Ebrahimi     } else {
327*62c56f98SSadaf Ebrahimi         if (ctx_len > sizeof(hashed_context)) {
328*62c56f98SSadaf Ebrahimi             /* This should never happen since this function is internal
329*62c56f98SSadaf Ebrahimi              * and the code sets `ctx_hashed` correctly.
330*62c56f98SSadaf Ebrahimi              * Let's double-check nonetheless to not run at the risk
331*62c56f98SSadaf Ebrahimi              * of getting a stack overflow. */
332*62c56f98SSadaf Ebrahimi             return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
333*62c56f98SSadaf Ebrahimi         }
334*62c56f98SSadaf Ebrahimi 
335*62c56f98SSadaf Ebrahimi         memcpy(hashed_context, ctx, ctx_len);
336*62c56f98SSadaf Ebrahimi     }
337*62c56f98SSadaf Ebrahimi 
338*62c56f98SSadaf Ebrahimi     return mbedtls_ssl_tls13_hkdf_expand_label(hash_alg,
339*62c56f98SSadaf Ebrahimi                                                secret, secret_len,
340*62c56f98SSadaf Ebrahimi                                                label, label_len,
341*62c56f98SSadaf Ebrahimi                                                hashed_context, ctx_len,
342*62c56f98SSadaf Ebrahimi                                                dstbuf, dstbuf_len);
343*62c56f98SSadaf Ebrahimi 
344*62c56f98SSadaf Ebrahimi }
345*62c56f98SSadaf Ebrahimi 
mbedtls_ssl_tls13_evolve_secret(psa_algorithm_t hash_alg,const unsigned char * secret_old,const unsigned char * input,size_t input_len,unsigned char * secret_new)346*62c56f98SSadaf Ebrahimi int mbedtls_ssl_tls13_evolve_secret(
347*62c56f98SSadaf Ebrahimi     psa_algorithm_t hash_alg,
348*62c56f98SSadaf Ebrahimi     const unsigned char *secret_old,
349*62c56f98SSadaf Ebrahimi     const unsigned char *input, size_t input_len,
350*62c56f98SSadaf Ebrahimi     unsigned char *secret_new)
351*62c56f98SSadaf Ebrahimi {
352*62c56f98SSadaf Ebrahimi     int ret = MBEDTLS_ERR_SSL_INTERNAL_ERROR;
353*62c56f98SSadaf Ebrahimi     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
354*62c56f98SSadaf Ebrahimi     psa_status_t abort_status = PSA_ERROR_CORRUPTION_DETECTED;
355*62c56f98SSadaf Ebrahimi     size_t hlen;
356*62c56f98SSadaf Ebrahimi     unsigned char tmp_secret[PSA_MAC_MAX_SIZE] = { 0 };
357*62c56f98SSadaf Ebrahimi     const unsigned char all_zeroes_input[MBEDTLS_TLS1_3_MD_MAX_SIZE] = { 0 };
358*62c56f98SSadaf Ebrahimi     const unsigned char *l_input = NULL;
359*62c56f98SSadaf Ebrahimi     size_t l_input_len;
360*62c56f98SSadaf Ebrahimi 
361*62c56f98SSadaf Ebrahimi     psa_key_derivation_operation_t operation =
362*62c56f98SSadaf Ebrahimi         PSA_KEY_DERIVATION_OPERATION_INIT;
363*62c56f98SSadaf Ebrahimi 
364*62c56f98SSadaf Ebrahimi     if (!PSA_ALG_IS_HASH(hash_alg)) {
365*62c56f98SSadaf Ebrahimi         return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
366*62c56f98SSadaf Ebrahimi     }
367*62c56f98SSadaf Ebrahimi 
368*62c56f98SSadaf Ebrahimi     hlen = PSA_HASH_LENGTH(hash_alg);
369*62c56f98SSadaf Ebrahimi 
370*62c56f98SSadaf Ebrahimi     /* For non-initial runs, call Derive-Secret( ., "derived", "")
371*62c56f98SSadaf Ebrahimi      * on the old secret. */
372*62c56f98SSadaf Ebrahimi     if (secret_old != NULL) {
373*62c56f98SSadaf Ebrahimi         ret = mbedtls_ssl_tls13_derive_secret(
374*62c56f98SSadaf Ebrahimi             hash_alg,
375*62c56f98SSadaf Ebrahimi             secret_old, hlen,
376*62c56f98SSadaf Ebrahimi             MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN(derived),
377*62c56f98SSadaf Ebrahimi             NULL, 0,        /* context */
378*62c56f98SSadaf Ebrahimi             MBEDTLS_SSL_TLS1_3_CONTEXT_UNHASHED,
379*62c56f98SSadaf Ebrahimi             tmp_secret, hlen);
380*62c56f98SSadaf Ebrahimi         if (ret != 0) {
381*62c56f98SSadaf Ebrahimi             goto cleanup;
382*62c56f98SSadaf Ebrahimi         }
383*62c56f98SSadaf Ebrahimi     }
384*62c56f98SSadaf Ebrahimi 
385*62c56f98SSadaf Ebrahimi     ret = 0;
386*62c56f98SSadaf Ebrahimi 
387*62c56f98SSadaf Ebrahimi     if (input != NULL && input_len != 0) {
388*62c56f98SSadaf Ebrahimi         l_input = input;
389*62c56f98SSadaf Ebrahimi         l_input_len = input_len;
390*62c56f98SSadaf Ebrahimi     } else {
391*62c56f98SSadaf Ebrahimi         l_input = all_zeroes_input;
392*62c56f98SSadaf Ebrahimi         l_input_len = hlen;
393*62c56f98SSadaf Ebrahimi     }
394*62c56f98SSadaf Ebrahimi 
395*62c56f98SSadaf Ebrahimi     status = psa_key_derivation_setup(&operation,
396*62c56f98SSadaf Ebrahimi                                       PSA_ALG_HKDF_EXTRACT(hash_alg));
397*62c56f98SSadaf Ebrahimi 
398*62c56f98SSadaf Ebrahimi     if (status != PSA_SUCCESS) {
399*62c56f98SSadaf Ebrahimi         goto cleanup;
400*62c56f98SSadaf Ebrahimi     }
401*62c56f98SSadaf Ebrahimi 
402*62c56f98SSadaf Ebrahimi     status = psa_key_derivation_input_bytes(&operation,
403*62c56f98SSadaf Ebrahimi                                             PSA_KEY_DERIVATION_INPUT_SALT,
404*62c56f98SSadaf Ebrahimi                                             tmp_secret,
405*62c56f98SSadaf Ebrahimi                                             hlen);
406*62c56f98SSadaf Ebrahimi 
407*62c56f98SSadaf Ebrahimi     if (status != PSA_SUCCESS) {
408*62c56f98SSadaf Ebrahimi         goto cleanup;
409*62c56f98SSadaf Ebrahimi     }
410*62c56f98SSadaf Ebrahimi 
411*62c56f98SSadaf Ebrahimi     status = psa_key_derivation_input_bytes(&operation,
412*62c56f98SSadaf Ebrahimi                                             PSA_KEY_DERIVATION_INPUT_SECRET,
413*62c56f98SSadaf Ebrahimi                                             l_input, l_input_len);
414*62c56f98SSadaf Ebrahimi 
415*62c56f98SSadaf Ebrahimi     if (status != PSA_SUCCESS) {
416*62c56f98SSadaf Ebrahimi         goto cleanup;
417*62c56f98SSadaf Ebrahimi     }
418*62c56f98SSadaf Ebrahimi 
419*62c56f98SSadaf Ebrahimi     status = psa_key_derivation_output_bytes(&operation,
420*62c56f98SSadaf Ebrahimi                                              secret_new,
421*62c56f98SSadaf Ebrahimi                                              PSA_HASH_LENGTH(hash_alg));
422*62c56f98SSadaf Ebrahimi 
423*62c56f98SSadaf Ebrahimi     if (status != PSA_SUCCESS) {
424*62c56f98SSadaf Ebrahimi         goto cleanup;
425*62c56f98SSadaf Ebrahimi     }
426*62c56f98SSadaf Ebrahimi 
427*62c56f98SSadaf Ebrahimi cleanup:
428*62c56f98SSadaf Ebrahimi     abort_status = psa_key_derivation_abort(&operation);
429*62c56f98SSadaf Ebrahimi     status = (status == PSA_SUCCESS ? abort_status : status);
430*62c56f98SSadaf Ebrahimi     ret = (ret == 0 ? PSA_TO_MBEDTLS_ERR(status) : ret);
431*62c56f98SSadaf Ebrahimi     mbedtls_platform_zeroize(tmp_secret, sizeof(tmp_secret));
432*62c56f98SSadaf Ebrahimi     return ret;
433*62c56f98SSadaf Ebrahimi }
434*62c56f98SSadaf Ebrahimi 
mbedtls_ssl_tls13_derive_early_secrets(psa_algorithm_t hash_alg,unsigned char const * early_secret,unsigned char const * transcript,size_t transcript_len,mbedtls_ssl_tls13_early_secrets * derived)435*62c56f98SSadaf Ebrahimi int mbedtls_ssl_tls13_derive_early_secrets(
436*62c56f98SSadaf Ebrahimi     psa_algorithm_t hash_alg,
437*62c56f98SSadaf Ebrahimi     unsigned char const *early_secret,
438*62c56f98SSadaf Ebrahimi     unsigned char const *transcript, size_t transcript_len,
439*62c56f98SSadaf Ebrahimi     mbedtls_ssl_tls13_early_secrets *derived)
440*62c56f98SSadaf Ebrahimi {
441*62c56f98SSadaf Ebrahimi     int ret;
442*62c56f98SSadaf Ebrahimi     size_t const hash_len = PSA_HASH_LENGTH(hash_alg);
443*62c56f98SSadaf Ebrahimi 
444*62c56f98SSadaf Ebrahimi     /* We should never call this function with an unknown hash,
445*62c56f98SSadaf Ebrahimi      * but add an assertion anyway. */
446*62c56f98SSadaf Ebrahimi     if (!PSA_ALG_IS_HASH(hash_alg)) {
447*62c56f98SSadaf Ebrahimi         return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
448*62c56f98SSadaf Ebrahimi     }
449*62c56f98SSadaf Ebrahimi 
450*62c56f98SSadaf Ebrahimi     /*
451*62c56f98SSadaf Ebrahimi      *            0
452*62c56f98SSadaf Ebrahimi      *            |
453*62c56f98SSadaf Ebrahimi      *            v
454*62c56f98SSadaf Ebrahimi      *  PSK ->  HKDF-Extract = Early Secret
455*62c56f98SSadaf Ebrahimi      *            |
456*62c56f98SSadaf Ebrahimi      *            +-----> Derive-Secret(., "c e traffic", ClientHello)
457*62c56f98SSadaf Ebrahimi      *            |                     = client_early_traffic_secret
458*62c56f98SSadaf Ebrahimi      *            |
459*62c56f98SSadaf Ebrahimi      *            +-----> Derive-Secret(., "e exp master", ClientHello)
460*62c56f98SSadaf Ebrahimi      *            |                     = early_exporter_master_secret
461*62c56f98SSadaf Ebrahimi      *            v
462*62c56f98SSadaf Ebrahimi      */
463*62c56f98SSadaf Ebrahimi 
464*62c56f98SSadaf Ebrahimi     /* Create client_early_traffic_secret */
465*62c56f98SSadaf Ebrahimi     ret = mbedtls_ssl_tls13_derive_secret(
466*62c56f98SSadaf Ebrahimi         hash_alg,
467*62c56f98SSadaf Ebrahimi         early_secret, hash_len,
468*62c56f98SSadaf Ebrahimi         MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN(c_e_traffic),
469*62c56f98SSadaf Ebrahimi         transcript, transcript_len,
470*62c56f98SSadaf Ebrahimi         MBEDTLS_SSL_TLS1_3_CONTEXT_HASHED,
471*62c56f98SSadaf Ebrahimi         derived->client_early_traffic_secret,
472*62c56f98SSadaf Ebrahimi         hash_len);
473*62c56f98SSadaf Ebrahimi     if (ret != 0) {
474*62c56f98SSadaf Ebrahimi         return ret;
475*62c56f98SSadaf Ebrahimi     }
476*62c56f98SSadaf Ebrahimi 
477*62c56f98SSadaf Ebrahimi     /* Create early exporter */
478*62c56f98SSadaf Ebrahimi     ret = mbedtls_ssl_tls13_derive_secret(
479*62c56f98SSadaf Ebrahimi         hash_alg,
480*62c56f98SSadaf Ebrahimi         early_secret, hash_len,
481*62c56f98SSadaf Ebrahimi         MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN(e_exp_master),
482*62c56f98SSadaf Ebrahimi         transcript, transcript_len,
483*62c56f98SSadaf Ebrahimi         MBEDTLS_SSL_TLS1_3_CONTEXT_HASHED,
484*62c56f98SSadaf Ebrahimi         derived->early_exporter_master_secret,
485*62c56f98SSadaf Ebrahimi         hash_len);
486*62c56f98SSadaf Ebrahimi     if (ret != 0) {
487*62c56f98SSadaf Ebrahimi         return ret;
488*62c56f98SSadaf Ebrahimi     }
489*62c56f98SSadaf Ebrahimi 
490*62c56f98SSadaf Ebrahimi     return 0;
491*62c56f98SSadaf Ebrahimi }
492*62c56f98SSadaf Ebrahimi 
mbedtls_ssl_tls13_derive_handshake_secrets(psa_algorithm_t hash_alg,unsigned char const * handshake_secret,unsigned char const * transcript,size_t transcript_len,mbedtls_ssl_tls13_handshake_secrets * derived)493*62c56f98SSadaf Ebrahimi int mbedtls_ssl_tls13_derive_handshake_secrets(
494*62c56f98SSadaf Ebrahimi     psa_algorithm_t hash_alg,
495*62c56f98SSadaf Ebrahimi     unsigned char const *handshake_secret,
496*62c56f98SSadaf Ebrahimi     unsigned char const *transcript, size_t transcript_len,
497*62c56f98SSadaf Ebrahimi     mbedtls_ssl_tls13_handshake_secrets *derived)
498*62c56f98SSadaf Ebrahimi {
499*62c56f98SSadaf Ebrahimi     int ret;
500*62c56f98SSadaf Ebrahimi     size_t const hash_len = PSA_HASH_LENGTH(hash_alg);
501*62c56f98SSadaf Ebrahimi 
502*62c56f98SSadaf Ebrahimi     /* We should never call this function with an unknown hash,
503*62c56f98SSadaf Ebrahimi      * but add an assertion anyway. */
504*62c56f98SSadaf Ebrahimi     if (!PSA_ALG_IS_HASH(hash_alg)) {
505*62c56f98SSadaf Ebrahimi         return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
506*62c56f98SSadaf Ebrahimi     }
507*62c56f98SSadaf Ebrahimi 
508*62c56f98SSadaf Ebrahimi     /*
509*62c56f98SSadaf Ebrahimi      *
510*62c56f98SSadaf Ebrahimi      * Handshake Secret
511*62c56f98SSadaf Ebrahimi      * |
512*62c56f98SSadaf Ebrahimi      * +-----> Derive-Secret( ., "c hs traffic",
513*62c56f98SSadaf Ebrahimi      * |                     ClientHello...ServerHello )
514*62c56f98SSadaf Ebrahimi      * |                     = client_handshake_traffic_secret
515*62c56f98SSadaf Ebrahimi      * |
516*62c56f98SSadaf Ebrahimi      * +-----> Derive-Secret( ., "s hs traffic",
517*62c56f98SSadaf Ebrahimi      * |                     ClientHello...ServerHello )
518*62c56f98SSadaf Ebrahimi      * |                     = server_handshake_traffic_secret
519*62c56f98SSadaf Ebrahimi      *
520*62c56f98SSadaf Ebrahimi      */
521*62c56f98SSadaf Ebrahimi 
522*62c56f98SSadaf Ebrahimi     /*
523*62c56f98SSadaf Ebrahimi      * Compute client_handshake_traffic_secret with
524*62c56f98SSadaf Ebrahimi      * Derive-Secret( ., "c hs traffic", ClientHello...ServerHello )
525*62c56f98SSadaf Ebrahimi      */
526*62c56f98SSadaf Ebrahimi 
527*62c56f98SSadaf Ebrahimi     ret = mbedtls_ssl_tls13_derive_secret(
528*62c56f98SSadaf Ebrahimi         hash_alg,
529*62c56f98SSadaf Ebrahimi         handshake_secret, hash_len,
530*62c56f98SSadaf Ebrahimi         MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN(c_hs_traffic),
531*62c56f98SSadaf Ebrahimi         transcript, transcript_len,
532*62c56f98SSadaf Ebrahimi         MBEDTLS_SSL_TLS1_3_CONTEXT_HASHED,
533*62c56f98SSadaf Ebrahimi         derived->client_handshake_traffic_secret,
534*62c56f98SSadaf Ebrahimi         hash_len);
535*62c56f98SSadaf Ebrahimi     if (ret != 0) {
536*62c56f98SSadaf Ebrahimi         return ret;
537*62c56f98SSadaf Ebrahimi     }
538*62c56f98SSadaf Ebrahimi 
539*62c56f98SSadaf Ebrahimi     /*
540*62c56f98SSadaf Ebrahimi      * Compute server_handshake_traffic_secret with
541*62c56f98SSadaf Ebrahimi      * Derive-Secret( ., "s hs traffic", ClientHello...ServerHello )
542*62c56f98SSadaf Ebrahimi      */
543*62c56f98SSadaf Ebrahimi 
544*62c56f98SSadaf Ebrahimi     ret = mbedtls_ssl_tls13_derive_secret(
545*62c56f98SSadaf Ebrahimi         hash_alg,
546*62c56f98SSadaf Ebrahimi         handshake_secret, hash_len,
547*62c56f98SSadaf Ebrahimi         MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN(s_hs_traffic),
548*62c56f98SSadaf Ebrahimi         transcript, transcript_len,
549*62c56f98SSadaf Ebrahimi         MBEDTLS_SSL_TLS1_3_CONTEXT_HASHED,
550*62c56f98SSadaf Ebrahimi         derived->server_handshake_traffic_secret,
551*62c56f98SSadaf Ebrahimi         hash_len);
552*62c56f98SSadaf Ebrahimi     if (ret != 0) {
553*62c56f98SSadaf Ebrahimi         return ret;
554*62c56f98SSadaf Ebrahimi     }
555*62c56f98SSadaf Ebrahimi 
556*62c56f98SSadaf Ebrahimi     return 0;
557*62c56f98SSadaf Ebrahimi }
558*62c56f98SSadaf Ebrahimi 
mbedtls_ssl_tls13_derive_application_secrets(psa_algorithm_t hash_alg,unsigned char const * application_secret,unsigned char const * transcript,size_t transcript_len,mbedtls_ssl_tls13_application_secrets * derived)559*62c56f98SSadaf Ebrahimi int mbedtls_ssl_tls13_derive_application_secrets(
560*62c56f98SSadaf Ebrahimi     psa_algorithm_t hash_alg,
561*62c56f98SSadaf Ebrahimi     unsigned char const *application_secret,
562*62c56f98SSadaf Ebrahimi     unsigned char const *transcript, size_t transcript_len,
563*62c56f98SSadaf Ebrahimi     mbedtls_ssl_tls13_application_secrets *derived)
564*62c56f98SSadaf Ebrahimi {
565*62c56f98SSadaf Ebrahimi     int ret;
566*62c56f98SSadaf Ebrahimi     size_t const hash_len = PSA_HASH_LENGTH(hash_alg);
567*62c56f98SSadaf Ebrahimi 
568*62c56f98SSadaf Ebrahimi     /* We should never call this function with an unknown hash,
569*62c56f98SSadaf Ebrahimi      * but add an assertion anyway. */
570*62c56f98SSadaf Ebrahimi     if (!PSA_ALG_IS_HASH(hash_alg)) {
571*62c56f98SSadaf Ebrahimi         return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
572*62c56f98SSadaf Ebrahimi     }
573*62c56f98SSadaf Ebrahimi 
574*62c56f98SSadaf Ebrahimi     /* Generate {client,server}_application_traffic_secret_0
575*62c56f98SSadaf Ebrahimi      *
576*62c56f98SSadaf Ebrahimi      * Master Secret
577*62c56f98SSadaf Ebrahimi      * |
578*62c56f98SSadaf Ebrahimi      * +-----> Derive-Secret( ., "c ap traffic",
579*62c56f98SSadaf Ebrahimi      * |                      ClientHello...server Finished )
580*62c56f98SSadaf Ebrahimi      * |                      = client_application_traffic_secret_0
581*62c56f98SSadaf Ebrahimi      * |
582*62c56f98SSadaf Ebrahimi      * +-----> Derive-Secret( ., "s ap traffic",
583*62c56f98SSadaf Ebrahimi      * |                      ClientHello...Server Finished )
584*62c56f98SSadaf Ebrahimi      * |                      = server_application_traffic_secret_0
585*62c56f98SSadaf Ebrahimi      * |
586*62c56f98SSadaf Ebrahimi      * +-----> Derive-Secret( ., "exp master",
587*62c56f98SSadaf Ebrahimi      * |                      ClientHello...server Finished)
588*62c56f98SSadaf Ebrahimi      * |                      = exporter_master_secret
589*62c56f98SSadaf Ebrahimi      *
590*62c56f98SSadaf Ebrahimi      */
591*62c56f98SSadaf Ebrahimi 
592*62c56f98SSadaf Ebrahimi     ret = mbedtls_ssl_tls13_derive_secret(
593*62c56f98SSadaf Ebrahimi         hash_alg,
594*62c56f98SSadaf Ebrahimi         application_secret, hash_len,
595*62c56f98SSadaf Ebrahimi         MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN(c_ap_traffic),
596*62c56f98SSadaf Ebrahimi         transcript, transcript_len,
597*62c56f98SSadaf Ebrahimi         MBEDTLS_SSL_TLS1_3_CONTEXT_HASHED,
598*62c56f98SSadaf Ebrahimi         derived->client_application_traffic_secret_N,
599*62c56f98SSadaf Ebrahimi         hash_len);
600*62c56f98SSadaf Ebrahimi     if (ret != 0) {
601*62c56f98SSadaf Ebrahimi         return ret;
602*62c56f98SSadaf Ebrahimi     }
603*62c56f98SSadaf Ebrahimi 
604*62c56f98SSadaf Ebrahimi     ret = mbedtls_ssl_tls13_derive_secret(
605*62c56f98SSadaf Ebrahimi         hash_alg,
606*62c56f98SSadaf Ebrahimi         application_secret, hash_len,
607*62c56f98SSadaf Ebrahimi         MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN(s_ap_traffic),
608*62c56f98SSadaf Ebrahimi         transcript, transcript_len,
609*62c56f98SSadaf Ebrahimi         MBEDTLS_SSL_TLS1_3_CONTEXT_HASHED,
610*62c56f98SSadaf Ebrahimi         derived->server_application_traffic_secret_N,
611*62c56f98SSadaf Ebrahimi         hash_len);
612*62c56f98SSadaf Ebrahimi     if (ret != 0) {
613*62c56f98SSadaf Ebrahimi         return ret;
614*62c56f98SSadaf Ebrahimi     }
615*62c56f98SSadaf Ebrahimi 
616*62c56f98SSadaf Ebrahimi     ret = mbedtls_ssl_tls13_derive_secret(
617*62c56f98SSadaf Ebrahimi         hash_alg,
618*62c56f98SSadaf Ebrahimi         application_secret, hash_len,
619*62c56f98SSadaf Ebrahimi         MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN(exp_master),
620*62c56f98SSadaf Ebrahimi         transcript, transcript_len,
621*62c56f98SSadaf Ebrahimi         MBEDTLS_SSL_TLS1_3_CONTEXT_HASHED,
622*62c56f98SSadaf Ebrahimi         derived->exporter_master_secret,
623*62c56f98SSadaf Ebrahimi         hash_len);
624*62c56f98SSadaf Ebrahimi     if (ret != 0) {
625*62c56f98SSadaf Ebrahimi         return ret;
626*62c56f98SSadaf Ebrahimi     }
627*62c56f98SSadaf Ebrahimi 
628*62c56f98SSadaf Ebrahimi     return 0;
629*62c56f98SSadaf Ebrahimi }
630*62c56f98SSadaf Ebrahimi 
631*62c56f98SSadaf Ebrahimi /* Generate resumption_master_secret for use with the ticket exchange.
632*62c56f98SSadaf Ebrahimi  *
633*62c56f98SSadaf Ebrahimi  * This is not integrated with mbedtls_ssl_tls13_derive_application_secrets()
634*62c56f98SSadaf Ebrahimi  * because it uses the transcript hash up to and including ClientFinished. */
mbedtls_ssl_tls13_derive_resumption_master_secret(psa_algorithm_t hash_alg,unsigned char const * application_secret,unsigned char const * transcript,size_t transcript_len,mbedtls_ssl_tls13_application_secrets * derived)635*62c56f98SSadaf Ebrahimi int mbedtls_ssl_tls13_derive_resumption_master_secret(
636*62c56f98SSadaf Ebrahimi     psa_algorithm_t hash_alg,
637*62c56f98SSadaf Ebrahimi     unsigned char const *application_secret,
638*62c56f98SSadaf Ebrahimi     unsigned char const *transcript, size_t transcript_len,
639*62c56f98SSadaf Ebrahimi     mbedtls_ssl_tls13_application_secrets *derived)
640*62c56f98SSadaf Ebrahimi {
641*62c56f98SSadaf Ebrahimi     int ret;
642*62c56f98SSadaf Ebrahimi     size_t const hash_len = PSA_HASH_LENGTH(hash_alg);
643*62c56f98SSadaf Ebrahimi 
644*62c56f98SSadaf Ebrahimi     /* We should never call this function with an unknown hash,
645*62c56f98SSadaf Ebrahimi      * but add an assertion anyway. */
646*62c56f98SSadaf Ebrahimi     if (!PSA_ALG_IS_HASH(hash_alg)) {
647*62c56f98SSadaf Ebrahimi         return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
648*62c56f98SSadaf Ebrahimi     }
649*62c56f98SSadaf Ebrahimi 
650*62c56f98SSadaf Ebrahimi     ret = mbedtls_ssl_tls13_derive_secret(
651*62c56f98SSadaf Ebrahimi         hash_alg,
652*62c56f98SSadaf Ebrahimi         application_secret, hash_len,
653*62c56f98SSadaf Ebrahimi         MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN(res_master),
654*62c56f98SSadaf Ebrahimi         transcript, transcript_len,
655*62c56f98SSadaf Ebrahimi         MBEDTLS_SSL_TLS1_3_CONTEXT_HASHED,
656*62c56f98SSadaf Ebrahimi         derived->resumption_master_secret,
657*62c56f98SSadaf Ebrahimi         hash_len);
658*62c56f98SSadaf Ebrahimi 
659*62c56f98SSadaf Ebrahimi     if (ret != 0) {
660*62c56f98SSadaf Ebrahimi         return ret;
661*62c56f98SSadaf Ebrahimi     }
662*62c56f98SSadaf Ebrahimi 
663*62c56f98SSadaf Ebrahimi     return 0;
664*62c56f98SSadaf Ebrahimi }
665*62c56f98SSadaf Ebrahimi 
666*62c56f98SSadaf Ebrahimi /**
667*62c56f98SSadaf Ebrahimi  * \brief Transition into application stage of TLS 1.3 key schedule.
668*62c56f98SSadaf Ebrahimi  *
669*62c56f98SSadaf Ebrahimi  *        The TLS 1.3 key schedule can be viewed as a simple state machine
670*62c56f98SSadaf Ebrahimi  *        with states Initial -> Early -> Handshake -> Application, and
671*62c56f98SSadaf Ebrahimi  *        this function represents the Handshake -> Application transition.
672*62c56f98SSadaf Ebrahimi  *
673*62c56f98SSadaf Ebrahimi  *        In the handshake stage, ssl_tls13_generate_application_keys()
674*62c56f98SSadaf Ebrahimi  *        can be used to derive the handshake traffic keys.
675*62c56f98SSadaf Ebrahimi  *
676*62c56f98SSadaf Ebrahimi  * \param ssl  The SSL context to operate on. This must be in key schedule
677*62c56f98SSadaf Ebrahimi  *             stage \c Handshake.
678*62c56f98SSadaf Ebrahimi  *
679*62c56f98SSadaf Ebrahimi  * \returns    \c 0 on success.
680*62c56f98SSadaf Ebrahimi  * \returns    A negative error code on failure.
681*62c56f98SSadaf Ebrahimi  */
682*62c56f98SSadaf Ebrahimi MBEDTLS_CHECK_RETURN_CRITICAL
ssl_tls13_key_schedule_stage_application(mbedtls_ssl_context * ssl)683*62c56f98SSadaf Ebrahimi static int ssl_tls13_key_schedule_stage_application(mbedtls_ssl_context *ssl)
684*62c56f98SSadaf Ebrahimi {
685*62c56f98SSadaf Ebrahimi     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
686*62c56f98SSadaf Ebrahimi     mbedtls_ssl_handshake_params *handshake = ssl->handshake;
687*62c56f98SSadaf Ebrahimi     psa_algorithm_t const hash_alg = mbedtls_md_psa_alg_from_type(
688*62c56f98SSadaf Ebrahimi         handshake->ciphersuite_info->mac);
689*62c56f98SSadaf Ebrahimi 
690*62c56f98SSadaf Ebrahimi     /*
691*62c56f98SSadaf Ebrahimi      * Compute MasterSecret
692*62c56f98SSadaf Ebrahimi      */
693*62c56f98SSadaf Ebrahimi     ret = mbedtls_ssl_tls13_evolve_secret(
694*62c56f98SSadaf Ebrahimi         hash_alg,
695*62c56f98SSadaf Ebrahimi         handshake->tls13_master_secrets.handshake,
696*62c56f98SSadaf Ebrahimi         NULL, 0,
697*62c56f98SSadaf Ebrahimi         handshake->tls13_master_secrets.app);
698*62c56f98SSadaf Ebrahimi     if (ret != 0) {
699*62c56f98SSadaf Ebrahimi         MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_tls13_evolve_secret", ret);
700*62c56f98SSadaf Ebrahimi         return ret;
701*62c56f98SSadaf Ebrahimi     }
702*62c56f98SSadaf Ebrahimi 
703*62c56f98SSadaf Ebrahimi     MBEDTLS_SSL_DEBUG_BUF(
704*62c56f98SSadaf Ebrahimi         4, "Master secret",
705*62c56f98SSadaf Ebrahimi         handshake->tls13_master_secrets.app, PSA_HASH_LENGTH(hash_alg));
706*62c56f98SSadaf Ebrahimi 
707*62c56f98SSadaf Ebrahimi     return 0;
708*62c56f98SSadaf Ebrahimi }
709*62c56f98SSadaf Ebrahimi 
710*62c56f98SSadaf Ebrahimi MBEDTLS_CHECK_RETURN_CRITICAL
ssl_tls13_calc_finished_core(psa_algorithm_t hash_alg,unsigned char const * base_key,unsigned char const * transcript,unsigned char * dst,size_t * dst_len)711*62c56f98SSadaf Ebrahimi static int ssl_tls13_calc_finished_core(psa_algorithm_t hash_alg,
712*62c56f98SSadaf Ebrahimi                                         unsigned char const *base_key,
713*62c56f98SSadaf Ebrahimi                                         unsigned char const *transcript,
714*62c56f98SSadaf Ebrahimi                                         unsigned char *dst,
715*62c56f98SSadaf Ebrahimi                                         size_t *dst_len)
716*62c56f98SSadaf Ebrahimi {
717*62c56f98SSadaf Ebrahimi     mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
718*62c56f98SSadaf Ebrahimi     psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
719*62c56f98SSadaf Ebrahimi     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
720*62c56f98SSadaf Ebrahimi     size_t hash_len = PSA_HASH_LENGTH(hash_alg);
721*62c56f98SSadaf Ebrahimi     unsigned char finished_key[PSA_MAC_MAX_SIZE];
722*62c56f98SSadaf Ebrahimi     int ret;
723*62c56f98SSadaf Ebrahimi     psa_algorithm_t alg;
724*62c56f98SSadaf Ebrahimi 
725*62c56f98SSadaf Ebrahimi     /* We should never call this function with an unknown hash,
726*62c56f98SSadaf Ebrahimi      * but add an assertion anyway. */
727*62c56f98SSadaf Ebrahimi     if (!PSA_ALG_IS_HASH(hash_alg)) {
728*62c56f98SSadaf Ebrahimi         return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
729*62c56f98SSadaf Ebrahimi     }
730*62c56f98SSadaf Ebrahimi 
731*62c56f98SSadaf Ebrahimi     /* TLS 1.3 Finished message
732*62c56f98SSadaf Ebrahimi      *
733*62c56f98SSadaf Ebrahimi      * struct {
734*62c56f98SSadaf Ebrahimi      *     opaque verify_data[Hash.length];
735*62c56f98SSadaf Ebrahimi      * } Finished;
736*62c56f98SSadaf Ebrahimi      *
737*62c56f98SSadaf Ebrahimi      * verify_data =
738*62c56f98SSadaf Ebrahimi      *     HMAC( finished_key,
739*62c56f98SSadaf Ebrahimi      *            Hash( Handshake Context +
740*62c56f98SSadaf Ebrahimi      *                  Certificate*      +
741*62c56f98SSadaf Ebrahimi      *                  CertificateVerify* )
742*62c56f98SSadaf Ebrahimi      *    )
743*62c56f98SSadaf Ebrahimi      *
744*62c56f98SSadaf Ebrahimi      * finished_key =
745*62c56f98SSadaf Ebrahimi      *    HKDF-Expand-Label( BaseKey, "finished", "", Hash.length )
746*62c56f98SSadaf Ebrahimi      */
747*62c56f98SSadaf Ebrahimi 
748*62c56f98SSadaf Ebrahimi     ret = mbedtls_ssl_tls13_hkdf_expand_label(
749*62c56f98SSadaf Ebrahimi         hash_alg, base_key, hash_len,
750*62c56f98SSadaf Ebrahimi         MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN(finished),
751*62c56f98SSadaf Ebrahimi         NULL, 0,
752*62c56f98SSadaf Ebrahimi         finished_key, hash_len);
753*62c56f98SSadaf Ebrahimi     if (ret != 0) {
754*62c56f98SSadaf Ebrahimi         goto exit;
755*62c56f98SSadaf Ebrahimi     }
756*62c56f98SSadaf Ebrahimi 
757*62c56f98SSadaf Ebrahimi     alg = PSA_ALG_HMAC(hash_alg);
758*62c56f98SSadaf Ebrahimi     psa_set_key_usage_flags(&attributes, PSA_KEY_USAGE_SIGN_MESSAGE);
759*62c56f98SSadaf Ebrahimi     psa_set_key_algorithm(&attributes, alg);
760*62c56f98SSadaf Ebrahimi     psa_set_key_type(&attributes, PSA_KEY_TYPE_HMAC);
761*62c56f98SSadaf Ebrahimi 
762*62c56f98SSadaf Ebrahimi     status = psa_import_key(&attributes, finished_key, hash_len, &key);
763*62c56f98SSadaf Ebrahimi     if (status != PSA_SUCCESS) {
764*62c56f98SSadaf Ebrahimi         ret = PSA_TO_MBEDTLS_ERR(status);
765*62c56f98SSadaf Ebrahimi         goto exit;
766*62c56f98SSadaf Ebrahimi     }
767*62c56f98SSadaf Ebrahimi 
768*62c56f98SSadaf Ebrahimi     status = psa_mac_compute(key, alg, transcript, hash_len,
769*62c56f98SSadaf Ebrahimi                              dst, hash_len, dst_len);
770*62c56f98SSadaf Ebrahimi     ret = PSA_TO_MBEDTLS_ERR(status);
771*62c56f98SSadaf Ebrahimi 
772*62c56f98SSadaf Ebrahimi exit:
773*62c56f98SSadaf Ebrahimi 
774*62c56f98SSadaf Ebrahimi     status = psa_destroy_key(key);
775*62c56f98SSadaf Ebrahimi     if (ret == 0) {
776*62c56f98SSadaf Ebrahimi         ret = PSA_TO_MBEDTLS_ERR(status);
777*62c56f98SSadaf Ebrahimi     }
778*62c56f98SSadaf Ebrahimi 
779*62c56f98SSadaf Ebrahimi     mbedtls_platform_zeroize(finished_key, sizeof(finished_key));
780*62c56f98SSadaf Ebrahimi 
781*62c56f98SSadaf Ebrahimi     return ret;
782*62c56f98SSadaf Ebrahimi }
783*62c56f98SSadaf Ebrahimi 
mbedtls_ssl_tls13_calculate_verify_data(mbedtls_ssl_context * ssl,unsigned char * dst,size_t dst_len,size_t * actual_len,int from)784*62c56f98SSadaf Ebrahimi int mbedtls_ssl_tls13_calculate_verify_data(mbedtls_ssl_context *ssl,
785*62c56f98SSadaf Ebrahimi                                             unsigned char *dst,
786*62c56f98SSadaf Ebrahimi                                             size_t dst_len,
787*62c56f98SSadaf Ebrahimi                                             size_t *actual_len,
788*62c56f98SSadaf Ebrahimi                                             int from)
789*62c56f98SSadaf Ebrahimi {
790*62c56f98SSadaf Ebrahimi     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
791*62c56f98SSadaf Ebrahimi 
792*62c56f98SSadaf Ebrahimi     unsigned char transcript[MBEDTLS_TLS1_3_MD_MAX_SIZE];
793*62c56f98SSadaf Ebrahimi     size_t transcript_len;
794*62c56f98SSadaf Ebrahimi 
795*62c56f98SSadaf Ebrahimi     unsigned char *base_key = NULL;
796*62c56f98SSadaf Ebrahimi     size_t base_key_len = 0;
797*62c56f98SSadaf Ebrahimi     mbedtls_ssl_tls13_handshake_secrets *tls13_hs_secrets =
798*62c56f98SSadaf Ebrahimi         &ssl->handshake->tls13_hs_secrets;
799*62c56f98SSadaf Ebrahimi 
800*62c56f98SSadaf Ebrahimi     mbedtls_md_type_t const md_type = ssl->handshake->ciphersuite_info->mac;
801*62c56f98SSadaf Ebrahimi 
802*62c56f98SSadaf Ebrahimi     psa_algorithm_t hash_alg = mbedtls_md_psa_alg_from_type(
803*62c56f98SSadaf Ebrahimi         ssl->handshake->ciphersuite_info->mac);
804*62c56f98SSadaf Ebrahimi     size_t const hash_len = PSA_HASH_LENGTH(hash_alg);
805*62c56f98SSadaf Ebrahimi 
806*62c56f98SSadaf Ebrahimi     MBEDTLS_SSL_DEBUG_MSG(2, ("=> mbedtls_ssl_tls13_calculate_verify_data"));
807*62c56f98SSadaf Ebrahimi 
808*62c56f98SSadaf Ebrahimi     if (from == MBEDTLS_SSL_IS_CLIENT) {
809*62c56f98SSadaf Ebrahimi         base_key = tls13_hs_secrets->client_handshake_traffic_secret;
810*62c56f98SSadaf Ebrahimi         base_key_len = sizeof(tls13_hs_secrets->client_handshake_traffic_secret);
811*62c56f98SSadaf Ebrahimi     } else {
812*62c56f98SSadaf Ebrahimi         base_key = tls13_hs_secrets->server_handshake_traffic_secret;
813*62c56f98SSadaf Ebrahimi         base_key_len = sizeof(tls13_hs_secrets->server_handshake_traffic_secret);
814*62c56f98SSadaf Ebrahimi     }
815*62c56f98SSadaf Ebrahimi 
816*62c56f98SSadaf Ebrahimi     if (dst_len < hash_len) {
817*62c56f98SSadaf Ebrahimi         ret = MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL;
818*62c56f98SSadaf Ebrahimi         goto exit;
819*62c56f98SSadaf Ebrahimi     }
820*62c56f98SSadaf Ebrahimi 
821*62c56f98SSadaf Ebrahimi     ret = mbedtls_ssl_get_handshake_transcript(ssl, md_type,
822*62c56f98SSadaf Ebrahimi                                                transcript, sizeof(transcript),
823*62c56f98SSadaf Ebrahimi                                                &transcript_len);
824*62c56f98SSadaf Ebrahimi     if (ret != 0) {
825*62c56f98SSadaf Ebrahimi         MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_get_handshake_transcript", ret);
826*62c56f98SSadaf Ebrahimi         goto exit;
827*62c56f98SSadaf Ebrahimi     }
828*62c56f98SSadaf Ebrahimi     MBEDTLS_SSL_DEBUG_BUF(4, "handshake hash", transcript, transcript_len);
829*62c56f98SSadaf Ebrahimi 
830*62c56f98SSadaf Ebrahimi     ret = ssl_tls13_calc_finished_core(hash_alg, base_key,
831*62c56f98SSadaf Ebrahimi                                        transcript, dst, actual_len);
832*62c56f98SSadaf Ebrahimi     if (ret != 0) {
833*62c56f98SSadaf Ebrahimi         goto exit;
834*62c56f98SSadaf Ebrahimi     }
835*62c56f98SSadaf Ebrahimi 
836*62c56f98SSadaf Ebrahimi     MBEDTLS_SSL_DEBUG_BUF(3, "verify_data for finished message", dst, hash_len);
837*62c56f98SSadaf Ebrahimi     MBEDTLS_SSL_DEBUG_MSG(2, ("<= mbedtls_ssl_tls13_calculate_verify_data"));
838*62c56f98SSadaf Ebrahimi 
839*62c56f98SSadaf Ebrahimi exit:
840*62c56f98SSadaf Ebrahimi     /* Erase handshake secrets */
841*62c56f98SSadaf Ebrahimi     mbedtls_platform_zeroize(base_key, base_key_len);
842*62c56f98SSadaf Ebrahimi     mbedtls_platform_zeroize(transcript, sizeof(transcript));
843*62c56f98SSadaf Ebrahimi     return ret;
844*62c56f98SSadaf Ebrahimi }
845*62c56f98SSadaf Ebrahimi 
mbedtls_ssl_tls13_create_psk_binder(mbedtls_ssl_context * ssl,const psa_algorithm_t hash_alg,unsigned char const * psk,size_t psk_len,int psk_type,unsigned char const * transcript,unsigned char * result)846*62c56f98SSadaf Ebrahimi int mbedtls_ssl_tls13_create_psk_binder(mbedtls_ssl_context *ssl,
847*62c56f98SSadaf Ebrahimi                                         const psa_algorithm_t hash_alg,
848*62c56f98SSadaf Ebrahimi                                         unsigned char const *psk, size_t psk_len,
849*62c56f98SSadaf Ebrahimi                                         int psk_type,
850*62c56f98SSadaf Ebrahimi                                         unsigned char const *transcript,
851*62c56f98SSadaf Ebrahimi                                         unsigned char *result)
852*62c56f98SSadaf Ebrahimi {
853*62c56f98SSadaf Ebrahimi     int ret = 0;
854*62c56f98SSadaf Ebrahimi     unsigned char binder_key[PSA_MAC_MAX_SIZE];
855*62c56f98SSadaf Ebrahimi     unsigned char early_secret[PSA_MAC_MAX_SIZE];
856*62c56f98SSadaf Ebrahimi     size_t const hash_len = PSA_HASH_LENGTH(hash_alg);
857*62c56f98SSadaf Ebrahimi     size_t actual_len;
858*62c56f98SSadaf Ebrahimi 
859*62c56f98SSadaf Ebrahimi #if !defined(MBEDTLS_DEBUG_C)
860*62c56f98SSadaf Ebrahimi     ssl = NULL; /* make sure we don't use it except for debug */
861*62c56f98SSadaf Ebrahimi     ((void) ssl);
862*62c56f98SSadaf Ebrahimi #endif
863*62c56f98SSadaf Ebrahimi 
864*62c56f98SSadaf Ebrahimi     /* We should never call this function with an unknown hash,
865*62c56f98SSadaf Ebrahimi      * but add an assertion anyway. */
866*62c56f98SSadaf Ebrahimi     if (!PSA_ALG_IS_HASH(hash_alg)) {
867*62c56f98SSadaf Ebrahimi         return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
868*62c56f98SSadaf Ebrahimi     }
869*62c56f98SSadaf Ebrahimi 
870*62c56f98SSadaf Ebrahimi     /*
871*62c56f98SSadaf Ebrahimi      *            0
872*62c56f98SSadaf Ebrahimi      *            |
873*62c56f98SSadaf Ebrahimi      *            v
874*62c56f98SSadaf Ebrahimi      *  PSK ->  HKDF-Extract = Early Secret
875*62c56f98SSadaf Ebrahimi      *            |
876*62c56f98SSadaf Ebrahimi      *            +-----> Derive-Secret(., "ext binder" | "res binder", "")
877*62c56f98SSadaf Ebrahimi      *            |                     = binder_key
878*62c56f98SSadaf Ebrahimi      *            v
879*62c56f98SSadaf Ebrahimi      */
880*62c56f98SSadaf Ebrahimi 
881*62c56f98SSadaf Ebrahimi     ret = mbedtls_ssl_tls13_evolve_secret(hash_alg,
882*62c56f98SSadaf Ebrahimi                                           NULL,           /* Old secret */
883*62c56f98SSadaf Ebrahimi                                           psk, psk_len,   /* Input      */
884*62c56f98SSadaf Ebrahimi                                           early_secret);
885*62c56f98SSadaf Ebrahimi     if (ret != 0) {
886*62c56f98SSadaf Ebrahimi         MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_tls13_evolve_secret", ret);
887*62c56f98SSadaf Ebrahimi         goto exit;
888*62c56f98SSadaf Ebrahimi     }
889*62c56f98SSadaf Ebrahimi 
890*62c56f98SSadaf Ebrahimi     MBEDTLS_SSL_DEBUG_BUF(4, "mbedtls_ssl_tls13_create_psk_binder",
891*62c56f98SSadaf Ebrahimi                           early_secret, hash_len);
892*62c56f98SSadaf Ebrahimi 
893*62c56f98SSadaf Ebrahimi     if (psk_type == MBEDTLS_SSL_TLS1_3_PSK_RESUMPTION) {
894*62c56f98SSadaf Ebrahimi         ret = mbedtls_ssl_tls13_derive_secret(
895*62c56f98SSadaf Ebrahimi             hash_alg,
896*62c56f98SSadaf Ebrahimi             early_secret, hash_len,
897*62c56f98SSadaf Ebrahimi             MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN(res_binder),
898*62c56f98SSadaf Ebrahimi             NULL, 0, MBEDTLS_SSL_TLS1_3_CONTEXT_UNHASHED,
899*62c56f98SSadaf Ebrahimi             binder_key, hash_len);
900*62c56f98SSadaf Ebrahimi         MBEDTLS_SSL_DEBUG_MSG(4, ("Derive Early Secret with 'res binder'"));
901*62c56f98SSadaf Ebrahimi     } else {
902*62c56f98SSadaf Ebrahimi         ret = mbedtls_ssl_tls13_derive_secret(
903*62c56f98SSadaf Ebrahimi             hash_alg,
904*62c56f98SSadaf Ebrahimi             early_secret, hash_len,
905*62c56f98SSadaf Ebrahimi             MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN(ext_binder),
906*62c56f98SSadaf Ebrahimi             NULL, 0, MBEDTLS_SSL_TLS1_3_CONTEXT_UNHASHED,
907*62c56f98SSadaf Ebrahimi             binder_key, hash_len);
908*62c56f98SSadaf Ebrahimi         MBEDTLS_SSL_DEBUG_MSG(4, ("Derive Early Secret with 'ext binder'"));
909*62c56f98SSadaf Ebrahimi     }
910*62c56f98SSadaf Ebrahimi 
911*62c56f98SSadaf Ebrahimi     if (ret != 0) {
912*62c56f98SSadaf Ebrahimi         MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_tls13_derive_secret", ret);
913*62c56f98SSadaf Ebrahimi         goto exit;
914*62c56f98SSadaf Ebrahimi     }
915*62c56f98SSadaf Ebrahimi 
916*62c56f98SSadaf Ebrahimi     /*
917*62c56f98SSadaf Ebrahimi      * The binding_value is computed in the same way as the Finished message
918*62c56f98SSadaf Ebrahimi      * but with the BaseKey being the binder_key.
919*62c56f98SSadaf Ebrahimi      */
920*62c56f98SSadaf Ebrahimi 
921*62c56f98SSadaf Ebrahimi     ret = ssl_tls13_calc_finished_core(hash_alg, binder_key, transcript,
922*62c56f98SSadaf Ebrahimi                                        result, &actual_len);
923*62c56f98SSadaf Ebrahimi     if (ret != 0) {
924*62c56f98SSadaf Ebrahimi         goto exit;
925*62c56f98SSadaf Ebrahimi     }
926*62c56f98SSadaf Ebrahimi 
927*62c56f98SSadaf Ebrahimi     MBEDTLS_SSL_DEBUG_BUF(3, "psk binder", result, actual_len);
928*62c56f98SSadaf Ebrahimi 
929*62c56f98SSadaf Ebrahimi exit:
930*62c56f98SSadaf Ebrahimi 
931*62c56f98SSadaf Ebrahimi     mbedtls_platform_zeroize(early_secret, sizeof(early_secret));
932*62c56f98SSadaf Ebrahimi     mbedtls_platform_zeroize(binder_key,   sizeof(binder_key));
933*62c56f98SSadaf Ebrahimi     return ret;
934*62c56f98SSadaf Ebrahimi }
935*62c56f98SSadaf Ebrahimi 
mbedtls_ssl_tls13_populate_transform(mbedtls_ssl_transform * transform,int endpoint,int ciphersuite,mbedtls_ssl_key_set const * traffic_keys,mbedtls_ssl_context * ssl)936*62c56f98SSadaf Ebrahimi int mbedtls_ssl_tls13_populate_transform(
937*62c56f98SSadaf Ebrahimi     mbedtls_ssl_transform *transform,
938*62c56f98SSadaf Ebrahimi     int endpoint, int ciphersuite,
939*62c56f98SSadaf Ebrahimi     mbedtls_ssl_key_set const *traffic_keys,
940*62c56f98SSadaf Ebrahimi     mbedtls_ssl_context *ssl /* DEBUG ONLY */)
941*62c56f98SSadaf Ebrahimi {
942*62c56f98SSadaf Ebrahimi #if !defined(MBEDTLS_USE_PSA_CRYPTO)
943*62c56f98SSadaf Ebrahimi     int ret;
944*62c56f98SSadaf Ebrahimi     mbedtls_cipher_info_t const *cipher_info;
945*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_USE_PSA_CRYPTO */
946*62c56f98SSadaf Ebrahimi     const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
947*62c56f98SSadaf Ebrahimi     unsigned char const *key_enc;
948*62c56f98SSadaf Ebrahimi     unsigned char const *iv_enc;
949*62c56f98SSadaf Ebrahimi     unsigned char const *key_dec;
950*62c56f98SSadaf Ebrahimi     unsigned char const *iv_dec;
951*62c56f98SSadaf Ebrahimi 
952*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO)
953*62c56f98SSadaf Ebrahimi     psa_key_type_t key_type;
954*62c56f98SSadaf Ebrahimi     psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
955*62c56f98SSadaf Ebrahimi     psa_algorithm_t alg;
956*62c56f98SSadaf Ebrahimi     size_t key_bits;
957*62c56f98SSadaf Ebrahimi     psa_status_t status = PSA_SUCCESS;
958*62c56f98SSadaf Ebrahimi #endif
959*62c56f98SSadaf Ebrahimi 
960*62c56f98SSadaf Ebrahimi #if !defined(MBEDTLS_DEBUG_C)
961*62c56f98SSadaf Ebrahimi     ssl = NULL; /* make sure we don't use it except for those cases */
962*62c56f98SSadaf Ebrahimi     (void) ssl;
963*62c56f98SSadaf Ebrahimi #endif
964*62c56f98SSadaf Ebrahimi 
965*62c56f98SSadaf Ebrahimi     ciphersuite_info = mbedtls_ssl_ciphersuite_from_id(ciphersuite);
966*62c56f98SSadaf Ebrahimi     if (ciphersuite_info == NULL) {
967*62c56f98SSadaf Ebrahimi         MBEDTLS_SSL_DEBUG_MSG(1, ("ciphersuite info for %d not found",
968*62c56f98SSadaf Ebrahimi                                   ciphersuite));
969*62c56f98SSadaf Ebrahimi         return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
970*62c56f98SSadaf Ebrahimi     }
971*62c56f98SSadaf Ebrahimi 
972*62c56f98SSadaf Ebrahimi #if !defined(MBEDTLS_USE_PSA_CRYPTO)
973*62c56f98SSadaf Ebrahimi     cipher_info = mbedtls_cipher_info_from_type(ciphersuite_info->cipher);
974*62c56f98SSadaf Ebrahimi     if (cipher_info == NULL) {
975*62c56f98SSadaf Ebrahimi         MBEDTLS_SSL_DEBUG_MSG(1, ("cipher info for %u not found",
976*62c56f98SSadaf Ebrahimi                                   ciphersuite_info->cipher));
977*62c56f98SSadaf Ebrahimi         return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
978*62c56f98SSadaf Ebrahimi     }
979*62c56f98SSadaf Ebrahimi 
980*62c56f98SSadaf Ebrahimi     /*
981*62c56f98SSadaf Ebrahimi      * Setup cipher contexts in target transform
982*62c56f98SSadaf Ebrahimi      */
983*62c56f98SSadaf Ebrahimi     if ((ret = mbedtls_cipher_setup(&transform->cipher_ctx_enc,
984*62c56f98SSadaf Ebrahimi                                     cipher_info)) != 0) {
985*62c56f98SSadaf Ebrahimi         MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_cipher_setup", ret);
986*62c56f98SSadaf Ebrahimi         return ret;
987*62c56f98SSadaf Ebrahimi     }
988*62c56f98SSadaf Ebrahimi 
989*62c56f98SSadaf Ebrahimi     if ((ret = mbedtls_cipher_setup(&transform->cipher_ctx_dec,
990*62c56f98SSadaf Ebrahimi                                     cipher_info)) != 0) {
991*62c56f98SSadaf Ebrahimi         MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_cipher_setup", ret);
992*62c56f98SSadaf Ebrahimi         return ret;
993*62c56f98SSadaf Ebrahimi     }
994*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_USE_PSA_CRYPTO */
995*62c56f98SSadaf Ebrahimi 
996*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_SRV_C)
997*62c56f98SSadaf Ebrahimi     if (endpoint == MBEDTLS_SSL_IS_SERVER) {
998*62c56f98SSadaf Ebrahimi         key_enc = traffic_keys->server_write_key;
999*62c56f98SSadaf Ebrahimi         key_dec = traffic_keys->client_write_key;
1000*62c56f98SSadaf Ebrahimi         iv_enc = traffic_keys->server_write_iv;
1001*62c56f98SSadaf Ebrahimi         iv_dec = traffic_keys->client_write_iv;
1002*62c56f98SSadaf Ebrahimi     } else
1003*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_SRV_C */
1004*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_CLI_C)
1005*62c56f98SSadaf Ebrahimi     if (endpoint == MBEDTLS_SSL_IS_CLIENT) {
1006*62c56f98SSadaf Ebrahimi         key_enc = traffic_keys->client_write_key;
1007*62c56f98SSadaf Ebrahimi         key_dec = traffic_keys->server_write_key;
1008*62c56f98SSadaf Ebrahimi         iv_enc = traffic_keys->client_write_iv;
1009*62c56f98SSadaf Ebrahimi         iv_dec = traffic_keys->server_write_iv;
1010*62c56f98SSadaf Ebrahimi     } else
1011*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_CLI_C */
1012*62c56f98SSadaf Ebrahimi     {
1013*62c56f98SSadaf Ebrahimi         /* should not happen */
1014*62c56f98SSadaf Ebrahimi         return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
1015*62c56f98SSadaf Ebrahimi     }
1016*62c56f98SSadaf Ebrahimi 
1017*62c56f98SSadaf Ebrahimi     memcpy(transform->iv_enc, iv_enc, traffic_keys->iv_len);
1018*62c56f98SSadaf Ebrahimi     memcpy(transform->iv_dec, iv_dec, traffic_keys->iv_len);
1019*62c56f98SSadaf Ebrahimi 
1020*62c56f98SSadaf Ebrahimi #if !defined(MBEDTLS_USE_PSA_CRYPTO)
1021*62c56f98SSadaf Ebrahimi     if ((ret = mbedtls_cipher_setkey(&transform->cipher_ctx_enc,
1022*62c56f98SSadaf Ebrahimi                                      key_enc, mbedtls_cipher_info_get_key_bitlen(cipher_info),
1023*62c56f98SSadaf Ebrahimi                                      MBEDTLS_ENCRYPT)) != 0) {
1024*62c56f98SSadaf Ebrahimi         MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_cipher_setkey", ret);
1025*62c56f98SSadaf Ebrahimi         return ret;
1026*62c56f98SSadaf Ebrahimi     }
1027*62c56f98SSadaf Ebrahimi 
1028*62c56f98SSadaf Ebrahimi     if ((ret = mbedtls_cipher_setkey(&transform->cipher_ctx_dec,
1029*62c56f98SSadaf Ebrahimi                                      key_dec, mbedtls_cipher_info_get_key_bitlen(cipher_info),
1030*62c56f98SSadaf Ebrahimi                                      MBEDTLS_DECRYPT)) != 0) {
1031*62c56f98SSadaf Ebrahimi         MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_cipher_setkey", ret);
1032*62c56f98SSadaf Ebrahimi         return ret;
1033*62c56f98SSadaf Ebrahimi     }
1034*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_USE_PSA_CRYPTO */
1035*62c56f98SSadaf Ebrahimi 
1036*62c56f98SSadaf Ebrahimi     /*
1037*62c56f98SSadaf Ebrahimi      * Setup other fields in SSL transform
1038*62c56f98SSadaf Ebrahimi      */
1039*62c56f98SSadaf Ebrahimi 
1040*62c56f98SSadaf Ebrahimi     if ((ciphersuite_info->flags & MBEDTLS_CIPHERSUITE_SHORT_TAG) != 0) {
1041*62c56f98SSadaf Ebrahimi         transform->taglen  = 8;
1042*62c56f98SSadaf Ebrahimi     } else {
1043*62c56f98SSadaf Ebrahimi         transform->taglen  = 16;
1044*62c56f98SSadaf Ebrahimi     }
1045*62c56f98SSadaf Ebrahimi 
1046*62c56f98SSadaf Ebrahimi     transform->ivlen       = traffic_keys->iv_len;
1047*62c56f98SSadaf Ebrahimi     transform->maclen      = 0;
1048*62c56f98SSadaf Ebrahimi     transform->fixed_ivlen = transform->ivlen;
1049*62c56f98SSadaf Ebrahimi     transform->tls_version = MBEDTLS_SSL_VERSION_TLS1_3;
1050*62c56f98SSadaf Ebrahimi 
1051*62c56f98SSadaf Ebrahimi     /* We add the true record content type (1 Byte) to the plaintext and
1052*62c56f98SSadaf Ebrahimi      * then pad to the configured granularity. The minimum length of the
1053*62c56f98SSadaf Ebrahimi      * type-extended and padded plaintext is therefore the padding
1054*62c56f98SSadaf Ebrahimi      * granularity. */
1055*62c56f98SSadaf Ebrahimi     transform->minlen =
1056*62c56f98SSadaf Ebrahimi         transform->taglen + MBEDTLS_SSL_CID_TLS1_3_PADDING_GRANULARITY;
1057*62c56f98SSadaf Ebrahimi 
1058*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO)
1059*62c56f98SSadaf Ebrahimi     /*
1060*62c56f98SSadaf Ebrahimi      * Setup psa keys and alg
1061*62c56f98SSadaf Ebrahimi      */
1062*62c56f98SSadaf Ebrahimi     if ((status = mbedtls_ssl_cipher_to_psa(ciphersuite_info->cipher,
1063*62c56f98SSadaf Ebrahimi                                             transform->taglen,
1064*62c56f98SSadaf Ebrahimi                                             &alg,
1065*62c56f98SSadaf Ebrahimi                                             &key_type,
1066*62c56f98SSadaf Ebrahimi                                             &key_bits)) != PSA_SUCCESS) {
1067*62c56f98SSadaf Ebrahimi         MBEDTLS_SSL_DEBUG_RET(
1068*62c56f98SSadaf Ebrahimi             1, "mbedtls_ssl_cipher_to_psa", PSA_TO_MBEDTLS_ERR(status));
1069*62c56f98SSadaf Ebrahimi         return PSA_TO_MBEDTLS_ERR(status);
1070*62c56f98SSadaf Ebrahimi     }
1071*62c56f98SSadaf Ebrahimi 
1072*62c56f98SSadaf Ebrahimi     transform->psa_alg = alg;
1073*62c56f98SSadaf Ebrahimi 
1074*62c56f98SSadaf Ebrahimi     if (alg != MBEDTLS_SSL_NULL_CIPHER) {
1075*62c56f98SSadaf Ebrahimi         psa_set_key_usage_flags(&attributes, PSA_KEY_USAGE_ENCRYPT);
1076*62c56f98SSadaf Ebrahimi         psa_set_key_algorithm(&attributes, alg);
1077*62c56f98SSadaf Ebrahimi         psa_set_key_type(&attributes, key_type);
1078*62c56f98SSadaf Ebrahimi 
1079*62c56f98SSadaf Ebrahimi         if ((status = psa_import_key(&attributes,
1080*62c56f98SSadaf Ebrahimi                                      key_enc,
1081*62c56f98SSadaf Ebrahimi                                      PSA_BITS_TO_BYTES(key_bits),
1082*62c56f98SSadaf Ebrahimi                                      &transform->psa_key_enc)) != PSA_SUCCESS) {
1083*62c56f98SSadaf Ebrahimi             MBEDTLS_SSL_DEBUG_RET(
1084*62c56f98SSadaf Ebrahimi                 1, "psa_import_key", PSA_TO_MBEDTLS_ERR(status));
1085*62c56f98SSadaf Ebrahimi             return PSA_TO_MBEDTLS_ERR(status);
1086*62c56f98SSadaf Ebrahimi         }
1087*62c56f98SSadaf Ebrahimi 
1088*62c56f98SSadaf Ebrahimi         psa_set_key_usage_flags(&attributes, PSA_KEY_USAGE_DECRYPT);
1089*62c56f98SSadaf Ebrahimi 
1090*62c56f98SSadaf Ebrahimi         if ((status = psa_import_key(&attributes,
1091*62c56f98SSadaf Ebrahimi                                      key_dec,
1092*62c56f98SSadaf Ebrahimi                                      PSA_BITS_TO_BYTES(key_bits),
1093*62c56f98SSadaf Ebrahimi                                      &transform->psa_key_dec)) != PSA_SUCCESS) {
1094*62c56f98SSadaf Ebrahimi             MBEDTLS_SSL_DEBUG_RET(
1095*62c56f98SSadaf Ebrahimi                 1, "psa_import_key", PSA_TO_MBEDTLS_ERR(status));
1096*62c56f98SSadaf Ebrahimi             return PSA_TO_MBEDTLS_ERR(status);
1097*62c56f98SSadaf Ebrahimi         }
1098*62c56f98SSadaf Ebrahimi     }
1099*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_USE_PSA_CRYPTO */
1100*62c56f98SSadaf Ebrahimi 
1101*62c56f98SSadaf Ebrahimi     return 0;
1102*62c56f98SSadaf Ebrahimi }
1103*62c56f98SSadaf Ebrahimi 
1104*62c56f98SSadaf Ebrahimi MBEDTLS_CHECK_RETURN_CRITICAL
ssl_tls13_get_cipher_key_info(const mbedtls_ssl_ciphersuite_t * ciphersuite_info,size_t * key_len,size_t * iv_len)1105*62c56f98SSadaf Ebrahimi static int ssl_tls13_get_cipher_key_info(
1106*62c56f98SSadaf Ebrahimi     const mbedtls_ssl_ciphersuite_t *ciphersuite_info,
1107*62c56f98SSadaf Ebrahimi     size_t *key_len, size_t *iv_len)
1108*62c56f98SSadaf Ebrahimi {
1109*62c56f98SSadaf Ebrahimi     psa_key_type_t key_type;
1110*62c56f98SSadaf Ebrahimi     psa_algorithm_t alg;
1111*62c56f98SSadaf Ebrahimi     size_t taglen;
1112*62c56f98SSadaf Ebrahimi     size_t key_bits;
1113*62c56f98SSadaf Ebrahimi     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1114*62c56f98SSadaf Ebrahimi 
1115*62c56f98SSadaf Ebrahimi     if (ciphersuite_info->flags & MBEDTLS_CIPHERSUITE_SHORT_TAG) {
1116*62c56f98SSadaf Ebrahimi         taglen = 8;
1117*62c56f98SSadaf Ebrahimi     } else {
1118*62c56f98SSadaf Ebrahimi         taglen = 16;
1119*62c56f98SSadaf Ebrahimi     }
1120*62c56f98SSadaf Ebrahimi 
1121*62c56f98SSadaf Ebrahimi     status = mbedtls_ssl_cipher_to_psa(ciphersuite_info->cipher, taglen,
1122*62c56f98SSadaf Ebrahimi                                        &alg, &key_type, &key_bits);
1123*62c56f98SSadaf Ebrahimi     if (status != PSA_SUCCESS) {
1124*62c56f98SSadaf Ebrahimi         return PSA_TO_MBEDTLS_ERR(status);
1125*62c56f98SSadaf Ebrahimi     }
1126*62c56f98SSadaf Ebrahimi 
1127*62c56f98SSadaf Ebrahimi     *key_len = PSA_BITS_TO_BYTES(key_bits);
1128*62c56f98SSadaf Ebrahimi 
1129*62c56f98SSadaf Ebrahimi     /* TLS 1.3 only have AEAD ciphers, IV length is unconditionally 12 bytes */
1130*62c56f98SSadaf Ebrahimi     *iv_len = 12;
1131*62c56f98SSadaf Ebrahimi 
1132*62c56f98SSadaf Ebrahimi     return 0;
1133*62c56f98SSadaf Ebrahimi }
1134*62c56f98SSadaf Ebrahimi 
1135*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_EARLY_DATA)
1136*62c56f98SSadaf Ebrahimi /*
1137*62c56f98SSadaf Ebrahimi  * ssl_tls13_generate_early_key() generates the key necessary for protecting
1138*62c56f98SSadaf Ebrahimi  * the early application data and handshake messages as described in section 7
1139*62c56f98SSadaf Ebrahimi  * of RFC 8446.
1140*62c56f98SSadaf Ebrahimi  *
1141*62c56f98SSadaf Ebrahimi  * NOTE: Only one key is generated, the key for the traffic from the client to
1142*62c56f98SSadaf Ebrahimi  *       the server. The TLS 1.3 specification does not define a secret and thus
1143*62c56f98SSadaf Ebrahimi  *       a key for server early traffic.
1144*62c56f98SSadaf Ebrahimi  */
1145*62c56f98SSadaf Ebrahimi MBEDTLS_CHECK_RETURN_CRITICAL
ssl_tls13_generate_early_key(mbedtls_ssl_context * ssl,mbedtls_ssl_key_set * traffic_keys)1146*62c56f98SSadaf Ebrahimi static int ssl_tls13_generate_early_key(mbedtls_ssl_context *ssl,
1147*62c56f98SSadaf Ebrahimi                                         mbedtls_ssl_key_set *traffic_keys)
1148*62c56f98SSadaf Ebrahimi {
1149*62c56f98SSadaf Ebrahimi     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1150*62c56f98SSadaf Ebrahimi     mbedtls_md_type_t md_type;
1151*62c56f98SSadaf Ebrahimi     psa_algorithm_t hash_alg;
1152*62c56f98SSadaf Ebrahimi     size_t hash_len;
1153*62c56f98SSadaf Ebrahimi     unsigned char transcript[MBEDTLS_TLS1_3_MD_MAX_SIZE];
1154*62c56f98SSadaf Ebrahimi     size_t transcript_len;
1155*62c56f98SSadaf Ebrahimi     size_t key_len;
1156*62c56f98SSadaf Ebrahimi     size_t iv_len;
1157*62c56f98SSadaf Ebrahimi     mbedtls_ssl_tls13_early_secrets tls13_early_secrets;
1158*62c56f98SSadaf Ebrahimi 
1159*62c56f98SSadaf Ebrahimi     mbedtls_ssl_handshake_params *handshake = ssl->handshake;
1160*62c56f98SSadaf Ebrahimi     const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
1161*62c56f98SSadaf Ebrahimi         handshake->ciphersuite_info;
1162*62c56f98SSadaf Ebrahimi 
1163*62c56f98SSadaf Ebrahimi     MBEDTLS_SSL_DEBUG_MSG(2, ("=> ssl_tls13_generate_early_key"));
1164*62c56f98SSadaf Ebrahimi 
1165*62c56f98SSadaf Ebrahimi     ret = ssl_tls13_get_cipher_key_info(ciphersuite_info, &key_len, &iv_len);
1166*62c56f98SSadaf Ebrahimi     if (ret != 0) {
1167*62c56f98SSadaf Ebrahimi         MBEDTLS_SSL_DEBUG_RET(1, "ssl_tls13_get_cipher_key_info", ret);
1168*62c56f98SSadaf Ebrahimi         goto cleanup;
1169*62c56f98SSadaf Ebrahimi     }
1170*62c56f98SSadaf Ebrahimi 
1171*62c56f98SSadaf Ebrahimi     md_type = ciphersuite_info->mac;
1172*62c56f98SSadaf Ebrahimi 
1173*62c56f98SSadaf Ebrahimi     hash_alg = mbedtls_md_psa_alg_from_type(ciphersuite_info->mac);
1174*62c56f98SSadaf Ebrahimi     hash_len = PSA_HASH_LENGTH(hash_alg);
1175*62c56f98SSadaf Ebrahimi 
1176*62c56f98SSadaf Ebrahimi     ret = mbedtls_ssl_get_handshake_transcript(ssl, md_type,
1177*62c56f98SSadaf Ebrahimi                                                transcript,
1178*62c56f98SSadaf Ebrahimi                                                sizeof(transcript),
1179*62c56f98SSadaf Ebrahimi                                                &transcript_len);
1180*62c56f98SSadaf Ebrahimi     if (ret != 0) {
1181*62c56f98SSadaf Ebrahimi         MBEDTLS_SSL_DEBUG_RET(1,
1182*62c56f98SSadaf Ebrahimi                               "mbedtls_ssl_get_handshake_transcript",
1183*62c56f98SSadaf Ebrahimi                               ret);
1184*62c56f98SSadaf Ebrahimi         goto cleanup;
1185*62c56f98SSadaf Ebrahimi     }
1186*62c56f98SSadaf Ebrahimi 
1187*62c56f98SSadaf Ebrahimi     ret = mbedtls_ssl_tls13_derive_early_secrets(
1188*62c56f98SSadaf Ebrahimi         hash_alg, handshake->tls13_master_secrets.early,
1189*62c56f98SSadaf Ebrahimi         transcript, transcript_len, &tls13_early_secrets);
1190*62c56f98SSadaf Ebrahimi     if (ret != 0) {
1191*62c56f98SSadaf Ebrahimi         MBEDTLS_SSL_DEBUG_RET(
1192*62c56f98SSadaf Ebrahimi             1, "mbedtls_ssl_tls13_derive_early_secrets", ret);
1193*62c56f98SSadaf Ebrahimi         goto cleanup;
1194*62c56f98SSadaf Ebrahimi     }
1195*62c56f98SSadaf Ebrahimi 
1196*62c56f98SSadaf Ebrahimi     MBEDTLS_SSL_DEBUG_BUF(
1197*62c56f98SSadaf Ebrahimi         4, "Client early traffic secret",
1198*62c56f98SSadaf Ebrahimi         tls13_early_secrets.client_early_traffic_secret, hash_len);
1199*62c56f98SSadaf Ebrahimi 
1200*62c56f98SSadaf Ebrahimi     /*
1201*62c56f98SSadaf Ebrahimi      * Export client handshake traffic secret
1202*62c56f98SSadaf Ebrahimi      */
1203*62c56f98SSadaf Ebrahimi     if (ssl->f_export_keys != NULL) {
1204*62c56f98SSadaf Ebrahimi         ssl->f_export_keys(
1205*62c56f98SSadaf Ebrahimi             ssl->p_export_keys,
1206*62c56f98SSadaf Ebrahimi             MBEDTLS_SSL_KEY_EXPORT_TLS1_3_CLIENT_EARLY_SECRET,
1207*62c56f98SSadaf Ebrahimi             tls13_early_secrets.client_early_traffic_secret,
1208*62c56f98SSadaf Ebrahimi             hash_len,
1209*62c56f98SSadaf Ebrahimi             handshake->randbytes,
1210*62c56f98SSadaf Ebrahimi             handshake->randbytes + MBEDTLS_CLIENT_HELLO_RANDOM_LEN,
1211*62c56f98SSadaf Ebrahimi             MBEDTLS_SSL_TLS_PRF_NONE /* TODO: FIX! */);
1212*62c56f98SSadaf Ebrahimi     }
1213*62c56f98SSadaf Ebrahimi 
1214*62c56f98SSadaf Ebrahimi     ret = ssl_tls13_make_traffic_key(
1215*62c56f98SSadaf Ebrahimi         hash_alg,
1216*62c56f98SSadaf Ebrahimi         tls13_early_secrets.client_early_traffic_secret,
1217*62c56f98SSadaf Ebrahimi         hash_len, traffic_keys->client_write_key, key_len,
1218*62c56f98SSadaf Ebrahimi         traffic_keys->client_write_iv, iv_len);
1219*62c56f98SSadaf Ebrahimi     if (ret != 0) {
1220*62c56f98SSadaf Ebrahimi         MBEDTLS_SSL_DEBUG_RET(1, "ssl_tls13_make_traffic_key", ret);
1221*62c56f98SSadaf Ebrahimi         goto cleanup;
1222*62c56f98SSadaf Ebrahimi     }
1223*62c56f98SSadaf Ebrahimi     traffic_keys->key_len = key_len;
1224*62c56f98SSadaf Ebrahimi     traffic_keys->iv_len = iv_len;
1225*62c56f98SSadaf Ebrahimi 
1226*62c56f98SSadaf Ebrahimi     MBEDTLS_SSL_DEBUG_BUF(4, "client early write_key",
1227*62c56f98SSadaf Ebrahimi                           traffic_keys->client_write_key,
1228*62c56f98SSadaf Ebrahimi                           traffic_keys->key_len);
1229*62c56f98SSadaf Ebrahimi 
1230*62c56f98SSadaf Ebrahimi     MBEDTLS_SSL_DEBUG_BUF(4, "client early write_iv",
1231*62c56f98SSadaf Ebrahimi                           traffic_keys->client_write_iv,
1232*62c56f98SSadaf Ebrahimi                           traffic_keys->iv_len);
1233*62c56f98SSadaf Ebrahimi 
1234*62c56f98SSadaf Ebrahimi     MBEDTLS_SSL_DEBUG_MSG(2, ("<= ssl_tls13_generate_early_key"));
1235*62c56f98SSadaf Ebrahimi 
1236*62c56f98SSadaf Ebrahimi cleanup:
1237*62c56f98SSadaf Ebrahimi     /* Erase early secrets and transcript */
1238*62c56f98SSadaf Ebrahimi     mbedtls_platform_zeroize(
1239*62c56f98SSadaf Ebrahimi         &tls13_early_secrets, sizeof(mbedtls_ssl_tls13_early_secrets));
1240*62c56f98SSadaf Ebrahimi     mbedtls_platform_zeroize(transcript, sizeof(transcript));
1241*62c56f98SSadaf Ebrahimi     return ret;
1242*62c56f98SSadaf Ebrahimi }
1243*62c56f98SSadaf Ebrahimi 
mbedtls_ssl_tls13_compute_early_transform(mbedtls_ssl_context * ssl)1244*62c56f98SSadaf Ebrahimi int mbedtls_ssl_tls13_compute_early_transform(mbedtls_ssl_context *ssl)
1245*62c56f98SSadaf Ebrahimi {
1246*62c56f98SSadaf Ebrahimi     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1247*62c56f98SSadaf Ebrahimi     mbedtls_ssl_key_set traffic_keys;
1248*62c56f98SSadaf Ebrahimi     mbedtls_ssl_transform *transform_earlydata = NULL;
1249*62c56f98SSadaf Ebrahimi     mbedtls_ssl_handshake_params *handshake = ssl->handshake;
1250*62c56f98SSadaf Ebrahimi 
1251*62c56f98SSadaf Ebrahimi     /* Next evolution in key schedule: Establish early_data secret and
1252*62c56f98SSadaf Ebrahimi      * key material. */
1253*62c56f98SSadaf Ebrahimi     ret = ssl_tls13_generate_early_key(ssl, &traffic_keys);
1254*62c56f98SSadaf Ebrahimi     if (ret != 0) {
1255*62c56f98SSadaf Ebrahimi         MBEDTLS_SSL_DEBUG_RET(1, "ssl_tls13_generate_early_key",
1256*62c56f98SSadaf Ebrahimi                               ret);
1257*62c56f98SSadaf Ebrahimi         goto cleanup;
1258*62c56f98SSadaf Ebrahimi     }
1259*62c56f98SSadaf Ebrahimi 
1260*62c56f98SSadaf Ebrahimi     transform_earlydata = mbedtls_calloc(1, sizeof(mbedtls_ssl_transform));
1261*62c56f98SSadaf Ebrahimi     if (transform_earlydata == NULL) {
1262*62c56f98SSadaf Ebrahimi         ret = MBEDTLS_ERR_SSL_ALLOC_FAILED;
1263*62c56f98SSadaf Ebrahimi         goto cleanup;
1264*62c56f98SSadaf Ebrahimi     }
1265*62c56f98SSadaf Ebrahimi 
1266*62c56f98SSadaf Ebrahimi     ret = mbedtls_ssl_tls13_populate_transform(
1267*62c56f98SSadaf Ebrahimi         transform_earlydata,
1268*62c56f98SSadaf Ebrahimi         ssl->conf->endpoint,
1269*62c56f98SSadaf Ebrahimi         handshake->ciphersuite_info->id,
1270*62c56f98SSadaf Ebrahimi         &traffic_keys,
1271*62c56f98SSadaf Ebrahimi         ssl);
1272*62c56f98SSadaf Ebrahimi     if (ret != 0) {
1273*62c56f98SSadaf Ebrahimi         MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_tls13_populate_transform", ret);
1274*62c56f98SSadaf Ebrahimi         goto cleanup;
1275*62c56f98SSadaf Ebrahimi     }
1276*62c56f98SSadaf Ebrahimi     handshake->transform_earlydata = transform_earlydata;
1277*62c56f98SSadaf Ebrahimi 
1278*62c56f98SSadaf Ebrahimi cleanup:
1279*62c56f98SSadaf Ebrahimi     mbedtls_platform_zeroize(&traffic_keys, sizeof(traffic_keys));
1280*62c56f98SSadaf Ebrahimi     if (ret != 0) {
1281*62c56f98SSadaf Ebrahimi         mbedtls_free(transform_earlydata);
1282*62c56f98SSadaf Ebrahimi     }
1283*62c56f98SSadaf Ebrahimi 
1284*62c56f98SSadaf Ebrahimi     return ret;
1285*62c56f98SSadaf Ebrahimi }
1286*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_EARLY_DATA */
1287*62c56f98SSadaf Ebrahimi 
mbedtls_ssl_tls13_key_schedule_stage_early(mbedtls_ssl_context * ssl)1288*62c56f98SSadaf Ebrahimi int mbedtls_ssl_tls13_key_schedule_stage_early(mbedtls_ssl_context *ssl)
1289*62c56f98SSadaf Ebrahimi {
1290*62c56f98SSadaf Ebrahimi     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1291*62c56f98SSadaf Ebrahimi     psa_algorithm_t hash_alg;
1292*62c56f98SSadaf Ebrahimi     mbedtls_ssl_handshake_params *handshake = ssl->handshake;
1293*62c56f98SSadaf Ebrahimi     unsigned char *psk = NULL;
1294*62c56f98SSadaf Ebrahimi     size_t psk_len = 0;
1295*62c56f98SSadaf Ebrahimi 
1296*62c56f98SSadaf Ebrahimi     if (handshake->ciphersuite_info == NULL) {
1297*62c56f98SSadaf Ebrahimi         MBEDTLS_SSL_DEBUG_MSG(1, ("cipher suite info not found"));
1298*62c56f98SSadaf Ebrahimi         return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
1299*62c56f98SSadaf Ebrahimi     }
1300*62c56f98SSadaf Ebrahimi 
1301*62c56f98SSadaf Ebrahimi     hash_alg = mbedtls_md_psa_alg_from_type(handshake->ciphersuite_info->mac);
1302*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_PSK_ENABLED)
1303*62c56f98SSadaf Ebrahimi     if (mbedtls_ssl_tls13_key_exchange_mode_with_psk(ssl)) {
1304*62c56f98SSadaf Ebrahimi         ret = mbedtls_ssl_tls13_export_handshake_psk(ssl, &psk, &psk_len);
1305*62c56f98SSadaf Ebrahimi         if (ret != 0) {
1306*62c56f98SSadaf Ebrahimi             MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_tls13_export_handshake_psk",
1307*62c56f98SSadaf Ebrahimi                                   ret);
1308*62c56f98SSadaf Ebrahimi             return ret;
1309*62c56f98SSadaf Ebrahimi         }
1310*62c56f98SSadaf Ebrahimi     }
1311*62c56f98SSadaf Ebrahimi #endif
1312*62c56f98SSadaf Ebrahimi 
1313*62c56f98SSadaf Ebrahimi     ret = mbedtls_ssl_tls13_evolve_secret(hash_alg, NULL, psk, psk_len,
1314*62c56f98SSadaf Ebrahimi                                           handshake->tls13_master_secrets.early);
1315*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO) && \
1316*62c56f98SSadaf Ebrahimi     defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_PSK_ENABLED)
1317*62c56f98SSadaf Ebrahimi     mbedtls_free((void *) psk);
1318*62c56f98SSadaf Ebrahimi #endif
1319*62c56f98SSadaf Ebrahimi     if (ret != 0) {
1320*62c56f98SSadaf Ebrahimi         MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_tls13_evolve_secret", ret);
1321*62c56f98SSadaf Ebrahimi         return ret;
1322*62c56f98SSadaf Ebrahimi     }
1323*62c56f98SSadaf Ebrahimi 
1324*62c56f98SSadaf Ebrahimi     MBEDTLS_SSL_DEBUG_BUF(4, "mbedtls_ssl_tls13_key_schedule_stage_early",
1325*62c56f98SSadaf Ebrahimi                           handshake->tls13_master_secrets.early,
1326*62c56f98SSadaf Ebrahimi                           PSA_HASH_LENGTH(hash_alg));
1327*62c56f98SSadaf Ebrahimi     return 0;
1328*62c56f98SSadaf Ebrahimi }
1329*62c56f98SSadaf Ebrahimi 
1330*62c56f98SSadaf Ebrahimi /**
1331*62c56f98SSadaf Ebrahimi  * \brief Compute TLS 1.3 handshake traffic keys.
1332*62c56f98SSadaf Ebrahimi  *
1333*62c56f98SSadaf Ebrahimi  *        ssl_tls13_generate_handshake_keys() generates keys necessary for
1334*62c56f98SSadaf Ebrahimi  *        protecting the handshake messages, as described in Section 7 of
1335*62c56f98SSadaf Ebrahimi  *        RFC 8446.
1336*62c56f98SSadaf Ebrahimi  *
1337*62c56f98SSadaf Ebrahimi  * \param ssl  The SSL context to operate on. This must be in
1338*62c56f98SSadaf Ebrahimi  *             key schedule stage \c Handshake, see
1339*62c56f98SSadaf Ebrahimi  *             ssl_tls13_key_schedule_stage_handshake().
1340*62c56f98SSadaf Ebrahimi  * \param traffic_keys The address at which to store the handshake traffic
1341*62c56f98SSadaf Ebrahimi  *                     keys. This must be writable but may be uninitialized.
1342*62c56f98SSadaf Ebrahimi  *
1343*62c56f98SSadaf Ebrahimi  * \returns    \c 0 on success.
1344*62c56f98SSadaf Ebrahimi  * \returns    A negative error code on failure.
1345*62c56f98SSadaf Ebrahimi  */
1346*62c56f98SSadaf Ebrahimi MBEDTLS_CHECK_RETURN_CRITICAL
ssl_tls13_generate_handshake_keys(mbedtls_ssl_context * ssl,mbedtls_ssl_key_set * traffic_keys)1347*62c56f98SSadaf Ebrahimi static int ssl_tls13_generate_handshake_keys(mbedtls_ssl_context *ssl,
1348*62c56f98SSadaf Ebrahimi                                              mbedtls_ssl_key_set *traffic_keys)
1349*62c56f98SSadaf Ebrahimi {
1350*62c56f98SSadaf Ebrahimi     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1351*62c56f98SSadaf Ebrahimi     mbedtls_md_type_t md_type;
1352*62c56f98SSadaf Ebrahimi     psa_algorithm_t hash_alg;
1353*62c56f98SSadaf Ebrahimi     size_t hash_len;
1354*62c56f98SSadaf Ebrahimi     unsigned char transcript[MBEDTLS_TLS1_3_MD_MAX_SIZE];
1355*62c56f98SSadaf Ebrahimi     size_t transcript_len;
1356*62c56f98SSadaf Ebrahimi     size_t key_len;
1357*62c56f98SSadaf Ebrahimi     size_t iv_len;
1358*62c56f98SSadaf Ebrahimi 
1359*62c56f98SSadaf Ebrahimi     mbedtls_ssl_handshake_params *handshake = ssl->handshake;
1360*62c56f98SSadaf Ebrahimi     const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
1361*62c56f98SSadaf Ebrahimi         handshake->ciphersuite_info;
1362*62c56f98SSadaf Ebrahimi     mbedtls_ssl_tls13_handshake_secrets *tls13_hs_secrets =
1363*62c56f98SSadaf Ebrahimi         &handshake->tls13_hs_secrets;
1364*62c56f98SSadaf Ebrahimi 
1365*62c56f98SSadaf Ebrahimi     MBEDTLS_SSL_DEBUG_MSG(2, ("=> ssl_tls13_generate_handshake_keys"));
1366*62c56f98SSadaf Ebrahimi 
1367*62c56f98SSadaf Ebrahimi     ret = ssl_tls13_get_cipher_key_info(ciphersuite_info, &key_len, &iv_len);
1368*62c56f98SSadaf Ebrahimi     if (ret != 0) {
1369*62c56f98SSadaf Ebrahimi         MBEDTLS_SSL_DEBUG_RET(1, "ssl_tls13_get_cipher_key_info", ret);
1370*62c56f98SSadaf Ebrahimi         return ret;
1371*62c56f98SSadaf Ebrahimi     }
1372*62c56f98SSadaf Ebrahimi 
1373*62c56f98SSadaf Ebrahimi     md_type = ciphersuite_info->mac;
1374*62c56f98SSadaf Ebrahimi 
1375*62c56f98SSadaf Ebrahimi     hash_alg = mbedtls_md_psa_alg_from_type(ciphersuite_info->mac);
1376*62c56f98SSadaf Ebrahimi     hash_len = PSA_HASH_LENGTH(hash_alg);
1377*62c56f98SSadaf Ebrahimi 
1378*62c56f98SSadaf Ebrahimi     ret = mbedtls_ssl_get_handshake_transcript(ssl, md_type,
1379*62c56f98SSadaf Ebrahimi                                                transcript,
1380*62c56f98SSadaf Ebrahimi                                                sizeof(transcript),
1381*62c56f98SSadaf Ebrahimi                                                &transcript_len);
1382*62c56f98SSadaf Ebrahimi     if (ret != 0) {
1383*62c56f98SSadaf Ebrahimi         MBEDTLS_SSL_DEBUG_RET(1,
1384*62c56f98SSadaf Ebrahimi                               "mbedtls_ssl_get_handshake_transcript",
1385*62c56f98SSadaf Ebrahimi                               ret);
1386*62c56f98SSadaf Ebrahimi         return ret;
1387*62c56f98SSadaf Ebrahimi     }
1388*62c56f98SSadaf Ebrahimi 
1389*62c56f98SSadaf Ebrahimi     ret = mbedtls_ssl_tls13_derive_handshake_secrets(
1390*62c56f98SSadaf Ebrahimi         hash_alg, handshake->tls13_master_secrets.handshake,
1391*62c56f98SSadaf Ebrahimi         transcript, transcript_len, tls13_hs_secrets);
1392*62c56f98SSadaf Ebrahimi     if (ret != 0) {
1393*62c56f98SSadaf Ebrahimi         MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_tls13_derive_handshake_secrets",
1394*62c56f98SSadaf Ebrahimi                               ret);
1395*62c56f98SSadaf Ebrahimi         return ret;
1396*62c56f98SSadaf Ebrahimi     }
1397*62c56f98SSadaf Ebrahimi 
1398*62c56f98SSadaf Ebrahimi     MBEDTLS_SSL_DEBUG_BUF(4, "Client handshake traffic secret",
1399*62c56f98SSadaf Ebrahimi                           tls13_hs_secrets->client_handshake_traffic_secret,
1400*62c56f98SSadaf Ebrahimi                           hash_len);
1401*62c56f98SSadaf Ebrahimi     MBEDTLS_SSL_DEBUG_BUF(4, "Server handshake traffic secret",
1402*62c56f98SSadaf Ebrahimi                           tls13_hs_secrets->server_handshake_traffic_secret,
1403*62c56f98SSadaf Ebrahimi                           hash_len);
1404*62c56f98SSadaf Ebrahimi 
1405*62c56f98SSadaf Ebrahimi     /*
1406*62c56f98SSadaf Ebrahimi      * Export client handshake traffic secret
1407*62c56f98SSadaf Ebrahimi      */
1408*62c56f98SSadaf Ebrahimi     if (ssl->f_export_keys != NULL) {
1409*62c56f98SSadaf Ebrahimi         ssl->f_export_keys(
1410*62c56f98SSadaf Ebrahimi             ssl->p_export_keys,
1411*62c56f98SSadaf Ebrahimi             MBEDTLS_SSL_KEY_EXPORT_TLS1_3_CLIENT_HANDSHAKE_TRAFFIC_SECRET,
1412*62c56f98SSadaf Ebrahimi             tls13_hs_secrets->client_handshake_traffic_secret,
1413*62c56f98SSadaf Ebrahimi             hash_len,
1414*62c56f98SSadaf Ebrahimi             handshake->randbytes,
1415*62c56f98SSadaf Ebrahimi             handshake->randbytes + MBEDTLS_CLIENT_HELLO_RANDOM_LEN,
1416*62c56f98SSadaf Ebrahimi             MBEDTLS_SSL_TLS_PRF_NONE /* TODO: FIX! */);
1417*62c56f98SSadaf Ebrahimi 
1418*62c56f98SSadaf Ebrahimi         ssl->f_export_keys(
1419*62c56f98SSadaf Ebrahimi             ssl->p_export_keys,
1420*62c56f98SSadaf Ebrahimi             MBEDTLS_SSL_KEY_EXPORT_TLS1_3_SERVER_HANDSHAKE_TRAFFIC_SECRET,
1421*62c56f98SSadaf Ebrahimi             tls13_hs_secrets->server_handshake_traffic_secret,
1422*62c56f98SSadaf Ebrahimi             hash_len,
1423*62c56f98SSadaf Ebrahimi             handshake->randbytes,
1424*62c56f98SSadaf Ebrahimi             handshake->randbytes + MBEDTLS_CLIENT_HELLO_RANDOM_LEN,
1425*62c56f98SSadaf Ebrahimi             MBEDTLS_SSL_TLS_PRF_NONE /* TODO: FIX! */);
1426*62c56f98SSadaf Ebrahimi     }
1427*62c56f98SSadaf Ebrahimi 
1428*62c56f98SSadaf Ebrahimi     ret = mbedtls_ssl_tls13_make_traffic_keys(
1429*62c56f98SSadaf Ebrahimi         hash_alg,
1430*62c56f98SSadaf Ebrahimi         tls13_hs_secrets->client_handshake_traffic_secret,
1431*62c56f98SSadaf Ebrahimi         tls13_hs_secrets->server_handshake_traffic_secret,
1432*62c56f98SSadaf Ebrahimi         hash_len, key_len, iv_len, traffic_keys);
1433*62c56f98SSadaf Ebrahimi     if (ret != 0) {
1434*62c56f98SSadaf Ebrahimi         MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_tls13_make_traffic_keys", ret);
1435*62c56f98SSadaf Ebrahimi         goto exit;
1436*62c56f98SSadaf Ebrahimi     }
1437*62c56f98SSadaf Ebrahimi 
1438*62c56f98SSadaf Ebrahimi     MBEDTLS_SSL_DEBUG_BUF(4, "client_handshake write_key",
1439*62c56f98SSadaf Ebrahimi                           traffic_keys->client_write_key,
1440*62c56f98SSadaf Ebrahimi                           traffic_keys->key_len);
1441*62c56f98SSadaf Ebrahimi 
1442*62c56f98SSadaf Ebrahimi     MBEDTLS_SSL_DEBUG_BUF(4, "server_handshake write_key",
1443*62c56f98SSadaf Ebrahimi                           traffic_keys->server_write_key,
1444*62c56f98SSadaf Ebrahimi                           traffic_keys->key_len);
1445*62c56f98SSadaf Ebrahimi 
1446*62c56f98SSadaf Ebrahimi     MBEDTLS_SSL_DEBUG_BUF(4, "client_handshake write_iv",
1447*62c56f98SSadaf Ebrahimi                           traffic_keys->client_write_iv,
1448*62c56f98SSadaf Ebrahimi                           traffic_keys->iv_len);
1449*62c56f98SSadaf Ebrahimi 
1450*62c56f98SSadaf Ebrahimi     MBEDTLS_SSL_DEBUG_BUF(4, "server_handshake write_iv",
1451*62c56f98SSadaf Ebrahimi                           traffic_keys->server_write_iv,
1452*62c56f98SSadaf Ebrahimi                           traffic_keys->iv_len);
1453*62c56f98SSadaf Ebrahimi 
1454*62c56f98SSadaf Ebrahimi     MBEDTLS_SSL_DEBUG_MSG(2, ("<= ssl_tls13_generate_handshake_keys"));
1455*62c56f98SSadaf Ebrahimi 
1456*62c56f98SSadaf Ebrahimi exit:
1457*62c56f98SSadaf Ebrahimi 
1458*62c56f98SSadaf Ebrahimi     return ret;
1459*62c56f98SSadaf Ebrahimi }
1460*62c56f98SSadaf Ebrahimi 
1461*62c56f98SSadaf Ebrahimi /**
1462*62c56f98SSadaf Ebrahimi  * \brief Transition into handshake stage of TLS 1.3 key schedule.
1463*62c56f98SSadaf Ebrahimi  *
1464*62c56f98SSadaf Ebrahimi  *        The TLS 1.3 key schedule can be viewed as a simple state machine
1465*62c56f98SSadaf Ebrahimi  *        with states Initial -> Early -> Handshake -> Application, and
1466*62c56f98SSadaf Ebrahimi  *        this function represents the Early -> Handshake transition.
1467*62c56f98SSadaf Ebrahimi  *
1468*62c56f98SSadaf Ebrahimi  *        In the handshake stage, ssl_tls13_generate_handshake_keys()
1469*62c56f98SSadaf Ebrahimi  *        can be used to derive the handshake traffic keys.
1470*62c56f98SSadaf Ebrahimi  *
1471*62c56f98SSadaf Ebrahimi  * \param ssl  The SSL context to operate on. This must be in key schedule
1472*62c56f98SSadaf Ebrahimi  *             stage \c Early.
1473*62c56f98SSadaf Ebrahimi  *
1474*62c56f98SSadaf Ebrahimi  * \returns    \c 0 on success.
1475*62c56f98SSadaf Ebrahimi  * \returns    A negative error code on failure.
1476*62c56f98SSadaf Ebrahimi  */
1477*62c56f98SSadaf Ebrahimi MBEDTLS_CHECK_RETURN_CRITICAL
ssl_tls13_key_schedule_stage_handshake(mbedtls_ssl_context * ssl)1478*62c56f98SSadaf Ebrahimi static int ssl_tls13_key_schedule_stage_handshake(mbedtls_ssl_context *ssl)
1479*62c56f98SSadaf Ebrahimi {
1480*62c56f98SSadaf Ebrahimi     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1481*62c56f98SSadaf Ebrahimi     mbedtls_ssl_handshake_params *handshake = ssl->handshake;
1482*62c56f98SSadaf Ebrahimi     psa_algorithm_t const hash_alg = mbedtls_md_psa_alg_from_type(
1483*62c56f98SSadaf Ebrahimi         handshake->ciphersuite_info->mac);
1484*62c56f98SSadaf Ebrahimi     unsigned char *shared_secret = NULL;
1485*62c56f98SSadaf Ebrahimi     size_t shared_secret_len = 0;
1486*62c56f98SSadaf Ebrahimi 
1487*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_EPHEMERAL_ENABLED)
1488*62c56f98SSadaf Ebrahimi     /*
1489*62c56f98SSadaf Ebrahimi      * Compute ECDHE secret used to compute the handshake secret from which
1490*62c56f98SSadaf Ebrahimi      * client_handshake_traffic_secret and server_handshake_traffic_secret
1491*62c56f98SSadaf Ebrahimi      * are derived in the handshake secret derivation stage.
1492*62c56f98SSadaf Ebrahimi      */
1493*62c56f98SSadaf Ebrahimi     if (mbedtls_ssl_tls13_key_exchange_mode_with_ephemeral(ssl)) {
1494*62c56f98SSadaf Ebrahimi         if (mbedtls_ssl_tls13_named_group_is_ecdhe(handshake->offered_group_id) ||
1495*62c56f98SSadaf Ebrahimi             mbedtls_ssl_tls13_named_group_is_ffdh(handshake->offered_group_id)) {
1496*62c56f98SSadaf Ebrahimi #if defined(PSA_WANT_ALG_ECDH) || defined(PSA_WANT_ALG_FFDH)
1497*62c56f98SSadaf Ebrahimi             psa_algorithm_t alg =
1498*62c56f98SSadaf Ebrahimi                 mbedtls_ssl_tls13_named_group_is_ecdhe(handshake->offered_group_id) ?
1499*62c56f98SSadaf Ebrahimi                 PSA_ALG_ECDH : PSA_ALG_FFDH;
1500*62c56f98SSadaf Ebrahimi 
1501*62c56f98SSadaf Ebrahimi             /* Compute ECDH shared secret. */
1502*62c56f98SSadaf Ebrahimi             psa_status_t status = PSA_ERROR_GENERIC_ERROR;
1503*62c56f98SSadaf Ebrahimi             psa_key_attributes_t key_attributes = PSA_KEY_ATTRIBUTES_INIT;
1504*62c56f98SSadaf Ebrahimi 
1505*62c56f98SSadaf Ebrahimi             status = psa_get_key_attributes(handshake->xxdh_psa_privkey,
1506*62c56f98SSadaf Ebrahimi                                             &key_attributes);
1507*62c56f98SSadaf Ebrahimi             if (status != PSA_SUCCESS) {
1508*62c56f98SSadaf Ebrahimi                 ret = PSA_TO_MBEDTLS_ERR(status);
1509*62c56f98SSadaf Ebrahimi             }
1510*62c56f98SSadaf Ebrahimi 
1511*62c56f98SSadaf Ebrahimi             shared_secret_len = PSA_BITS_TO_BYTES(
1512*62c56f98SSadaf Ebrahimi                 psa_get_key_bits(&key_attributes));
1513*62c56f98SSadaf Ebrahimi             shared_secret = mbedtls_calloc(1, shared_secret_len);
1514*62c56f98SSadaf Ebrahimi             if (shared_secret == NULL) {
1515*62c56f98SSadaf Ebrahimi                 return MBEDTLS_ERR_SSL_ALLOC_FAILED;
1516*62c56f98SSadaf Ebrahimi             }
1517*62c56f98SSadaf Ebrahimi 
1518*62c56f98SSadaf Ebrahimi             status = psa_raw_key_agreement(
1519*62c56f98SSadaf Ebrahimi                 alg, handshake->xxdh_psa_privkey,
1520*62c56f98SSadaf Ebrahimi                 handshake->xxdh_psa_peerkey, handshake->xxdh_psa_peerkey_len,
1521*62c56f98SSadaf Ebrahimi                 shared_secret, shared_secret_len, &shared_secret_len);
1522*62c56f98SSadaf Ebrahimi             if (status != PSA_SUCCESS) {
1523*62c56f98SSadaf Ebrahimi                 ret = PSA_TO_MBEDTLS_ERR(status);
1524*62c56f98SSadaf Ebrahimi                 MBEDTLS_SSL_DEBUG_RET(1, "psa_raw_key_agreement", ret);
1525*62c56f98SSadaf Ebrahimi                 goto cleanup;
1526*62c56f98SSadaf Ebrahimi             }
1527*62c56f98SSadaf Ebrahimi 
1528*62c56f98SSadaf Ebrahimi             status = psa_destroy_key(handshake->xxdh_psa_privkey);
1529*62c56f98SSadaf Ebrahimi             if (status != PSA_SUCCESS) {
1530*62c56f98SSadaf Ebrahimi                 ret = PSA_TO_MBEDTLS_ERR(status);
1531*62c56f98SSadaf Ebrahimi                 MBEDTLS_SSL_DEBUG_RET(1, "psa_destroy_key", ret);
1532*62c56f98SSadaf Ebrahimi                 goto cleanup;
1533*62c56f98SSadaf Ebrahimi             }
1534*62c56f98SSadaf Ebrahimi 
1535*62c56f98SSadaf Ebrahimi             handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
1536*62c56f98SSadaf Ebrahimi #endif /* PSA_WANT_ALG_ECDH || PSA_WANT_ALG_FFDH */
1537*62c56f98SSadaf Ebrahimi         } else {
1538*62c56f98SSadaf Ebrahimi             MBEDTLS_SSL_DEBUG_MSG(1, ("Group not supported."));
1539*62c56f98SSadaf Ebrahimi             return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
1540*62c56f98SSadaf Ebrahimi         }
1541*62c56f98SSadaf Ebrahimi     }
1542*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_EPHEMERAL_ENABLED */
1543*62c56f98SSadaf Ebrahimi 
1544*62c56f98SSadaf Ebrahimi     /*
1545*62c56f98SSadaf Ebrahimi      * Compute the Handshake Secret
1546*62c56f98SSadaf Ebrahimi      */
1547*62c56f98SSadaf Ebrahimi     ret = mbedtls_ssl_tls13_evolve_secret(
1548*62c56f98SSadaf Ebrahimi         hash_alg, handshake->tls13_master_secrets.early,
1549*62c56f98SSadaf Ebrahimi         shared_secret, shared_secret_len,
1550*62c56f98SSadaf Ebrahimi         handshake->tls13_master_secrets.handshake);
1551*62c56f98SSadaf Ebrahimi     if (ret != 0) {
1552*62c56f98SSadaf Ebrahimi         MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_tls13_evolve_secret", ret);
1553*62c56f98SSadaf Ebrahimi         goto cleanup;
1554*62c56f98SSadaf Ebrahimi     }
1555*62c56f98SSadaf Ebrahimi 
1556*62c56f98SSadaf Ebrahimi     MBEDTLS_SSL_DEBUG_BUF(4, "Handshake secret",
1557*62c56f98SSadaf Ebrahimi                           handshake->tls13_master_secrets.handshake,
1558*62c56f98SSadaf Ebrahimi                           PSA_HASH_LENGTH(hash_alg));
1559*62c56f98SSadaf Ebrahimi 
1560*62c56f98SSadaf Ebrahimi cleanup:
1561*62c56f98SSadaf Ebrahimi     if (shared_secret != NULL) {
1562*62c56f98SSadaf Ebrahimi         mbedtls_zeroize_and_free(shared_secret, shared_secret_len);
1563*62c56f98SSadaf Ebrahimi     }
1564*62c56f98SSadaf Ebrahimi 
1565*62c56f98SSadaf Ebrahimi     return ret;
1566*62c56f98SSadaf Ebrahimi }
1567*62c56f98SSadaf Ebrahimi 
1568*62c56f98SSadaf Ebrahimi /**
1569*62c56f98SSadaf Ebrahimi  * \brief Compute TLS 1.3 application traffic keys.
1570*62c56f98SSadaf Ebrahimi  *
1571*62c56f98SSadaf Ebrahimi  *        ssl_tls13_generate_application_keys() generates application traffic
1572*62c56f98SSadaf Ebrahimi  *        keys, since any record following a 1-RTT Finished message MUST be
1573*62c56f98SSadaf Ebrahimi  *        encrypted under the application traffic key.
1574*62c56f98SSadaf Ebrahimi  *
1575*62c56f98SSadaf Ebrahimi  * \param ssl  The SSL context to operate on. This must be in
1576*62c56f98SSadaf Ebrahimi  *             key schedule stage \c Application, see
1577*62c56f98SSadaf Ebrahimi  *             ssl_tls13_key_schedule_stage_application().
1578*62c56f98SSadaf Ebrahimi  * \param traffic_keys The address at which to store the application traffic
1579*62c56f98SSadaf Ebrahimi  *                     keys. This must be writable but may be uninitialized.
1580*62c56f98SSadaf Ebrahimi  *
1581*62c56f98SSadaf Ebrahimi  * \returns    \c 0 on success.
1582*62c56f98SSadaf Ebrahimi  * \returns    A negative error code on failure.
1583*62c56f98SSadaf Ebrahimi  */
1584*62c56f98SSadaf Ebrahimi MBEDTLS_CHECK_RETURN_CRITICAL
ssl_tls13_generate_application_keys(mbedtls_ssl_context * ssl,mbedtls_ssl_key_set * traffic_keys)1585*62c56f98SSadaf Ebrahimi static int ssl_tls13_generate_application_keys(
1586*62c56f98SSadaf Ebrahimi     mbedtls_ssl_context *ssl,
1587*62c56f98SSadaf Ebrahimi     mbedtls_ssl_key_set *traffic_keys)
1588*62c56f98SSadaf Ebrahimi {
1589*62c56f98SSadaf Ebrahimi     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1590*62c56f98SSadaf Ebrahimi     mbedtls_ssl_handshake_params *handshake = ssl->handshake;
1591*62c56f98SSadaf Ebrahimi 
1592*62c56f98SSadaf Ebrahimi     /* Address at which to store the application secrets */
1593*62c56f98SSadaf Ebrahimi     mbedtls_ssl_tls13_application_secrets * const app_secrets =
1594*62c56f98SSadaf Ebrahimi         &ssl->session_negotiate->app_secrets;
1595*62c56f98SSadaf Ebrahimi 
1596*62c56f98SSadaf Ebrahimi     /* Holding the transcript up to and including the ServerFinished */
1597*62c56f98SSadaf Ebrahimi     unsigned char transcript[MBEDTLS_TLS1_3_MD_MAX_SIZE];
1598*62c56f98SSadaf Ebrahimi     size_t transcript_len;
1599*62c56f98SSadaf Ebrahimi 
1600*62c56f98SSadaf Ebrahimi     /* Variables relating to the hash for the chosen ciphersuite. */
1601*62c56f98SSadaf Ebrahimi     mbedtls_md_type_t md_type;
1602*62c56f98SSadaf Ebrahimi 
1603*62c56f98SSadaf Ebrahimi     psa_algorithm_t hash_alg;
1604*62c56f98SSadaf Ebrahimi     size_t hash_len;
1605*62c56f98SSadaf Ebrahimi 
1606*62c56f98SSadaf Ebrahimi     /* Variables relating to the cipher for the chosen ciphersuite. */
1607*62c56f98SSadaf Ebrahimi     size_t key_len, iv_len;
1608*62c56f98SSadaf Ebrahimi 
1609*62c56f98SSadaf Ebrahimi     MBEDTLS_SSL_DEBUG_MSG(2, ("=> derive application traffic keys"));
1610*62c56f98SSadaf Ebrahimi 
1611*62c56f98SSadaf Ebrahimi     /* Extract basic information about hash and ciphersuite */
1612*62c56f98SSadaf Ebrahimi 
1613*62c56f98SSadaf Ebrahimi     ret = ssl_tls13_get_cipher_key_info(handshake->ciphersuite_info,
1614*62c56f98SSadaf Ebrahimi                                         &key_len, &iv_len);
1615*62c56f98SSadaf Ebrahimi     if (ret != 0) {
1616*62c56f98SSadaf Ebrahimi         MBEDTLS_SSL_DEBUG_RET(1, "ssl_tls13_get_cipher_key_info", ret);
1617*62c56f98SSadaf Ebrahimi         goto cleanup;
1618*62c56f98SSadaf Ebrahimi     }
1619*62c56f98SSadaf Ebrahimi 
1620*62c56f98SSadaf Ebrahimi     md_type = handshake->ciphersuite_info->mac;
1621*62c56f98SSadaf Ebrahimi 
1622*62c56f98SSadaf Ebrahimi     hash_alg = mbedtls_md_psa_alg_from_type(handshake->ciphersuite_info->mac);
1623*62c56f98SSadaf Ebrahimi     hash_len = PSA_HASH_LENGTH(hash_alg);
1624*62c56f98SSadaf Ebrahimi 
1625*62c56f98SSadaf Ebrahimi     /* Compute current handshake transcript. It's the caller's responsibility
1626*62c56f98SSadaf Ebrahimi      * to call this at the right time, that is, after the ServerFinished. */
1627*62c56f98SSadaf Ebrahimi 
1628*62c56f98SSadaf Ebrahimi     ret = mbedtls_ssl_get_handshake_transcript(ssl, md_type,
1629*62c56f98SSadaf Ebrahimi                                                transcript, sizeof(transcript),
1630*62c56f98SSadaf Ebrahimi                                                &transcript_len);
1631*62c56f98SSadaf Ebrahimi     if (ret != 0) {
1632*62c56f98SSadaf Ebrahimi         goto cleanup;
1633*62c56f98SSadaf Ebrahimi     }
1634*62c56f98SSadaf Ebrahimi 
1635*62c56f98SSadaf Ebrahimi     /* Compute application secrets from master secret and transcript hash. */
1636*62c56f98SSadaf Ebrahimi 
1637*62c56f98SSadaf Ebrahimi     ret = mbedtls_ssl_tls13_derive_application_secrets(
1638*62c56f98SSadaf Ebrahimi         hash_alg, handshake->tls13_master_secrets.app,
1639*62c56f98SSadaf Ebrahimi         transcript, transcript_len, app_secrets);
1640*62c56f98SSadaf Ebrahimi     if (ret != 0) {
1641*62c56f98SSadaf Ebrahimi         MBEDTLS_SSL_DEBUG_RET(
1642*62c56f98SSadaf Ebrahimi             1, "mbedtls_ssl_tls13_derive_application_secrets", ret);
1643*62c56f98SSadaf Ebrahimi         goto cleanup;
1644*62c56f98SSadaf Ebrahimi     }
1645*62c56f98SSadaf Ebrahimi 
1646*62c56f98SSadaf Ebrahimi     /* Derive first epoch of IV + Key for application traffic. */
1647*62c56f98SSadaf Ebrahimi 
1648*62c56f98SSadaf Ebrahimi     ret = mbedtls_ssl_tls13_make_traffic_keys(
1649*62c56f98SSadaf Ebrahimi         hash_alg,
1650*62c56f98SSadaf Ebrahimi         app_secrets->client_application_traffic_secret_N,
1651*62c56f98SSadaf Ebrahimi         app_secrets->server_application_traffic_secret_N,
1652*62c56f98SSadaf Ebrahimi         hash_len, key_len, iv_len, traffic_keys);
1653*62c56f98SSadaf Ebrahimi     if (ret != 0) {
1654*62c56f98SSadaf Ebrahimi         MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_tls13_make_traffic_keys", ret);
1655*62c56f98SSadaf Ebrahimi         goto cleanup;
1656*62c56f98SSadaf Ebrahimi     }
1657*62c56f98SSadaf Ebrahimi 
1658*62c56f98SSadaf Ebrahimi     MBEDTLS_SSL_DEBUG_BUF(4, "Client application traffic secret",
1659*62c56f98SSadaf Ebrahimi                           app_secrets->client_application_traffic_secret_N,
1660*62c56f98SSadaf Ebrahimi                           hash_len);
1661*62c56f98SSadaf Ebrahimi 
1662*62c56f98SSadaf Ebrahimi     MBEDTLS_SSL_DEBUG_BUF(4, "Server application traffic secret",
1663*62c56f98SSadaf Ebrahimi                           app_secrets->server_application_traffic_secret_N,
1664*62c56f98SSadaf Ebrahimi                           hash_len);
1665*62c56f98SSadaf Ebrahimi 
1666*62c56f98SSadaf Ebrahimi     /*
1667*62c56f98SSadaf Ebrahimi      * Export client/server application traffic secret 0
1668*62c56f98SSadaf Ebrahimi      */
1669*62c56f98SSadaf Ebrahimi     if (ssl->f_export_keys != NULL) {
1670*62c56f98SSadaf Ebrahimi         ssl->f_export_keys(
1671*62c56f98SSadaf Ebrahimi             ssl->p_export_keys,
1672*62c56f98SSadaf Ebrahimi             MBEDTLS_SSL_KEY_EXPORT_TLS1_3_CLIENT_APPLICATION_TRAFFIC_SECRET,
1673*62c56f98SSadaf Ebrahimi             app_secrets->client_application_traffic_secret_N, hash_len,
1674*62c56f98SSadaf Ebrahimi             handshake->randbytes,
1675*62c56f98SSadaf Ebrahimi             handshake->randbytes + MBEDTLS_CLIENT_HELLO_RANDOM_LEN,
1676*62c56f98SSadaf Ebrahimi             MBEDTLS_SSL_TLS_PRF_NONE /* TODO: this should be replaced by
1677*62c56f98SSadaf Ebrahimi                                         a new constant for TLS 1.3! */);
1678*62c56f98SSadaf Ebrahimi 
1679*62c56f98SSadaf Ebrahimi         ssl->f_export_keys(
1680*62c56f98SSadaf Ebrahimi             ssl->p_export_keys,
1681*62c56f98SSadaf Ebrahimi             MBEDTLS_SSL_KEY_EXPORT_TLS1_3_SERVER_APPLICATION_TRAFFIC_SECRET,
1682*62c56f98SSadaf Ebrahimi             app_secrets->server_application_traffic_secret_N, hash_len,
1683*62c56f98SSadaf Ebrahimi             handshake->randbytes,
1684*62c56f98SSadaf Ebrahimi             handshake->randbytes + MBEDTLS_CLIENT_HELLO_RANDOM_LEN,
1685*62c56f98SSadaf Ebrahimi             MBEDTLS_SSL_TLS_PRF_NONE /* TODO: this should be replaced by
1686*62c56f98SSadaf Ebrahimi                                         a new constant for TLS 1.3! */);
1687*62c56f98SSadaf Ebrahimi     }
1688*62c56f98SSadaf Ebrahimi 
1689*62c56f98SSadaf Ebrahimi     MBEDTLS_SSL_DEBUG_BUF(4, "client application_write_key:",
1690*62c56f98SSadaf Ebrahimi                           traffic_keys->client_write_key, key_len);
1691*62c56f98SSadaf Ebrahimi     MBEDTLS_SSL_DEBUG_BUF(4, "server application write key",
1692*62c56f98SSadaf Ebrahimi                           traffic_keys->server_write_key, key_len);
1693*62c56f98SSadaf Ebrahimi     MBEDTLS_SSL_DEBUG_BUF(4, "client application write IV",
1694*62c56f98SSadaf Ebrahimi                           traffic_keys->client_write_iv, iv_len);
1695*62c56f98SSadaf Ebrahimi     MBEDTLS_SSL_DEBUG_BUF(4, "server application write IV",
1696*62c56f98SSadaf Ebrahimi                           traffic_keys->server_write_iv, iv_len);
1697*62c56f98SSadaf Ebrahimi 
1698*62c56f98SSadaf Ebrahimi     MBEDTLS_SSL_DEBUG_MSG(2, ("<= derive application traffic keys"));
1699*62c56f98SSadaf Ebrahimi 
1700*62c56f98SSadaf Ebrahimi cleanup:
1701*62c56f98SSadaf Ebrahimi     /* randbytes is not used again */
1702*62c56f98SSadaf Ebrahimi     mbedtls_platform_zeroize(ssl->handshake->randbytes,
1703*62c56f98SSadaf Ebrahimi                              sizeof(ssl->handshake->randbytes));
1704*62c56f98SSadaf Ebrahimi 
1705*62c56f98SSadaf Ebrahimi     mbedtls_platform_zeroize(transcript, sizeof(transcript));
1706*62c56f98SSadaf Ebrahimi     return ret;
1707*62c56f98SSadaf Ebrahimi }
1708*62c56f98SSadaf Ebrahimi 
mbedtls_ssl_tls13_compute_handshake_transform(mbedtls_ssl_context * ssl)1709*62c56f98SSadaf Ebrahimi int mbedtls_ssl_tls13_compute_handshake_transform(mbedtls_ssl_context *ssl)
1710*62c56f98SSadaf Ebrahimi {
1711*62c56f98SSadaf Ebrahimi     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1712*62c56f98SSadaf Ebrahimi     mbedtls_ssl_key_set traffic_keys;
1713*62c56f98SSadaf Ebrahimi     mbedtls_ssl_transform *transform_handshake = NULL;
1714*62c56f98SSadaf Ebrahimi     mbedtls_ssl_handshake_params *handshake = ssl->handshake;
1715*62c56f98SSadaf Ebrahimi 
1716*62c56f98SSadaf Ebrahimi     /* Compute handshake secret */
1717*62c56f98SSadaf Ebrahimi     ret = ssl_tls13_key_schedule_stage_handshake(ssl);
1718*62c56f98SSadaf Ebrahimi     if (ret != 0) {
1719*62c56f98SSadaf Ebrahimi         MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_tls13_derive_master_secret", ret);
1720*62c56f98SSadaf Ebrahimi         goto cleanup;
1721*62c56f98SSadaf Ebrahimi     }
1722*62c56f98SSadaf Ebrahimi 
1723*62c56f98SSadaf Ebrahimi     /* Next evolution in key schedule: Establish handshake secret and
1724*62c56f98SSadaf Ebrahimi      * key material. */
1725*62c56f98SSadaf Ebrahimi     ret = ssl_tls13_generate_handshake_keys(ssl, &traffic_keys);
1726*62c56f98SSadaf Ebrahimi     if (ret != 0) {
1727*62c56f98SSadaf Ebrahimi         MBEDTLS_SSL_DEBUG_RET(1, "ssl_tls13_generate_handshake_keys",
1728*62c56f98SSadaf Ebrahimi                               ret);
1729*62c56f98SSadaf Ebrahimi         goto cleanup;
1730*62c56f98SSadaf Ebrahimi     }
1731*62c56f98SSadaf Ebrahimi 
1732*62c56f98SSadaf Ebrahimi     transform_handshake = mbedtls_calloc(1, sizeof(mbedtls_ssl_transform));
1733*62c56f98SSadaf Ebrahimi     if (transform_handshake == NULL) {
1734*62c56f98SSadaf Ebrahimi         ret = MBEDTLS_ERR_SSL_ALLOC_FAILED;
1735*62c56f98SSadaf Ebrahimi         goto cleanup;
1736*62c56f98SSadaf Ebrahimi     }
1737*62c56f98SSadaf Ebrahimi 
1738*62c56f98SSadaf Ebrahimi     ret = mbedtls_ssl_tls13_populate_transform(
1739*62c56f98SSadaf Ebrahimi         transform_handshake,
1740*62c56f98SSadaf Ebrahimi         ssl->conf->endpoint,
1741*62c56f98SSadaf Ebrahimi         handshake->ciphersuite_info->id,
1742*62c56f98SSadaf Ebrahimi         &traffic_keys,
1743*62c56f98SSadaf Ebrahimi         ssl);
1744*62c56f98SSadaf Ebrahimi     if (ret != 0) {
1745*62c56f98SSadaf Ebrahimi         MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_tls13_populate_transform", ret);
1746*62c56f98SSadaf Ebrahimi         goto cleanup;
1747*62c56f98SSadaf Ebrahimi     }
1748*62c56f98SSadaf Ebrahimi     handshake->transform_handshake = transform_handshake;
1749*62c56f98SSadaf Ebrahimi 
1750*62c56f98SSadaf Ebrahimi cleanup:
1751*62c56f98SSadaf Ebrahimi     mbedtls_platform_zeroize(&traffic_keys, sizeof(traffic_keys));
1752*62c56f98SSadaf Ebrahimi     if (ret != 0) {
1753*62c56f98SSadaf Ebrahimi         mbedtls_free(transform_handshake);
1754*62c56f98SSadaf Ebrahimi     }
1755*62c56f98SSadaf Ebrahimi 
1756*62c56f98SSadaf Ebrahimi     return ret;
1757*62c56f98SSadaf Ebrahimi }
1758*62c56f98SSadaf Ebrahimi 
mbedtls_ssl_tls13_compute_resumption_master_secret(mbedtls_ssl_context * ssl)1759*62c56f98SSadaf Ebrahimi int mbedtls_ssl_tls13_compute_resumption_master_secret(mbedtls_ssl_context *ssl)
1760*62c56f98SSadaf Ebrahimi {
1761*62c56f98SSadaf Ebrahimi     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1762*62c56f98SSadaf Ebrahimi     mbedtls_md_type_t md_type;
1763*62c56f98SSadaf Ebrahimi     mbedtls_ssl_handshake_params *handshake = ssl->handshake;
1764*62c56f98SSadaf Ebrahimi     unsigned char transcript[MBEDTLS_TLS1_3_MD_MAX_SIZE];
1765*62c56f98SSadaf Ebrahimi     size_t transcript_len;
1766*62c56f98SSadaf Ebrahimi 
1767*62c56f98SSadaf Ebrahimi     MBEDTLS_SSL_DEBUG_MSG(
1768*62c56f98SSadaf Ebrahimi         2, ("=> mbedtls_ssl_tls13_compute_resumption_master_secret"));
1769*62c56f98SSadaf Ebrahimi 
1770*62c56f98SSadaf Ebrahimi     md_type = handshake->ciphersuite_info->mac;
1771*62c56f98SSadaf Ebrahimi 
1772*62c56f98SSadaf Ebrahimi     ret = mbedtls_ssl_get_handshake_transcript(ssl, md_type,
1773*62c56f98SSadaf Ebrahimi                                                transcript, sizeof(transcript),
1774*62c56f98SSadaf Ebrahimi                                                &transcript_len);
1775*62c56f98SSadaf Ebrahimi     if (ret != 0) {
1776*62c56f98SSadaf Ebrahimi         return ret;
1777*62c56f98SSadaf Ebrahimi     }
1778*62c56f98SSadaf Ebrahimi 
1779*62c56f98SSadaf Ebrahimi     ret = mbedtls_ssl_tls13_derive_resumption_master_secret(
1780*62c56f98SSadaf Ebrahimi         mbedtls_md_psa_alg_from_type(md_type),
1781*62c56f98SSadaf Ebrahimi         handshake->tls13_master_secrets.app,
1782*62c56f98SSadaf Ebrahimi         transcript, transcript_len,
1783*62c56f98SSadaf Ebrahimi         &ssl->session_negotiate->app_secrets);
1784*62c56f98SSadaf Ebrahimi     if (ret != 0) {
1785*62c56f98SSadaf Ebrahimi         return ret;
1786*62c56f98SSadaf Ebrahimi     }
1787*62c56f98SSadaf Ebrahimi 
1788*62c56f98SSadaf Ebrahimi     /* Erase master secrets */
1789*62c56f98SSadaf Ebrahimi     mbedtls_platform_zeroize(&handshake->tls13_master_secrets,
1790*62c56f98SSadaf Ebrahimi                              sizeof(handshake->tls13_master_secrets));
1791*62c56f98SSadaf Ebrahimi 
1792*62c56f98SSadaf Ebrahimi     MBEDTLS_SSL_DEBUG_BUF(
1793*62c56f98SSadaf Ebrahimi         4, "Resumption master secret",
1794*62c56f98SSadaf Ebrahimi         ssl->session_negotiate->app_secrets.resumption_master_secret,
1795*62c56f98SSadaf Ebrahimi         PSA_HASH_LENGTH(mbedtls_md_psa_alg_from_type(md_type)));
1796*62c56f98SSadaf Ebrahimi 
1797*62c56f98SSadaf Ebrahimi     MBEDTLS_SSL_DEBUG_MSG(
1798*62c56f98SSadaf Ebrahimi         2, ("<= mbedtls_ssl_tls13_compute_resumption_master_secret"));
1799*62c56f98SSadaf Ebrahimi     return 0;
1800*62c56f98SSadaf Ebrahimi }
1801*62c56f98SSadaf Ebrahimi 
mbedtls_ssl_tls13_compute_application_transform(mbedtls_ssl_context * ssl)1802*62c56f98SSadaf Ebrahimi int mbedtls_ssl_tls13_compute_application_transform(mbedtls_ssl_context *ssl)
1803*62c56f98SSadaf Ebrahimi {
1804*62c56f98SSadaf Ebrahimi     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1805*62c56f98SSadaf Ebrahimi     mbedtls_ssl_key_set traffic_keys;
1806*62c56f98SSadaf Ebrahimi     mbedtls_ssl_transform *transform_application = NULL;
1807*62c56f98SSadaf Ebrahimi 
1808*62c56f98SSadaf Ebrahimi     ret = ssl_tls13_key_schedule_stage_application(ssl);
1809*62c56f98SSadaf Ebrahimi     if (ret != 0) {
1810*62c56f98SSadaf Ebrahimi         MBEDTLS_SSL_DEBUG_RET(1,
1811*62c56f98SSadaf Ebrahimi                               "ssl_tls13_key_schedule_stage_application", ret);
1812*62c56f98SSadaf Ebrahimi         goto cleanup;
1813*62c56f98SSadaf Ebrahimi     }
1814*62c56f98SSadaf Ebrahimi 
1815*62c56f98SSadaf Ebrahimi     ret = ssl_tls13_generate_application_keys(ssl, &traffic_keys);
1816*62c56f98SSadaf Ebrahimi     if (ret != 0) {
1817*62c56f98SSadaf Ebrahimi         MBEDTLS_SSL_DEBUG_RET(1,
1818*62c56f98SSadaf Ebrahimi                               "ssl_tls13_generate_application_keys", ret);
1819*62c56f98SSadaf Ebrahimi         goto cleanup;
1820*62c56f98SSadaf Ebrahimi     }
1821*62c56f98SSadaf Ebrahimi 
1822*62c56f98SSadaf Ebrahimi     transform_application =
1823*62c56f98SSadaf Ebrahimi         mbedtls_calloc(1, sizeof(mbedtls_ssl_transform));
1824*62c56f98SSadaf Ebrahimi     if (transform_application == NULL) {
1825*62c56f98SSadaf Ebrahimi         ret = MBEDTLS_ERR_SSL_ALLOC_FAILED;
1826*62c56f98SSadaf Ebrahimi         goto cleanup;
1827*62c56f98SSadaf Ebrahimi     }
1828*62c56f98SSadaf Ebrahimi 
1829*62c56f98SSadaf Ebrahimi     ret = mbedtls_ssl_tls13_populate_transform(
1830*62c56f98SSadaf Ebrahimi         transform_application,
1831*62c56f98SSadaf Ebrahimi         ssl->conf->endpoint,
1832*62c56f98SSadaf Ebrahimi         ssl->handshake->ciphersuite_info->id,
1833*62c56f98SSadaf Ebrahimi         &traffic_keys,
1834*62c56f98SSadaf Ebrahimi         ssl);
1835*62c56f98SSadaf Ebrahimi     if (ret != 0) {
1836*62c56f98SSadaf Ebrahimi         MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_tls13_populate_transform", ret);
1837*62c56f98SSadaf Ebrahimi         goto cleanup;
1838*62c56f98SSadaf Ebrahimi     }
1839*62c56f98SSadaf Ebrahimi 
1840*62c56f98SSadaf Ebrahimi     ssl->transform_application = transform_application;
1841*62c56f98SSadaf Ebrahimi 
1842*62c56f98SSadaf Ebrahimi cleanup:
1843*62c56f98SSadaf Ebrahimi 
1844*62c56f98SSadaf Ebrahimi     mbedtls_platform_zeroize(&traffic_keys, sizeof(traffic_keys));
1845*62c56f98SSadaf Ebrahimi     if (ret != 0) {
1846*62c56f98SSadaf Ebrahimi         mbedtls_free(transform_application);
1847*62c56f98SSadaf Ebrahimi     }
1848*62c56f98SSadaf Ebrahimi     return ret;
1849*62c56f98SSadaf Ebrahimi }
1850*62c56f98SSadaf Ebrahimi 
1851*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_PSK_ENABLED)
mbedtls_ssl_tls13_export_handshake_psk(mbedtls_ssl_context * ssl,unsigned char ** psk,size_t * psk_len)1852*62c56f98SSadaf Ebrahimi int mbedtls_ssl_tls13_export_handshake_psk(mbedtls_ssl_context *ssl,
1853*62c56f98SSadaf Ebrahimi                                            unsigned char **psk,
1854*62c56f98SSadaf Ebrahimi                                            size_t *psk_len)
1855*62c56f98SSadaf Ebrahimi {
1856*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO)
1857*62c56f98SSadaf Ebrahimi     psa_key_attributes_t key_attributes = PSA_KEY_ATTRIBUTES_INIT;
1858*62c56f98SSadaf Ebrahimi     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1859*62c56f98SSadaf Ebrahimi 
1860*62c56f98SSadaf Ebrahimi     *psk_len = 0;
1861*62c56f98SSadaf Ebrahimi     *psk = NULL;
1862*62c56f98SSadaf Ebrahimi 
1863*62c56f98SSadaf Ebrahimi     if (mbedtls_svc_key_id_is_null(ssl->handshake->psk_opaque)) {
1864*62c56f98SSadaf Ebrahimi         return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
1865*62c56f98SSadaf Ebrahimi     }
1866*62c56f98SSadaf Ebrahimi 
1867*62c56f98SSadaf Ebrahimi     status = psa_get_key_attributes(ssl->handshake->psk_opaque, &key_attributes);
1868*62c56f98SSadaf Ebrahimi     if (status != PSA_SUCCESS) {
1869*62c56f98SSadaf Ebrahimi         return PSA_TO_MBEDTLS_ERR(status);
1870*62c56f98SSadaf Ebrahimi     }
1871*62c56f98SSadaf Ebrahimi 
1872*62c56f98SSadaf Ebrahimi     *psk_len = PSA_BITS_TO_BYTES(psa_get_key_bits(&key_attributes));
1873*62c56f98SSadaf Ebrahimi     *psk = mbedtls_calloc(1, *psk_len);
1874*62c56f98SSadaf Ebrahimi     if (*psk == NULL) {
1875*62c56f98SSadaf Ebrahimi         return MBEDTLS_ERR_SSL_ALLOC_FAILED;
1876*62c56f98SSadaf Ebrahimi     }
1877*62c56f98SSadaf Ebrahimi 
1878*62c56f98SSadaf Ebrahimi     status = psa_export_key(ssl->handshake->psk_opaque,
1879*62c56f98SSadaf Ebrahimi                             (uint8_t *) *psk, *psk_len, psk_len);
1880*62c56f98SSadaf Ebrahimi     if (status != PSA_SUCCESS) {
1881*62c56f98SSadaf Ebrahimi         mbedtls_free((void *) *psk);
1882*62c56f98SSadaf Ebrahimi         *psk = NULL;
1883*62c56f98SSadaf Ebrahimi         return PSA_TO_MBEDTLS_ERR(status);
1884*62c56f98SSadaf Ebrahimi     }
1885*62c56f98SSadaf Ebrahimi     return 0;
1886*62c56f98SSadaf Ebrahimi #else
1887*62c56f98SSadaf Ebrahimi     *psk = ssl->handshake->psk;
1888*62c56f98SSadaf Ebrahimi     *psk_len = ssl->handshake->psk_len;
1889*62c56f98SSadaf Ebrahimi     if (*psk == NULL) {
1890*62c56f98SSadaf Ebrahimi         return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
1891*62c56f98SSadaf Ebrahimi     }
1892*62c56f98SSadaf Ebrahimi     return 0;
1893*62c56f98SSadaf Ebrahimi #endif /* !MBEDTLS_USE_PSA_CRYPTO */
1894*62c56f98SSadaf Ebrahimi }
1895*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_PSK_ENABLED */
1896*62c56f98SSadaf Ebrahimi 
1897*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
1898