1 /*
2  *  TLS 1.3 key schedule
3  *
4  *  Copyright The Mbed TLS Contributors
5  *  SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
6  */
7 #if !defined(MBEDTLS_SSL_TLS1_3_KEYS_H)
8 #define MBEDTLS_SSL_TLS1_3_KEYS_H
9 
10 /* This requires MBEDTLS_SSL_TLS1_3_LABEL( idx, name, string ) to be defined at
11  * the point of use. See e.g. the definition of mbedtls_ssl_tls13_labels_union
12  * below. */
13 #define MBEDTLS_SSL_TLS1_3_LABEL_LIST                                             \
14     MBEDTLS_SSL_TLS1_3_LABEL(finished, "finished") \
15     MBEDTLS_SSL_TLS1_3_LABEL(resumption, "resumption") \
16     MBEDTLS_SSL_TLS1_3_LABEL(traffic_upd, "traffic upd") \
17     MBEDTLS_SSL_TLS1_3_LABEL(exporter, "exporter") \
18     MBEDTLS_SSL_TLS1_3_LABEL(key, "key") \
19     MBEDTLS_SSL_TLS1_3_LABEL(iv, "iv") \
20     MBEDTLS_SSL_TLS1_3_LABEL(c_hs_traffic, "c hs traffic") \
21     MBEDTLS_SSL_TLS1_3_LABEL(c_ap_traffic, "c ap traffic") \
22     MBEDTLS_SSL_TLS1_3_LABEL(c_e_traffic, "c e traffic") \
23     MBEDTLS_SSL_TLS1_3_LABEL(s_hs_traffic, "s hs traffic") \
24     MBEDTLS_SSL_TLS1_3_LABEL(s_ap_traffic, "s ap traffic") \
25     MBEDTLS_SSL_TLS1_3_LABEL(s_e_traffic, "s e traffic") \
26     MBEDTLS_SSL_TLS1_3_LABEL(e_exp_master, "e exp master") \
27     MBEDTLS_SSL_TLS1_3_LABEL(res_master, "res master") \
28     MBEDTLS_SSL_TLS1_3_LABEL(exp_master, "exp master") \
29     MBEDTLS_SSL_TLS1_3_LABEL(ext_binder, "ext binder") \
30     MBEDTLS_SSL_TLS1_3_LABEL(res_binder, "res binder") \
31     MBEDTLS_SSL_TLS1_3_LABEL(derived, "derived") \
32     MBEDTLS_SSL_TLS1_3_LABEL(client_cv, "TLS 1.3, client CertificateVerify") \
33     MBEDTLS_SSL_TLS1_3_LABEL(server_cv, "TLS 1.3, server CertificateVerify")
34 
35 #define MBEDTLS_SSL_TLS1_3_CONTEXT_UNHASHED 0
36 #define MBEDTLS_SSL_TLS1_3_CONTEXT_HASHED   1
37 
38 #define MBEDTLS_SSL_TLS1_3_PSK_EXTERNAL   0
39 #define MBEDTLS_SSL_TLS1_3_PSK_RESUMPTION 1
40 
41 #if defined(MBEDTLS_SSL_PROTO_TLS1_3)
42 
43 #define MBEDTLS_SSL_TLS1_3_LABEL(name, string)       \
44     const unsigned char name    [sizeof(string) - 1];
45 
46 union mbedtls_ssl_tls13_labels_union {
47     MBEDTLS_SSL_TLS1_3_LABEL_LIST
48 };
49 struct mbedtls_ssl_tls13_labels_struct {
50     MBEDTLS_SSL_TLS1_3_LABEL_LIST
51 };
52 #undef MBEDTLS_SSL_TLS1_3_LABEL
53 
54 extern const struct mbedtls_ssl_tls13_labels_struct mbedtls_ssl_tls13_labels;
55 
56 #define MBEDTLS_SSL_TLS1_3_LBL_LEN(LABEL)  \
57     sizeof(mbedtls_ssl_tls13_labels.LABEL)
58 
59 #define MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN(LABEL)  \
60     mbedtls_ssl_tls13_labels.LABEL,              \
61     MBEDTLS_SSL_TLS1_3_LBL_LEN(LABEL)
62 
63 #define MBEDTLS_SSL_TLS1_3_KEY_SCHEDULE_MAX_LABEL_LEN  \
64     sizeof(union mbedtls_ssl_tls13_labels_union)
65 
66 /* The maximum length of HKDF contexts used in the TLS 1.3 standard.
67  * Since contexts are always hashes of message transcripts, this can
68  * be approximated from above by the maximum hash size. */
69 #define MBEDTLS_SSL_TLS1_3_KEY_SCHEDULE_MAX_CONTEXT_LEN  \
70     PSA_HASH_MAX_SIZE
71 
72 /* Maximum desired length for expanded key material generated
73  * by HKDF-Expand-Label.
74  *
75  * Warning: If this ever needs to be increased, the implementation
76  * ssl_tls13_hkdf_encode_label() in ssl_tls13_keys.c needs to be
77  * adjusted since it currently assumes that HKDF key expansion
78  * is never used with more than 255 Bytes of output. */
79 #define MBEDTLS_SSL_TLS1_3_KEY_SCHEDULE_MAX_EXPANSION_LEN 255
80 
81 /**
82  * \brief            The \c HKDF-Expand-Label function from
83  *                   the TLS 1.3 standard RFC 8446.
84  *
85  * <tt>
86  *                   HKDF-Expand-Label( Secret, Label, Context, Length ) =
87  *                       HKDF-Expand( Secret, HkdfLabel, Length )
88  * </tt>
89  *
90  * \param hash_alg   The identifier for the hash algorithm to use.
91  * \param secret     The \c Secret argument to \c HKDF-Expand-Label.
92  *                   This must be a readable buffer of length
93  *                   \p secret_len Bytes.
94  * \param secret_len The length of \p secret in Bytes.
95  * \param label      The \c Label argument to \c HKDF-Expand-Label.
96  *                   This must be a readable buffer of length
97  *                   \p label_len Bytes.
98  * \param label_len  The length of \p label in Bytes.
99  * \param ctx        The \c Context argument to \c HKDF-Expand-Label.
100  *                   This must be a readable buffer of length \p ctx_len Bytes.
101  * \param ctx_len    The length of \p context in Bytes.
102  * \param buf        The destination buffer to hold the expanded secret.
103  *                   This must be a writable buffer of length \p buf_len Bytes.
104  * \param buf_len    The desired size of the expanded secret in Bytes.
105  *
106  * \returns          \c 0 on success.
107  * \return           A negative error code on failure.
108  */
109 
110 MBEDTLS_CHECK_RETURN_CRITICAL
111 int mbedtls_ssl_tls13_hkdf_expand_label(
112     psa_algorithm_t hash_alg,
113     const unsigned char *secret, size_t secret_len,
114     const unsigned char *label, size_t label_len,
115     const unsigned char *ctx, size_t ctx_len,
116     unsigned char *buf, size_t buf_len);
117 
118 /**
119  * \brief           This function is part of the TLS 1.3 key schedule.
120  *                  It extracts key and IV for the actual client/server traffic
121  *                  from the client/server traffic secrets.
122  *
123  * From RFC 8446:
124  *
125  * <tt>
126  *   [sender]_write_key = HKDF-Expand-Label(Secret, "key", "", key_length)
127  *   [sender]_write_iv  = HKDF-Expand-Label(Secret, "iv", "", iv_length)*
128  * </tt>
129  *
130  * \param hash_alg      The identifier for the hash algorithm to be used
131  *                      for the HKDF-based expansion of the secret.
132  * \param client_secret The client traffic secret.
133  *                      This must be a readable buffer of size
134  *                      \p secret_len Bytes
135  * \param server_secret The server traffic secret.
136  *                      This must be a readable buffer of size
137  *                      \p secret_len Bytes
138  * \param secret_len    Length of the secrets \p client_secret and
139  *                      \p server_secret in Bytes.
140  * \param key_len       The desired length of the key to be extracted in Bytes.
141  * \param iv_len        The desired length of the IV to be extracted in Bytes.
142  * \param keys          The address of the structure holding the generated
143  *                      keys and IVs.
144  *
145  * \returns             \c 0 on success.
146  * \returns             A negative error code on failure.
147  */
148 
149 MBEDTLS_CHECK_RETURN_CRITICAL
150 int mbedtls_ssl_tls13_make_traffic_keys(
151     psa_algorithm_t hash_alg,
152     const unsigned char *client_secret,
153     const unsigned char *server_secret, size_t secret_len,
154     size_t key_len, size_t iv_len,
155     mbedtls_ssl_key_set *keys);
156 
157 /**
158  * \brief The \c Derive-Secret function from the TLS 1.3 standard RFC 8446.
159  *
160  * <tt>
161  *   Derive-Secret( Secret, Label, Messages ) =
162  *      HKDF-Expand-Label( Secret, Label,
163  *                         Hash( Messages ),
164  *                         Hash.Length ) )
165  * </tt>
166  *
167  * \param hash_alg   The identifier for the hash function used for the
168  *                   applications of HKDF.
169  * \param secret     The \c Secret argument to the \c Derive-Secret function.
170  *                   This must be a readable buffer of length
171  *                   \p secret_len Bytes.
172  * \param secret_len The length of \p secret in Bytes.
173  * \param label      The \c Label argument to the \c Derive-Secret function.
174  *                   This must be a readable buffer of length
175  *                   \p label_len Bytes.
176  * \param label_len  The length of \p label in Bytes.
177  * \param ctx        The hash of the \c Messages argument to the
178  *                   \c Derive-Secret function, or the \c Messages argument
179  *                   itself, depending on \p ctx_hashed.
180  * \param ctx_len    The length of \p ctx in Bytes.
181  * \param ctx_hashed This indicates whether the \p ctx contains the hash of
182  *                   the \c Messages argument in the application of the
183  *                   \c Derive-Secret function
184  *                   (value MBEDTLS_SSL_TLS1_3_CONTEXT_HASHED), or whether
185  *                   it is the content of \c Messages itself, in which case
186  *                   the function takes care of the hashing
187  *                   (value MBEDTLS_SSL_TLS1_3_CONTEXT_UNHASHED).
188  * \param dstbuf     The target buffer to write the output of
189  *                   \c Derive-Secret to. This must be a writable buffer of
190  *                   size \p dtsbuf_len Bytes.
191  * \param dstbuf_len The length of \p dstbuf in Bytes.
192  *
193  * \returns        \c 0 on success.
194  * \returns        A negative error code on failure.
195  */
196 MBEDTLS_CHECK_RETURN_CRITICAL
197 int mbedtls_ssl_tls13_derive_secret(
198     psa_algorithm_t hash_alg,
199     const unsigned char *secret, size_t secret_len,
200     const unsigned char *label, size_t label_len,
201     const unsigned char *ctx, size_t ctx_len,
202     int ctx_hashed,
203     unsigned char *dstbuf, size_t dstbuf_len);
204 
205 /**
206  * \brief Derive TLS 1.3 early data key material from early secret.
207  *
208  *        This is a small wrapper invoking mbedtls_ssl_tls13_derive_secret()
209  *        with the appropriate labels.
210  *
211  * <tt>
212  *        Early Secret
213  *             |
214  *             +-----> Derive-Secret(., "c e traffic", ClientHello)
215  *             |                      = client_early_traffic_secret
216  *             |
217  *             +-----> Derive-Secret(., "e exp master", ClientHello)
218  *             .                      = early_exporter_master_secret
219  *             .
220  *             .
221  * </tt>
222  *
223  * \note  To obtain the actual key and IV for the early data traffic,
224  *        the client secret derived by this function need to be
225  *        further processed by mbedtls_ssl_tls13_make_traffic_keys().
226  *
227  * \note  The binder key, which is also generated from the early secret,
228  *        is omitted here. Its calculation is part of the separate routine
229  *        mbedtls_ssl_tls13_create_psk_binder().
230  *
231  * \param hash_alg     The hash algorithm associated with the PSK for which
232  *                     early data key material is being derived.
233  * \param early_secret The early secret from which the early data key material
234  *                     should be derived. This must be a readable buffer whose
235  *                     length is the digest size of the hash algorithm
236  *                     represented by \p md_size.
237  * \param transcript   The transcript of the handshake so far, calculated with
238  *                     respect to \p hash_alg. This must be a readable buffer
239  *                     whose length is the digest size of the hash algorithm
240  *                     represented by \p md_size.
241  * \param derived      The address of the structure in which to store
242  *                     the early data key material.
243  *
244  * \returns        \c 0 on success.
245  * \returns        A negative error code on failure.
246  */
247 MBEDTLS_CHECK_RETURN_CRITICAL
248 int mbedtls_ssl_tls13_derive_early_secrets(
249     psa_algorithm_t hash_alg,
250     unsigned char const *early_secret,
251     unsigned char const *transcript, size_t transcript_len,
252     mbedtls_ssl_tls13_early_secrets *derived);
253 
254 /**
255  * \brief Derive TLS 1.3 handshake key material from the handshake secret.
256  *
257  *        This is a small wrapper invoking mbedtls_ssl_tls13_derive_secret()
258  *        with the appropriate labels from the standard.
259  *
260  * <tt>
261  *        Handshake Secret
262  *              |
263  *              +-----> Derive-Secret( ., "c hs traffic",
264  *              |                      ClientHello...ServerHello )
265  *              |                      = client_handshake_traffic_secret
266  *              |
267  *              +-----> Derive-Secret( ., "s hs traffic",
268  *              .                      ClientHello...ServerHello )
269  *              .                      = server_handshake_traffic_secret
270  *              .
271  * </tt>
272  *
273  * \note  To obtain the actual key and IV for the encrypted handshake traffic,
274  *        the client and server secret derived by this function need to be
275  *        further processed by mbedtls_ssl_tls13_make_traffic_keys().
276  *
277  * \param hash_alg          The hash algorithm associated with the ciphersuite
278  *                          that's being used for the connection.
279  * \param handshake_secret  The handshake secret from which the handshake key
280  *                          material should be derived. This must be a readable
281  *                          buffer whose length is the digest size of the hash
282  *                          algorithm represented by \p md_size.
283  * \param transcript        The transcript of the handshake so far, calculated
284  *                          with respect to \p hash_alg. This must be a readable
285  *                          buffer whose length is the digest size of the hash
286  *                          algorithm represented by \p md_size.
287  * \param derived           The address of the structure in which to
288  *                          store the handshake key material.
289  *
290  * \returns        \c 0 on success.
291  * \returns        A negative error code on failure.
292  */
293 MBEDTLS_CHECK_RETURN_CRITICAL
294 int mbedtls_ssl_tls13_derive_handshake_secrets(
295     psa_algorithm_t hash_alg,
296     unsigned char const *handshake_secret,
297     unsigned char const *transcript, size_t transcript_len,
298     mbedtls_ssl_tls13_handshake_secrets *derived);
299 
300 /**
301  * \brief Derive TLS 1.3 application key material from the master secret.
302  *
303  *        This is a small wrapper invoking mbedtls_ssl_tls13_derive_secret()
304  *        with the appropriate labels from the standard.
305  *
306  * <tt>
307  *        Master Secret
308  *              |
309  *              +-----> Derive-Secret( ., "c ap traffic",
310  *              |                      ClientHello...server Finished )
311  *              |                      = client_application_traffic_secret_0
312  *              |
313  *              +-----> Derive-Secret( ., "s ap traffic",
314  *              |                      ClientHello...Server Finished )
315  *              |                      = server_application_traffic_secret_0
316  *              |
317  *              +-----> Derive-Secret( ., "exp master",
318  *              .                      ClientHello...server Finished)
319  *              .                      = exporter_master_secret
320  *              .
321  * </tt>
322  *
323  * \note  To obtain the actual key and IV for the (0-th) application traffic,
324  *        the client and server secret derived by this function need to be
325  *        further processed by mbedtls_ssl_tls13_make_traffic_keys().
326  *
327  * \param hash_alg          The hash algorithm associated with the ciphersuite
328  *                          that's being used for the connection.
329  * \param master_secret     The master secret from which the application key
330  *                          material should be derived. This must be a readable
331  *                          buffer whose length is the digest size of the hash
332  *                          algorithm represented by \p md_size.
333  * \param transcript        The transcript of the handshake up to and including
334  *                          the ServerFinished message, calculated with respect
335  *                          to \p hash_alg. This must be a readable buffer whose
336  *                          length is the digest size of the hash algorithm
337  *                          represented by \p hash_alg.
338  * \param derived           The address of the structure in which to
339  *                          store the application key material.
340  *
341  * \returns        \c 0 on success.
342  * \returns        A negative error code on failure.
343  */
344 MBEDTLS_CHECK_RETURN_CRITICAL
345 int mbedtls_ssl_tls13_derive_application_secrets(
346     psa_algorithm_t hash_alg,
347     unsigned char const *master_secret,
348     unsigned char const *transcript, size_t transcript_len,
349     mbedtls_ssl_tls13_application_secrets *derived);
350 
351 /**
352  * \brief Derive TLS 1.3 resumption master secret from the master secret.
353  *
354  *        This is a small wrapper invoking mbedtls_ssl_tls13_derive_secret()
355  *        with the appropriate labels from the standard.
356  *
357  * \param hash_alg          The hash algorithm used in the application for which
358  *                          key material is being derived.
359  * \param application_secret The application secret from which the resumption master
360  *                          secret should be derived. This must be a readable
361  *                          buffer whose length is the digest size of the hash
362  *                          algorithm represented by \p md_size.
363  * \param transcript        The transcript of the handshake up to and including
364  *                          the ClientFinished message, calculated with respect
365  *                          to \p hash_alg. This must be a readable buffer whose
366  *                          length is the digest size of the hash algorithm
367  *                          represented by \p hash_alg.
368  * \param transcript_len    The length of \p transcript in Bytes.
369  * \param derived           The address of the structure in which to
370  *                          store the resumption master secret.
371  *
372  * \returns        \c 0 on success.
373  * \returns        A negative error code on failure.
374  */
375 MBEDTLS_CHECK_RETURN_CRITICAL
376 int mbedtls_ssl_tls13_derive_resumption_master_secret(
377     psa_algorithm_t hash_alg,
378     unsigned char const *application_secret,
379     unsigned char const *transcript, size_t transcript_len,
380     mbedtls_ssl_tls13_application_secrets *derived);
381 
382 /**
383  * \brief Compute the next secret in the TLS 1.3 key schedule
384  *
385  * The TLS 1.3 key schedule proceeds as follows to compute
386  * the three main secrets during the handshake: The early
387  * secret for early data, the handshake secret for all
388  * other encrypted handshake messages, and the master
389  * secret for all application traffic.
390  *
391  * <tt>
392  *                    0
393  *                    |
394  *                    v
395  *     PSK ->  HKDF-Extract = Early Secret
396  *                    |
397  *                    v
398  *     Derive-Secret( ., "derived", "" )
399  *                    |
400  *                    v
401  *  (EC)DHE -> HKDF-Extract = Handshake Secret
402  *                    |
403  *                    v
404  *     Derive-Secret( ., "derived", "" )
405  *                    |
406  *                    v
407  *     0 -> HKDF-Extract = Master Secret
408  * </tt>
409  *
410  * Each of the three secrets in turn is the basis for further
411  * key derivations, such as the derivation of traffic keys and IVs;
412  * see e.g. mbedtls_ssl_tls13_make_traffic_keys().
413  *
414  * This function implements one step in this evolution of secrets:
415  *
416  * <tt>
417  *                old_secret
418  *                    |
419  *                    v
420  *     Derive-Secret( ., "derived", "" )
421  *                    |
422  *                    v
423  *     input -> HKDF-Extract = new_secret
424  * </tt>
425  *
426  * \param hash_alg    The identifier for the hash function used for the
427  *                    applications of HKDF.
428  * \param secret_old  The address of the buffer holding the old secret
429  *                    on function entry. If not \c NULL, this must be a
430  *                    readable buffer whose size matches the output size
431  *                    of the hash function represented by \p hash_alg.
432  *                    If \c NULL, an all \c 0 array will be used instead.
433  * \param input       The address of the buffer holding the additional
434  *                    input for the key derivation (e.g., the PSK or the
435  *                    ephemeral (EC)DH secret). If not \c NULL, this must be
436  *                    a readable buffer whose size \p input_len Bytes.
437  *                    If \c NULL, an all \c 0 array will be used instead.
438  * \param input_len   The length of \p input in Bytes.
439  * \param secret_new  The address of the buffer holding the new secret
440  *                    on function exit. This must be a writable buffer
441  *                    whose size matches the output size of the hash
442  *                    function represented by \p hash_alg.
443  *                    This may be the same as \p secret_old.
444  *
445  * \returns           \c 0 on success.
446  * \returns           A negative error code on failure.
447  */
448 
449 MBEDTLS_CHECK_RETURN_CRITICAL
450 int mbedtls_ssl_tls13_evolve_secret(
451     psa_algorithm_t hash_alg,
452     const unsigned char *secret_old,
453     const unsigned char *input, size_t input_len,
454     unsigned char *secret_new);
455 
456 /**
457  * \brief             Calculate a TLS 1.3 PSK binder.
458  *
459  * \param ssl         The SSL context. This is used for debugging only and may
460  *                    be \c NULL if MBEDTLS_DEBUG_C is disabled.
461  * \param hash_alg    The hash algorithm associated to the PSK \p psk.
462  * \param psk         The buffer holding the PSK for which to create a binder.
463  * \param psk_len     The size of \p psk in bytes.
464  * \param psk_type    This indicates whether the PSK \p psk is externally
465  *                    provisioned (#MBEDTLS_SSL_TLS1_3_PSK_EXTERNAL) or a
466  *                    resumption PSK (#MBEDTLS_SSL_TLS1_3_PSK_RESUMPTION).
467  * \param transcript  The handshake transcript up to the point where the
468  *                    PSK binder calculation happens. This must be readable,
469  *                    and its size must be equal to the digest size of
470  *                    the hash algorithm represented by \p hash_alg.
471  * \param result      The address at which to store the PSK binder on success.
472  *                    This must be writable, and its size must be equal to the
473  *                    digest size of  the hash algorithm represented by
474  *                    \p hash_alg.
475  *
476  * \returns           \c 0 on success.
477  * \returns           A negative error code on failure.
478  */
479 MBEDTLS_CHECK_RETURN_CRITICAL
480 int mbedtls_ssl_tls13_create_psk_binder(mbedtls_ssl_context *ssl,
481                                         const psa_algorithm_t hash_alg,
482                                         unsigned char const *psk, size_t psk_len,
483                                         int psk_type,
484                                         unsigned char const *transcript,
485                                         unsigned char *result);
486 
487 /**
488  * \bref Setup an SSL transform structure representing the
489  *       record protection mechanism used by TLS 1.3
490  *
491  * \param transform    The SSL transform structure to be created. This must have
492  *                     been initialized through mbedtls_ssl_transform_init() and
493  *                     not used in any other way prior to calling this function.
494  *                     In particular, this function does not clean up the
495  *                     transform structure prior to installing the new keys.
496  * \param endpoint     Indicates whether the transform is for the client
497  *                     (value #MBEDTLS_SSL_IS_CLIENT) or the server
498  *                     (value #MBEDTLS_SSL_IS_SERVER).
499  * \param ciphersuite  The numerical identifier for the ciphersuite to use.
500  *                     This must be one of the identifiers listed in
501  *                     ssl_ciphersuites.h.
502  * \param traffic_keys The key material to use. No reference is stored in
503  *                     the SSL transform being generated, and the caller
504  *                     should destroy the key material afterwards.
505  * \param ssl          (Debug-only) The SSL context to use for debug output
506  *                     in case of failure. This parameter is only needed if
507  *                     #MBEDTLS_DEBUG_C is set, and is ignored otherwise.
508  *
509  * \return             \c 0 on success. In this case, \p transform is ready to
510  *                     be used with mbedtls_ssl_transform_decrypt() and
511  *                     mbedtls_ssl_transform_encrypt().
512  * \return             A negative error code on failure.
513  */
514 MBEDTLS_CHECK_RETURN_CRITICAL
515 int mbedtls_ssl_tls13_populate_transform(mbedtls_ssl_transform *transform,
516                                          int endpoint,
517                                          int ciphersuite,
518                                          mbedtls_ssl_key_set const *traffic_keys,
519                                          mbedtls_ssl_context *ssl);
520 
521 /*
522  * TLS 1.3 key schedule evolutions
523  *
524  *   Early -> Handshake -> Application
525  *
526  * Small wrappers around mbedtls_ssl_tls13_evolve_secret().
527  */
528 
529 /**
530  * \brief Begin TLS 1.3 key schedule by calculating early secret.
531  *
532  *        The TLS 1.3 key schedule can be viewed as a simple state machine
533  *        with states Initial -> Early -> Handshake -> Application, and
534  *        this function represents the Initial -> Early transition.
535  *
536  * \param ssl  The SSL context to operate on.
537  *
538  * \returns    \c 0 on success.
539  * \returns    A negative error code on failure.
540  */
541 MBEDTLS_CHECK_RETURN_CRITICAL
542 int mbedtls_ssl_tls13_key_schedule_stage_early(mbedtls_ssl_context *ssl);
543 
544 /**
545  * \brief Compute TLS 1.3 resumption master secret.
546  *
547  * \param ssl  The SSL context to operate on. This must be in
548  *             key schedule stage \c Application, see
549  *             mbedtls_ssl_tls13_key_schedule_stage_application().
550  *
551  * \returns    \c 0 on success.
552  * \returns    A negative error code on failure.
553  */
554 MBEDTLS_CHECK_RETURN_CRITICAL
555 int mbedtls_ssl_tls13_compute_resumption_master_secret(mbedtls_ssl_context *ssl);
556 
557 /**
558  * \brief Calculate the verify_data value for the client or server TLS 1.3
559  * Finished message.
560  *
561  * \param ssl  The SSL context to operate on. This must be in
562  *             key schedule stage \c Handshake, see
563  *             mbedtls_ssl_tls13_key_schedule_stage_application().
564  * \param dst        The address at which to write the verify_data value.
565  * \param dst_len    The size of \p dst in bytes.
566  * \param actual_len The address at which to store the amount of data
567  *                   actually written to \p dst upon success.
568  * \param which      The message to calculate the `verify_data` for:
569  *                   - #MBEDTLS_SSL_IS_CLIENT for the Client's Finished message
570  *                   - #MBEDTLS_SSL_IS_SERVER for the Server's Finished message
571  *
572  * \note       Both client and server call this function twice, once to
573  *             generate their own Finished message, and once to verify the
574  *             peer's Finished message.
575 
576  * \returns    \c 0 on success.
577  * \returns    A negative error code on failure.
578  */
579 MBEDTLS_CHECK_RETURN_CRITICAL
580 int mbedtls_ssl_tls13_calculate_verify_data(mbedtls_ssl_context *ssl,
581                                             unsigned char *dst,
582                                             size_t dst_len,
583                                             size_t *actual_len,
584                                             int which);
585 
586 #if defined(MBEDTLS_SSL_EARLY_DATA)
587 /**
588  * \brief Compute TLS 1.3 early transform
589  *
590  * \param ssl  The SSL context to operate on.
591  *
592  * \returns    \c 0 on success.
593  * \returns    A negative error code on failure.
594  *
595  * \warning    The function does not compute the early master secret. Call
596  *             mbedtls_ssl_tls13_key_schedule_stage_early() before to
597  *             call this function to generate the early master secret.
598  * \note       For a client/server endpoint, the function computes only the
599  *             encryption/decryption part of the transform as the decryption/
600  *             encryption part is not defined by the specification (no early
601  *             traffic from the server to the client).
602  */
603 MBEDTLS_CHECK_RETURN_CRITICAL
604 int mbedtls_ssl_tls13_compute_early_transform(mbedtls_ssl_context *ssl);
605 #endif /* MBEDTLS_SSL_EARLY_DATA */
606 
607 /**
608  * \brief Compute TLS 1.3 handshake transform
609  *
610  * \param ssl  The SSL context to operate on. The early secret must have been
611  *             computed.
612  *
613  * \returns    \c 0 on success.
614  * \returns    A negative error code on failure.
615  */
616 MBEDTLS_CHECK_RETURN_CRITICAL
617 int mbedtls_ssl_tls13_compute_handshake_transform(mbedtls_ssl_context *ssl);
618 
619 /**
620  * \brief Compute TLS 1.3 application transform
621  *
622  * \param ssl  The SSL context to operate on. The early secret must have been
623  *             computed.
624  *
625  * \returns    \c 0 on success.
626  * \returns    A negative error code on failure.
627  */
628 MBEDTLS_CHECK_RETURN_CRITICAL
629 int mbedtls_ssl_tls13_compute_application_transform(mbedtls_ssl_context *ssl);
630 
631 #if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_PSK_ENABLED)
632 /**
633  * \brief Export TLS 1.3 PSK from handshake context
634  *
635  * \param[in]   ssl  The SSL context to operate on.
636  * \param[out]  psk  PSK output pointer.
637  * \param[out]  psk_len Length of PSK.
638  *
639  * \returns     \c 0 if there is a configured PSK and it was exported
640  *              successfully.
641  * \returns     A negative error code on failure.
642  */
643 MBEDTLS_CHECK_RETURN_CRITICAL
644 int mbedtls_ssl_tls13_export_handshake_psk(mbedtls_ssl_context *ssl,
645                                            unsigned char **psk,
646                                            size_t *psk_len);
647 #endif
648 
649 #endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
650 
651 #endif /* MBEDTLS_SSL_TLS1_3_KEYS_H */
652