blob: fbd23e4d3cc054262fa762fea1f1b8cb80c01d2b [file] [log] [blame]
Hanno Beckerbe9d6642020-08-21 13:20:06 +01001/*
2 * TLS 1.3 key schedule
3 *
4 * Copyright The Mbed TLS Contributors
5 * SPDX-License-Identifier: Apache-2.0
6 *
7 * Licensed under the Apache License, Version 2.0 ( the "License" ); you may
8 * not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
15 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 */
19
Hanno Becker58c5cea2020-09-08 10:31:33 +010020#include "common.h"
Hanno Beckerbe9d6642020-08-21 13:20:06 +010021
Ronald Cron6f135e12021-12-08 16:57:54 +010022#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
Hanno Beckerbe9d6642020-08-21 13:20:06 +010023
Hanno Beckerbe9d6642020-08-21 13:20:06 +010024#include <stdint.h>
25#include <string.h>
26
Jerry Yue3131ef2021-09-16 13:14:15 +080027#include "mbedtls/hkdf.h"
28#include "mbedtls/debug.h"
29#include "mbedtls/error.h"
30
31#include "ssl_misc.h"
32#include "ssl_tls13_keys.h"
Gabor Mezeia3eecd22022-02-09 16:57:26 +010033#include "ssl_tls13_invasive.h"
34
35#include "psa/crypto.h"
Jerry Yue3131ef2021-09-16 13:14:15 +080036
Hanno Becker1413bd82020-09-09 12:46:09 +010037#define MBEDTLS_SSL_TLS1_3_LABEL( name, string ) \
Hanno Beckere4435ea2020-09-08 10:43:52 +010038 .name = string,
39
Xiaofei Bai746f9482021-11-12 08:53:56 +000040struct mbedtls_ssl_tls13_labels_struct const mbedtls_ssl_tls13_labels =
Hanno Beckerbe9d6642020-08-21 13:20:06 +010041{
42 /* This seems to work in C, despite the string literal being one
43 * character too long due to the 0-termination. */
Hanno Beckere4435ea2020-09-08 10:43:52 +010044 MBEDTLS_SSL_TLS1_3_LABEL_LIST
Hanno Beckerbe9d6642020-08-21 13:20:06 +010045};
46
Hanno Beckera3a5a4e2020-09-08 11:33:48 +010047#undef MBEDTLS_SSL_TLS1_3_LABEL
Hanno Beckere4435ea2020-09-08 10:43:52 +010048
Hanno Beckerbe9d6642020-08-21 13:20:06 +010049/*
50 * This function creates a HkdfLabel structure used in the TLS 1.3 key schedule.
51 *
52 * The HkdfLabel is specified in RFC 8446 as follows:
53 *
54 * struct HkdfLabel {
55 * uint16 length; // Length of expanded key material
56 * opaque label<7..255>; // Always prefixed by "tls13 "
57 * opaque context<0..255>; // Usually a communication transcript hash
58 * };
59 *
60 * Parameters:
61 * - desired_length: Length of expanded key material
62 * Even though the standard allows expansion to up to
63 * 2**16 Bytes, TLS 1.3 never uses expansion to more than
64 * 255 Bytes, so we require `desired_length` to be at most
65 * 255. This allows us to save a few Bytes of code by
66 * hardcoding the writing of the high bytes.
Xiaofei Baifeecbbb2021-11-23 07:24:58 +000067 * - (label, label_len): label + label length, without "tls13 " prefix
68 * The label length MUST be less than or equal to
69 * MBEDTLS_SSL_TLS1_3_KEY_SCHEDULE_MAX_LABEL_LEN
70 * It is the caller's responsibility to ensure this.
71 * All (label, label length) pairs used in TLS 1.3
72 * can be obtained via MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN().
73 * - (ctx, ctx_len): context + context length
74 * The context length MUST be less than or equal to
75 * MBEDTLS_SSL_TLS1_3_KEY_SCHEDULE_MAX_CONTEXT_LEN
76 * It is the caller's responsibility to ensure this.
Hanno Beckerbe9d6642020-08-21 13:20:06 +010077 * - dst: Target buffer for HkdfLabel structure,
78 * This MUST be a writable buffer of size
79 * at least SSL_TLS1_3_KEY_SCHEDULE_MAX_HKDF_LABEL_LEN Bytes.
Xiaofei Baifeecbbb2021-11-23 07:24:58 +000080 * - dst_len: Pointer at which to store the actual length of
81 * the HkdfLabel structure on success.
Hanno Beckerbe9d6642020-08-21 13:20:06 +010082 */
83
Xiaofei Baid25fab62021-12-02 06:36:27 +000084static const char tls13_label_prefix[6] = "tls13 ";
Hanno Becker2dfe1322020-09-10 09:23:12 +010085
Hanno Becker9cb0a142020-09-08 10:48:14 +010086#define SSL_TLS1_3_KEY_SCHEDULE_HKDF_LABEL_LEN( label_len, context_len ) \
Hanno Beckerbe9d6642020-08-21 13:20:06 +010087 ( 2 /* expansion length */ \
88 + 1 /* label length */ \
Hanno Becker9cb0a142020-09-08 10:48:14 +010089 + label_len \
Hanno Beckerbe9d6642020-08-21 13:20:06 +010090 + 1 /* context length */ \
Hanno Becker9cb0a142020-09-08 10:48:14 +010091 + context_len )
92
93#define SSL_TLS1_3_KEY_SCHEDULE_MAX_HKDF_LABEL_LEN \
94 SSL_TLS1_3_KEY_SCHEDULE_HKDF_LABEL_LEN( \
Xiaofei Baid25fab62021-12-02 06:36:27 +000095 sizeof(tls13_label_prefix) + \
Hanno Becker9cb0a142020-09-08 10:48:14 +010096 MBEDTLS_SSL_TLS1_3_KEY_SCHEDULE_MAX_LABEL_LEN, \
97 MBEDTLS_SSL_TLS1_3_KEY_SCHEDULE_MAX_CONTEXT_LEN )
Hanno Beckerbe9d6642020-08-21 13:20:06 +010098
Xiaofei Bai746f9482021-11-12 08:53:56 +000099static void ssl_tls13_hkdf_encode_label(
Hanno Beckerbe9d6642020-08-21 13:20:06 +0100100 size_t desired_length,
Xiaofei Baib7972842021-11-18 07:29:56 +0000101 const unsigned char *label, size_t label_len,
102 const unsigned char *ctx, size_t ctx_len,
103 unsigned char *dst, size_t *dst_len )
Hanno Beckerbe9d6642020-08-21 13:20:06 +0100104{
Hanno Becker2dfe1322020-09-10 09:23:12 +0100105 size_t total_label_len =
Xiaofei Baid25fab62021-12-02 06:36:27 +0000106 sizeof(tls13_label_prefix) + label_len;
Hanno Beckerbe9d6642020-08-21 13:20:06 +0100107 size_t total_hkdf_lbl_len =
Xiaofei Baib7972842021-11-18 07:29:56 +0000108 SSL_TLS1_3_KEY_SCHEDULE_HKDF_LABEL_LEN( total_label_len, ctx_len );
Hanno Beckerbe9d6642020-08-21 13:20:06 +0100109
110 unsigned char *p = dst;
111
Hanno Becker531fe302020-09-16 09:45:27 +0100112 /* Add the size of the expanded key material.
113 * We're hardcoding the high byte to 0 here assuming that we never use
114 * TLS 1.3 HKDF key expansion to more than 255 Bytes. */
115#if MBEDTLS_SSL_TLS1_3_KEY_SCHEDULE_MAX_EXPANSION_LEN > 255
Xiaofei Bai746f9482021-11-12 08:53:56 +0000116#error "The implementation of ssl_tls13_hkdf_encode_label() is not fit for the \
Hanno Becker531fe302020-09-16 09:45:27 +0100117 value of MBEDTLS_SSL_TLS1_3_KEY_SCHEDULE_MAX_EXPANSION_LEN"
118#endif
119
Hanno Beckerbe9d6642020-08-21 13:20:06 +0100120 *p++ = 0;
Joe Subbiani2194dc42021-07-14 12:31:31 +0100121 *p++ = MBEDTLS_BYTE_0( desired_length );
Hanno Beckerbe9d6642020-08-21 13:20:06 +0100122
123 /* Add label incl. prefix */
Joe Subbiani2194dc42021-07-14 12:31:31 +0100124 *p++ = MBEDTLS_BYTE_0( total_label_len );
Xiaofei Baid25fab62021-12-02 06:36:27 +0000125 memcpy( p, tls13_label_prefix, sizeof(tls13_label_prefix) );
126 p += sizeof(tls13_label_prefix);
Xiaofei Baib7972842021-11-18 07:29:56 +0000127 memcpy( p, label, label_len );
128 p += label_len;
Hanno Beckerbe9d6642020-08-21 13:20:06 +0100129
130 /* Add context value */
Xiaofei Baib7972842021-11-18 07:29:56 +0000131 *p++ = MBEDTLS_BYTE_0( ctx_len );
132 if( ctx_len != 0 )
133 memcpy( p, ctx, ctx_len );
Hanno Beckerbe9d6642020-08-21 13:20:06 +0100134
135 /* Return total length to the caller. */
Xiaofei Baib7972842021-11-18 07:29:56 +0000136 *dst_len = total_hkdf_lbl_len;
Hanno Beckerbe9d6642020-08-21 13:20:06 +0100137}
138
Gabor Mezei9607ab42022-02-09 17:00:32 +0100139#if defined( MBEDTLS_TEST_HOOKS )
140
Gabor Mezeia3eecd22022-02-09 16:57:26 +0100141MBEDTLS_STATIC_TESTABLE
142psa_status_t mbedtls_psa_hkdf_expand( psa_algorithm_t alg,
143 const unsigned char *prk, size_t prk_len,
144 const unsigned char *info, size_t info_len,
145 unsigned char *okm, size_t okm_len )
146{
147 size_t hash_len;
148 size_t where = 0;
149 size_t n;
150 size_t t_len = 0;
151 size_t i;
152 mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
153 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
154 psa_mac_operation_t operation = PSA_MAC_OPERATION_INIT;
Gabor Mezei833713c2022-02-15 16:16:08 +0100155 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Gabor Mezei8d5a4cb2022-02-15 16:23:17 +0100156 psa_status_t destroy_status = PSA_ERROR_CORRUPTION_DETECTED;
Gabor Mezeia3eecd22022-02-09 16:57:26 +0100157 unsigned char t[PSA_MAC_MAX_SIZE];
158
159 if( okm == NULL )
160 {
161 return( PSA_ERROR_INVALID_ARGUMENT );
162 }
163
164 hash_len = PSA_HASH_LENGTH( alg );
165
166 if( prk_len < hash_len || hash_len == 0 )
167 {
168 return( PSA_ERROR_INVALID_ARGUMENT );
169 }
170
171 if( info == NULL )
172 {
173 info = (const unsigned char *) "";
174 info_len = 0;
175 }
176
177 n = okm_len / hash_len;
178
179 if( okm_len % hash_len != 0 )
180 {
181 n++;
182 }
183
184 /*
185 * Per RFC 5869 Section 2.3, okm_len must not exceed
186 * 255 times the hash length
187 */
188 if( n > 255 )
189 {
190 return( PSA_ERROR_INVALID_ARGUMENT );
191 }
192
193 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_SIGN_MESSAGE );
194 psa_set_key_algorithm( &attributes, alg );
195 psa_set_key_type( &attributes, PSA_KEY_TYPE_HMAC );
196
Gabor Mezei833713c2022-02-15 16:16:08 +0100197 status = psa_import_key( &attributes, prk, prk_len, &key );
198 if( status != PSA_SUCCESS )
Gabor Mezeia3eecd22022-02-09 16:57:26 +0100199 {
200 goto cleanup;
201 }
202
203 memset( t, 0, hash_len );
204
205 /*
206 * Compute T = T(1) | T(2) | T(3) | ... | T(N)
207 * Where T(N) is defined in RFC 5869 Section 2.3
208 */
209 for( i = 1; i <= n; i++ )
210 {
211 size_t num_to_copy;
212 unsigned char c = i & 0xff;
213 size_t len;
214
Gabor Mezei833713c2022-02-15 16:16:08 +0100215 status = psa_mac_sign_setup( &operation, key, alg );
216 if( status != PSA_SUCCESS )
Gabor Mezeia3eecd22022-02-09 16:57:26 +0100217 {
218 goto cleanup;
219 }
220
Gabor Mezei833713c2022-02-15 16:16:08 +0100221 status = psa_mac_update( &operation, t, t_len );
222 if( status != PSA_SUCCESS )
Gabor Mezeia3eecd22022-02-09 16:57:26 +0100223 {
224 goto cleanup;
225 }
226
Gabor Mezei833713c2022-02-15 16:16:08 +0100227 status = psa_mac_update( &operation, info, info_len );
228 if( status != PSA_SUCCESS )
Gabor Mezeia3eecd22022-02-09 16:57:26 +0100229 {
230 goto cleanup;
231 }
232
233 /* The constant concatenated to the end of each T(n) is a single octet.
234 * */
Gabor Mezei833713c2022-02-15 16:16:08 +0100235 status = psa_mac_update( &operation, &c, 1 );
236 if( status != PSA_SUCCESS )
Gabor Mezeia3eecd22022-02-09 16:57:26 +0100237 {
238 goto cleanup;
239 }
240
Gabor Mezei833713c2022-02-15 16:16:08 +0100241 status = psa_mac_sign_finish( &operation, t, PSA_MAC_MAX_SIZE, &len );
242 if( status != PSA_SUCCESS )
Gabor Mezeia3eecd22022-02-09 16:57:26 +0100243 {
244 goto cleanup;
245 }
246
247 num_to_copy = i != n ? hash_len : okm_len - where;
248 memcpy( okm + where, t, num_to_copy );
249 where += hash_len;
250 t_len = hash_len;
251 }
252
253cleanup:
Gabor Mezei8d5a4cb2022-02-15 16:23:17 +0100254 if( status != PSA_SUCCESS )
255 psa_mac_abort( &operation );
256 destroy_status = psa_destroy_key( key );
Gabor Mezeia3eecd22022-02-09 16:57:26 +0100257
Gabor Mezei8d5a4cb2022-02-15 16:23:17 +0100258 mbedtls_platform_zeroize( t, sizeof( t ) );
259
260 return( ( status == PSA_SUCCESS ) ? destroy_status : status );
Gabor Mezeia3eecd22022-02-09 16:57:26 +0100261}
262
Gabor Mezei9607ab42022-02-09 17:00:32 +0100263#endif /* MBEDTLS_TEST_HOOKS */
264
Xiaofei Bai746f9482021-11-12 08:53:56 +0000265int mbedtls_ssl_tls13_hkdf_expand_label(
Hanno Beckerbe9d6642020-08-21 13:20:06 +0100266 mbedtls_md_type_t hash_alg,
Xiaofei Baib7972842021-11-18 07:29:56 +0000267 const unsigned char *secret, size_t secret_len,
268 const unsigned char *label, size_t label_len,
269 const unsigned char *ctx, size_t ctx_len,
270 unsigned char *buf, size_t buf_len )
Hanno Beckerbe9d6642020-08-21 13:20:06 +0100271{
Xiaofei Baib7972842021-11-18 07:29:56 +0000272 const mbedtls_md_info_t *md_info;
Hanno Beckerbe9d6642020-08-21 13:20:06 +0100273 unsigned char hkdf_label[ SSL_TLS1_3_KEY_SCHEDULE_MAX_HKDF_LABEL_LEN ];
274 size_t hkdf_label_len;
275
Xiaofei Baib7972842021-11-18 07:29:56 +0000276 if( label_len > MBEDTLS_SSL_TLS1_3_KEY_SCHEDULE_MAX_LABEL_LEN )
Hanno Beckerbe9d6642020-08-21 13:20:06 +0100277 {
278 /* Should never happen since this is an internal
279 * function, and we know statically which labels
280 * are allowed. */
281 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
282 }
283
Xiaofei Baib7972842021-11-18 07:29:56 +0000284 if( ctx_len > MBEDTLS_SSL_TLS1_3_KEY_SCHEDULE_MAX_CONTEXT_LEN )
Hanno Beckerbe9d6642020-08-21 13:20:06 +0100285 {
286 /* Should not happen, as above. */
287 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
288 }
289
Xiaofei Baib7972842021-11-18 07:29:56 +0000290 if( buf_len > MBEDTLS_SSL_TLS1_3_KEY_SCHEDULE_MAX_EXPANSION_LEN )
Hanno Beckerbe9d6642020-08-21 13:20:06 +0100291 {
292 /* Should not happen, as above. */
293 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
294 }
295
Xiaofei Baib7972842021-11-18 07:29:56 +0000296 md_info = mbedtls_md_info_from_type( hash_alg );
297 if( md_info == NULL )
Hanno Beckerbe9d6642020-08-21 13:20:06 +0100298 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
299
Xiaofei Baib7972842021-11-18 07:29:56 +0000300 ssl_tls13_hkdf_encode_label( buf_len,
301 label, label_len,
302 ctx, ctx_len,
Xiaofei Bai746f9482021-11-12 08:53:56 +0000303 hkdf_label,
304 &hkdf_label_len );
Hanno Beckerbe9d6642020-08-21 13:20:06 +0100305
Xiaofei Baib7972842021-11-18 07:29:56 +0000306 return( mbedtls_hkdf_expand( md_info,
307 secret, secret_len,
Hanno Beckerbe9d6642020-08-21 13:20:06 +0100308 hkdf_label, hkdf_label_len,
Xiaofei Baib7972842021-11-18 07:29:56 +0000309 buf, buf_len ) );
Hanno Beckerbe9d6642020-08-21 13:20:06 +0100310}
311
Hanno Becker3385a4d2020-08-21 13:03:34 +0100312/*
313 * The traffic keying material is generated from the following inputs:
314 *
315 * - One secret value per sender.
316 * - A purpose value indicating the specific value being generated
317 * - The desired lengths of key and IV.
318 *
319 * The expansion itself is based on HKDF:
320 *
321 * [sender]_write_key = HKDF-Expand-Label( Secret, "key", "", key_length )
322 * [sender]_write_iv = HKDF-Expand-Label( Secret, "iv" , "", iv_length )
323 *
324 * [sender] denotes the sending side and the Secret value is provided
325 * by the function caller. Note that we generate server and client side
326 * keys in a single function call.
327 */
Xiaofei Bai746f9482021-11-12 08:53:56 +0000328int mbedtls_ssl_tls13_make_traffic_keys(
Hanno Becker3385a4d2020-08-21 13:03:34 +0100329 mbedtls_md_type_t hash_alg,
330 const unsigned char *client_secret,
Xiaofei Baib7972842021-11-18 07:29:56 +0000331 const unsigned char *server_secret, size_t secret_len,
332 size_t key_len, size_t iv_len,
Hanno Becker3385a4d2020-08-21 13:03:34 +0100333 mbedtls_ssl_key_set *keys )
334{
335 int ret = 0;
336
Xiaofei Bai746f9482021-11-12 08:53:56 +0000337 ret = mbedtls_ssl_tls13_hkdf_expand_label( hash_alg,
Xiaofei Baib7972842021-11-18 07:29:56 +0000338 client_secret, secret_len,
Hanno Becker3385a4d2020-08-21 13:03:34 +0100339 MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN( key ),
340 NULL, 0,
Hanno Becker493ea7f2020-09-08 11:01:00 +0100341 keys->client_write_key, key_len );
Hanno Becker3385a4d2020-08-21 13:03:34 +0100342 if( ret != 0 )
343 return( ret );
344
Xiaofei Bai746f9482021-11-12 08:53:56 +0000345 ret = mbedtls_ssl_tls13_hkdf_expand_label( hash_alg,
Xiaofei Baib7972842021-11-18 07:29:56 +0000346 server_secret, secret_len,
Hanno Becker3385a4d2020-08-21 13:03:34 +0100347 MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN( key ),
348 NULL, 0,
Hanno Becker493ea7f2020-09-08 11:01:00 +0100349 keys->server_write_key, key_len );
Hanno Becker3385a4d2020-08-21 13:03:34 +0100350 if( ret != 0 )
351 return( ret );
352
Xiaofei Bai746f9482021-11-12 08:53:56 +0000353 ret = mbedtls_ssl_tls13_hkdf_expand_label( hash_alg,
Xiaofei Baib7972842021-11-18 07:29:56 +0000354 client_secret, secret_len,
Hanno Becker3385a4d2020-08-21 13:03:34 +0100355 MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN( iv ),
356 NULL, 0,
Hanno Becker493ea7f2020-09-08 11:01:00 +0100357 keys->client_write_iv, iv_len );
Hanno Becker3385a4d2020-08-21 13:03:34 +0100358 if( ret != 0 )
359 return( ret );
360
Xiaofei Bai746f9482021-11-12 08:53:56 +0000361 ret = mbedtls_ssl_tls13_hkdf_expand_label( hash_alg,
Xiaofei Baib7972842021-11-18 07:29:56 +0000362 server_secret, secret_len,
Hanno Becker3385a4d2020-08-21 13:03:34 +0100363 MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN( iv ),
364 NULL, 0,
Hanno Becker493ea7f2020-09-08 11:01:00 +0100365 keys->server_write_iv, iv_len );
Hanno Becker3385a4d2020-08-21 13:03:34 +0100366 if( ret != 0 )
367 return( ret );
368
Hanno Becker493ea7f2020-09-08 11:01:00 +0100369 keys->key_len = key_len;
370 keys->iv_len = iv_len;
Hanno Becker3385a4d2020-08-21 13:03:34 +0100371
372 return( 0 );
373}
374
Xiaofei Bai746f9482021-11-12 08:53:56 +0000375int mbedtls_ssl_tls13_derive_secret(
Hanno Beckerb35d5222020-08-21 13:27:44 +0100376 mbedtls_md_type_t hash_alg,
Xiaofei Baib7972842021-11-18 07:29:56 +0000377 const unsigned char *secret, size_t secret_len,
378 const unsigned char *label, size_t label_len,
379 const unsigned char *ctx, size_t ctx_len,
Hanno Becker0c42fd92020-09-09 12:58:29 +0100380 int ctx_hashed,
Xiaofei Baib7972842021-11-18 07:29:56 +0000381 unsigned char *dstbuf, size_t dstbuf_len )
Hanno Beckerb35d5222020-08-21 13:27:44 +0100382{
383 int ret;
384 unsigned char hashed_context[ MBEDTLS_MD_MAX_SIZE ];
385
Xiaofei Baib7972842021-11-18 07:29:56 +0000386 const mbedtls_md_info_t *md_info;
387 md_info = mbedtls_md_info_from_type( hash_alg );
388 if( md_info == NULL )
Hanno Beckerb35d5222020-08-21 13:27:44 +0100389 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
390
Hanno Becker0c42fd92020-09-09 12:58:29 +0100391 if( ctx_hashed == MBEDTLS_SSL_TLS1_3_CONTEXT_UNHASHED )
Hanno Beckerb35d5222020-08-21 13:27:44 +0100392 {
Xiaofei Baib7972842021-11-18 07:29:56 +0000393 ret = mbedtls_md( md_info, ctx, ctx_len, hashed_context );
Hanno Beckerb35d5222020-08-21 13:27:44 +0100394 if( ret != 0 )
395 return( ret );
Xiaofei Baib7972842021-11-18 07:29:56 +0000396 ctx_len = mbedtls_md_get_size( md_info );
Hanno Beckerb35d5222020-08-21 13:27:44 +0100397 }
398 else
399 {
Xiaofei Baib7972842021-11-18 07:29:56 +0000400 if( ctx_len > sizeof(hashed_context) )
Hanno Becker97a21562020-09-09 12:57:16 +0100401 {
402 /* This should never happen since this function is internal
Hanno Becker0c42fd92020-09-09 12:58:29 +0100403 * and the code sets `ctx_hashed` correctly.
Hanno Becker97a21562020-09-09 12:57:16 +0100404 * Let's double-check nonetheless to not run at the risk
405 * of getting a stack overflow. */
Hanno Beckerb35d5222020-08-21 13:27:44 +0100406 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Hanno Becker97a21562020-09-09 12:57:16 +0100407 }
Hanno Beckerb35d5222020-08-21 13:27:44 +0100408
Xiaofei Baib7972842021-11-18 07:29:56 +0000409 memcpy( hashed_context, ctx, ctx_len );
Hanno Beckerb35d5222020-08-21 13:27:44 +0100410 }
411
Xiaofei Bai746f9482021-11-12 08:53:56 +0000412 return( mbedtls_ssl_tls13_hkdf_expand_label( hash_alg,
Xiaofei Baib7972842021-11-18 07:29:56 +0000413 secret, secret_len,
414 label, label_len,
415 hashed_context, ctx_len,
416 dstbuf, dstbuf_len ) );
Hanno Beckerb35d5222020-08-21 13:27:44 +0100417}
418
Xiaofei Bai746f9482021-11-12 08:53:56 +0000419int mbedtls_ssl_tls13_evolve_secret(
Hanno Beckere9cccb42020-08-20 13:42:46 +0100420 mbedtls_md_type_t hash_alg,
421 const unsigned char *secret_old,
422 const unsigned char *input, size_t input_len,
423 unsigned char *secret_new )
424{
425 int ret = MBEDTLS_ERR_SSL_INTERNAL_ERROR;
426 size_t hlen, ilen;
Hanno Becker59b50a12020-09-09 10:56:56 +0100427 unsigned char tmp_secret[ MBEDTLS_MD_MAX_SIZE ] = { 0 };
Jerry Yu6eaa41c2021-11-22 18:16:45 +0800428 unsigned char tmp_input [ MBEDTLS_ECP_MAX_BYTES ] = { 0 };
Hanno Beckere9cccb42020-08-20 13:42:46 +0100429
Xiaofei Baib7972842021-11-18 07:29:56 +0000430 const mbedtls_md_info_t *md_info;
431 md_info = mbedtls_md_info_from_type( hash_alg );
432 if( md_info == NULL )
Hanno Beckere9cccb42020-08-20 13:42:46 +0100433 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
434
Xiaofei Baib7972842021-11-18 07:29:56 +0000435 hlen = mbedtls_md_get_size( md_info );
Hanno Beckere9cccb42020-08-20 13:42:46 +0100436
437 /* For non-initial runs, call Derive-Secret( ., "derived", "")
Hanno Becker61baae72020-09-16 09:24:14 +0100438 * on the old secret. */
Hanno Beckere9cccb42020-08-20 13:42:46 +0100439 if( secret_old != NULL )
440 {
Xiaofei Bai746f9482021-11-12 08:53:56 +0000441 ret = mbedtls_ssl_tls13_derive_secret(
Hanno Beckere9cccb42020-08-20 13:42:46 +0100442 hash_alg,
443 secret_old, hlen,
444 MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN( derived ),
445 NULL, 0, /* context */
446 MBEDTLS_SSL_TLS1_3_CONTEXT_UNHASHED,
Hanno Becker59b50a12020-09-09 10:56:56 +0100447 tmp_secret, hlen );
Hanno Beckere9cccb42020-08-20 13:42:46 +0100448 if( ret != 0 )
449 goto cleanup;
450 }
451
452 if( input != NULL )
453 {
Hanno Becker59b50a12020-09-09 10:56:56 +0100454 memcpy( tmp_input, input, input_len );
Hanno Beckere9cccb42020-08-20 13:42:46 +0100455 ilen = input_len;
456 }
457 else
458 {
459 ilen = hlen;
460 }
461
462 /* HKDF-Extract takes a salt and input key material.
463 * The salt is the old secret, and the input key material
464 * is the input secret (PSK / ECDHE). */
Xiaofei Baib7972842021-11-18 07:29:56 +0000465 ret = mbedtls_hkdf_extract( md_info,
Hanno Becker59b50a12020-09-09 10:56:56 +0100466 tmp_secret, hlen,
467 tmp_input, ilen,
Hanno Beckere9cccb42020-08-20 13:42:46 +0100468 secret_new );
469 if( ret != 0 )
470 goto cleanup;
471
472 ret = 0;
473
474 cleanup:
475
Hanno Becker59b50a12020-09-09 10:56:56 +0100476 mbedtls_platform_zeroize( tmp_secret, sizeof(tmp_secret) );
477 mbedtls_platform_zeroize( tmp_input, sizeof(tmp_input) );
Hanno Beckere9cccb42020-08-20 13:42:46 +0100478 return( ret );
479}
480
Xiaofei Bai746f9482021-11-12 08:53:56 +0000481int mbedtls_ssl_tls13_derive_early_secrets(
Hanno Beckeref5235b2021-05-24 06:39:41 +0100482 mbedtls_md_type_t md_type,
483 unsigned char const *early_secret,
484 unsigned char const *transcript, size_t transcript_len,
Xiaofei Bai746f9482021-11-12 08:53:56 +0000485 mbedtls_ssl_tls13_early_secrets *derived )
Hanno Beckeref5235b2021-05-24 06:39:41 +0100486{
487 int ret;
488 mbedtls_md_info_t const * const md_info = mbedtls_md_info_from_type( md_type );
489 size_t const md_size = mbedtls_md_get_size( md_info );
490
491 /* We should never call this function with an unknown hash,
492 * but add an assertion anyway. */
493 if( md_info == 0 )
494 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
495
496 /*
497 * 0
498 * |
499 * v
500 * PSK -> HKDF-Extract = Early Secret
501 * |
Hanno Beckeref5235b2021-05-24 06:39:41 +0100502 * +-----> Derive-Secret(., "c e traffic", ClientHello)
503 * | = client_early_traffic_secret
504 * |
505 * +-----> Derive-Secret(., "e exp master", ClientHello)
506 * | = early_exporter_master_secret
507 * v
508 */
509
510 /* Create client_early_traffic_secret */
Xiaofei Bai746f9482021-11-12 08:53:56 +0000511 ret = mbedtls_ssl_tls13_derive_secret( md_type,
Hanno Beckeref5235b2021-05-24 06:39:41 +0100512 early_secret, md_size,
513 MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN( c_e_traffic ),
514 transcript, transcript_len,
515 MBEDTLS_SSL_TLS1_3_CONTEXT_HASHED,
516 derived->client_early_traffic_secret,
517 md_size );
518 if( ret != 0 )
519 return( ret );
520
521 /* Create early exporter */
Xiaofei Bai746f9482021-11-12 08:53:56 +0000522 ret = mbedtls_ssl_tls13_derive_secret( md_type,
Hanno Beckeref5235b2021-05-24 06:39:41 +0100523 early_secret, md_size,
524 MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN( e_exp_master ),
525 transcript, transcript_len,
526 MBEDTLS_SSL_TLS1_3_CONTEXT_HASHED,
527 derived->early_exporter_master_secret,
528 md_size );
529 if( ret != 0 )
530 return( ret );
531
532 return( 0 );
533}
534
Xiaofei Bai746f9482021-11-12 08:53:56 +0000535int mbedtls_ssl_tls13_derive_handshake_secrets(
Hanno Beckeref5235b2021-05-24 06:39:41 +0100536 mbedtls_md_type_t md_type,
537 unsigned char const *handshake_secret,
538 unsigned char const *transcript, size_t transcript_len,
Xiaofei Bai746f9482021-11-12 08:53:56 +0000539 mbedtls_ssl_tls13_handshake_secrets *derived )
Hanno Beckeref5235b2021-05-24 06:39:41 +0100540{
541 int ret;
542 mbedtls_md_info_t const * const md_info = mbedtls_md_info_from_type( md_type );
543 size_t const md_size = mbedtls_md_get_size( md_info );
544
545 /* We should never call this function with an unknown hash,
546 * but add an assertion anyway. */
547 if( md_info == 0 )
548 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
549
550 /*
551 *
552 * Handshake Secret
553 * |
554 * +-----> Derive-Secret( ., "c hs traffic",
555 * | ClientHello...ServerHello )
556 * | = client_handshake_traffic_secret
557 * |
558 * +-----> Derive-Secret( ., "s hs traffic",
559 * | ClientHello...ServerHello )
560 * | = server_handshake_traffic_secret
561 *
562 */
563
564 /*
565 * Compute client_handshake_traffic_secret with
566 * Derive-Secret( ., "c hs traffic", ClientHello...ServerHello )
567 */
568
Xiaofei Bai746f9482021-11-12 08:53:56 +0000569 ret = mbedtls_ssl_tls13_derive_secret( md_type,
Hanno Beckeref5235b2021-05-24 06:39:41 +0100570 handshake_secret, md_size,
571 MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN( c_hs_traffic ),
572 transcript, transcript_len,
573 MBEDTLS_SSL_TLS1_3_CONTEXT_HASHED,
574 derived->client_handshake_traffic_secret,
575 md_size );
576 if( ret != 0 )
577 return( ret );
578
579 /*
580 * Compute server_handshake_traffic_secret with
581 * Derive-Secret( ., "s hs traffic", ClientHello...ServerHello )
582 */
583
Xiaofei Bai746f9482021-11-12 08:53:56 +0000584 ret = mbedtls_ssl_tls13_derive_secret( md_type,
Hanno Beckeref5235b2021-05-24 06:39:41 +0100585 handshake_secret, md_size,
586 MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN( s_hs_traffic ),
587 transcript, transcript_len,
588 MBEDTLS_SSL_TLS1_3_CONTEXT_HASHED,
589 derived->server_handshake_traffic_secret,
590 md_size );
591 if( ret != 0 )
592 return( ret );
593
594 return( 0 );
595}
596
Xiaofei Bai746f9482021-11-12 08:53:56 +0000597int mbedtls_ssl_tls13_derive_application_secrets(
Hanno Beckeref5235b2021-05-24 06:39:41 +0100598 mbedtls_md_type_t md_type,
599 unsigned char const *application_secret,
600 unsigned char const *transcript, size_t transcript_len,
Xiaofei Bai746f9482021-11-12 08:53:56 +0000601 mbedtls_ssl_tls13_application_secrets *derived )
Hanno Beckeref5235b2021-05-24 06:39:41 +0100602{
603 int ret;
604 mbedtls_md_info_t const * const md_info = mbedtls_md_info_from_type( md_type );
605 size_t const md_size = mbedtls_md_get_size( md_info );
606
607 /* We should never call this function with an unknown hash,
608 * but add an assertion anyway. */
609 if( md_info == 0 )
610 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
611
612 /* Generate {client,server}_application_traffic_secret_0
613 *
614 * Master Secret
615 * |
616 * +-----> Derive-Secret( ., "c ap traffic",
617 * | ClientHello...server Finished )
618 * | = client_application_traffic_secret_0
619 * |
620 * +-----> Derive-Secret( ., "s ap traffic",
621 * | ClientHello...Server Finished )
622 * | = server_application_traffic_secret_0
623 * |
624 * +-----> Derive-Secret( ., "exp master",
625 * | ClientHello...server Finished)
626 * | = exporter_master_secret
627 *
628 */
629
Xiaofei Bai746f9482021-11-12 08:53:56 +0000630 ret = mbedtls_ssl_tls13_derive_secret( md_type,
Hanno Beckeref5235b2021-05-24 06:39:41 +0100631 application_secret, md_size,
632 MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN( c_ap_traffic ),
633 transcript, transcript_len,
634 MBEDTLS_SSL_TLS1_3_CONTEXT_HASHED,
635 derived->client_application_traffic_secret_N,
636 md_size );
637 if( ret != 0 )
638 return( ret );
639
Xiaofei Bai746f9482021-11-12 08:53:56 +0000640 ret = mbedtls_ssl_tls13_derive_secret( md_type,
Hanno Beckeref5235b2021-05-24 06:39:41 +0100641 application_secret, md_size,
642 MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN( s_ap_traffic ),
643 transcript, transcript_len,
644 MBEDTLS_SSL_TLS1_3_CONTEXT_HASHED,
645 derived->server_application_traffic_secret_N,
646 md_size );
647 if( ret != 0 )
648 return( ret );
649
Xiaofei Bai746f9482021-11-12 08:53:56 +0000650 ret = mbedtls_ssl_tls13_derive_secret( md_type,
Hanno Beckeref5235b2021-05-24 06:39:41 +0100651 application_secret, md_size,
652 MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN( exp_master ),
653 transcript, transcript_len,
654 MBEDTLS_SSL_TLS1_3_CONTEXT_HASHED,
655 derived->exporter_master_secret,
656 md_size );
657 if( ret != 0 )
658 return( ret );
659
660 return( 0 );
661}
662
663/* Generate resumption_master_secret for use with the ticket exchange.
664 *
Xiaofei Bai746f9482021-11-12 08:53:56 +0000665 * This is not integrated with mbedtls_ssl_tls13_derive_application_secrets()
Hanno Beckeref5235b2021-05-24 06:39:41 +0100666 * because it uses the transcript hash up to and including ClientFinished. */
Xiaofei Bai746f9482021-11-12 08:53:56 +0000667int mbedtls_ssl_tls13_derive_resumption_master_secret(
Hanno Beckeref5235b2021-05-24 06:39:41 +0100668 mbedtls_md_type_t md_type,
669 unsigned char const *application_secret,
670 unsigned char const *transcript, size_t transcript_len,
Xiaofei Bai746f9482021-11-12 08:53:56 +0000671 mbedtls_ssl_tls13_application_secrets *derived )
Hanno Beckeref5235b2021-05-24 06:39:41 +0100672{
673 int ret;
674 mbedtls_md_info_t const * const md_info = mbedtls_md_info_from_type( md_type );
675 size_t const md_size = mbedtls_md_get_size( md_info );
676
677 /* We should never call this function with an unknown hash,
678 * but add an assertion anyway. */
679 if( md_info == 0 )
680 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
681
Xiaofei Bai746f9482021-11-12 08:53:56 +0000682 ret = mbedtls_ssl_tls13_derive_secret( md_type,
Hanno Beckeref5235b2021-05-24 06:39:41 +0100683 application_secret, md_size,
684 MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN( res_master ),
685 transcript, transcript_len,
686 MBEDTLS_SSL_TLS1_3_CONTEXT_HASHED,
687 derived->resumption_master_secret,
688 md_size );
689
690 if( ret != 0 )
691 return( ret );
692
693 return( 0 );
694}
695
XiaokangQiana4c99f22021-11-11 06:46:35 +0000696int mbedtls_ssl_tls13_key_schedule_stage_application( mbedtls_ssl_context *ssl )
XiaokangQianaa5f5c12021-09-18 06:20:25 +0000697{
XiaokangQian61bdbbc2021-10-28 08:03:38 +0000698 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
XiaokangQian33062842021-11-11 03:37:45 +0000699 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
700 mbedtls_md_type_t const md_type = handshake->ciphersuite_info->mac;
XiaokangQianaa5f5c12021-09-18 06:20:25 +0000701#if defined(MBEDTLS_DEBUG_C)
702 mbedtls_md_info_t const * const md_info = mbedtls_md_info_from_type( md_type );
703 size_t const md_size = mbedtls_md_get_size( md_info );
704#endif /* MBEDTLS_DEBUG_C */
705
706 /*
707 * Compute MasterSecret
708 */
Xiaofei Bai746f9482021-11-12 08:53:56 +0000709 ret = mbedtls_ssl_tls13_evolve_secret( md_type,
Xiaofei Baid25fab62021-12-02 06:36:27 +0000710 handshake->tls13_master_secrets.handshake,
XiaokangQianaa5f5c12021-09-18 06:20:25 +0000711 NULL, 0,
Xiaofei Baid25fab62021-12-02 06:36:27 +0000712 handshake->tls13_master_secrets.app );
XiaokangQianaa5f5c12021-09-18 06:20:25 +0000713 if( ret != 0 )
714 {
Xiaofei Bai746f9482021-11-12 08:53:56 +0000715 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_tls13_evolve_secret", ret );
XiaokangQianaa5f5c12021-09-18 06:20:25 +0000716 return( ret );
717 }
718
719 MBEDTLS_SSL_DEBUG_BUF( 4, "Master secret",
Xiaofei Baid25fab62021-12-02 06:36:27 +0000720 handshake->tls13_master_secrets.app, md_size );
XiaokangQianaa5f5c12021-09-18 06:20:25 +0000721
722 return( 0 );
723}
724
Xiaofei Bai746f9482021-11-12 08:53:56 +0000725static int ssl_tls13_calc_finished_core( mbedtls_md_type_t md_type,
726 unsigned char const *base_key,
727 unsigned char const *transcript,
728 unsigned char *dst )
Hanno Beckerb7d9bad2021-05-24 06:44:14 +0100729{
730 const mbedtls_md_info_t* const md_info = mbedtls_md_info_from_type( md_type );
731 size_t const md_size = mbedtls_md_get_size( md_info );
732 unsigned char finished_key[MBEDTLS_MD_MAX_SIZE];
733 int ret;
734
735 /* We should never call this function with an unknown hash,
736 * but add an assertion anyway. */
737 if( md_info == 0 )
738 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
739
740 /* TLS 1.3 Finished message
741 *
742 * struct {
743 * opaque verify_data[Hash.length];
744 * } Finished;
745 *
746 * verify_data =
747 * HMAC( finished_key,
748 * Hash( Handshake Context +
749 * Certificate* +
750 * CertificateVerify* )
751 * )
752 *
753 * finished_key =
754 * HKDF-Expand-Label( BaseKey, "finished", "", Hash.length )
755 */
756
Xiaofei Bai746f9482021-11-12 08:53:56 +0000757 ret = mbedtls_ssl_tls13_hkdf_expand_label(
Hanno Beckerb7d9bad2021-05-24 06:44:14 +0100758 md_type, base_key, md_size,
759 MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN( finished ),
760 NULL, 0,
761 finished_key, md_size );
762 if( ret != 0 )
763 goto exit;
764
765 ret = mbedtls_md_hmac( md_info, finished_key, md_size, transcript, md_size, dst );
766 if( ret != 0 )
767 goto exit;
768
769exit:
770
771 mbedtls_platform_zeroize( finished_key, sizeof( finished_key ) );
772 return( ret );
773}
774
XiaokangQianc5c39d52021-11-09 11:55:10 +0000775int mbedtls_ssl_tls13_calculate_verify_data( mbedtls_ssl_context* ssl,
XiaokangQianaaa0e192021-11-10 03:07:04 +0000776 unsigned char* dst,
777 size_t dst_len,
778 size_t *actual_len,
779 int from )
XiaokangQianaa5f5c12021-09-18 06:20:25 +0000780{
XiaokangQiana7634982021-10-22 06:32:32 +0000781 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
XiaokangQianaa5f5c12021-09-18 06:20:25 +0000782
XiaokangQianaaa0e192021-11-10 03:07:04 +0000783 unsigned char transcript[MBEDTLS_TLS1_3_MD_MAX_SIZE];
XiaokangQianaa5f5c12021-09-18 06:20:25 +0000784 size_t transcript_len;
785
Jerry Yu4a2fa5d2021-12-10 10:19:34 +0800786 unsigned char *base_key = NULL;
Jerry Yub737f6a2021-12-10 17:55:23 +0800787 size_t base_key_len = 0;
Jerry Yu9c074732021-12-10 17:12:43 +0800788 mbedtls_ssl_tls13_handshake_secrets *tls13_hs_secrets =
789 &ssl->handshake->tls13_hs_secrets;
Jerry Yua5563f62021-12-10 18:14:36 +0800790
791 mbedtls_md_type_t const md_type = ssl->handshake->ciphersuite_info->mac;
792 const mbedtls_md_info_t* const md_info =
793 mbedtls_md_info_from_type( md_type );
794 size_t const md_size = mbedtls_md_get_size( md_info );
795
796 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> mbedtls_ssl_tls13_calculate_verify_data" ) );
797
Jerry Yub737f6a2021-12-10 17:55:23 +0800798 if( from == MBEDTLS_SSL_IS_CLIENT )
799 {
800 base_key = tls13_hs_secrets->client_handshake_traffic_secret;
801 base_key_len = sizeof( tls13_hs_secrets->client_handshake_traffic_secret );
802 }
803 else
804 {
805 base_key = tls13_hs_secrets->server_handshake_traffic_secret;
806 base_key_len = sizeof( tls13_hs_secrets->server_handshake_traffic_secret );
807 }
XiaokangQianaa5f5c12021-09-18 06:20:25 +0000808
XiaokangQianaa5f5c12021-09-18 06:20:25 +0000809 if( dst_len < md_size )
Jerry Yu9c074732021-12-10 17:12:43 +0800810 {
811 ret = MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL;
812 goto exit;
813 }
XiaokangQianaa5f5c12021-09-18 06:20:25 +0000814
815 ret = mbedtls_ssl_get_handshake_transcript( ssl, md_type,
816 transcript, sizeof( transcript ),
817 &transcript_len );
818 if( ret != 0 )
819 {
820 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_get_handshake_transcript", ret );
XiaokangQian61bdbbc2021-10-28 08:03:38 +0000821 goto exit;
XiaokangQianaa5f5c12021-09-18 06:20:25 +0000822 }
823 MBEDTLS_SSL_DEBUG_BUF( 4, "handshake hash", transcript, transcript_len );
824
Xiaofei Bai746f9482021-11-12 08:53:56 +0000825 ret = ssl_tls13_calc_finished_core( md_type, base_key, transcript, dst );
XiaokangQianaa5f5c12021-09-18 06:20:25 +0000826 if( ret != 0 )
XiaokangQian61bdbbc2021-10-28 08:03:38 +0000827 goto exit;
XiaokangQianaa5f5c12021-09-18 06:20:25 +0000828 *actual_len = md_size;
829
830 MBEDTLS_SSL_DEBUG_BUF( 3, "verify_data for finished message", dst, md_size );
XiaokangQianc5c39d52021-11-09 11:55:10 +0000831 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= mbedtls_ssl_tls13_calculate_verify_data" ) );
XiaokangQian61bdbbc2021-10-28 08:03:38 +0000832
833exit:
Jerry Yu4a2fa5d2021-12-10 10:19:34 +0800834 /* Erase handshake secrets */
Jerry Yub737f6a2021-12-10 17:55:23 +0800835 mbedtls_platform_zeroize( base_key, base_key_len );
XiaokangQian33062842021-11-11 03:37:45 +0000836 mbedtls_platform_zeroize( transcript, sizeof( transcript ) );
XiaokangQian61bdbbc2021-10-28 08:03:38 +0000837 return( ret );
XiaokangQianaa5f5c12021-09-18 06:20:25 +0000838}
839
Xiaofei Bai746f9482021-11-12 08:53:56 +0000840int mbedtls_ssl_tls13_create_psk_binder( mbedtls_ssl_context *ssl,
Hanno Beckerb7d9bad2021-05-24 06:44:14 +0100841 const mbedtls_md_type_t md_type,
842 unsigned char const *psk, size_t psk_len,
843 int psk_type,
844 unsigned char const *transcript,
845 unsigned char *result )
846{
847 int ret = 0;
848 unsigned char binder_key[MBEDTLS_MD_MAX_SIZE];
849 unsigned char early_secret[MBEDTLS_MD_MAX_SIZE];
850 mbedtls_md_info_t const *md_info = mbedtls_md_info_from_type( md_type );
851 size_t const md_size = mbedtls_md_get_size( md_info );
852
Hanno Becker28e5f1e2021-05-26 09:29:49 +0100853#if !defined(MBEDTLS_DEBUG_C)
854 ssl = NULL; /* make sure we don't use it except for debug */
855 ((void) ssl);
856#endif
857
Hanno Beckerb7d9bad2021-05-24 06:44:14 +0100858 /* We should never call this function with an unknown hash,
859 * but add an assertion anyway. */
860 if( md_info == 0 )
861 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
862
863 /*
864 * 0
865 * |
866 * v
867 * PSK -> HKDF-Extract = Early Secret
868 * |
869 * +-----> Derive-Secret(., "ext binder" | "res binder", "")
870 * | = binder_key
871 * v
872 */
873
Xiaofei Bai746f9482021-11-12 08:53:56 +0000874 ret = mbedtls_ssl_tls13_evolve_secret( md_type,
875 NULL, /* Old secret */
876 psk, psk_len, /* Input */
877 early_secret );
Hanno Beckerb7d9bad2021-05-24 06:44:14 +0100878 if( ret != 0 )
879 {
Xiaofei Bai746f9482021-11-12 08:53:56 +0000880 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_tls13_evolve_secret", ret );
Hanno Beckerb7d9bad2021-05-24 06:44:14 +0100881 goto exit;
882 }
883
884 if( psk_type == MBEDTLS_SSL_TLS1_3_PSK_RESUMPTION )
885 {
Xiaofei Bai746f9482021-11-12 08:53:56 +0000886 ret = mbedtls_ssl_tls13_derive_secret( md_type,
Hanno Beckerb7d9bad2021-05-24 06:44:14 +0100887 early_secret, md_size,
888 MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN( res_binder ),
889 NULL, 0, MBEDTLS_SSL_TLS1_3_CONTEXT_UNHASHED,
890 binder_key, md_size );
891 MBEDTLS_SSL_DEBUG_MSG( 4, ( "Derive Early Secret with 'res binder'" ) );
892 }
893 else
894 {
Xiaofei Bai746f9482021-11-12 08:53:56 +0000895 ret = mbedtls_ssl_tls13_derive_secret( md_type,
Hanno Beckerb7d9bad2021-05-24 06:44:14 +0100896 early_secret, md_size,
897 MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN( ext_binder ),
898 NULL, 0, MBEDTLS_SSL_TLS1_3_CONTEXT_UNHASHED,
899 binder_key, md_size );
900 MBEDTLS_SSL_DEBUG_MSG( 4, ( "Derive Early Secret with 'ext binder'" ) );
901 }
902
903 if( ret != 0 )
904 {
Xiaofei Bai746f9482021-11-12 08:53:56 +0000905 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_tls13_derive_secret", ret );
Hanno Beckerb7d9bad2021-05-24 06:44:14 +0100906 goto exit;
907 }
908
909 /*
910 * The binding_value is computed in the same way as the Finished message
911 * but with the BaseKey being the binder_key.
912 */
913
Xiaofei Bai746f9482021-11-12 08:53:56 +0000914 ret = ssl_tls13_calc_finished_core( md_type, binder_key, transcript, result );
Hanno Beckerb7d9bad2021-05-24 06:44:14 +0100915 if( ret != 0 )
916 goto exit;
917
918 MBEDTLS_SSL_DEBUG_BUF( 3, "psk binder", result, md_size );
919
920exit:
921
922 mbedtls_platform_zeroize( early_secret, sizeof( early_secret ) );
923 mbedtls_platform_zeroize( binder_key, sizeof( binder_key ) );
924 return( ret );
925}
926
Hanno Beckerc94060c2021-03-22 07:50:44 +0000927int mbedtls_ssl_tls13_populate_transform( mbedtls_ssl_transform *transform,
928 int endpoint,
929 int ciphersuite,
930 mbedtls_ssl_key_set const *traffic_keys,
931 mbedtls_ssl_context *ssl /* DEBUG ONLY */ )
932{
Przemyslaw Stekiel6be9cf52022-01-19 16:00:22 +0100933#if !defined(MBEDTLS_USE_PSA_CRYPTO)
Hanno Beckerc94060c2021-03-22 07:50:44 +0000934 int ret;
Przemyslaw Stekiel6be9cf52022-01-19 16:00:22 +0100935#endif /* MBEDTLS_USE_PSA_CRYPTO */
Hanno Beckerc94060c2021-03-22 07:50:44 +0000936 mbedtls_cipher_info_t const *cipher_info;
937 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
938 unsigned char const *key_enc;
939 unsigned char const *iv_enc;
940 unsigned char const *key_dec;
941 unsigned char const *iv_dec;
942
Przemyslaw Stekielae77b0a2022-01-12 10:29:03 +0100943#if defined(MBEDTLS_USE_PSA_CRYPTO)
944 psa_key_type_t key_type;
945 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
946 psa_algorithm_t alg;
947 size_t key_bits;
948 psa_status_t status = PSA_SUCCESS;
949#endif
950
Hanno Beckerc94060c2021-03-22 07:50:44 +0000951#if !defined(MBEDTLS_DEBUG_C)
952 ssl = NULL; /* make sure we don't use it except for those cases */
953 (void) ssl;
954#endif
955
956 ciphersuite_info = mbedtls_ssl_ciphersuite_from_id( ciphersuite );
Hanno Becker7887a772021-04-20 05:27:57 +0100957 if( ciphersuite_info == NULL )
958 {
959 MBEDTLS_SSL_DEBUG_MSG( 1, ( "ciphersuite info for %d not found",
960 ciphersuite ) );
961 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
962 }
Hanno Beckerc94060c2021-03-22 07:50:44 +0000963
964 cipher_info = mbedtls_cipher_info_from_type( ciphersuite_info->cipher );
965 if( cipher_info == NULL )
966 {
Hanno Becker7887a772021-04-20 05:27:57 +0100967 MBEDTLS_SSL_DEBUG_MSG( 1, ( "cipher info for %u not found",
968 ciphersuite_info->cipher ) );
Hanno Beckerf62a7302021-04-21 05:21:28 +0100969 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Hanno Beckerc94060c2021-03-22 07:50:44 +0000970 }
971
Przemyslaw Stekiel6be9cf52022-01-19 16:00:22 +0100972#if !defined(MBEDTLS_USE_PSA_CRYPTO)
Hanno Beckerc94060c2021-03-22 07:50:44 +0000973 /*
974 * Setup cipher contexts in target transform
975 */
Hanno Beckerc94060c2021-03-22 07:50:44 +0000976 if( ( ret = mbedtls_cipher_setup( &transform->cipher_ctx_enc,
977 cipher_info ) ) != 0 )
978 {
979 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_setup", ret );
980 return( ret );
981 }
982
983 if( ( ret = mbedtls_cipher_setup( &transform->cipher_ctx_dec,
984 cipher_info ) ) != 0 )
985 {
986 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_setup", ret );
987 return( ret );
988 }
Przemyslaw Stekiel6be9cf52022-01-19 16:00:22 +0100989#endif /* MBEDTLS_USE_PSA_CRYPTO */
Hanno Beckerc94060c2021-03-22 07:50:44 +0000990
991#if defined(MBEDTLS_SSL_SRV_C)
992 if( endpoint == MBEDTLS_SSL_IS_SERVER )
993 {
994 key_enc = traffic_keys->server_write_key;
995 key_dec = traffic_keys->client_write_key;
996 iv_enc = traffic_keys->server_write_iv;
997 iv_dec = traffic_keys->client_write_iv;
998 }
999 else
1000#endif /* MBEDTLS_SSL_SRV_C */
1001#if defined(MBEDTLS_SSL_CLI_C)
1002 if( endpoint == MBEDTLS_SSL_IS_CLIENT )
1003 {
1004 key_enc = traffic_keys->client_write_key;
1005 key_dec = traffic_keys->server_write_key;
1006 iv_enc = traffic_keys->client_write_iv;
1007 iv_dec = traffic_keys->server_write_iv;
1008 }
1009 else
1010#endif /* MBEDTLS_SSL_CLI_C */
1011 {
1012 /* should not happen */
1013 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
1014 }
1015
1016 memcpy( transform->iv_enc, iv_enc, traffic_keys->iv_len );
1017 memcpy( transform->iv_dec, iv_dec, traffic_keys->iv_len );
1018
Przemyslaw Stekiel6be9cf52022-01-19 16:00:22 +01001019#if !defined(MBEDTLS_USE_PSA_CRYPTO)
Hanno Beckerc94060c2021-03-22 07:50:44 +00001020 if( ( ret = mbedtls_cipher_setkey( &transform->cipher_ctx_enc,
1021 key_enc, cipher_info->key_bitlen,
1022 MBEDTLS_ENCRYPT ) ) != 0 )
1023 {
1024 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_setkey", ret );
1025 return( ret );
1026 }
1027
1028 if( ( ret = mbedtls_cipher_setkey( &transform->cipher_ctx_dec,
1029 key_dec, cipher_info->key_bitlen,
1030 MBEDTLS_DECRYPT ) ) != 0 )
1031 {
1032 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_setkey", ret );
1033 return( ret );
1034 }
Przemyslaw Stekiel6be9cf52022-01-19 16:00:22 +01001035#endif /* MBEDTLS_USE_PSA_CRYPTO */
Hanno Beckerc94060c2021-03-22 07:50:44 +00001036
Przemyslaw Stekieldd7b5012022-01-17 15:28:57 +01001037 /*
1038 * Setup other fields in SSL transform
1039 */
1040
1041 if( ( ciphersuite_info->flags & MBEDTLS_CIPHERSUITE_SHORT_TAG ) != 0 )
1042 transform->taglen = 8;
1043 else
1044 transform->taglen = 16;
1045
1046 transform->ivlen = traffic_keys->iv_len;
1047 transform->maclen = 0;
1048 transform->fixed_ivlen = transform->ivlen;
1049 transform->minor_ver = MBEDTLS_SSL_MINOR_VERSION_4;
1050
1051 /* We add the true record content type (1 Byte) to the plaintext and
1052 * then pad to the configured granularity. The mimimum length of the
1053 * type-extended and padded plaintext is therefore the padding
1054 * granularity. */
1055 transform->minlen =
1056 transform->taglen + MBEDTLS_SSL_CID_TLS1_3_PADDING_GRANULARITY;
1057
Przemyslaw Stekielae77b0a2022-01-12 10:29:03 +01001058#if defined(MBEDTLS_USE_PSA_CRYPTO)
Przemyslaw Stekiel6be9cf52022-01-19 16:00:22 +01001059 /*
1060 * Setup psa keys and alg
1061 */
Przemyslaw Stekielf57b4562022-01-25 00:04:18 +01001062 if( ( status = mbedtls_ssl_cipher_to_psa( cipher_info->type,
Przemyslaw Stekielae77b0a2022-01-12 10:29:03 +01001063 transform->taglen,
1064 &alg,
1065 &key_type,
1066 &key_bits ) ) != PSA_SUCCESS )
1067 {
Przemyslaw Stekiel77aec8d2022-01-31 20:22:53 +01001068 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_cipher_to_psa", psa_ssl_status_to_mbedtls( status ) );
1069 return( psa_ssl_status_to_mbedtls( status ) );
Przemyslaw Stekielae77b0a2022-01-12 10:29:03 +01001070 }
1071
Przemyslaw Stekielae77b0a2022-01-12 10:29:03 +01001072 transform->psa_alg = alg;
1073
Przemyslaw Stekielf9cd6082022-02-01 11:25:55 +01001074 if ( alg != MBEDTLS_SSL_NULL_CIPHER )
Przemyslaw Stekielae77b0a2022-01-12 10:29:03 +01001075 {
Przemyslaw Stekielf9cd6082022-02-01 11:25:55 +01001076 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_ENCRYPT );
1077 psa_set_key_algorithm( &attributes, alg );
1078 psa_set_key_type( &attributes, key_type );
Przemyslaw Stekielfe7397d2022-01-17 15:47:07 +01001079
Przemyslaw Stekielf9cd6082022-02-01 11:25:55 +01001080 if( ( status = psa_import_key( &attributes,
1081 key_enc,
1082 PSA_BITS_TO_BYTES( key_bits ),
1083 &transform->psa_key_enc ) ) != PSA_SUCCESS )
1084 {
1085 MBEDTLS_SSL_DEBUG_RET( 1, "psa_import_key", psa_ssl_status_to_mbedtls( status ) );
1086 return( psa_ssl_status_to_mbedtls( status ) );
1087 }
Przemyslaw Stekielfe7397d2022-01-17 15:47:07 +01001088
Przemyslaw Stekielf9cd6082022-02-01 11:25:55 +01001089 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DECRYPT );
1090
1091 if( ( status = psa_import_key( &attributes,
1092 key_dec,
1093 PSA_BITS_TO_BYTES( key_bits ),
1094 &transform->psa_key_dec ) ) != PSA_SUCCESS )
1095 {
1096 MBEDTLS_SSL_DEBUG_RET( 1, "psa_import_key", psa_ssl_status_to_mbedtls( status ) );
1097 return( psa_ssl_status_to_mbedtls( status ) );
1098 }
Przemyslaw Stekielae77b0a2022-01-12 10:29:03 +01001099 }
1100#endif /* MBEDTLS_USE_PSA_CRYPTO */
1101
Hanno Beckerc94060c2021-03-22 07:50:44 +00001102 return( 0 );
1103}
1104
Xiaofei Bai746f9482021-11-12 08:53:56 +00001105int mbedtls_ssl_tls13_key_schedule_stage_early( mbedtls_ssl_context *ssl )
Jerry Yu89ea3212021-09-09 14:31:24 +08001106{
Jerry Yue3131ef2021-09-16 13:14:15 +08001107 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1108 mbedtls_md_type_t md_type;
Jerry Yu5ccfcd42021-10-11 16:39:29 +08001109 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
Jerry Yu6ca7c7f2021-09-28 18:51:40 +08001110
Jerry Yu5ccfcd42021-10-11 16:39:29 +08001111 if( handshake->ciphersuite_info == NULL )
Jerry Yu89ea3212021-09-09 14:31:24 +08001112 {
1113 MBEDTLS_SSL_DEBUG_MSG( 1, ( "cipher suite info not found" ) );
1114 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
1115 }
Jerry Yue3131ef2021-09-16 13:14:15 +08001116
Jerry Yu5ccfcd42021-10-11 16:39:29 +08001117 md_type = handshake->ciphersuite_info->mac;
Jerry Yue06f4532021-09-23 18:35:07 +08001118
Xiaofei Bai746f9482021-11-12 08:53:56 +00001119 ret = mbedtls_ssl_tls13_evolve_secret( md_type, NULL, NULL, 0,
Xiaofei Baid25fab62021-12-02 06:36:27 +00001120 handshake->tls13_master_secrets.early );
Jerry Yu89ea3212021-09-09 14:31:24 +08001121 if( ret != 0 )
1122 {
Xiaofei Bai746f9482021-11-12 08:53:56 +00001123 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_tls13_evolve_secret", ret );
Jerry Yu89ea3212021-09-09 14:31:24 +08001124 return( ret );
1125 }
1126
1127 return( 0 );
1128}
1129
Jerry Yuc068b662021-10-11 22:30:19 +08001130/* mbedtls_ssl_tls13_generate_handshake_keys() generates keys necessary for
Jerry Yu61e35e02021-09-16 18:59:08 +08001131 * protecting the handshake messages, as described in Section 7 of TLS 1.3. */
Jerry Yuc068b662021-10-11 22:30:19 +08001132int mbedtls_ssl_tls13_generate_handshake_keys( mbedtls_ssl_context *ssl,
1133 mbedtls_ssl_key_set *traffic_keys )
Jerry Yu61e35e02021-09-16 18:59:08 +08001134{
1135 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1136
1137 mbedtls_md_type_t md_type;
1138 mbedtls_md_info_t const *md_info;
1139 size_t md_size;
1140
Jerry Yu435208a2021-10-13 11:22:16 +08001141 unsigned char transcript[MBEDTLS_TLS1_3_MD_MAX_SIZE];
Jerry Yu61e35e02021-09-16 18:59:08 +08001142 size_t transcript_len;
1143
1144 mbedtls_cipher_info_t const *cipher_info;
Xiaofei Baib7972842021-11-18 07:29:56 +00001145 size_t key_len, iv_len;
Jerry Yu61e35e02021-09-16 18:59:08 +08001146
Jerry Yu435208a2021-10-13 11:22:16 +08001147 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
1148 const mbedtls_ssl_ciphersuite_t *ciphersuite_info = handshake->ciphersuite_info;
Xiaofei Bai746f9482021-11-12 08:53:56 +00001149 mbedtls_ssl_tls13_handshake_secrets *tls13_hs_secrets = &handshake->tls13_hs_secrets;
Jerry Yu435208a2021-10-13 11:22:16 +08001150
Jerry Yuc068b662021-10-11 22:30:19 +08001151 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> mbedtls_ssl_tls13_generate_handshake_keys" ) );
Jerry Yu61e35e02021-09-16 18:59:08 +08001152
Jerry Yu435208a2021-10-13 11:22:16 +08001153 cipher_info = mbedtls_cipher_info_from_type( ciphersuite_info->cipher );
Xiaofei Baib7972842021-11-18 07:29:56 +00001154 key_len = cipher_info->key_bitlen >> 3;
1155 iv_len = cipher_info->iv_size;
Jerry Yu61e35e02021-09-16 18:59:08 +08001156
Jerry Yu435208a2021-10-13 11:22:16 +08001157 md_type = ciphersuite_info->mac;
Jerry Yu61e35e02021-09-16 18:59:08 +08001158 md_info = mbedtls_md_info_from_type( md_type );
1159 md_size = mbedtls_md_get_size( md_info );
1160
1161 ret = mbedtls_ssl_get_handshake_transcript( ssl, md_type,
1162 transcript,
1163 sizeof( transcript ),
1164 &transcript_len );
1165 if( ret != 0 )
1166 {
1167 MBEDTLS_SSL_DEBUG_RET( 1,
1168 "mbedtls_ssl_get_handshake_transcript",
1169 ret );
1170 return( ret );
1171 }
1172
Xiaofei Bai746f9482021-11-12 08:53:56 +00001173 ret = mbedtls_ssl_tls13_derive_handshake_secrets( md_type,
Xiaofei Baid25fab62021-12-02 06:36:27 +00001174 handshake->tls13_master_secrets.handshake,
Jerry Yu435208a2021-10-13 11:22:16 +08001175 transcript, transcript_len, tls13_hs_secrets );
Jerry Yu61e35e02021-09-16 18:59:08 +08001176 if( ret != 0 )
1177 {
Xiaofei Bai746f9482021-11-12 08:53:56 +00001178 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_tls13_derive_handshake_secrets",
Jerry Yu61e35e02021-09-16 18:59:08 +08001179 ret );
1180 return( ret );
1181 }
1182
1183 MBEDTLS_SSL_DEBUG_BUF( 4, "Client handshake traffic secret",
Jerry Yu435208a2021-10-13 11:22:16 +08001184 tls13_hs_secrets->client_handshake_traffic_secret,
Jerry Yu61e35e02021-09-16 18:59:08 +08001185 md_size );
Jerry Yu61e35e02021-09-16 18:59:08 +08001186 MBEDTLS_SSL_DEBUG_BUF( 4, "Server handshake traffic secret",
Jerry Yu435208a2021-10-13 11:22:16 +08001187 tls13_hs_secrets->server_handshake_traffic_secret,
Jerry Yu61e35e02021-09-16 18:59:08 +08001188 md_size );
1189
1190 /*
1191 * Export client handshake traffic secret
1192 */
Jerry Yu61e35e02021-09-16 18:59:08 +08001193 if( ssl->f_export_keys != NULL )
1194 {
1195 ssl->f_export_keys( ssl->p_export_keys,
Xiaofei Bai746f9482021-11-12 08:53:56 +00001196 MBEDTLS_SSL_KEY_EXPORT_TLS1_3_CLIENT_HANDSHAKE_TRAFFIC_SECRET,
Jerry Yu435208a2021-10-13 11:22:16 +08001197 tls13_hs_secrets->client_handshake_traffic_secret,
Jerry Yu61e35e02021-09-16 18:59:08 +08001198 md_size,
Jerry Yu435208a2021-10-13 11:22:16 +08001199 handshake->randbytes,
lhuang04a3890a32022-01-04 09:47:20 -08001200 handshake->randbytes + MBEDTLS_CLIENT_HELLO_RANDOM_LEN,
Jerry Yu61e35e02021-09-16 18:59:08 +08001201 MBEDTLS_SSL_TLS_PRF_NONE /* TODO: FIX! */ );
1202
1203 ssl->f_export_keys( ssl->p_export_keys,
Xiaofei Bai746f9482021-11-12 08:53:56 +00001204 MBEDTLS_SSL_KEY_EXPORT_TLS1_3_SERVER_HANDSHAKE_TRAFFIC_SECRET,
Jerry Yu435208a2021-10-13 11:22:16 +08001205 tls13_hs_secrets->server_handshake_traffic_secret,
Jerry Yu61e35e02021-09-16 18:59:08 +08001206 md_size,
Jerry Yu435208a2021-10-13 11:22:16 +08001207 handshake->randbytes,
lhuang04a3890a32022-01-04 09:47:20 -08001208 handshake->randbytes + MBEDTLS_CLIENT_HELLO_RANDOM_LEN,
Jerry Yu61e35e02021-09-16 18:59:08 +08001209 MBEDTLS_SSL_TLS_PRF_NONE /* TODO: FIX! */ );
1210 }
Jerry Yu61e35e02021-09-16 18:59:08 +08001211
Xiaofei Bai746f9482021-11-12 08:53:56 +00001212 ret = mbedtls_ssl_tls13_make_traffic_keys( md_type,
Jerry Yu435208a2021-10-13 11:22:16 +08001213 tls13_hs_secrets->client_handshake_traffic_secret,
1214 tls13_hs_secrets->server_handshake_traffic_secret,
Xiaofei Baib7972842021-11-18 07:29:56 +00001215 md_size, key_len, iv_len, traffic_keys );
Jerry Yu61e35e02021-09-16 18:59:08 +08001216 if( ret != 0 )
1217 {
Xiaofei Bai746f9482021-11-12 08:53:56 +00001218 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_tls13_make_traffic_keys", ret );
Jerry Yu61e35e02021-09-16 18:59:08 +08001219 goto exit;
1220 }
1221
1222 MBEDTLS_SSL_DEBUG_BUF( 4, "client_handshake write_key",
1223 traffic_keys->client_write_key,
1224 traffic_keys->key_len);
1225
1226 MBEDTLS_SSL_DEBUG_BUF( 4, "server_handshake write_key",
1227 traffic_keys->server_write_key,
1228 traffic_keys->key_len);
1229
1230 MBEDTLS_SSL_DEBUG_BUF( 4, "client_handshake write_iv",
1231 traffic_keys->client_write_iv,
1232 traffic_keys->iv_len);
1233
1234 MBEDTLS_SSL_DEBUG_BUF( 4, "server_handshake write_iv",
1235 traffic_keys->server_write_iv,
1236 traffic_keys->iv_len);
1237
Jerry Yuc068b662021-10-11 22:30:19 +08001238 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= mbedtls_ssl_tls13_generate_handshake_keys" ) );
Jerry Yu61e35e02021-09-16 18:59:08 +08001239
1240exit:
1241
1242 return( ret );
1243}
1244
Jerry Yuf0ac2352021-10-11 17:47:07 +08001245int mbedtls_ssl_tls13_key_schedule_stage_handshake( mbedtls_ssl_context *ssl )
Jerry Yua0650eb2021-09-09 17:14:45 +08001246{
Jerry Yuf0ac2352021-10-11 17:47:07 +08001247 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jerry Yu5ccfcd42021-10-11 16:39:29 +08001248 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
1249 mbedtls_md_type_t const md_type = handshake->ciphersuite_info->mac;
Jerry Yuf0ac2352021-10-11 17:47:07 +08001250 size_t ephemeral_len = 0;
1251 unsigned char ecdhe[MBEDTLS_ECP_MAX_BYTES];
Jerry Yua0650eb2021-09-09 17:14:45 +08001252#if defined(MBEDTLS_DEBUG_C)
1253 mbedtls_md_info_t const * const md_info = mbedtls_md_info_from_type( md_type );
1254 size_t const md_size = mbedtls_md_get_size( md_info );
1255#endif /* MBEDTLS_DEBUG_C */
1256
Jerry Yuf0ac2352021-10-11 17:47:07 +08001257#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDHE_ENABLED)
1258 /*
1259 * Compute ECDHE secret used to compute the handshake secret from which
1260 * client_handshake_traffic_secret and server_handshake_traffic_secret
1261 * are derived in the handshake secret derivation stage.
1262 */
Xiaofei Bai746f9482021-11-12 08:53:56 +00001263 if( mbedtls_ssl_tls13_ephemeral_enabled( ssl ) )
Jerry Yuf0ac2352021-10-11 17:47:07 +08001264 {
1265 if( mbedtls_ssl_tls13_named_group_is_ecdhe( handshake->offered_group_id ) )
1266 {
1267#if defined(MBEDTLS_ECDH_C)
1268 ret = mbedtls_ecdh_calc_secret( &handshake->ecdh_ctx,
1269 &ephemeral_len, ecdhe, sizeof( ecdhe ),
1270 ssl->conf->f_rng,
1271 ssl->conf->p_rng );
1272 if( ret != 0 )
1273 {
1274 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecdh_calc_secret", ret );
1275 return( ret );
1276 }
1277#endif /* MBEDTLS_ECDH_C */
1278 }
1279 else if( mbedtls_ssl_tls13_named_group_is_dhe( handshake->offered_group_id ) )
1280 {
Jerry Yuf0ac2352021-10-11 17:47:07 +08001281 MBEDTLS_SSL_DEBUG_MSG( 1, ( "DHE not supported." ) );
1282 return( MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE );
1283 }
1284 }
1285#else
1286 return( MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE );
1287#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDHE_ENABLED */
Jerry Yua0650eb2021-09-09 17:14:45 +08001288
1289 /*
Jerry Yuf0ac2352021-10-11 17:47:07 +08001290 * Compute the Handshake Secret
Jerry Yua0650eb2021-09-09 17:14:45 +08001291 */
Xiaofei Bai746f9482021-11-12 08:53:56 +00001292 ret = mbedtls_ssl_tls13_evolve_secret( md_type,
Xiaofei Baid25fab62021-12-02 06:36:27 +00001293 handshake->tls13_master_secrets.early,
Xiaofei Baib7972842021-11-18 07:29:56 +00001294 ecdhe, ephemeral_len,
Xiaofei Baid25fab62021-12-02 06:36:27 +00001295 handshake->tls13_master_secrets.handshake );
Jerry Yua0650eb2021-09-09 17:14:45 +08001296 if( ret != 0 )
1297 {
Xiaofei Bai746f9482021-11-12 08:53:56 +00001298 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_tls13_evolve_secret", ret );
Jerry Yua0650eb2021-09-09 17:14:45 +08001299 return( ret );
1300 }
1301
1302 MBEDTLS_SSL_DEBUG_BUF( 4, "Handshake secret",
Xiaofei Baid25fab62021-12-02 06:36:27 +00001303 handshake->tls13_master_secrets.handshake, md_size );
Jerry Yua0650eb2021-09-09 17:14:45 +08001304
1305#if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDHE_ENABLED)
1306 mbedtls_platform_zeroize( ecdhe, sizeof( ecdhe ) );
1307#endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDHE_ENABLED */
1308 return( 0 );
1309}
1310
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001311/* Generate application traffic keys since any records following a 1-RTT Finished message
1312 * MUST be encrypted under the application traffic key.
1313 */
XiaokangQiand0aa3e92021-11-10 06:17:40 +00001314int mbedtls_ssl_tls13_generate_application_keys(
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001315 mbedtls_ssl_context *ssl,
1316 mbedtls_ssl_key_set *traffic_keys )
1317{
XiaokangQiana7634982021-10-22 06:32:32 +00001318 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
XiaokangQian33062842021-11-11 03:37:45 +00001319 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001320
1321 /* Address at which to store the application secrets */
Xiaofei Bai746f9482021-11-12 08:53:56 +00001322 mbedtls_ssl_tls13_application_secrets * const app_secrets =
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001323 &ssl->session_negotiate->app_secrets;
1324
1325 /* Holding the transcript up to and including the ServerFinished */
XiaokangQian33062842021-11-11 03:37:45 +00001326 unsigned char transcript[MBEDTLS_TLS1_3_MD_MAX_SIZE];
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001327 size_t transcript_len;
1328
1329 /* Variables relating to the hash for the chosen ciphersuite. */
1330 mbedtls_md_type_t md_type;
1331 mbedtls_md_info_t const *md_info;
1332 size_t md_size;
1333
1334 /* Variables relating to the cipher for the chosen ciphersuite. */
1335 mbedtls_cipher_info_t const *cipher_info;
Xiaofei Baib7972842021-11-18 07:29:56 +00001336 size_t key_len, iv_len;
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001337
1338 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> derive application traffic keys" ) );
1339
1340 /* Extract basic information about hash and ciphersuite */
1341
1342 cipher_info = mbedtls_cipher_info_from_type(
XiaokangQian33062842021-11-11 03:37:45 +00001343 handshake->ciphersuite_info->cipher );
Xiaofei Baib7972842021-11-18 07:29:56 +00001344 key_len = cipher_info->key_bitlen / 8;
1345 iv_len = cipher_info->iv_size;
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001346
XiaokangQian33062842021-11-11 03:37:45 +00001347 md_type = handshake->ciphersuite_info->mac;
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001348 md_info = mbedtls_md_info_from_type( md_type );
1349 md_size = mbedtls_md_get_size( md_info );
1350
1351 /* Compute current handshake transcript. It's the caller's responsiblity
1352 * to call this at the right time, that is, after the ServerFinished. */
1353
1354 ret = mbedtls_ssl_get_handshake_transcript( ssl, md_type,
1355 transcript, sizeof( transcript ),
1356 &transcript_len );
1357 if( ret != 0 )
XiaokangQian4cab0242021-10-12 08:43:37 +00001358 goto cleanup;
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001359
1360 /* Compute application secrets from master secret and transcript hash. */
1361
Xiaofei Bai746f9482021-11-12 08:53:56 +00001362 ret = mbedtls_ssl_tls13_derive_application_secrets( md_type,
Xiaofei Baid25fab62021-12-02 06:36:27 +00001363 handshake->tls13_master_secrets.app,
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001364 transcript, transcript_len,
1365 app_secrets );
Jerry Yu4a2fa5d2021-12-10 10:19:34 +08001366 /* Erase master secrets */
Jerry Yu23ab7a42021-12-08 14:34:10 +08001367 mbedtls_platform_zeroize( &ssl->handshake->tls13_master_secrets,
Jerry Yu27224f52021-12-09 10:56:50 +08001368 sizeof( ssl->handshake->tls13_master_secrets ) );
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001369 if( ret != 0 )
1370 {
1371 MBEDTLS_SSL_DEBUG_RET( 1,
Xiaofei Bai746f9482021-11-12 08:53:56 +00001372 "mbedtls_ssl_tls13_derive_application_secrets", ret );
XiaokangQian4cab0242021-10-12 08:43:37 +00001373 goto cleanup;
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001374 }
1375
1376 /* Derive first epoch of IV + Key for application traffic. */
1377
Xiaofei Bai746f9482021-11-12 08:53:56 +00001378 ret = mbedtls_ssl_tls13_make_traffic_keys( md_type,
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001379 app_secrets->client_application_traffic_secret_N,
1380 app_secrets->server_application_traffic_secret_N,
Xiaofei Baib7972842021-11-18 07:29:56 +00001381 md_size, key_len, iv_len, traffic_keys );
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001382 if( ret != 0 )
1383 {
Xiaofei Bai746f9482021-11-12 08:53:56 +00001384 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_tls13_make_traffic_keys", ret );
XiaokangQian4cab0242021-10-12 08:43:37 +00001385 goto cleanup;
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001386 }
1387
1388 MBEDTLS_SSL_DEBUG_BUF( 4, "Client application traffic secret",
1389 app_secrets->client_application_traffic_secret_N,
1390 md_size );
1391
1392 MBEDTLS_SSL_DEBUG_BUF( 4, "Server application traffic secret",
1393 app_secrets->server_application_traffic_secret_N,
1394 md_size );
1395
XiaokangQianac0385c2021-11-03 06:40:11 +00001396 /*
1397 * Export client/server application traffic secret 0
1398 */
1399 if( ssl->f_export_keys != NULL )
1400 {
1401 ssl->f_export_keys( ssl->p_export_keys,
Xiaofei Bai746f9482021-11-12 08:53:56 +00001402 MBEDTLS_SSL_KEY_EXPORT_TLS1_3_CLIENT_APPLICATION_TRAFFIC_SECRET,
XiaokangQianac0385c2021-11-03 06:40:11 +00001403 app_secrets->client_application_traffic_secret_N, md_size,
XiaokangQian33062842021-11-11 03:37:45 +00001404 handshake->randbytes,
lhuang04a3890a32022-01-04 09:47:20 -08001405 handshake->randbytes + MBEDTLS_CLIENT_HELLO_RANDOM_LEN,
XiaokangQianb51f8842021-11-04 03:02:47 +00001406 MBEDTLS_SSL_TLS_PRF_NONE /* TODO: this should be replaced by
1407 a new constant for TLS 1.3! */ );
XiaokangQianac0385c2021-11-03 06:40:11 +00001408
1409 ssl->f_export_keys( ssl->p_export_keys,
Xiaofei Bai746f9482021-11-12 08:53:56 +00001410 MBEDTLS_SSL_KEY_EXPORT_TLS1_3_SERVER_APPLICATION_TRAFFIC_SECRET,
XiaokangQianac0385c2021-11-03 06:40:11 +00001411 app_secrets->server_application_traffic_secret_N, md_size,
XiaokangQian33062842021-11-11 03:37:45 +00001412 handshake->randbytes,
lhuang04a3890a32022-01-04 09:47:20 -08001413 handshake->randbytes + MBEDTLS_CLIENT_HELLO_RANDOM_LEN,
XiaokangQianb51f8842021-11-04 03:02:47 +00001414 MBEDTLS_SSL_TLS_PRF_NONE /* TODO: this should be replaced by
1415 a new constant for TLS 1.3! */ );
XiaokangQianac0385c2021-11-03 06:40:11 +00001416 }
1417
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001418 MBEDTLS_SSL_DEBUG_BUF( 4, "client application_write_key:",
Xiaofei Baib7972842021-11-18 07:29:56 +00001419 traffic_keys->client_write_key, key_len );
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001420 MBEDTLS_SSL_DEBUG_BUF( 4, "server application write key",
Xiaofei Baib7972842021-11-18 07:29:56 +00001421 traffic_keys->server_write_key, key_len );
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001422 MBEDTLS_SSL_DEBUG_BUF( 4, "client application write IV",
Xiaofei Baib7972842021-11-18 07:29:56 +00001423 traffic_keys->client_write_iv, iv_len );
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001424 MBEDTLS_SSL_DEBUG_BUF( 4, "server application write IV",
Xiaofei Baib7972842021-11-18 07:29:56 +00001425 traffic_keys->server_write_iv, iv_len );
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001426
1427 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= derive application traffic keys" ) );
XiaokangQian4cab0242021-10-12 08:43:37 +00001428
1429 cleanup:
Jerry Yu2c70a392021-12-08 13:28:49 +08001430 /* randbytes is not used again */
1431 mbedtls_platform_zeroize( ssl->handshake->randbytes,
1432 sizeof( ssl->handshake->randbytes ) );
XiaokangQian33062842021-11-11 03:37:45 +00001433 mbedtls_platform_zeroize( transcript, sizeof( transcript ) );
XiaokangQian4cab0242021-10-12 08:43:37 +00001434 return( ret );
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001435}
1436
Ronald Cron6f135e12021-12-08 16:57:54 +01001437#endif /* MBEDTLS_SSL_PROTO_TLS1_3 */