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