xref: /optee_os/lib/libmbedtls/mbedtls/library/ssl_misc.h (revision b0563631928755fe864b97785160fb3088e9efdc)
132b31808SJens Wiklander /**
232b31808SJens Wiklander  * \file ssl_misc.h
332b31808SJens Wiklander  *
432b31808SJens Wiklander  * \brief Internal functions shared by the SSL modules
532b31808SJens Wiklander  */
632b31808SJens Wiklander /*
732b31808SJens Wiklander  *  Copyright The Mbed TLS Contributors
8*b0563631STom Van Eyck  *  SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
932b31808SJens Wiklander  */
1032b31808SJens Wiklander #ifndef MBEDTLS_SSL_MISC_H
1132b31808SJens Wiklander #define MBEDTLS_SSL_MISC_H
1232b31808SJens Wiklander 
1332b31808SJens Wiklander #include "mbedtls/build_info.h"
1432b31808SJens Wiklander 
15*b0563631STom Van Eyck #include "mbedtls/error.h"
16*b0563631STom Van Eyck 
1732b31808SJens Wiklander #include "mbedtls/ssl.h"
1832b31808SJens Wiklander #include "mbedtls/cipher.h"
1932b31808SJens Wiklander 
2032b31808SJens Wiklander #if defined(MBEDTLS_USE_PSA_CRYPTO) || defined(MBEDTLS_SSL_PROTO_TLS1_3)
2132b31808SJens Wiklander #include "psa/crypto.h"
22*b0563631STom Van Eyck #include "psa_util_internal.h"
2332b31808SJens Wiklander #endif
2432b31808SJens Wiklander 
25*b0563631STom Van Eyck #if defined(MBEDTLS_MD_CAN_MD5)
2632b31808SJens Wiklander #include "mbedtls/md5.h"
2732b31808SJens Wiklander #endif
2832b31808SJens Wiklander 
29*b0563631STom Van Eyck #if defined(MBEDTLS_MD_CAN_SHA1)
3032b31808SJens Wiklander #include "mbedtls/sha1.h"
3132b31808SJens Wiklander #endif
3232b31808SJens Wiklander 
33*b0563631STom Van Eyck #if defined(MBEDTLS_MD_CAN_SHA256)
3432b31808SJens Wiklander #include "mbedtls/sha256.h"
3532b31808SJens Wiklander #endif
3632b31808SJens Wiklander 
37*b0563631STom Van Eyck #if defined(MBEDTLS_MD_CAN_SHA512)
3832b31808SJens Wiklander #include "mbedtls/sha512.h"
3932b31808SJens Wiklander #endif
4032b31808SJens Wiklander 
4132b31808SJens Wiklander #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) && \
4232b31808SJens Wiklander     !defined(MBEDTLS_USE_PSA_CRYPTO)
4332b31808SJens Wiklander #include "mbedtls/ecjpake.h"
4432b31808SJens Wiklander #endif
4532b31808SJens Wiklander 
4632b31808SJens Wiklander #include "mbedtls/pk.h"
47*b0563631STom Van Eyck #include "ssl_ciphersuites_internal.h"
48*b0563631STom Van Eyck #include "x509_internal.h"
49*b0563631STom Van Eyck #include "pk_internal.h"
5032b31808SJens Wiklander #include "common.h"
5132b31808SJens Wiklander 
5232b31808SJens Wiklander /* Shorthand for restartable ECC */
5332b31808SJens Wiklander #if defined(MBEDTLS_ECP_RESTARTABLE) && \
5432b31808SJens Wiklander     defined(MBEDTLS_SSL_CLI_C) && \
5532b31808SJens Wiklander     defined(MBEDTLS_SSL_PROTO_TLS1_2) && \
5632b31808SJens Wiklander     defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)
5732b31808SJens Wiklander #define MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED
5832b31808SJens Wiklander #endif
5932b31808SJens Wiklander 
6032b31808SJens Wiklander #define MBEDTLS_SSL_INITIAL_HANDSHAKE           0
6132b31808SJens Wiklander #define MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS   1   /* In progress */
6232b31808SJens Wiklander #define MBEDTLS_SSL_RENEGOTIATION_DONE          2   /* Done or aborted */
6332b31808SJens Wiklander #define MBEDTLS_SSL_RENEGOTIATION_PENDING       3   /* Requested (server only) */
6432b31808SJens Wiklander 
6532b31808SJens Wiklander /* Faked handshake message identity for HelloRetryRequest. */
6632b31808SJens Wiklander #define MBEDTLS_SSL_TLS1_3_HS_HELLO_RETRY_REQUEST (-MBEDTLS_SSL_HS_SERVER_HELLO)
6732b31808SJens Wiklander 
6832b31808SJens Wiklander /*
6932b31808SJens Wiklander  * Internal identity of handshake extensions
7032b31808SJens Wiklander  */
7132b31808SJens Wiklander #define MBEDTLS_SSL_EXT_ID_UNRECOGNIZED                0
7232b31808SJens Wiklander #define MBEDTLS_SSL_EXT_ID_SERVERNAME                  1
7332b31808SJens Wiklander #define MBEDTLS_SSL_EXT_ID_SERVERNAME_HOSTNAME         1
7432b31808SJens Wiklander #define MBEDTLS_SSL_EXT_ID_MAX_FRAGMENT_LENGTH         2
7532b31808SJens Wiklander #define MBEDTLS_SSL_EXT_ID_STATUS_REQUEST              3
7632b31808SJens Wiklander #define MBEDTLS_SSL_EXT_ID_SUPPORTED_GROUPS            4
7732b31808SJens Wiklander #define MBEDTLS_SSL_EXT_ID_SUPPORTED_ELLIPTIC_CURVES   4
7832b31808SJens Wiklander #define MBEDTLS_SSL_EXT_ID_SIG_ALG                     5
7932b31808SJens Wiklander #define MBEDTLS_SSL_EXT_ID_USE_SRTP                    6
8032b31808SJens Wiklander #define MBEDTLS_SSL_EXT_ID_HEARTBEAT                   7
8132b31808SJens Wiklander #define MBEDTLS_SSL_EXT_ID_ALPN                        8
8232b31808SJens Wiklander #define MBEDTLS_SSL_EXT_ID_SCT                         9
8332b31808SJens Wiklander #define MBEDTLS_SSL_EXT_ID_CLI_CERT_TYPE              10
8432b31808SJens Wiklander #define MBEDTLS_SSL_EXT_ID_SERV_CERT_TYPE             11
8532b31808SJens Wiklander #define MBEDTLS_SSL_EXT_ID_PADDING                    12
8632b31808SJens Wiklander #define MBEDTLS_SSL_EXT_ID_PRE_SHARED_KEY             13
8732b31808SJens Wiklander #define MBEDTLS_SSL_EXT_ID_EARLY_DATA                 14
8832b31808SJens Wiklander #define MBEDTLS_SSL_EXT_ID_SUPPORTED_VERSIONS         15
8932b31808SJens Wiklander #define MBEDTLS_SSL_EXT_ID_COOKIE                     16
9032b31808SJens Wiklander #define MBEDTLS_SSL_EXT_ID_PSK_KEY_EXCHANGE_MODES     17
9132b31808SJens Wiklander #define MBEDTLS_SSL_EXT_ID_CERT_AUTH                  18
9232b31808SJens Wiklander #define MBEDTLS_SSL_EXT_ID_OID_FILTERS                19
9332b31808SJens Wiklander #define MBEDTLS_SSL_EXT_ID_POST_HANDSHAKE_AUTH        20
9432b31808SJens Wiklander #define MBEDTLS_SSL_EXT_ID_SIG_ALG_CERT               21
9532b31808SJens Wiklander #define MBEDTLS_SSL_EXT_ID_KEY_SHARE                  22
9632b31808SJens Wiklander #define MBEDTLS_SSL_EXT_ID_TRUNCATED_HMAC             23
9732b31808SJens Wiklander #define MBEDTLS_SSL_EXT_ID_SUPPORTED_POINT_FORMATS    24
9832b31808SJens Wiklander #define MBEDTLS_SSL_EXT_ID_ENCRYPT_THEN_MAC           25
9932b31808SJens Wiklander #define MBEDTLS_SSL_EXT_ID_EXTENDED_MASTER_SECRET     26
10032b31808SJens Wiklander #define MBEDTLS_SSL_EXT_ID_SESSION_TICKET             27
10132b31808SJens Wiklander #define MBEDTLS_SSL_EXT_ID_RECORD_SIZE_LIMIT          28
10232b31808SJens Wiklander 
10332b31808SJens Wiklander /* Utility for translating IANA extension type. */
10432b31808SJens Wiklander uint32_t mbedtls_ssl_get_extension_id(unsigned int extension_type);
10532b31808SJens Wiklander uint32_t mbedtls_ssl_get_extension_mask(unsigned int extension_type);
10632b31808SJens Wiklander /* Macros used to define mask constants */
10732b31808SJens Wiklander #define MBEDTLS_SSL_EXT_MASK(id)       (1ULL << (MBEDTLS_SSL_EXT_ID_##id))
10832b31808SJens Wiklander /* Reset value of extension mask */
10932b31808SJens Wiklander #define MBEDTLS_SSL_EXT_MASK_NONE                                              0
11032b31808SJens Wiklander 
11132b31808SJens Wiklander /* In messages containing extension requests, we should ignore unrecognized
11232b31808SJens Wiklander  * extensions. In messages containing extension responses, unrecognized
11332b31808SJens Wiklander  * extensions should result in handshake abortion. Messages containing
11432b31808SJens Wiklander  * extension requests include ClientHello, CertificateRequest and
11532b31808SJens Wiklander  * NewSessionTicket. Messages containing extension responses include
11632b31808SJens Wiklander  * ServerHello, HelloRetryRequest, EncryptedExtensions and Certificate.
11732b31808SJens Wiklander  *
11832b31808SJens Wiklander  * RFC 8446 section 4.1.3
11932b31808SJens Wiklander  *
12032b31808SJens Wiklander  * The ServerHello MUST only include extensions which are required to establish
12132b31808SJens Wiklander  * the cryptographic context and negotiate the protocol version.
12232b31808SJens Wiklander  *
12332b31808SJens Wiklander  * RFC 8446 section 4.2
12432b31808SJens Wiklander  *
12532b31808SJens Wiklander  * If an implementation receives an extension which it recognizes and which is
12632b31808SJens Wiklander  * not specified for the message in which it appears, it MUST abort the handshake
12732b31808SJens Wiklander  * with an "illegal_parameter" alert.
12832b31808SJens Wiklander  */
12932b31808SJens Wiklander 
13032b31808SJens Wiklander /* Extensions that are not recognized by TLS 1.3 */
13132b31808SJens Wiklander #define MBEDTLS_SSL_TLS1_3_EXT_MASK_UNRECOGNIZED                               \
13232b31808SJens Wiklander     (MBEDTLS_SSL_EXT_MASK(SUPPORTED_POINT_FORMATS)                | \
13332b31808SJens Wiklander      MBEDTLS_SSL_EXT_MASK(ENCRYPT_THEN_MAC)                       | \
13432b31808SJens Wiklander      MBEDTLS_SSL_EXT_MASK(EXTENDED_MASTER_SECRET)                 | \
13532b31808SJens Wiklander      MBEDTLS_SSL_EXT_MASK(SESSION_TICKET)                         | \
13632b31808SJens Wiklander      MBEDTLS_SSL_EXT_MASK(TRUNCATED_HMAC)                         | \
13732b31808SJens Wiklander      MBEDTLS_SSL_EXT_MASK(UNRECOGNIZED))
13832b31808SJens Wiklander 
13932b31808SJens Wiklander /* RFC 8446 section 4.2. Allowed extensions for ClientHello */
14032b31808SJens Wiklander #define MBEDTLS_SSL_TLS1_3_ALLOWED_EXTS_OF_CH                                  \
14132b31808SJens Wiklander     (MBEDTLS_SSL_EXT_MASK(SERVERNAME)                             | \
14232b31808SJens Wiklander      MBEDTLS_SSL_EXT_MASK(MAX_FRAGMENT_LENGTH)                    | \
14332b31808SJens Wiklander      MBEDTLS_SSL_EXT_MASK(STATUS_REQUEST)                         | \
14432b31808SJens Wiklander      MBEDTLS_SSL_EXT_MASK(SUPPORTED_GROUPS)                       | \
14532b31808SJens Wiklander      MBEDTLS_SSL_EXT_MASK(SIG_ALG)                                | \
14632b31808SJens Wiklander      MBEDTLS_SSL_EXT_MASK(USE_SRTP)                               | \
14732b31808SJens Wiklander      MBEDTLS_SSL_EXT_MASK(HEARTBEAT)                              | \
14832b31808SJens Wiklander      MBEDTLS_SSL_EXT_MASK(ALPN)                                   | \
14932b31808SJens Wiklander      MBEDTLS_SSL_EXT_MASK(SCT)                                    | \
15032b31808SJens Wiklander      MBEDTLS_SSL_EXT_MASK(CLI_CERT_TYPE)                          | \
15132b31808SJens Wiklander      MBEDTLS_SSL_EXT_MASK(SERV_CERT_TYPE)                         | \
15232b31808SJens Wiklander      MBEDTLS_SSL_EXT_MASK(PADDING)                                | \
15332b31808SJens Wiklander      MBEDTLS_SSL_EXT_MASK(KEY_SHARE)                              | \
15432b31808SJens Wiklander      MBEDTLS_SSL_EXT_MASK(PRE_SHARED_KEY)                         | \
15532b31808SJens Wiklander      MBEDTLS_SSL_EXT_MASK(PSK_KEY_EXCHANGE_MODES)                 | \
15632b31808SJens Wiklander      MBEDTLS_SSL_EXT_MASK(EARLY_DATA)                             | \
15732b31808SJens Wiklander      MBEDTLS_SSL_EXT_MASK(COOKIE)                                 | \
15832b31808SJens Wiklander      MBEDTLS_SSL_EXT_MASK(SUPPORTED_VERSIONS)                     | \
15932b31808SJens Wiklander      MBEDTLS_SSL_EXT_MASK(CERT_AUTH)                              | \
16032b31808SJens Wiklander      MBEDTLS_SSL_EXT_MASK(POST_HANDSHAKE_AUTH)                    | \
16132b31808SJens Wiklander      MBEDTLS_SSL_EXT_MASK(SIG_ALG_CERT)                           | \
16232b31808SJens Wiklander      MBEDTLS_SSL_EXT_MASK(RECORD_SIZE_LIMIT)                      | \
16332b31808SJens Wiklander      MBEDTLS_SSL_TLS1_3_EXT_MASK_UNRECOGNIZED)
16432b31808SJens Wiklander 
16532b31808SJens Wiklander /* RFC 8446 section 4.2. Allowed extensions for EncryptedExtensions */
16632b31808SJens Wiklander #define MBEDTLS_SSL_TLS1_3_ALLOWED_EXTS_OF_EE                                  \
16732b31808SJens Wiklander     (MBEDTLS_SSL_EXT_MASK(SERVERNAME)                             | \
16832b31808SJens Wiklander      MBEDTLS_SSL_EXT_MASK(MAX_FRAGMENT_LENGTH)                    | \
16932b31808SJens Wiklander      MBEDTLS_SSL_EXT_MASK(SUPPORTED_GROUPS)                       | \
17032b31808SJens Wiklander      MBEDTLS_SSL_EXT_MASK(USE_SRTP)                               | \
17132b31808SJens Wiklander      MBEDTLS_SSL_EXT_MASK(HEARTBEAT)                              | \
17232b31808SJens Wiklander      MBEDTLS_SSL_EXT_MASK(ALPN)                                   | \
17332b31808SJens Wiklander      MBEDTLS_SSL_EXT_MASK(CLI_CERT_TYPE)                          | \
17432b31808SJens Wiklander      MBEDTLS_SSL_EXT_MASK(SERV_CERT_TYPE)                         | \
17532b31808SJens Wiklander      MBEDTLS_SSL_EXT_MASK(EARLY_DATA)                             | \
17632b31808SJens Wiklander      MBEDTLS_SSL_EXT_MASK(RECORD_SIZE_LIMIT))
17732b31808SJens Wiklander 
17832b31808SJens Wiklander /* RFC 8446 section 4.2. Allowed extensions for CertificateRequest */
17932b31808SJens Wiklander #define MBEDTLS_SSL_TLS1_3_ALLOWED_EXTS_OF_CR                                  \
18032b31808SJens Wiklander     (MBEDTLS_SSL_EXT_MASK(STATUS_REQUEST)                         | \
18132b31808SJens Wiklander      MBEDTLS_SSL_EXT_MASK(SIG_ALG)                                | \
18232b31808SJens Wiklander      MBEDTLS_SSL_EXT_MASK(SCT)                                    | \
18332b31808SJens Wiklander      MBEDTLS_SSL_EXT_MASK(CERT_AUTH)                              | \
18432b31808SJens Wiklander      MBEDTLS_SSL_EXT_MASK(OID_FILTERS)                            | \
18532b31808SJens Wiklander      MBEDTLS_SSL_EXT_MASK(SIG_ALG_CERT)                           | \
18632b31808SJens Wiklander      MBEDTLS_SSL_TLS1_3_EXT_MASK_UNRECOGNIZED)
18732b31808SJens Wiklander 
18832b31808SJens Wiklander /* RFC 8446 section 4.2. Allowed extensions for Certificate */
18932b31808SJens Wiklander #define MBEDTLS_SSL_TLS1_3_ALLOWED_EXTS_OF_CT                                  \
19032b31808SJens Wiklander     (MBEDTLS_SSL_EXT_MASK(STATUS_REQUEST)                         | \
19132b31808SJens Wiklander      MBEDTLS_SSL_EXT_MASK(SCT))
19232b31808SJens Wiklander 
19332b31808SJens Wiklander /* RFC 8446 section 4.2. Allowed extensions for ServerHello */
19432b31808SJens Wiklander #define MBEDTLS_SSL_TLS1_3_ALLOWED_EXTS_OF_SH                                  \
19532b31808SJens Wiklander     (MBEDTLS_SSL_EXT_MASK(KEY_SHARE)                              | \
19632b31808SJens Wiklander      MBEDTLS_SSL_EXT_MASK(PRE_SHARED_KEY)                         | \
19732b31808SJens Wiklander      MBEDTLS_SSL_EXT_MASK(SUPPORTED_VERSIONS))
19832b31808SJens Wiklander 
19932b31808SJens Wiklander /* RFC 8446 section 4.2. Allowed extensions for HelloRetryRequest */
20032b31808SJens Wiklander #define MBEDTLS_SSL_TLS1_3_ALLOWED_EXTS_OF_HRR                                 \
20132b31808SJens Wiklander     (MBEDTLS_SSL_EXT_MASK(KEY_SHARE)                              | \
20232b31808SJens Wiklander      MBEDTLS_SSL_EXT_MASK(COOKIE)                                 | \
20332b31808SJens Wiklander      MBEDTLS_SSL_EXT_MASK(SUPPORTED_VERSIONS))
20432b31808SJens Wiklander 
20532b31808SJens Wiklander /* RFC 8446 section 4.2. Allowed extensions for NewSessionTicket */
20632b31808SJens Wiklander #define MBEDTLS_SSL_TLS1_3_ALLOWED_EXTS_OF_NST                                 \
20732b31808SJens Wiklander     (MBEDTLS_SSL_EXT_MASK(EARLY_DATA)                             | \
20832b31808SJens Wiklander      MBEDTLS_SSL_TLS1_3_EXT_MASK_UNRECOGNIZED)
20932b31808SJens Wiklander 
21032b31808SJens Wiklander /*
21132b31808SJens Wiklander  * Helper macros for function call with return check.
21232b31808SJens Wiklander  */
21332b31808SJens Wiklander /*
21432b31808SJens Wiklander  * Exit when return non-zero value
21532b31808SJens Wiklander  */
21632b31808SJens Wiklander #define MBEDTLS_SSL_PROC_CHK(f)                               \
21732b31808SJens Wiklander     do {                                                        \
21832b31808SJens Wiklander         ret = (f);                                            \
21932b31808SJens Wiklander         if (ret != 0)                                          \
22032b31808SJens Wiklander         {                                                       \
22132b31808SJens Wiklander             goto cleanup;                                       \
22232b31808SJens Wiklander         }                                                       \
22332b31808SJens Wiklander     } while (0)
22432b31808SJens Wiklander /*
22532b31808SJens Wiklander  * Exit when return negative value
22632b31808SJens Wiklander  */
22732b31808SJens Wiklander #define MBEDTLS_SSL_PROC_CHK_NEG(f)                           \
22832b31808SJens Wiklander     do {                                                        \
22932b31808SJens Wiklander         ret = (f);                                            \
23032b31808SJens Wiklander         if (ret < 0)                                           \
23132b31808SJens Wiklander         {                                                       \
23232b31808SJens Wiklander             goto cleanup;                                       \
23332b31808SJens Wiklander         }                                                       \
23432b31808SJens Wiklander     } while (0)
23532b31808SJens Wiklander 
23632b31808SJens Wiklander /*
23732b31808SJens Wiklander  * DTLS retransmission states, see RFC 6347 4.2.4
23832b31808SJens Wiklander  *
23932b31808SJens Wiklander  * The SENDING state is merged in PREPARING for initial sends,
24032b31808SJens Wiklander  * but is distinct for resends.
24132b31808SJens Wiklander  *
24232b31808SJens Wiklander  * Note: initial state is wrong for server, but is not used anyway.
24332b31808SJens Wiklander  */
24432b31808SJens Wiklander #define MBEDTLS_SSL_RETRANS_PREPARING       0
24532b31808SJens Wiklander #define MBEDTLS_SSL_RETRANS_SENDING         1
24632b31808SJens Wiklander #define MBEDTLS_SSL_RETRANS_WAITING         2
24732b31808SJens Wiklander #define MBEDTLS_SSL_RETRANS_FINISHED        3
24832b31808SJens Wiklander 
24932b31808SJens Wiklander /*
25032b31808SJens Wiklander  * Allow extra bytes for record, authentication and encryption overhead:
25132b31808SJens Wiklander  * counter (8) + header (5) + IV(16) + MAC (16-48) + padding (0-256).
25232b31808SJens Wiklander  */
25332b31808SJens Wiklander 
25432b31808SJens Wiklander #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
25532b31808SJens Wiklander 
25632b31808SJens Wiklander /* This macro determines whether CBC is supported. */
257*b0563631STom Van Eyck #if defined(MBEDTLS_SSL_HAVE_CBC)      &&                                  \
258*b0563631STom Van Eyck     (defined(MBEDTLS_SSL_HAVE_AES)     ||                                  \
259*b0563631STom Van Eyck     defined(MBEDTLS_SSL_HAVE_CAMELLIA) ||                                  \
260*b0563631STom Van Eyck     defined(MBEDTLS_SSL_HAVE_ARIA))
26132b31808SJens Wiklander #define MBEDTLS_SSL_SOME_SUITES_USE_CBC
26232b31808SJens Wiklander #endif
26332b31808SJens Wiklander 
26432b31808SJens Wiklander /* This macro determines whether a ciphersuite using a
26532b31808SJens Wiklander  * stream cipher can be used. */
26632b31808SJens Wiklander #if defined(MBEDTLS_CIPHER_NULL_CIPHER)
26732b31808SJens Wiklander #define MBEDTLS_SSL_SOME_SUITES_USE_STREAM
26832b31808SJens Wiklander #endif
26932b31808SJens Wiklander 
27032b31808SJens Wiklander /* This macro determines whether the CBC construct used in TLS 1.2 is supported. */
27132b31808SJens Wiklander #if defined(MBEDTLS_SSL_SOME_SUITES_USE_CBC) && \
27232b31808SJens Wiklander     defined(MBEDTLS_SSL_PROTO_TLS1_2)
27332b31808SJens Wiklander #define MBEDTLS_SSL_SOME_SUITES_USE_TLS_CBC
27432b31808SJens Wiklander #endif
27532b31808SJens Wiklander 
27632b31808SJens Wiklander #if defined(MBEDTLS_SSL_SOME_SUITES_USE_STREAM) || \
27732b31808SJens Wiklander     defined(MBEDTLS_SSL_SOME_SUITES_USE_CBC)
27832b31808SJens Wiklander #define MBEDTLS_SSL_SOME_SUITES_USE_MAC
27932b31808SJens Wiklander #endif
28032b31808SJens Wiklander 
28132b31808SJens Wiklander /* This macro determines whether a ciphersuite uses Encrypt-then-MAC with CBC */
28232b31808SJens Wiklander #if defined(MBEDTLS_SSL_SOME_SUITES_USE_CBC) && \
28332b31808SJens Wiklander     defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
28432b31808SJens Wiklander #define MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM
28532b31808SJens Wiklander #endif
28632b31808SJens Wiklander 
28732b31808SJens Wiklander #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
28832b31808SJens Wiklander 
28932b31808SJens Wiklander #if defined(MBEDTLS_SSL_SOME_SUITES_USE_MAC)
29032b31808SJens Wiklander /* Ciphersuites using HMAC */
291*b0563631STom Van Eyck #if defined(MBEDTLS_MD_CAN_SHA384)
29232b31808SJens Wiklander #define MBEDTLS_SSL_MAC_ADD                 48  /* SHA-384 used for HMAC */
293*b0563631STom Van Eyck #elif defined(MBEDTLS_MD_CAN_SHA256)
29432b31808SJens Wiklander #define MBEDTLS_SSL_MAC_ADD                 32  /* SHA-256 used for HMAC */
29532b31808SJens Wiklander #else
29632b31808SJens Wiklander #define MBEDTLS_SSL_MAC_ADD                 20  /* SHA-1   used for HMAC */
29732b31808SJens Wiklander #endif
29832b31808SJens Wiklander #else /* MBEDTLS_SSL_SOME_SUITES_USE_MAC */
29932b31808SJens Wiklander /* AEAD ciphersuites: GCM and CCM use a 128 bits tag */
30032b31808SJens Wiklander #define MBEDTLS_SSL_MAC_ADD                 16
30132b31808SJens Wiklander #endif
30232b31808SJens Wiklander 
303*b0563631STom Van Eyck #if defined(MBEDTLS_SSL_HAVE_CBC)
30432b31808SJens Wiklander #define MBEDTLS_SSL_PADDING_ADD            256
30532b31808SJens Wiklander #else
30632b31808SJens Wiklander #define MBEDTLS_SSL_PADDING_ADD              0
30732b31808SJens Wiklander #endif
30832b31808SJens Wiklander 
30932b31808SJens Wiklander #if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
31032b31808SJens Wiklander #define MBEDTLS_SSL_MAX_CID_EXPANSION      MBEDTLS_SSL_CID_TLS1_3_PADDING_GRANULARITY
31132b31808SJens Wiklander #else
31232b31808SJens Wiklander #define MBEDTLS_SSL_MAX_CID_EXPANSION        0
31332b31808SJens Wiklander #endif
31432b31808SJens Wiklander 
31532b31808SJens Wiklander #define MBEDTLS_SSL_PAYLOAD_OVERHEAD (MBEDTLS_MAX_IV_LENGTH +          \
31632b31808SJens Wiklander                                       MBEDTLS_SSL_MAC_ADD +            \
31732b31808SJens Wiklander                                       MBEDTLS_SSL_PADDING_ADD +        \
31832b31808SJens Wiklander                                       MBEDTLS_SSL_MAX_CID_EXPANSION    \
31932b31808SJens Wiklander                                       )
32032b31808SJens Wiklander 
32132b31808SJens Wiklander #define MBEDTLS_SSL_IN_PAYLOAD_LEN (MBEDTLS_SSL_PAYLOAD_OVERHEAD + \
32232b31808SJens Wiklander                                     (MBEDTLS_SSL_IN_CONTENT_LEN))
32332b31808SJens Wiklander 
32432b31808SJens Wiklander #define MBEDTLS_SSL_OUT_PAYLOAD_LEN (MBEDTLS_SSL_PAYLOAD_OVERHEAD + \
32532b31808SJens Wiklander                                      (MBEDTLS_SSL_OUT_CONTENT_LEN))
32632b31808SJens Wiklander 
32732b31808SJens Wiklander /* The maximum number of buffered handshake messages. */
32832b31808SJens Wiklander #define MBEDTLS_SSL_MAX_BUFFERED_HS 4
32932b31808SJens Wiklander 
33032b31808SJens Wiklander /* Maximum length we can advertise as our max content length for
33132b31808SJens Wiklander    RFC 6066 max_fragment_length extension negotiation purposes
33232b31808SJens Wiklander    (the lesser of both sizes, if they are unequal.)
33332b31808SJens Wiklander  */
33432b31808SJens Wiklander #define MBEDTLS_TLS_EXT_ADV_CONTENT_LEN (                            \
33532b31808SJens Wiklander         (MBEDTLS_SSL_IN_CONTENT_LEN > MBEDTLS_SSL_OUT_CONTENT_LEN)   \
33632b31808SJens Wiklander         ? (MBEDTLS_SSL_OUT_CONTENT_LEN)                            \
33732b31808SJens Wiklander         : (MBEDTLS_SSL_IN_CONTENT_LEN)                             \
33832b31808SJens Wiklander         )
33932b31808SJens Wiklander 
34032b31808SJens Wiklander /* Maximum size in bytes of list in signature algorithms ext., RFC 5246/8446 */
34132b31808SJens Wiklander #define MBEDTLS_SSL_MAX_SIG_ALG_LIST_LEN       65534
34232b31808SJens Wiklander 
34332b31808SJens Wiklander /* Minimum size in bytes of list in signature algorithms ext., RFC 5246/8446 */
34432b31808SJens Wiklander #define MBEDTLS_SSL_MIN_SIG_ALG_LIST_LEN       2
34532b31808SJens Wiklander 
34632b31808SJens Wiklander /* Maximum size in bytes of list in supported elliptic curve ext., RFC 4492 */
34732b31808SJens Wiklander #define MBEDTLS_SSL_MAX_CURVE_LIST_LEN         65535
34832b31808SJens Wiklander 
34932b31808SJens Wiklander #define MBEDTLS_RECEIVED_SIG_ALGS_SIZE         20
35032b31808SJens Wiklander 
35132b31808SJens Wiklander #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED)
35232b31808SJens Wiklander 
35332b31808SJens Wiklander #define MBEDTLS_TLS_SIG_NONE MBEDTLS_TLS1_3_SIG_NONE
35432b31808SJens Wiklander 
35532b31808SJens Wiklander #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
35632b31808SJens Wiklander #define MBEDTLS_SSL_TLS12_SIG_AND_HASH_ALG(sig, hash) ((hash << 8) | sig)
35732b31808SJens Wiklander #define MBEDTLS_SSL_TLS12_SIG_ALG_FROM_SIG_AND_HASH_ALG(alg) (alg & 0xFF)
35832b31808SJens Wiklander #define MBEDTLS_SSL_TLS12_HASH_ALG_FROM_SIG_AND_HASH_ALG(alg) (alg >> 8)
35932b31808SJens Wiklander #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
36032b31808SJens Wiklander 
36132b31808SJens Wiklander #endif /* MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED */
36232b31808SJens Wiklander 
36332b31808SJens Wiklander /*
36432b31808SJens Wiklander  * Check that we obey the standard's message size bounds
36532b31808SJens Wiklander  */
36632b31808SJens Wiklander 
36732b31808SJens Wiklander #if MBEDTLS_SSL_IN_CONTENT_LEN > 16384
36832b31808SJens Wiklander #error "Bad configuration - incoming record content too large."
36932b31808SJens Wiklander #endif
37032b31808SJens Wiklander 
37132b31808SJens Wiklander #if MBEDTLS_SSL_OUT_CONTENT_LEN > 16384
37232b31808SJens Wiklander #error "Bad configuration - outgoing record content too large."
37332b31808SJens Wiklander #endif
37432b31808SJens Wiklander 
37532b31808SJens Wiklander #if MBEDTLS_SSL_IN_PAYLOAD_LEN > MBEDTLS_SSL_IN_CONTENT_LEN + 2048
37632b31808SJens Wiklander #error "Bad configuration - incoming protected record payload too large."
37732b31808SJens Wiklander #endif
37832b31808SJens Wiklander 
37932b31808SJens Wiklander #if MBEDTLS_SSL_OUT_PAYLOAD_LEN > MBEDTLS_SSL_OUT_CONTENT_LEN + 2048
38032b31808SJens Wiklander #error "Bad configuration - outgoing protected record payload too large."
38132b31808SJens Wiklander #endif
38232b31808SJens Wiklander 
38332b31808SJens Wiklander /* Calculate buffer sizes */
38432b31808SJens Wiklander 
38532b31808SJens Wiklander /* Note: Even though the TLS record header is only 5 bytes
38632b31808SJens Wiklander    long, we're internally using 8 bytes to store the
38732b31808SJens Wiklander    implicit sequence number. */
38832b31808SJens Wiklander #define MBEDTLS_SSL_HEADER_LEN 13
38932b31808SJens Wiklander 
39032b31808SJens Wiklander #if !defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
39132b31808SJens Wiklander #define MBEDTLS_SSL_IN_BUFFER_LEN  \
39232b31808SJens Wiklander     ((MBEDTLS_SSL_HEADER_LEN) + (MBEDTLS_SSL_IN_PAYLOAD_LEN))
39332b31808SJens Wiklander #else
39432b31808SJens Wiklander #define MBEDTLS_SSL_IN_BUFFER_LEN  \
39532b31808SJens Wiklander     ((MBEDTLS_SSL_HEADER_LEN) + (MBEDTLS_SSL_IN_PAYLOAD_LEN) \
39632b31808SJens Wiklander      + (MBEDTLS_SSL_CID_IN_LEN_MAX))
39732b31808SJens Wiklander #endif
39832b31808SJens Wiklander 
39932b31808SJens Wiklander #if !defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
40032b31808SJens Wiklander #define MBEDTLS_SSL_OUT_BUFFER_LEN  \
40132b31808SJens Wiklander     ((MBEDTLS_SSL_HEADER_LEN) + (MBEDTLS_SSL_OUT_PAYLOAD_LEN))
40232b31808SJens Wiklander #else
40332b31808SJens Wiklander #define MBEDTLS_SSL_OUT_BUFFER_LEN                               \
40432b31808SJens Wiklander     ((MBEDTLS_SSL_HEADER_LEN) + (MBEDTLS_SSL_OUT_PAYLOAD_LEN)    \
40532b31808SJens Wiklander      + (MBEDTLS_SSL_CID_OUT_LEN_MAX))
40632b31808SJens Wiklander #endif
40732b31808SJens Wiklander 
40832b31808SJens Wiklander #define MBEDTLS_CLIENT_HELLO_RANDOM_LEN 32
40932b31808SJens Wiklander #define MBEDTLS_SERVER_HELLO_RANDOM_LEN 32
41032b31808SJens Wiklander 
41132b31808SJens Wiklander #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
41232b31808SJens Wiklander /**
41332b31808SJens Wiklander  * \brief          Return the maximum fragment length (payload, in bytes) for
41432b31808SJens Wiklander  *                 the output buffer. For the client, this is the configured
41532b31808SJens Wiklander  *                 value. For the server, it is the minimum of two - the
41632b31808SJens Wiklander  *                 configured value and the negotiated one.
41732b31808SJens Wiklander  *
41832b31808SJens Wiklander  * \sa             mbedtls_ssl_conf_max_frag_len()
41932b31808SJens Wiklander  * \sa             mbedtls_ssl_get_max_out_record_payload()
42032b31808SJens Wiklander  *
42132b31808SJens Wiklander  * \param ssl      SSL context
42232b31808SJens Wiklander  *
42332b31808SJens Wiklander  * \return         Current maximum fragment length for the output buffer.
42432b31808SJens Wiklander  */
42532b31808SJens Wiklander size_t mbedtls_ssl_get_output_max_frag_len(const mbedtls_ssl_context *ssl);
42632b31808SJens Wiklander 
42732b31808SJens Wiklander /**
42832b31808SJens Wiklander  * \brief          Return the maximum fragment length (payload, in bytes) for
42932b31808SJens Wiklander  *                 the input buffer. This is the negotiated maximum fragment
43032b31808SJens Wiklander  *                 length, or, if there is none, MBEDTLS_SSL_IN_CONTENT_LEN.
43132b31808SJens Wiklander  *                 If it is not defined either, the value is 2^14. This function
43232b31808SJens Wiklander  *                 works as its predecessor, \c mbedtls_ssl_get_max_frag_len().
43332b31808SJens Wiklander  *
43432b31808SJens Wiklander  * \sa             mbedtls_ssl_conf_max_frag_len()
43532b31808SJens Wiklander  * \sa             mbedtls_ssl_get_max_in_record_payload()
43632b31808SJens Wiklander  *
43732b31808SJens Wiklander  * \param ssl      SSL context
43832b31808SJens Wiklander  *
43932b31808SJens Wiklander  * \return         Current maximum fragment length for the output buffer.
44032b31808SJens Wiklander  */
44132b31808SJens Wiklander size_t mbedtls_ssl_get_input_max_frag_len(const mbedtls_ssl_context *ssl);
44232b31808SJens Wiklander #endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
44332b31808SJens Wiklander 
444*b0563631STom Van Eyck #if defined(MBEDTLS_SSL_RECORD_SIZE_LIMIT)
445*b0563631STom Van Eyck /**
446*b0563631STom Van Eyck  * \brief    Get the size limit in bytes for the protected outgoing records
447*b0563631STom Van Eyck  *           as defined in RFC 8449
448*b0563631STom Van Eyck  *
449*b0563631STom Van Eyck  * \param ssl      SSL context
450*b0563631STom Van Eyck  *
451*b0563631STom Van Eyck  * \return         The size limit in bytes for the protected outgoing
452*b0563631STom Van Eyck  *                 records as defined in RFC 8449.
453*b0563631STom Van Eyck  */
454*b0563631STom Van Eyck size_t mbedtls_ssl_get_output_record_size_limit(const mbedtls_ssl_context *ssl);
455*b0563631STom Van Eyck #endif /* MBEDTLS_SSL_RECORD_SIZE_LIMIT */
456*b0563631STom Van Eyck 
45732b31808SJens Wiklander #if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
45832b31808SJens Wiklander static inline size_t mbedtls_ssl_get_output_buflen(const mbedtls_ssl_context *ctx)
45932b31808SJens Wiklander {
46032b31808SJens Wiklander #if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
46132b31808SJens Wiklander     return mbedtls_ssl_get_output_max_frag_len(ctx)
46232b31808SJens Wiklander            + MBEDTLS_SSL_HEADER_LEN + MBEDTLS_SSL_PAYLOAD_OVERHEAD
46332b31808SJens Wiklander            + MBEDTLS_SSL_CID_OUT_LEN_MAX;
46432b31808SJens Wiklander #else
46532b31808SJens Wiklander     return mbedtls_ssl_get_output_max_frag_len(ctx)
46632b31808SJens Wiklander            + MBEDTLS_SSL_HEADER_LEN + MBEDTLS_SSL_PAYLOAD_OVERHEAD;
46732b31808SJens Wiklander #endif
46832b31808SJens Wiklander }
46932b31808SJens Wiklander 
47032b31808SJens Wiklander static inline size_t mbedtls_ssl_get_input_buflen(const mbedtls_ssl_context *ctx)
47132b31808SJens Wiklander {
47232b31808SJens Wiklander #if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
47332b31808SJens Wiklander     return mbedtls_ssl_get_input_max_frag_len(ctx)
47432b31808SJens Wiklander            + MBEDTLS_SSL_HEADER_LEN + MBEDTLS_SSL_PAYLOAD_OVERHEAD
47532b31808SJens Wiklander            + MBEDTLS_SSL_CID_IN_LEN_MAX;
47632b31808SJens Wiklander #else
47732b31808SJens Wiklander     return mbedtls_ssl_get_input_max_frag_len(ctx)
47832b31808SJens Wiklander            + MBEDTLS_SSL_HEADER_LEN + MBEDTLS_SSL_PAYLOAD_OVERHEAD;
47932b31808SJens Wiklander #endif
48032b31808SJens Wiklander }
48132b31808SJens Wiklander #endif
48232b31808SJens Wiklander 
48332b31808SJens Wiklander /*
48432b31808SJens Wiklander  * TLS extension flags (for extensions with outgoing ServerHello content
48532b31808SJens Wiklander  * that need it (e.g. for RENEGOTIATION_INFO the server already knows because
48632b31808SJens Wiklander  * of state of the renegotiation flag, so no indicator is required)
48732b31808SJens Wiklander  */
48832b31808SJens Wiklander #define MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT (1 << 0)
48932b31808SJens Wiklander #define MBEDTLS_TLS_EXT_ECJPAKE_KKPP_OK                 (1 << 1)
49032b31808SJens Wiklander 
49132b31808SJens Wiklander /**
49232b31808SJens Wiklander  * \brief        This function checks if the remaining size in a buffer is
49332b31808SJens Wiklander  *               greater or equal than a needed space.
49432b31808SJens Wiklander  *
49532b31808SJens Wiklander  * \param cur    Pointer to the current position in the buffer.
49632b31808SJens Wiklander  * \param end    Pointer to one past the end of the buffer.
49732b31808SJens Wiklander  * \param need   Needed space in bytes.
49832b31808SJens Wiklander  *
49932b31808SJens Wiklander  * \return       Zero if the needed space is available in the buffer, non-zero
50032b31808SJens Wiklander  *               otherwise.
50132b31808SJens Wiklander  */
50232b31808SJens Wiklander #if !defined(MBEDTLS_TEST_HOOKS)
50332b31808SJens Wiklander static inline int mbedtls_ssl_chk_buf_ptr(const uint8_t *cur,
50432b31808SJens Wiklander                                           const uint8_t *end, size_t need)
50532b31808SJens Wiklander {
50632b31808SJens Wiklander     return (cur > end) || (need > (size_t) (end - cur));
50732b31808SJens Wiklander }
50832b31808SJens Wiklander #else
50932b31808SJens Wiklander typedef struct {
51032b31808SJens Wiklander     const uint8_t *cur;
51132b31808SJens Wiklander     const uint8_t *end;
51232b31808SJens Wiklander     size_t need;
51332b31808SJens Wiklander } mbedtls_ssl_chk_buf_ptr_args;
51432b31808SJens Wiklander 
51532b31808SJens Wiklander void mbedtls_ssl_set_chk_buf_ptr_fail_args(
51632b31808SJens Wiklander     const uint8_t *cur, const uint8_t *end, size_t need);
51732b31808SJens Wiklander void mbedtls_ssl_reset_chk_buf_ptr_fail_args(void);
51832b31808SJens Wiklander 
51932b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
52032b31808SJens Wiklander int mbedtls_ssl_cmp_chk_buf_ptr_fail_args(mbedtls_ssl_chk_buf_ptr_args *args);
52132b31808SJens Wiklander 
52232b31808SJens Wiklander static inline int mbedtls_ssl_chk_buf_ptr(const uint8_t *cur,
52332b31808SJens Wiklander                                           const uint8_t *end, size_t need)
52432b31808SJens Wiklander {
52532b31808SJens Wiklander     if ((cur > end) || (need > (size_t) (end - cur))) {
52632b31808SJens Wiklander         mbedtls_ssl_set_chk_buf_ptr_fail_args(cur, end, need);
52732b31808SJens Wiklander         return 1;
52832b31808SJens Wiklander     }
52932b31808SJens Wiklander     return 0;
53032b31808SJens Wiklander }
53132b31808SJens Wiklander #endif /* MBEDTLS_TEST_HOOKS */
53232b31808SJens Wiklander 
53332b31808SJens Wiklander /**
53432b31808SJens Wiklander  * \brief        This macro checks if the remaining size in a buffer is
53532b31808SJens Wiklander  *               greater or equal than a needed space. If it is not the case,
53632b31808SJens Wiklander  *               it returns an SSL_BUFFER_TOO_SMALL error.
53732b31808SJens Wiklander  *
53832b31808SJens Wiklander  * \param cur    Pointer to the current position in the buffer.
53932b31808SJens Wiklander  * \param end    Pointer to one past the end of the buffer.
54032b31808SJens Wiklander  * \param need   Needed space in bytes.
54132b31808SJens Wiklander  *
54232b31808SJens Wiklander  */
54332b31808SJens Wiklander #define MBEDTLS_SSL_CHK_BUF_PTR(cur, end, need)                        \
54432b31808SJens Wiklander     do {                                                                 \
54532b31808SJens Wiklander         if (mbedtls_ssl_chk_buf_ptr((cur), (end), (need)) != 0) \
54632b31808SJens Wiklander         {                                                                \
54732b31808SJens Wiklander             return MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL;                  \
54832b31808SJens Wiklander         }                                                                \
54932b31808SJens Wiklander     } while (0)
55032b31808SJens Wiklander 
55132b31808SJens Wiklander /**
55232b31808SJens Wiklander  * \brief        This macro checks if the remaining length in an input buffer is
55332b31808SJens Wiklander  *               greater or equal than a needed length. If it is not the case, it
55432b31808SJens Wiklander  *               returns #MBEDTLS_ERR_SSL_DECODE_ERROR error and pends a
55532b31808SJens Wiklander  *               #MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR alert message.
55632b31808SJens Wiklander  *
55732b31808SJens Wiklander  *               This is a function-like macro. It is guaranteed to evaluate each
55832b31808SJens Wiklander  *               argument exactly once.
55932b31808SJens Wiklander  *
56032b31808SJens Wiklander  * \param cur    Pointer to the current position in the buffer.
56132b31808SJens Wiklander  * \param end    Pointer to one past the end of the buffer.
56232b31808SJens Wiklander  * \param need   Needed length in bytes.
56332b31808SJens Wiklander  *
56432b31808SJens Wiklander  */
56532b31808SJens Wiklander #define MBEDTLS_SSL_CHK_BUF_READ_PTR(cur, end, need)                          \
56632b31808SJens Wiklander     do {                                                                        \
56732b31808SJens Wiklander         if (mbedtls_ssl_chk_buf_ptr((cur), (end), (need)) != 0)        \
56832b31808SJens Wiklander         {                                                                       \
56932b31808SJens Wiklander             MBEDTLS_SSL_DEBUG_MSG(1,                                           \
57032b31808SJens Wiklander                                   ("missing input data in %s", __func__));  \
57132b31808SJens Wiklander             MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR,   \
57232b31808SJens Wiklander                                          MBEDTLS_ERR_SSL_DECODE_ERROR);       \
57332b31808SJens Wiklander             return MBEDTLS_ERR_SSL_DECODE_ERROR;                             \
57432b31808SJens Wiklander         }                                                                       \
57532b31808SJens Wiklander     } while (0)
57632b31808SJens Wiklander 
57732b31808SJens Wiklander #ifdef __cplusplus
57832b31808SJens Wiklander extern "C" {
57932b31808SJens Wiklander #endif
58032b31808SJens Wiklander 
58132b31808SJens Wiklander typedef int  mbedtls_ssl_tls_prf_cb(const unsigned char *secret, size_t slen,
58232b31808SJens Wiklander                                     const char *label,
58332b31808SJens Wiklander                                     const unsigned char *random, size_t rlen,
58432b31808SJens Wiklander                                     unsigned char *dstbuf, size_t dlen);
58532b31808SJens Wiklander 
58632b31808SJens Wiklander /* cipher.h exports the maximum IV, key and block length from
58732b31808SJens Wiklander  * all ciphers enabled in the config, regardless of whether those
58832b31808SJens Wiklander  * ciphers are actually usable in SSL/TLS. Notably, XTS is enabled
58932b31808SJens Wiklander  * in the default configuration and uses 64 Byte keys, but it is
59032b31808SJens Wiklander  * not used for record protection in SSL/TLS.
59132b31808SJens Wiklander  *
59232b31808SJens Wiklander  * In order to prevent unnecessary inflation of key structures,
59332b31808SJens Wiklander  * we introduce SSL-specific variants of the max-{key,block,IV}
59432b31808SJens Wiklander  * macros here which are meant to only take those ciphers into
59532b31808SJens Wiklander  * account which can be negotiated in SSL/TLS.
59632b31808SJens Wiklander  *
59732b31808SJens Wiklander  * Since the current definitions of MBEDTLS_MAX_{KEY|BLOCK|IV}_LENGTH
59832b31808SJens Wiklander  * in cipher.h are rough overapproximations of the real maxima, here
59932b31808SJens Wiklander  * we content ourselves with replicating those overapproximations
60032b31808SJens Wiklander  * for the maximum block and IV length, and excluding XTS from the
60132b31808SJens Wiklander  * computation of the maximum key length. */
60232b31808SJens Wiklander #define MBEDTLS_SSL_MAX_BLOCK_LENGTH 16
60332b31808SJens Wiklander #define MBEDTLS_SSL_MAX_IV_LENGTH    16
60432b31808SJens Wiklander #define MBEDTLS_SSL_MAX_KEY_LENGTH   32
60532b31808SJens Wiklander 
60632b31808SJens Wiklander /**
60732b31808SJens Wiklander  * \brief   The data structure holding the cryptographic material (key and IV)
60832b31808SJens Wiklander  *          used for record protection in TLS 1.3.
60932b31808SJens Wiklander  */
61032b31808SJens Wiklander struct mbedtls_ssl_key_set {
61132b31808SJens Wiklander     /*! The key for client->server records. */
61232b31808SJens Wiklander     unsigned char client_write_key[MBEDTLS_SSL_MAX_KEY_LENGTH];
61332b31808SJens Wiklander     /*! The key for server->client records. */
61432b31808SJens Wiklander     unsigned char server_write_key[MBEDTLS_SSL_MAX_KEY_LENGTH];
61532b31808SJens Wiklander     /*! The IV  for client->server records. */
61632b31808SJens Wiklander     unsigned char client_write_iv[MBEDTLS_SSL_MAX_IV_LENGTH];
61732b31808SJens Wiklander     /*! The IV  for server->client records. */
61832b31808SJens Wiklander     unsigned char server_write_iv[MBEDTLS_SSL_MAX_IV_LENGTH];
61932b31808SJens Wiklander 
62032b31808SJens Wiklander     size_t key_len; /*!< The length of client_write_key and
62132b31808SJens Wiklander                      *   server_write_key, in Bytes. */
62232b31808SJens Wiklander     size_t iv_len;  /*!< The length of client_write_iv and
62332b31808SJens Wiklander                      *   server_write_iv, in Bytes. */
62432b31808SJens Wiklander };
62532b31808SJens Wiklander typedef struct mbedtls_ssl_key_set mbedtls_ssl_key_set;
62632b31808SJens Wiklander 
62732b31808SJens Wiklander typedef struct {
62832b31808SJens Wiklander     unsigned char binder_key[MBEDTLS_TLS1_3_MD_MAX_SIZE];
62932b31808SJens Wiklander     unsigned char client_early_traffic_secret[MBEDTLS_TLS1_3_MD_MAX_SIZE];
63032b31808SJens Wiklander     unsigned char early_exporter_master_secret[MBEDTLS_TLS1_3_MD_MAX_SIZE];
63132b31808SJens Wiklander } mbedtls_ssl_tls13_early_secrets;
63232b31808SJens Wiklander 
63332b31808SJens Wiklander typedef struct {
63432b31808SJens Wiklander     unsigned char client_handshake_traffic_secret[MBEDTLS_TLS1_3_MD_MAX_SIZE];
63532b31808SJens Wiklander     unsigned char server_handshake_traffic_secret[MBEDTLS_TLS1_3_MD_MAX_SIZE];
63632b31808SJens Wiklander } mbedtls_ssl_tls13_handshake_secrets;
63732b31808SJens Wiklander 
63832b31808SJens Wiklander /*
63932b31808SJens Wiklander  * This structure contains the parameters only needed during handshake.
64032b31808SJens Wiklander  */
64132b31808SJens Wiklander struct mbedtls_ssl_handshake_params {
64232b31808SJens Wiklander     /* Frequently-used boolean or byte fields (placed early to take
64332b31808SJens Wiklander      * advantage of smaller code size for indirect access on Arm Thumb) */
64432b31808SJens Wiklander     uint8_t resume;                     /*!<  session resume indicator*/
64532b31808SJens Wiklander     uint8_t cli_exts;                   /*!< client extension presence*/
64632b31808SJens Wiklander 
64732b31808SJens Wiklander #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
64832b31808SJens Wiklander     uint8_t sni_authmode;               /*!< authmode from SNI callback     */
64932b31808SJens Wiklander #endif
65032b31808SJens Wiklander 
65132b31808SJens Wiklander #if defined(MBEDTLS_SSL_SRV_C)
65232b31808SJens Wiklander     /* Flag indicating if a CertificateRequest message has been sent
65332b31808SJens Wiklander      * to the client or not. */
65432b31808SJens Wiklander     uint8_t certificate_request_sent;
655*b0563631STom Van Eyck #if defined(MBEDTLS_SSL_EARLY_DATA)
656*b0563631STom Van Eyck     /* Flag indicating if the server has accepted early data or not. */
657*b0563631STom Van Eyck     uint8_t early_data_accepted;
658*b0563631STom Van Eyck #endif
65932b31808SJens Wiklander #endif /* MBEDTLS_SSL_SRV_C */
66032b31808SJens Wiklander 
66132b31808SJens Wiklander #if defined(MBEDTLS_SSL_SESSION_TICKETS)
66232b31808SJens Wiklander     uint8_t new_session_ticket;         /*!< use NewSessionTicket?    */
66332b31808SJens Wiklander #endif /* MBEDTLS_SSL_SESSION_TICKETS */
66432b31808SJens Wiklander 
66532b31808SJens Wiklander #if defined(MBEDTLS_SSL_CLI_C)
66632b31808SJens Wiklander     /** Minimum TLS version to be negotiated.
66732b31808SJens Wiklander      *
66832b31808SJens Wiklander      * It is set up in the ClientHello writing preparation stage and used
66932b31808SJens Wiklander      * throughout the ClientHello writing. Not relevant anymore as soon as
67032b31808SJens Wiklander      * the protocol version has been negotiated thus as soon as the
67132b31808SJens Wiklander      * ServerHello is received.
67232b31808SJens Wiklander      * For a fresh handshake not linked to any previous handshake, it is
67332b31808SJens Wiklander      * equal to the configured minimum minor version to be negotiated. When
67432b31808SJens Wiklander      * renegotiating or resuming a session, it is equal to the previously
67532b31808SJens Wiklander      * negotiated minor version.
67632b31808SJens Wiklander      *
67732b31808SJens Wiklander      * There is no maximum TLS version field in this handshake context.
67832b31808SJens Wiklander      * From the start of the handshake, we need to define a current protocol
67932b31808SJens Wiklander      * version for the record layer which we define as the maximum TLS
68032b31808SJens Wiklander      * version to be negotiated. The `tls_version` field of the SSL context is
68132b31808SJens Wiklander      * used to store this maximum value until it contains the actual
68232b31808SJens Wiklander      * negotiated value.
68332b31808SJens Wiklander      */
68432b31808SJens Wiklander     mbedtls_ssl_protocol_version min_tls_version;
68532b31808SJens Wiklander #endif
68632b31808SJens Wiklander 
68732b31808SJens Wiklander #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
68832b31808SJens Wiklander     uint8_t extended_ms;                /*!< use Extended Master Secret? */
68932b31808SJens Wiklander #endif
69032b31808SJens Wiklander 
69132b31808SJens Wiklander #if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
69232b31808SJens Wiklander     uint8_t async_in_progress; /*!< an asynchronous operation is in progress */
69332b31808SJens Wiklander #endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
69432b31808SJens Wiklander 
69532b31808SJens Wiklander #if defined(MBEDTLS_SSL_PROTO_DTLS)
69632b31808SJens Wiklander     unsigned char retransmit_state;     /*!<  Retransmission state           */
69732b31808SJens Wiklander #endif
69832b31808SJens Wiklander 
69932b31808SJens Wiklander #if !defined(MBEDTLS_DEPRECATED_REMOVED)
70032b31808SJens Wiklander     unsigned char group_list_heap_allocated;
70132b31808SJens Wiklander     unsigned char sig_algs_heap_allocated;
70232b31808SJens Wiklander #endif
70332b31808SJens Wiklander 
70432b31808SJens Wiklander #if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
70532b31808SJens Wiklander     uint8_t ecrs_enabled;               /*!< Handshake supports EC restart? */
70632b31808SJens Wiklander     enum { /* this complements ssl->state with info on intra-state operations */
70732b31808SJens Wiklander         ssl_ecrs_none = 0,              /*!< nothing going on (yet)         */
70832b31808SJens Wiklander         ssl_ecrs_crt_verify,            /*!< Certificate: crt_verify()      */
70932b31808SJens Wiklander         ssl_ecrs_ske_start_processing,  /*!< ServerKeyExchange: pk_verify() */
71032b31808SJens Wiklander         ssl_ecrs_cke_ecdh_calc_secret,  /*!< ClientKeyExchange: ECDH step 2 */
71132b31808SJens Wiklander         ssl_ecrs_crt_vrfy_sign,         /*!< CertificateVerify: pk_sign()   */
71232b31808SJens Wiklander     } ecrs_state;                       /*!< current (or last) operation    */
71332b31808SJens Wiklander     mbedtls_x509_crt *ecrs_peer_cert;   /*!< The peer's CRT chain.          */
71432b31808SJens Wiklander     size_t ecrs_n;                      /*!< place for saving a length      */
71532b31808SJens Wiklander #endif
71632b31808SJens Wiklander 
71732b31808SJens Wiklander     mbedtls_ssl_ciphersuite_t const *ciphersuite_info;
71832b31808SJens Wiklander 
71932b31808SJens Wiklander     MBEDTLS_CHECK_RETURN_CRITICAL
72032b31808SJens Wiklander     int (*update_checksum)(mbedtls_ssl_context *, const unsigned char *, size_t);
72132b31808SJens Wiklander     MBEDTLS_CHECK_RETURN_CRITICAL
72232b31808SJens Wiklander     int (*calc_verify)(const mbedtls_ssl_context *, unsigned char *, size_t *);
72332b31808SJens Wiklander     MBEDTLS_CHECK_RETURN_CRITICAL
72432b31808SJens Wiklander     int (*calc_finished)(mbedtls_ssl_context *, unsigned char *, int);
72532b31808SJens Wiklander     mbedtls_ssl_tls_prf_cb *tls_prf;
72632b31808SJens Wiklander 
72732b31808SJens Wiklander     /*
72832b31808SJens Wiklander      * Handshake specific crypto variables
72932b31808SJens Wiklander      */
73032b31808SJens Wiklander #if defined(MBEDTLS_SSL_PROTO_TLS1_3)
73132b31808SJens Wiklander     uint8_t key_exchange_mode; /*!< Selected key exchange mode */
73232b31808SJens Wiklander 
733*b0563631STom Van Eyck     /**
734*b0563631STom Van Eyck      * Flag indicating if, in the course of the current handshake, an
735*b0563631STom Van Eyck      * HelloRetryRequest message has been sent by the server or received by
736*b0563631STom Van Eyck      * the client (<> 0) or not (0).
737*b0563631STom Van Eyck      */
738*b0563631STom Van Eyck     uint8_t hello_retry_request_flag;
739*b0563631STom Van Eyck 
740*b0563631STom Van Eyck #if defined(MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE)
741*b0563631STom Van Eyck     /**
742*b0563631STom Van Eyck      * Flag indicating if, in the course of the current handshake, a dummy
743*b0563631STom Van Eyck      * change_cipher_spec (CCS) record has already been sent. Used to send only
744*b0563631STom Van Eyck      * one CCS per handshake while not complicating the handshake state
745*b0563631STom Van Eyck      * transitions for that purpose.
746*b0563631STom Van Eyck      */
747*b0563631STom Van Eyck     uint8_t ccs_sent;
748*b0563631STom Van Eyck #endif
74932b31808SJens Wiklander 
75032b31808SJens Wiklander #if defined(MBEDTLS_SSL_SRV_C)
75132b31808SJens Wiklander #if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_PSK_ENABLED)
75232b31808SJens Wiklander     uint8_t tls13_kex_modes; /*!< Key exchange modes supported by the client */
75332b31808SJens Wiklander #endif
754*b0563631STom Van Eyck     /** selected_group of key_share extension in HelloRetryRequest message. */
755*b0563631STom Van Eyck     uint16_t hrr_selected_group;
75632b31808SJens Wiklander #if defined(MBEDTLS_SSL_SESSION_TICKETS)
75732b31808SJens Wiklander     uint16_t new_session_tickets_count;         /*!< number of session tickets */
75832b31808SJens Wiklander #endif
75932b31808SJens Wiklander #endif /* MBEDTLS_SSL_SRV_C */
76032b31808SJens Wiklander 
76132b31808SJens Wiklander #endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
76232b31808SJens Wiklander 
76332b31808SJens Wiklander #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED)
76432b31808SJens Wiklander     uint16_t received_sig_algs[MBEDTLS_RECEIVED_SIG_ALGS_SIZE];
76532b31808SJens Wiklander #endif
76632b31808SJens Wiklander 
76732b31808SJens Wiklander #if !defined(MBEDTLS_DEPRECATED_REMOVED)
76832b31808SJens Wiklander     const uint16_t *group_list;
76932b31808SJens Wiklander     const uint16_t *sig_algs;
77032b31808SJens Wiklander #endif
77132b31808SJens Wiklander 
77232b31808SJens Wiklander #if defined(MBEDTLS_DHM_C)
77332b31808SJens Wiklander     mbedtls_dhm_context dhm_ctx;                /*!<  DHM key exchange        */
77432b31808SJens Wiklander #endif
77532b31808SJens Wiklander 
776*b0563631STom Van Eyck #if !defined(MBEDTLS_USE_PSA_CRYPTO) && \
777*b0563631STom Van Eyck     defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED)
77832b31808SJens Wiklander     mbedtls_ecdh_context ecdh_ctx;              /*!<  ECDH key exchange       */
779*b0563631STom Van Eyck #endif /* !MBEDTLS_USE_PSA_CRYPTO &&
780*b0563631STom Van Eyck           MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED */
78132b31808SJens Wiklander 
782*b0563631STom Van Eyck #if defined(MBEDTLS_KEY_EXCHANGE_SOME_XXDH_PSA_ANY_ENABLED)
783*b0563631STom Van Eyck     psa_key_type_t xxdh_psa_type;
784*b0563631STom Van Eyck     size_t xxdh_psa_bits;
785*b0563631STom Van Eyck     mbedtls_svc_key_id_t xxdh_psa_privkey;
786*b0563631STom Van Eyck     uint8_t xxdh_psa_privkey_is_external;
787*b0563631STom Van Eyck     unsigned char xxdh_psa_peerkey[PSA_EXPORT_PUBLIC_KEY_MAX_SIZE];
788*b0563631STom Van Eyck     size_t xxdh_psa_peerkey_len;
789*b0563631STom Van Eyck #endif /* MBEDTLS_KEY_EXCHANGE_SOME_XXDH_PSA_ANY_ENABLED */
79032b31808SJens Wiklander 
79132b31808SJens Wiklander #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
79232b31808SJens Wiklander #if defined(MBEDTLS_USE_PSA_CRYPTO)
79332b31808SJens Wiklander     psa_pake_operation_t psa_pake_ctx;        /*!< EC J-PAKE key exchange */
79432b31808SJens Wiklander     mbedtls_svc_key_id_t psa_pake_password;
79532b31808SJens Wiklander     uint8_t psa_pake_ctx_is_ok;
79632b31808SJens Wiklander #else
79732b31808SJens Wiklander     mbedtls_ecjpake_context ecjpake_ctx;        /*!< EC J-PAKE key exchange */
79832b31808SJens Wiklander #endif /* MBEDTLS_USE_PSA_CRYPTO */
79932b31808SJens Wiklander #if defined(MBEDTLS_SSL_CLI_C)
80032b31808SJens Wiklander     unsigned char *ecjpake_cache;               /*!< Cache for ClientHello ext */
80132b31808SJens Wiklander     size_t ecjpake_cache_len;                   /*!< Length of cached data */
80232b31808SJens Wiklander #endif
80332b31808SJens Wiklander #endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
80432b31808SJens Wiklander 
805*b0563631STom Van Eyck #if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_ANY_ENABLED) || \
806*b0563631STom Van Eyck     defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ANY_ALLOWED_ENABLED) || \
80732b31808SJens Wiklander     defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
80832b31808SJens Wiklander     uint16_t *curves_tls_id;      /*!<  List of TLS IDs of supported elliptic curves */
80932b31808SJens Wiklander #endif
81032b31808SJens Wiklander 
81132b31808SJens Wiklander #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_PSK_ENABLED)
81232b31808SJens Wiklander #if defined(MBEDTLS_USE_PSA_CRYPTO)
81332b31808SJens Wiklander     mbedtls_svc_key_id_t psk_opaque;            /*!< Opaque PSK from the callback   */
81432b31808SJens Wiklander     uint8_t psk_opaque_is_internal;
81532b31808SJens Wiklander #else
81632b31808SJens Wiklander     unsigned char *psk;                 /*!<  PSK from the callback         */
81732b31808SJens Wiklander     size_t psk_len;                     /*!<  Length of PSK from callback   */
81832b31808SJens Wiklander #endif /* MBEDTLS_USE_PSA_CRYPTO */
81932b31808SJens Wiklander     uint16_t    selected_identity;
82032b31808SJens Wiklander #endif /* MBEDTLS_SSL_HANDSHAKE_WITH_PSK_ENABLED */
82132b31808SJens Wiklander 
82232b31808SJens Wiklander #if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
82332b31808SJens Wiklander     mbedtls_x509_crt_restart_ctx ecrs_ctx;  /*!< restart context            */
82432b31808SJens Wiklander #endif
82532b31808SJens Wiklander 
82632b31808SJens Wiklander #if defined(MBEDTLS_X509_CRT_PARSE_C)
82732b31808SJens Wiklander     mbedtls_ssl_key_cert *key_cert;     /*!< chosen key/cert pair (server)  */
82832b31808SJens Wiklander #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
82932b31808SJens Wiklander     mbedtls_ssl_key_cert *sni_key_cert; /*!< key/cert list from SNI         */
83032b31808SJens Wiklander     mbedtls_x509_crt *sni_ca_chain;     /*!< trusted CAs from SNI callback  */
83132b31808SJens Wiklander     mbedtls_x509_crl *sni_ca_crl;       /*!< trusted CAs CRLs from SNI      */
83232b31808SJens Wiklander #endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
83332b31808SJens Wiklander #endif /* MBEDTLS_X509_CRT_PARSE_C */
83432b31808SJens Wiklander 
83532b31808SJens Wiklander #if defined(MBEDTLS_X509_CRT_PARSE_C) &&        \
83632b31808SJens Wiklander     !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
83732b31808SJens Wiklander     mbedtls_pk_context peer_pubkey;     /*!< The public key from the peer.  */
83832b31808SJens Wiklander #endif /* MBEDTLS_X509_CRT_PARSE_C && !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
83932b31808SJens Wiklander 
84032b31808SJens Wiklander     struct {
84132b31808SJens Wiklander         size_t total_bytes_buffered; /*!< Cumulative size of heap allocated
84232b31808SJens Wiklander                                       *   buffers used for message buffering. */
84332b31808SJens Wiklander 
84432b31808SJens Wiklander         uint8_t seen_ccs;               /*!< Indicates if a CCS message has
84532b31808SJens Wiklander                                          *   been seen in the current flight. */
84632b31808SJens Wiklander 
84732b31808SJens Wiklander         struct mbedtls_ssl_hs_buffer {
84832b31808SJens Wiklander             unsigned is_valid      : 1;
84932b31808SJens Wiklander             unsigned is_fragmented : 1;
85032b31808SJens Wiklander             unsigned is_complete   : 1;
85132b31808SJens Wiklander             unsigned char *data;
85232b31808SJens Wiklander             size_t data_len;
85332b31808SJens Wiklander         } hs[MBEDTLS_SSL_MAX_BUFFERED_HS];
85432b31808SJens Wiklander 
85532b31808SJens Wiklander         struct {
85632b31808SJens Wiklander             unsigned char *data;
85732b31808SJens Wiklander             size_t len;
85832b31808SJens Wiklander             unsigned epoch;
85932b31808SJens Wiklander         } future_record;
86032b31808SJens Wiklander 
86132b31808SJens Wiklander     } buffering;
86232b31808SJens Wiklander 
86332b31808SJens Wiklander #if defined(MBEDTLS_SSL_CLI_C) && \
86432b31808SJens Wiklander     (defined(MBEDTLS_SSL_PROTO_DTLS) || \
86532b31808SJens Wiklander     defined(MBEDTLS_SSL_PROTO_TLS1_3))
86632b31808SJens Wiklander     unsigned char *cookie;              /*!< HelloVerifyRequest cookie for DTLS
86732b31808SJens Wiklander                                          *   HelloRetryRequest cookie for TLS 1.3 */
86832b31808SJens Wiklander #if !defined(MBEDTLS_SSL_PROTO_TLS1_3)
86932b31808SJens Wiklander     /* RFC 6347 page 15
87032b31808SJens Wiklander        ...
87132b31808SJens Wiklander        opaque cookie<0..2^8-1>;
87232b31808SJens Wiklander        ...
87332b31808SJens Wiklander      */
87432b31808SJens Wiklander     uint8_t cookie_len;
87532b31808SJens Wiklander #else
87632b31808SJens Wiklander     /* RFC 8446 page 39
87732b31808SJens Wiklander        ...
87832b31808SJens Wiklander        opaque cookie<0..2^16-1>;
87932b31808SJens Wiklander        ...
88032b31808SJens Wiklander        If TLS1_3 is enabled, the max length is 2^16 - 1
88132b31808SJens Wiklander      */
88232b31808SJens Wiklander     uint16_t cookie_len;                /*!< DTLS: HelloVerifyRequest cookie length
88332b31808SJens Wiklander                                          *   TLS1_3: HelloRetryRequest cookie length */
88432b31808SJens Wiklander #endif
88532b31808SJens Wiklander #endif /* MBEDTLS_SSL_CLI_C &&
88632b31808SJens Wiklander           ( MBEDTLS_SSL_PROTO_DTLS ||
88732b31808SJens Wiklander             MBEDTLS_SSL_PROTO_TLS1_3 ) */
88832b31808SJens Wiklander #if defined(MBEDTLS_SSL_SRV_C) && defined(MBEDTLS_SSL_PROTO_DTLS)
88932b31808SJens Wiklander     unsigned char cookie_verify_result; /*!< Srv: flag for sending a cookie */
89032b31808SJens Wiklander #endif /* MBEDTLS_SSL_SRV_C && MBEDTLS_SSL_PROTO_DTLS */
89132b31808SJens Wiklander 
89232b31808SJens Wiklander #if defined(MBEDTLS_SSL_PROTO_DTLS)
89332b31808SJens Wiklander     unsigned int out_msg_seq;           /*!<  Outgoing handshake sequence number */
89432b31808SJens Wiklander     unsigned int in_msg_seq;            /*!<  Incoming handshake sequence number */
89532b31808SJens Wiklander 
89632b31808SJens Wiklander     uint32_t retransmit_timeout;        /*!<  Current value of timeout       */
89732b31808SJens Wiklander     mbedtls_ssl_flight_item *flight;    /*!<  Current outgoing flight        */
89832b31808SJens Wiklander     mbedtls_ssl_flight_item *cur_msg;   /*!<  Current message in flight      */
89932b31808SJens Wiklander     unsigned char *cur_msg_p;           /*!<  Position in current message    */
90032b31808SJens Wiklander     unsigned int in_flight_start_seq;   /*!<  Minimum message sequence in the
90132b31808SJens Wiklander                                               flight being received          */
90232b31808SJens Wiklander     mbedtls_ssl_transform *alt_transform_out;   /*!<  Alternative transform for
90332b31808SJens Wiklander                                                    resending messages             */
90432b31808SJens Wiklander     unsigned char alt_out_ctr[MBEDTLS_SSL_SEQUENCE_NUMBER_LEN]; /*!<  Alternative record epoch/counter
90532b31808SJens Wiklander                                                                       for resending messages         */
90632b31808SJens Wiklander 
90732b31808SJens Wiklander #if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
90832b31808SJens Wiklander     /* The state of CID configuration in this handshake. */
90932b31808SJens Wiklander 
91032b31808SJens Wiklander     uint8_t cid_in_use; /*!< This indicates whether the use of the CID extension
91132b31808SJens Wiklander                          *   has been negotiated. Possible values are
91232b31808SJens Wiklander                          *   #MBEDTLS_SSL_CID_ENABLED and
91332b31808SJens Wiklander                          *   #MBEDTLS_SSL_CID_DISABLED. */
91432b31808SJens Wiklander     unsigned char peer_cid[MBEDTLS_SSL_CID_OUT_LEN_MAX];   /*! The peer's CID */
91532b31808SJens Wiklander     uint8_t peer_cid_len;                                  /*!< The length of
91632b31808SJens Wiklander                                                             *   \c peer_cid.  */
91732b31808SJens Wiklander #endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
91832b31808SJens Wiklander 
91932b31808SJens Wiklander     uint16_t mtu;                       /*!<  Handshake mtu, used to fragment outgoing messages */
92032b31808SJens Wiklander #endif /* MBEDTLS_SSL_PROTO_DTLS */
92132b31808SJens Wiklander 
92232b31808SJens Wiklander     /*
92332b31808SJens Wiklander      * Checksum contexts
92432b31808SJens Wiklander      */
925*b0563631STom Van Eyck #if defined(MBEDTLS_MD_CAN_SHA256)
92632b31808SJens Wiklander #if defined(MBEDTLS_USE_PSA_CRYPTO)
92732b31808SJens Wiklander     psa_hash_operation_t fin_sha256_psa;
92832b31808SJens Wiklander #else
92932b31808SJens Wiklander     mbedtls_md_context_t fin_sha256;
93032b31808SJens Wiklander #endif
93132b31808SJens Wiklander #endif
932*b0563631STom Van Eyck #if defined(MBEDTLS_MD_CAN_SHA384)
93332b31808SJens Wiklander #if defined(MBEDTLS_USE_PSA_CRYPTO)
93432b31808SJens Wiklander     psa_hash_operation_t fin_sha384_psa;
93532b31808SJens Wiklander #else
93632b31808SJens Wiklander     mbedtls_md_context_t fin_sha384;
93732b31808SJens Wiklander #endif
93832b31808SJens Wiklander #endif
93932b31808SJens Wiklander 
94032b31808SJens Wiklander #if defined(MBEDTLS_SSL_PROTO_TLS1_3)
94132b31808SJens Wiklander     uint16_t offered_group_id; /* The NamedGroup value for the group
94232b31808SJens Wiklander                                 * that is being used for ephemeral
94332b31808SJens Wiklander                                 * key exchange.
94432b31808SJens Wiklander                                 *
94532b31808SJens Wiklander                                 * On the client: Defaults to the first
94632b31808SJens Wiklander                                 * entry in the client's group list,
94732b31808SJens Wiklander                                 * but can be overwritten by the HRR. */
94832b31808SJens Wiklander #endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
94932b31808SJens Wiklander 
95032b31808SJens Wiklander #if defined(MBEDTLS_SSL_CLI_C)
95132b31808SJens Wiklander     uint8_t client_auth;       /*!< used to check if CertificateRequest has been
95232b31808SJens Wiklander                                     received from server side. If CertificateRequest
95332b31808SJens Wiklander                                     has been received, Certificate and CertificateVerify
95432b31808SJens Wiklander                                     should be sent to server */
95532b31808SJens Wiklander #endif /* MBEDTLS_SSL_CLI_C */
95632b31808SJens Wiklander     /*
95732b31808SJens Wiklander      * State-local variables used during the processing
95832b31808SJens Wiklander      * of a specific handshake state.
95932b31808SJens Wiklander      */
96032b31808SJens Wiklander     union {
96132b31808SJens Wiklander         /* Outgoing Finished message */
96232b31808SJens Wiklander         struct {
96332b31808SJens Wiklander             uint8_t preparation_done;
96432b31808SJens Wiklander 
96532b31808SJens Wiklander             /* Buffer holding digest of the handshake up to
96632b31808SJens Wiklander              * but excluding the outgoing finished message. */
96732b31808SJens Wiklander             unsigned char digest[MBEDTLS_TLS1_3_MD_MAX_SIZE];
96832b31808SJens Wiklander             size_t digest_len;
96932b31808SJens Wiklander         } finished_out;
97032b31808SJens Wiklander 
97132b31808SJens Wiklander         /* Incoming Finished message */
97232b31808SJens Wiklander         struct {
97332b31808SJens Wiklander             uint8_t preparation_done;
97432b31808SJens Wiklander 
97532b31808SJens Wiklander             /* Buffer holding digest of the handshake up to but
97632b31808SJens Wiklander              * excluding the peer's incoming finished message. */
97732b31808SJens Wiklander             unsigned char digest[MBEDTLS_TLS1_3_MD_MAX_SIZE];
97832b31808SJens Wiklander             size_t digest_len;
97932b31808SJens Wiklander         } finished_in;
98032b31808SJens Wiklander 
98132b31808SJens Wiklander     } state_local;
98232b31808SJens Wiklander 
98332b31808SJens Wiklander     /* End of state-local variables. */
98432b31808SJens Wiklander 
98532b31808SJens Wiklander     unsigned char randbytes[MBEDTLS_CLIENT_HELLO_RANDOM_LEN +
98632b31808SJens Wiklander                             MBEDTLS_SERVER_HELLO_RANDOM_LEN];
98732b31808SJens Wiklander     /*!<  random bytes            */
98832b31808SJens Wiklander #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
98932b31808SJens Wiklander     unsigned char premaster[MBEDTLS_PREMASTER_SIZE];
99032b31808SJens Wiklander     /*!<  premaster secret        */
99132b31808SJens Wiklander     size_t pmslen;                      /*!<  premaster length        */
99232b31808SJens Wiklander #endif
99332b31808SJens Wiklander 
99432b31808SJens Wiklander #if defined(MBEDTLS_SSL_PROTO_TLS1_3)
99532b31808SJens Wiklander     uint32_t sent_extensions;       /*!< extensions sent by endpoint */
99632b31808SJens Wiklander     uint32_t received_extensions;   /*!< extensions received by endpoint */
99732b31808SJens Wiklander 
99832b31808SJens Wiklander #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED)
99932b31808SJens Wiklander     unsigned char certificate_request_context_len;
100032b31808SJens Wiklander     unsigned char *certificate_request_context;
100132b31808SJens Wiklander #endif
100232b31808SJens Wiklander 
100332b31808SJens Wiklander     /** TLS 1.3 transform for encrypted handshake messages. */
100432b31808SJens Wiklander     mbedtls_ssl_transform *transform_handshake;
100532b31808SJens Wiklander     union {
100632b31808SJens Wiklander         unsigned char early[MBEDTLS_TLS1_3_MD_MAX_SIZE];
100732b31808SJens Wiklander         unsigned char handshake[MBEDTLS_TLS1_3_MD_MAX_SIZE];
100832b31808SJens Wiklander         unsigned char app[MBEDTLS_TLS1_3_MD_MAX_SIZE];
100932b31808SJens Wiklander     } tls13_master_secrets;
101032b31808SJens Wiklander 
101132b31808SJens Wiklander     mbedtls_ssl_tls13_handshake_secrets tls13_hs_secrets;
101232b31808SJens Wiklander #if defined(MBEDTLS_SSL_EARLY_DATA)
101332b31808SJens Wiklander     /** TLS 1.3 transform for early data and handshake messages. */
101432b31808SJens Wiklander     mbedtls_ssl_transform *transform_earlydata;
101532b31808SJens Wiklander #endif
101632b31808SJens Wiklander #endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
101732b31808SJens Wiklander 
101832b31808SJens Wiklander #if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
101932b31808SJens Wiklander     /** Asynchronous operation context. This field is meant for use by the
102032b31808SJens Wiklander      * asynchronous operation callbacks (mbedtls_ssl_config::f_async_sign_start,
102132b31808SJens Wiklander      * mbedtls_ssl_config::f_async_decrypt_start,
102232b31808SJens Wiklander      * mbedtls_ssl_config::f_async_resume, mbedtls_ssl_config::f_async_cancel).
102332b31808SJens Wiklander      * The library does not use it internally. */
102432b31808SJens Wiklander     void *user_async_ctx;
102532b31808SJens Wiklander #endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
102632b31808SJens Wiklander 
102732b31808SJens Wiklander #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
102832b31808SJens Wiklander     const unsigned char *sni_name;      /*!< raw SNI                        */
102932b31808SJens Wiklander     size_t sni_name_len;                /*!< raw SNI len                    */
103032b31808SJens Wiklander #if defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED)
103132b31808SJens Wiklander     const mbedtls_x509_crt *dn_hints;   /*!< acceptable client cert issuers */
103232b31808SJens Wiklander #endif
103332b31808SJens Wiklander #endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
103432b31808SJens Wiklander };
103532b31808SJens Wiklander 
103632b31808SJens Wiklander typedef struct mbedtls_ssl_hs_buffer mbedtls_ssl_hs_buffer;
103732b31808SJens Wiklander 
103832b31808SJens Wiklander /*
103932b31808SJens Wiklander  * Representation of decryption/encryption transformations on records
104032b31808SJens Wiklander  *
104132b31808SJens Wiklander  * There are the following general types of record transformations:
104232b31808SJens Wiklander  * - Stream transformations (TLS versions == 1.2 only)
104332b31808SJens Wiklander  *   Transformation adding a MAC and applying a stream-cipher
104432b31808SJens Wiklander  *   to the authenticated message.
104532b31808SJens Wiklander  * - CBC block cipher transformations ([D]TLS versions == 1.2 only)
104632b31808SJens Wiklander  *   For TLS 1.2, no IV is generated at key extraction time, but every
104732b31808SJens Wiklander  *   encrypted record is explicitly prefixed by the IV with which it was
104832b31808SJens Wiklander  *   encrypted.
104932b31808SJens Wiklander  * - AEAD transformations ([D]TLS versions == 1.2 only)
105032b31808SJens Wiklander  *   These come in two fundamentally different versions, the first one
105132b31808SJens Wiklander  *   used in TLS 1.2, excluding ChaChaPoly ciphersuites, and the second
105232b31808SJens Wiklander  *   one used for ChaChaPoly ciphersuites in TLS 1.2 as well as for TLS 1.3.
105332b31808SJens Wiklander  *   In the first transformation, the IV to be used for a record is obtained
105432b31808SJens Wiklander  *   as the concatenation of an explicit, static 4-byte IV and the 8-byte
105532b31808SJens Wiklander  *   record sequence number, and explicitly prepending this sequence number
105632b31808SJens Wiklander  *   to the encrypted record. In contrast, in the second transformation
105732b31808SJens Wiklander  *   the IV is obtained by XOR'ing a static IV obtained at key extraction
105832b31808SJens Wiklander  *   time with the 8-byte record sequence number, without prepending the
105932b31808SJens Wiklander  *   latter to the encrypted record.
106032b31808SJens Wiklander  *
106132b31808SJens Wiklander  * Additionally, DTLS 1.2 + CID as well as TLS 1.3 use an inner plaintext
106232b31808SJens Wiklander  * which allows to add flexible length padding and to hide a record's true
106332b31808SJens Wiklander  * content type.
106432b31808SJens Wiklander  *
106532b31808SJens Wiklander  * In addition to type and version, the following parameters are relevant:
106632b31808SJens Wiklander  * - The symmetric cipher algorithm to be used.
106732b31808SJens Wiklander  * - The (static) encryption/decryption keys for the cipher.
106832b31808SJens Wiklander  * - For stream/CBC, the type of message digest to be used.
106932b31808SJens Wiklander  * - For stream/CBC, (static) encryption/decryption keys for the digest.
107032b31808SJens Wiklander  * - For AEAD transformations, the size (potentially 0) of an explicit,
107132b31808SJens Wiklander  *   random initialization vector placed in encrypted records.
107232b31808SJens Wiklander  * - For some transformations (currently AEAD) an implicit IV. It is static
107332b31808SJens Wiklander  *   and (if present) is combined with the explicit IV in a transformation-
107432b31808SJens Wiklander  *   -dependent way (e.g. appending in TLS 1.2 and XOR'ing in TLS 1.3).
107532b31808SJens Wiklander  * - For stream/CBC, a flag determining the order of encryption and MAC.
107632b31808SJens Wiklander  * - The details of the transformation depend on the SSL/TLS version.
107732b31808SJens Wiklander  * - The length of the authentication tag.
107832b31808SJens Wiklander  *
107932b31808SJens Wiklander  * The struct below refines this abstract view as follows:
108032b31808SJens Wiklander  * - The cipher underlying the transformation is managed in
108132b31808SJens Wiklander  *   cipher contexts cipher_ctx_{enc/dec}, which must have the
108232b31808SJens Wiklander  *   same cipher type. The mode of these cipher contexts determines
108332b31808SJens Wiklander  *   the type of the transformation in the sense above: e.g., if
108432b31808SJens Wiklander  *   the type is MBEDTLS_CIPHER_AES_256_CBC resp. MBEDTLS_CIPHER_AES_192_GCM
108532b31808SJens Wiklander  *   then the transformation has type CBC resp. AEAD.
108632b31808SJens Wiklander  * - The cipher keys are never stored explicitly but
108732b31808SJens Wiklander  *   are maintained within cipher_ctx_{enc/dec}.
108832b31808SJens Wiklander  * - For stream/CBC transformations, the message digest contexts
108932b31808SJens Wiklander  *   used for the MAC's are stored in md_ctx_{enc/dec}. These contexts
109032b31808SJens Wiklander  *   are unused for AEAD transformations.
109132b31808SJens Wiklander  * - For stream/CBC transformations, the MAC keys are not stored explicitly
109232b31808SJens Wiklander  *   but maintained within md_ctx_{enc/dec}.
109332b31808SJens Wiklander  * - The mac_enc and mac_dec fields are unused for EAD transformations.
109432b31808SJens Wiklander  * - For transformations using an implicit IV maintained within
109532b31808SJens Wiklander  *   the transformation context, its contents are stored within
109632b31808SJens Wiklander  *   iv_{enc/dec}.
109732b31808SJens Wiklander  * - The value of ivlen indicates the length of the IV.
109832b31808SJens Wiklander  *   This is redundant in case of stream/CBC transformations
109932b31808SJens Wiklander  *   which always use 0 resp. the cipher's block length as the
110032b31808SJens Wiklander  *   IV length, but is needed for AEAD ciphers and may be
110132b31808SJens Wiklander  *   different from the underlying cipher's block length
110232b31808SJens Wiklander  *   in this case.
110332b31808SJens Wiklander  * - The field fixed_ivlen is nonzero for AEAD transformations only
110432b31808SJens Wiklander  *   and indicates the length of the static part of the IV which is
110532b31808SJens Wiklander  *   constant throughout the communication, and which is stored in
110632b31808SJens Wiklander  *   the first fixed_ivlen bytes of the iv_{enc/dec} arrays.
110732b31808SJens Wiklander  * - tls_version denotes the 2-byte TLS version
110832b31808SJens Wiklander  * - For stream/CBC transformations, maclen denotes the length of the
110932b31808SJens Wiklander  *   authentication tag, while taglen is unused and 0.
111032b31808SJens Wiklander  * - For AEAD transformations, taglen denotes the length of the
111132b31808SJens Wiklander  *   authentication tag, while maclen is unused and 0.
111232b31808SJens Wiklander  * - For CBC transformations, encrypt_then_mac determines the
111332b31808SJens Wiklander  *   order of encryption and authentication. This field is unused
111432b31808SJens Wiklander  *   in other transformations.
111532b31808SJens Wiklander  *
111632b31808SJens Wiklander  */
111732b31808SJens Wiklander struct mbedtls_ssl_transform {
111832b31808SJens Wiklander     /*
111932b31808SJens Wiklander      * Session specific crypto layer
112032b31808SJens Wiklander      */
112132b31808SJens Wiklander     size_t minlen;                      /*!<  min. ciphertext length  */
112232b31808SJens Wiklander     size_t ivlen;                       /*!<  IV length               */
112332b31808SJens Wiklander     size_t fixed_ivlen;                 /*!<  Fixed part of IV (AEAD) */
112432b31808SJens Wiklander     size_t maclen;                      /*!<  MAC(CBC) len            */
112532b31808SJens Wiklander     size_t taglen;                      /*!<  TAG(AEAD) len           */
112632b31808SJens Wiklander 
112732b31808SJens Wiklander     unsigned char iv_enc[16];           /*!<  IV (encryption)         */
112832b31808SJens Wiklander     unsigned char iv_dec[16];           /*!<  IV (decryption)         */
112932b31808SJens Wiklander 
113032b31808SJens Wiklander #if defined(MBEDTLS_SSL_SOME_SUITES_USE_MAC)
113132b31808SJens Wiklander 
113232b31808SJens Wiklander #if defined(MBEDTLS_USE_PSA_CRYPTO)
113332b31808SJens Wiklander     mbedtls_svc_key_id_t psa_mac_enc;           /*!<  MAC (encryption)        */
113432b31808SJens Wiklander     mbedtls_svc_key_id_t psa_mac_dec;           /*!<  MAC (decryption)        */
113532b31808SJens Wiklander     psa_algorithm_t psa_mac_alg;                /*!<  psa MAC algorithm       */
113632b31808SJens Wiklander #else
113732b31808SJens Wiklander     mbedtls_md_context_t md_ctx_enc;            /*!<  MAC (encryption)        */
113832b31808SJens Wiklander     mbedtls_md_context_t md_ctx_dec;            /*!<  MAC (decryption)        */
113932b31808SJens Wiklander #endif /* MBEDTLS_USE_PSA_CRYPTO */
114032b31808SJens Wiklander 
114132b31808SJens Wiklander #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
114232b31808SJens Wiklander     int encrypt_then_mac;       /*!< flag for EtM activation                */
114332b31808SJens Wiklander #endif
114432b31808SJens Wiklander 
114532b31808SJens Wiklander #endif /* MBEDTLS_SSL_SOME_SUITES_USE_MAC */
114632b31808SJens Wiklander 
114732b31808SJens Wiklander     mbedtls_ssl_protocol_version tls_version;
114832b31808SJens Wiklander 
114932b31808SJens Wiklander #if defined(MBEDTLS_USE_PSA_CRYPTO)
115032b31808SJens Wiklander     mbedtls_svc_key_id_t psa_key_enc;           /*!<  psa encryption key      */
115132b31808SJens Wiklander     mbedtls_svc_key_id_t psa_key_dec;           /*!<  psa decryption key      */
115232b31808SJens Wiklander     psa_algorithm_t psa_alg;                    /*!<  psa algorithm           */
115332b31808SJens Wiklander #else
115432b31808SJens Wiklander     mbedtls_cipher_context_t cipher_ctx_enc;    /*!<  encryption context      */
115532b31808SJens Wiklander     mbedtls_cipher_context_t cipher_ctx_dec;    /*!<  decryption context      */
115632b31808SJens Wiklander #endif /* MBEDTLS_USE_PSA_CRYPTO */
115732b31808SJens Wiklander 
115832b31808SJens Wiklander #if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
115932b31808SJens Wiklander     uint8_t in_cid_len;
116032b31808SJens Wiklander     uint8_t out_cid_len;
116132b31808SJens Wiklander     unsigned char in_cid[MBEDTLS_SSL_CID_IN_LEN_MAX];
116232b31808SJens Wiklander     unsigned char out_cid[MBEDTLS_SSL_CID_OUT_LEN_MAX];
116332b31808SJens Wiklander #endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
116432b31808SJens Wiklander 
116532b31808SJens Wiklander #if defined(MBEDTLS_SSL_CONTEXT_SERIALIZATION)
116632b31808SJens Wiklander     /* We need the Hello random bytes in order to re-derive keys from the
116732b31808SJens Wiklander      * Master Secret and other session info,
116832b31808SJens Wiklander      * see ssl_tls12_populate_transform() */
116932b31808SJens Wiklander     unsigned char randbytes[MBEDTLS_SERVER_HELLO_RANDOM_LEN +
117032b31808SJens Wiklander                             MBEDTLS_CLIENT_HELLO_RANDOM_LEN];
117132b31808SJens Wiklander     /*!< ServerHello.random+ClientHello.random */
117232b31808SJens Wiklander #endif /* MBEDTLS_SSL_CONTEXT_SERIALIZATION */
117332b31808SJens Wiklander };
117432b31808SJens Wiklander 
117532b31808SJens Wiklander /*
117632b31808SJens Wiklander  * Return 1 if the transform uses an AEAD cipher, 0 otherwise.
117732b31808SJens Wiklander  * Equivalently, return 0 if a separate MAC is used, 1 otherwise.
117832b31808SJens Wiklander  */
117932b31808SJens Wiklander static inline int mbedtls_ssl_transform_uses_aead(
118032b31808SJens Wiklander     const mbedtls_ssl_transform *transform)
118132b31808SJens Wiklander {
118232b31808SJens Wiklander #if defined(MBEDTLS_SSL_SOME_SUITES_USE_MAC)
118332b31808SJens Wiklander     return transform->maclen == 0 && transform->taglen != 0;
118432b31808SJens Wiklander #else
118532b31808SJens Wiklander     (void) transform;
118632b31808SJens Wiklander     return 1;
118732b31808SJens Wiklander #endif
118832b31808SJens Wiklander }
118932b31808SJens Wiklander 
119032b31808SJens Wiklander /*
119132b31808SJens Wiklander  * Internal representation of record frames
119232b31808SJens Wiklander  *
119332b31808SJens Wiklander  * Instances come in two flavors:
119432b31808SJens Wiklander  * (1) Encrypted
119532b31808SJens Wiklander  *     These always have data_offset = 0
119632b31808SJens Wiklander  * (2) Unencrypted
119732b31808SJens Wiklander  *     These have data_offset set to the amount of
119832b31808SJens Wiklander  *     pre-expansion during record protection. Concretely,
119932b31808SJens Wiklander  *     this is the length of the fixed part of the explicit IV
120032b31808SJens Wiklander  *     used for encryption, or 0 if no explicit IV is used
120132b31808SJens Wiklander  *     (e.g. for stream ciphers).
120232b31808SJens Wiklander  *
120332b31808SJens Wiklander  * The reason for the data_offset in the unencrypted case
120432b31808SJens Wiklander  * is to allow for in-place conversion of an unencrypted to
120532b31808SJens Wiklander  * an encrypted record. If the offset wasn't included, the
120632b31808SJens Wiklander  * encrypted content would need to be shifted afterwards to
120732b31808SJens Wiklander  * make space for the fixed IV.
120832b31808SJens Wiklander  *
120932b31808SJens Wiklander  */
121032b31808SJens Wiklander #if MBEDTLS_SSL_CID_OUT_LEN_MAX > MBEDTLS_SSL_CID_IN_LEN_MAX
121132b31808SJens Wiklander #define MBEDTLS_SSL_CID_LEN_MAX MBEDTLS_SSL_CID_OUT_LEN_MAX
121232b31808SJens Wiklander #else
121332b31808SJens Wiklander #define MBEDTLS_SSL_CID_LEN_MAX MBEDTLS_SSL_CID_IN_LEN_MAX
121432b31808SJens Wiklander #endif
121532b31808SJens Wiklander 
121632b31808SJens Wiklander typedef struct {
121732b31808SJens Wiklander     uint8_t ctr[MBEDTLS_SSL_SEQUENCE_NUMBER_LEN];  /* In TLS:  The implicit record sequence number.
121832b31808SJens Wiklander                                                     * In DTLS: The 2-byte epoch followed by
121932b31808SJens Wiklander                                                     *          the 6-byte sequence number.
122032b31808SJens Wiklander                                                     * This is stored as a raw big endian byte array
122132b31808SJens Wiklander                                                     * as opposed to a uint64_t because we rarely
122232b31808SJens Wiklander                                                     * need to perform arithmetic on this, but do
122332b31808SJens Wiklander                                                     * need it as a Byte array for the purpose of
122432b31808SJens Wiklander                                                     * MAC computations.                             */
122532b31808SJens Wiklander     uint8_t type;           /* The record content type.                      */
122632b31808SJens Wiklander     uint8_t ver[2];         /* SSL/TLS version as present on the wire.
122732b31808SJens Wiklander                              * Convert to internal presentation of versions
122832b31808SJens Wiklander                              * using mbedtls_ssl_read_version() and
122932b31808SJens Wiklander                              * mbedtls_ssl_write_version().
123032b31808SJens Wiklander                              * Keep wire-format for MAC computations.        */
123132b31808SJens Wiklander 
123232b31808SJens Wiklander     unsigned char *buf;     /* Memory buffer enclosing the record content    */
123332b31808SJens Wiklander     size_t buf_len;         /* Buffer length                                 */
123432b31808SJens Wiklander     size_t data_offset;     /* Offset of record content                      */
123532b31808SJens Wiklander     size_t data_len;        /* Length of record content                      */
123632b31808SJens Wiklander 
123732b31808SJens Wiklander #if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
123832b31808SJens Wiklander     uint8_t cid_len;        /* Length of the CID (0 if not present)          */
123932b31808SJens Wiklander     unsigned char cid[MBEDTLS_SSL_CID_LEN_MAX];   /* The CID                 */
124032b31808SJens Wiklander #endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
124132b31808SJens Wiklander } mbedtls_record;
124232b31808SJens Wiklander 
124332b31808SJens Wiklander #if defined(MBEDTLS_X509_CRT_PARSE_C)
124432b31808SJens Wiklander /*
124532b31808SJens Wiklander  * List of certificate + private key pairs
124632b31808SJens Wiklander  */
124732b31808SJens Wiklander struct mbedtls_ssl_key_cert {
124832b31808SJens Wiklander     mbedtls_x509_crt *cert;                 /*!< cert                       */
124932b31808SJens Wiklander     mbedtls_pk_context *key;                /*!< private key                */
125032b31808SJens Wiklander     mbedtls_ssl_key_cert *next;             /*!< next key/cert pair         */
125132b31808SJens Wiklander };
125232b31808SJens Wiklander #endif /* MBEDTLS_X509_CRT_PARSE_C */
125332b31808SJens Wiklander 
125432b31808SJens Wiklander #if defined(MBEDTLS_SSL_PROTO_DTLS)
125532b31808SJens Wiklander /*
125632b31808SJens Wiklander  * List of handshake messages kept around for resending
125732b31808SJens Wiklander  */
125832b31808SJens Wiklander struct mbedtls_ssl_flight_item {
125932b31808SJens Wiklander     unsigned char *p;       /*!< message, including handshake headers   */
126032b31808SJens Wiklander     size_t len;             /*!< length of p                            */
126132b31808SJens Wiklander     unsigned char type;     /*!< type of the message: handshake or CCS  */
126232b31808SJens Wiklander     mbedtls_ssl_flight_item *next;  /*!< next handshake message(s)              */
126332b31808SJens Wiklander };
126432b31808SJens Wiklander #endif /* MBEDTLS_SSL_PROTO_DTLS */
126532b31808SJens Wiklander 
126632b31808SJens Wiklander #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
126732b31808SJens Wiklander /**
126832b31808SJens Wiklander  * \brief Given an SSL context and its associated configuration, write the TLS
126932b31808SJens Wiklander  *        1.2 specific extensions of the ClientHello message.
127032b31808SJens Wiklander  *
127132b31808SJens Wiklander  * \param[in]   ssl     SSL context
127232b31808SJens Wiklander  * \param[in]   buf     Base address of the buffer where to write the extensions
127332b31808SJens Wiklander  * \param[in]   end     End address of the buffer where to write the extensions
127432b31808SJens Wiklander  * \param       uses_ec Whether one proposed ciphersuite uses an elliptic curve
127532b31808SJens Wiklander  *                      (<> 0) or not ( 0 ).
127632b31808SJens Wiklander  * \param[out]  out_len Length of the data written into the buffer \p buf
127732b31808SJens Wiklander  */
127832b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
127932b31808SJens Wiklander int mbedtls_ssl_tls12_write_client_hello_exts(mbedtls_ssl_context *ssl,
128032b31808SJens Wiklander                                               unsigned char *buf,
128132b31808SJens Wiklander                                               const unsigned char *end,
128232b31808SJens Wiklander                                               int uses_ec,
128332b31808SJens Wiklander                                               size_t *out_len);
128432b31808SJens Wiklander #endif
128532b31808SJens Wiklander 
128632b31808SJens Wiklander #if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \
128732b31808SJens Wiklander     defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
128832b31808SJens Wiklander 
128932b31808SJens Wiklander /**
129032b31808SJens Wiklander  * \brief Find the preferred hash for a given signature algorithm.
129132b31808SJens Wiklander  *
129232b31808SJens Wiklander  * \param[in]   ssl     SSL context
129332b31808SJens Wiklander  * \param[in]   sig_alg A signature algorithm identifier as defined in the
129432b31808SJens Wiklander  *                      TLS 1.2 SignatureAlgorithm enumeration.
129532b31808SJens Wiklander  *
129632b31808SJens Wiklander  * \return  The preferred hash algorithm for \p sig_alg. It is a hash algorithm
129732b31808SJens Wiklander  *          identifier as defined in the TLS 1.2 HashAlgorithm enumeration.
129832b31808SJens Wiklander  */
129932b31808SJens Wiklander unsigned int mbedtls_ssl_tls12_get_preferred_hash_for_sig_alg(
130032b31808SJens Wiklander     mbedtls_ssl_context *ssl,
130132b31808SJens Wiklander     unsigned int sig_alg);
130232b31808SJens Wiklander 
130332b31808SJens Wiklander #endif /* MBEDTLS_SSL_PROTO_TLS1_2 &&
130432b31808SJens Wiklander           MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
130532b31808SJens Wiklander 
130632b31808SJens Wiklander /**
130732b31808SJens Wiklander  * \brief           Free referenced items in an SSL transform context and clear
130832b31808SJens Wiklander  *                  memory
130932b31808SJens Wiklander  *
131032b31808SJens Wiklander  * \param transform SSL transform context
131132b31808SJens Wiklander  */
131232b31808SJens Wiklander void mbedtls_ssl_transform_free(mbedtls_ssl_transform *transform);
131332b31808SJens Wiklander 
131432b31808SJens Wiklander /**
131532b31808SJens Wiklander  * \brief           Free referenced items in an SSL handshake context and clear
131632b31808SJens Wiklander  *                  memory
131732b31808SJens Wiklander  *
131832b31808SJens Wiklander  * \param ssl       SSL context
131932b31808SJens Wiklander  */
132032b31808SJens Wiklander void mbedtls_ssl_handshake_free(mbedtls_ssl_context *ssl);
132132b31808SJens Wiklander 
132232b31808SJens Wiklander /* set inbound transform of ssl context */
132332b31808SJens Wiklander void mbedtls_ssl_set_inbound_transform(mbedtls_ssl_context *ssl,
132432b31808SJens Wiklander                                        mbedtls_ssl_transform *transform);
132532b31808SJens Wiklander 
132632b31808SJens Wiklander /* set outbound transform of ssl context */
132732b31808SJens Wiklander void mbedtls_ssl_set_outbound_transform(mbedtls_ssl_context *ssl,
132832b31808SJens Wiklander                                         mbedtls_ssl_transform *transform);
132932b31808SJens Wiklander 
133032b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
133132b31808SJens Wiklander int mbedtls_ssl_handshake_client_step(mbedtls_ssl_context *ssl);
133232b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
133332b31808SJens Wiklander int mbedtls_ssl_handshake_server_step(mbedtls_ssl_context *ssl);
133432b31808SJens Wiklander void mbedtls_ssl_handshake_wrapup(mbedtls_ssl_context *ssl);
133532b31808SJens Wiklander static inline void mbedtls_ssl_handshake_set_state(mbedtls_ssl_context *ssl,
133632b31808SJens Wiklander                                                    mbedtls_ssl_states state)
133732b31808SJens Wiklander {
133832b31808SJens Wiklander     ssl->state = (int) state;
133932b31808SJens Wiklander }
134032b31808SJens Wiklander 
134132b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
134232b31808SJens Wiklander int mbedtls_ssl_send_fatal_handshake_failure(mbedtls_ssl_context *ssl);
134332b31808SJens Wiklander 
134432b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
134532b31808SJens Wiklander int mbedtls_ssl_reset_checksum(mbedtls_ssl_context *ssl);
134632b31808SJens Wiklander 
134732b31808SJens Wiklander #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
134832b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
134932b31808SJens Wiklander int mbedtls_ssl_derive_keys(mbedtls_ssl_context *ssl);
135032b31808SJens Wiklander #endif /* MBEDTLS_SSL_PROTO_TLS1_2  */
135132b31808SJens Wiklander 
135232b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
135332b31808SJens Wiklander int mbedtls_ssl_handle_message_type(mbedtls_ssl_context *ssl);
135432b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
135532b31808SJens Wiklander int mbedtls_ssl_prepare_handshake_record(mbedtls_ssl_context *ssl);
135632b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
135732b31808SJens Wiklander int mbedtls_ssl_update_handshake_status(mbedtls_ssl_context *ssl);
135832b31808SJens Wiklander 
135932b31808SJens Wiklander /**
136032b31808SJens Wiklander  * \brief       Update record layer
136132b31808SJens Wiklander  *
136232b31808SJens Wiklander  *              This function roughly separates the implementation
136332b31808SJens Wiklander  *              of the logic of (D)TLS from the implementation
136432b31808SJens Wiklander  *              of the secure transport.
136532b31808SJens Wiklander  *
136632b31808SJens Wiklander  * \param  ssl              The SSL context to use.
136732b31808SJens Wiklander  * \param  update_hs_digest This indicates if the handshake digest
136832b31808SJens Wiklander  *                          should be automatically updated in case
136932b31808SJens Wiklander  *                          a handshake message is found.
137032b31808SJens Wiklander  *
137132b31808SJens Wiklander  * \return      0 or non-zero error code.
137232b31808SJens Wiklander  *
137332b31808SJens Wiklander  * \note        A clarification on what is called 'record layer' here
137432b31808SJens Wiklander  *              is in order, as many sensible definitions are possible:
137532b31808SJens Wiklander  *
137632b31808SJens Wiklander  *              The record layer takes as input an untrusted underlying
137732b31808SJens Wiklander  *              transport (stream or datagram) and transforms it into
137832b31808SJens Wiklander  *              a serially multiplexed, secure transport, which
137932b31808SJens Wiklander  *              conceptually provides the following:
138032b31808SJens Wiklander  *
138132b31808SJens Wiklander  *              (1) Three datagram based, content-agnostic transports
138232b31808SJens Wiklander  *                  for handshake, alert and CCS messages.
138332b31808SJens Wiklander  *              (2) One stream- or datagram-based transport
138432b31808SJens Wiklander  *                  for application data.
138532b31808SJens Wiklander  *              (3) Functionality for changing the underlying transform
138632b31808SJens Wiklander  *                  securing the contents.
138732b31808SJens Wiklander  *
138832b31808SJens Wiklander  *              The interface to this functionality is given as follows:
138932b31808SJens Wiklander  *
139032b31808SJens Wiklander  *              a Updating
139132b31808SJens Wiklander  *                [Currently implemented by mbedtls_ssl_read_record]
139232b31808SJens Wiklander  *
139332b31808SJens Wiklander  *                Check if and on which of the four 'ports' data is pending:
139432b31808SJens Wiklander  *                Nothing, a controlling datagram of type (1), or application
139532b31808SJens Wiklander  *                data (2). In any case data is present, internal buffers
139632b31808SJens Wiklander  *                provide access to the data for the user to process it.
139732b31808SJens Wiklander  *                Consumption of type (1) datagrams is done automatically
139832b31808SJens Wiklander  *                on the next update, invalidating that the internal buffers
139932b31808SJens Wiklander  *                for previous datagrams, while consumption of application
140032b31808SJens Wiklander  *                data (2) is user-controlled.
140132b31808SJens Wiklander  *
140232b31808SJens Wiklander  *              b Reading of application data
140332b31808SJens Wiklander  *                [Currently manual adaption of ssl->in_offt pointer]
140432b31808SJens Wiklander  *
140532b31808SJens Wiklander  *                As mentioned in the last paragraph, consumption of data
140632b31808SJens Wiklander  *                is different from the automatic consumption of control
140732b31808SJens Wiklander  *                datagrams (1) because application data is treated as a stream.
140832b31808SJens Wiklander  *
140932b31808SJens Wiklander  *              c Tracking availability of application data
141032b31808SJens Wiklander  *                [Currently manually through decreasing ssl->in_msglen]
141132b31808SJens Wiklander  *
141232b31808SJens Wiklander  *                For efficiency and to retain datagram semantics for
141332b31808SJens Wiklander  *                application data in case of DTLS, the record layer
141432b31808SJens Wiklander  *                provides functionality for checking how much application
141532b31808SJens Wiklander  *                data is still available in the internal buffer.
141632b31808SJens Wiklander  *
141732b31808SJens Wiklander  *              d Changing the transformation securing the communication.
141832b31808SJens Wiklander  *
141932b31808SJens Wiklander  *              Given an opaque implementation of the record layer in the
142032b31808SJens Wiklander  *              above sense, it should be possible to implement the logic
142132b31808SJens Wiklander  *              of (D)TLS on top of it without the need to know anything
142232b31808SJens Wiklander  *              about the record layer's internals. This is done e.g.
142332b31808SJens Wiklander  *              in all the handshake handling functions, and in the
142432b31808SJens Wiklander  *              application data reading function mbedtls_ssl_read.
142532b31808SJens Wiklander  *
142632b31808SJens Wiklander  * \note        The above tries to give a conceptual picture of the
142732b31808SJens Wiklander  *              record layer, but the current implementation deviates
142832b31808SJens Wiklander  *              from it in some places. For example, our implementation of
142932b31808SJens Wiklander  *              the update functionality through mbedtls_ssl_read_record
143032b31808SJens Wiklander  *              discards datagrams depending on the current state, which
143132b31808SJens Wiklander  *              wouldn't fall under the record layer's responsibility
143232b31808SJens Wiklander  *              following the above definition.
143332b31808SJens Wiklander  *
143432b31808SJens Wiklander  */
143532b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
143632b31808SJens Wiklander int mbedtls_ssl_read_record(mbedtls_ssl_context *ssl,
143732b31808SJens Wiklander                             unsigned update_hs_digest);
143832b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
143932b31808SJens Wiklander int mbedtls_ssl_fetch_input(mbedtls_ssl_context *ssl, size_t nb_want);
144032b31808SJens Wiklander 
144132b31808SJens Wiklander /*
144232b31808SJens Wiklander  * Write handshake message header
144332b31808SJens Wiklander  */
144432b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
1445*b0563631STom Van Eyck int mbedtls_ssl_start_handshake_msg(mbedtls_ssl_context *ssl, unsigned char hs_type,
144632b31808SJens Wiklander                                     unsigned char **buf, size_t *buf_len);
144732b31808SJens Wiklander 
144832b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
144932b31808SJens Wiklander int mbedtls_ssl_write_handshake_msg_ext(mbedtls_ssl_context *ssl,
145032b31808SJens Wiklander                                         int update_checksum,
145132b31808SJens Wiklander                                         int force_flush);
145232b31808SJens Wiklander static inline int mbedtls_ssl_write_handshake_msg(mbedtls_ssl_context *ssl)
145332b31808SJens Wiklander {
145432b31808SJens Wiklander     return mbedtls_ssl_write_handshake_msg_ext(ssl, 1 /* update checksum */, 1 /* force flush */);
145532b31808SJens Wiklander }
145632b31808SJens Wiklander 
145732b31808SJens Wiklander /*
145832b31808SJens Wiklander  * Write handshake message tail
145932b31808SJens Wiklander  */
146032b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
146132b31808SJens Wiklander int mbedtls_ssl_finish_handshake_msg(mbedtls_ssl_context *ssl,
146232b31808SJens Wiklander                                      size_t buf_len, size_t msg_len);
146332b31808SJens Wiklander 
146432b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
146532b31808SJens Wiklander int mbedtls_ssl_write_record(mbedtls_ssl_context *ssl, int force_flush);
146632b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
146732b31808SJens Wiklander int mbedtls_ssl_flush_output(mbedtls_ssl_context *ssl);
146832b31808SJens Wiklander 
146932b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
147032b31808SJens Wiklander int mbedtls_ssl_parse_certificate(mbedtls_ssl_context *ssl);
147132b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
147232b31808SJens Wiklander int mbedtls_ssl_write_certificate(mbedtls_ssl_context *ssl);
147332b31808SJens Wiklander 
147432b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
147532b31808SJens Wiklander int mbedtls_ssl_parse_change_cipher_spec(mbedtls_ssl_context *ssl);
147632b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
147732b31808SJens Wiklander int mbedtls_ssl_write_change_cipher_spec(mbedtls_ssl_context *ssl);
147832b31808SJens Wiklander 
147932b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
148032b31808SJens Wiklander int mbedtls_ssl_parse_finished(mbedtls_ssl_context *ssl);
148132b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
148232b31808SJens Wiklander int mbedtls_ssl_write_finished(mbedtls_ssl_context *ssl);
148332b31808SJens Wiklander 
148432b31808SJens Wiklander void mbedtls_ssl_optimize_checksum(mbedtls_ssl_context *ssl,
148532b31808SJens Wiklander                                    const mbedtls_ssl_ciphersuite_t *ciphersuite_info);
148632b31808SJens Wiklander 
148732b31808SJens Wiklander /*
148832b31808SJens Wiklander  * Update checksum of handshake messages.
148932b31808SJens Wiklander  */
149032b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
149132b31808SJens Wiklander int mbedtls_ssl_add_hs_msg_to_checksum(mbedtls_ssl_context *ssl,
149232b31808SJens Wiklander                                        unsigned hs_type,
149332b31808SJens Wiklander                                        unsigned char const *msg,
149432b31808SJens Wiklander                                        size_t msg_len);
149532b31808SJens Wiklander 
149632b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
149732b31808SJens Wiklander int mbedtls_ssl_add_hs_hdr_to_checksum(mbedtls_ssl_context *ssl,
149832b31808SJens Wiklander                                        unsigned hs_type,
149932b31808SJens Wiklander                                        size_t total_hs_len);
150032b31808SJens Wiklander 
150132b31808SJens Wiklander #if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
150232b31808SJens Wiklander #if !defined(MBEDTLS_USE_PSA_CRYPTO)
150332b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
150432b31808SJens Wiklander int mbedtls_ssl_psk_derive_premaster(mbedtls_ssl_context *ssl,
150532b31808SJens Wiklander                                      mbedtls_key_exchange_type_t key_ex);
150632b31808SJens Wiklander #endif /* !MBEDTLS_USE_PSA_CRYPTO */
150732b31808SJens Wiklander #endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */
150832b31808SJens Wiklander 
150932b31808SJens Wiklander #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_PSK_ENABLED)
151032b31808SJens Wiklander #if defined(MBEDTLS_SSL_CLI_C)
151132b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
151232b31808SJens Wiklander int mbedtls_ssl_conf_has_static_psk(mbedtls_ssl_config const *conf);
151332b31808SJens Wiklander #endif
151432b31808SJens Wiklander #if defined(MBEDTLS_USE_PSA_CRYPTO)
151532b31808SJens Wiklander /**
151632b31808SJens Wiklander  * Get the first defined opaque PSK by order of precedence:
151732b31808SJens Wiklander  * 1. handshake PSK set by \c mbedtls_ssl_set_hs_psk_opaque() in the PSK
151832b31808SJens Wiklander  *    callback
151932b31808SJens Wiklander  * 2. static PSK configured by \c mbedtls_ssl_conf_psk_opaque()
152032b31808SJens Wiklander  * Return an opaque PSK
152132b31808SJens Wiklander  */
152232b31808SJens Wiklander static inline mbedtls_svc_key_id_t mbedtls_ssl_get_opaque_psk(
152332b31808SJens Wiklander     const mbedtls_ssl_context *ssl)
152432b31808SJens Wiklander {
152532b31808SJens Wiklander     if (!mbedtls_svc_key_id_is_null(ssl->handshake->psk_opaque)) {
152632b31808SJens Wiklander         return ssl->handshake->psk_opaque;
152732b31808SJens Wiklander     }
152832b31808SJens Wiklander 
152932b31808SJens Wiklander     if (!mbedtls_svc_key_id_is_null(ssl->conf->psk_opaque)) {
153032b31808SJens Wiklander         return ssl->conf->psk_opaque;
153132b31808SJens Wiklander     }
153232b31808SJens Wiklander 
153332b31808SJens Wiklander     return MBEDTLS_SVC_KEY_ID_INIT;
153432b31808SJens Wiklander }
153532b31808SJens Wiklander #else
153632b31808SJens Wiklander /**
153732b31808SJens Wiklander  * Get the first defined PSK by order of precedence:
153832b31808SJens Wiklander  * 1. handshake PSK set by \c mbedtls_ssl_set_hs_psk() in the PSK callback
153932b31808SJens Wiklander  * 2. static PSK configured by \c mbedtls_ssl_conf_psk()
154032b31808SJens Wiklander  * Return a code and update the pair (PSK, PSK length) passed to this function
154132b31808SJens Wiklander  */
154232b31808SJens Wiklander static inline int mbedtls_ssl_get_psk(const mbedtls_ssl_context *ssl,
154332b31808SJens Wiklander                                       const unsigned char **psk, size_t *psk_len)
154432b31808SJens Wiklander {
154532b31808SJens Wiklander     if (ssl->handshake->psk != NULL && ssl->handshake->psk_len > 0) {
154632b31808SJens Wiklander         *psk = ssl->handshake->psk;
154732b31808SJens Wiklander         *psk_len = ssl->handshake->psk_len;
154832b31808SJens Wiklander     } else if (ssl->conf->psk != NULL && ssl->conf->psk_len > 0) {
154932b31808SJens Wiklander         *psk = ssl->conf->psk;
155032b31808SJens Wiklander         *psk_len = ssl->conf->psk_len;
155132b31808SJens Wiklander     } else {
155232b31808SJens Wiklander         *psk = NULL;
155332b31808SJens Wiklander         *psk_len = 0;
155432b31808SJens Wiklander         return MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED;
155532b31808SJens Wiklander     }
155632b31808SJens Wiklander 
155732b31808SJens Wiklander     return 0;
155832b31808SJens Wiklander }
155932b31808SJens Wiklander #endif /* MBEDTLS_USE_PSA_CRYPTO */
156032b31808SJens Wiklander 
156132b31808SJens Wiklander #endif /* MBEDTLS_SSL_HANDSHAKE_WITH_PSK_ENABLED */
156232b31808SJens Wiklander 
156332b31808SJens Wiklander #if defined(MBEDTLS_PK_C)
156432b31808SJens Wiklander unsigned char mbedtls_ssl_sig_from_pk(mbedtls_pk_context *pk);
156532b31808SJens Wiklander unsigned char mbedtls_ssl_sig_from_pk_alg(mbedtls_pk_type_t type);
156632b31808SJens Wiklander mbedtls_pk_type_t mbedtls_ssl_pk_alg_from_sig(unsigned char sig);
156732b31808SJens Wiklander #endif
156832b31808SJens Wiklander 
156932b31808SJens Wiklander mbedtls_md_type_t mbedtls_ssl_md_alg_from_hash(unsigned char hash);
157032b31808SJens Wiklander unsigned char mbedtls_ssl_hash_from_md_alg(int md);
157132b31808SJens Wiklander 
157232b31808SJens Wiklander #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
157332b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
157432b31808SJens Wiklander int mbedtls_ssl_set_calc_verify_md(mbedtls_ssl_context *ssl, int md);
157532b31808SJens Wiklander #endif
157632b31808SJens Wiklander 
157732b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
157832b31808SJens Wiklander int mbedtls_ssl_check_curve_tls_id(const mbedtls_ssl_context *ssl, uint16_t tls_id);
1579*b0563631STom Van Eyck #if defined(MBEDTLS_PK_HAVE_ECC_KEYS)
158032b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
158132b31808SJens Wiklander int mbedtls_ssl_check_curve(const mbedtls_ssl_context *ssl, mbedtls_ecp_group_id grp_id);
1582*b0563631STom Van Eyck #endif /* MBEDTLS_PK_HAVE_ECC_KEYS */
158332b31808SJens Wiklander 
158432b31808SJens Wiklander /**
158532b31808SJens Wiklander  * \brief Return PSA EC info for the specified TLS ID.
158632b31808SJens Wiklander  *
158732b31808SJens Wiklander  * \param tls_id    The TLS ID to look for
1588*b0563631STom Van Eyck  * \param type      If the TLD ID is supported, then proper \c psa_key_type_t
158932b31808SJens Wiklander  *                  value is returned here. Can be NULL.
159032b31808SJens Wiklander  * \param bits      If the TLD ID is supported, then proper bit size is returned
159132b31808SJens Wiklander  *                  here. Can be NULL.
159232b31808SJens Wiklander  * \return          PSA_SUCCESS if the TLS ID is supported,
159332b31808SJens Wiklander  *                  PSA_ERROR_NOT_SUPPORTED otherwise
159432b31808SJens Wiklander  *
159532b31808SJens Wiklander  * \note            If either \c family or \c bits parameters are NULL, then
159632b31808SJens Wiklander  *                  the corresponding value is not returned.
159732b31808SJens Wiklander  *                  The function can be called with both parameters as NULL
159832b31808SJens Wiklander  *                  simply to check if a specific TLS ID is supported.
159932b31808SJens Wiklander  */
160032b31808SJens Wiklander int mbedtls_ssl_get_psa_curve_info_from_tls_id(uint16_t tls_id,
1601*b0563631STom Van Eyck                                                psa_key_type_t *type,
160232b31808SJens Wiklander                                                size_t *bits);
160332b31808SJens Wiklander 
160432b31808SJens Wiklander /**
160532b31808SJens Wiklander  * \brief Return \c mbedtls_ecp_group_id for the specified TLS ID.
160632b31808SJens Wiklander  *
160732b31808SJens Wiklander  * \param tls_id    The TLS ID to look for
160832b31808SJens Wiklander  * \return          Proper \c mbedtls_ecp_group_id if the TLS ID is supported,
160932b31808SJens Wiklander  *                  or MBEDTLS_ECP_DP_NONE otherwise
161032b31808SJens Wiklander  */
161132b31808SJens Wiklander mbedtls_ecp_group_id mbedtls_ssl_get_ecp_group_id_from_tls_id(uint16_t tls_id);
161232b31808SJens Wiklander 
161332b31808SJens Wiklander /**
161432b31808SJens Wiklander  * \brief Return TLS ID for the specified \c mbedtls_ecp_group_id.
161532b31808SJens Wiklander  *
161632b31808SJens Wiklander  * \param grp_id    The \c mbedtls_ecp_group_id ID to look for
161732b31808SJens Wiklander  * \return          Proper TLS ID if the \c mbedtls_ecp_group_id is supported,
161832b31808SJens Wiklander  *                  or 0 otherwise
161932b31808SJens Wiklander  */
162032b31808SJens Wiklander uint16_t mbedtls_ssl_get_tls_id_from_ecp_group_id(mbedtls_ecp_group_id grp_id);
162132b31808SJens Wiklander 
162232b31808SJens Wiklander #if defined(MBEDTLS_DEBUG_C)
162332b31808SJens Wiklander /**
162432b31808SJens Wiklander  * \brief Return EC's name for the specified TLS ID.
162532b31808SJens Wiklander  *
162632b31808SJens Wiklander  * \param tls_id    The TLS ID to look for
162732b31808SJens Wiklander  * \return          A pointer to a const string with the proper name. If TLS
162832b31808SJens Wiklander  *                  ID is not supported, a NULL pointer is returned instead.
162932b31808SJens Wiklander  */
163032b31808SJens Wiklander const char *mbedtls_ssl_get_curve_name_from_tls_id(uint16_t tls_id);
163132b31808SJens Wiklander #endif
163232b31808SJens Wiklander 
163332b31808SJens Wiklander #if defined(MBEDTLS_SSL_DTLS_SRTP)
163432b31808SJens Wiklander static inline mbedtls_ssl_srtp_profile mbedtls_ssl_check_srtp_profile_value
163532b31808SJens Wiklander     (const uint16_t srtp_profile_value)
163632b31808SJens Wiklander {
163732b31808SJens Wiklander     switch (srtp_profile_value) {
163832b31808SJens Wiklander         case MBEDTLS_TLS_SRTP_AES128_CM_HMAC_SHA1_80:
163932b31808SJens Wiklander         case MBEDTLS_TLS_SRTP_AES128_CM_HMAC_SHA1_32:
164032b31808SJens Wiklander         case MBEDTLS_TLS_SRTP_NULL_HMAC_SHA1_80:
164132b31808SJens Wiklander         case MBEDTLS_TLS_SRTP_NULL_HMAC_SHA1_32:
164232b31808SJens Wiklander             return srtp_profile_value;
164332b31808SJens Wiklander         default: break;
164432b31808SJens Wiklander     }
164532b31808SJens Wiklander     return MBEDTLS_TLS_SRTP_UNSET;
164632b31808SJens Wiklander }
164732b31808SJens Wiklander #endif
164832b31808SJens Wiklander 
164932b31808SJens Wiklander #if defined(MBEDTLS_X509_CRT_PARSE_C)
165032b31808SJens Wiklander static inline mbedtls_pk_context *mbedtls_ssl_own_key(mbedtls_ssl_context *ssl)
165132b31808SJens Wiklander {
165232b31808SJens Wiklander     mbedtls_ssl_key_cert *key_cert;
165332b31808SJens Wiklander 
165432b31808SJens Wiklander     if (ssl->handshake != NULL && ssl->handshake->key_cert != NULL) {
165532b31808SJens Wiklander         key_cert = ssl->handshake->key_cert;
165632b31808SJens Wiklander     } else {
165732b31808SJens Wiklander         key_cert = ssl->conf->key_cert;
165832b31808SJens Wiklander     }
165932b31808SJens Wiklander 
166032b31808SJens Wiklander     return key_cert == NULL ? NULL : key_cert->key;
166132b31808SJens Wiklander }
166232b31808SJens Wiklander 
166332b31808SJens Wiklander static inline mbedtls_x509_crt *mbedtls_ssl_own_cert(mbedtls_ssl_context *ssl)
166432b31808SJens Wiklander {
166532b31808SJens Wiklander     mbedtls_ssl_key_cert *key_cert;
166632b31808SJens Wiklander 
166732b31808SJens Wiklander     if (ssl->handshake != NULL && ssl->handshake->key_cert != NULL) {
166832b31808SJens Wiklander         key_cert = ssl->handshake->key_cert;
166932b31808SJens Wiklander     } else {
167032b31808SJens Wiklander         key_cert = ssl->conf->key_cert;
167132b31808SJens Wiklander     }
167232b31808SJens Wiklander 
167332b31808SJens Wiklander     return key_cert == NULL ? NULL : key_cert->cert;
167432b31808SJens Wiklander }
167532b31808SJens Wiklander 
167632b31808SJens Wiklander /*
167732b31808SJens Wiklander  * Check usage of a certificate wrt extensions:
167832b31808SJens Wiklander  * keyUsage, extendedKeyUsage (later), and nSCertType (later).
167932b31808SJens Wiklander  *
168032b31808SJens Wiklander  * Warning: cert_endpoint is the endpoint of the cert (ie, of our peer when we
168132b31808SJens Wiklander  * check a cert we received from them)!
168232b31808SJens Wiklander  *
168332b31808SJens Wiklander  * Return 0 if everything is OK, -1 if not.
168432b31808SJens Wiklander  */
168532b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
168632b31808SJens Wiklander int mbedtls_ssl_check_cert_usage(const mbedtls_x509_crt *cert,
168732b31808SJens Wiklander                                  const mbedtls_ssl_ciphersuite_t *ciphersuite,
168832b31808SJens Wiklander                                  int cert_endpoint,
168932b31808SJens Wiklander                                  uint32_t *flags);
169032b31808SJens Wiklander #endif /* MBEDTLS_X509_CRT_PARSE_C */
169132b31808SJens Wiklander 
169232b31808SJens Wiklander void mbedtls_ssl_write_version(unsigned char version[2], int transport,
169332b31808SJens Wiklander                                mbedtls_ssl_protocol_version tls_version);
169432b31808SJens Wiklander uint16_t mbedtls_ssl_read_version(const unsigned char version[2],
169532b31808SJens Wiklander                                   int transport);
169632b31808SJens Wiklander 
169732b31808SJens Wiklander static inline size_t mbedtls_ssl_in_hdr_len(const mbedtls_ssl_context *ssl)
169832b31808SJens Wiklander {
169932b31808SJens Wiklander #if !defined(MBEDTLS_SSL_PROTO_DTLS)
170032b31808SJens Wiklander     ((void) ssl);
170132b31808SJens Wiklander #endif
170232b31808SJens Wiklander 
170332b31808SJens Wiklander #if defined(MBEDTLS_SSL_PROTO_DTLS)
170432b31808SJens Wiklander     if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
170532b31808SJens Wiklander         return 13;
170632b31808SJens Wiklander     } else
170732b31808SJens Wiklander #endif /* MBEDTLS_SSL_PROTO_DTLS */
170832b31808SJens Wiklander     {
170932b31808SJens Wiklander         return 5;
171032b31808SJens Wiklander     }
171132b31808SJens Wiklander }
171232b31808SJens Wiklander 
171332b31808SJens Wiklander static inline size_t mbedtls_ssl_out_hdr_len(const mbedtls_ssl_context *ssl)
171432b31808SJens Wiklander {
171532b31808SJens Wiklander     return (size_t) (ssl->out_iv - ssl->out_hdr);
171632b31808SJens Wiklander }
171732b31808SJens Wiklander 
171832b31808SJens Wiklander static inline size_t mbedtls_ssl_hs_hdr_len(const mbedtls_ssl_context *ssl)
171932b31808SJens Wiklander {
172032b31808SJens Wiklander #if defined(MBEDTLS_SSL_PROTO_DTLS)
172132b31808SJens Wiklander     if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
172232b31808SJens Wiklander         return 12;
172332b31808SJens Wiklander     }
172432b31808SJens Wiklander #else
172532b31808SJens Wiklander     ((void) ssl);
172632b31808SJens Wiklander #endif
172732b31808SJens Wiklander     return 4;
172832b31808SJens Wiklander }
172932b31808SJens Wiklander 
173032b31808SJens Wiklander #if defined(MBEDTLS_SSL_PROTO_DTLS)
173132b31808SJens Wiklander void mbedtls_ssl_send_flight_completed(mbedtls_ssl_context *ssl);
173232b31808SJens Wiklander void mbedtls_ssl_recv_flight_completed(mbedtls_ssl_context *ssl);
173332b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
173432b31808SJens Wiklander int mbedtls_ssl_resend(mbedtls_ssl_context *ssl);
173532b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
173632b31808SJens Wiklander int mbedtls_ssl_flight_transmit(mbedtls_ssl_context *ssl);
173732b31808SJens Wiklander #endif
173832b31808SJens Wiklander 
173932b31808SJens Wiklander /* Visible for testing purposes only */
174032b31808SJens Wiklander #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
174132b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
174232b31808SJens Wiklander int mbedtls_ssl_dtls_replay_check(mbedtls_ssl_context const *ssl);
174332b31808SJens Wiklander void mbedtls_ssl_dtls_replay_update(mbedtls_ssl_context *ssl);
174432b31808SJens Wiklander #endif
174532b31808SJens Wiklander 
174632b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
174732b31808SJens Wiklander int mbedtls_ssl_session_copy(mbedtls_ssl_session *dst,
174832b31808SJens Wiklander                              const mbedtls_ssl_session *src);
174932b31808SJens Wiklander 
175032b31808SJens Wiklander #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
175132b31808SJens Wiklander /* The hash buffer must have at least MBEDTLS_MD_MAX_SIZE bytes of length. */
175232b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
175332b31808SJens Wiklander int mbedtls_ssl_get_key_exchange_md_tls1_2(mbedtls_ssl_context *ssl,
175432b31808SJens Wiklander                                            unsigned char *hash, size_t *hashlen,
175532b31808SJens Wiklander                                            unsigned char *data, size_t data_len,
175632b31808SJens Wiklander                                            mbedtls_md_type_t md_alg);
175732b31808SJens Wiklander #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
175832b31808SJens Wiklander 
175932b31808SJens Wiklander #ifdef __cplusplus
176032b31808SJens Wiklander }
176132b31808SJens Wiklander #endif
176232b31808SJens Wiklander 
176332b31808SJens Wiklander void mbedtls_ssl_transform_init(mbedtls_ssl_transform *transform);
176432b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
176532b31808SJens Wiklander int mbedtls_ssl_encrypt_buf(mbedtls_ssl_context *ssl,
176632b31808SJens Wiklander                             mbedtls_ssl_transform *transform,
176732b31808SJens Wiklander                             mbedtls_record *rec,
176832b31808SJens Wiklander                             int (*f_rng)(void *, unsigned char *, size_t),
176932b31808SJens Wiklander                             void *p_rng);
177032b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
177132b31808SJens Wiklander int mbedtls_ssl_decrypt_buf(mbedtls_ssl_context const *ssl,
177232b31808SJens Wiklander                             mbedtls_ssl_transform *transform,
177332b31808SJens Wiklander                             mbedtls_record *rec);
177432b31808SJens Wiklander 
177532b31808SJens Wiklander /* Length of the "epoch" field in the record header */
177632b31808SJens Wiklander static inline size_t mbedtls_ssl_ep_len(const mbedtls_ssl_context *ssl)
177732b31808SJens Wiklander {
177832b31808SJens Wiklander #if defined(MBEDTLS_SSL_PROTO_DTLS)
177932b31808SJens Wiklander     if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
178032b31808SJens Wiklander         return 2;
178132b31808SJens Wiklander     }
178232b31808SJens Wiklander #else
178332b31808SJens Wiklander     ((void) ssl);
178432b31808SJens Wiklander #endif
178532b31808SJens Wiklander     return 0;
178632b31808SJens Wiklander }
178732b31808SJens Wiklander 
178832b31808SJens Wiklander #if defined(MBEDTLS_SSL_PROTO_DTLS)
178932b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
179032b31808SJens Wiklander int mbedtls_ssl_resend_hello_request(mbedtls_ssl_context *ssl);
179132b31808SJens Wiklander #endif /* MBEDTLS_SSL_PROTO_DTLS */
179232b31808SJens Wiklander 
179332b31808SJens Wiklander void mbedtls_ssl_set_timer(mbedtls_ssl_context *ssl, uint32_t millisecs);
179432b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
179532b31808SJens Wiklander int mbedtls_ssl_check_timer(mbedtls_ssl_context *ssl);
179632b31808SJens Wiklander 
179732b31808SJens Wiklander void mbedtls_ssl_reset_in_out_pointers(mbedtls_ssl_context *ssl);
179832b31808SJens Wiklander void mbedtls_ssl_update_out_pointers(mbedtls_ssl_context *ssl,
179932b31808SJens Wiklander                                      mbedtls_ssl_transform *transform);
180032b31808SJens Wiklander void mbedtls_ssl_update_in_pointers(mbedtls_ssl_context *ssl);
180132b31808SJens Wiklander 
180232b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
180332b31808SJens Wiklander int mbedtls_ssl_session_reset_int(mbedtls_ssl_context *ssl, int partial);
180432b31808SJens Wiklander void mbedtls_ssl_session_reset_msg_layer(mbedtls_ssl_context *ssl,
180532b31808SJens Wiklander                                          int partial);
180632b31808SJens Wiklander 
180732b31808SJens Wiklander /*
180832b31808SJens Wiklander  * Send pending alert
180932b31808SJens Wiklander  */
181032b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
181132b31808SJens Wiklander int mbedtls_ssl_handle_pending_alert(mbedtls_ssl_context *ssl);
181232b31808SJens Wiklander 
181332b31808SJens Wiklander /*
181432b31808SJens Wiklander  * Set pending fatal alert flag.
181532b31808SJens Wiklander  */
181632b31808SJens Wiklander void mbedtls_ssl_pend_fatal_alert(mbedtls_ssl_context *ssl,
181732b31808SJens Wiklander                                   unsigned char alert_type,
181832b31808SJens Wiklander                                   int alert_reason);
181932b31808SJens Wiklander 
182032b31808SJens Wiklander /* Alias of mbedtls_ssl_pend_fatal_alert */
182132b31808SJens Wiklander #define MBEDTLS_SSL_PEND_FATAL_ALERT(type, user_return_value)         \
182232b31808SJens Wiklander     mbedtls_ssl_pend_fatal_alert(ssl, type, user_return_value)
182332b31808SJens Wiklander 
182432b31808SJens Wiklander #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
182532b31808SJens Wiklander void mbedtls_ssl_dtls_replay_reset(mbedtls_ssl_context *ssl);
182632b31808SJens Wiklander #endif
182732b31808SJens Wiklander 
182832b31808SJens Wiklander void mbedtls_ssl_handshake_wrapup_free_hs_transform(mbedtls_ssl_context *ssl);
182932b31808SJens Wiklander 
183032b31808SJens Wiklander #if defined(MBEDTLS_SSL_RENEGOTIATION)
183132b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
183232b31808SJens Wiklander int mbedtls_ssl_start_renegotiation(mbedtls_ssl_context *ssl);
183332b31808SJens Wiklander #endif /* MBEDTLS_SSL_RENEGOTIATION */
183432b31808SJens Wiklander 
183532b31808SJens Wiklander #if defined(MBEDTLS_SSL_PROTO_DTLS)
183632b31808SJens Wiklander size_t mbedtls_ssl_get_current_mtu(const mbedtls_ssl_context *ssl);
183732b31808SJens Wiklander void mbedtls_ssl_buffering_free(mbedtls_ssl_context *ssl);
183832b31808SJens Wiklander void mbedtls_ssl_flight_free(mbedtls_ssl_flight_item *flight);
183932b31808SJens Wiklander #endif /* MBEDTLS_SSL_PROTO_DTLS */
184032b31808SJens Wiklander 
184132b31808SJens Wiklander /**
184232b31808SJens Wiklander  * ssl utils functions for checking configuration.
184332b31808SJens Wiklander  */
184432b31808SJens Wiklander 
184532b31808SJens Wiklander #if defined(MBEDTLS_SSL_PROTO_TLS1_3)
184632b31808SJens Wiklander static inline int mbedtls_ssl_conf_is_tls13_only(const mbedtls_ssl_config *conf)
184732b31808SJens Wiklander {
184832b31808SJens Wiklander     return conf->min_tls_version == MBEDTLS_SSL_VERSION_TLS1_3 &&
184932b31808SJens Wiklander            conf->max_tls_version == MBEDTLS_SSL_VERSION_TLS1_3;
185032b31808SJens Wiklander }
185132b31808SJens Wiklander 
185232b31808SJens Wiklander #endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
185332b31808SJens Wiklander 
185432b31808SJens Wiklander #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
185532b31808SJens Wiklander static inline int mbedtls_ssl_conf_is_tls12_only(const mbedtls_ssl_config *conf)
185632b31808SJens Wiklander {
185732b31808SJens Wiklander     return conf->min_tls_version == MBEDTLS_SSL_VERSION_TLS1_2 &&
185832b31808SJens Wiklander            conf->max_tls_version == MBEDTLS_SSL_VERSION_TLS1_2;
185932b31808SJens Wiklander }
186032b31808SJens Wiklander 
186132b31808SJens Wiklander #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
186232b31808SJens Wiklander 
186332b31808SJens Wiklander static inline int mbedtls_ssl_conf_is_tls13_enabled(const mbedtls_ssl_config *conf)
186432b31808SJens Wiklander {
186532b31808SJens Wiklander #if defined(MBEDTLS_SSL_PROTO_TLS1_3)
186632b31808SJens Wiklander     return conf->min_tls_version <= MBEDTLS_SSL_VERSION_TLS1_3 &&
186732b31808SJens Wiklander            conf->max_tls_version >= MBEDTLS_SSL_VERSION_TLS1_3;
186832b31808SJens Wiklander #else
186932b31808SJens Wiklander     ((void) conf);
187032b31808SJens Wiklander     return 0;
187132b31808SJens Wiklander #endif
187232b31808SJens Wiklander }
187332b31808SJens Wiklander 
187432b31808SJens Wiklander static inline int mbedtls_ssl_conf_is_tls12_enabled(const mbedtls_ssl_config *conf)
187532b31808SJens Wiklander {
187632b31808SJens Wiklander #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
187732b31808SJens Wiklander     return conf->min_tls_version <= MBEDTLS_SSL_VERSION_TLS1_2 &&
187832b31808SJens Wiklander            conf->max_tls_version >= MBEDTLS_SSL_VERSION_TLS1_2;
187932b31808SJens Wiklander #else
188032b31808SJens Wiklander     ((void) conf);
188132b31808SJens Wiklander     return 0;
188232b31808SJens Wiklander #endif
188332b31808SJens Wiklander }
188432b31808SJens Wiklander 
188532b31808SJens Wiklander #if defined(MBEDTLS_SSL_PROTO_TLS1_2) && defined(MBEDTLS_SSL_PROTO_TLS1_3)
188632b31808SJens Wiklander static inline int mbedtls_ssl_conf_is_hybrid_tls12_tls13(const mbedtls_ssl_config *conf)
188732b31808SJens Wiklander {
188832b31808SJens Wiklander     return conf->min_tls_version == MBEDTLS_SSL_VERSION_TLS1_2 &&
188932b31808SJens Wiklander            conf->max_tls_version == MBEDTLS_SSL_VERSION_TLS1_3;
189032b31808SJens Wiklander }
189132b31808SJens Wiklander #endif /* MBEDTLS_SSL_PROTO_TLS1_2 && MBEDTLS_SSL_PROTO_TLS1_3 */
189232b31808SJens Wiklander 
189332b31808SJens Wiklander #if defined(MBEDTLS_SSL_PROTO_TLS1_3)
189432b31808SJens Wiklander extern const uint8_t mbedtls_ssl_tls13_hello_retry_request_magic[
189532b31808SJens Wiklander     MBEDTLS_SERVER_HELLO_RANDOM_LEN];
189632b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
189732b31808SJens Wiklander int mbedtls_ssl_tls13_process_finished_message(mbedtls_ssl_context *ssl);
189832b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
189932b31808SJens Wiklander int mbedtls_ssl_tls13_write_finished_message(mbedtls_ssl_context *ssl);
190032b31808SJens Wiklander void mbedtls_ssl_tls13_handshake_wrapup(mbedtls_ssl_context *ssl);
190132b31808SJens Wiklander 
190232b31808SJens Wiklander /**
190332b31808SJens Wiklander  * \brief Given an SSL context and its associated configuration, write the TLS
190432b31808SJens Wiklander  *        1.3 specific extensions of the ClientHello message.
190532b31808SJens Wiklander  *
190632b31808SJens Wiklander  * \param[in]   ssl     SSL context
190732b31808SJens Wiklander  * \param[in]   buf     Base address of the buffer where to write the extensions
190832b31808SJens Wiklander  * \param[in]   end     End address of the buffer where to write the extensions
190932b31808SJens Wiklander  * \param[out]  out_len Length of the data written into the buffer \p buf
191032b31808SJens Wiklander  */
191132b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
191232b31808SJens Wiklander int mbedtls_ssl_tls13_write_client_hello_exts(mbedtls_ssl_context *ssl,
191332b31808SJens Wiklander                                               unsigned char *buf,
191432b31808SJens Wiklander                                               unsigned char *end,
191532b31808SJens Wiklander                                               size_t *out_len);
191632b31808SJens Wiklander 
191732b31808SJens Wiklander /**
191832b31808SJens Wiklander  * \brief           TLS 1.3 client side state machine entry
191932b31808SJens Wiklander  *
192032b31808SJens Wiklander  * \param ssl       SSL context
192132b31808SJens Wiklander  */
192232b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
192332b31808SJens Wiklander int mbedtls_ssl_tls13_handshake_client_step(mbedtls_ssl_context *ssl);
192432b31808SJens Wiklander 
192532b31808SJens Wiklander /**
192632b31808SJens Wiklander  * \brief           TLS 1.3 server side state machine entry
192732b31808SJens Wiklander  *
192832b31808SJens Wiklander  * \param ssl       SSL context
192932b31808SJens Wiklander  */
193032b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
193132b31808SJens Wiklander int mbedtls_ssl_tls13_handshake_server_step(mbedtls_ssl_context *ssl);
193232b31808SJens Wiklander 
193332b31808SJens Wiklander 
193432b31808SJens Wiklander /*
193532b31808SJens Wiklander  * Helper functions around key exchange modes.
193632b31808SJens Wiklander  */
1937*b0563631STom Van Eyck static inline int mbedtls_ssl_conf_tls13_is_kex_mode_enabled(mbedtls_ssl_context *ssl,
193832b31808SJens Wiklander                                                              int kex_mode_mask)
193932b31808SJens Wiklander {
194032b31808SJens Wiklander     return (ssl->conf->tls13_kex_modes & kex_mode_mask) != 0;
194132b31808SJens Wiklander }
194232b31808SJens Wiklander 
1943*b0563631STom Van Eyck static inline int mbedtls_ssl_conf_tls13_is_psk_enabled(mbedtls_ssl_context *ssl)
194432b31808SJens Wiklander {
1945*b0563631STom Van Eyck     return mbedtls_ssl_conf_tls13_is_kex_mode_enabled(ssl,
194632b31808SJens Wiklander                                                       MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK);
194732b31808SJens Wiklander }
194832b31808SJens Wiklander 
1949*b0563631STom Van Eyck static inline int mbedtls_ssl_conf_tls13_is_psk_ephemeral_enabled(mbedtls_ssl_context *ssl)
195032b31808SJens Wiklander {
1951*b0563631STom Van Eyck     return mbedtls_ssl_conf_tls13_is_kex_mode_enabled(ssl,
195232b31808SJens Wiklander                                                       MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_EPHEMERAL);
195332b31808SJens Wiklander }
195432b31808SJens Wiklander 
1955*b0563631STom Van Eyck static inline int mbedtls_ssl_conf_tls13_is_ephemeral_enabled(mbedtls_ssl_context *ssl)
195632b31808SJens Wiklander {
1957*b0563631STom Van Eyck     return mbedtls_ssl_conf_tls13_is_kex_mode_enabled(ssl,
195832b31808SJens Wiklander                                                       MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL);
195932b31808SJens Wiklander }
196032b31808SJens Wiklander 
1961*b0563631STom Van Eyck static inline int mbedtls_ssl_conf_tls13_is_some_ephemeral_enabled(mbedtls_ssl_context *ssl)
196232b31808SJens Wiklander {
1963*b0563631STom Van Eyck     return mbedtls_ssl_conf_tls13_is_kex_mode_enabled(ssl,
196432b31808SJens Wiklander                                                       MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ALL);
196532b31808SJens Wiklander }
196632b31808SJens Wiklander 
1967*b0563631STom Van Eyck static inline int mbedtls_ssl_conf_tls13_is_some_psk_enabled(mbedtls_ssl_context *ssl)
196832b31808SJens Wiklander {
1969*b0563631STom Van Eyck     return mbedtls_ssl_conf_tls13_is_kex_mode_enabled(ssl,
197032b31808SJens Wiklander                                                       MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_ALL);
197132b31808SJens Wiklander }
197232b31808SJens Wiklander 
197332b31808SJens Wiklander #if defined(MBEDTLS_SSL_SRV_C) && \
197432b31808SJens Wiklander     defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_PSK_ENABLED)
197532b31808SJens Wiklander /**
197632b31808SJens Wiklander  * Given a list of key exchange modes, check if at least one of them is
1977*b0563631STom Van Eyck  * supported by peer.
197832b31808SJens Wiklander  *
197932b31808SJens Wiklander  * \param[in] ssl  SSL context
198032b31808SJens Wiklander  * \param kex_modes_mask  Mask of the key exchange modes to check
198132b31808SJens Wiklander  *
1982*b0563631STom Van Eyck  * \return Non-zero if at least one of the key exchange modes is supported by
1983*b0563631STom Van Eyck  *         the peer, otherwise \c 0.
198432b31808SJens Wiklander  */
1985*b0563631STom Van Eyck static inline int mbedtls_ssl_tls13_is_kex_mode_supported(mbedtls_ssl_context *ssl,
198632b31808SJens Wiklander                                                           int kex_modes_mask)
198732b31808SJens Wiklander {
1988*b0563631STom Van Eyck     return (ssl->handshake->tls13_kex_modes & kex_modes_mask) != 0;
198932b31808SJens Wiklander }
199032b31808SJens Wiklander 
1991*b0563631STom Van Eyck static inline int mbedtls_ssl_tls13_is_psk_supported(mbedtls_ssl_context *ssl)
199232b31808SJens Wiklander {
1993*b0563631STom Van Eyck     return mbedtls_ssl_tls13_is_kex_mode_supported(ssl,
199432b31808SJens Wiklander                                                    MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK);
199532b31808SJens Wiklander }
199632b31808SJens Wiklander 
1997*b0563631STom Van Eyck static inline int mbedtls_ssl_tls13_is_psk_ephemeral_supported(
199832b31808SJens Wiklander     mbedtls_ssl_context *ssl)
199932b31808SJens Wiklander {
2000*b0563631STom Van Eyck     return mbedtls_ssl_tls13_is_kex_mode_supported(ssl,
200132b31808SJens Wiklander                                                    MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_EPHEMERAL);
200232b31808SJens Wiklander }
200332b31808SJens Wiklander 
2004*b0563631STom Van Eyck static inline int mbedtls_ssl_tls13_is_ephemeral_supported(mbedtls_ssl_context *ssl)
200532b31808SJens Wiklander {
2006*b0563631STom Van Eyck     return mbedtls_ssl_tls13_is_kex_mode_supported(ssl,
200732b31808SJens Wiklander                                                    MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL);
200832b31808SJens Wiklander }
200932b31808SJens Wiklander 
2010*b0563631STom Van Eyck static inline int mbedtls_ssl_tls13_is_some_ephemeral_supported(mbedtls_ssl_context *ssl)
201132b31808SJens Wiklander {
2012*b0563631STom Van Eyck     return mbedtls_ssl_tls13_is_kex_mode_supported(ssl,
201332b31808SJens Wiklander                                                    MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ALL);
201432b31808SJens Wiklander }
201532b31808SJens Wiklander 
2016*b0563631STom Van Eyck static inline int mbedtls_ssl_tls13_is_some_psk_supported(mbedtls_ssl_context *ssl)
201732b31808SJens Wiklander {
2018*b0563631STom Van Eyck     return mbedtls_ssl_tls13_is_kex_mode_supported(ssl,
201932b31808SJens Wiklander                                                    MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_ALL);
202032b31808SJens Wiklander }
202132b31808SJens Wiklander #endif /* MBEDTLS_SSL_SRV_C &&
202232b31808SJens Wiklander           MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_PSK_ENABLED */
202332b31808SJens Wiklander 
202432b31808SJens Wiklander /*
202532b31808SJens Wiklander  * Helper functions for extensions checking.
202632b31808SJens Wiklander  */
202732b31808SJens Wiklander 
202832b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
202932b31808SJens Wiklander int mbedtls_ssl_tls13_check_received_extension(
203032b31808SJens Wiklander     mbedtls_ssl_context *ssl,
203132b31808SJens Wiklander     int hs_msg_type,
203232b31808SJens Wiklander     unsigned int received_extension_type,
203332b31808SJens Wiklander     uint32_t hs_msg_allowed_extensions_mask);
203432b31808SJens Wiklander 
203532b31808SJens Wiklander static inline void mbedtls_ssl_tls13_set_hs_sent_ext_mask(
203632b31808SJens Wiklander     mbedtls_ssl_context *ssl, unsigned int extension_type)
203732b31808SJens Wiklander {
203832b31808SJens Wiklander     ssl->handshake->sent_extensions |=
203932b31808SJens Wiklander         mbedtls_ssl_get_extension_mask(extension_type);
204032b31808SJens Wiklander }
204132b31808SJens Wiklander 
204232b31808SJens Wiklander /*
204332b31808SJens Wiklander  * Helper functions to check the selected key exchange mode.
204432b31808SJens Wiklander  */
204532b31808SJens Wiklander static inline int mbedtls_ssl_tls13_key_exchange_mode_check(
204632b31808SJens Wiklander     mbedtls_ssl_context *ssl, int kex_mask)
204732b31808SJens Wiklander {
204832b31808SJens Wiklander     return (ssl->handshake->key_exchange_mode & kex_mask) != 0;
204932b31808SJens Wiklander }
205032b31808SJens Wiklander 
205132b31808SJens Wiklander static inline int mbedtls_ssl_tls13_key_exchange_mode_with_psk(
205232b31808SJens Wiklander     mbedtls_ssl_context *ssl)
205332b31808SJens Wiklander {
205432b31808SJens Wiklander     return mbedtls_ssl_tls13_key_exchange_mode_check(ssl,
205532b31808SJens Wiklander                                                      MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_ALL);
205632b31808SJens Wiklander }
205732b31808SJens Wiklander 
205832b31808SJens Wiklander static inline int mbedtls_ssl_tls13_key_exchange_mode_with_ephemeral(
205932b31808SJens Wiklander     mbedtls_ssl_context *ssl)
206032b31808SJens Wiklander {
206132b31808SJens Wiklander     return mbedtls_ssl_tls13_key_exchange_mode_check(ssl,
206232b31808SJens Wiklander                                                      MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ALL);
206332b31808SJens Wiklander }
206432b31808SJens Wiklander 
206532b31808SJens Wiklander /*
206632b31808SJens Wiklander  * Fetch TLS 1.3 handshake message header
206732b31808SJens Wiklander  */
206832b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
206932b31808SJens Wiklander int mbedtls_ssl_tls13_fetch_handshake_msg(mbedtls_ssl_context *ssl,
207032b31808SJens Wiklander                                           unsigned hs_type,
207132b31808SJens Wiklander                                           unsigned char **buf,
207232b31808SJens Wiklander                                           size_t *buf_len);
207332b31808SJens Wiklander 
2074*b0563631STom Van Eyck /**
2075*b0563631STom Van Eyck  * \brief Detect if a list of extensions contains a supported_versions
2076*b0563631STom Van Eyck  *        extension or not.
2077*b0563631STom Van Eyck  *
2078*b0563631STom Van Eyck  * \param[in] ssl  SSL context
2079*b0563631STom Van Eyck  * \param[in] buf  Address of the first byte of the extensions vector.
2080*b0563631STom Van Eyck  * \param[in] end  End of the buffer containing the list of extensions.
2081*b0563631STom Van Eyck  * \param[out] supported_versions_data  If the extension is present, address of
2082*b0563631STom Van Eyck  *                                      its first byte of data, NULL otherwise.
2083*b0563631STom Van Eyck  * \param[out] supported_versions_data_end  If the extension is present, address
2084*b0563631STom Van Eyck  *                                          of the first byte immediately
2085*b0563631STom Van Eyck  *                                          following the extension data, NULL
2086*b0563631STom Van Eyck  *                                          otherwise.
2087*b0563631STom Van Eyck  * \return 0  if the list of extensions does not contain a supported_versions
2088*b0563631STom Van Eyck  *            extension.
2089*b0563631STom Van Eyck  * \return 1  if the list of extensions contains a supported_versions
2090*b0563631STom Van Eyck  *            extension.
2091*b0563631STom Van Eyck  * \return    A negative value if an error occurred while parsing the
2092*b0563631STom Van Eyck  *            extensions.
2093*b0563631STom Van Eyck  */
2094*b0563631STom Van Eyck MBEDTLS_CHECK_RETURN_CRITICAL
2095*b0563631STom Van Eyck int mbedtls_ssl_tls13_is_supported_versions_ext_present_in_exts(
2096*b0563631STom Van Eyck     mbedtls_ssl_context *ssl,
2097*b0563631STom Van Eyck     const unsigned char *buf, const unsigned char *end,
2098*b0563631STom Van Eyck     const unsigned char **supported_versions_data,
2099*b0563631STom Van Eyck     const unsigned char **supported_versions_data_end);
2100*b0563631STom Van Eyck 
210132b31808SJens Wiklander /*
210232b31808SJens Wiklander  * Handler of TLS 1.3 server certificate message
210332b31808SJens Wiklander  */
210432b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
210532b31808SJens Wiklander int mbedtls_ssl_tls13_process_certificate(mbedtls_ssl_context *ssl);
210632b31808SJens Wiklander 
210732b31808SJens Wiklander #if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED)
210832b31808SJens Wiklander /*
210932b31808SJens Wiklander  * Handler of TLS 1.3 write Certificate message
211032b31808SJens Wiklander  */
211132b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
211232b31808SJens Wiklander int mbedtls_ssl_tls13_write_certificate(mbedtls_ssl_context *ssl);
211332b31808SJens Wiklander 
211432b31808SJens Wiklander /*
211532b31808SJens Wiklander  * Handler of TLS 1.3 write Certificate Verify message
211632b31808SJens Wiklander  */
211732b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
211832b31808SJens Wiklander int mbedtls_ssl_tls13_write_certificate_verify(mbedtls_ssl_context *ssl);
211932b31808SJens Wiklander 
212032b31808SJens Wiklander #endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED */
212132b31808SJens Wiklander 
212232b31808SJens Wiklander /*
212332b31808SJens Wiklander  * Generic handler of Certificate Verify
212432b31808SJens Wiklander  */
212532b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
212632b31808SJens Wiklander int mbedtls_ssl_tls13_process_certificate_verify(mbedtls_ssl_context *ssl);
212732b31808SJens Wiklander 
212832b31808SJens Wiklander /*
212932b31808SJens Wiklander  * Write of dummy-CCS's for middlebox compatibility
213032b31808SJens Wiklander  */
213132b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
213232b31808SJens Wiklander int mbedtls_ssl_tls13_write_change_cipher_spec(mbedtls_ssl_context *ssl);
213332b31808SJens Wiklander 
213432b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
213532b31808SJens Wiklander int mbedtls_ssl_reset_transcript_for_hrr(mbedtls_ssl_context *ssl);
213632b31808SJens Wiklander 
2137*b0563631STom Van Eyck #if defined(PSA_WANT_ALG_ECDH) || defined(PSA_WANT_ALG_FFDH)
213832b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
2139*b0563631STom Van Eyck int mbedtls_ssl_tls13_generate_and_write_xxdh_key_exchange(
214032b31808SJens Wiklander     mbedtls_ssl_context *ssl,
214132b31808SJens Wiklander     uint16_t named_group,
214232b31808SJens Wiklander     unsigned char *buf,
214332b31808SJens Wiklander     unsigned char *end,
214432b31808SJens Wiklander     size_t *out_len);
2145*b0563631STom Van Eyck #endif /* PSA_WANT_ALG_ECDH || PSA_WANT_ALG_FFDH */
214632b31808SJens Wiklander 
214732b31808SJens Wiklander #if defined(MBEDTLS_SSL_EARLY_DATA)
214832b31808SJens Wiklander int mbedtls_ssl_tls13_write_early_data_ext(mbedtls_ssl_context *ssl,
2149*b0563631STom Van Eyck                                            int in_new_session_ticket,
215032b31808SJens Wiklander                                            unsigned char *buf,
215132b31808SJens Wiklander                                            const unsigned char *end,
215232b31808SJens Wiklander                                            size_t *out_len);
2153*b0563631STom Van Eyck 
2154*b0563631STom Van Eyck int mbedtls_ssl_tls13_check_early_data_len(mbedtls_ssl_context *ssl,
2155*b0563631STom Van Eyck                                            size_t early_data_len);
2156*b0563631STom Van Eyck 
2157*b0563631STom Van Eyck typedef enum {
2158*b0563631STom Van Eyck /*
2159*b0563631STom Van Eyck  * The client has not sent the first ClientHello yet, the negotiation of early
2160*b0563631STom Van Eyck  * data has not started yet.
2161*b0563631STom Van Eyck  */
2162*b0563631STom Van Eyck     MBEDTLS_SSL_EARLY_DATA_STATE_IDLE,
2163*b0563631STom Van Eyck 
2164*b0563631STom Van Eyck /*
2165*b0563631STom Van Eyck  * In its ClientHello, the client has not included an early data indication
2166*b0563631STom Van Eyck  * extension.
2167*b0563631STom Van Eyck  */
2168*b0563631STom Van Eyck     MBEDTLS_SSL_EARLY_DATA_STATE_NO_IND_SENT,
2169*b0563631STom Van Eyck 
2170*b0563631STom Van Eyck /*
2171*b0563631STom Van Eyck  * The client has sent an early data indication extension in its first
2172*b0563631STom Van Eyck  * ClientHello, it has not received the response (ServerHello or
2173*b0563631STom Van Eyck  * HelloRetryRequest) from the server yet. The transform to protect early data
2174*b0563631STom Van Eyck  * is not set either as for middlebox compatibility a dummy CCS may have to be
2175*b0563631STom Van Eyck  * sent in clear. Early data cannot be sent to the server yet.
2176*b0563631STom Van Eyck  */
2177*b0563631STom Van Eyck     MBEDTLS_SSL_EARLY_DATA_STATE_IND_SENT,
2178*b0563631STom Van Eyck 
2179*b0563631STom Van Eyck /*
2180*b0563631STom Van Eyck  * The client has sent an early data indication extension in its first
2181*b0563631STom Van Eyck  * ClientHello, it has not received the response (ServerHello or
2182*b0563631STom Van Eyck  * HelloRetryRequest) from the server yet. The transform to protect early data
2183*b0563631STom Van Eyck  * has been set and early data can be written now.
2184*b0563631STom Van Eyck  */
2185*b0563631STom Van Eyck     MBEDTLS_SSL_EARLY_DATA_STATE_CAN_WRITE,
2186*b0563631STom Van Eyck 
2187*b0563631STom Van Eyck /*
2188*b0563631STom Van Eyck  * The client has indicated the use of early data and the server has accepted
2189*b0563631STom Van Eyck  * it.
2190*b0563631STom Van Eyck  */
2191*b0563631STom Van Eyck     MBEDTLS_SSL_EARLY_DATA_STATE_ACCEPTED,
2192*b0563631STom Van Eyck 
2193*b0563631STom Van Eyck /*
2194*b0563631STom Van Eyck  * The client has indicated the use of early data but the server has rejected
2195*b0563631STom Van Eyck  * it.
2196*b0563631STom Van Eyck  */
2197*b0563631STom Van Eyck     MBEDTLS_SSL_EARLY_DATA_STATE_REJECTED,
2198*b0563631STom Van Eyck 
2199*b0563631STom Van Eyck /*
2200*b0563631STom Van Eyck  * The client has sent an early data indication extension in its first
2201*b0563631STom Van Eyck  * ClientHello, the server has accepted them and the client has received the
2202*b0563631STom Van Eyck  * server Finished message. It cannot send early data to the server anymore.
2203*b0563631STom Van Eyck  */
2204*b0563631STom Van Eyck     MBEDTLS_SSL_EARLY_DATA_STATE_SERVER_FINISHED_RECEIVED,
2205*b0563631STom Van Eyck 
2206*b0563631STom Van Eyck } mbedtls_ssl_early_data_state;
220732b31808SJens Wiklander #endif /* MBEDTLS_SSL_EARLY_DATA */
220832b31808SJens Wiklander 
220932b31808SJens Wiklander #endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
221032b31808SJens Wiklander 
221132b31808SJens Wiklander #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED)
221232b31808SJens Wiklander /*
221332b31808SJens Wiklander  * Write Signature Algorithm extension
221432b31808SJens Wiklander  */
221532b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
221632b31808SJens Wiklander int mbedtls_ssl_write_sig_alg_ext(mbedtls_ssl_context *ssl, unsigned char *buf,
221732b31808SJens Wiklander                                   const unsigned char *end, size_t *out_len);
221832b31808SJens Wiklander /*
221932b31808SJens Wiklander  * Parse TLS Signature Algorithm extension
222032b31808SJens Wiklander  */
222132b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
222232b31808SJens Wiklander int mbedtls_ssl_parse_sig_alg_ext(mbedtls_ssl_context *ssl,
222332b31808SJens Wiklander                                   const unsigned char *buf,
222432b31808SJens Wiklander                                   const unsigned char *end);
222532b31808SJens Wiklander #endif /* MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED */
222632b31808SJens Wiklander 
222732b31808SJens Wiklander /* Get handshake transcript */
222832b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
222932b31808SJens Wiklander int mbedtls_ssl_get_handshake_transcript(mbedtls_ssl_context *ssl,
223032b31808SJens Wiklander                                          const mbedtls_md_type_t md,
223132b31808SJens Wiklander                                          unsigned char *dst,
223232b31808SJens Wiklander                                          size_t dst_len,
223332b31808SJens Wiklander                                          size_t *olen);
223432b31808SJens Wiklander 
223532b31808SJens Wiklander /*
223632b31808SJens Wiklander  * Return supported groups.
223732b31808SJens Wiklander  *
223832b31808SJens Wiklander  * In future, invocations can be changed to ssl->conf->group_list
223932b31808SJens Wiklander  * when mbedtls_ssl_conf_curves() is deleted.
224032b31808SJens Wiklander  *
224132b31808SJens Wiklander  * ssl->handshake->group_list is either a translation of curve_list to IANA TLS group
224232b31808SJens Wiklander  * identifiers when mbedtls_ssl_conf_curves() has been used, or a pointer to
224332b31808SJens Wiklander  * ssl->conf->group_list when mbedtls_ssl_conf_groups() has been more recently invoked.
224432b31808SJens Wiklander  *
224532b31808SJens Wiklander  */
224632b31808SJens Wiklander static inline const void *mbedtls_ssl_get_groups(const mbedtls_ssl_context *ssl)
224732b31808SJens Wiklander {
224832b31808SJens Wiklander     #if defined(MBEDTLS_DEPRECATED_REMOVED) || !defined(MBEDTLS_ECP_C)
224932b31808SJens Wiklander     return ssl->conf->group_list;
225032b31808SJens Wiklander     #else
225132b31808SJens Wiklander     if ((ssl->handshake != NULL) && (ssl->handshake->group_list != NULL)) {
225232b31808SJens Wiklander         return ssl->handshake->group_list;
225332b31808SJens Wiklander     } else {
225432b31808SJens Wiklander         return ssl->conf->group_list;
225532b31808SJens Wiklander     }
225632b31808SJens Wiklander     #endif
225732b31808SJens Wiklander }
225832b31808SJens Wiklander 
225932b31808SJens Wiklander /*
226032b31808SJens Wiklander  * Helper functions for NamedGroup.
226132b31808SJens Wiklander  */
226232b31808SJens Wiklander static inline int mbedtls_ssl_tls12_named_group_is_ecdhe(uint16_t named_group)
226332b31808SJens Wiklander {
226432b31808SJens Wiklander     /*
226532b31808SJens Wiklander      * RFC 8422 section 5.1.1
226632b31808SJens Wiklander      */
226732b31808SJens Wiklander     return named_group == MBEDTLS_SSL_IANA_TLS_GROUP_X25519    ||
226832b31808SJens Wiklander            named_group == MBEDTLS_SSL_IANA_TLS_GROUP_BP256R1   ||
226932b31808SJens Wiklander            named_group == MBEDTLS_SSL_IANA_TLS_GROUP_BP384R1   ||
227032b31808SJens Wiklander            named_group == MBEDTLS_SSL_IANA_TLS_GROUP_BP512R1   ||
227132b31808SJens Wiklander            named_group == MBEDTLS_SSL_IANA_TLS_GROUP_X448      ||
227232b31808SJens Wiklander            /* Below deprecated curves should be removed with notice to users */
227332b31808SJens Wiklander            named_group == MBEDTLS_SSL_IANA_TLS_GROUP_SECP192K1 ||
227432b31808SJens Wiklander            named_group == MBEDTLS_SSL_IANA_TLS_GROUP_SECP192R1 ||
227532b31808SJens Wiklander            named_group == MBEDTLS_SSL_IANA_TLS_GROUP_SECP224K1 ||
227632b31808SJens Wiklander            named_group == MBEDTLS_SSL_IANA_TLS_GROUP_SECP224R1 ||
227732b31808SJens Wiklander            named_group == MBEDTLS_SSL_IANA_TLS_GROUP_SECP256K1 ||
227832b31808SJens Wiklander            named_group == MBEDTLS_SSL_IANA_TLS_GROUP_SECP256R1 ||
227932b31808SJens Wiklander            named_group == MBEDTLS_SSL_IANA_TLS_GROUP_SECP384R1 ||
228032b31808SJens Wiklander            named_group == MBEDTLS_SSL_IANA_TLS_GROUP_SECP521R1;
228132b31808SJens Wiklander }
228232b31808SJens Wiklander 
228332b31808SJens Wiklander static inline int mbedtls_ssl_tls13_named_group_is_ecdhe(uint16_t named_group)
228432b31808SJens Wiklander {
228532b31808SJens Wiklander     return named_group == MBEDTLS_SSL_IANA_TLS_GROUP_X25519    ||
228632b31808SJens Wiklander            named_group == MBEDTLS_SSL_IANA_TLS_GROUP_SECP256R1 ||
228732b31808SJens Wiklander            named_group == MBEDTLS_SSL_IANA_TLS_GROUP_SECP384R1 ||
228832b31808SJens Wiklander            named_group == MBEDTLS_SSL_IANA_TLS_GROUP_SECP521R1 ||
228932b31808SJens Wiklander            named_group == MBEDTLS_SSL_IANA_TLS_GROUP_X448;
229032b31808SJens Wiklander }
229132b31808SJens Wiklander 
2292*b0563631STom Van Eyck static inline int mbedtls_ssl_tls13_named_group_is_ffdh(uint16_t named_group)
229332b31808SJens Wiklander {
229432b31808SJens Wiklander     return named_group >= MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE2048 &&
229532b31808SJens Wiklander            named_group <= MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE8192;
229632b31808SJens Wiklander }
229732b31808SJens Wiklander 
229832b31808SJens Wiklander static inline int mbedtls_ssl_named_group_is_offered(
229932b31808SJens Wiklander     const mbedtls_ssl_context *ssl, uint16_t named_group)
230032b31808SJens Wiklander {
230132b31808SJens Wiklander     const uint16_t *group_list = mbedtls_ssl_get_groups(ssl);
230232b31808SJens Wiklander 
230332b31808SJens Wiklander     if (group_list == NULL) {
230432b31808SJens Wiklander         return 0;
230532b31808SJens Wiklander     }
230632b31808SJens Wiklander 
230732b31808SJens Wiklander     for (; *group_list != 0; group_list++) {
230832b31808SJens Wiklander         if (*group_list == named_group) {
230932b31808SJens Wiklander             return 1;
231032b31808SJens Wiklander         }
231132b31808SJens Wiklander     }
231232b31808SJens Wiklander 
231332b31808SJens Wiklander     return 0;
231432b31808SJens Wiklander }
231532b31808SJens Wiklander 
231632b31808SJens Wiklander static inline int mbedtls_ssl_named_group_is_supported(uint16_t named_group)
231732b31808SJens Wiklander {
2318*b0563631STom Van Eyck #if defined(PSA_WANT_ALG_ECDH)
231932b31808SJens Wiklander     if (mbedtls_ssl_tls13_named_group_is_ecdhe(named_group)) {
232032b31808SJens Wiklander         if (mbedtls_ssl_get_ecp_group_id_from_tls_id(named_group) !=
232132b31808SJens Wiklander             MBEDTLS_ECP_DP_NONE) {
232232b31808SJens Wiklander             return 1;
232332b31808SJens Wiklander         }
232432b31808SJens Wiklander     }
2325*b0563631STom Van Eyck #endif
2326*b0563631STom Van Eyck #if defined(PSA_WANT_ALG_FFDH)
2327*b0563631STom Van Eyck     if (mbedtls_ssl_tls13_named_group_is_ffdh(named_group)) {
2328*b0563631STom Van Eyck         return 1;
2329*b0563631STom Van Eyck     }
2330*b0563631STom Van Eyck #endif
2331*b0563631STom Van Eyck #if !defined(PSA_WANT_ALG_ECDH) && !defined(PSA_WANT_ALG_FFDH)
2332*b0563631STom Van Eyck     (void) named_group;
2333*b0563631STom Van Eyck #endif
233432b31808SJens Wiklander     return 0;
233532b31808SJens Wiklander }
233632b31808SJens Wiklander 
233732b31808SJens Wiklander /*
233832b31808SJens Wiklander  * Return supported signature algorithms.
233932b31808SJens Wiklander  *
234032b31808SJens Wiklander  * In future, invocations can be changed to ssl->conf->sig_algs when
234132b31808SJens Wiklander  * mbedtls_ssl_conf_sig_hashes() is deleted.
234232b31808SJens Wiklander  *
234332b31808SJens Wiklander  * ssl->handshake->sig_algs is either a translation of sig_hashes to IANA TLS
234432b31808SJens Wiklander  * signature algorithm identifiers when mbedtls_ssl_conf_sig_hashes() has been
234532b31808SJens Wiklander  * used, or a pointer to ssl->conf->sig_algs when mbedtls_ssl_conf_sig_algs() has
234632b31808SJens Wiklander  * been more recently invoked.
234732b31808SJens Wiklander  *
234832b31808SJens Wiklander  */
234932b31808SJens Wiklander static inline const void *mbedtls_ssl_get_sig_algs(
235032b31808SJens Wiklander     const mbedtls_ssl_context *ssl)
235132b31808SJens Wiklander {
235232b31808SJens Wiklander #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED)
235332b31808SJens Wiklander 
235432b31808SJens Wiklander #if !defined(MBEDTLS_DEPRECATED_REMOVED)
235532b31808SJens Wiklander     if (ssl->handshake != NULL &&
235632b31808SJens Wiklander         ssl->handshake->sig_algs_heap_allocated == 1 &&
235732b31808SJens Wiklander         ssl->handshake->sig_algs != NULL) {
235832b31808SJens Wiklander         return ssl->handshake->sig_algs;
235932b31808SJens Wiklander     }
236032b31808SJens Wiklander #endif
236132b31808SJens Wiklander     return ssl->conf->sig_algs;
236232b31808SJens Wiklander 
236332b31808SJens Wiklander #else /* MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED */
236432b31808SJens Wiklander 
236532b31808SJens Wiklander     ((void) ssl);
236632b31808SJens Wiklander     return NULL;
236732b31808SJens Wiklander #endif /* MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED */
236832b31808SJens Wiklander }
236932b31808SJens Wiklander 
237032b31808SJens Wiklander #if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED)
237132b31808SJens Wiklander static inline int mbedtls_ssl_sig_alg_is_received(const mbedtls_ssl_context *ssl,
237232b31808SJens Wiklander                                                   uint16_t own_sig_alg)
237332b31808SJens Wiklander {
237432b31808SJens Wiklander     const uint16_t *sig_alg = ssl->handshake->received_sig_algs;
237532b31808SJens Wiklander     if (sig_alg == NULL) {
237632b31808SJens Wiklander         return 0;
237732b31808SJens Wiklander     }
237832b31808SJens Wiklander 
237932b31808SJens Wiklander     for (; *sig_alg != MBEDTLS_TLS_SIG_NONE; sig_alg++) {
238032b31808SJens Wiklander         if (*sig_alg == own_sig_alg) {
238132b31808SJens Wiklander             return 1;
238232b31808SJens Wiklander         }
238332b31808SJens Wiklander     }
238432b31808SJens Wiklander     return 0;
238532b31808SJens Wiklander }
238632b31808SJens Wiklander 
238732b31808SJens Wiklander static inline int mbedtls_ssl_tls13_sig_alg_for_cert_verify_is_supported(
238832b31808SJens Wiklander     const uint16_t sig_alg)
238932b31808SJens Wiklander {
239032b31808SJens Wiklander     switch (sig_alg) {
239132b31808SJens Wiklander #if defined(MBEDTLS_PK_CAN_ECDSA_SOME)
2392*b0563631STom Van Eyck #if defined(PSA_WANT_ALG_SHA_256) && defined(PSA_WANT_ECC_SECP_R1_256)
239332b31808SJens Wiklander         case MBEDTLS_TLS1_3_SIG_ECDSA_SECP256R1_SHA256:
239432b31808SJens Wiklander             break;
239532b31808SJens Wiklander #endif /* PSA_WANT_ALG_SHA_256 && MBEDTLS_ECP_DP_SECP256R1_ENABLED */
2396*b0563631STom Van Eyck #if defined(PSA_WANT_ALG_SHA_384) && defined(PSA_WANT_ECC_SECP_R1_384)
239732b31808SJens Wiklander         case MBEDTLS_TLS1_3_SIG_ECDSA_SECP384R1_SHA384:
239832b31808SJens Wiklander             break;
239932b31808SJens Wiklander #endif /* PSA_WANT_ALG_SHA_384 && MBEDTLS_ECP_DP_SECP384R1_ENABLED */
2400*b0563631STom Van Eyck #if defined(PSA_WANT_ALG_SHA_512) && defined(PSA_WANT_ECC_SECP_R1_521)
240132b31808SJens Wiklander         case MBEDTLS_TLS1_3_SIG_ECDSA_SECP521R1_SHA512:
240232b31808SJens Wiklander             break;
240332b31808SJens Wiklander #endif /* PSA_WANT_ALG_SHA_512 && MBEDTLS_ECP_DP_SECP521R1_ENABLED */
240432b31808SJens Wiklander #endif /* MBEDTLS_PK_CAN_ECDSA_SOME */
240532b31808SJens Wiklander 
240632b31808SJens Wiklander #if defined(MBEDTLS_PKCS1_V21)
240732b31808SJens Wiklander #if defined(PSA_WANT_ALG_SHA_256)
240832b31808SJens Wiklander         case MBEDTLS_TLS1_3_SIG_RSA_PSS_RSAE_SHA256:
240932b31808SJens Wiklander             break;
241032b31808SJens Wiklander #endif /* PSA_WANT_ALG_SHA_256  */
241132b31808SJens Wiklander #if defined(PSA_WANT_ALG_SHA_384)
241232b31808SJens Wiklander         case MBEDTLS_TLS1_3_SIG_RSA_PSS_RSAE_SHA384:
241332b31808SJens Wiklander             break;
241432b31808SJens Wiklander #endif /* PSA_WANT_ALG_SHA_384 */
241532b31808SJens Wiklander #if defined(PSA_WANT_ALG_SHA_512)
241632b31808SJens Wiklander         case MBEDTLS_TLS1_3_SIG_RSA_PSS_RSAE_SHA512:
241732b31808SJens Wiklander             break;
241832b31808SJens Wiklander #endif /* PSA_WANT_ALG_SHA_512 */
241932b31808SJens Wiklander #endif /* MBEDTLS_PKCS1_V21 */
242032b31808SJens Wiklander         default:
242132b31808SJens Wiklander             return 0;
242232b31808SJens Wiklander     }
242332b31808SJens Wiklander     return 1;
242432b31808SJens Wiklander 
242532b31808SJens Wiklander }
242632b31808SJens Wiklander 
242732b31808SJens Wiklander static inline int mbedtls_ssl_tls13_sig_alg_is_supported(
242832b31808SJens Wiklander     const uint16_t sig_alg)
242932b31808SJens Wiklander {
243032b31808SJens Wiklander     switch (sig_alg) {
243132b31808SJens Wiklander #if defined(MBEDTLS_PKCS1_V15)
2432*b0563631STom Van Eyck #if defined(MBEDTLS_MD_CAN_SHA256)
243332b31808SJens Wiklander         case MBEDTLS_TLS1_3_SIG_RSA_PKCS1_SHA256:
243432b31808SJens Wiklander             break;
2435*b0563631STom Van Eyck #endif /* MBEDTLS_MD_CAN_SHA256 */
2436*b0563631STom Van Eyck #if defined(MBEDTLS_MD_CAN_SHA384)
243732b31808SJens Wiklander         case MBEDTLS_TLS1_3_SIG_RSA_PKCS1_SHA384:
243832b31808SJens Wiklander             break;
2439*b0563631STom Van Eyck #endif /* MBEDTLS_MD_CAN_SHA384 */
2440*b0563631STom Van Eyck #if defined(MBEDTLS_MD_CAN_SHA512)
244132b31808SJens Wiklander         case MBEDTLS_TLS1_3_SIG_RSA_PKCS1_SHA512:
244232b31808SJens Wiklander             break;
2443*b0563631STom Van Eyck #endif /* MBEDTLS_MD_CAN_SHA512 */
244432b31808SJens Wiklander #endif /* MBEDTLS_PKCS1_V15 */
244532b31808SJens Wiklander         default:
244632b31808SJens Wiklander             return mbedtls_ssl_tls13_sig_alg_for_cert_verify_is_supported(
244732b31808SJens Wiklander                 sig_alg);
244832b31808SJens Wiklander     }
244932b31808SJens Wiklander     return 1;
245032b31808SJens Wiklander }
245132b31808SJens Wiklander 
245232b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
245332b31808SJens Wiklander int mbedtls_ssl_tls13_check_sig_alg_cert_key_match(uint16_t sig_alg,
245432b31808SJens Wiklander                                                    mbedtls_pk_context *key);
245532b31808SJens Wiklander #endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED */
245632b31808SJens Wiklander 
245732b31808SJens Wiklander #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED)
245832b31808SJens Wiklander static inline int mbedtls_ssl_sig_alg_is_offered(const mbedtls_ssl_context *ssl,
245932b31808SJens Wiklander                                                  uint16_t proposed_sig_alg)
246032b31808SJens Wiklander {
246132b31808SJens Wiklander     const uint16_t *sig_alg = mbedtls_ssl_get_sig_algs(ssl);
246232b31808SJens Wiklander     if (sig_alg == NULL) {
246332b31808SJens Wiklander         return 0;
246432b31808SJens Wiklander     }
246532b31808SJens Wiklander 
246632b31808SJens Wiklander     for (; *sig_alg != MBEDTLS_TLS_SIG_NONE; sig_alg++) {
246732b31808SJens Wiklander         if (*sig_alg == proposed_sig_alg) {
246832b31808SJens Wiklander             return 1;
246932b31808SJens Wiklander         }
247032b31808SJens Wiklander     }
247132b31808SJens Wiklander     return 0;
247232b31808SJens Wiklander }
247332b31808SJens Wiklander 
247432b31808SJens Wiklander static inline int mbedtls_ssl_get_pk_type_and_md_alg_from_sig_alg(
247532b31808SJens Wiklander     uint16_t sig_alg, mbedtls_pk_type_t *pk_type, mbedtls_md_type_t *md_alg)
247632b31808SJens Wiklander {
247732b31808SJens Wiklander     *pk_type = mbedtls_ssl_pk_alg_from_sig(sig_alg & 0xff);
247832b31808SJens Wiklander     *md_alg = mbedtls_ssl_md_alg_from_hash((sig_alg >> 8) & 0xff);
247932b31808SJens Wiklander 
248032b31808SJens Wiklander     if (*pk_type != MBEDTLS_PK_NONE && *md_alg != MBEDTLS_MD_NONE) {
248132b31808SJens Wiklander         return 0;
248232b31808SJens Wiklander     }
248332b31808SJens Wiklander 
248432b31808SJens Wiklander     switch (sig_alg) {
248532b31808SJens Wiklander #if defined(MBEDTLS_PKCS1_V21)
2486*b0563631STom Van Eyck #if defined(MBEDTLS_MD_CAN_SHA256)
248732b31808SJens Wiklander         case MBEDTLS_TLS1_3_SIG_RSA_PSS_RSAE_SHA256:
248832b31808SJens Wiklander             *md_alg = MBEDTLS_MD_SHA256;
248932b31808SJens Wiklander             *pk_type = MBEDTLS_PK_RSASSA_PSS;
249032b31808SJens Wiklander             break;
2491*b0563631STom Van Eyck #endif /* MBEDTLS_MD_CAN_SHA256  */
2492*b0563631STom Van Eyck #if defined(MBEDTLS_MD_CAN_SHA384)
249332b31808SJens Wiklander         case MBEDTLS_TLS1_3_SIG_RSA_PSS_RSAE_SHA384:
249432b31808SJens Wiklander             *md_alg = MBEDTLS_MD_SHA384;
249532b31808SJens Wiklander             *pk_type = MBEDTLS_PK_RSASSA_PSS;
249632b31808SJens Wiklander             break;
2497*b0563631STom Van Eyck #endif /* MBEDTLS_MD_CAN_SHA384 */
2498*b0563631STom Van Eyck #if defined(MBEDTLS_MD_CAN_SHA512)
249932b31808SJens Wiklander         case MBEDTLS_TLS1_3_SIG_RSA_PSS_RSAE_SHA512:
250032b31808SJens Wiklander             *md_alg = MBEDTLS_MD_SHA512;
250132b31808SJens Wiklander             *pk_type = MBEDTLS_PK_RSASSA_PSS;
250232b31808SJens Wiklander             break;
2503*b0563631STom Van Eyck #endif /* MBEDTLS_MD_CAN_SHA512 */
250432b31808SJens Wiklander #endif /* MBEDTLS_PKCS1_V21 */
250532b31808SJens Wiklander         default:
250632b31808SJens Wiklander             return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
250732b31808SJens Wiklander     }
250832b31808SJens Wiklander     return 0;
250932b31808SJens Wiklander }
251032b31808SJens Wiklander 
251132b31808SJens Wiklander #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
251232b31808SJens Wiklander static inline int mbedtls_ssl_tls12_sig_alg_is_supported(
251332b31808SJens Wiklander     const uint16_t sig_alg)
251432b31808SJens Wiklander {
251532b31808SJens Wiklander     /* High byte is hash */
251632b31808SJens Wiklander     unsigned char hash = MBEDTLS_BYTE_1(sig_alg);
251732b31808SJens Wiklander     unsigned char sig = MBEDTLS_BYTE_0(sig_alg);
251832b31808SJens Wiklander 
251932b31808SJens Wiklander     switch (hash) {
2520*b0563631STom Van Eyck #if defined(MBEDTLS_MD_CAN_MD5)
252132b31808SJens Wiklander         case MBEDTLS_SSL_HASH_MD5:
252232b31808SJens Wiklander             break;
252332b31808SJens Wiklander #endif
252432b31808SJens Wiklander 
2525*b0563631STom Van Eyck #if defined(MBEDTLS_MD_CAN_SHA1)
252632b31808SJens Wiklander         case MBEDTLS_SSL_HASH_SHA1:
252732b31808SJens Wiklander             break;
252832b31808SJens Wiklander #endif
252932b31808SJens Wiklander 
2530*b0563631STom Van Eyck #if defined(MBEDTLS_MD_CAN_SHA224)
253132b31808SJens Wiklander         case MBEDTLS_SSL_HASH_SHA224:
253232b31808SJens Wiklander             break;
253332b31808SJens Wiklander #endif
253432b31808SJens Wiklander 
2535*b0563631STom Van Eyck #if defined(MBEDTLS_MD_CAN_SHA256)
253632b31808SJens Wiklander         case MBEDTLS_SSL_HASH_SHA256:
253732b31808SJens Wiklander             break;
253832b31808SJens Wiklander #endif
253932b31808SJens Wiklander 
2540*b0563631STom Van Eyck #if defined(MBEDTLS_MD_CAN_SHA384)
254132b31808SJens Wiklander         case MBEDTLS_SSL_HASH_SHA384:
254232b31808SJens Wiklander             break;
254332b31808SJens Wiklander #endif
254432b31808SJens Wiklander 
2545*b0563631STom Van Eyck #if defined(MBEDTLS_MD_CAN_SHA512)
254632b31808SJens Wiklander         case MBEDTLS_SSL_HASH_SHA512:
254732b31808SJens Wiklander             break;
254832b31808SJens Wiklander #endif
254932b31808SJens Wiklander 
255032b31808SJens Wiklander         default:
255132b31808SJens Wiklander             return 0;
255232b31808SJens Wiklander     }
255332b31808SJens Wiklander 
255432b31808SJens Wiklander     switch (sig) {
255532b31808SJens Wiklander #if defined(MBEDTLS_RSA_C)
255632b31808SJens Wiklander         case MBEDTLS_SSL_SIG_RSA:
255732b31808SJens Wiklander             break;
255832b31808SJens Wiklander #endif
255932b31808SJens Wiklander 
2560*b0563631STom Van Eyck #if defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED)
256132b31808SJens Wiklander         case MBEDTLS_SSL_SIG_ECDSA:
256232b31808SJens Wiklander             break;
256332b31808SJens Wiklander #endif
256432b31808SJens Wiklander 
256532b31808SJens Wiklander         default:
256632b31808SJens Wiklander             return 0;
256732b31808SJens Wiklander     }
256832b31808SJens Wiklander 
256932b31808SJens Wiklander     return 1;
257032b31808SJens Wiklander }
257132b31808SJens Wiklander #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
257232b31808SJens Wiklander 
257332b31808SJens Wiklander static inline int mbedtls_ssl_sig_alg_is_supported(
257432b31808SJens Wiklander     const mbedtls_ssl_context *ssl,
257532b31808SJens Wiklander     const uint16_t sig_alg)
257632b31808SJens Wiklander {
257732b31808SJens Wiklander 
257832b31808SJens Wiklander #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
257932b31808SJens Wiklander     if (ssl->tls_version == MBEDTLS_SSL_VERSION_TLS1_2) {
258032b31808SJens Wiklander         return mbedtls_ssl_tls12_sig_alg_is_supported(sig_alg);
258132b31808SJens Wiklander     }
258232b31808SJens Wiklander #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
258332b31808SJens Wiklander 
258432b31808SJens Wiklander #if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED)
258532b31808SJens Wiklander     if (ssl->tls_version == MBEDTLS_SSL_VERSION_TLS1_3) {
258632b31808SJens Wiklander         return mbedtls_ssl_tls13_sig_alg_is_supported(sig_alg);
258732b31808SJens Wiklander     }
258832b31808SJens Wiklander #endif
258932b31808SJens Wiklander     ((void) ssl);
259032b31808SJens Wiklander     ((void) sig_alg);
259132b31808SJens Wiklander     return 0;
259232b31808SJens Wiklander }
259332b31808SJens Wiklander #endif /* MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED */
259432b31808SJens Wiklander 
259532b31808SJens Wiklander #if defined(MBEDTLS_USE_PSA_CRYPTO) || defined(MBEDTLS_SSL_PROTO_TLS1_3)
259632b31808SJens Wiklander /* Corresponding PSA algorithm for MBEDTLS_CIPHER_NULL.
259732b31808SJens Wiklander  * Same value is used for PSA_ALG_CATEGORY_CIPHER, hence it is
259832b31808SJens Wiklander  * guaranteed to not be a valid PSA algorithm identifier.
259932b31808SJens Wiklander  */
260032b31808SJens Wiklander #define MBEDTLS_SSL_NULL_CIPHER 0x04000000
260132b31808SJens Wiklander 
260232b31808SJens Wiklander /**
260332b31808SJens Wiklander  * \brief       Translate mbedtls cipher type/taglen pair to psa:
260432b31808SJens Wiklander  *              algorithm, key type and key size.
260532b31808SJens Wiklander  *
260632b31808SJens Wiklander  * \param  mbedtls_cipher_type [in] given mbedtls cipher type
260732b31808SJens Wiklander  * \param  taglen              [in] given tag length
260832b31808SJens Wiklander  *                                  0 - default tag length
260932b31808SJens Wiklander  * \param  alg                 [out] corresponding PSA alg
261032b31808SJens Wiklander  *                                   There is no corresponding PSA
261132b31808SJens Wiklander  *                                   alg for MBEDTLS_CIPHER_NULL, so
261232b31808SJens Wiklander  *                                   in this case MBEDTLS_SSL_NULL_CIPHER
261332b31808SJens Wiklander  *                                   is returned via this parameter
261432b31808SJens Wiklander  * \param  key_type            [out] corresponding PSA key type
261532b31808SJens Wiklander  * \param  key_size            [out] corresponding PSA key size
261632b31808SJens Wiklander  *
261732b31808SJens Wiklander  * \return                     PSA_SUCCESS on success or PSA_ERROR_NOT_SUPPORTED if
261832b31808SJens Wiklander  *                             conversion is not supported.
261932b31808SJens Wiklander  */
262032b31808SJens Wiklander psa_status_t mbedtls_ssl_cipher_to_psa(mbedtls_cipher_type_t mbedtls_cipher_type,
262132b31808SJens Wiklander                                        size_t taglen,
262232b31808SJens Wiklander                                        psa_algorithm_t *alg,
262332b31808SJens Wiklander                                        psa_key_type_t *key_type,
262432b31808SJens Wiklander                                        size_t *key_size);
262532b31808SJens Wiklander 
262632b31808SJens Wiklander #if !defined(MBEDTLS_DEPRECATED_REMOVED)
262732b31808SJens Wiklander /**
262832b31808SJens Wiklander  * \brief       Convert given PSA status to mbedtls error code.
262932b31808SJens Wiklander  *
263032b31808SJens Wiklander  * \param  status      [in] given PSA status
263132b31808SJens Wiklander  *
263232b31808SJens Wiklander  * \return             corresponding mbedtls error code
263332b31808SJens Wiklander  */
263432b31808SJens Wiklander static inline MBEDTLS_DEPRECATED int psa_ssl_status_to_mbedtls(psa_status_t status)
263532b31808SJens Wiklander {
263632b31808SJens Wiklander     switch (status) {
263732b31808SJens Wiklander         case PSA_SUCCESS:
263832b31808SJens Wiklander             return 0;
263932b31808SJens Wiklander         case PSA_ERROR_INSUFFICIENT_MEMORY:
264032b31808SJens Wiklander             return MBEDTLS_ERR_SSL_ALLOC_FAILED;
264132b31808SJens Wiklander         case PSA_ERROR_NOT_SUPPORTED:
264232b31808SJens Wiklander             return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
264332b31808SJens Wiklander         case PSA_ERROR_INVALID_SIGNATURE:
264432b31808SJens Wiklander             return MBEDTLS_ERR_SSL_INVALID_MAC;
264532b31808SJens Wiklander         case PSA_ERROR_INVALID_ARGUMENT:
264632b31808SJens Wiklander             return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
264732b31808SJens Wiklander         case PSA_ERROR_BAD_STATE:
264832b31808SJens Wiklander             return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
264932b31808SJens Wiklander         case PSA_ERROR_BUFFER_TOO_SMALL:
265032b31808SJens Wiklander             return MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL;
265132b31808SJens Wiklander         default:
265232b31808SJens Wiklander             return MBEDTLS_ERR_PLATFORM_HW_ACCEL_FAILED;
265332b31808SJens Wiklander     }
265432b31808SJens Wiklander }
265532b31808SJens Wiklander #endif /* !MBEDTLS_DEPRECATED_REMOVED */
265632b31808SJens Wiklander #endif /* MBEDTLS_USE_PSA_CRYPTO || MBEDTLS_SSL_PROTO_TLS1_3 */
265732b31808SJens Wiklander 
265832b31808SJens Wiklander #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) && \
265932b31808SJens Wiklander     defined(MBEDTLS_USE_PSA_CRYPTO)
266032b31808SJens Wiklander 
266132b31808SJens Wiklander typedef enum {
266232b31808SJens Wiklander     MBEDTLS_ECJPAKE_ROUND_ONE,
266332b31808SJens Wiklander     MBEDTLS_ECJPAKE_ROUND_TWO
266432b31808SJens Wiklander } mbedtls_ecjpake_rounds_t;
266532b31808SJens Wiklander 
266632b31808SJens Wiklander /**
266732b31808SJens Wiklander  * \brief       Parse the provided input buffer for getting the first round
266832b31808SJens Wiklander  *              of key exchange. This code is common between server and client
266932b31808SJens Wiklander  *
267032b31808SJens Wiklander  * \param  pake_ctx [in] the PAKE's operation/context structure
267132b31808SJens Wiklander  * \param  buf      [in] input buffer to parse
267232b31808SJens Wiklander  * \param  len      [in] length of the input buffer
267332b31808SJens Wiklander  * \param  round    [in] either MBEDTLS_ECJPAKE_ROUND_ONE or
267432b31808SJens Wiklander  *                       MBEDTLS_ECJPAKE_ROUND_TWO
267532b31808SJens Wiklander  *
267632b31808SJens Wiklander  * \return               0 on success or a negative error code in case of failure
267732b31808SJens Wiklander  */
267832b31808SJens Wiklander int mbedtls_psa_ecjpake_read_round(
267932b31808SJens Wiklander     psa_pake_operation_t *pake_ctx,
268032b31808SJens Wiklander     const unsigned char *buf,
268132b31808SJens Wiklander     size_t len, mbedtls_ecjpake_rounds_t round);
268232b31808SJens Wiklander 
268332b31808SJens Wiklander /**
268432b31808SJens Wiklander  * \brief       Write the first round of key exchange into the provided output
268532b31808SJens Wiklander  *              buffer. This code is common between server and client
268632b31808SJens Wiklander  *
268732b31808SJens Wiklander  * \param  pake_ctx [in] the PAKE's operation/context structure
268832b31808SJens Wiklander  * \param  buf      [out] the output buffer in which data will be written to
268932b31808SJens Wiklander  * \param  len      [in] length of the output buffer
269032b31808SJens Wiklander  * \param  olen     [out] the length of the data really written on the buffer
269132b31808SJens Wiklander  * \param  round    [in] either MBEDTLS_ECJPAKE_ROUND_ONE or
269232b31808SJens Wiklander  *                       MBEDTLS_ECJPAKE_ROUND_TWO
269332b31808SJens Wiklander  *
269432b31808SJens Wiklander  * \return               0 on success or a negative error code in case of failure
269532b31808SJens Wiklander  */
269632b31808SJens Wiklander int mbedtls_psa_ecjpake_write_round(
269732b31808SJens Wiklander     psa_pake_operation_t *pake_ctx,
269832b31808SJens Wiklander     unsigned char *buf,
269932b31808SJens Wiklander     size_t len, size_t *olen,
270032b31808SJens Wiklander     mbedtls_ecjpake_rounds_t round);
270132b31808SJens Wiklander 
270232b31808SJens Wiklander #endif //MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED && MBEDTLS_USE_PSA_CRYPTO
270332b31808SJens Wiklander 
270432b31808SJens Wiklander /**
270532b31808SJens Wiklander  * \brief       TLS record protection modes
270632b31808SJens Wiklander  */
270732b31808SJens Wiklander typedef enum {
270832b31808SJens Wiklander     MBEDTLS_SSL_MODE_STREAM = 0,
270932b31808SJens Wiklander     MBEDTLS_SSL_MODE_CBC,
271032b31808SJens Wiklander     MBEDTLS_SSL_MODE_CBC_ETM,
271132b31808SJens Wiklander     MBEDTLS_SSL_MODE_AEAD
271232b31808SJens Wiklander } mbedtls_ssl_mode_t;
271332b31808SJens Wiklander 
271432b31808SJens Wiklander mbedtls_ssl_mode_t mbedtls_ssl_get_mode_from_transform(
271532b31808SJens Wiklander     const mbedtls_ssl_transform *transform);
271632b31808SJens Wiklander 
271732b31808SJens Wiklander #if defined(MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM)
271832b31808SJens Wiklander mbedtls_ssl_mode_t mbedtls_ssl_get_mode_from_ciphersuite(
271932b31808SJens Wiklander     int encrypt_then_mac,
272032b31808SJens Wiklander     const mbedtls_ssl_ciphersuite_t *suite);
272132b31808SJens Wiklander #else
272232b31808SJens Wiklander mbedtls_ssl_mode_t mbedtls_ssl_get_mode_from_ciphersuite(
272332b31808SJens Wiklander     const mbedtls_ssl_ciphersuite_t *suite);
272432b31808SJens Wiklander #endif /* MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM */
272532b31808SJens Wiklander 
2726*b0563631STom Van Eyck #if defined(PSA_WANT_ALG_ECDH) || defined(PSA_WANT_ALG_FFDH)
272732b31808SJens Wiklander 
272832b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
2729*b0563631STom Van Eyck int mbedtls_ssl_tls13_read_public_xxdhe_share(mbedtls_ssl_context *ssl,
273032b31808SJens Wiklander                                               const unsigned char *buf,
273132b31808SJens Wiklander                                               size_t buf_len);
273232b31808SJens Wiklander 
2733*b0563631STom Van Eyck #endif /* PSA_WANT_ALG_ECDH || PSA_WANT_ALG_FFDH */
273432b31808SJens Wiklander 
273532b31808SJens Wiklander static inline int mbedtls_ssl_tls13_cipher_suite_is_offered(
273632b31808SJens Wiklander     mbedtls_ssl_context *ssl, int cipher_suite)
273732b31808SJens Wiklander {
273832b31808SJens Wiklander     const int *ciphersuite_list = ssl->conf->ciphersuite_list;
273932b31808SJens Wiklander 
274032b31808SJens Wiklander     /* Check whether we have offered this ciphersuite */
274132b31808SJens Wiklander     for (size_t i = 0; ciphersuite_list[i] != 0; i++) {
274232b31808SJens Wiklander         if (ciphersuite_list[i] == cipher_suite) {
274332b31808SJens Wiklander             return 1;
274432b31808SJens Wiklander         }
274532b31808SJens Wiklander     }
274632b31808SJens Wiklander     return 0;
274732b31808SJens Wiklander }
274832b31808SJens Wiklander 
274932b31808SJens Wiklander /**
275032b31808SJens Wiklander  * \brief Validate cipher suite against config in SSL context.
275132b31808SJens Wiklander  *
275232b31808SJens Wiklander  * \param ssl              SSL context
275332b31808SJens Wiklander  * \param suite_info       Cipher suite to validate
275432b31808SJens Wiklander  * \param min_tls_version  Minimal TLS version to accept a cipher suite
275532b31808SJens Wiklander  * \param max_tls_version  Maximal TLS version to accept a cipher suite
275632b31808SJens Wiklander  *
275732b31808SJens Wiklander  * \return 0 if valid, negative value otherwise.
275832b31808SJens Wiklander  */
275932b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
276032b31808SJens Wiklander int mbedtls_ssl_validate_ciphersuite(
276132b31808SJens Wiklander     const mbedtls_ssl_context *ssl,
276232b31808SJens Wiklander     const mbedtls_ssl_ciphersuite_t *suite_info,
276332b31808SJens Wiklander     mbedtls_ssl_protocol_version min_tls_version,
276432b31808SJens Wiklander     mbedtls_ssl_protocol_version max_tls_version);
276532b31808SJens Wiklander 
276632b31808SJens Wiklander #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
276732b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
276832b31808SJens Wiklander int mbedtls_ssl_parse_server_name_ext(mbedtls_ssl_context *ssl,
276932b31808SJens Wiklander                                       const unsigned char *buf,
277032b31808SJens Wiklander                                       const unsigned char *end);
277132b31808SJens Wiklander #endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
277232b31808SJens Wiklander 
277332b31808SJens Wiklander #if defined(MBEDTLS_SSL_RECORD_SIZE_LIMIT)
277432b31808SJens Wiklander #define MBEDTLS_SSL_RECORD_SIZE_LIMIT_EXTENSION_DATA_LENGTH (2)
2775*b0563631STom Van Eyck #define MBEDTLS_SSL_RECORD_SIZE_LIMIT_MIN (64)      /* As defined in RFC 8449 */
277632b31808SJens Wiklander 
277732b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
277832b31808SJens Wiklander int mbedtls_ssl_tls13_parse_record_size_limit_ext(mbedtls_ssl_context *ssl,
277932b31808SJens Wiklander                                                   const unsigned char *buf,
278032b31808SJens Wiklander                                                   const unsigned char *end);
2781*b0563631STom Van Eyck 
2782*b0563631STom Van Eyck MBEDTLS_CHECK_RETURN_CRITICAL
2783*b0563631STom Van Eyck int mbedtls_ssl_tls13_write_record_size_limit_ext(mbedtls_ssl_context *ssl,
2784*b0563631STom Van Eyck                                                   unsigned char *buf,
2785*b0563631STom Van Eyck                                                   const unsigned char *end,
2786*b0563631STom Van Eyck                                                   size_t *out_len);
278732b31808SJens Wiklander #endif /* MBEDTLS_SSL_RECORD_SIZE_LIMIT */
278832b31808SJens Wiklander 
278932b31808SJens Wiklander #if defined(MBEDTLS_SSL_ALPN)
279032b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
279132b31808SJens Wiklander int mbedtls_ssl_parse_alpn_ext(mbedtls_ssl_context *ssl,
279232b31808SJens Wiklander                                const unsigned char *buf,
279332b31808SJens Wiklander                                const unsigned char *end);
279432b31808SJens Wiklander 
279532b31808SJens Wiklander 
279632b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
279732b31808SJens Wiklander int mbedtls_ssl_write_alpn_ext(mbedtls_ssl_context *ssl,
279832b31808SJens Wiklander                                unsigned char *buf,
279932b31808SJens Wiklander                                unsigned char *end,
280032b31808SJens Wiklander                                size_t *out_len);
280132b31808SJens Wiklander #endif /* MBEDTLS_SSL_ALPN */
280232b31808SJens Wiklander 
280332b31808SJens Wiklander #if defined(MBEDTLS_TEST_HOOKS)
280432b31808SJens Wiklander int mbedtls_ssl_check_dtls_clihlo_cookie(
280532b31808SJens Wiklander     mbedtls_ssl_context *ssl,
280632b31808SJens Wiklander     const unsigned char *cli_id, size_t cli_id_len,
280732b31808SJens Wiklander     const unsigned char *in, size_t in_len,
280832b31808SJens Wiklander     unsigned char *obuf, size_t buf_len, size_t *olen);
280932b31808SJens Wiklander #endif
281032b31808SJens Wiklander 
281132b31808SJens Wiklander #if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_PSK_ENABLED)
281232b31808SJens Wiklander /**
281332b31808SJens Wiklander  * \brief Given an SSL context and its associated configuration, write the TLS
281432b31808SJens Wiklander  *        1.3 specific Pre-Shared key extension.
281532b31808SJens Wiklander  *
281632b31808SJens Wiklander  * \param[in]   ssl     SSL context
281732b31808SJens Wiklander  * \param[in]   buf     Base address of the buffer where to write the extension
281832b31808SJens Wiklander  * \param[in]   end     End address of the buffer where to write the extension
281932b31808SJens Wiklander  * \param[out]  out_len Length in bytes of the Pre-Shared key extension: data
282032b31808SJens Wiklander  *                      written into the buffer \p buf by this function plus
282132b31808SJens Wiklander  *                      the length of the binders to be written.
282232b31808SJens Wiklander  * \param[out]  binders_len Length of the binders to be written at the end of
282332b31808SJens Wiklander  *                          the extension.
282432b31808SJens Wiklander  */
282532b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
282632b31808SJens Wiklander int mbedtls_ssl_tls13_write_identities_of_pre_shared_key_ext(
282732b31808SJens Wiklander     mbedtls_ssl_context *ssl,
282832b31808SJens Wiklander     unsigned char *buf, unsigned char *end,
282932b31808SJens Wiklander     size_t *out_len, size_t *binders_len);
283032b31808SJens Wiklander 
283132b31808SJens Wiklander /**
283232b31808SJens Wiklander  * \brief Given an SSL context and its associated configuration, write the TLS
283332b31808SJens Wiklander  *        1.3 specific Pre-Shared key extension binders at the end of the
283432b31808SJens Wiklander  *        ClientHello.
283532b31808SJens Wiklander  *
283632b31808SJens Wiklander  * \param[in]   ssl     SSL context
283732b31808SJens Wiklander  * \param[in]   buf     Base address of the buffer where to write the binders
283832b31808SJens Wiklander  * \param[in]   end     End address of the buffer where to write the binders
283932b31808SJens Wiklander  */
284032b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
284132b31808SJens Wiklander int mbedtls_ssl_tls13_write_binders_of_pre_shared_key_ext(
284232b31808SJens Wiklander     mbedtls_ssl_context *ssl,
284332b31808SJens Wiklander     unsigned char *buf, unsigned char *end);
284432b31808SJens Wiklander #endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_PSK_ENABLED */
284532b31808SJens Wiklander 
284632b31808SJens Wiklander #if defined(MBEDTLS_SSL_PROTO_TLS1_3) && \
284732b31808SJens Wiklander     defined(MBEDTLS_SSL_SESSION_TICKETS) && \
284832b31808SJens Wiklander     defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) && \
284932b31808SJens Wiklander     defined(MBEDTLS_SSL_CLI_C)
285032b31808SJens Wiklander MBEDTLS_CHECK_RETURN_CRITICAL
285132b31808SJens Wiklander int mbedtls_ssl_session_set_hostname(mbedtls_ssl_session *session,
285232b31808SJens Wiklander                                      const char *hostname);
285332b31808SJens Wiklander #endif
285432b31808SJens Wiklander 
2855*b0563631STom Van Eyck #if defined(MBEDTLS_SSL_SRV_C) && defined(MBEDTLS_SSL_EARLY_DATA) && \
2856*b0563631STom Van Eyck     defined(MBEDTLS_SSL_ALPN)
2857*b0563631STom Van Eyck MBEDTLS_CHECK_RETURN_CRITICAL
2858*b0563631STom Van Eyck int mbedtls_ssl_session_set_ticket_alpn(mbedtls_ssl_session *session,
2859*b0563631STom Van Eyck                                         const char *alpn);
2860*b0563631STom Van Eyck #endif
2861*b0563631STom Van Eyck 
286232b31808SJens Wiklander #if defined(MBEDTLS_SSL_PROTO_TLS1_3) && defined(MBEDTLS_SSL_SESSION_TICKETS)
2863*b0563631STom Van Eyck 
2864*b0563631STom Van Eyck #define MBEDTLS_SSL_TLS1_3_MAX_ALLOWED_TICKET_LIFETIME (604800)
2865*b0563631STom Van Eyck 
2866*b0563631STom Van Eyck static inline unsigned int mbedtls_ssl_tls13_session_get_ticket_flags(
286732b31808SJens Wiklander     mbedtls_ssl_session *session, unsigned int flags)
286832b31808SJens Wiklander {
286932b31808SJens Wiklander     return session->ticket_flags &
287032b31808SJens Wiklander            (flags & MBEDTLS_SSL_TLS1_3_TICKET_FLAGS_MASK);
287132b31808SJens Wiklander }
287232b31808SJens Wiklander 
2873*b0563631STom Van Eyck /**
2874*b0563631STom Van Eyck  * Check if at least one of the given flags is set in
2875*b0563631STom Van Eyck  * the session ticket. See the definition of
2876*b0563631STom Van Eyck  * `MBEDTLS_SSL_TLS1_3_TICKET_FLAGS_MASK` to get all
2877*b0563631STom Van Eyck  * permitted flags.
2878*b0563631STom Van Eyck  */
2879*b0563631STom Van Eyck static inline int mbedtls_ssl_tls13_session_ticket_has_flags(
2880*b0563631STom Van Eyck     mbedtls_ssl_session *session, unsigned int flags)
2881*b0563631STom Van Eyck {
2882*b0563631STom Van Eyck     return mbedtls_ssl_tls13_session_get_ticket_flags(session, flags) != 0;
2883*b0563631STom Van Eyck }
2884*b0563631STom Van Eyck 
2885*b0563631STom Van Eyck static inline int mbedtls_ssl_tls13_session_ticket_allow_psk(
2886*b0563631STom Van Eyck     mbedtls_ssl_session *session)
2887*b0563631STom Van Eyck {
2888*b0563631STom Van Eyck     return mbedtls_ssl_tls13_session_ticket_has_flags(
2889*b0563631STom Van Eyck         session, MBEDTLS_SSL_TLS1_3_TICKET_ALLOW_PSK_RESUMPTION);
2890*b0563631STom Van Eyck }
2891*b0563631STom Van Eyck 
2892*b0563631STom Van Eyck static inline int mbedtls_ssl_tls13_session_ticket_allow_psk_ephemeral(
2893*b0563631STom Van Eyck     mbedtls_ssl_session *session)
2894*b0563631STom Van Eyck {
2895*b0563631STom Van Eyck     return mbedtls_ssl_tls13_session_ticket_has_flags(
2896*b0563631STom Van Eyck         session, MBEDTLS_SSL_TLS1_3_TICKET_ALLOW_PSK_EPHEMERAL_RESUMPTION);
2897*b0563631STom Van Eyck }
2898*b0563631STom Van Eyck 
2899*b0563631STom Van Eyck static inline unsigned int mbedtls_ssl_tls13_session_ticket_allow_early_data(
2900*b0563631STom Van Eyck     mbedtls_ssl_session *session)
2901*b0563631STom Van Eyck {
2902*b0563631STom Van Eyck     return mbedtls_ssl_tls13_session_ticket_has_flags(
2903*b0563631STom Van Eyck         session, MBEDTLS_SSL_TLS1_3_TICKET_ALLOW_EARLY_DATA);
2904*b0563631STom Van Eyck }
2905*b0563631STom Van Eyck 
2906*b0563631STom Van Eyck static inline void mbedtls_ssl_tls13_session_set_ticket_flags(
290732b31808SJens Wiklander     mbedtls_ssl_session *session, unsigned int flags)
290832b31808SJens Wiklander {
290932b31808SJens Wiklander     session->ticket_flags |= (flags & MBEDTLS_SSL_TLS1_3_TICKET_FLAGS_MASK);
291032b31808SJens Wiklander }
291132b31808SJens Wiklander 
2912*b0563631STom Van Eyck static inline void mbedtls_ssl_tls13_session_clear_ticket_flags(
291332b31808SJens Wiklander     mbedtls_ssl_session *session, unsigned int flags)
291432b31808SJens Wiklander {
291532b31808SJens Wiklander     session->ticket_flags &= ~(flags & MBEDTLS_SSL_TLS1_3_TICKET_FLAGS_MASK);
291632b31808SJens Wiklander }
291732b31808SJens Wiklander #endif /* MBEDTLS_SSL_PROTO_TLS1_3 && MBEDTLS_SSL_SESSION_TICKETS */
291832b31808SJens Wiklander 
291932b31808SJens Wiklander #if defined(MBEDTLS_SSL_CLI_C) && defined(MBEDTLS_SSL_PROTO_TLS1_3)
292032b31808SJens Wiklander int mbedtls_ssl_tls13_finalize_client_hello(mbedtls_ssl_context *ssl);
292132b31808SJens Wiklander #endif
292232b31808SJens Wiklander 
2923*b0563631STom Van Eyck #if defined(MBEDTLS_TEST_HOOKS) && defined(MBEDTLS_SSL_SOME_SUITES_USE_MAC)
2924*b0563631STom Van Eyck 
2925*b0563631STom Van Eyck /** Compute the HMAC of variable-length data with constant flow.
2926*b0563631STom Van Eyck  *
2927*b0563631STom Van Eyck  * This function computes the HMAC of the concatenation of \p add_data and \p
2928*b0563631STom Van Eyck  * data, and does with a code flow and memory access pattern that does not
2929*b0563631STom Van Eyck  * depend on \p data_len_secret, but only on \p min_data_len and \p
2930*b0563631STom Van Eyck  * max_data_len. In particular, this function always reads exactly \p
2931*b0563631STom Van Eyck  * max_data_len bytes from \p data.
2932*b0563631STom Van Eyck  *
2933*b0563631STom Van Eyck  * \param ctx               The HMAC context. It must have keys configured
2934*b0563631STom Van Eyck  *                          with mbedtls_md_hmac_starts() and use one of the
2935*b0563631STom Van Eyck  *                          following hashes: SHA-384, SHA-256, SHA-1 or MD-5.
2936*b0563631STom Van Eyck  *                          It is reset using mbedtls_md_hmac_reset() after
2937*b0563631STom Van Eyck  *                          the computation is complete to prepare for the
2938*b0563631STom Van Eyck  *                          next computation.
2939*b0563631STom Van Eyck  * \param add_data          The first part of the message whose HMAC is being
2940*b0563631STom Van Eyck  *                          calculated. This must point to a readable buffer
2941*b0563631STom Van Eyck  *                          of \p add_data_len bytes.
2942*b0563631STom Van Eyck  * \param add_data_len      The length of \p add_data in bytes.
2943*b0563631STom Van Eyck  * \param data              The buffer containing the second part of the
2944*b0563631STom Van Eyck  *                          message. This must point to a readable buffer
2945*b0563631STom Van Eyck  *                          of \p max_data_len bytes.
2946*b0563631STom Van Eyck  * \param data_len_secret   The length of the data to process in \p data.
2947*b0563631STom Van Eyck  *                          This must be no less than \p min_data_len and no
2948*b0563631STom Van Eyck  *                          greater than \p max_data_len.
2949*b0563631STom Van Eyck  * \param min_data_len      The minimal length of the second part of the
2950*b0563631STom Van Eyck  *                          message, read from \p data.
2951*b0563631STom Van Eyck  * \param max_data_len      The maximal length of the second part of the
2952*b0563631STom Van Eyck  *                          message, read from \p data.
2953*b0563631STom Van Eyck  * \param output            The HMAC will be written here. This must point to
2954*b0563631STom Van Eyck  *                          a writable buffer of sufficient size to hold the
2955*b0563631STom Van Eyck  *                          HMAC value.
2956*b0563631STom Van Eyck  *
2957*b0563631STom Van Eyck  * \retval 0 on success.
2958*b0563631STom Van Eyck  * \retval #MBEDTLS_ERR_PLATFORM_HW_ACCEL_FAILED
2959*b0563631STom Van Eyck  *         The hardware accelerator failed.
2960*b0563631STom Van Eyck  */
2961*b0563631STom Van Eyck #if defined(MBEDTLS_USE_PSA_CRYPTO)
2962*b0563631STom Van Eyck int mbedtls_ct_hmac(mbedtls_svc_key_id_t key,
2963*b0563631STom Van Eyck                     psa_algorithm_t mac_alg,
2964*b0563631STom Van Eyck                     const unsigned char *add_data,
2965*b0563631STom Van Eyck                     size_t add_data_len,
2966*b0563631STom Van Eyck                     const unsigned char *data,
2967*b0563631STom Van Eyck                     size_t data_len_secret,
2968*b0563631STom Van Eyck                     size_t min_data_len,
2969*b0563631STom Van Eyck                     size_t max_data_len,
2970*b0563631STom Van Eyck                     unsigned char *output);
2971*b0563631STom Van Eyck #else
2972*b0563631STom Van Eyck int mbedtls_ct_hmac(mbedtls_md_context_t *ctx,
2973*b0563631STom Van Eyck                     const unsigned char *add_data,
2974*b0563631STom Van Eyck                     size_t add_data_len,
2975*b0563631STom Van Eyck                     const unsigned char *data,
2976*b0563631STom Van Eyck                     size_t data_len_secret,
2977*b0563631STom Van Eyck                     size_t min_data_len,
2978*b0563631STom Van Eyck                     size_t max_data_len,
2979*b0563631STom Van Eyck                     unsigned char *output);
2980*b0563631STom Van Eyck #endif /* defined(MBEDTLS_USE_PSA_CRYPTO) */
2981*b0563631STom Van Eyck #endif /* MBEDTLS_TEST_HOOKS && defined(MBEDTLS_SSL_SOME_SUITES_USE_MAC) */
2982*b0563631STom Van Eyck 
298332b31808SJens Wiklander #endif /* ssl_misc.h */
2984