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