mirror of
https://github.com/Mbed-TLS/mbedtls.git
synced 2025-02-13 15:40:58 +00:00
Merge pull request #5268 from gilles-peskine-arm/struct_reordering_3.0
Reorder structure fields to maximize usage of immediate offset access
This commit is contained in:
commit
c38c1f2411
@ -1108,6 +1108,17 @@ mbedtls_dtls_srtp_info;
|
|||||||
*/
|
*/
|
||||||
struct mbedtls_ssl_session
|
struct mbedtls_ssl_session
|
||||||
{
|
{
|
||||||
|
#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
|
||||||
|
unsigned char MBEDTLS_PRIVATE(mfl_code); /*!< MaxFragmentLength negotiated by peer */
|
||||||
|
#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
|
||||||
|
|
||||||
|
unsigned char MBEDTLS_PRIVATE(exported);
|
||||||
|
|
||||||
|
/* This field is temporarily duplicated with mbedtls_ssl_context.minor_ver.
|
||||||
|
* Once runtime negotiation of TLS 1.2 and TLS 1.3 is implemented, it needs
|
||||||
|
* to be studied whether one of them can be removed. */
|
||||||
|
unsigned char MBEDTLS_PRIVATE(minor_ver); /*!< The TLS version used in the session. */
|
||||||
|
|
||||||
#if defined(MBEDTLS_HAVE_TIME)
|
#if defined(MBEDTLS_HAVE_TIME)
|
||||||
mbedtls_time_t MBEDTLS_PRIVATE(start); /*!< starting time */
|
mbedtls_time_t MBEDTLS_PRIVATE(start); /*!< starting time */
|
||||||
#endif
|
#endif
|
||||||
@ -1117,13 +1128,6 @@ struct mbedtls_ssl_session
|
|||||||
unsigned char MBEDTLS_PRIVATE(id)[32]; /*!< session identifier */
|
unsigned char MBEDTLS_PRIVATE(id)[32]; /*!< session identifier */
|
||||||
unsigned char MBEDTLS_PRIVATE(master)[48]; /*!< the master secret */
|
unsigned char MBEDTLS_PRIVATE(master)[48]; /*!< the master secret */
|
||||||
|
|
||||||
unsigned char MBEDTLS_PRIVATE(exported);
|
|
||||||
|
|
||||||
/* This field is temporarily duplicated with mbedtls_ssl_context.minor_ver.
|
|
||||||
* Once runtime negotiation of TLS 1.2 and TLS 1.3 is implemented, it needs
|
|
||||||
* to be studied whether one of them can be removed. */
|
|
||||||
unsigned char MBEDTLS_PRIVATE(minor_ver); /*!< The TLS version used in the session. */
|
|
||||||
|
|
||||||
#if defined(MBEDTLS_X509_CRT_PARSE_C)
|
#if defined(MBEDTLS_X509_CRT_PARSE_C)
|
||||||
#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
|
#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
|
||||||
mbedtls_x509_crt *MBEDTLS_PRIVATE(peer_cert); /*!< peer X.509 cert chain */
|
mbedtls_x509_crt *MBEDTLS_PRIVATE(peer_cert); /*!< peer X.509 cert chain */
|
||||||
@ -1143,10 +1147,6 @@ struct mbedtls_ssl_session
|
|||||||
uint32_t MBEDTLS_PRIVATE(ticket_lifetime); /*!< ticket lifetime hint */
|
uint32_t MBEDTLS_PRIVATE(ticket_lifetime); /*!< ticket lifetime hint */
|
||||||
#endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_CLI_C */
|
#endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_CLI_C */
|
||||||
|
|
||||||
#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
|
|
||||||
unsigned char MBEDTLS_PRIVATE(mfl_code); /*!< MaxFragmentLength negotiated by peer */
|
|
||||||
#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
|
|
||||||
|
|
||||||
#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
|
#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
|
||||||
int MBEDTLS_PRIVATE(encrypt_then_mac); /*!< flag for EtM activation */
|
int MBEDTLS_PRIVATE(encrypt_then_mac); /*!< flag for EtM activation */
|
||||||
#endif
|
#endif
|
||||||
@ -1210,7 +1210,62 @@ typedef void mbedtls_ssl_export_keys_t( void *p_expkey,
|
|||||||
*/
|
*/
|
||||||
struct mbedtls_ssl_config
|
struct mbedtls_ssl_config
|
||||||
{
|
{
|
||||||
/* Group items by size (largest first) to minimize padding overhead */
|
/* Group items mostly by size. This helps to reduce memory wasted to
|
||||||
|
* padding. It also helps to keep smaller fields early in the structure,
|
||||||
|
* so that elements tend to be in the 128-element direct access window
|
||||||
|
* on Arm Thumb, which reduces the code size. */
|
||||||
|
|
||||||
|
unsigned char MBEDTLS_PRIVATE(max_major_ver); /*!< max. major version used */
|
||||||
|
unsigned char MBEDTLS_PRIVATE(max_minor_ver); /*!< max. minor version used */
|
||||||
|
unsigned char MBEDTLS_PRIVATE(min_major_ver); /*!< min. major version used */
|
||||||
|
unsigned char MBEDTLS_PRIVATE(min_minor_ver); /*!< min. minor version used */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Flags (could be bit-fields to save RAM, but separate bytes make
|
||||||
|
* the code smaller on architectures with an instruction for direct
|
||||||
|
* byte access).
|
||||||
|
*/
|
||||||
|
|
||||||
|
uint8_t MBEDTLS_PRIVATE(endpoint); /*!< 0: client, 1: server */
|
||||||
|
uint8_t MBEDTLS_PRIVATE(transport); /*!< 0: stream (TLS), 1: datagram (DTLS) */
|
||||||
|
uint8_t MBEDTLS_PRIVATE(authmode); /*!< MBEDTLS_SSL_VERIFY_XXX */
|
||||||
|
/* needed even with renego disabled for LEGACY_BREAK_HANDSHAKE */
|
||||||
|
uint8_t MBEDTLS_PRIVATE(allow_legacy_renegotiation); /*!< MBEDTLS_LEGACY_XXX */
|
||||||
|
#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
|
||||||
|
uint8_t MBEDTLS_PRIVATE(mfl_code); /*!< desired fragment length indicator
|
||||||
|
(MBEDTLS_SSL_MAX_FRAG_LEN_XXX) */
|
||||||
|
#endif
|
||||||
|
#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
|
||||||
|
uint8_t MBEDTLS_PRIVATE(encrypt_then_mac); /*!< negotiate encrypt-then-mac? */
|
||||||
|
#endif
|
||||||
|
#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
|
||||||
|
uint8_t MBEDTLS_PRIVATE(extended_ms); /*!< negotiate extended master secret? */
|
||||||
|
#endif
|
||||||
|
#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
|
||||||
|
uint8_t MBEDTLS_PRIVATE(anti_replay); /*!< detect and prevent replay? */
|
||||||
|
#endif
|
||||||
|
#if defined(MBEDTLS_SSL_RENEGOTIATION)
|
||||||
|
uint8_t MBEDTLS_PRIVATE(disable_renegotiation); /*!< disable renegotiation? */
|
||||||
|
#endif
|
||||||
|
#if defined(MBEDTLS_SSL_SESSION_TICKETS)
|
||||||
|
uint8_t MBEDTLS_PRIVATE(session_tickets); /*!< use session tickets? */
|
||||||
|
#endif
|
||||||
|
#if defined(MBEDTLS_SSL_SRV_C)
|
||||||
|
uint8_t MBEDTLS_PRIVATE(cert_req_ca_list); /*!< enable sending CA list in
|
||||||
|
Certificate Request messages? */
|
||||||
|
uint8_t MBEDTLS_PRIVATE(respect_cli_pref); /*!< pick the ciphersuite according to
|
||||||
|
the client's preferences rather
|
||||||
|
than ours? */
|
||||||
|
#endif
|
||||||
|
#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
|
||||||
|
uint8_t MBEDTLS_PRIVATE(ignore_unexpected_cid); /*!< Should DTLS record with
|
||||||
|
* unexpected CID
|
||||||
|
* lead to failure? */
|
||||||
|
#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
|
||||||
|
#if defined(MBEDTLS_SSL_DTLS_SRTP)
|
||||||
|
uint8_t MBEDTLS_PRIVATE(dtls_srtp_mki_support); /* support having mki_value
|
||||||
|
in the use_srtp extension? */
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Pointers
|
* Pointers
|
||||||
@ -1365,7 +1420,7 @@ struct mbedtls_ssl_config
|
|||||||
#endif /* MBEDTLS_SSL_DTLS_SRTP */
|
#endif /* MBEDTLS_SSL_DTLS_SRTP */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Numerical settings (int then char)
|
* Numerical settings (int)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
uint32_t MBEDTLS_PRIVATE(read_timeout); /*!< timeout for mbedtls_ssl_read (ms) */
|
uint32_t MBEDTLS_PRIVATE(read_timeout); /*!< timeout for mbedtls_ssl_read (ms) */
|
||||||
@ -1388,55 +1443,6 @@ struct mbedtls_ssl_config
|
|||||||
#if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_CLI_C)
|
#if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_CLI_C)
|
||||||
unsigned int MBEDTLS_PRIVATE(dhm_min_bitlen); /*!< min. bit length of the DHM prime */
|
unsigned int MBEDTLS_PRIVATE(dhm_min_bitlen); /*!< min. bit length of the DHM prime */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
unsigned char MBEDTLS_PRIVATE(max_major_ver); /*!< max. major version used */
|
|
||||||
unsigned char MBEDTLS_PRIVATE(max_minor_ver); /*!< max. minor version used */
|
|
||||||
unsigned char MBEDTLS_PRIVATE(min_major_ver); /*!< min. major version used */
|
|
||||||
unsigned char MBEDTLS_PRIVATE(min_minor_ver); /*!< min. minor version used */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Flags (bitfields)
|
|
||||||
*/
|
|
||||||
|
|
||||||
unsigned int MBEDTLS_PRIVATE(endpoint) : 1; /*!< 0: client, 1: server */
|
|
||||||
unsigned int MBEDTLS_PRIVATE(transport) : 1; /*!< stream (TLS) or datagram (DTLS) */
|
|
||||||
unsigned int MBEDTLS_PRIVATE(authmode) : 2; /*!< MBEDTLS_SSL_VERIFY_XXX */
|
|
||||||
/* needed even with renego disabled for LEGACY_BREAK_HANDSHAKE */
|
|
||||||
unsigned int MBEDTLS_PRIVATE(allow_legacy_renegotiation) : 2 ; /*!< MBEDTLS_LEGACY_XXX */
|
|
||||||
#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
|
|
||||||
unsigned int MBEDTLS_PRIVATE(mfl_code) : 3; /*!< desired fragment length */
|
|
||||||
#endif
|
|
||||||
#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
|
|
||||||
unsigned int MBEDTLS_PRIVATE(encrypt_then_mac) : 1 ; /*!< negotiate encrypt-then-mac? */
|
|
||||||
#endif
|
|
||||||
#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
|
|
||||||
unsigned int MBEDTLS_PRIVATE(extended_ms) : 1; /*!< negotiate extended master secret? */
|
|
||||||
#endif
|
|
||||||
#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
|
|
||||||
unsigned int MBEDTLS_PRIVATE(anti_replay) : 1; /*!< detect and prevent replay? */
|
|
||||||
#endif
|
|
||||||
#if defined(MBEDTLS_SSL_RENEGOTIATION)
|
|
||||||
unsigned int MBEDTLS_PRIVATE(disable_renegotiation) : 1; /*!< disable renegotiation? */
|
|
||||||
#endif
|
|
||||||
#if defined(MBEDTLS_SSL_SESSION_TICKETS)
|
|
||||||
unsigned int MBEDTLS_PRIVATE(session_tickets) : 1; /*!< use session tickets? */
|
|
||||||
#endif
|
|
||||||
#if defined(MBEDTLS_SSL_SRV_C)
|
|
||||||
unsigned int MBEDTLS_PRIVATE(cert_req_ca_list) : 1; /*!< enable sending CA list in
|
|
||||||
Certificate Request messages? */
|
|
||||||
unsigned int MBEDTLS_PRIVATE(respect_cli_pref) : 1; /*!< pick the ciphersuite according to
|
|
||||||
the client's preferences rather
|
|
||||||
than ours */
|
|
||||||
#endif
|
|
||||||
#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
|
|
||||||
unsigned int MBEDTLS_PRIVATE(ignore_unexpected_cid) : 1; /*!< Determines whether DTLS
|
|
||||||
* record with unexpected CID
|
|
||||||
* should lead to failure. */
|
|
||||||
#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
|
|
||||||
#if defined(MBEDTLS_SSL_DTLS_SRTP)
|
|
||||||
unsigned int MBEDTLS_PRIVATE(dtls_srtp_mki_support) : 1; /* support having mki_value
|
|
||||||
in the use_srtp extension */
|
|
||||||
#endif
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct mbedtls_ssl_context
|
struct mbedtls_ssl_context
|
||||||
|
@ -42,6 +42,9 @@
|
|||||||
* of these types. */
|
* of these types. */
|
||||||
#include "crypto_types.h"
|
#include "crypto_types.h"
|
||||||
#include "crypto_values.h"
|
#include "crypto_values.h"
|
||||||
|
/* Include size definitions which are used to size some arrays in operation
|
||||||
|
* structures. */
|
||||||
|
#include <psa/crypto_sizes.h>
|
||||||
|
|
||||||
/** For encrypt-decrypt functions, whether the operation is an encryption
|
/** For encrypt-decrypt functions, whether the operation is an encryption
|
||||||
* or a decryption. */
|
* or a decryption. */
|
||||||
|
@ -31,6 +31,7 @@
|
|||||||
|
|
||||||
#include "mbedtls/platform_util.h"
|
#include "mbedtls/platform_util.h"
|
||||||
|
|
||||||
|
#include "crypto_types.h"
|
||||||
#include "crypto_compat.h"
|
#include "crypto_compat.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
@ -186,9 +186,6 @@ typedef struct
|
|||||||
{
|
{
|
||||||
uint8_t *MBEDTLS_PRIVATE(info);
|
uint8_t *MBEDTLS_PRIVATE(info);
|
||||||
size_t MBEDTLS_PRIVATE(info_length);
|
size_t MBEDTLS_PRIVATE(info_length);
|
||||||
psa_mac_operation_t MBEDTLS_PRIVATE(hmac);
|
|
||||||
uint8_t MBEDTLS_PRIVATE(prk)[PSA_HASH_MAX_SIZE];
|
|
||||||
uint8_t MBEDTLS_PRIVATE(output_block)[PSA_HASH_MAX_SIZE];
|
|
||||||
#if PSA_HASH_MAX_SIZE > 0xff
|
#if PSA_HASH_MAX_SIZE > 0xff
|
||||||
#error "PSA_HASH_MAX_SIZE does not fit in uint8_t"
|
#error "PSA_HASH_MAX_SIZE does not fit in uint8_t"
|
||||||
#endif
|
#endif
|
||||||
@ -196,6 +193,9 @@ typedef struct
|
|||||||
uint8_t MBEDTLS_PRIVATE(block_number);
|
uint8_t MBEDTLS_PRIVATE(block_number);
|
||||||
unsigned int MBEDTLS_PRIVATE(state) : 2;
|
unsigned int MBEDTLS_PRIVATE(state) : 2;
|
||||||
unsigned int MBEDTLS_PRIVATE(info_set) : 1;
|
unsigned int MBEDTLS_PRIVATE(info_set) : 1;
|
||||||
|
uint8_t MBEDTLS_PRIVATE(output_block)[PSA_HASH_MAX_SIZE];
|
||||||
|
uint8_t MBEDTLS_PRIVATE(prk)[PSA_HASH_MAX_SIZE];
|
||||||
|
struct psa_mac_operation_s MBEDTLS_PRIVATE(hmac);
|
||||||
} psa_hkdf_key_derivation_t;
|
} psa_hkdf_key_derivation_t;
|
||||||
#endif /* MBEDTLS_PSA_BUILTIN_ALG_HKDF */
|
#endif /* MBEDTLS_PSA_BUILTIN_ALG_HKDF */
|
||||||
|
|
||||||
|
@ -103,9 +103,9 @@ static int key_type_is_raw_bytes( psa_key_type_t type )
|
|||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
mbedtls_psa_random_context_t rng;
|
|
||||||
unsigned initialized : 1;
|
unsigned initialized : 1;
|
||||||
unsigned rng_state : 2;
|
unsigned rng_state : 2;
|
||||||
|
mbedtls_psa_random_context_t rng;
|
||||||
} psa_global_data_t;
|
} psa_global_data_t;
|
||||||
|
|
||||||
static psa_global_data_t global_data;
|
static psa_global_data_t global_data;
|
||||||
|
@ -525,6 +525,59 @@ typedef struct
|
|||||||
*/
|
*/
|
||||||
struct mbedtls_ssl_handshake_params
|
struct mbedtls_ssl_handshake_params
|
||||||
{
|
{
|
||||||
|
/* Frequently-used boolean or byte fields (placed early to take
|
||||||
|
* advantage of smaller code size for indirect access on Arm Thumb) */
|
||||||
|
uint8_t max_major_ver; /*!< max. major version client*/
|
||||||
|
uint8_t max_minor_ver; /*!< max. minor version client*/
|
||||||
|
uint8_t resume; /*!< session resume indicator*/
|
||||||
|
uint8_t cli_exts; /*!< client extension presence*/
|
||||||
|
|
||||||
|
#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
|
||||||
|
uint8_t sni_authmode; /*!< authmode from SNI callback */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(MBEDTLS_SSL_SESSION_TICKETS)
|
||||||
|
uint8_t new_session_ticket; /*!< use NewSessionTicket? */
|
||||||
|
#endif /* MBEDTLS_SSL_SESSION_TICKETS */
|
||||||
|
|
||||||
|
#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
|
||||||
|
uint8_t extended_ms; /*!< use Extended Master Secret? */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
|
||||||
|
uint8_t async_in_progress; /*!< an asynchronous operation is in progress */
|
||||||
|
#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
|
||||||
|
|
||||||
|
#if defined(MBEDTLS_SSL_PROTO_DTLS)
|
||||||
|
unsigned char retransmit_state; /*!< Retransmission state */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(MBEDTLS_DEPRECATED_REMOVED)
|
||||||
|
unsigned char group_list_heap_allocated;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
|
||||||
|
uint8_t ecrs_enabled; /*!< Handshake supports EC restart? */
|
||||||
|
enum { /* this complements ssl->state with info on intra-state operations */
|
||||||
|
ssl_ecrs_none = 0, /*!< nothing going on (yet) */
|
||||||
|
ssl_ecrs_crt_verify, /*!< Certificate: crt_verify() */
|
||||||
|
ssl_ecrs_ske_start_processing, /*!< ServerKeyExchange: pk_verify() */
|
||||||
|
ssl_ecrs_cke_ecdh_calc_secret, /*!< ClientKeyExchange: ECDH step 2 */
|
||||||
|
ssl_ecrs_crt_vrfy_sign, /*!< CertificateVerify: pk_sign() */
|
||||||
|
} ecrs_state; /*!< current (or last) operation */
|
||||||
|
mbedtls_x509_crt *ecrs_peer_cert; /*!< The peer's CRT chain. */
|
||||||
|
size_t ecrs_n; /*!< place for saving a length */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
size_t pmslen; /*!< premaster length */
|
||||||
|
|
||||||
|
mbedtls_ssl_ciphersuite_t const *ciphersuite_info;
|
||||||
|
|
||||||
|
void (*update_checksum)(mbedtls_ssl_context *, const unsigned char *, size_t);
|
||||||
|
void (*calc_verify)(const mbedtls_ssl_context *, unsigned char *, size_t *);
|
||||||
|
void (*calc_finished)(mbedtls_ssl_context *, unsigned char *, int);
|
||||||
|
mbedtls_ssl_tls_prf_cb *tls_prf;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Handshake specific crypto variables
|
* Handshake specific crypto variables
|
||||||
*/
|
*/
|
||||||
@ -532,18 +585,19 @@ struct mbedtls_ssl_handshake_params
|
|||||||
int tls13_kex_modes; /*!< key exchange modes for TLS 1.3 */
|
int tls13_kex_modes; /*!< key exchange modes for TLS 1.3 */
|
||||||
#endif /* MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL */
|
#endif /* MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL */
|
||||||
|
|
||||||
#if !defined(MBEDTLS_DEPRECATED_REMOVED)
|
|
||||||
const uint16_t *group_list;
|
|
||||||
unsigned char group_list_heap_allocated;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \
|
#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \
|
||||||
defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
|
defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
|
||||||
mbedtls_ssl_sig_hash_set_t hash_algs; /*!< Set of suitable sig-hash pairs */
|
mbedtls_ssl_sig_hash_set_t hash_algs; /*!< Set of suitable sig-hash pairs */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if !defined(MBEDTLS_DEPRECATED_REMOVED)
|
||||||
|
const uint16_t *group_list;
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(MBEDTLS_DHM_C)
|
#if defined(MBEDTLS_DHM_C)
|
||||||
mbedtls_dhm_context dhm_ctx; /*!< DHM key exchange */
|
mbedtls_dhm_context dhm_ctx; /*!< DHM key exchange */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Adding guard for MBEDTLS_ECDSA_C to ensure no compile errors due
|
/* Adding guard for MBEDTLS_ECDSA_C to ensure no compile errors due
|
||||||
* to guards also being in ssl_srv.c and ssl_cli.c. There is a gap
|
* to guards also being in ssl_srv.c and ssl_cli.c. There is a gap
|
||||||
* in functionality that access to ecdh_ctx structure is needed for
|
* in functionality that access to ecdh_ctx structure is needed for
|
||||||
@ -568,10 +622,12 @@ struct mbedtls_ssl_handshake_params
|
|||||||
size_t ecjpake_cache_len; /*!< Length of cached data */
|
size_t ecjpake_cache_len; /*!< Length of cached data */
|
||||||
#endif
|
#endif
|
||||||
#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
|
#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
|
||||||
#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
|
|
||||||
|
#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
|
||||||
defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
|
defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
|
||||||
const mbedtls_ecp_curve_info **curves; /*!< Supported elliptic curves */
|
const mbedtls_ecp_curve_info **curves; /*!< Supported elliptic curves */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
|
#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
|
||||||
#if defined(MBEDTLS_USE_PSA_CRYPTO)
|
#if defined(MBEDTLS_USE_PSA_CRYPTO)
|
||||||
psa_key_id_t psk_opaque; /*!< Opaque PSK from the callback */
|
psa_key_id_t psk_opaque; /*!< Opaque PSK from the callback */
|
||||||
@ -579,64 +635,24 @@ struct mbedtls_ssl_handshake_params
|
|||||||
unsigned char *psk; /*!< PSK from the callback */
|
unsigned char *psk; /*!< PSK from the callback */
|
||||||
size_t psk_len; /*!< Length of PSK from callback */
|
size_t psk_len; /*!< Length of PSK from callback */
|
||||||
#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */
|
#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */
|
||||||
|
|
||||||
|
#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
|
||||||
|
mbedtls_x509_crt_restart_ctx ecrs_ctx; /*!< restart context */
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(MBEDTLS_X509_CRT_PARSE_C)
|
#if defined(MBEDTLS_X509_CRT_PARSE_C)
|
||||||
mbedtls_ssl_key_cert *key_cert; /*!< chosen key/cert pair (server) */
|
mbedtls_ssl_key_cert *key_cert; /*!< chosen key/cert pair (server) */
|
||||||
#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
|
#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
|
||||||
int sni_authmode; /*!< authmode from SNI callback */
|
|
||||||
mbedtls_ssl_key_cert *sni_key_cert; /*!< key/cert list from SNI */
|
mbedtls_ssl_key_cert *sni_key_cert; /*!< key/cert list from SNI */
|
||||||
mbedtls_x509_crt *sni_ca_chain; /*!< trusted CAs from SNI callback */
|
mbedtls_x509_crt *sni_ca_chain; /*!< trusted CAs from SNI callback */
|
||||||
mbedtls_x509_crl *sni_ca_crl; /*!< trusted CAs CRLs from SNI */
|
mbedtls_x509_crl *sni_ca_crl; /*!< trusted CAs CRLs from SNI */
|
||||||
#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
|
#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
|
||||||
#endif /* MBEDTLS_X509_CRT_PARSE_C */
|
#endif /* MBEDTLS_X509_CRT_PARSE_C */
|
||||||
#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
|
|
||||||
int ecrs_enabled; /*!< Handshake supports EC restart? */
|
#if defined(MBEDTLS_X509_CRT_PARSE_C) && \
|
||||||
mbedtls_x509_crt_restart_ctx ecrs_ctx; /*!< restart context */
|
|
||||||
enum { /* this complements ssl->state with info on intra-state operations */
|
|
||||||
ssl_ecrs_none = 0, /*!< nothing going on (yet) */
|
|
||||||
ssl_ecrs_crt_verify, /*!< Certificate: crt_verify() */
|
|
||||||
ssl_ecrs_ske_start_processing, /*!< ServerKeyExchange: pk_verify() */
|
|
||||||
ssl_ecrs_cke_ecdh_calc_secret, /*!< ClientKeyExchange: ECDH step 2 */
|
|
||||||
ssl_ecrs_crt_vrfy_sign, /*!< CertificateVerify: pk_sign() */
|
|
||||||
} ecrs_state; /*!< current (or last) operation */
|
|
||||||
mbedtls_x509_crt *ecrs_peer_cert; /*!< The peer's CRT chain. */
|
|
||||||
size_t ecrs_n; /*!< place for saving a length */
|
|
||||||
#endif
|
|
||||||
#if defined(MBEDTLS_X509_CRT_PARSE_C) && \
|
|
||||||
!defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
|
!defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
|
||||||
mbedtls_pk_context peer_pubkey; /*!< The public key from the peer. */
|
mbedtls_pk_context peer_pubkey; /*!< The public key from the peer. */
|
||||||
#endif /* MBEDTLS_X509_CRT_PARSE_C && !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
|
#endif /* MBEDTLS_X509_CRT_PARSE_C && !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
|
||||||
#if defined(MBEDTLS_SSL_PROTO_DTLS)
|
|
||||||
unsigned int out_msg_seq; /*!< Outgoing handshake sequence number */
|
|
||||||
unsigned int in_msg_seq; /*!< Incoming handshake sequence number */
|
|
||||||
|
|
||||||
unsigned char *verify_cookie; /*!< Cli: HelloVerifyRequest cookie
|
|
||||||
Srv: unused */
|
|
||||||
unsigned char verify_cookie_len; /*!< Cli: cookie length
|
|
||||||
Srv: flag for sending a cookie */
|
|
||||||
|
|
||||||
uint32_t retransmit_timeout; /*!< Current value of timeout */
|
|
||||||
unsigned char retransmit_state; /*!< Retransmission state */
|
|
||||||
mbedtls_ssl_flight_item *flight; /*!< Current outgoing flight */
|
|
||||||
mbedtls_ssl_flight_item *cur_msg; /*!< Current message in flight */
|
|
||||||
unsigned char *cur_msg_p; /*!< Position in current message */
|
|
||||||
unsigned int in_flight_start_seq; /*!< Minimum message sequence in the
|
|
||||||
flight being received */
|
|
||||||
mbedtls_ssl_transform *alt_transform_out; /*!< Alternative transform for
|
|
||||||
resending messages */
|
|
||||||
unsigned char alt_out_ctr[MBEDTLS_SSL_SEQUENCE_NUMBER_LEN]; /*!< Alternative record epoch/counter
|
|
||||||
for resending messages */
|
|
||||||
|
|
||||||
#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 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_DTLS_CONNECTION_ID */
|
|
||||||
|
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
@ -664,6 +680,38 @@ struct mbedtls_ssl_handshake_params
|
|||||||
|
|
||||||
} buffering;
|
} buffering;
|
||||||
|
|
||||||
|
#if defined(MBEDTLS_SSL_PROTO_DTLS)
|
||||||
|
unsigned int out_msg_seq; /*!< Outgoing handshake sequence number */
|
||||||
|
unsigned int in_msg_seq; /*!< Incoming handshake sequence number */
|
||||||
|
|
||||||
|
unsigned char *verify_cookie; /*!< Cli: HelloVerifyRequest cookie
|
||||||
|
Srv: unused */
|
||||||
|
unsigned char verify_cookie_len; /*!< Cli: cookie length
|
||||||
|
Srv: flag for sending a cookie */
|
||||||
|
|
||||||
|
uint32_t retransmit_timeout; /*!< Current value of timeout */
|
||||||
|
mbedtls_ssl_flight_item *flight; /*!< Current outgoing flight */
|
||||||
|
mbedtls_ssl_flight_item *cur_msg; /*!< Current message in flight */
|
||||||
|
unsigned char *cur_msg_p; /*!< Position in current message */
|
||||||
|
unsigned int in_flight_start_seq; /*!< Minimum message sequence in the
|
||||||
|
flight being received */
|
||||||
|
mbedtls_ssl_transform *alt_transform_out; /*!< Alternative transform for
|
||||||
|
resending messages */
|
||||||
|
unsigned char alt_out_ctr[MBEDTLS_SSL_SEQUENCE_NUMBER_LEN]; /*!< Alternative record epoch/counter
|
||||||
|
for resending messages */
|
||||||
|
|
||||||
|
#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 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_DTLS_CONNECTION_ID */
|
||||||
|
|
||||||
uint16_t mtu; /*!< Handshake mtu, used to fragment outgoing messages */
|
uint16_t mtu; /*!< Handshake mtu, used to fragment outgoing messages */
|
||||||
#endif /* MBEDTLS_SSL_PROTO_DTLS */
|
#endif /* MBEDTLS_SSL_PROTO_DTLS */
|
||||||
|
|
||||||
@ -694,11 +742,6 @@ struct mbedtls_ssl_handshake_params
|
|||||||
#endif
|
#endif
|
||||||
#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
|
#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
|
||||||
|
|
||||||
void (*update_checksum)(mbedtls_ssl_context *, const unsigned char *, size_t);
|
|
||||||
void (*calc_verify)(const mbedtls_ssl_context *, unsigned char *, size_t *);
|
|
||||||
void (*calc_finished)(mbedtls_ssl_context *, unsigned char *, int);
|
|
||||||
mbedtls_ssl_tls_prf_cb *tls_prf;
|
|
||||||
|
|
||||||
#if defined(MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL)
|
#if defined(MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL)
|
||||||
uint16_t offered_group_id; /* The NamedGroup value for the group
|
uint16_t offered_group_id; /* The NamedGroup value for the group
|
||||||
* that is being used for ephemeral
|
* that is being used for ephemeral
|
||||||
@ -741,20 +784,12 @@ struct mbedtls_ssl_handshake_params
|
|||||||
|
|
||||||
/* End of state-local variables. */
|
/* End of state-local variables. */
|
||||||
|
|
||||||
mbedtls_ssl_ciphersuite_t const *ciphersuite_info;
|
|
||||||
|
|
||||||
size_t pmslen; /*!< premaster length */
|
|
||||||
|
|
||||||
unsigned char randbytes[MBEDTLS_CLIENT_HELLO_RANDOM_LEN +
|
unsigned char randbytes[MBEDTLS_CLIENT_HELLO_RANDOM_LEN +
|
||||||
MBEDTLS_SERVER_HELLO_RANDOM_LEN];
|
MBEDTLS_SERVER_HELLO_RANDOM_LEN];
|
||||||
/*!< random bytes */
|
/*!< random bytes */
|
||||||
unsigned char premaster[MBEDTLS_PREMASTER_SIZE];
|
unsigned char premaster[MBEDTLS_PREMASTER_SIZE];
|
||||||
/*!< premaster secret */
|
/*!< premaster secret */
|
||||||
|
|
||||||
int resume; /*!< session resume indicator*/
|
|
||||||
int max_major_ver; /*!< max. major version client*/
|
|
||||||
int max_minor_ver; /*!< max. minor version client*/
|
|
||||||
int cli_exts; /*!< client extension presence*/
|
|
||||||
#if defined(MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL)
|
#if defined(MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL)
|
||||||
int extensions_present; /*!< extension presence; Each bitfield
|
int extensions_present; /*!< extension presence; Each bitfield
|
||||||
represents an extension and defined
|
represents an extension and defined
|
||||||
@ -770,17 +805,6 @@ struct mbedtls_ssl_handshake_params
|
|||||||
mbedtls_ssl_tls13_handshake_secrets tls13_hs_secrets;
|
mbedtls_ssl_tls13_handshake_secrets tls13_hs_secrets;
|
||||||
#endif /* MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL */
|
#endif /* MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL */
|
||||||
|
|
||||||
#if defined(MBEDTLS_SSL_SESSION_TICKETS)
|
|
||||||
int new_session_ticket; /*!< use NewSessionTicket? */
|
|
||||||
#endif /* MBEDTLS_SSL_SESSION_TICKETS */
|
|
||||||
#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
|
|
||||||
int extended_ms; /*!< use Extended Master Secret? */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
|
|
||||||
unsigned int async_in_progress : 1; /*!< an asynchronous operation is in progress */
|
|
||||||
#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
|
|
||||||
|
|
||||||
#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
|
#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
|
||||||
/** Asynchronous operation context. This field is meant for use by the
|
/** Asynchronous operation context. This field is meant for use by the
|
||||||
* asynchronous operation callbacks (mbedtls_ssl_config::f_async_sign_start,
|
* asynchronous operation callbacks (mbedtls_ssl_config::f_async_sign_start,
|
||||||
|
@ -457,6 +457,139 @@ class CodeParser():
|
|||||||
|
|
||||||
return enum_consts
|
return enum_consts
|
||||||
|
|
||||||
|
IGNORED_CHUNK_REGEX = re.compile('|'.join([
|
||||||
|
r'/\*.*?\*/', # block comment entirely on one line
|
||||||
|
r'//.*', # line comment
|
||||||
|
r'(?P<string>")(?:[^\\\"]|\\.)*"', # string literal
|
||||||
|
]))
|
||||||
|
|
||||||
|
def strip_comments_and_literals(self, line, in_block_comment):
|
||||||
|
"""Strip comments and string literals from line.
|
||||||
|
|
||||||
|
Continuation lines are not supported.
|
||||||
|
|
||||||
|
If in_block_comment is true, assume that the line starts inside a
|
||||||
|
block comment.
|
||||||
|
|
||||||
|
Return updated values of (line, in_block_comment) where:
|
||||||
|
* Comments in line have been replaced by a space (or nothing at the
|
||||||
|
start or end of the line).
|
||||||
|
* String contents have been removed.
|
||||||
|
* in_block_comment indicates whether the line ends inside a block
|
||||||
|
comment that continues on the next line.
|
||||||
|
"""
|
||||||
|
|
||||||
|
# Terminate current multiline comment?
|
||||||
|
if in_block_comment:
|
||||||
|
m = re.search(r"\*/", line)
|
||||||
|
if m:
|
||||||
|
in_block_comment = False
|
||||||
|
line = line[m.end(0):]
|
||||||
|
else:
|
||||||
|
return '', True
|
||||||
|
|
||||||
|
# Remove full comments and string literals.
|
||||||
|
# Do it all together to handle cases like "/*" correctly.
|
||||||
|
# Note that continuation lines are not supported.
|
||||||
|
line = re.sub(self.IGNORED_CHUNK_REGEX,
|
||||||
|
lambda s: '""' if s.group('string') else ' ',
|
||||||
|
line)
|
||||||
|
|
||||||
|
# Start an unfinished comment?
|
||||||
|
# (If `/*` was part of a complete comment, it's already been removed.)
|
||||||
|
m = re.search(r"/\*", line)
|
||||||
|
if m:
|
||||||
|
in_block_comment = True
|
||||||
|
line = line[:m.start(0)]
|
||||||
|
|
||||||
|
return line, in_block_comment
|
||||||
|
|
||||||
|
IDENTIFIER_REGEX = re.compile('|'.join([
|
||||||
|
# Match " something(a" or " *something(a". Functions.
|
||||||
|
# Assumptions:
|
||||||
|
# - function definition from return type to one of its arguments is
|
||||||
|
# all on one line
|
||||||
|
# - function definition line only contains alphanumeric, asterisk,
|
||||||
|
# underscore, and open bracket
|
||||||
|
r".* \**(\w+) *\( *\w",
|
||||||
|
# Match "(*something)(".
|
||||||
|
r".*\( *\* *(\w+) *\) *\(",
|
||||||
|
# Match names of named data structures.
|
||||||
|
r"(?:typedef +)?(?:struct|union|enum) +(\w+)(?: *{)?$",
|
||||||
|
# Match names of typedef instances, after closing bracket.
|
||||||
|
r"}? *(\w+)[;[].*",
|
||||||
|
]))
|
||||||
|
# The regex below is indented for clarity.
|
||||||
|
EXCLUSION_LINES = re.compile("|".join([
|
||||||
|
r"extern +\"C\"",
|
||||||
|
r"(typedef +)?(struct|union|enum)( *{)?$",
|
||||||
|
r"} *;?$",
|
||||||
|
r"$",
|
||||||
|
r"//",
|
||||||
|
r"#",
|
||||||
|
]))
|
||||||
|
|
||||||
|
def parse_identifiers_in_file(self, header_file, identifiers):
|
||||||
|
"""
|
||||||
|
Parse all lines of a header where a function/enum/struct/union/typedef
|
||||||
|
identifier is declared, based on some regex and heuristics. Highly
|
||||||
|
dependent on formatting style.
|
||||||
|
|
||||||
|
Append found matches to the list ``identifiers``.
|
||||||
|
"""
|
||||||
|
|
||||||
|
with open(header_file, "r", encoding="utf-8") as header:
|
||||||
|
in_block_comment = False
|
||||||
|
# The previous line variable is used for concatenating lines
|
||||||
|
# when identifiers are formatted and spread across multiple
|
||||||
|
# lines.
|
||||||
|
previous_line = ""
|
||||||
|
|
||||||
|
for line_no, line in enumerate(header):
|
||||||
|
line, in_block_comment = \
|
||||||
|
self.strip_comments_and_literals(line, in_block_comment)
|
||||||
|
|
||||||
|
if self.EXCLUSION_LINES.match(line):
|
||||||
|
previous_line = ""
|
||||||
|
continue
|
||||||
|
|
||||||
|
# If the line contains only space-separated alphanumeric
|
||||||
|
# characters (or underscore, asterisk, or open parenthesis),
|
||||||
|
# and nothing else, high chance it's a declaration that
|
||||||
|
# continues on the next line
|
||||||
|
if re.search(r"^([\w\*\(]+\s+)+$", line):
|
||||||
|
previous_line += line
|
||||||
|
continue
|
||||||
|
|
||||||
|
# If previous line seemed to start an unfinished declaration
|
||||||
|
# (as above), concat and treat them as one.
|
||||||
|
if previous_line:
|
||||||
|
line = previous_line.strip() + " " + line.strip() + "\n"
|
||||||
|
previous_line = ""
|
||||||
|
|
||||||
|
# Skip parsing if line has a space in front = heuristic to
|
||||||
|
# skip function argument lines (highly subject to formatting
|
||||||
|
# changes)
|
||||||
|
if line[0] == " ":
|
||||||
|
continue
|
||||||
|
|
||||||
|
identifier = self.IDENTIFIER_REGEX.search(line)
|
||||||
|
|
||||||
|
if not identifier:
|
||||||
|
continue
|
||||||
|
|
||||||
|
# Find the group that matched, and append it
|
||||||
|
for group in identifier.groups():
|
||||||
|
if not group:
|
||||||
|
continue
|
||||||
|
|
||||||
|
identifiers.append(Match(
|
||||||
|
header_file,
|
||||||
|
line,
|
||||||
|
line_no,
|
||||||
|
identifier.span(),
|
||||||
|
group))
|
||||||
|
|
||||||
def parse_identifiers(self, include, exclude=None):
|
def parse_identifiers(self, include, exclude=None):
|
||||||
"""
|
"""
|
||||||
Parse all lines of a header where a function/enum/struct/union/typedef
|
Parse all lines of a header where a function/enum/struct/union/typedef
|
||||||
@ -469,99 +602,13 @@ class CodeParser():
|
|||||||
|
|
||||||
Returns a List of Match objects with identifiers.
|
Returns a List of Match objects with identifiers.
|
||||||
"""
|
"""
|
||||||
identifier_regex = re.compile(
|
|
||||||
# Match " something(a" or " *something(a". Functions.
|
|
||||||
# Assumptions:
|
|
||||||
# - function definition from return type to one of its arguments is
|
|
||||||
# all on one line
|
|
||||||
# - function definition line only contains alphanumeric, asterisk,
|
|
||||||
# underscore, and open bracket
|
|
||||||
r".* \**(\w+) *\( *\w|"
|
|
||||||
# Match "(*something)(".
|
|
||||||
r".*\( *\* *(\w+) *\) *\(|"
|
|
||||||
# Match names of named data structures.
|
|
||||||
r"(?:typedef +)?(?:struct|union|enum) +(\w+)(?: *{)?$|"
|
|
||||||
# Match names of typedef instances, after closing bracket.
|
|
||||||
r"}? *(\w+)[;[].*"
|
|
||||||
)
|
|
||||||
# The regex below is indented for clarity.
|
|
||||||
exclusion_lines = re.compile(
|
|
||||||
r"^("
|
|
||||||
r"extern +\"C\"|" # pylint: disable=bad-continuation
|
|
||||||
r"(typedef +)?(struct|union|enum)( *{)?$|"
|
|
||||||
r"} *;?$|"
|
|
||||||
r"$|"
|
|
||||||
r"//|"
|
|
||||||
r"#"
|
|
||||||
r")"
|
|
||||||
)
|
|
||||||
|
|
||||||
files = self.get_files(include, exclude)
|
files = self.get_files(include, exclude)
|
||||||
self.log.debug("Looking for identifiers in {} files".format(len(files)))
|
self.log.debug("Looking for identifiers in {} files".format(len(files)))
|
||||||
|
|
||||||
identifiers = []
|
identifiers = []
|
||||||
for header_file in files:
|
for header_file in files:
|
||||||
with open(header_file, "r", encoding="utf-8") as header:
|
self.parse_identifiers_in_file(header_file, identifiers)
|
||||||
in_block_comment = False
|
|
||||||
# The previous line variable is used for concatenating lines
|
|
||||||
# when identifiers are formatted and spread across multiple
|
|
||||||
# lines.
|
|
||||||
previous_line = ""
|
|
||||||
|
|
||||||
for line_no, line in enumerate(header):
|
|
||||||
# Skip parsing this line if a block comment ends on it,
|
|
||||||
# but don't skip if it has just started -- there is a chance
|
|
||||||
# it ends on the same line.
|
|
||||||
if re.search(r"/\*", line):
|
|
||||||
in_block_comment = not in_block_comment
|
|
||||||
if re.search(r"\*/", line):
|
|
||||||
in_block_comment = not in_block_comment
|
|
||||||
continue
|
|
||||||
|
|
||||||
if in_block_comment:
|
|
||||||
previous_line = ""
|
|
||||||
continue
|
|
||||||
|
|
||||||
if exclusion_lines.search(line):
|
|
||||||
previous_line = ""
|
|
||||||
continue
|
|
||||||
|
|
||||||
# If the line contains only space-separated alphanumeric
|
|
||||||
# characters (or underscore, asterisk, or, open bracket),
|
|
||||||
# and nothing else, high chance it's a declaration that
|
|
||||||
# continues on the next line
|
|
||||||
if re.search(r"^([\w\*\(]+\s+)+$", line):
|
|
||||||
previous_line += line
|
|
||||||
continue
|
|
||||||
|
|
||||||
# If previous line seemed to start an unfinished declaration
|
|
||||||
# (as above), concat and treat them as one.
|
|
||||||
if previous_line:
|
|
||||||
line = previous_line.strip() + " " + line.strip() + "\n"
|
|
||||||
previous_line = ""
|
|
||||||
|
|
||||||
# Skip parsing if line has a space in front = heuristic to
|
|
||||||
# skip function argument lines (highly subject to formatting
|
|
||||||
# changes)
|
|
||||||
if line[0] == " ":
|
|
||||||
continue
|
|
||||||
|
|
||||||
identifier = identifier_regex.search(line)
|
|
||||||
|
|
||||||
if not identifier:
|
|
||||||
continue
|
|
||||||
|
|
||||||
# Find the group that matched, and append it
|
|
||||||
for group in identifier.groups():
|
|
||||||
if not group:
|
|
||||||
continue
|
|
||||||
|
|
||||||
identifiers.append(Match(
|
|
||||||
header_file,
|
|
||||||
line,
|
|
||||||
line_no,
|
|
||||||
identifier.span(),
|
|
||||||
group))
|
|
||||||
|
|
||||||
return identifiers
|
return identifiers
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user