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