mirror of
https://github.com/yuzu-emu/mbedtls.git
synced 2024-11-22 18:15:40 +01:00
Merge remote-tracking branch 'public/pr/2651' into HEAD
This commit is contained in:
commit
a1491fe74f
@ -22,6 +22,15 @@ Features
|
||||
supported.
|
||||
* List all SAN types in the subject_alt_names field of the certificate.
|
||||
Resolves #459.
|
||||
* Add support for draft-05 of the Connection ID extension, as specified
|
||||
in https://tools.ietf.org/html/draft-ietf-tls-dtls-connection-id-05.
|
||||
The Connection ID extension allows to keep DTLS connections beyond the
|
||||
lifetime of the underlying transport by adding a connection identifier
|
||||
to the DTLS record header. This identifier can be used to associated an
|
||||
incoming record with the correct connection data even after the peer has
|
||||
changed its IP or port. The feature is enabled at compile-time by setting
|
||||
MBEDTLS_SSL_DTLS_CONNECTION_ID (disabled by default), and at run-time
|
||||
through the new APIs mbedtls_ssl_conf_cid() and mbedtls_ssl_set_cid().
|
||||
|
||||
Bugfix
|
||||
* Fix private key DER output in the key_app_writer example. File contents
|
||||
|
@ -641,18 +641,18 @@
|
||||
#error "MBEDTLS_SSL_DTLS_ANTI_REPLAY defined, but not all prerequisites"
|
||||
#endif
|
||||
|
||||
#if defined(MBEDTLS_SSL_CID) && \
|
||||
#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) && \
|
||||
( !defined(MBEDTLS_SSL_TLS_C) || !defined(MBEDTLS_SSL_PROTO_DTLS) )
|
||||
#error "MBEDTLS_SSL_CID defined, but not all prerequisites"
|
||||
#error "MBEDTLS_SSL_DTLS_CONNECTION_ID defined, but not all prerequisites"
|
||||
#endif
|
||||
|
||||
#if defined(MBEDTLS_SSL_CID) && \
|
||||
#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) && \
|
||||
defined(MBEDTLS_SSL_CID_IN_LEN_MAX) && \
|
||||
MBEDTLS_SSL_CID_IN_LEN_MAX > 255
|
||||
#error "MBEDTLS_SSL_CID_IN_LEN_MAX too large (max 255)"
|
||||
#endif
|
||||
|
||||
#if defined(MBEDTLS_SSL_CID) && \
|
||||
#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) && \
|
||||
defined(MBEDTLS_SSL_CID_OUT_LEN_MAX) && \
|
||||
MBEDTLS_SSL_CID_OUT_LEN_MAX > 255
|
||||
#error "MBEDTLS_SSL_CID_OUT_LEN_MAX too large (max 255)"
|
||||
|
@ -1327,28 +1327,32 @@
|
||||
#define MBEDTLS_SSL_ALL_ALERT_MESSAGES
|
||||
|
||||
/**
|
||||
* \def MBEDTLS_SSL_CID
|
||||
* \def MBEDTLS_SSL_DTLS_CONNECTION_ID
|
||||
*
|
||||
* Enable support for the DTLS Connection ID extension
|
||||
* (version draft-ietf-tls-dtls-connection-id-04)
|
||||
* (version draft-ietf-tls-dtls-connection-id-05,
|
||||
* https://tools.ietf.org/html/draft-ietf-tls-dtls-connection-id-05)
|
||||
* which allows to identify DTLS connections across changes
|
||||
* in the underlying transport.
|
||||
*
|
||||
* Setting this option enables the SSL APIs `mbedtls_ssl_set_cid()`
|
||||
* and `mbedtls_ssl_get_peer_cid()`. See their documentation for more
|
||||
* information.
|
||||
* Setting this option enables the SSL APIs `mbedtls_ssl_set_cid()`,
|
||||
* `mbedtls_ssl_get_peer_cid()` and `mbedtls_ssl_conf_cid()`.
|
||||
* See the corresponding documentation for more information.
|
||||
*
|
||||
* \warning The Connection ID extension is still in draft state.
|
||||
* We make no stability promises for the availability
|
||||
* or the shape of the API controlled by this option.
|
||||
*
|
||||
* See also MBEDTLS_SSL_CID_OUT_LEN_MAX and MBEDTLS_SSL_CID_IN_LEN_MAX.
|
||||
* The maximum lengths of outgoing and incoming CIDs can be configured
|
||||
* through the options
|
||||
* - MBEDTLS_SSL_CID_OUT_LEN_MAX
|
||||
* - MBEDTLS_SSL_CID_IN_LEN_MAX.
|
||||
*
|
||||
* Requires: MBEDTLS_SSL_PROTO_DTLS
|
||||
*
|
||||
* Uncomment to enable the Connection ID extension.
|
||||
*/
|
||||
#define MBEDTLS_SSL_CID
|
||||
//#define MBEDTLS_SSL_DTLS_CONNECTION_ID
|
||||
|
||||
/**
|
||||
* \def MBEDTLS_SSL_ASYNC_PRIVATE
|
||||
@ -3351,6 +3355,23 @@
|
||||
*/
|
||||
//#define MBEDTLS_SSL_CID_OUT_LEN_MAX 32
|
||||
|
||||
/** \def MBEDTLS_SSL_CID_PADDING_GRANULARITY
|
||||
*
|
||||
* This option controls the use of record plaintext padding
|
||||
* when using the Connection ID extension in DTLS 1.2.
|
||||
*
|
||||
* The padding will always be chosen so that the length of the
|
||||
* padded plaintext is a multiple of the value of this option.
|
||||
*
|
||||
* Note: A value of \c 1 means that no padding will be used
|
||||
* for outgoing records.
|
||||
*
|
||||
* Note: On systems lacking division instructions,
|
||||
* a power of two should be preferred.
|
||||
*
|
||||
*/
|
||||
//#define MBEDTLS_SSL_CID_PADDING_GRANULARITY 16
|
||||
|
||||
/** \def MBEDTLS_SSL_OUT_CONTENT_LEN
|
||||
*
|
||||
* Maximum length (in bytes) of outgoing plaintext fragments.
|
||||
|
@ -100,8 +100,8 @@
|
||||
* ECP 4 10 (Started from top)
|
||||
* MD 5 5
|
||||
* HKDF 5 1 (Started from top)
|
||||
* CIPHER 6 8
|
||||
* SSL 6 23 (Started from top)
|
||||
* CIPHER 6 8 (Started from 0x6080)
|
||||
* SSL 6 24 (Started from top, plus 0x6000)
|
||||
* SSL 7 32
|
||||
*
|
||||
* Module dependent error code (5 bits 0x.00.-0x.F8.)
|
||||
|
@ -126,6 +126,7 @@
|
||||
#define MBEDTLS_ERR_SSL_CONTINUE_PROCESSING -0x6580 /**< Internal-only message signaling that further message-processing should be done */
|
||||
#define MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS -0x6500 /**< The asynchronous operation is not completed yet. */
|
||||
#define MBEDTLS_ERR_SSL_EARLY_MESSAGE -0x6480 /**< Internal-only message signaling that a message arrived early. */
|
||||
#define MBEDTLS_ERR_SSL_UNEXPECTED_CID -0x6000 /**< An encrypted DTLS-frame with an unexpected CID was received. */
|
||||
#define MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS -0x7000 /**< A cryptographic operation is in progress. Try again later. */
|
||||
|
||||
/*
|
||||
@ -263,13 +264,17 @@
|
||||
* Maximum length of CIDs for incoming and outgoing messages.
|
||||
*/
|
||||
#if !defined(MBEDTLS_SSL_CID_IN_LEN_MAX)
|
||||
#define MBEDTLS_SSL_CID_IN_LEN_MAX 32
|
||||
#define MBEDTLS_SSL_CID_IN_LEN_MAX 32
|
||||
#endif
|
||||
|
||||
#if !defined(MBEDTLS_SSL_CID_OUT_LEN_MAX)
|
||||
#define MBEDTLS_SSL_CID_OUT_LEN_MAX 32
|
||||
#endif
|
||||
|
||||
#if !defined(MBEDTLS_SSL_CID_PADDING_GRANULARITY)
|
||||
#define MBEDTLS_SSL_CID_PADDING_GRANULARITY 16
|
||||
#endif
|
||||
|
||||
/* \} name SECTION: Module settings */
|
||||
|
||||
/*
|
||||
@ -388,7 +393,8 @@
|
||||
#define MBEDTLS_TLS_EXT_SESSION_TICKET 35
|
||||
|
||||
/* The value of the CID extension is still TBD as of
|
||||
* https://tools.ietf.org/html/draft-ietf-tls-dtls-connection-id-04. */
|
||||
* draft-ietf-tls-dtls-connection-id-05
|
||||
* (https://tools.ietf.org/html/draft-ietf-tls-dtls-connection-id-05) */
|
||||
#define MBEDTLS_TLS_EXT_CID 254 /* TBD */
|
||||
|
||||
#define MBEDTLS_TLS_EXT_ECJPAKE_KKPP 256 /* experimental */
|
||||
@ -959,6 +965,10 @@ struct mbedtls_ssl_config
|
||||
void *p_export_keys; /*!< context for key export callback */
|
||||
#endif
|
||||
|
||||
#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
|
||||
size_t cid_len; /*!< The length of CIDs for incoming DTLS records. */
|
||||
#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
|
||||
|
||||
#if defined(MBEDTLS_X509_CRT_PARSE_C)
|
||||
const mbedtls_x509_crt_profile *cert_profile; /*!< verification profile */
|
||||
mbedtls_ssl_key_cert *key_cert; /*!< own certificate/key pair(s) */
|
||||
@ -1105,6 +1115,11 @@ struct mbedtls_ssl_config
|
||||
unsigned int cert_req_ca_list : 1; /*!< enable sending CA list in
|
||||
Certificate Request messages? */
|
||||
#endif
|
||||
#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
|
||||
unsigned int ignore_unexpected_cid : 1; /*!< Determines whether DTLS
|
||||
* record with unexpected CID
|
||||
* should lead to failure. */
|
||||
#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
|
||||
};
|
||||
|
||||
|
||||
@ -1178,6 +1193,10 @@ struct mbedtls_ssl_context
|
||||
TLS: maintained by us
|
||||
DTLS: read from peer */
|
||||
unsigned char *in_hdr; /*!< start of record header */
|
||||
#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
|
||||
unsigned char *in_cid; /*!< The start of the CID;
|
||||
* (the end is marked by in_len). */
|
||||
#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
|
||||
unsigned char *in_len; /*!< two-bytes message length field */
|
||||
unsigned char *in_iv; /*!< ivlen-byte IV */
|
||||
unsigned char *in_msg; /*!< message contents (in_iv+ivlen) */
|
||||
@ -1214,6 +1233,10 @@ struct mbedtls_ssl_context
|
||||
unsigned char *out_buf; /*!< output buffer */
|
||||
unsigned char *out_ctr; /*!< 64-bit outgoing message counter */
|
||||
unsigned char *out_hdr; /*!< start of record header */
|
||||
#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
|
||||
unsigned char *out_cid; /*!< The start of the CID;
|
||||
* (the end is marked by in_len). */
|
||||
#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
|
||||
unsigned char *out_len; /*!< two-bytes message length field */
|
||||
unsigned char *out_iv; /*!< ivlen-byte IV */
|
||||
unsigned char *out_msg; /*!< message contents (out_iv+ivlen) */
|
||||
@ -1272,7 +1295,7 @@ struct mbedtls_ssl_context
|
||||
char peer_verify_data[MBEDTLS_SSL_VERIFY_DATA_MAX_LEN]; /*!< previous handshake verify data */
|
||||
#endif /* MBEDTLS_SSL_RENEGOTIATION */
|
||||
|
||||
#if defined(MBEDTLS_SSL_CID)
|
||||
#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
|
||||
/* CID configuration to use in subsequent handshakes. */
|
||||
|
||||
/*! The next incoming CID, chosen by the user and applying to
|
||||
@ -1285,7 +1308,7 @@ struct mbedtls_ssl_context
|
||||
* be negotiated in the next handshake or not.
|
||||
* Possible values are #MBEDTLS_SSL_CID_ENABLED
|
||||
* and #MBEDTLS_SSL_CID_DISABLED. */
|
||||
#endif /* MBEDTLS_SSL_CID */
|
||||
#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
|
||||
};
|
||||
|
||||
#if defined(MBEDTLS_SSL_HW_RECORD_ACCEL)
|
||||
@ -1511,23 +1534,23 @@ void mbedtls_ssl_set_bio( mbedtls_ssl_context *ssl,
|
||||
|
||||
#if defined(MBEDTLS_SSL_PROTO_DTLS)
|
||||
|
||||
#if defined(MBEDTLS_SSL_CID)
|
||||
#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
|
||||
|
||||
|
||||
/**
|
||||
* \brief (STUB) Configure the use of the Connection ID (CID)
|
||||
* \brief Configure the use of the Connection ID (CID)
|
||||
* extension in the next handshake.
|
||||
*
|
||||
* Reference:
|
||||
* https://tools.ietf.org/html/draft-ietf-tls-dtls-connection-id-04
|
||||
* Reference: draft-ietf-tls-dtls-connection-id-05
|
||||
* https://tools.ietf.org/html/draft-ietf-tls-dtls-connection-id-05
|
||||
*
|
||||
* The DTLS CID extension allows to reliably associate
|
||||
* The DTLS CID extension allows the reliable association of
|
||||
* DTLS records to DTLS connections across changes in the
|
||||
* underlying transport (changed IP+Port metadata) by adding
|
||||
* explicit connection identifiers (CIDs) to the headers of
|
||||
* encrypted DTLS records. The desired CIDs are configured
|
||||
* by the application layer and are exchanged in new
|
||||
* `ClientHello` / `ServerHello` extensions during the
|
||||
* underlying transport (changed IP and Port metadata) by
|
||||
* adding explicit connection identifiers (CIDs) to the
|
||||
* headers of encrypted DTLS records. The desired CIDs are
|
||||
* configured by the application layer and are exchanged in
|
||||
* new `ClientHello` / `ServerHello` extensions during the
|
||||
* handshake, where each side indicates the CID it wants the
|
||||
* peer to use when writing encrypted messages. The CIDs are
|
||||
* put to use once records get encrypted: the stack discards
|
||||
@ -1535,14 +1558,9 @@ void mbedtls_ssl_set_bio( mbedtls_ssl_context *ssl,
|
||||
* in their header, and adds the peer's requested CID to the
|
||||
* headers of outgoing messages.
|
||||
*
|
||||
* This API allows to enable/disable the use of the CID
|
||||
* extension in the next handshake and to set the value of
|
||||
* the CID to be used for incoming messages.
|
||||
*
|
||||
* \warning The current implementation of this API does nothing!
|
||||
* It is included solely to allow review and coding against
|
||||
* the new Connection CID API.
|
||||
* The actual implementation will be added in the future.
|
||||
* This API enables or disables the use of the CID extension
|
||||
* in the next handshake and sets the value of the CID to
|
||||
* be used for incoming messages.
|
||||
*
|
||||
* \param ssl The SSL context to configure. This must be initialized.
|
||||
* \param enable This value determines whether the CID extension should
|
||||
@ -1559,6 +1577,11 @@ void mbedtls_ssl_set_bio( mbedtls_ssl_context *ssl,
|
||||
* This parameter is unused if \p enabled is set to
|
||||
* MBEDTLS_SSL_CID_DISABLED.
|
||||
*
|
||||
* \note The value of \p own_cid_len must match the value of the
|
||||
* \c len parameter passed to mbedtls_ssl_conf_cid()
|
||||
* when configuring the ::mbedtls_ssl_config that \p ssl
|
||||
* is bound to.
|
||||
*
|
||||
* \note This CID configuration applies to subsequent handshakes
|
||||
* performed on the SSL context \p ssl, but does not trigger
|
||||
* one. You still have to call `mbedtls_ssl_handshake()`
|
||||
@ -1603,14 +1626,8 @@ int mbedtls_ssl_set_cid( mbedtls_ssl_context *ssl,
|
||||
size_t own_cid_len );
|
||||
|
||||
/**
|
||||
* \brief (STUB) Get information about the current use of the
|
||||
* CID extension.
|
||||
*
|
||||
* \warning The current implementation of this API does nothing
|
||||
* except setting `*enabled` to MBEDTLS_SSL_CID_DISABLED!
|
||||
* It is included solely to allow review and coding against
|
||||
* the new Connection CID API.
|
||||
* The actual implementation will be added in the future.
|
||||
* \brief Get information about the use of the CID extension
|
||||
* in the current connection.
|
||||
*
|
||||
* \param ssl The SSL context to query.
|
||||
* \param enabled The address at which to store whether the CID extension
|
||||
@ -1619,10 +1636,16 @@ int mbedtls_ssl_set_cid( mbedtls_ssl_context *ssl,
|
||||
* otherwise, it is set to MBEDTLS_SSL_CID_DISABLED.
|
||||
* \param peer_cid The address of the buffer in which to store the CID
|
||||
* chosen by the peer (if the CID extension is used).
|
||||
* This may be \c NULL in case the value of peer CID
|
||||
* isn't needed. If it is not \c NULL, \p peer_cid_len
|
||||
* must not be \c NULL.
|
||||
* \param peer_cid_len The address at which to store the size of the CID
|
||||
* chosen by the peer (if the CID extension is used).
|
||||
* This is also the number of Bytes in \p peer_cid that
|
||||
* have been written.
|
||||
* This may be \c NULL in case the length of the peer CID
|
||||
* isn't needed. If it is \c NULL, \p peer_cid must be
|
||||
* \c NULL, too.
|
||||
*
|
||||
* \note This applies to the state of the CID negotiated in
|
||||
* the last complete handshake. If a handshake is in
|
||||
@ -1644,7 +1667,7 @@ int mbedtls_ssl_get_peer_cid( mbedtls_ssl_context *ssl,
|
||||
unsigned char peer_cid[ MBEDTLS_SSL_CID_OUT_LEN_MAX ],
|
||||
size_t *peer_cid_len );
|
||||
|
||||
#endif /* MBEDTLS_SSL_CID */
|
||||
#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
|
||||
|
||||
/**
|
||||
* \brief Set the Maximum Tranport Unit (MTU).
|
||||
@ -2293,6 +2316,45 @@ int mbedtls_ssl_set_session( mbedtls_ssl_context *ssl, const mbedtls_ssl_session
|
||||
void mbedtls_ssl_conf_ciphersuites( mbedtls_ssl_config *conf,
|
||||
const int *ciphersuites );
|
||||
|
||||
#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
|
||||
#define MBEDTLS_SSL_UNEXPECTED_CID_IGNORE 0
|
||||
#define MBEDTLS_SSL_UNEXPECTED_CID_FAIL 1
|
||||
/**
|
||||
* \brief Specify the length of Connection IDs for incoming
|
||||
* encrypted DTLS records, as well as the behaviour
|
||||
* on unexpected CIDs.
|
||||
*
|
||||
* By default, the CID length is set to \c 0,
|
||||
* and unexpected CIDs are silently ignored.
|
||||
*
|
||||
* \param conf The SSL configuration to modify.
|
||||
* \param len The length in Bytes of the CID fields in encrypted
|
||||
* DTLS records using the CID mechanism. This must
|
||||
* not be larger than #MBEDTLS_SSL_CID_OUT_LEN_MAX.
|
||||
* \param ignore_other_cids This determines the stack's behaviour when
|
||||
* receiving a record with an unexpected CID.
|
||||
* Possible values are:
|
||||
* - #MBEDTLS_SSL_UNEXPECTED_CID_IGNORE
|
||||
* In this case, the record is silently ignored.
|
||||
* - #MBEDTLS_SSL_UNEXPECTED_CID_FAIL
|
||||
* In this case, the stack fails with the specific
|
||||
* error code #MBEDTLS_ERR_SSL_UNEXPECTED_CID.
|
||||
*
|
||||
* \note The CID specification allows implementations to either
|
||||
* use a common length for all incoming connection IDs or
|
||||
* allow variable-length incoming IDs. Mbed TLS currently
|
||||
* requires a common length for all connections sharing the
|
||||
* same SSL configuration; this allows simpler parsing of
|
||||
* record headers.
|
||||
*
|
||||
* \return \c 0 on success.
|
||||
* \return #MBEDTLS_ERR_SSL_BAD_INPUT_DATA if \p own_cid_len
|
||||
* is too large.
|
||||
*/
|
||||
int mbedtls_ssl_conf_cid( mbedtls_ssl_config *conf, size_t len,
|
||||
int ignore_other_cids );
|
||||
#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
|
||||
|
||||
/**
|
||||
* \brief Set the list of allowed ciphersuites and the
|
||||
* preference order for a specific version of the protocol.
|
||||
|
@ -175,10 +175,17 @@
|
||||
#define MBEDTLS_SSL_PADDING_ADD 0
|
||||
#endif
|
||||
|
||||
#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
|
||||
#define MBEDTLS_SSL_MAX_CID_EXPANSION MBEDTLS_SSL_CID_PADDING_GRANULARITY
|
||||
#else
|
||||
#define MBEDTLS_SSL_MAX_CID_EXPANSION 0
|
||||
#endif
|
||||
|
||||
#define MBEDTLS_SSL_PAYLOAD_OVERHEAD ( MBEDTLS_SSL_COMPRESSION_ADD + \
|
||||
MBEDTLS_MAX_IV_LENGTH + \
|
||||
MBEDTLS_SSL_MAC_ADD + \
|
||||
MBEDTLS_SSL_PADDING_ADD \
|
||||
MBEDTLS_SSL_PADDING_ADD + \
|
||||
MBEDTLS_SSL_MAX_CID_EXPANSION \
|
||||
)
|
||||
|
||||
#define MBEDTLS_SSL_IN_PAYLOAD_LEN ( MBEDTLS_SSL_PAYLOAD_OVERHEAD + \
|
||||
@ -231,11 +238,23 @@
|
||||
implicit sequence number. */
|
||||
#define MBEDTLS_SSL_HEADER_LEN 13
|
||||
|
||||
#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
|
||||
#define MBEDTLS_SSL_IN_BUFFER_LEN \
|
||||
( ( MBEDTLS_SSL_HEADER_LEN ) + ( MBEDTLS_SSL_IN_PAYLOAD_LEN ) )
|
||||
#else
|
||||
#define MBEDTLS_SSL_IN_BUFFER_LEN \
|
||||
( ( MBEDTLS_SSL_HEADER_LEN ) + ( MBEDTLS_SSL_IN_PAYLOAD_LEN ) \
|
||||
+ ( MBEDTLS_SSL_CID_IN_LEN_MAX ) )
|
||||
#endif
|
||||
|
||||
#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
|
||||
#define MBEDTLS_SSL_OUT_BUFFER_LEN \
|
||||
( ( MBEDTLS_SSL_HEADER_LEN ) + ( MBEDTLS_SSL_OUT_PAYLOAD_LEN ) )
|
||||
#else
|
||||
#define MBEDTLS_SSL_OUT_BUFFER_LEN \
|
||||
( ( MBEDTLS_SSL_HEADER_LEN ) + ( MBEDTLS_SSL_OUT_PAYLOAD_LEN ) \
|
||||
+ ( MBEDTLS_SSL_CID_OUT_LEN_MAX ) )
|
||||
#endif
|
||||
|
||||
#ifdef MBEDTLS_ZLIB_SUPPORT
|
||||
/* Compression buffer holds both IN and OUT buffers, so should be size of the larger */
|
||||
@ -372,17 +391,17 @@ struct mbedtls_ssl_handshake_params
|
||||
unsigned char alt_out_ctr[8]; /*!< Alternative record epoch/counter
|
||||
for resending messages */
|
||||
|
||||
#if defined(MBEDTLS_SSL_CID)
|
||||
#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
|
||||
/* The state of CID configuration in this handshake. */
|
||||
|
||||
uint8_t cid_in_use; /*!< This indicates whether the use of the CID extension
|
||||
* has been negotited. Possible values are
|
||||
* has been negotiated. Possible values are
|
||||
* #MBEDTLS_SSL_CID_ENABLED and
|
||||
* #MBEDTLS_SSL_CID_DISABLED. */
|
||||
unsigned char peer_cid[ MBEDTLS_SSL_CID_OUT_LEN_MAX ]; /*! The peer's CID */
|
||||
uint8_t peer_cid_len; /*!< The length of
|
||||
* \c peer_cid. */
|
||||
#endif /* MBEDTLS_SSL_CID */
|
||||
#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
|
||||
|
||||
struct
|
||||
{
|
||||
@ -609,12 +628,12 @@ struct mbedtls_ssl_transform
|
||||
mbedtls_cipher_context_t cipher_ctx_dec; /*!< decryption context */
|
||||
int minor_ver;
|
||||
|
||||
#if defined(MBEDTLS_SSL_CID)
|
||||
#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
|
||||
uint8_t in_cid_len;
|
||||
uint8_t out_cid_len;
|
||||
unsigned char in_cid [ MBEDTLS_SSL_CID_OUT_LEN_MAX ];
|
||||
unsigned char out_cid[ MBEDTLS_SSL_CID_OUT_LEN_MAX ];
|
||||
#endif /* MBEDTLS_SSL_CID */
|
||||
#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
|
||||
|
||||
/*
|
||||
* Session specific compression layer
|
||||
@ -662,11 +681,10 @@ typedef struct
|
||||
size_t data_offset; /* Offset of record content */
|
||||
size_t data_len; /* Length of record content */
|
||||
|
||||
#if defined(MBEDTLS_SSL_CID)
|
||||
#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
|
||||
uint8_t cid_len; /* Length of the CID (0 if not present) */
|
||||
unsigned char cid[ MBEDTLS_SSL_CID_LEN_MAX ]; /* The CID */
|
||||
#endif /* MBEDTLS_SSL_CID */
|
||||
|
||||
#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
|
||||
} mbedtls_record;
|
||||
|
||||
#if defined(MBEDTLS_X509_CRT_PARSE_C)
|
||||
@ -910,15 +928,14 @@ void mbedtls_ssl_write_version( int major, int minor, int transport,
|
||||
void mbedtls_ssl_read_version( int *major, int *minor, int transport,
|
||||
const unsigned char ver[2] );
|
||||
|
||||
static inline size_t mbedtls_ssl_hdr_len( const mbedtls_ssl_context *ssl )
|
||||
static inline size_t mbedtls_ssl_in_hdr_len( const mbedtls_ssl_context *ssl )
|
||||
{
|
||||
#if defined(MBEDTLS_SSL_PROTO_DTLS)
|
||||
if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
|
||||
return( 13 );
|
||||
#else
|
||||
((void) ssl);
|
||||
#endif
|
||||
return( 5 );
|
||||
return( (size_t) ( ssl->in_iv - ssl->in_hdr ) );
|
||||
}
|
||||
|
||||
static inline size_t mbedtls_ssl_out_hdr_len( const mbedtls_ssl_context *ssl )
|
||||
{
|
||||
return( (size_t) ( ssl->out_iv - ssl->out_hdr ) );
|
||||
}
|
||||
|
||||
static inline size_t mbedtls_ssl_hs_hdr_len( const mbedtls_ssl_context *ssl )
|
||||
|
@ -523,6 +523,8 @@ void mbedtls_strerror( int ret, char *buf, size_t buflen )
|
||||
mbedtls_snprintf( buf, buflen, "SSL - The asynchronous operation is not completed yet" );
|
||||
if( use_ret == -(MBEDTLS_ERR_SSL_EARLY_MESSAGE) )
|
||||
mbedtls_snprintf( buf, buflen, "SSL - Internal-only message signaling that a message arrived early" );
|
||||
if( use_ret == -(MBEDTLS_ERR_SSL_UNEXPECTED_CID) )
|
||||
mbedtls_snprintf( buf, buflen, "SSL - An encrypted DTLS-frame with an unexpected CID was received" );
|
||||
if( use_ret == -(MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS) )
|
||||
mbedtls_snprintf( buf, buflen, "SSL - A cryptographic operation is in progress. Try again later" );
|
||||
#endif /* MBEDTLS_SSL_TLS_C */
|
||||
|
@ -475,7 +475,7 @@ static void ssl_write_ecjpake_kkpp_ext( mbedtls_ssl_context *ssl,
|
||||
}
|
||||
#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
|
||||
|
||||
#if defined(MBEDTLS_SSL_CID)
|
||||
#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
|
||||
static void ssl_write_cid_ext( mbedtls_ssl_context *ssl,
|
||||
unsigned char *buf,
|
||||
size_t *olen )
|
||||
@ -485,8 +485,8 @@ static void ssl_write_cid_ext( mbedtls_ssl_context *ssl,
|
||||
const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
|
||||
|
||||
/*
|
||||
* Quoting
|
||||
* https://tools.ietf.org/html/draft-ietf-tls-dtls-connection-id-04:
|
||||
* Quoting draft-ietf-tls-dtls-connection-id-05
|
||||
* https://tools.ietf.org/html/draft-ietf-tls-dtls-connection-id-05
|
||||
*
|
||||
* struct {
|
||||
* opaque cid<0..2^8-1>;
|
||||
@ -521,7 +521,7 @@ static void ssl_write_cid_ext( mbedtls_ssl_context *ssl,
|
||||
|
||||
*olen = ssl->own_cid_len + 5;
|
||||
}
|
||||
#endif /* MBEDTLS_SSL_CID */
|
||||
#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
|
||||
|
||||
#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
|
||||
static void ssl_write_max_fragment_length_ext( mbedtls_ssl_context *ssl,
|
||||
@ -1133,10 +1133,10 @@ static int ssl_write_client_hello( mbedtls_ssl_context *ssl )
|
||||
ext_len += olen;
|
||||
#endif
|
||||
|
||||
#if defined(MBEDTLS_SSL_CID)
|
||||
#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
|
||||
ssl_write_cid_ext( ssl, p + 2 + ext_len, &olen );
|
||||
ext_len += olen;
|
||||
#endif /* MBEDTLS_SSL_CID */
|
||||
#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
|
||||
|
||||
#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
|
||||
ssl_write_max_fragment_length_ext( ssl, p + 2 + ext_len, &olen );
|
||||
@ -1295,7 +1295,7 @@ static int ssl_parse_truncated_hmac_ext( mbedtls_ssl_context *ssl,
|
||||
}
|
||||
#endif /* MBEDTLS_SSL_TRUNCATED_HMAC */
|
||||
|
||||
#if defined(MBEDTLS_SSL_CID)
|
||||
#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
|
||||
static int ssl_parse_cid_ext( mbedtls_ssl_context *ssl,
|
||||
const unsigned char *buf,
|
||||
size_t len )
|
||||
@ -1349,7 +1349,7 @@ static int ssl_parse_cid_ext( mbedtls_ssl_context *ssl,
|
||||
|
||||
return( 0 );
|
||||
}
|
||||
#endif /* MBEDTLS_SSL_CID */
|
||||
#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
|
||||
|
||||
#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
|
||||
static int ssl_parse_encrypt_then_mac_ext( mbedtls_ssl_context *ssl,
|
||||
@ -1658,8 +1658,6 @@ static int ssl_parse_server_hello( mbedtls_ssl_context *ssl )
|
||||
|
||||
MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse server hello" ) );
|
||||
|
||||
buf = ssl->in_msg;
|
||||
|
||||
if( ( ret = mbedtls_ssl_read_record( ssl, 1 ) ) != 0 )
|
||||
{
|
||||
/* No alert on a read error. */
|
||||
@ -1667,6 +1665,8 @@ static int ssl_parse_server_hello( mbedtls_ssl_context *ssl )
|
||||
return( ret );
|
||||
}
|
||||
|
||||
buf = ssl->in_msg;
|
||||
|
||||
if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE )
|
||||
{
|
||||
#if defined(MBEDTLS_SSL_RENEGOTIATION)
|
||||
@ -2002,7 +2002,7 @@ static int ssl_parse_server_hello( mbedtls_ssl_context *ssl )
|
||||
break;
|
||||
#endif /* MBEDTLS_SSL_TRUNCATED_HMAC */
|
||||
|
||||
#if defined(MBEDTLS_SSL_CID)
|
||||
#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
|
||||
case MBEDTLS_TLS_EXT_CID:
|
||||
MBEDTLS_SSL_DEBUG_MSG( 3, ( "found CID extension" ) );
|
||||
|
||||
@ -2014,7 +2014,7 @@ static int ssl_parse_server_hello( mbedtls_ssl_context *ssl )
|
||||
}
|
||||
|
||||
break;
|
||||
#endif /* MBEDTLS_SSL_CID */
|
||||
#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
|
||||
|
||||
#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
|
||||
case MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC:
|
||||
|
@ -475,7 +475,7 @@ static int ssl_parse_max_fragment_length_ext( mbedtls_ssl_context *ssl,
|
||||
}
|
||||
#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
|
||||
|
||||
#if defined(MBEDTLS_SSL_CID)
|
||||
#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
|
||||
static int ssl_parse_cid_ext( mbedtls_ssl_context *ssl,
|
||||
const unsigned char *buf,
|
||||
size_t len )
|
||||
@ -492,8 +492,8 @@ static int ssl_parse_cid_ext( mbedtls_ssl_context *ssl,
|
||||
}
|
||||
|
||||
/*
|
||||
* Quoting
|
||||
* https://tools.ietf.org/html/draft-ietf-tls-dtls-connection-id-04:
|
||||
* Quoting draft-ietf-tls-dtls-connection-id-05
|
||||
* https://tools.ietf.org/html/draft-ietf-tls-dtls-connection-id-05
|
||||
*
|
||||
* struct {
|
||||
* opaque cid<0..2^8-1>;
|
||||
@ -545,7 +545,7 @@ static int ssl_parse_cid_ext( mbedtls_ssl_context *ssl,
|
||||
|
||||
return( 0 );
|
||||
}
|
||||
#endif /* MBEDTLS_SSL_CID */
|
||||
#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
|
||||
|
||||
#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
|
||||
static int ssl_parse_truncated_hmac_ext( mbedtls_ssl_context *ssl,
|
||||
@ -1352,7 +1352,7 @@ read_record_header:
|
||||
return( ssl_parse_client_hello_v2( ssl ) );
|
||||
#endif
|
||||
|
||||
MBEDTLS_SSL_DEBUG_BUF( 4, "record header", buf, mbedtls_ssl_hdr_len( ssl ) );
|
||||
MBEDTLS_SSL_DEBUG_BUF( 4, "record header", buf, mbedtls_ssl_in_hdr_len( ssl ) );
|
||||
|
||||
/*
|
||||
* SSLv3/TLS Client Hello
|
||||
@ -1441,7 +1441,7 @@ read_record_header:
|
||||
}
|
||||
|
||||
if( ( ret = mbedtls_ssl_fetch_input( ssl,
|
||||
mbedtls_ssl_hdr_len( ssl ) + msg_len ) ) != 0 )
|
||||
mbedtls_ssl_in_hdr_len( ssl ) + msg_len ) ) != 0 )
|
||||
{
|
||||
MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_fetch_input", ret );
|
||||
return( ret );
|
||||
@ -1450,7 +1450,7 @@ read_record_header:
|
||||
/* Done reading this record, get ready for the next one */
|
||||
#if defined(MBEDTLS_SSL_PROTO_DTLS)
|
||||
if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
|
||||
ssl->next_record_offset = msg_len + mbedtls_ssl_hdr_len( ssl );
|
||||
ssl->next_record_offset = msg_len + mbedtls_ssl_in_hdr_len( ssl );
|
||||
else
|
||||
#endif
|
||||
ssl->in_left = 0;
|
||||
@ -1895,7 +1895,7 @@ read_record_header:
|
||||
break;
|
||||
#endif /* MBEDTLS_SSL_TRUNCATED_HMAC */
|
||||
|
||||
#if defined(MBEDTLS_SSL_CID)
|
||||
#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
|
||||
case MBEDTLS_TLS_EXT_CID:
|
||||
MBEDTLS_SSL_DEBUG_MSG( 3, ( "found CID extension" ) );
|
||||
|
||||
@ -2182,7 +2182,7 @@ static void ssl_write_truncated_hmac_ext( mbedtls_ssl_context *ssl,
|
||||
}
|
||||
#endif /* MBEDTLS_SSL_TRUNCATED_HMAC */
|
||||
|
||||
#if defined(MBEDTLS_SSL_CID)
|
||||
#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
|
||||
static void ssl_write_cid_ext( mbedtls_ssl_context *ssl,
|
||||
unsigned char *buf,
|
||||
size_t *olen )
|
||||
@ -2209,8 +2209,8 @@ static void ssl_write_cid_ext( mbedtls_ssl_context *ssl,
|
||||
MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, adding CID extension" ) );
|
||||
|
||||
/*
|
||||
* Quoting
|
||||
* https://tools.ietf.org/html/draft-ietf-tls-dtls-connection-id-04:
|
||||
* Quoting draft-ietf-tls-dtls-connection-id-05
|
||||
* https://tools.ietf.org/html/draft-ietf-tls-dtls-connection-id-05
|
||||
*
|
||||
* struct {
|
||||
* opaque cid<0..2^8-1>;
|
||||
@ -2228,7 +2228,7 @@ static void ssl_write_cid_ext( mbedtls_ssl_context *ssl,
|
||||
|
||||
*olen = ssl->own_cid_len + 5;
|
||||
}
|
||||
#endif /* MBEDTLS_SSL_CID */
|
||||
#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
|
||||
|
||||
#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
|
||||
static void ssl_write_encrypt_then_mac_ext( mbedtls_ssl_context *ssl,
|
||||
@ -2751,7 +2751,7 @@ static int ssl_write_server_hello( mbedtls_ssl_context *ssl )
|
||||
ext_len += olen;
|
||||
#endif
|
||||
|
||||
#if defined(MBEDTLS_SSL_CID)
|
||||
#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
|
||||
ssl_write_cid_ext( ssl, p + 2 + ext_len, &olen );
|
||||
ext_len += olen;
|
||||
#endif
|
||||
|
@ -110,24 +110,42 @@ static int ssl_check_timer( mbedtls_ssl_context *ssl )
|
||||
|
||||
static void ssl_update_out_pointers( mbedtls_ssl_context *ssl,
|
||||
mbedtls_ssl_transform *transform );
|
||||
static void ssl_update_in_pointers( mbedtls_ssl_context *ssl,
|
||||
mbedtls_ssl_transform *transform );
|
||||
static void ssl_update_in_pointers( mbedtls_ssl_context *ssl );
|
||||
|
||||
#define SSL_DONT_FORCE_FLUSH 0
|
||||
#define SSL_FORCE_FLUSH 1
|
||||
|
||||
#if defined(MBEDTLS_SSL_PROTO_DTLS)
|
||||
|
||||
#if defined(MBEDTLS_SSL_CID)
|
||||
#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
|
||||
/* Top-level Connection ID API */
|
||||
|
||||
/* WARNING: The CID feature isn't fully implemented yet
|
||||
* and will not be used. */
|
||||
int mbedtls_ssl_conf_cid( mbedtls_ssl_config *conf,
|
||||
size_t len,
|
||||
int ignore_other_cid )
|
||||
{
|
||||
if( len > MBEDTLS_SSL_CID_IN_LEN_MAX )
|
||||
return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
|
||||
|
||||
if( ignore_other_cid != MBEDTLS_SSL_UNEXPECTED_CID_FAIL &&
|
||||
ignore_other_cid != MBEDTLS_SSL_UNEXPECTED_CID_IGNORE )
|
||||
{
|
||||
return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
|
||||
}
|
||||
|
||||
conf->ignore_unexpected_cid = ignore_other_cid;
|
||||
conf->cid_len = len;
|
||||
return( 0 );
|
||||
}
|
||||
|
||||
int mbedtls_ssl_set_cid( mbedtls_ssl_context *ssl,
|
||||
int enable,
|
||||
unsigned char const *own_cid,
|
||||
size_t own_cid_len )
|
||||
{
|
||||
if( ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM )
|
||||
return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
|
||||
|
||||
ssl->negotiate_cid = enable;
|
||||
if( enable == MBEDTLS_SSL_CID_DISABLED )
|
||||
{
|
||||
@ -135,12 +153,13 @@ int mbedtls_ssl_set_cid( mbedtls_ssl_context *ssl,
|
||||
return( 0 );
|
||||
}
|
||||
MBEDTLS_SSL_DEBUG_MSG( 3, ( "Enable use of CID extension." ) );
|
||||
MBEDTLS_SSL_DEBUG_BUF( 3, "Own CID", own_cid, own_cid_len );
|
||||
|
||||
if( own_cid_len > MBEDTLS_SSL_CID_IN_LEN_MAX )
|
||||
if( own_cid_len != ssl->conf->cid_len )
|
||||
{
|
||||
MBEDTLS_SSL_DEBUG_MSG( 3, ( "CID too large: Maximum %u, actual %u",
|
||||
(unsigned) MBEDTLS_SSL_CID_IN_LEN_MAX,
|
||||
(unsigned) own_cid_len ) );
|
||||
MBEDTLS_SSL_DEBUG_MSG( 3, ( "CID length %u does not match CID length %u in config",
|
||||
(unsigned) own_cid_len,
|
||||
(unsigned) ssl->conf->cid_len ) );
|
||||
return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
|
||||
}
|
||||
|
||||
@ -149,12 +168,9 @@ int mbedtls_ssl_set_cid( mbedtls_ssl_context *ssl,
|
||||
* MBEDTLS_SSL_CID_IN_LEN_MAX at most 255. */
|
||||
ssl->own_cid_len = (uint8_t) own_cid_len;
|
||||
|
||||
MBEDTLS_SSL_DEBUG_BUF( 3, "Own CID", own_cid, own_cid_len );
|
||||
return( 0 );
|
||||
}
|
||||
|
||||
/* WARNING: The CID feature isn't fully implemented yet
|
||||
* and will not be used. */
|
||||
int mbedtls_ssl_get_peer_cid( mbedtls_ssl_context *ssl,
|
||||
int *enabled,
|
||||
unsigned char peer_cid[ MBEDTLS_SSL_CID_OUT_LEN_MAX ],
|
||||
@ -162,8 +178,11 @@ int mbedtls_ssl_get_peer_cid( mbedtls_ssl_context *ssl,
|
||||
{
|
||||
*enabled = MBEDTLS_SSL_CID_DISABLED;
|
||||
|
||||
if( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER )
|
||||
if( ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM ||
|
||||
ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER )
|
||||
{
|
||||
return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
|
||||
}
|
||||
|
||||
/* We report MBEDTLS_SSL_CID_DISABLED in case the CID extensions
|
||||
* were used, but client and server requested the empty CID.
|
||||
@ -175,15 +194,21 @@ int mbedtls_ssl_get_peer_cid( mbedtls_ssl_context *ssl,
|
||||
return( 0 );
|
||||
}
|
||||
|
||||
*peer_cid_len = ssl->transform_in->out_cid_len;
|
||||
memcpy( peer_cid, ssl->transform_in->out_cid,
|
||||
ssl->transform_in->out_cid_len );
|
||||
if( peer_cid_len != NULL )
|
||||
{
|
||||
*peer_cid_len = ssl->transform_in->out_cid_len;
|
||||
if( peer_cid != NULL )
|
||||
{
|
||||
memcpy( peer_cid, ssl->transform_in->out_cid,
|
||||
ssl->transform_in->out_cid_len );
|
||||
}
|
||||
}
|
||||
|
||||
*enabled = MBEDTLS_SSL_CID_ENABLED;
|
||||
|
||||
return( 0 );
|
||||
}
|
||||
#endif /* MBEDTLS_SSL_CID */
|
||||
#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
|
||||
|
||||
/* Forward declarations for functions related to message buffering. */
|
||||
static void ssl_buffering_free( mbedtls_ssl_context *ssl );
|
||||
@ -950,27 +975,25 @@ int mbedtls_ssl_derive_keys( mbedtls_ssl_context *ssl )
|
||||
return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
|
||||
}
|
||||
|
||||
#if defined(MBEDTLS_SSL_CID)
|
||||
#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
|
||||
/* Copy own and peer's CID if the use of the CID
|
||||
* extension has been negotiated. */
|
||||
if( ssl->handshake->cid_in_use == MBEDTLS_SSL_CID_ENABLED )
|
||||
{
|
||||
MBEDTLS_SSL_DEBUG_MSG( 3, ( "Copy CIDs into SSL transform" ) );
|
||||
|
||||
/* Uncomment this once CID-parsing and support for a change
|
||||
* record content type during record decryption are added. */
|
||||
/* transform->in_cid_len = ssl->own_cid_len; */
|
||||
/* transform->out_cid_len = ssl->handshake->peer_cid_len; */
|
||||
/* memcpy( transform->in_cid, ssl->own_cid, ssl->own_cid_len ); */
|
||||
/* memcpy( transform->out_cid, ssl->handshake->peer_cid, */
|
||||
/* ssl->handshake->peer_cid_len ); */
|
||||
|
||||
MBEDTLS_SSL_DEBUG_BUF( 3, "Outgoing CID", transform->out_cid,
|
||||
transform->out_cid_len );
|
||||
transform->in_cid_len = ssl->own_cid_len;
|
||||
memcpy( transform->in_cid, ssl->own_cid, ssl->own_cid_len );
|
||||
MBEDTLS_SSL_DEBUG_BUF( 3, "Incoming CID", transform->in_cid,
|
||||
transform->in_cid_len );
|
||||
|
||||
transform->out_cid_len = ssl->handshake->peer_cid_len;
|
||||
memcpy( transform->out_cid, ssl->handshake->peer_cid,
|
||||
ssl->handshake->peer_cid_len );
|
||||
MBEDTLS_SSL_DEBUG_BUF( 3, "Outgoing CID", transform->out_cid,
|
||||
transform->out_cid_len );
|
||||
}
|
||||
#endif /* MBEDTLS_SSL_CID */
|
||||
#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
|
||||
|
||||
/*
|
||||
* Set appropriate PRF function and other SSL / TLS / TLS1.2 functions
|
||||
@ -1967,7 +1990,7 @@ static void ssl_read_memory( unsigned char *p, size_t len )
|
||||
* Encryption/decryption functions
|
||||
*/
|
||||
|
||||
#if defined(MBEDTLS_SSL_CID)
|
||||
#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
|
||||
/* This functions transforms a DTLS plaintext fragment and a record content
|
||||
* type into an instance of the DTLSInnerPlaintext structure:
|
||||
*
|
||||
@ -2000,7 +2023,9 @@ static int ssl_cid_build_inner_plaintext( unsigned char *content,
|
||||
uint8_t rec_type )
|
||||
{
|
||||
size_t len = *content_size;
|
||||
size_t pad = ~len & 0xF; /* Pad to a multiple of 16 */
|
||||
size_t pad = ( MBEDTLS_SSL_CID_PADDING_GRANULARITY -
|
||||
( len + 1 ) % MBEDTLS_SSL_CID_PADDING_GRANULARITY ) %
|
||||
MBEDTLS_SSL_CID_PADDING_GRANULARITY;
|
||||
|
||||
/* Write real content type */
|
||||
if( remaining == 0 )
|
||||
@ -2040,7 +2065,7 @@ static int ssl_cid_parse_inner_plaintext( unsigned char const *content,
|
||||
|
||||
return( 0 );
|
||||
}
|
||||
#endif /* MBEDTLS_SSL_CID */
|
||||
#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
|
||||
|
||||
/* `add_data` must have size 13 Bytes if the CID extension is disabled,
|
||||
* and 13 + 1 + CID-length Bytes if the CID extension is enabled. */
|
||||
@ -2068,7 +2093,7 @@ static void ssl_extract_add_data_from_record( unsigned char* add_data,
|
||||
add_data[8] = rec->type;
|
||||
memcpy( add_data + 9, rec->ver, sizeof( rec->ver ) );
|
||||
|
||||
#if defined(MBEDTLS_SSL_CID)
|
||||
#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
|
||||
if( rec->cid_len != 0 )
|
||||
{
|
||||
memcpy( add_data + 11, rec->cid, rec->cid_len );
|
||||
@ -2078,7 +2103,7 @@ static void ssl_extract_add_data_from_record( unsigned char* add_data,
|
||||
*add_data_len = 13 + 1 + rec->cid_len;
|
||||
}
|
||||
else
|
||||
#endif /* MBEDTLS_SSL_CID */
|
||||
#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
|
||||
{
|
||||
add_data[11 + 0] = ( rec->data_len >> 8 ) & 0xFF;
|
||||
add_data[11 + 1] = ( rec->data_len >> 0 ) & 0xFF;
|
||||
@ -2126,7 +2151,7 @@ int mbedtls_ssl_encrypt_buf( mbedtls_ssl_context *ssl,
|
||||
|| rec->buf == NULL
|
||||
|| rec->buf_len < rec->data_offset
|
||||
|| rec->buf_len - rec->data_offset < rec->data_len
|
||||
#if defined(MBEDTLS_SSL_CID)
|
||||
#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
|
||||
|| rec->cid_len != 0
|
||||
#endif
|
||||
)
|
||||
@ -2150,7 +2175,7 @@ int mbedtls_ssl_encrypt_buf( mbedtls_ssl_context *ssl,
|
||||
return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
|
||||
}
|
||||
|
||||
#if defined(MBEDTLS_SSL_CID)
|
||||
#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
|
||||
/*
|
||||
* Add CID information
|
||||
*/
|
||||
@ -2177,7 +2202,7 @@ int mbedtls_ssl_encrypt_buf( mbedtls_ssl_context *ssl,
|
||||
|
||||
rec->type = MBEDTLS_SSL_MSG_CID;
|
||||
}
|
||||
#endif /* MBEDTLS_SSL_CID */
|
||||
#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
|
||||
|
||||
post_avail = rec->buf_len - ( rec->data_len + rec->data_offset );
|
||||
|
||||
@ -2551,23 +2576,16 @@ int mbedtls_ssl_decrypt_buf( mbedtls_ssl_context *ssl,
|
||||
data = rec->buf + rec->data_offset;
|
||||
mode = mbedtls_cipher_get_cipher_mode( &transform->cipher_ctx_dec );
|
||||
|
||||
#if defined(MBEDTLS_SSL_CID)
|
||||
#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
|
||||
/*
|
||||
* Match record's CID with incoming CID.
|
||||
*/
|
||||
|
||||
/* Uncomment this once CID parsing is in place */
|
||||
/* if( rec->cid_len != transform->in_cid_len || */
|
||||
/* memcmp( rec->cid, transform->in_cid, rec->cid_len ) != 0 ) */
|
||||
/* { */
|
||||
/* return( MBEDTLS_ERR_SSL_INVALID_RECORD ); */
|
||||
/* } */
|
||||
|
||||
/* Remove this once CID parsing is in place */
|
||||
rec->cid_len = transform->in_cid_len;
|
||||
memcpy( rec->cid, transform->in_cid, transform->in_cid_len );
|
||||
MBEDTLS_SSL_DEBUG_BUF( 3, "CID", rec->cid, rec->cid_len );
|
||||
#endif /* MBEDTLS_SSL_CID */
|
||||
if( rec->cid_len != transform->in_cid_len ||
|
||||
memcmp( rec->cid, transform->in_cid, rec->cid_len ) != 0 )
|
||||
{
|
||||
return( MBEDTLS_ERR_SSL_UNEXPECTED_CID );
|
||||
}
|
||||
#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
|
||||
|
||||
#if defined(MBEDTLS_ARC4_C) || defined(MBEDTLS_CIPHER_NULL_CIPHER)
|
||||
if( mode == MBEDTLS_MODE_STREAM )
|
||||
@ -3105,7 +3123,7 @@ int mbedtls_ssl_decrypt_buf( mbedtls_ssl_context *ssl,
|
||||
return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
|
||||
}
|
||||
|
||||
#if defined(MBEDTLS_SSL_CID)
|
||||
#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
|
||||
if( rec->cid_len != 0 )
|
||||
{
|
||||
ret = ssl_cid_parse_inner_plaintext( data, &rec->data_len,
|
||||
@ -3113,7 +3131,7 @@ int mbedtls_ssl_decrypt_buf( mbedtls_ssl_context *ssl,
|
||||
if( ret != 0 )
|
||||
return( MBEDTLS_ERR_SSL_INVALID_RECORD );
|
||||
}
|
||||
#endif /* MBEDTLS_SSL_CID */
|
||||
#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
|
||||
|
||||
MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= decrypt buf" ) );
|
||||
|
||||
@ -3513,7 +3531,7 @@ int mbedtls_ssl_flush_output( mbedtls_ssl_context *ssl )
|
||||
while( ssl->out_left > 0 )
|
||||
{
|
||||
MBEDTLS_SSL_DEBUG_MSG( 2, ( "message length: %d, out_left: %d",
|
||||
mbedtls_ssl_hdr_len( ssl ) + ssl->out_msglen, ssl->out_left ) );
|
||||
mbedtls_ssl_out_hdr_len( ssl ) + ssl->out_msglen, ssl->out_left ) );
|
||||
|
||||
buf = ssl->out_hdr - ssl->out_left;
|
||||
ret = ssl->f_send( ssl->p_bio, buf, ssl->out_left );
|
||||
@ -4119,7 +4137,9 @@ int mbedtls_ssl_write_record( mbedtls_ssl_context *ssl, uint8_t force_flush )
|
||||
unsigned i;
|
||||
size_t protected_record_size;
|
||||
|
||||
ssl->out_hdr[0] = (unsigned char) ssl->out_msgtype;
|
||||
/* Skip writing the record content type to after the encryption,
|
||||
* as it may change when using the CID extension. */
|
||||
|
||||
mbedtls_ssl_write_version( ssl->major_ver, ssl->minor_ver,
|
||||
ssl->conf->transport, ssl->out_hdr + 1 );
|
||||
|
||||
@ -4142,10 +4162,10 @@ int mbedtls_ssl_write_record( mbedtls_ssl_context *ssl, uint8_t force_flush )
|
||||
ssl->conf->transport, rec.ver );
|
||||
rec.type = ssl->out_msgtype;
|
||||
|
||||
#if defined(MBEDTLS_SSL_CID)
|
||||
#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
|
||||
/* The CID is set by mbedtls_ssl_encrypt_buf(). */
|
||||
rec.cid_len = 0;
|
||||
#endif /* MBEDTLS_SSL_CID */
|
||||
#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
|
||||
|
||||
if( ( ret = mbedtls_ssl_encrypt_buf( ssl, ssl->transform_out, &rec,
|
||||
ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 )
|
||||
@ -4160,12 +4180,17 @@ int mbedtls_ssl_write_record( mbedtls_ssl_context *ssl, uint8_t force_flush )
|
||||
return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
|
||||
}
|
||||
|
||||
/* Update the record content type and CID. */
|
||||
ssl->out_msgtype = rec.type;
|
||||
#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID )
|
||||
memcpy( ssl->out_cid, rec.cid, rec.cid_len );
|
||||
#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
|
||||
ssl->out_msglen = len = rec.data_len;
|
||||
ssl->out_len[0] = (unsigned char)( rec.data_len >> 8 );
|
||||
ssl->out_len[1] = (unsigned char)( rec.data_len );
|
||||
}
|
||||
|
||||
protected_record_size = len + mbedtls_ssl_hdr_len( ssl );
|
||||
protected_record_size = len + mbedtls_ssl_out_hdr_len( ssl );
|
||||
|
||||
#if defined(MBEDTLS_SSL_PROTO_DTLS)
|
||||
/* In case of DTLS, double-check that we don't exceed
|
||||
@ -4184,6 +4209,9 @@ int mbedtls_ssl_write_record( mbedtls_ssl_context *ssl, uint8_t force_flush )
|
||||
}
|
||||
#endif /* MBEDTLS_SSL_PROTO_DTLS */
|
||||
|
||||
/* Now write the potentially updated record content type. */
|
||||
ssl->out_hdr[0] = (unsigned char) ssl->out_msgtype;
|
||||
|
||||
MBEDTLS_SSL_DEBUG_MSG( 3, ( "output record: msgtype = %d, "
|
||||
"version = [%d:%d], msglen = %d",
|
||||
ssl->out_hdr[0], ssl->out_hdr[1],
|
||||
@ -4788,6 +4816,19 @@ static int ssl_handle_possible_reconnect( mbedtls_ssl_context *ssl )
|
||||
}
|
||||
#endif /* MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE && MBEDTLS_SSL_SRV_C */
|
||||
|
||||
static int ssl_check_record_type( uint8_t record_type )
|
||||
{
|
||||
if( record_type != MBEDTLS_SSL_MSG_HANDSHAKE &&
|
||||
record_type != MBEDTLS_SSL_MSG_ALERT &&
|
||||
record_type != MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC &&
|
||||
record_type != MBEDTLS_SSL_MSG_APPLICATION_DATA )
|
||||
{
|
||||
return( MBEDTLS_ERR_SSL_INVALID_RECORD );
|
||||
}
|
||||
|
||||
return( 0 );
|
||||
}
|
||||
|
||||
/*
|
||||
* ContentType type;
|
||||
* ProtocolVersion version;
|
||||
@ -4810,23 +4851,40 @@ static int ssl_handle_possible_reconnect( mbedtls_ssl_context *ssl )
|
||||
static int ssl_parse_record_header( mbedtls_ssl_context *ssl )
|
||||
{
|
||||
int major_ver, minor_ver;
|
||||
int ret;
|
||||
|
||||
MBEDTLS_SSL_DEBUG_BUF( 4, "input record header", ssl->in_hdr, mbedtls_ssl_hdr_len( ssl ) );
|
||||
/* Parse and validate record content type and version */
|
||||
|
||||
ssl->in_msgtype = ssl->in_hdr[0];
|
||||
ssl->in_msglen = ( ssl->in_len[0] << 8 ) | ssl->in_len[1];
|
||||
mbedtls_ssl_read_version( &major_ver, &minor_ver, ssl->conf->transport, ssl->in_hdr + 1 );
|
||||
|
||||
MBEDTLS_SSL_DEBUG_MSG( 3, ( "input record: msgtype = %d, "
|
||||
"version = [%d:%d], msglen = %d",
|
||||
ssl->in_msgtype,
|
||||
major_ver, minor_ver, ssl->in_msglen ) );
|
||||
|
||||
/* Check record type */
|
||||
if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE &&
|
||||
ssl->in_msgtype != MBEDTLS_SSL_MSG_ALERT &&
|
||||
ssl->in_msgtype != MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC &&
|
||||
ssl->in_msgtype != MBEDTLS_SSL_MSG_APPLICATION_DATA )
|
||||
#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
|
||||
if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
|
||||
ssl->in_msgtype == MBEDTLS_SSL_MSG_CID &&
|
||||
ssl->conf->cid_len != 0 )
|
||||
{
|
||||
/* Shift pointers to account for record header including CID
|
||||
* struct {
|
||||
* ContentType special_type = tls12_cid;
|
||||
* ProtocolVersion version;
|
||||
* uint16 epoch;
|
||||
* uint48 sequence_number;
|
||||
* opaque cid[cid_length]; // Additional field compared to
|
||||
* // default DTLS record format
|
||||
* uint16 length;
|
||||
* opaque enc_content[DTLSCiphertext.length];
|
||||
* } DTLSCiphertext;
|
||||
*/
|
||||
|
||||
/* So far, we only support static CID lengths
|
||||
* fixed in the configuration. */
|
||||
ssl->in_len = ssl->in_cid + ssl->conf->cid_len;
|
||||
ssl->in_iv = ssl->in_msg = ssl->in_len + 2;
|
||||
}
|
||||
else
|
||||
#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
|
||||
if( ssl_check_record_type( ssl->in_msgtype ) )
|
||||
{
|
||||
MBEDTLS_SSL_DEBUG_MSG( 1, ( "unknown record type" ) );
|
||||
|
||||
@ -4854,7 +4912,24 @@ static int ssl_parse_record_header( mbedtls_ssl_context *ssl )
|
||||
return( MBEDTLS_ERR_SSL_INVALID_RECORD );
|
||||
}
|
||||
|
||||
/* Check length against the size of our buffer */
|
||||
/* Now that the total length of the record header is known, ensure
|
||||
* that the current datagram is large enough to hold it.
|
||||
* This would fail, for example, if we received a datagram of
|
||||
* size 13 + n Bytes where n is less than the size of incoming CIDs. */
|
||||
ret = mbedtls_ssl_fetch_input( ssl, mbedtls_ssl_in_hdr_len( ssl ) );
|
||||
if( ret != 0 )
|
||||
{
|
||||
MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_fetch_input", ret );
|
||||
return( ret );
|
||||
}
|
||||
MBEDTLS_SSL_DEBUG_BUF( 4, "input record header", ssl->in_hdr, mbedtls_ssl_in_hdr_len( ssl ) );
|
||||
|
||||
/* Parse and validate record length
|
||||
* This must happen after the CID parsing because
|
||||
* its position in the record header depends on
|
||||
* the presence of a CID. */
|
||||
|
||||
ssl->in_msglen = ( ssl->in_len[0] << 8 ) | ssl->in_len[1];
|
||||
if( ssl->in_msglen > MBEDTLS_SSL_IN_BUFFER_LEN
|
||||
- (size_t)( ssl->in_msg - ssl->in_buf ) )
|
||||
{
|
||||
@ -4862,6 +4937,11 @@ static int ssl_parse_record_header( mbedtls_ssl_context *ssl )
|
||||
return( MBEDTLS_ERR_SSL_INVALID_RECORD );
|
||||
}
|
||||
|
||||
MBEDTLS_SSL_DEBUG_MSG( 3, ( "input record: msgtype = %d, "
|
||||
"version = [%d:%d], msglen = %d",
|
||||
ssl->in_msgtype,
|
||||
major_ver, minor_ver, ssl->in_msglen ) );
|
||||
|
||||
/*
|
||||
* DTLS-related tests.
|
||||
* Check epoch before checking length constraint because
|
||||
@ -4927,20 +5007,6 @@ static int ssl_parse_record_header( mbedtls_ssl_context *ssl )
|
||||
return( MBEDTLS_ERR_SSL_UNEXPECTED_RECORD );
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Drop unexpected ApplicationData records,
|
||||
* except at the beginning of renegotiations */
|
||||
if( ssl->in_msgtype == MBEDTLS_SSL_MSG_APPLICATION_DATA &&
|
||||
ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER
|
||||
#if defined(MBEDTLS_SSL_RENEGOTIATION)
|
||||
&& ! ( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
|
||||
ssl->state == MBEDTLS_SSL_SERVER_HELLO )
|
||||
#endif
|
||||
)
|
||||
{
|
||||
MBEDTLS_SSL_DEBUG_MSG( 1, ( "dropping unexpected ApplicationData" ) );
|
||||
return( MBEDTLS_ERR_SSL_UNEXPECTED_RECORD );
|
||||
}
|
||||
}
|
||||
#endif /* MBEDTLS_SSL_PROTO_DTLS */
|
||||
|
||||
@ -4997,7 +5063,7 @@ static int ssl_prepare_record_content( mbedtls_ssl_context *ssl )
|
||||
int ret, done = 0;
|
||||
|
||||
MBEDTLS_SSL_DEBUG_BUF( 4, "input record from network",
|
||||
ssl->in_hdr, mbedtls_ssl_hdr_len( ssl ) + ssl->in_msglen );
|
||||
ssl->in_hdr, mbedtls_ssl_in_hdr_len( ssl ) + ssl->in_msglen );
|
||||
|
||||
#if defined(MBEDTLS_SSL_HW_RECORD_ACCEL)
|
||||
if( mbedtls_ssl_hw_record_read != NULL )
|
||||
@ -5024,6 +5090,10 @@ static int ssl_prepare_record_content( mbedtls_ssl_context *ssl )
|
||||
- ( ssl->in_iv - ssl->in_buf );
|
||||
rec.data_len = ssl->in_msglen;
|
||||
rec.data_offset = 0;
|
||||
#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID )
|
||||
rec.cid_len = (uint8_t)( ssl->in_len - ssl->in_cid );
|
||||
memcpy( rec.cid, ssl->in_cid, rec.cid_len );
|
||||
#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
|
||||
|
||||
memcpy( &rec.ctr[0], ssl->in_ctr, 8 );
|
||||
mbedtls_ssl_write_version( ssl->major_ver, ssl->minor_ver,
|
||||
@ -5033,15 +5103,35 @@ static int ssl_prepare_record_content( mbedtls_ssl_context *ssl )
|
||||
&rec ) ) != 0 )
|
||||
{
|
||||
MBEDTLS_SSL_DEBUG_RET( 1, "ssl_decrypt_buf", ret );
|
||||
|
||||
#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
|
||||
if( ret == MBEDTLS_ERR_SSL_UNEXPECTED_CID &&
|
||||
ssl->conf->ignore_unexpected_cid
|
||||
== MBEDTLS_SSL_UNEXPECTED_CID_IGNORE )
|
||||
{
|
||||
MBEDTLS_SSL_DEBUG_MSG( 3, ( "ignoring unexpected CID" ) );
|
||||
ret = MBEDTLS_ERR_SSL_CONTINUE_PROCESSING;
|
||||
}
|
||||
#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
|
||||
|
||||
return( ret );
|
||||
}
|
||||
|
||||
if( ssl->in_iv + rec.data_offset != ssl->in_msg )
|
||||
if( ssl->in_msgtype != rec.type )
|
||||
{
|
||||
/* Should never happen */
|
||||
return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
|
||||
MBEDTLS_SSL_DEBUG_MSG( 4, ( "record type after decrypt (before %d): %d",
|
||||
ssl->in_msgtype, rec.type ) );
|
||||
}
|
||||
|
||||
/* The record content type may change during decryption,
|
||||
* so re-read it. */
|
||||
ssl->in_msgtype = rec.type;
|
||||
/* Also update the input buffer, because unfortunately
|
||||
* the server-side ssl_parse_client_hello() reparses the
|
||||
* record header when receiving a ClientHello initiating
|
||||
* a renegotiation. */
|
||||
ssl->in_hdr[0] = rec.type;
|
||||
ssl->in_msg = rec.buf + rec.data_offset;
|
||||
ssl->in_msglen = rec.data_len;
|
||||
ssl->in_len[0] = (unsigned char)( rec.data_len >> 8 );
|
||||
ssl->in_len[1] = (unsigned char)( rec.data_len );
|
||||
@ -5049,6 +5139,21 @@ static int ssl_prepare_record_content( mbedtls_ssl_context *ssl )
|
||||
MBEDTLS_SSL_DEBUG_BUF( 4, "input payload after decrypt",
|
||||
ssl->in_msg, ssl->in_msglen );
|
||||
|
||||
#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
|
||||
/* We have already checked the record content type
|
||||
* in ssl_parse_record_header(), failing or silently
|
||||
* dropping the record in the case of an unknown type.
|
||||
*
|
||||
* Since with the use of CIDs, the record content type
|
||||
* might change during decryption, re-check the record
|
||||
* content type, but treat a failure as fatal this time. */
|
||||
if( ssl_check_record_type( ssl->in_msgtype ) )
|
||||
{
|
||||
MBEDTLS_SSL_DEBUG_MSG( 1, ( "unknown record type" ) );
|
||||
return( MBEDTLS_ERR_SSL_INVALID_RECORD );
|
||||
}
|
||||
#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
|
||||
|
||||
if( ssl->in_msglen > MBEDTLS_SSL_IN_CONTENT_LEN )
|
||||
{
|
||||
MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad message length" ) );
|
||||
@ -5075,8 +5180,10 @@ static int ssl_prepare_record_content( mbedtls_ssl_context *ssl )
|
||||
if( ssl->nb_zero > 3 )
|
||||
{
|
||||
MBEDTLS_SSL_DEBUG_MSG( 1, ( "received four consecutive empty "
|
||||
"messages, possible DoS attack" ) );
|
||||
/* Q: Is that the right error code? */
|
||||
"messages, possible DoS attack" ) );
|
||||
/* Treat the records as if they were not properly authenticated,
|
||||
* thereby failing the connection if we see more than allowed
|
||||
* by the configured bad MAC threshold. */
|
||||
return( MBEDTLS_ERR_SSL_INVALID_MAC );
|
||||
}
|
||||
}
|
||||
@ -5808,7 +5915,16 @@ static int ssl_get_next_record( mbedtls_ssl_context *ssl )
|
||||
return( ret );
|
||||
#endif /* MBEDTLS_SSL_PROTO_DTLS */
|
||||
|
||||
if( ( ret = mbedtls_ssl_fetch_input( ssl, mbedtls_ssl_hdr_len( ssl ) ) ) != 0 )
|
||||
/* Reset in pointers to default state for TLS/DTLS records,
|
||||
* assuming no CID and no offset between record content and
|
||||
* record plaintext. */
|
||||
ssl_update_in_pointers( ssl );
|
||||
|
||||
/* Ensure that we have enough space available for the default form
|
||||
* of TLS / DTLS record headers (5 Bytes for TLS, 13 Bytes for DTLS,
|
||||
* with no space for CIDs counted in). */
|
||||
ret = mbedtls_ssl_fetch_input( ssl, mbedtls_ssl_in_hdr_len( ssl ) );
|
||||
if( ret != 0 )
|
||||
{
|
||||
MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_fetch_input", ret );
|
||||
return( ret );
|
||||
@ -5834,7 +5950,7 @@ static int ssl_get_next_record( mbedtls_ssl_context *ssl )
|
||||
{
|
||||
/* Skip unexpected record (but not whole datagram) */
|
||||
ssl->next_record_offset = ssl->in_msglen
|
||||
+ mbedtls_ssl_hdr_len( ssl );
|
||||
+ mbedtls_ssl_in_hdr_len( ssl );
|
||||
|
||||
MBEDTLS_SSL_DEBUG_MSG( 1, ( "discarding unexpected record "
|
||||
"(header)" ) );
|
||||
@ -5860,7 +5976,7 @@ static int ssl_get_next_record( mbedtls_ssl_context *ssl )
|
||||
* Read and optionally decrypt the message contents
|
||||
*/
|
||||
if( ( ret = mbedtls_ssl_fetch_input( ssl,
|
||||
mbedtls_ssl_hdr_len( ssl ) + ssl->in_msglen ) ) != 0 )
|
||||
mbedtls_ssl_in_hdr_len( ssl ) + ssl->in_msglen ) ) != 0 )
|
||||
{
|
||||
MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_fetch_input", ret );
|
||||
return( ret );
|
||||
@ -5870,7 +5986,7 @@ static int ssl_get_next_record( mbedtls_ssl_context *ssl )
|
||||
#if defined(MBEDTLS_SSL_PROTO_DTLS)
|
||||
if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
|
||||
{
|
||||
ssl->next_record_offset = ssl->in_msglen + mbedtls_ssl_hdr_len( ssl );
|
||||
ssl->next_record_offset = ssl->in_msglen + mbedtls_ssl_in_hdr_len( ssl );
|
||||
if( ssl->next_record_offset < ssl->in_left )
|
||||
{
|
||||
MBEDTLS_SSL_DEBUG_MSG( 3, ( "more than one record within datagram" ) );
|
||||
@ -5886,8 +6002,7 @@ static int ssl_get_next_record( mbedtls_ssl_context *ssl )
|
||||
if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
|
||||
{
|
||||
/* Silently discard invalid records */
|
||||
if( ret == MBEDTLS_ERR_SSL_INVALID_RECORD ||
|
||||
ret == MBEDTLS_ERR_SSL_INVALID_MAC )
|
||||
if( ret == MBEDTLS_ERR_SSL_INVALID_MAC )
|
||||
{
|
||||
/* Except when waiting for Finished as a bad mac here
|
||||
* probably means something went wrong in the handshake
|
||||
@ -6053,13 +6168,29 @@ int mbedtls_ssl_handle_message_type( mbedtls_ssl_context *ssl )
|
||||
}
|
||||
|
||||
#if defined(MBEDTLS_SSL_PROTO_DTLS)
|
||||
if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
|
||||
ssl->handshake != NULL &&
|
||||
ssl->state == MBEDTLS_SSL_HANDSHAKE_OVER )
|
||||
if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
|
||||
{
|
||||
ssl_handshake_wrapup_free_hs_transform( ssl );
|
||||
}
|
||||
/* Drop unexpected ApplicationData records,
|
||||
* except at the beginning of renegotiations */
|
||||
if( ssl->in_msgtype == MBEDTLS_SSL_MSG_APPLICATION_DATA &&
|
||||
ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER
|
||||
#if defined(MBEDTLS_SSL_RENEGOTIATION)
|
||||
&& ! ( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
|
||||
ssl->state == MBEDTLS_SSL_SERVER_HELLO )
|
||||
#endif
|
||||
)
|
||||
{
|
||||
MBEDTLS_SSL_DEBUG_MSG( 1, ( "dropping unexpected ApplicationData" ) );
|
||||
return( MBEDTLS_ERR_SSL_NON_FATAL );
|
||||
}
|
||||
|
||||
if( ssl->handshake != NULL &&
|
||||
ssl->state == MBEDTLS_SSL_HANDSHAKE_OVER )
|
||||
{
|
||||
ssl_handshake_wrapup_free_hs_transform( ssl );
|
||||
}
|
||||
}
|
||||
#endif /* MBEDTLS_SSL_PROTO_DTLS */
|
||||
|
||||
return( 0 );
|
||||
}
|
||||
@ -7030,7 +7161,7 @@ int mbedtls_ssl_parse_change_cipher_spec( mbedtls_ssl_context *ssl )
|
||||
#endif /* MBEDTLS_SSL_PROTO_DTLS */
|
||||
memset( ssl->in_ctr, 0, 8 );
|
||||
|
||||
ssl_update_in_pointers( ssl, ssl->transform_negotiate );
|
||||
ssl_update_in_pointers( ssl );
|
||||
|
||||
#if defined(MBEDTLS_SSL_HW_RECORD_ACCEL)
|
||||
if( mbedtls_ssl_hw_record_activate != NULL )
|
||||
@ -7955,14 +8086,24 @@ static void ssl_update_out_pointers( mbedtls_ssl_context *ssl,
|
||||
if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
|
||||
{
|
||||
ssl->out_ctr = ssl->out_hdr + 3;
|
||||
ssl->out_len = ssl->out_hdr + 11;
|
||||
ssl->out_iv = ssl->out_hdr + 13;
|
||||
#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
|
||||
ssl->out_cid = ssl->out_ctr + 8;
|
||||
ssl->out_len = ssl->out_cid;
|
||||
if( transform != NULL )
|
||||
ssl->out_len += transform->out_cid_len;
|
||||
#else /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
|
||||
ssl->out_len = ssl->out_ctr + 8;
|
||||
#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
|
||||
ssl->out_iv = ssl->out_len + 2;
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
ssl->out_ctr = ssl->out_hdr - 8;
|
||||
ssl->out_len = ssl->out_hdr + 3;
|
||||
#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
|
||||
ssl->out_cid = ssl->out_len;
|
||||
#endif
|
||||
ssl->out_iv = ssl->out_hdr + 5;
|
||||
}
|
||||
|
||||
@ -7984,32 +8125,47 @@ static void ssl_update_out_pointers( mbedtls_ssl_context *ssl,
|
||||
* and the caller has to make sure there's space for this.
|
||||
*/
|
||||
|
||||
static void ssl_update_in_pointers( mbedtls_ssl_context *ssl,
|
||||
mbedtls_ssl_transform *transform )
|
||||
static void ssl_update_in_pointers( mbedtls_ssl_context *ssl )
|
||||
{
|
||||
/* This function sets the pointers to match the case
|
||||
* of unprotected TLS/DTLS records, with both ssl->in_iv
|
||||
* and ssl->in_msg pointing to the beginning of the record
|
||||
* content.
|
||||
*
|
||||
* When decrypting a protected record, ssl->in_msg
|
||||
* will be shifted to point to the beginning of the
|
||||
* record plaintext.
|
||||
*/
|
||||
|
||||
#if defined(MBEDTLS_SSL_PROTO_DTLS)
|
||||
if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
|
||||
{
|
||||
/* This sets the header pointers to match records
|
||||
* without CID. When we receive a record containing
|
||||
* a CID, the fields are shifted accordingly in
|
||||
* ssl_parse_record_header(). */
|
||||
ssl->in_ctr = ssl->in_hdr + 3;
|
||||
ssl->in_len = ssl->in_hdr + 11;
|
||||
ssl->in_iv = ssl->in_hdr + 13;
|
||||
#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
|
||||
ssl->in_cid = ssl->in_ctr + 8;
|
||||
ssl->in_len = ssl->in_cid; /* Default: no CID */
|
||||
#else /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
|
||||
ssl->in_len = ssl->in_ctr + 8;
|
||||
#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
|
||||
ssl->in_iv = ssl->in_len + 2;
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
ssl->in_ctr = ssl->in_hdr - 8;
|
||||
ssl->in_len = ssl->in_hdr + 3;
|
||||
#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
|
||||
ssl->in_cid = ssl->in_len;
|
||||
#endif
|
||||
ssl->in_iv = ssl->in_hdr + 5;
|
||||
}
|
||||
|
||||
/* Offset in_msg from in_iv to allow space for explicit IV, if used. */
|
||||
if( transform != NULL &&
|
||||
ssl->minor_ver >= MBEDTLS_SSL_MINOR_VERSION_2 )
|
||||
{
|
||||
ssl->in_msg = ssl->in_iv + transform->ivlen - transform->fixed_ivlen;
|
||||
}
|
||||
else
|
||||
ssl->in_msg = ssl->in_iv;
|
||||
/* This will be adjusted at record decryption time. */
|
||||
ssl->in_msg = ssl->in_iv;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -8042,7 +8198,7 @@ static void ssl_reset_in_out_pointers( mbedtls_ssl_context *ssl )
|
||||
|
||||
/* Derive other internal pointers. */
|
||||
ssl_update_out_pointers( ssl, NULL /* no transform enabled */ );
|
||||
ssl_update_in_pointers ( ssl, NULL /* no transform enabled */ );
|
||||
ssl_update_in_pointers ( ssl );
|
||||
}
|
||||
|
||||
int mbedtls_ssl_setup( mbedtls_ssl_context *ssl,
|
||||
@ -9187,8 +9343,10 @@ int mbedtls_ssl_get_record_expansion( const mbedtls_ssl_context *ssl )
|
||||
const mbedtls_ssl_transform *transform = ssl->transform_out;
|
||||
unsigned block_size;
|
||||
|
||||
size_t out_hdr_len = mbedtls_ssl_out_hdr_len( ssl );
|
||||
|
||||
if( transform == NULL )
|
||||
return( (int) mbedtls_ssl_hdr_len( ssl ) );
|
||||
return( (int) out_hdr_len );
|
||||
|
||||
#if defined(MBEDTLS_ZLIB_SUPPORT)
|
||||
if( ssl->session_out->compression != MBEDTLS_SSL_COMPRESS_NULL )
|
||||
@ -9231,7 +9389,12 @@ int mbedtls_ssl_get_record_expansion( const mbedtls_ssl_context *ssl )
|
||||
return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
|
||||
}
|
||||
|
||||
return( (int)( mbedtls_ssl_hdr_len( ssl ) + transform_expansion ) );
|
||||
#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
|
||||
if( transform->out_cid_len != 0 )
|
||||
transform_expansion += MBEDTLS_SSL_MAX_CID_EXPANSION;
|
||||
#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
|
||||
|
||||
return( (int)( out_hdr_len + transform_expansion ) );
|
||||
}
|
||||
|
||||
#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
|
||||
|
@ -447,9 +447,9 @@ static const char *features[] = {
|
||||
#if defined(MBEDTLS_SSL_ALL_ALERT_MESSAGES)
|
||||
"MBEDTLS_SSL_ALL_ALERT_MESSAGES",
|
||||
#endif /* MBEDTLS_SSL_ALL_ALERT_MESSAGES */
|
||||
#if defined(MBEDTLS_SSL_CID)
|
||||
"MBEDTLS_SSL_CID",
|
||||
#endif /* MBEDTLS_SSL_CID */
|
||||
#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
|
||||
"MBEDTLS_SSL_DTLS_CONNECTION_ID",
|
||||
#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
|
||||
#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
|
||||
"MBEDTLS_SSL_ASYNC_PRIVATE",
|
||||
#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
|
||||
|
@ -1234,13 +1234,13 @@ int query_config( const char *config )
|
||||
}
|
||||
#endif /* MBEDTLS_SSL_ALL_ALERT_MESSAGES */
|
||||
|
||||
#if defined(MBEDTLS_SSL_CID)
|
||||
if( strcmp( "MBEDTLS_SSL_CID", config ) == 0 )
|
||||
#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
|
||||
if( strcmp( "MBEDTLS_SSL_DTLS_CONNECTION_ID", config ) == 0 )
|
||||
{
|
||||
MACRO_EXPANSION_TO_STR( MBEDTLS_SSL_CID );
|
||||
MACRO_EXPANSION_TO_STR( MBEDTLS_SSL_DTLS_CONNECTION_ID );
|
||||
return( 0 );
|
||||
}
|
||||
#endif /* MBEDTLS_SSL_CID */
|
||||
#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
|
||||
|
||||
#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
|
||||
if( strcmp( "MBEDTLS_SSL_ASYNC_PRIVATE", config ) == 0 )
|
||||
@ -2530,6 +2530,14 @@ int query_config( const char *config )
|
||||
}
|
||||
#endif /* MBEDTLS_SSL_CID_OUT_LEN_MAX */
|
||||
|
||||
#if defined(MBEDTLS_SSL_CID_PADDING_GRANULARITY)
|
||||
if( strcmp( "MBEDTLS_SSL_CID_PADDING_GRANULARITY", config ) == 0 )
|
||||
{
|
||||
MACRO_EXPANSION_TO_STR( MBEDTLS_SSL_CID_PADDING_GRANULARITY );
|
||||
return( 0 );
|
||||
}
|
||||
#endif /* MBEDTLS_SSL_CID_PADDING_GRANULARITY */
|
||||
|
||||
#if defined(MBEDTLS_SSL_OUT_CONTENT_LEN)
|
||||
if( strcmp( "MBEDTLS_SSL_OUT_CONTENT_LEN", config ) == 0 )
|
||||
{
|
||||
|
@ -115,6 +115,8 @@ int main( void )
|
||||
#define DFL_RECO_DELAY 0
|
||||
#define DFL_CID_ENABLED 0
|
||||
#define DFL_CID_VALUE ""
|
||||
#define DFL_CID_ENABLED_RENEGO -1
|
||||
#define DFL_CID_VALUE_RENEGO NULL
|
||||
#define DFL_RECONNECT_HARD 0
|
||||
#define DFL_TICKETS MBEDTLS_SSL_SESSION_TICKETS_ENABLED
|
||||
#define DFL_ALPN_STRING NULL
|
||||
@ -168,15 +170,19 @@ int main( void )
|
||||
#define USAGE_KEY_OPAQUE ""
|
||||
#endif
|
||||
|
||||
#if defined(MBEDTLS_SSL_CID)
|
||||
#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
|
||||
#define USAGE_CID \
|
||||
" cid=%%d Disable (0) or enable (1) the use of the DTLS Connection ID extension.\n" \
|
||||
" default: 0 (disabled)\n" \
|
||||
" cid_renego=%%d Disable (0) or enable (1) the use of the DTLS Connection ID extension during renegotiation.\n" \
|
||||
" default: same as 'cid' parameter\n" \
|
||||
" cid_val=%%s The CID to use for incoming messages (in hex, without 0x).\n" \
|
||||
" default: \"\"\n"
|
||||
#else /* MBEDTLS_SSL_CID */
|
||||
" default: \"\"\n" \
|
||||
" cid_val_renego=%%s The CID to use for incoming messages (in hex, without 0x) after renegotiation.\n" \
|
||||
" default: same as 'cid_val' parameter\n"
|
||||
#else /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
|
||||
#define USAGE_CID ""
|
||||
#endif /* MBEDTLS_SSL_CID */
|
||||
#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
|
||||
|
||||
#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)
|
||||
#define USAGE_PSK_RAW \
|
||||
@ -471,7 +477,11 @@ struct options
|
||||
int context_crt_cb; /* use context-specific CRT verify callback */
|
||||
int eap_tls; /* derive EAP-TLS keying material? */
|
||||
int cid_enabled; /* whether to use the CID extension or not */
|
||||
int cid_enabled_renego; /* whether to use the CID extension or not
|
||||
* during renegotiation */
|
||||
const char *cid_val; /* the CID to use for incoming messages */
|
||||
const char *cid_val_renego; /* the CID to use for incoming messages
|
||||
* after renegotiation */
|
||||
} opt;
|
||||
|
||||
int query_config( const char *config );
|
||||
@ -762,6 +772,85 @@ int unhexify( char const *hex, unsigned char *dst )
|
||||
return( 0 );
|
||||
}
|
||||
|
||||
#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
|
||||
int report_cid_usage( mbedtls_ssl_context *ssl,
|
||||
const char *additional_description )
|
||||
{
|
||||
int ret;
|
||||
unsigned char peer_cid[ MBEDTLS_SSL_CID_OUT_LEN_MAX ];
|
||||
size_t peer_cid_len;
|
||||
int cid_negotiated;
|
||||
|
||||
if( opt.transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM )
|
||||
return( 0 );
|
||||
|
||||
/* Check if the use of a CID has been negotiated,
|
||||
* but don't ask for the CID value and length.
|
||||
*
|
||||
* Note: Here and below, we're demonstrating the various ways
|
||||
* in which mbedtls_ssl_get_peer_cid() can be called,
|
||||
* depending on whether or not the length/value of the
|
||||
* peer's CID is needed.
|
||||
*
|
||||
* An actual application, however, should use
|
||||
* just one call to mbedtls_ssl_get_peer_cid(). */
|
||||
ret = mbedtls_ssl_get_peer_cid( ssl, &cid_negotiated,
|
||||
NULL, NULL );
|
||||
if( ret != 0 )
|
||||
{
|
||||
mbedtls_printf( " failed\n ! mbedtls_ssl_get_peer_cid returned -0x%x\n\n",
|
||||
-ret );
|
||||
return( ret );
|
||||
}
|
||||
|
||||
if( cid_negotiated == MBEDTLS_SSL_CID_DISABLED )
|
||||
{
|
||||
if( opt.cid_enabled == MBEDTLS_SSL_CID_ENABLED )
|
||||
{
|
||||
mbedtls_printf( "(%s) Use of Connection ID was rejected by the server.\n",
|
||||
additional_description );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
size_t idx=0;
|
||||
mbedtls_printf( "(%s) Use of Connection ID has been negotiated.\n",
|
||||
additional_description );
|
||||
|
||||
/* Ask for just the length of the peer's CID. */
|
||||
ret = mbedtls_ssl_get_peer_cid( ssl, &cid_negotiated,
|
||||
NULL, &peer_cid_len );
|
||||
if( ret != 0 )
|
||||
{
|
||||
mbedtls_printf( " failed\n ! mbedtls_ssl_get_peer_cid returned -0x%x\n\n",
|
||||
-ret );
|
||||
return( ret );
|
||||
}
|
||||
|
||||
/* Ask for just length + value of the peer's CID. */
|
||||
ret = mbedtls_ssl_get_peer_cid( ssl, &cid_negotiated,
|
||||
peer_cid, &peer_cid_len );
|
||||
if( ret != 0 )
|
||||
{
|
||||
mbedtls_printf( " failed\n ! mbedtls_ssl_get_peer_cid returned -0x%x\n\n",
|
||||
-ret );
|
||||
return( ret );
|
||||
}
|
||||
mbedtls_printf( "(%s) Peer CID (length %u Bytes): ",
|
||||
additional_description,
|
||||
(unsigned) peer_cid_len );
|
||||
while( idx < peer_cid_len )
|
||||
{
|
||||
mbedtls_printf( "%02x ", peer_cid[ idx ] );
|
||||
idx++;
|
||||
}
|
||||
mbedtls_printf( "\n" );
|
||||
}
|
||||
|
||||
return( 0 );
|
||||
}
|
||||
#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
|
||||
|
||||
int main( int argc, char *argv[] )
|
||||
{
|
||||
int ret = 0, len, tail_len, i, written, frags, retry_left;
|
||||
@ -774,9 +863,11 @@ int main( int argc, char *argv[] )
|
||||
size_t psk_len = 0;
|
||||
#endif
|
||||
|
||||
#if defined(MBEDTLS_SSL_CID)
|
||||
#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
|
||||
unsigned char cid[MBEDTLS_SSL_CID_IN_LEN_MAX];
|
||||
unsigned char cid_renego[MBEDTLS_SSL_CID_IN_LEN_MAX];
|
||||
size_t cid_len = 0;
|
||||
size_t cid_renego_len = 0;
|
||||
#endif
|
||||
|
||||
#if defined(MBEDTLS_SSL_ALPN)
|
||||
@ -881,6 +972,8 @@ int main( int argc, char *argv[] )
|
||||
opt.debug_level = DFL_DEBUG_LEVEL;
|
||||
opt.cid_enabled = DFL_CID_ENABLED;
|
||||
opt.cid_val = DFL_CID_VALUE;
|
||||
opt.cid_enabled_renego = DFL_CID_ENABLED_RENEGO;
|
||||
opt.cid_val_renego = DFL_CID_VALUE_RENEGO;
|
||||
opt.nbio = DFL_NBIO;
|
||||
opt.event = DFL_EVENT;
|
||||
opt.context_crt_cb = DFL_CONTEXT_CRT_CB;
|
||||
@ -1009,18 +1102,28 @@ int main( int argc, char *argv[] )
|
||||
else if( strcmp( p, "key_opaque" ) == 0 )
|
||||
opt.key_opaque = atoi( q );
|
||||
#endif
|
||||
#if defined(MBEDTLS_SSL_CID)
|
||||
#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
|
||||
else if( strcmp( p, "cid" ) == 0 )
|
||||
{
|
||||
opt.cid_enabled = atoi( q );
|
||||
if( opt.cid_enabled != 0 && opt.cid_enabled != 1 )
|
||||
goto usage;
|
||||
}
|
||||
else if( strcmp( p, "cid_renego" ) == 0 )
|
||||
{
|
||||
opt.cid_enabled_renego = atoi( q );
|
||||
if( opt.cid_enabled_renego != 0 && opt.cid_enabled_renego != 1 )
|
||||
goto usage;
|
||||
}
|
||||
else if( strcmp( p, "cid_val" ) == 0 )
|
||||
{
|
||||
opt.cid_val = q;
|
||||
}
|
||||
#endif /* MBEDTLS_SSL_CID */
|
||||
else if( strcmp( p, "cid_val_renego" ) == 0 )
|
||||
{
|
||||
opt.cid_val_renego = q;
|
||||
}
|
||||
#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
|
||||
else if( strcmp( p, "psk" ) == 0 )
|
||||
opt.psk = q;
|
||||
#if defined(MBEDTLS_USE_PSA_CRYPTO)
|
||||
@ -1442,23 +1545,40 @@ int main( int argc, char *argv[] )
|
||||
#endif /* MBEDTLS_USE_PSA_CRYPTO */
|
||||
}
|
||||
|
||||
#if defined(MBEDTLS_SSL_CID)
|
||||
if( strlen( opt.cid_val ) )
|
||||
{
|
||||
cid_len = strlen( opt.cid_val ) / 2;
|
||||
if( cid_len > sizeof( cid ) )
|
||||
{
|
||||
mbedtls_printf( "CID too long\n" );
|
||||
goto exit;
|
||||
}
|
||||
#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
|
||||
cid_len = strlen( opt.cid_val ) / 2;
|
||||
if( cid_len > sizeof( cid ) )
|
||||
{
|
||||
mbedtls_printf( "CID too long\n" );
|
||||
goto exit;
|
||||
}
|
||||
|
||||
if( unhexify( opt.cid_val, cid ) != 0 )
|
||||
{
|
||||
mbedtls_printf( "CID not valid hex\n" );
|
||||
goto exit;
|
||||
}
|
||||
}
|
||||
#endif /* MBEDTLS_SSL_CID */
|
||||
if( unhexify( opt.cid_val, cid ) != 0 )
|
||||
{
|
||||
mbedtls_printf( "CID not valid hex\n" );
|
||||
goto exit;
|
||||
}
|
||||
|
||||
/* Keep CID settings for renegotiation unless
|
||||
* specified otherwise. */
|
||||
if( opt.cid_enabled_renego == DFL_CID_ENABLED_RENEGO )
|
||||
opt.cid_enabled_renego = opt.cid_enabled;
|
||||
if( opt.cid_val_renego == DFL_CID_VALUE_RENEGO )
|
||||
opt.cid_val_renego = opt.cid_val;
|
||||
|
||||
cid_renego_len = strlen( opt.cid_val_renego ) / 2;
|
||||
if( cid_renego_len > sizeof( cid_renego ) )
|
||||
{
|
||||
mbedtls_printf( "CID too long\n" );
|
||||
goto exit;
|
||||
}
|
||||
|
||||
if( unhexify( opt.cid_val_renego, cid_renego ) != 0 )
|
||||
{
|
||||
mbedtls_printf( "CID not valid hex\n" );
|
||||
goto exit;
|
||||
}
|
||||
#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
|
||||
|
||||
#if defined(MBEDTLS_ECP_C)
|
||||
if( opt.curves != NULL )
|
||||
@ -1738,6 +1858,33 @@ int main( int argc, char *argv[] )
|
||||
memset( peer_crt_info, 0, sizeof( peer_crt_info ) );
|
||||
#endif /* MBEDTLS_X509_CRT_PARSE_C */
|
||||
|
||||
#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
|
||||
if( opt.cid_enabled == 1 || opt.cid_enabled_renego == 1 )
|
||||
{
|
||||
if( opt.cid_enabled == 1 &&
|
||||
opt.cid_enabled_renego == 1 &&
|
||||
cid_len != cid_renego_len )
|
||||
{
|
||||
mbedtls_printf( "CID length must not change during renegotiation\n" );
|
||||
goto usage;
|
||||
}
|
||||
|
||||
if( opt.cid_enabled == 1 )
|
||||
ret = mbedtls_ssl_conf_cid( &conf, cid_len,
|
||||
MBEDTLS_SSL_UNEXPECTED_CID_IGNORE );
|
||||
else
|
||||
ret = mbedtls_ssl_conf_cid( &conf, cid_renego_len,
|
||||
MBEDTLS_SSL_UNEXPECTED_CID_IGNORE );
|
||||
|
||||
if( ret != 0 )
|
||||
{
|
||||
mbedtls_printf( " failed\n ! mbedtls_ssl_conf_cid_len returned -%#04x\n\n",
|
||||
-ret );
|
||||
goto exit;
|
||||
}
|
||||
}
|
||||
#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
|
||||
|
||||
if( opt.auth_mode != DFL_AUTH_MODE )
|
||||
mbedtls_ssl_conf_authmode( &conf, opt.auth_mode );
|
||||
|
||||
@ -1961,7 +2108,7 @@ int main( int argc, char *argv[] )
|
||||
mbedtls_net_send, mbedtls_net_recv,
|
||||
opt.nbio == 0 ? mbedtls_net_recv_timeout : NULL );
|
||||
|
||||
#if defined(MBEDTLS_SSL_CID)
|
||||
#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
|
||||
if( opt.transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
|
||||
{
|
||||
if( ( ret = mbedtls_ssl_set_cid( &ssl, opt.cid_enabled,
|
||||
@ -1972,7 +2119,7 @@ int main( int argc, char *argv[] )
|
||||
goto exit;
|
||||
}
|
||||
}
|
||||
#endif /* MBEDTLS_SSL_CID */
|
||||
#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
|
||||
|
||||
#if defined(MBEDTLS_SSL_PROTO_DTLS)
|
||||
if( opt.dtls_mtu != DFL_DTLS_MTU )
|
||||
@ -2148,45 +2295,23 @@ int main( int argc, char *argv[] )
|
||||
mbedtls_printf( "%s\n", peer_crt_info );
|
||||
#endif /* MBEDTLS_X509_CRT_PARSE_C */
|
||||
|
||||
#if defined(MBEDTLS_SSL_CID)
|
||||
#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
|
||||
ret = report_cid_usage( &ssl, "initial handshake" );
|
||||
if( ret != 0 )
|
||||
goto exit;
|
||||
|
||||
if( opt.transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
|
||||
{
|
||||
unsigned char peer_cid[ MBEDTLS_SSL_CID_OUT_LEN_MAX ];
|
||||
size_t peer_cid_len;
|
||||
int cid_negotiated;
|
||||
|
||||
/* Check if the use of a CID has been negotiated */
|
||||
ret = mbedtls_ssl_get_peer_cid( &ssl, &cid_negotiated,
|
||||
peer_cid, &peer_cid_len );
|
||||
if( ret != 0 )
|
||||
if( ( ret = mbedtls_ssl_set_cid( &ssl, opt.cid_enabled_renego,
|
||||
cid_renego,
|
||||
cid_renego_len ) ) != 0 )
|
||||
{
|
||||
mbedtls_printf( " failed\n ! mbedtls_ssl_get_peer_cid returned -0x%x\n\n",
|
||||
-ret );
|
||||
goto exit;
|
||||
}
|
||||
|
||||
if( cid_negotiated == MBEDTLS_SSL_CID_DISABLED )
|
||||
{
|
||||
if( opt.cid_enabled == MBEDTLS_SSL_CID_ENABLED )
|
||||
{
|
||||
mbedtls_printf( "Use of Connection ID was rejected by the server.\n" );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
size_t idx=0;
|
||||
mbedtls_printf( "Use of Connection ID has been negotiated.\n" );
|
||||
mbedtls_printf( "Peer CID (length %u Bytes): ",
|
||||
(unsigned) peer_cid_len );
|
||||
while( idx < peer_cid_len )
|
||||
{
|
||||
mbedtls_printf( "%02x ", peer_cid[ idx ] );
|
||||
idx++;
|
||||
}
|
||||
mbedtls_printf( "\n" );
|
||||
mbedtls_printf( " failed\n ! mbedtls_ssl_set_cid returned %d\n\n",
|
||||
ret );
|
||||
return( ret );
|
||||
}
|
||||
}
|
||||
#endif /* MBEDTLS_SSL_CID */
|
||||
#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
|
||||
|
||||
#if defined(MBEDTLS_SSL_RENEGOTIATION)
|
||||
if( opt.renegotiate )
|
||||
@ -2228,6 +2353,12 @@ int main( int argc, char *argv[] )
|
||||
}
|
||||
#endif /* MBEDTLS_SSL_RENEGOTIATION */
|
||||
|
||||
#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
|
||||
ret = report_cid_usage( &ssl, "after renegotiation" );
|
||||
if( ret != 0 )
|
||||
goto exit;
|
||||
#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
|
||||
|
||||
/*
|
||||
* 6. Write the GET request
|
||||
*/
|
||||
|
@ -147,6 +147,8 @@ int main( void )
|
||||
#define DFL_SHA1 -1
|
||||
#define DFL_CID_ENABLED 0
|
||||
#define DFL_CID_VALUE ""
|
||||
#define DFL_CID_ENABLED_RENEGO -1
|
||||
#define DFL_CID_VALUE_RENEGO NULL
|
||||
#define DFL_AUTH_MODE -1
|
||||
#define DFL_CERT_REQ_CA_LIST MBEDTLS_SSL_CERT_REQ_CA_LIST_ENABLED
|
||||
#define DFL_MFL_CODE MBEDTLS_SSL_MAX_FRAG_LEN_NONE
|
||||
@ -234,15 +236,19 @@ int main( void )
|
||||
#define USAGE_SSL_ASYNC ""
|
||||
#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
|
||||
|
||||
#if defined(MBEDTLS_SSL_CID)
|
||||
#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
|
||||
#define USAGE_CID \
|
||||
" cid=%%d Disable (0) or enable (1) the use of the DTLS Connection ID extension.\n" \
|
||||
" default: 0 (disabled)\n" \
|
||||
" cid_renego=%%d Disable (0) or enable (1) the use of the DTLS Connection ID extension during renegotiation.\n" \
|
||||
" default: same as 'cid' parameter\n" \
|
||||
" cid_val=%%s The CID to use for incoming messages (in hex, without 0x).\n" \
|
||||
" default: \"\"\n"
|
||||
#else /* MBEDTLS_SSL_CID */
|
||||
" default: \"\"\n" \
|
||||
" cid_val_renego=%%s The CID to use for incoming messages (in hex, without 0x) after renegotiation.\n" \
|
||||
" default: same as 'cid_val' parameter\n"
|
||||
#else /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
|
||||
#define USAGE_CID ""
|
||||
#endif /* MBEDTLS_SSL_CID */
|
||||
#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
|
||||
|
||||
#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)
|
||||
#define USAGE_PSK_RAW \
|
||||
@ -586,7 +592,11 @@ struct options
|
||||
int badmac_limit; /* Limit of records with bad MAC */
|
||||
int eap_tls; /* derive EAP-TLS keying material? */
|
||||
int cid_enabled; /* whether to use the CID extension or not */
|
||||
int cid_enabled_renego; /* whether to use the CID extension or not
|
||||
* during renegotiation */
|
||||
const char *cid_val; /* the CID to use for incoming messages */
|
||||
const char *cid_val_renego; /* the CID to use for incoming messages
|
||||
* after renegotiation */
|
||||
} opt;
|
||||
|
||||
int query_config( const char *config );
|
||||
@ -925,7 +935,7 @@ int sni_callback( void *p_info, mbedtls_ssl_context *ssl,
|
||||
#endif /* SNI_OPTION */
|
||||
|
||||
#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED) || \
|
||||
defined(MBEDTLS_SSL_CID)
|
||||
defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
|
||||
|
||||
#define HEX2NUM( c ) \
|
||||
do \
|
||||
@ -1434,6 +1444,56 @@ static psa_status_t psa_setup_psk_key_slot( psa_key_handle_t slot,
|
||||
}
|
||||
#endif /* MBEDTLS_USE_PSA_CRYPTO */
|
||||
|
||||
#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
|
||||
int report_cid_usage( mbedtls_ssl_context *ssl,
|
||||
const char *additional_description )
|
||||
{
|
||||
int ret;
|
||||
unsigned char peer_cid[ MBEDTLS_SSL_CID_OUT_LEN_MAX ];
|
||||
size_t peer_cid_len;
|
||||
int cid_negotiated;
|
||||
|
||||
if( opt.transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM )
|
||||
return( 0 );
|
||||
|
||||
/* Check if the use of a CID has been negotiated */
|
||||
ret = mbedtls_ssl_get_peer_cid( ssl, &cid_negotiated,
|
||||
peer_cid, &peer_cid_len );
|
||||
if( ret != 0 )
|
||||
{
|
||||
mbedtls_printf( " failed\n ! mbedtls_ssl_get_peer_cid returned -0x%x\n\n",
|
||||
-ret );
|
||||
return( ret );
|
||||
}
|
||||
|
||||
if( cid_negotiated == MBEDTLS_SSL_CID_DISABLED )
|
||||
{
|
||||
if( opt.cid_enabled == MBEDTLS_SSL_CID_ENABLED )
|
||||
{
|
||||
mbedtls_printf( "(%s) Use of Connection ID was not offered by client.\n",
|
||||
additional_description );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
size_t idx=0;
|
||||
mbedtls_printf( "(%s) Use of Connection ID has been negotiated.\n",
|
||||
additional_description );
|
||||
mbedtls_printf( "(%s) Peer CID (length %u Bytes): ",
|
||||
additional_description,
|
||||
(unsigned) peer_cid_len );
|
||||
while( idx < peer_cid_len )
|
||||
{
|
||||
mbedtls_printf( "%02x ", peer_cid[ idx ] );
|
||||
idx++;
|
||||
}
|
||||
mbedtls_printf( "\n" );
|
||||
}
|
||||
|
||||
return( 0 );
|
||||
}
|
||||
#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
|
||||
|
||||
int main( int argc, char *argv[] )
|
||||
{
|
||||
int ret = 0, len, written, frags, exchanges_left;
|
||||
@ -1503,9 +1563,11 @@ int main( int argc, char *argv[] )
|
||||
unsigned char alloc_buf[MEMORY_HEAP_SIZE];
|
||||
#endif
|
||||
|
||||
#if defined(MBEDTLS_SSL_CID)
|
||||
#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
|
||||
unsigned char cid[MBEDTLS_SSL_CID_IN_LEN_MAX];
|
||||
unsigned char cid_renego[MBEDTLS_SSL_CID_IN_LEN_MAX];
|
||||
size_t cid_len = 0;
|
||||
size_t cid_renego_len = 0;
|
||||
#endif
|
||||
|
||||
int i;
|
||||
@ -1606,7 +1668,9 @@ int main( int argc, char *argv[] )
|
||||
opt.response_size = DFL_RESPONSE_SIZE;
|
||||
opt.nbio = DFL_NBIO;
|
||||
opt.cid_enabled = DFL_CID_ENABLED;
|
||||
opt.cid_enabled_renego = DFL_CID_ENABLED_RENEGO;
|
||||
opt.cid_val = DFL_CID_VALUE;
|
||||
opt.cid_val_renego = DFL_CID_VALUE_RENEGO;
|
||||
opt.read_timeout = DFL_READ_TIMEOUT;
|
||||
opt.ca_file = DFL_CA_FILE;
|
||||
opt.ca_path = DFL_CA_PATH;
|
||||
@ -1753,18 +1817,28 @@ int main( int argc, char *argv[] )
|
||||
opt.async_private_error = n;
|
||||
}
|
||||
#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
|
||||
#if defined(MBEDTLS_SSL_CID)
|
||||
#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
|
||||
else if( strcmp( p, "cid" ) == 0 )
|
||||
{
|
||||
opt.cid_enabled = atoi( q );
|
||||
if( opt.cid_enabled != 0 && opt.cid_enabled != 1 )
|
||||
goto usage;
|
||||
}
|
||||
else if( strcmp( p, "cid_renego" ) == 0 )
|
||||
{
|
||||
opt.cid_enabled_renego = atoi( q );
|
||||
if( opt.cid_enabled_renego != 0 && opt.cid_enabled_renego != 1 )
|
||||
goto usage;
|
||||
}
|
||||
else if( strcmp( p, "cid_val" ) == 0 )
|
||||
{
|
||||
opt.cid_val = q;
|
||||
}
|
||||
#endif /* MBEDTLS_SSL_CID */
|
||||
else if( strcmp( p, "cid_val_renego" ) == 0 )
|
||||
{
|
||||
opt.cid_val_renego = q;
|
||||
}
|
||||
#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
|
||||
else if( strcmp( p, "psk" ) == 0 )
|
||||
opt.psk = q;
|
||||
#if defined(MBEDTLS_USE_PSA_CRYPTO)
|
||||
@ -2248,23 +2322,26 @@ int main( int argc, char *argv[] )
|
||||
}
|
||||
}
|
||||
|
||||
#if defined(MBEDTLS_SSL_CID)
|
||||
if( strlen( opt.cid_val ) )
|
||||
{
|
||||
cid_len = strlen( opt.cid_val ) / 2;
|
||||
if( cid_len > sizeof( cid ) )
|
||||
{
|
||||
mbedtls_printf( "CID too long\n" );
|
||||
goto exit;
|
||||
}
|
||||
#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
|
||||
if( unhexify( cid, opt.cid_val, &cid_len ) != 0 )
|
||||
{
|
||||
mbedtls_printf( "CID not valid hex\n" );
|
||||
goto exit;
|
||||
}
|
||||
|
||||
if( unhexify( cid, opt.cid_val, &cid_len ) != 0 )
|
||||
{
|
||||
mbedtls_printf( "CID not valid hex\n" );
|
||||
goto exit;
|
||||
}
|
||||
}
|
||||
#endif /* MBEDTLS_SSL_CID */
|
||||
/* Keep CID settings for renegotiation unless
|
||||
* specified otherwise. */
|
||||
if( opt.cid_enabled_renego == DFL_CID_ENABLED_RENEGO )
|
||||
opt.cid_enabled_renego = opt.cid_enabled;
|
||||
if( opt.cid_val_renego == DFL_CID_VALUE_RENEGO )
|
||||
opt.cid_val_renego = opt.cid_val;
|
||||
|
||||
if( unhexify( cid_renego, opt.cid_val_renego, &cid_renego_len ) != 0 )
|
||||
{
|
||||
mbedtls_printf( "CID not valid hex\n" );
|
||||
goto exit;
|
||||
}
|
||||
#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
|
||||
|
||||
#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)
|
||||
/*
|
||||
@ -2637,6 +2714,33 @@ int main( int argc, char *argv[] )
|
||||
};
|
||||
#endif
|
||||
|
||||
#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
|
||||
if( opt.cid_enabled == 1 || opt.cid_enabled_renego == 1 )
|
||||
{
|
||||
if( opt.cid_enabled == 1 &&
|
||||
opt.cid_enabled_renego == 1 &&
|
||||
cid_len != cid_renego_len )
|
||||
{
|
||||
mbedtls_printf( "CID length must not change during renegotiation\n" );
|
||||
goto usage;
|
||||
}
|
||||
|
||||
if( opt.cid_enabled == 1 )
|
||||
ret = mbedtls_ssl_conf_cid( &conf, cid_len,
|
||||
MBEDTLS_SSL_UNEXPECTED_CID_IGNORE );
|
||||
else
|
||||
ret = mbedtls_ssl_conf_cid( &conf, cid_renego_len,
|
||||
MBEDTLS_SSL_UNEXPECTED_CID_IGNORE );
|
||||
|
||||
if( ret != 0 )
|
||||
{
|
||||
mbedtls_printf( " failed\n ! mbedtls_ssl_conf_cid_len returned -%#04x\n\n",
|
||||
-ret );
|
||||
goto exit;
|
||||
}
|
||||
}
|
||||
#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
|
||||
|
||||
#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
|
||||
if( opt.trunc_hmac != DFL_TRUNC_HMAC )
|
||||
mbedtls_ssl_conf_truncated_hmac( &conf, opt.trunc_hmac );
|
||||
@ -3013,7 +3117,7 @@ int main( int argc, char *argv[] )
|
||||
mbedtls_ssl_set_bio( &ssl, &client_fd, mbedtls_net_send, mbedtls_net_recv,
|
||||
opt.nbio == 0 ? mbedtls_net_recv_timeout : NULL );
|
||||
|
||||
#if defined(MBEDTLS_SSL_CID)
|
||||
#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
|
||||
if( opt.transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
|
||||
{
|
||||
if( ( ret = mbedtls_ssl_set_cid( &ssl, opt.cid_enabled,
|
||||
@ -3024,7 +3128,7 @@ int main( int argc, char *argv[] )
|
||||
goto exit;
|
||||
}
|
||||
}
|
||||
#endif /* MBEDTLS_SSL_CID */
|
||||
#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
|
||||
|
||||
#if defined(MBEDTLS_SSL_PROTO_DTLS)
|
||||
if( opt.dtls_mtu != DFL_DTLS_MTU )
|
||||
@ -3303,45 +3407,22 @@ handshake:
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(MBEDTLS_SSL_CID)
|
||||
#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
|
||||
ret = report_cid_usage( &ssl, "initial handshake" );
|
||||
if( ret != 0 )
|
||||
goto exit;
|
||||
|
||||
if( opt.transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
|
||||
{
|
||||
unsigned char peer_cid[ MBEDTLS_SSL_CID_OUT_LEN_MAX ];
|
||||
size_t peer_cid_len;
|
||||
int cid_negotiated;
|
||||
|
||||
/* Check if the use of a CID has been negotiated */
|
||||
ret = mbedtls_ssl_get_peer_cid( &ssl, &cid_negotiated,
|
||||
peer_cid, &peer_cid_len );
|
||||
if( ret != 0 )
|
||||
if( ( ret = mbedtls_ssl_set_cid( &ssl, opt.cid_enabled_renego,
|
||||
cid_renego, cid_renego_len ) ) != 0 )
|
||||
{
|
||||
mbedtls_printf( " failed\n ! mbedtls_ssl_get_peer_cid returned -0x%x\n\n",
|
||||
-ret );
|
||||
mbedtls_printf( " failed\n ! mbedtls_ssl_set_cid returned %d\n\n",
|
||||
ret );
|
||||
goto exit;
|
||||
}
|
||||
|
||||
if( cid_negotiated == MBEDTLS_SSL_CID_DISABLED )
|
||||
{
|
||||
if( opt.cid_enabled == MBEDTLS_SSL_CID_ENABLED )
|
||||
{
|
||||
mbedtls_printf( "Use of Connection ID was not offered by the client.\n" );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
size_t idx=0;
|
||||
mbedtls_printf( "Use of Connection ID has been negotiated.\n" );
|
||||
mbedtls_printf( "Peer CID (length %u Bytes): ",
|
||||
(unsigned) peer_cid_len );
|
||||
while( idx < peer_cid_len )
|
||||
{
|
||||
mbedtls_printf( "%02x ", peer_cid[ idx ] );
|
||||
idx++;
|
||||
}
|
||||
mbedtls_printf( "\n" );
|
||||
}
|
||||
}
|
||||
#endif /* MBEDTLS_SSL_CID */
|
||||
#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
|
||||
|
||||
if( opt.exchanges == 0 )
|
||||
goto close_notify;
|
||||
@ -3553,6 +3634,12 @@ data_exchange:
|
||||
}
|
||||
#endif /* MBEDTLS_SSL_RENEGOTIATION */
|
||||
|
||||
#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
|
||||
ret = report_cid_usage( &ssl, "after renegotiation" );
|
||||
if( ret != 0 )
|
||||
goto exit;
|
||||
#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
|
||||
|
||||
/*
|
||||
* 7. Write the 200 Response
|
||||
*/
|
||||
|
@ -128,6 +128,9 @@ int main( void )
|
||||
" mtu=%%d default: 0 (unlimited)\n" \
|
||||
" drop packets larger than N bytes\n" \
|
||||
" bad_ad=0/1 default: 0 (don't add bad ApplicationData)\n" \
|
||||
" bad_cid=%%d default: 0 (don't corrupt Connection IDs)\n" \
|
||||
" duplicate 1:N packets containing a CID,\n" \
|
||||
" modifying CID in first instance of the packet.\n" \
|
||||
" protect_hvr=0/1 default: 0 (don't protect HelloVerifyRequest)\n" \
|
||||
" protect_len=%%d default: (don't protect packets of this size)\n" \
|
||||
"\n" \
|
||||
@ -160,6 +163,7 @@ static struct options
|
||||
int drop; /* drop 1 packet in N (none if 0) */
|
||||
int mtu; /* drop packets larger than this */
|
||||
int bad_ad; /* inject corrupted ApplicationData record */
|
||||
unsigned bad_cid; /* inject corrupted CID record */
|
||||
int protect_hvr; /* never drop or delay HelloVerifyRequest */
|
||||
int protect_len; /* never drop/delay packet of the given size*/
|
||||
unsigned pack; /* merge packets into single datagram for
|
||||
@ -292,6 +296,12 @@ static void get_options( int argc, char *argv[] )
|
||||
if( opt.bad_ad < 0 || opt.bad_ad > 1 )
|
||||
exit_usage( p, q );
|
||||
}
|
||||
#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
|
||||
else if( strcmp( p, "bad_cid" ) == 0 )
|
||||
{
|
||||
opt.bad_cid = (unsigned) atoi( q );
|
||||
}
|
||||
#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
|
||||
else if( strcmp( p, "protect_hvr" ) == 0 )
|
||||
{
|
||||
opt.protect_hvr = atoi( q );
|
||||
@ -323,6 +333,7 @@ static const char *msg_type( unsigned char *msg, size_t len )
|
||||
case MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC: return( "ChangeCipherSpec" );
|
||||
case MBEDTLS_SSL_MSG_ALERT: return( "Alert" );
|
||||
case MBEDTLS_SSL_MSG_APPLICATION_DATA: return( "ApplicationData" );
|
||||
case MBEDTLS_SSL_MSG_CID: return( "CID" );
|
||||
case MBEDTLS_SSL_MSG_HANDSHAKE: break; /* See below */
|
||||
default: return( "Unknown" );
|
||||
}
|
||||
@ -436,7 +447,10 @@ static int ctx_buffer_append( ctx_buffer *buf,
|
||||
if( sizeof( buf->data ) - buf->len < len )
|
||||
{
|
||||
if( ( ret = ctx_buffer_flush( buf ) ) <= 0 )
|
||||
{
|
||||
mbedtls_printf( "ctx_buffer_flush failed with -%#04x", -ret );
|
||||
return( ret );
|
||||
}
|
||||
}
|
||||
|
||||
memcpy( buf->data + buf->len, data, len );
|
||||
@ -453,6 +467,7 @@ static int dispatch_data( mbedtls_net_context *ctx,
|
||||
const unsigned char * data,
|
||||
size_t len )
|
||||
{
|
||||
int ret;
|
||||
#if defined(MBEDTLS_TIMING_C)
|
||||
ctx_buffer *buf = NULL;
|
||||
if( opt.pack > 0 )
|
||||
@ -469,7 +484,12 @@ static int dispatch_data( mbedtls_net_context *ctx,
|
||||
}
|
||||
#endif /* MBEDTLS_TIMING_C */
|
||||
|
||||
return( mbedtls_net_send( ctx, data, len ) );
|
||||
ret = mbedtls_net_send( ctx, data, len );
|
||||
if( ret < 0 )
|
||||
{
|
||||
mbedtls_printf( "net_send returned -%#04x\n", -ret );
|
||||
}
|
||||
return( ret );
|
||||
}
|
||||
|
||||
typedef struct
|
||||
@ -508,6 +528,25 @@ int send_packet( const packet *p, const char *why )
|
||||
int ret;
|
||||
mbedtls_net_context *dst = p->dst;
|
||||
|
||||
/* insert corrupted CID record? */
|
||||
if( opt.bad_cid != 0 &&
|
||||
strcmp( p->type, "CID" ) == 0 &&
|
||||
( rand() % opt.bad_cid ) == 0 )
|
||||
{
|
||||
unsigned char buf[MAX_MSG_SIZE];
|
||||
memcpy( buf, p->buf, p->len );
|
||||
|
||||
/* The CID resides at offset 11 in the DTLS record header. */
|
||||
buf[11] ^= 1;
|
||||
print_packet( p, "modified CID" );
|
||||
|
||||
if( ( ret = dispatch_data( dst, buf, p->len ) ) <= 0 )
|
||||
{
|
||||
mbedtls_printf( " ! dispatch returned %d\n", ret );
|
||||
return( ret );
|
||||
}
|
||||
}
|
||||
|
||||
/* insert corrupted ApplicationData record? */
|
||||
if( opt.bad_ad &&
|
||||
strcmp( p->type, "ApplicationData" ) == 0 )
|
||||
@ -688,6 +727,7 @@ int handle_message( const char *way,
|
||||
if( ( opt.mtu != 0 &&
|
||||
cur.len > (unsigned) opt.mtu ) ||
|
||||
( opt.drop != 0 &&
|
||||
strcmp( cur.type, "CID" ) != 0 &&
|
||||
strcmp( cur.type, "ApplicationData" ) != 0 &&
|
||||
! ( opt.protect_hvr &&
|
||||
strcmp( cur.type, "HelloVerifyRequest" ) == 0 ) &&
|
||||
@ -700,6 +740,7 @@ int handle_message( const char *way,
|
||||
else if( ( opt.delay_ccs == 1 &&
|
||||
strcmp( cur.type, "ChangeCipherSpec" ) == 0 ) ||
|
||||
( opt.delay != 0 &&
|
||||
strcmp( cur.type, "CID" ) != 0 &&
|
||||
strcmp( cur.type, "ApplicationData" ) != 0 &&
|
||||
! ( opt.protect_hvr &&
|
||||
strcmp( cur.type, "HelloVerifyRequest" ) == 0 ) &&
|
||||
|
459
tests/ssl-opt.sh
459
tests/ssl-opt.sh
@ -1276,8 +1276,8 @@ run_test "Truncated HMAC, DTLS: client enabled, server enabled" \
|
||||
# grep for output witnessing its use. This needs to be
|
||||
# changed once the CID extension is implemented.
|
||||
|
||||
requires_config_enabled MBEDTLS_SSL_CID
|
||||
run_test "(STUB) Connection ID: Client enabled, server disabled" \
|
||||
requires_config_enabled MBEDTLS_SSL_DTLS_CONNECTION_ID
|
||||
run_test "Connection ID: Cli enabled, Srv disabled" \
|
||||
"$P_SRV debug_level=3 dtls=1 cid=0" \
|
||||
"$P_CLI debug_level=3 dtls=1 cid=1 cid_val=deadbeef" \
|
||||
0 \
|
||||
@ -1292,8 +1292,8 @@ run_test "(STUB) Connection ID: Client enabled, server disabled" \
|
||||
-C "Copy CIDs into SSL transform" \
|
||||
-c "Use of Connection ID was rejected by the server"
|
||||
|
||||
requires_config_enabled MBEDTLS_SSL_CID
|
||||
run_test "(STUB) Connection ID: Client disabled, server enabled" \
|
||||
requires_config_enabled MBEDTLS_SSL_DTLS_CONNECTION_ID
|
||||
run_test "Connection ID: Cli disabled, Srv enabled" \
|
||||
"$P_SRV debug_level=3 dtls=1 cid=1 cid_val=deadbeef" \
|
||||
"$P_CLI debug_level=3 dtls=1 cid=0" \
|
||||
0 \
|
||||
@ -1305,10 +1305,10 @@ run_test "(STUB) Connection ID: Client disabled, server enabled" \
|
||||
-C "found CID extension" \
|
||||
-S "Copy CIDs into SSL transform" \
|
||||
-C "Copy CIDs into SSL transform" \
|
||||
-s "Use of Connection ID was not offered by the client"
|
||||
-s "Use of Connection ID was not offered by client"
|
||||
|
||||
requires_config_enabled MBEDTLS_SSL_CID
|
||||
run_test "(STUB) Connection ID: Client+Server enabled, Client+Server CID nonempty" \
|
||||
requires_config_enabled MBEDTLS_SSL_DTLS_CONNECTION_ID
|
||||
run_test "Connection ID: Cli+Srv enabled, Cli+Srv CID nonempty" \
|
||||
"$P_SRV debug_level=3 dtls=1 cid=1 cid_val=dead" \
|
||||
"$P_CLI debug_level=3 dtls=1 cid=1 cid_val=beef" \
|
||||
0 \
|
||||
@ -1321,15 +1321,81 @@ run_test "(STUB) Connection ID: Client+Server enabled, Client+Server CID none
|
||||
-c "found CID extension" \
|
||||
-c "Use of CID extension negotiated" \
|
||||
-s "Copy CIDs into SSL transform" \
|
||||
-c "Copy CIDs into SSL transform"
|
||||
# Uncomment once CID is fully implemented
|
||||
# -c "Peer CID (length 2 Bytes): de ad" \
|
||||
# -s "Peer CID (length 2 Bytes): be ef"
|
||||
# -s "Use of Connection ID has been negotiated" \
|
||||
# -c "Use of Connection ID has been negotiated" \
|
||||
-c "Copy CIDs into SSL transform" \
|
||||
-c "Peer CID (length 2 Bytes): de ad" \
|
||||
-s "Peer CID (length 2 Bytes): be ef" \
|
||||
-s "Use of Connection ID has been negotiated" \
|
||||
-c "Use of Connection ID has been negotiated"
|
||||
|
||||
requires_config_enabled MBEDTLS_SSL_CID
|
||||
run_test "(STUB) Connection ID: Client+Server enabled, Client CID empty" \
|
||||
requires_config_enabled MBEDTLS_SSL_DTLS_CONNECTION_ID
|
||||
run_test "Connection ID, 3D: Cli+Srv enabled, Cli+Srv CID nonempty" \
|
||||
-p "$P_PXY drop=5 delay=5 duplicate=5 bad_cid=1" \
|
||||
"$P_SRV debug_level=3 dtls=1 cid=1 dgram_packing=0 cid_val=dead" \
|
||||
"$P_CLI debug_level=3 dtls=1 cid=1 dgram_packing=0 cid_val=beef" \
|
||||
0 \
|
||||
-c "Enable use of CID extension." \
|
||||
-s "Enable use of CID extension." \
|
||||
-c "client hello, adding CID extension" \
|
||||
-s "found CID extension" \
|
||||
-s "Use of CID extension negotiated" \
|
||||
-s "server hello, adding CID extension" \
|
||||
-c "found CID extension" \
|
||||
-c "Use of CID extension negotiated" \
|
||||
-s "Copy CIDs into SSL transform" \
|
||||
-c "Copy CIDs into SSL transform" \
|
||||
-c "Peer CID (length 2 Bytes): de ad" \
|
||||
-s "Peer CID (length 2 Bytes): be ef" \
|
||||
-s "Use of Connection ID has been negotiated" \
|
||||
-c "Use of Connection ID has been negotiated" \
|
||||
-c "ignoring unexpected CID" \
|
||||
-s "ignoring unexpected CID"
|
||||
|
||||
requires_config_enabled MBEDTLS_SSL_DTLS_CONNECTION_ID
|
||||
run_test "Connection ID, MTU: Cli+Srv enabled, Cli+Srv CID nonempty" \
|
||||
-p "$P_PXY mtu=800" \
|
||||
"$P_SRV debug_level=3 mtu=800 dtls=1 cid=1 cid_val=dead" \
|
||||
"$P_CLI debug_level=3 mtu=800 dtls=1 cid=1 cid_val=beef" \
|
||||
0 \
|
||||
-c "Enable use of CID extension." \
|
||||
-s "Enable use of CID extension." \
|
||||
-c "client hello, adding CID extension" \
|
||||
-s "found CID extension" \
|
||||
-s "Use of CID extension negotiated" \
|
||||
-s "server hello, adding CID extension" \
|
||||
-c "found CID extension" \
|
||||
-c "Use of CID extension negotiated" \
|
||||
-s "Copy CIDs into SSL transform" \
|
||||
-c "Copy CIDs into SSL transform" \
|
||||
-c "Peer CID (length 2 Bytes): de ad" \
|
||||
-s "Peer CID (length 2 Bytes): be ef" \
|
||||
-s "Use of Connection ID has been negotiated" \
|
||||
-c "Use of Connection ID has been negotiated"
|
||||
|
||||
requires_config_enabled MBEDTLS_SSL_DTLS_CONNECTION_ID
|
||||
run_test "Connection ID, 3D+MTU: Cli+Srv enabled, Cli+Srv CID nonempty" \
|
||||
-p "$P_PXY mtu=800 drop=5 delay=5 duplicate=5 bad_cid=1" \
|
||||
"$P_SRV debug_level=3 mtu=800 dtls=1 cid=1 cid_val=dead" \
|
||||
"$P_CLI debug_level=3 mtu=800 dtls=1 cid=1 cid_val=beef" \
|
||||
0 \
|
||||
-c "Enable use of CID extension." \
|
||||
-s "Enable use of CID extension." \
|
||||
-c "client hello, adding CID extension" \
|
||||
-s "found CID extension" \
|
||||
-s "Use of CID extension negotiated" \
|
||||
-s "server hello, adding CID extension" \
|
||||
-c "found CID extension" \
|
||||
-c "Use of CID extension negotiated" \
|
||||
-s "Copy CIDs into SSL transform" \
|
||||
-c "Copy CIDs into SSL transform" \
|
||||
-c "Peer CID (length 2 Bytes): de ad" \
|
||||
-s "Peer CID (length 2 Bytes): be ef" \
|
||||
-s "Use of Connection ID has been negotiated" \
|
||||
-c "Use of Connection ID has been negotiated" \
|
||||
-c "ignoring unexpected CID" \
|
||||
-s "ignoring unexpected CID"
|
||||
|
||||
requires_config_enabled MBEDTLS_SSL_DTLS_CONNECTION_ID
|
||||
run_test "Connection ID: Cli+Srv enabled, Cli CID empty" \
|
||||
"$P_SRV debug_level=3 dtls=1 cid=1 cid_val=deadbeef" \
|
||||
"$P_CLI debug_level=3 dtls=1 cid=1" \
|
||||
0 \
|
||||
@ -1342,15 +1408,14 @@ run_test "(STUB) Connection ID: Client+Server enabled, Client CID empty" \
|
||||
-c "found CID extension" \
|
||||
-c "Use of CID extension negotiated" \
|
||||
-s "Copy CIDs into SSL transform" \
|
||||
-c "Copy CIDs into SSL transform"
|
||||
# Uncomment once CID is fully implemented
|
||||
# -c "Peer CID (length 4 Bytes): de ad be ef" \
|
||||
# -s "Peer CID (length 0 Bytes):" \
|
||||
# -s "Use of Connection ID has been negotiated" \
|
||||
# -c "Use of Connection ID has been negotiated" \
|
||||
-c "Copy CIDs into SSL transform" \
|
||||
-c "Peer CID (length 4 Bytes): de ad be ef" \
|
||||
-s "Peer CID (length 0 Bytes):" \
|
||||
-s "Use of Connection ID has been negotiated" \
|
||||
-c "Use of Connection ID has been negotiated"
|
||||
|
||||
requires_config_enabled MBEDTLS_SSL_CID
|
||||
run_test "(STUB) Connection ID: Client+Server enabled, Server CID empty" \
|
||||
requires_config_enabled MBEDTLS_SSL_DTLS_CONNECTION_ID
|
||||
run_test "Connection ID: Cli+Srv enabled, Srv CID empty" \
|
||||
"$P_SRV debug_level=3 dtls=1 cid=1" \
|
||||
"$P_CLI debug_level=3 dtls=1 cid=1 cid_val=deadbeef" \
|
||||
0 \
|
||||
@ -1363,15 +1428,14 @@ run_test "(STUB) Connection ID: Client+Server enabled, Server CID empty" \
|
||||
-c "found CID extension" \
|
||||
-c "Use of CID extension negotiated" \
|
||||
-s "Copy CIDs into SSL transform" \
|
||||
-c "Copy CIDs into SSL transform"
|
||||
# Uncomment once CID is fully implemented
|
||||
# -s "Peer CID (length 4 Bytes): de ad be ef" \
|
||||
# -c "Peer CID (length 0 Bytes):"
|
||||
# -s "Use of Connection ID has been negotiated" \
|
||||
# -c "Use of Connection ID has been negotiated" \
|
||||
-c "Copy CIDs into SSL transform" \
|
||||
-s "Peer CID (length 4 Bytes): de ad be ef" \
|
||||
-c "Peer CID (length 0 Bytes):" \
|
||||
-s "Use of Connection ID has been negotiated" \
|
||||
-c "Use of Connection ID has been negotiated"
|
||||
|
||||
requires_config_enabled MBEDTLS_SSL_CID
|
||||
run_test "(STUB) Connection ID: Client+Server enabled, Client+Server CID empty" \
|
||||
requires_config_enabled MBEDTLS_SSL_DTLS_CONNECTION_ID
|
||||
run_test "Connection ID: Cli+Srv enabled, Cli+Srv CID empty" \
|
||||
"$P_SRV debug_level=3 dtls=1 cid=1" \
|
||||
"$P_CLI debug_level=3 dtls=1 cid=1" \
|
||||
0 \
|
||||
@ -1388,8 +1452,8 @@ run_test "(STUB) Connection ID: Client+Server enabled, Client+Server CID empt
|
||||
-S "Use of Connection ID has been negotiated" \
|
||||
-C "Use of Connection ID has been negotiated"
|
||||
|
||||
requires_config_enabled MBEDTLS_SSL_CID
|
||||
run_test "(STUB) Connection ID: Client+Server enabled, Client+Server CID nonempty, AES-128-CCM-8" \
|
||||
requires_config_enabled MBEDTLS_SSL_DTLS_CONNECTION_ID
|
||||
run_test "Connection ID: Cli+Srv enabled, Cli+Srv CID nonempty, AES-128-CCM-8" \
|
||||
"$P_SRV debug_level=3 dtls=1 cid=1 cid_val=dead" \
|
||||
"$P_CLI debug_level=3 dtls=1 cid=1 cid_val=beef force_ciphersuite=TLS-ECDHE-ECDSA-WITH-AES-128-CCM-8" \
|
||||
0 \
|
||||
@ -1402,15 +1466,14 @@ run_test "(STUB) Connection ID: Client+Server enabled, Client+Server CID none
|
||||
-c "found CID extension" \
|
||||
-c "Use of CID extension negotiated" \
|
||||
-s "Copy CIDs into SSL transform" \
|
||||
-c "Copy CIDs into SSL transform"
|
||||
# Uncomment once CID is fully implemented
|
||||
# -c "Peer CID (length 2 Bytes): de ad" \
|
||||
# -s "Peer CID (length 2 Bytes): be ef" \
|
||||
# -s "Use of Connection ID has been negotiated" \
|
||||
# -c "Use of Connection ID has been negotiated" \
|
||||
-c "Copy CIDs into SSL transform" \
|
||||
-c "Peer CID (length 2 Bytes): de ad" \
|
||||
-s "Peer CID (length 2 Bytes): be ef" \
|
||||
-s "Use of Connection ID has been negotiated" \
|
||||
-c "Use of Connection ID has been negotiated"
|
||||
|
||||
requires_config_enabled MBEDTLS_SSL_CID
|
||||
run_test "(STUB) Connection ID: Client+Server enabled, Client CID empty, AES-128-CCM-8" \
|
||||
requires_config_enabled MBEDTLS_SSL_DTLS_CONNECTION_ID
|
||||
run_test "Connection ID: Cli+Srv enabled, Cli CID empty, AES-128-CCM-8" \
|
||||
"$P_SRV debug_level=3 dtls=1 cid=1 cid_val=deadbeef" \
|
||||
"$P_CLI debug_level=3 dtls=1 cid=1 force_ciphersuite=TLS-ECDHE-ECDSA-WITH-AES-128-CCM-8" \
|
||||
0 \
|
||||
@ -1423,15 +1486,14 @@ run_test "(STUB) Connection ID: Client+Server enabled, Client CID empty, AES-
|
||||
-c "found CID extension" \
|
||||
-c "Use of CID extension negotiated" \
|
||||
-s "Copy CIDs into SSL transform" \
|
||||
-c "Copy CIDs into SSL transform"
|
||||
# Uncomment once CID is fully implemented
|
||||
# -c "Peer CID (length 4 Bytes): de ad be ef" \
|
||||
# -s "Peer CID (length 0 Bytes):" \
|
||||
# -s "Use of Connection ID has been negotiated" \
|
||||
# -c "Use of Connection ID has been negotiated" \
|
||||
-c "Copy CIDs into SSL transform" \
|
||||
-c "Peer CID (length 4 Bytes): de ad be ef" \
|
||||
-s "Peer CID (length 0 Bytes):" \
|
||||
-s "Use of Connection ID has been negotiated" \
|
||||
-c "Use of Connection ID has been negotiated"
|
||||
|
||||
requires_config_enabled MBEDTLS_SSL_CID
|
||||
run_test "(STUB) Connection ID: Client+Server enabled, Server CID empty, AES-128-CCM-8" \
|
||||
requires_config_enabled MBEDTLS_SSL_DTLS_CONNECTION_ID
|
||||
run_test "Connection ID: Cli+Srv enabled, Srv CID empty, AES-128-CCM-8" \
|
||||
"$P_SRV debug_level=3 dtls=1 cid=1" \
|
||||
"$P_CLI debug_level=3 dtls=1 cid=1 cid_val=deadbeef force_ciphersuite=TLS-ECDHE-ECDSA-WITH-AES-128-CCM-8" \
|
||||
0 \
|
||||
@ -1444,15 +1506,14 @@ run_test "(STUB) Connection ID: Client+Server enabled, Server CID empty, AES-
|
||||
-c "found CID extension" \
|
||||
-c "Use of CID extension negotiated" \
|
||||
-s "Copy CIDs into SSL transform" \
|
||||
-c "Copy CIDs into SSL transform"
|
||||
# Uncomment once CID is fully implemented
|
||||
# -s "Peer CID (length 4 Bytes): de ad be ef" \
|
||||
# -c "Peer CID (length 0 Bytes):" \
|
||||
# -s "Use of Connection ID has been negotiated" \
|
||||
# -c "Use of Connection ID has been negotiated" \
|
||||
-c "Copy CIDs into SSL transform" \
|
||||
-s "Peer CID (length 4 Bytes): de ad be ef" \
|
||||
-c "Peer CID (length 0 Bytes):" \
|
||||
-s "Use of Connection ID has been negotiated" \
|
||||
-c "Use of Connection ID has been negotiated"
|
||||
|
||||
requires_config_enabled MBEDTLS_SSL_CID
|
||||
run_test "(STUB) Connection ID: Client+Server enabled, Client+Server CID empty, AES-128-CCM-8" \
|
||||
requires_config_enabled MBEDTLS_SSL_DTLS_CONNECTION_ID
|
||||
run_test "Connection ID: Cli+Srv enabled, Cli+Srv CID empty, AES-128-CCM-8" \
|
||||
"$P_SRV debug_level=3 dtls=1 cid=1" \
|
||||
"$P_CLI debug_level=3 dtls=1 cid=1 force_ciphersuite=TLS-ECDHE-ECDSA-WITH-AES-128-CCM-8" \
|
||||
0 \
|
||||
@ -1469,8 +1530,8 @@ run_test "(STUB) Connection ID: Client+Server enabled, Client+Server CID empt
|
||||
-S "Use of Connection ID has been negotiated" \
|
||||
-C "Use of Connection ID has been negotiated"
|
||||
|
||||
requires_config_enabled MBEDTLS_SSL_CID
|
||||
run_test "(STUB) Connection ID: Client+Server enabled, Client+Server CID nonempty, AES-128-CBC" \
|
||||
requires_config_enabled MBEDTLS_SSL_DTLS_CONNECTION_ID
|
||||
run_test "Connection ID: Cli+Srv enabled, Cli+Srv CID nonempty, AES-128-CBC" \
|
||||
"$P_SRV debug_level=3 dtls=1 cid=1 cid_val=dead" \
|
||||
"$P_CLI debug_level=3 dtls=1 cid=1 cid_val=beef force_ciphersuite=TLS-ECDHE-ECDSA-WITH-AES-128-CBC-SHA256" \
|
||||
0 \
|
||||
@ -1483,15 +1544,14 @@ run_test "(STUB) Connection ID: Client+Server enabled, Client+Server CID none
|
||||
-c "found CID extension" \
|
||||
-c "Use of CID extension negotiated" \
|
||||
-s "Copy CIDs into SSL transform" \
|
||||
-c "Copy CIDs into SSL transform"
|
||||
# Uncomment once CID is fully implemented
|
||||
# -c "Peer CID (length 2 Bytes): de ad" \
|
||||
# -s "Peer CID (length 2 Bytes): be ef" \
|
||||
# -s "Use of Connection ID has been negotiated" \
|
||||
# -c "Use of Connection ID has been negotiated" \
|
||||
-c "Copy CIDs into SSL transform" \
|
||||
-c "Peer CID (length 2 Bytes): de ad" \
|
||||
-s "Peer CID (length 2 Bytes): be ef" \
|
||||
-s "Use of Connection ID has been negotiated" \
|
||||
-c "Use of Connection ID has been negotiated"
|
||||
|
||||
requires_config_enabled MBEDTLS_SSL_CID
|
||||
run_test "(STUB) Connection ID: Client+Server enabled, Client CID empty, AES-128-CBC" \
|
||||
requires_config_enabled MBEDTLS_SSL_DTLS_CONNECTION_ID
|
||||
run_test "Connection ID: Cli+Srv enabled, Cli CID empty, AES-128-CBC" \
|
||||
"$P_SRV debug_level=3 dtls=1 cid=1 cid_val=deadbeef" \
|
||||
"$P_CLI debug_level=3 dtls=1 cid=1 force_ciphersuite=TLS-ECDHE-ECDSA-WITH-AES-128-CBC-SHA256" \
|
||||
0 \
|
||||
@ -1504,15 +1564,14 @@ run_test "(STUB) Connection ID: Client+Server enabled, Client CID empty, AES-
|
||||
-c "found CID extension" \
|
||||
-c "Use of CID extension negotiated" \
|
||||
-s "Copy CIDs into SSL transform" \
|
||||
-c "Copy CIDs into SSL transform"
|
||||
# Uncomment once CID is fully implemented
|
||||
# -c "Peer CID (length 4 Bytes): de ad be ef" \
|
||||
# -s "Peer CID (length 0 Bytes):" \
|
||||
# -s "Use of Connection ID has been negotiated" \
|
||||
# -c "Use of Connection ID has been negotiated" \
|
||||
-c "Copy CIDs into SSL transform" \
|
||||
-c "Peer CID (length 4 Bytes): de ad be ef" \
|
||||
-s "Peer CID (length 0 Bytes):" \
|
||||
-s "Use of Connection ID has been negotiated" \
|
||||
-c "Use of Connection ID has been negotiated"
|
||||
|
||||
requires_config_enabled MBEDTLS_SSL_CID
|
||||
run_test "(STUB) Connection ID: Client+Server enabled, Server CID empty, AES-128-CBC" \
|
||||
requires_config_enabled MBEDTLS_SSL_DTLS_CONNECTION_ID
|
||||
run_test "Connection ID: Cli+Srv enabled, Srv CID empty, AES-128-CBC" \
|
||||
"$P_SRV debug_level=3 dtls=1 cid=1" \
|
||||
"$P_CLI debug_level=3 dtls=1 cid=1 cid_val=deadbeef force_ciphersuite=TLS-ECDHE-ECDSA-WITH-AES-128-CBC-SHA256" \
|
||||
0 \
|
||||
@ -1525,15 +1584,14 @@ run_test "(STUB) Connection ID: Client+Server enabled, Server CID empty, AES-
|
||||
-c "found CID extension" \
|
||||
-c "Use of CID extension negotiated" \
|
||||
-s "Copy CIDs into SSL transform" \
|
||||
-c "Copy CIDs into SSL transform"
|
||||
# Uncomment once CID is fully implemented
|
||||
# -s "Peer CID (length 4 Bytes): de ad be ef" \
|
||||
# -c "Peer CID (length 0 Bytes):" \
|
||||
# -s "Use of Connection ID has been negotiated" \
|
||||
# -c "Use of Connection ID has been negotiated" \
|
||||
-c "Copy CIDs into SSL transform" \
|
||||
-s "Peer CID (length 4 Bytes): de ad be ef" \
|
||||
-c "Peer CID (length 0 Bytes):" \
|
||||
-s "Use of Connection ID has been negotiated" \
|
||||
-c "Use of Connection ID has been negotiated"
|
||||
|
||||
requires_config_enabled MBEDTLS_SSL_CID
|
||||
run_test "(STUB) Connection ID: Client+Server enabled, Client+Server CID empty, AES-128-CBC" \
|
||||
requires_config_enabled MBEDTLS_SSL_DTLS_CONNECTION_ID
|
||||
run_test "Connection ID: Cli+Srv enabled, Cli+Srv CID empty, AES-128-CBC" \
|
||||
"$P_SRV debug_level=3 dtls=1 cid=1" \
|
||||
"$P_CLI debug_level=3 dtls=1 cid=1 force_ciphersuite=TLS-ECDHE-ECDSA-WITH-AES-128-CBC-SHA256" \
|
||||
0 \
|
||||
@ -1550,27 +1608,228 @@ run_test "(STUB) Connection ID: Client+Server enabled, Client+Server CID empt
|
||||
-S "Use of Connection ID has been negotiated" \
|
||||
-C "Use of Connection ID has been negotiated"
|
||||
|
||||
requires_config_enabled MBEDTLS_SSL_CID
|
||||
requires_config_enabled MBEDTLS_SSL_DTLS_CONNECTION_ID
|
||||
requires_config_enabled MBEDTLS_SSL_RENEGOTIATION
|
||||
run_test "(STUB) Connection ID: Client+Server enabled, renegotiate" \
|
||||
run_test "Connection ID: Cli+Srv enabled, renegotiate without change of CID" \
|
||||
"$P_SRV debug_level=3 dtls=1 cid=1 cid_val=dead renegotiation=1" \
|
||||
"$P_CLI debug_level=3 dtls=1 cid=1 cid_val=beef renegotiation=1 renegotiate=1" \
|
||||
0 \
|
||||
-c "Enable use of CID extension." \
|
||||
-s "Enable use of CID extension." \
|
||||
-c "client hello, adding CID extension" \
|
||||
-s "found CID extension" \
|
||||
-s "Use of CID extension negotiated" \
|
||||
-s "server hello, adding CID extension" \
|
||||
-c "found CID extension" \
|
||||
-c "Use of CID extension negotiated" \
|
||||
-s "Copy CIDs into SSL transform" \
|
||||
-c "Copy CIDs into SSL transform"
|
||||
# Uncomment once CID is fully implemented
|
||||
# -c "Peer CID (length 2 Bytes): de ad" \
|
||||
# -s "Peer CID (length 2 Bytes): be ef"
|
||||
# -s "Use of Connection ID has been negotiated" \
|
||||
# -c "Use of Connection ID has been negotiated" \
|
||||
-c "(initial handshake) Peer CID (length 2 Bytes): de ad" \
|
||||
-s "(initial handshake) Peer CID (length 2 Bytes): be ef" \
|
||||
-s "(initial handshake) Use of Connection ID has been negotiated" \
|
||||
-c "(initial handshake) Use of Connection ID has been negotiated" \
|
||||
-c "(after renegotiation) Peer CID (length 2 Bytes): de ad" \
|
||||
-s "(after renegotiation) Peer CID (length 2 Bytes): be ef" \
|
||||
-s "(after renegotiation) Use of Connection ID has been negotiated" \
|
||||
-c "(after renegotiation) Use of Connection ID has been negotiated"
|
||||
|
||||
requires_config_enabled MBEDTLS_SSL_DTLS_CONNECTION_ID
|
||||
requires_config_enabled MBEDTLS_SSL_RENEGOTIATION
|
||||
run_test "Connection ID: Cli+Srv enabled, renegotiate with different CID" \
|
||||
"$P_SRV debug_level=3 dtls=1 cid=1 cid_val=dead cid_val_renego=beef renegotiation=1" \
|
||||
"$P_CLI debug_level=3 dtls=1 cid=1 cid_val=beef cid_val_renego=dead renegotiation=1 renegotiate=1" \
|
||||
0 \
|
||||
-c "(initial handshake) Peer CID (length 2 Bytes): de ad" \
|
||||
-s "(initial handshake) Peer CID (length 2 Bytes): be ef" \
|
||||
-s "(initial handshake) Use of Connection ID has been negotiated" \
|
||||
-c "(initial handshake) Use of Connection ID has been negotiated" \
|
||||
-c "(after renegotiation) Peer CID (length 2 Bytes): be ef" \
|
||||
-s "(after renegotiation) Peer CID (length 2 Bytes): de ad" \
|
||||
-s "(after renegotiation) Use of Connection ID has been negotiated" \
|
||||
-c "(after renegotiation) Use of Connection ID has been negotiated"
|
||||
|
||||
requires_config_enabled MBEDTLS_SSL_DTLS_CONNECTION_ID
|
||||
requires_config_enabled MBEDTLS_SSL_RENEGOTIATION
|
||||
run_test "Connection ID, no packing: Cli+Srv enabled, renegotiate with different CID" \
|
||||
"$P_SRV debug_level=3 dtls=1 cid=1 dgram_packing=0 cid_val=dead cid_val_renego=beef renegotiation=1" \
|
||||
"$P_CLI debug_level=3 dtls=1 cid=1 dgram_packing=0 cid_val=beef cid_val_renego=dead renegotiation=1 renegotiate=1" \
|
||||
0 \
|
||||
-c "(initial handshake) Peer CID (length 2 Bytes): de ad" \
|
||||
-s "(initial handshake) Peer CID (length 2 Bytes): be ef" \
|
||||
-s "(initial handshake) Use of Connection ID has been negotiated" \
|
||||
-c "(initial handshake) Use of Connection ID has been negotiated" \
|
||||
-c "(after renegotiation) Peer CID (length 2 Bytes): be ef" \
|
||||
-s "(after renegotiation) Peer CID (length 2 Bytes): de ad" \
|
||||
-s "(after renegotiation) Use of Connection ID has been negotiated" \
|
||||
-c "(after renegotiation) Use of Connection ID has been negotiated"
|
||||
|
||||
requires_config_enabled MBEDTLS_SSL_DTLS_CONNECTION_ID
|
||||
requires_config_enabled MBEDTLS_SSL_RENEGOTIATION
|
||||
run_test "Connection ID, 3D+MTU: Cli+Srv enabled, renegotiate with different CID" \
|
||||
-p "$P_PXY mtu=800 drop=5 delay=5 duplicate=5 bad_cid=1" \
|
||||
"$P_SRV debug_level=3 mtu=800 dtls=1 cid=1 cid_val=dead cid_val_renego=beef renegotiation=1" \
|
||||
"$P_CLI debug_level=3 mtu=800 dtls=1 cid=1 cid_val=beef cid_val_renego=dead renegotiation=1 renegotiate=1" \
|
||||
0 \
|
||||
-c "(initial handshake) Peer CID (length 2 Bytes): de ad" \
|
||||
-s "(initial handshake) Peer CID (length 2 Bytes): be ef" \
|
||||
-s "(initial handshake) Use of Connection ID has been negotiated" \
|
||||
-c "(initial handshake) Use of Connection ID has been negotiated" \
|
||||
-c "(after renegotiation) Peer CID (length 2 Bytes): be ef" \
|
||||
-s "(after renegotiation) Peer CID (length 2 Bytes): de ad" \
|
||||
-s "(after renegotiation) Use of Connection ID has been negotiated" \
|
||||
-c "(after renegotiation) Use of Connection ID has been negotiated" \
|
||||
-c "ignoring unexpected CID" \
|
||||
-s "ignoring unexpected CID"
|
||||
|
||||
requires_config_enabled MBEDTLS_SSL_DTLS_CONNECTION_ID
|
||||
requires_config_enabled MBEDTLS_SSL_RENEGOTIATION
|
||||
run_test "Connection ID: Cli+Srv enabled, renegotiate without CID" \
|
||||
"$P_SRV debug_level=3 dtls=1 cid=1 cid_val=dead cid_renego=0 renegotiation=1" \
|
||||
"$P_CLI debug_level=3 dtls=1 cid=1 cid_val=beef cid_renego=0 renegotiation=1 renegotiate=1" \
|
||||
0 \
|
||||
-c "(initial handshake) Peer CID (length 2 Bytes): de ad" \
|
||||
-s "(initial handshake) Peer CID (length 2 Bytes): be ef" \
|
||||
-s "(initial handshake) Use of Connection ID has been negotiated" \
|
||||
-c "(initial handshake) Use of Connection ID has been negotiated" \
|
||||
-C "(after renegotiation) Peer CID (length 2 Bytes): de ad" \
|
||||
-S "(after renegotiation) Peer CID (length 2 Bytes): be ef" \
|
||||
-C "(after renegotiation) Use of Connection ID has been negotiated" \
|
||||
-S "(after renegotiation) Use of Connection ID has been negotiated"
|
||||
|
||||
requires_config_enabled MBEDTLS_SSL_DTLS_CONNECTION_ID
|
||||
requires_config_enabled MBEDTLS_SSL_RENEGOTIATION
|
||||
run_test "Connection ID, no packing: Cli+Srv enabled, renegotiate without CID" \
|
||||
"$P_SRV debug_level=3 dtls=1 dgram_packing=0 cid=1 cid_val=dead cid_renego=0 renegotiation=1" \
|
||||
"$P_CLI debug_level=3 dtls=1 dgram_packing=0 cid=1 cid_val=beef cid_renego=0 renegotiation=1 renegotiate=1" \
|
||||
0 \
|
||||
-c "(initial handshake) Peer CID (length 2 Bytes): de ad" \
|
||||
-s "(initial handshake) Peer CID (length 2 Bytes): be ef" \
|
||||
-s "(initial handshake) Use of Connection ID has been negotiated" \
|
||||
-c "(initial handshake) Use of Connection ID has been negotiated" \
|
||||
-C "(after renegotiation) Peer CID (length 2 Bytes): de ad" \
|
||||
-S "(after renegotiation) Peer CID (length 2 Bytes): be ef" \
|
||||
-C "(after renegotiation) Use of Connection ID has been negotiated" \
|
||||
-S "(after renegotiation) Use of Connection ID has been negotiated"
|
||||
|
||||
requires_config_enabled MBEDTLS_SSL_DTLS_CONNECTION_ID
|
||||
requires_config_enabled MBEDTLS_SSL_RENEGOTIATION
|
||||
run_test "Connection ID, 3D+MTU: Cli+Srv enabled, renegotiate without CID" \
|
||||
-p "$P_PXY drop=5 delay=5 duplicate=5 bad_cid=1" \
|
||||
"$P_SRV debug_level=3 mtu=800 dtls=1 cid=1 cid_val=dead cid_renego=0 renegotiation=1" \
|
||||
"$P_CLI debug_level=3 mtu=800 dtls=1 cid=1 cid_val=beef cid_renego=0 renegotiation=1 renegotiate=1" \
|
||||
0 \
|
||||
-c "(initial handshake) Peer CID (length 2 Bytes): de ad" \
|
||||
-s "(initial handshake) Peer CID (length 2 Bytes): be ef" \
|
||||
-s "(initial handshake) Use of Connection ID has been negotiated" \
|
||||
-c "(initial handshake) Use of Connection ID has been negotiated" \
|
||||
-C "(after renegotiation) Peer CID (length 2 Bytes): de ad" \
|
||||
-S "(after renegotiation) Peer CID (length 2 Bytes): be ef" \
|
||||
-C "(after renegotiation) Use of Connection ID has been negotiated" \
|
||||
-S "(after renegotiation) Use of Connection ID has been negotiated" \
|
||||
-c "ignoring unexpected CID" \
|
||||
-s "ignoring unexpected CID"
|
||||
|
||||
requires_config_enabled MBEDTLS_SSL_DTLS_CONNECTION_ID
|
||||
requires_config_enabled MBEDTLS_SSL_RENEGOTIATION
|
||||
run_test "Connection ID: Cli+Srv enabled, CID on renegotiation" \
|
||||
"$P_SRV debug_level=3 dtls=1 cid=0 cid_renego=1 cid_val_renego=dead renegotiation=1" \
|
||||
"$P_CLI debug_level=3 dtls=1 cid=0 cid_renego=1 cid_val_renego=beef renegotiation=1 renegotiate=1" \
|
||||
0 \
|
||||
-S "(initial handshake) Use of Connection ID has been negotiated" \
|
||||
-C "(initial handshake) Use of Connection ID has been negotiated" \
|
||||
-c "(after renegotiation) Peer CID (length 2 Bytes): de ad" \
|
||||
-s "(after renegotiation) Peer CID (length 2 Bytes): be ef" \
|
||||
-c "(after renegotiation) Use of Connection ID has been negotiated" \
|
||||
-s "(after renegotiation) Use of Connection ID has been negotiated"
|
||||
|
||||
requires_config_enabled MBEDTLS_SSL_DTLS_CONNECTION_ID
|
||||
requires_config_enabled MBEDTLS_SSL_RENEGOTIATION
|
||||
run_test "Connection ID, no packing: Cli+Srv enabled, CID on renegotiation" \
|
||||
"$P_SRV debug_level=3 dtls=1 dgram_packing=0 cid=0 cid_renego=1 cid_val_renego=dead renegotiation=1" \
|
||||
"$P_CLI debug_level=3 dtls=1 dgram_packing=0 cid=0 cid_renego=1 cid_val_renego=beef renegotiation=1 renegotiate=1" \
|
||||
0 \
|
||||
-S "(initial handshake) Use of Connection ID has been negotiated" \
|
||||
-C "(initial handshake) Use of Connection ID has been negotiated" \
|
||||
-c "(after renegotiation) Peer CID (length 2 Bytes): de ad" \
|
||||
-s "(after renegotiation) Peer CID (length 2 Bytes): be ef" \
|
||||
-c "(after renegotiation) Use of Connection ID has been negotiated" \
|
||||
-s "(after renegotiation) Use of Connection ID has been negotiated"
|
||||
|
||||
requires_config_enabled MBEDTLS_SSL_DTLS_CONNECTION_ID
|
||||
requires_config_enabled MBEDTLS_SSL_RENEGOTIATION
|
||||
run_test "Connection ID, 3D+MTU: Cli+Srv enabled, CID on renegotiation" \
|
||||
-p "$P_PXY mtu=800 drop=5 delay=5 duplicate=5 bad_cid=1" \
|
||||
"$P_SRV debug_level=3 mtu=800 dtls=1 dgram_packing=1 cid=0 cid_renego=1 cid_val_renego=dead renegotiation=1" \
|
||||
"$P_CLI debug_level=3 mtu=800 dtls=1 dgram_packing=1 cid=0 cid_renego=1 cid_val_renego=beef renegotiation=1 renegotiate=1" \
|
||||
0 \
|
||||
-S "(initial handshake) Use of Connection ID has been negotiated" \
|
||||
-C "(initial handshake) Use of Connection ID has been negotiated" \
|
||||
-c "(after renegotiation) Peer CID (length 2 Bytes): de ad" \
|
||||
-s "(after renegotiation) Peer CID (length 2 Bytes): be ef" \
|
||||
-c "(after renegotiation) Use of Connection ID has been negotiated" \
|
||||
-s "(after renegotiation) Use of Connection ID has been negotiated" \
|
||||
-c "ignoring unexpected CID" \
|
||||
-s "ignoring unexpected CID"
|
||||
|
||||
requires_config_enabled MBEDTLS_SSL_DTLS_CONNECTION_ID
|
||||
requires_config_enabled MBEDTLS_SSL_RENEGOTIATION
|
||||
run_test "Connection ID: Cli+Srv enabled, Cli disables on renegotiation" \
|
||||
"$P_SRV debug_level=3 dtls=1 cid=1 cid_val=dead renegotiation=1" \
|
||||
"$P_CLI debug_level=3 dtls=1 cid=1 cid_val=beef cid_renego=0 renegotiation=1 renegotiate=1" \
|
||||
0 \
|
||||
-c "(initial handshake) Peer CID (length 2 Bytes): de ad" \
|
||||
-s "(initial handshake) Peer CID (length 2 Bytes): be ef" \
|
||||
-s "(initial handshake) Use of Connection ID has been negotiated" \
|
||||
-c "(initial handshake) Use of Connection ID has been negotiated" \
|
||||
-C "(after renegotiation) Peer CID (length 2 Bytes): de ad" \
|
||||
-S "(after renegotiation) Peer CID (length 2 Bytes): be ef" \
|
||||
-C "(after renegotiation) Use of Connection ID has been negotiated" \
|
||||
-S "(after renegotiation) Use of Connection ID has been negotiated" \
|
||||
-s "(after renegotiation) Use of Connection ID was not offered by client"
|
||||
|
||||
requires_config_enabled MBEDTLS_SSL_DTLS_CONNECTION_ID
|
||||
requires_config_enabled MBEDTLS_SSL_RENEGOTIATION
|
||||
run_test "Connection ID, 3D: Cli+Srv enabled, Cli disables on renegotiation" \
|
||||
-p "$P_PXY drop=5 delay=5 duplicate=5 bad_cid=1" \
|
||||
"$P_SRV debug_level=3 dtls=1 cid=1 cid_val=dead renegotiation=1" \
|
||||
"$P_CLI debug_level=3 dtls=1 cid=1 cid_val=beef cid_renego=0 renegotiation=1 renegotiate=1" \
|
||||
0 \
|
||||
-c "(initial handshake) Peer CID (length 2 Bytes): de ad" \
|
||||
-s "(initial handshake) Peer CID (length 2 Bytes): be ef" \
|
||||
-s "(initial handshake) Use of Connection ID has been negotiated" \
|
||||
-c "(initial handshake) Use of Connection ID has been negotiated" \
|
||||
-C "(after renegotiation) Peer CID (length 2 Bytes): de ad" \
|
||||
-S "(after renegotiation) Peer CID (length 2 Bytes): be ef" \
|
||||
-C "(after renegotiation) Use of Connection ID has been negotiated" \
|
||||
-S "(after renegotiation) Use of Connection ID has been negotiated" \
|
||||
-s "(after renegotiation) Use of Connection ID was not offered by client" \
|
||||
-c "ignoring unexpected CID" \
|
||||
-s "ignoring unexpected CID"
|
||||
|
||||
requires_config_enabled MBEDTLS_SSL_DTLS_CONNECTION_ID
|
||||
requires_config_enabled MBEDTLS_SSL_RENEGOTIATION
|
||||
run_test "Connection ID: Cli+Srv enabled, Srv disables on renegotiation" \
|
||||
"$P_SRV debug_level=3 dtls=1 cid=1 cid_val=dead cid_renego=0 renegotiation=1" \
|
||||
"$P_CLI debug_level=3 dtls=1 cid=1 cid_val=beef renegotiation=1 renegotiate=1" \
|
||||
0 \
|
||||
-c "(initial handshake) Peer CID (length 2 Bytes): de ad" \
|
||||
-s "(initial handshake) Peer CID (length 2 Bytes): be ef" \
|
||||
-s "(initial handshake) Use of Connection ID has been negotiated" \
|
||||
-c "(initial handshake) Use of Connection ID has been negotiated" \
|
||||
-C "(after renegotiation) Peer CID (length 2 Bytes): de ad" \
|
||||
-S "(after renegotiation) Peer CID (length 2 Bytes): be ef" \
|
||||
-C "(after renegotiation) Use of Connection ID has been negotiated" \
|
||||
-S "(after renegotiation) Use of Connection ID has been negotiated" \
|
||||
-c "(after renegotiation) Use of Connection ID was rejected by the server"
|
||||
|
||||
requires_config_enabled MBEDTLS_SSL_DTLS_CONNECTION_ID
|
||||
requires_config_enabled MBEDTLS_SSL_RENEGOTIATION
|
||||
run_test "Connection ID, 3D: Cli+Srv enabled, Srv disables on renegotiation" \
|
||||
-p "$P_PXY drop=5 delay=5 duplicate=5 bad_cid=1" \
|
||||
"$P_SRV debug_level=3 dtls=1 cid=1 cid_val=dead cid_renego=0 renegotiation=1" \
|
||||
"$P_CLI debug_level=3 dtls=1 cid=1 cid_val=beef renegotiation=1 renegotiate=1" \
|
||||
0 \
|
||||
-c "(initial handshake) Peer CID (length 2 Bytes): de ad" \
|
||||
-s "(initial handshake) Peer CID (length 2 Bytes): be ef" \
|
||||
-s "(initial handshake) Use of Connection ID has been negotiated" \
|
||||
-c "(initial handshake) Use of Connection ID has been negotiated" \
|
||||
-C "(after renegotiation) Peer CID (length 2 Bytes): de ad" \
|
||||
-S "(after renegotiation) Peer CID (length 2 Bytes): be ef" \
|
||||
-C "(after renegotiation) Use of Connection ID has been negotiated" \
|
||||
-S "(after renegotiation) Use of Connection ID has been negotiated" \
|
||||
-c "(after renegotiation) Use of Connection ID was rejected by the server" \
|
||||
-c "ignoring unexpected CID" \
|
||||
-s "ignoring unexpected CID"
|
||||
|
||||
# Tests for Encrypt-then-MAC extension
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -38,7 +38,7 @@ static int build_transforms( mbedtls_ssl_transform *t_in,
|
||||
unsigned char *key0 = NULL, *key1 = NULL;
|
||||
unsigned char iv_enc[16], iv_dec[16];
|
||||
|
||||
#if defined(MBEDTLS_SSL_CID)
|
||||
#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
|
||||
unsigned char cid0[ SSL_CID_LEN_MIN ];
|
||||
unsigned char cid1[ SSL_CID_LEN_MIN ];
|
||||
|
||||
@ -47,7 +47,7 @@ static int build_transforms( mbedtls_ssl_transform *t_in,
|
||||
#else
|
||||
((void) cid0_len);
|
||||
((void) cid1_len);
|
||||
#endif /* MBEDTLS_SSL_CID */
|
||||
#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
|
||||
|
||||
maclen = 0;
|
||||
|
||||
@ -246,7 +246,7 @@ static int build_transforms( mbedtls_ssl_transform *t_in,
|
||||
memcpy( &t_out->iv_dec, iv_enc, sizeof( iv_enc ) );
|
||||
memcpy( &t_out->iv_enc, iv_dec, sizeof( iv_dec ) );
|
||||
|
||||
#if defined(MBEDTLS_SSL_CID)
|
||||
#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
|
||||
/* Add CID */
|
||||
memcpy( &t_in->in_cid, cid0, cid0_len );
|
||||
memcpy( &t_in->out_cid, cid1, cid1_len );
|
||||
@ -256,7 +256,7 @@ static int build_transforms( mbedtls_ssl_transform *t_in,
|
||||
memcpy( &t_out->out_cid, cid0, cid0_len );
|
||||
t_out->in_cid_len = cid1_len;
|
||||
t_out->out_cid_len = cid0_len;
|
||||
#endif /* MBEDTLS_SSL_CID */
|
||||
#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
|
||||
|
||||
cleanup:
|
||||
|
||||
@ -379,9 +379,9 @@ void ssl_crypt_record( int cipher_type, int hash_id,
|
||||
rec.type = 42;
|
||||
rec.ver[0] = num_records;
|
||||
rec.ver[1] = num_records;
|
||||
#if defined(MBEDTLS_SSL_CID)
|
||||
#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
|
||||
rec.cid_len = 0;
|
||||
#endif /* MBEDTLS_SSL_CID */
|
||||
#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
|
||||
|
||||
rec.buf = buf;
|
||||
rec.buf_len = buflen;
|
||||
@ -499,9 +499,9 @@ void ssl_crypt_record_small( int cipher_type, int hash_id,
|
||||
rec.ver[1] = offset;
|
||||
rec.buf = buf;
|
||||
rec.buf_len = buflen;
|
||||
#if defined(MBEDTLS_SSL_CID)
|
||||
#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
|
||||
rec.cid_len = 0;
|
||||
#endif /* MBEDTLS_SSL_CID */
|
||||
#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
|
||||
|
||||
switch( mode )
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user