Added AES+GHASH implementation using AES-NI opcodes; also ARM-Thumb assembly for faster Montgomery multiplication on Cortex-M0+. Added selection functions for "default" implementations.
This commit is contained in:
parent
556e525d62
commit
5f045c7599
58 changed files with 3012 additions and 395 deletions
|
|
@ -191,6 +191,7 @@
|
|||
* | aes_small | AES | 16 | 16, 24 and 32 |
|
||||
* | aes_ct | AES | 16 | 16, 24 and 32 |
|
||||
* | aes_ct64 | AES | 16 | 16, 24 and 32 |
|
||||
* | aes_x86ni | AES | 16 | 16, 24 and 32 |
|
||||
* | des_ct | DES/3DES | 8 | 8, 16 and 24 |
|
||||
* | des_tab | DES/3DES | 8 | 8, 16 and 24 |
|
||||
*
|
||||
|
|
@ -223,6 +224,11 @@
|
|||
* is typically twice faster than `aes_ct` for modes that allow parallel
|
||||
* operations (i.e. CTR, and CBC decryption, but not CBC encryption).
|
||||
*
|
||||
* `aes_x86ni` exists only on x86 architectures (32-bit and 64-bit). It
|
||||
* uses the AES-NI opcodes when available; if the opcodes are not present,
|
||||
* then it automatically fall backs on an appropriate constant-time
|
||||
* implementation (`aes_ct` for 32-bit, `aes_ct64` for 64-bit).
|
||||
*
|
||||
* `des_tab` is a classic, table-based implementation of DES/3DES. It
|
||||
* is not constant-time.
|
||||
*
|
||||
|
|
@ -994,6 +1000,219 @@ void br_aes_ct64_cbcdec_run(const br_aes_ct64_cbcdec_keys *ctx, void *iv,
|
|||
uint32_t br_aes_ct64_ctr_run(const br_aes_ct64_ctr_keys *ctx,
|
||||
const void *iv, uint32_t cc, void *data, size_t len);
|
||||
|
||||
/*
|
||||
* AES implementation using AES-NI opcode (x86 platform). When the
|
||||
* opcodes are not present, this falls back to "ct" or "ct64" (depending
|
||||
* on architecture).
|
||||
*/
|
||||
|
||||
/** \brief AES block size (16 bytes). */
|
||||
#define br_aes_x86ni_BLOCK_SIZE 16
|
||||
|
||||
/**
|
||||
* \brief Context for AES subkeys (`aes_x86ni` implementation, CBC encryption).
|
||||
*
|
||||
* First field is a pointer to the vtable; it is set by the initialisation
|
||||
* function. Other fields are not supposed to be accessed by user code.
|
||||
*/
|
||||
typedef struct {
|
||||
/** \brief Pointer to vtable for this context. */
|
||||
const br_block_cbcenc_class *vtable;
|
||||
#ifndef BR_DOXYGEN_IGNORE
|
||||
union {
|
||||
unsigned char skni[16 * 15];
|
||||
struct {
|
||||
uint32_t skey[60];
|
||||
} fallback_ct;
|
||||
struct {
|
||||
uint64_t skey[30];
|
||||
} fallback_ct64;
|
||||
} skey;
|
||||
unsigned num_rounds;
|
||||
#endif
|
||||
} br_aes_x86ni_cbcenc_keys;
|
||||
|
||||
/**
|
||||
* \brief Context for AES subkeys (`aes_x86ni` implementation, CBC decryption).
|
||||
*
|
||||
* First field is a pointer to the vtable; it is set by the initialisation
|
||||
* function. Other fields are not supposed to be accessed by user code.
|
||||
*/
|
||||
typedef struct {
|
||||
/** \brief Pointer to vtable for this context. */
|
||||
const br_block_cbcdec_class *vtable;
|
||||
#ifndef BR_DOXYGEN_IGNORE
|
||||
union {
|
||||
unsigned char skni[16 * 15];
|
||||
struct {
|
||||
uint32_t skey[60];
|
||||
} fallback_ct;
|
||||
struct {
|
||||
uint64_t skey[30];
|
||||
} fallback_ct64;
|
||||
} skey;
|
||||
unsigned num_rounds;
|
||||
#endif
|
||||
} br_aes_x86ni_cbcdec_keys;
|
||||
|
||||
/**
|
||||
* \brief Context for AES subkeys (`aes_x86ni` implementation, CTR encryption
|
||||
* and decryption).
|
||||
*
|
||||
* First field is a pointer to the vtable; it is set by the initialisation
|
||||
* function. Other fields are not supposed to be accessed by user code.
|
||||
*/
|
||||
typedef struct {
|
||||
/** \brief Pointer to vtable for this context. */
|
||||
const br_block_ctr_class *vtable;
|
||||
#ifndef BR_DOXYGEN_IGNORE
|
||||
union {
|
||||
unsigned char skni[16 * 15];
|
||||
struct {
|
||||
uint32_t skey[60];
|
||||
} fallback_ct;
|
||||
struct {
|
||||
uint64_t skey[30];
|
||||
} fallback_ct64;
|
||||
} skey;
|
||||
unsigned num_rounds;
|
||||
#endif
|
||||
} br_aes_x86ni_ctr_keys;
|
||||
|
||||
/**
|
||||
* \brief Class instance for AES CBC encryption (`aes_x86ni` implementation).
|
||||
*
|
||||
* Since this implementation might be omitted from the library, or the
|
||||
* AES opcode unavailable on the current CPU, a pointer to this class
|
||||
* instance should be obtained through `br_aes_x86ni_cbcenc_get_vtable()`.
|
||||
*/
|
||||
extern const br_block_cbcenc_class br_aes_x86ni_cbcenc_vtable;
|
||||
|
||||
/**
|
||||
* \brief Class instance for AES CBC decryption (`aes_x86ni` implementation).
|
||||
*
|
||||
* Since this implementation might be omitted from the library, or the
|
||||
* AES opcode unavailable on the current CPU, a pointer to this class
|
||||
* instance should be obtained through `br_aes_x86ni_cbcdec_get_vtable()`.
|
||||
*/
|
||||
extern const br_block_cbcdec_class br_aes_x86ni_cbcdec_vtable;
|
||||
|
||||
/**
|
||||
* \brief Class instance for AES CTR encryption and decryption
|
||||
* (`aes_x86ni` implementation).
|
||||
*
|
||||
* Since this implementation might be omitted from the library, or the
|
||||
* AES opcode unavailable on the current CPU, a pointer to this class
|
||||
* instance should be obtained through `br_aes_x86ni_ctr_get_vtable()`.
|
||||
*/
|
||||
extern const br_block_ctr_class br_aes_x86ni_ctr_vtable;
|
||||
|
||||
/**
|
||||
* \brief Context initialisation (key schedule) for AES CBC encryption
|
||||
* (`aes_x86ni` implementation).
|
||||
*
|
||||
* \param ctx context to initialise.
|
||||
* \param key secret key.
|
||||
* \param len secret key length (in bytes).
|
||||
*/
|
||||
void br_aes_x86ni_cbcenc_init(br_aes_x86ni_cbcenc_keys *ctx,
|
||||
const void *key, size_t len);
|
||||
|
||||
/**
|
||||
* \brief Context initialisation (key schedule) for AES CBC decryption
|
||||
* (`aes_x86ni` implementation).
|
||||
*
|
||||
* \param ctx context to initialise.
|
||||
* \param key secret key.
|
||||
* \param len secret key length (in bytes).
|
||||
*/
|
||||
void br_aes_x86ni_cbcdec_init(br_aes_x86ni_cbcdec_keys *ctx,
|
||||
const void *key, size_t len);
|
||||
|
||||
/**
|
||||
* \brief Context initialisation (key schedule) for AES CTR encryption
|
||||
* and decryption (`aes_x86ni` implementation).
|
||||
*
|
||||
* \param ctx context to initialise.
|
||||
* \param key secret key.
|
||||
* \param len secret key length (in bytes).
|
||||
*/
|
||||
void br_aes_x86ni_ctr_init(br_aes_x86ni_ctr_keys *ctx,
|
||||
const void *key, size_t len);
|
||||
|
||||
/**
|
||||
* \brief CBC encryption with AES (`aes_x86ni` implementation).
|
||||
*
|
||||
* \param ctx context (already initialised).
|
||||
* \param iv IV (updated).
|
||||
* \param data data to encrypt (updated).
|
||||
* \param len data length (in bytes, MUST be multiple of 16).
|
||||
*/
|
||||
void br_aes_x86ni_cbcenc_run(const br_aes_x86ni_cbcenc_keys *ctx, void *iv,
|
||||
void *data, size_t len);
|
||||
|
||||
/**
|
||||
* \brief CBC decryption with AES (`aes_x86ni` implementation).
|
||||
*
|
||||
* \param ctx context (already initialised).
|
||||
* \param iv IV (updated).
|
||||
* \param data data to decrypt (updated).
|
||||
* \param len data length (in bytes, MUST be multiple of 16).
|
||||
*/
|
||||
void br_aes_x86ni_cbcdec_run(const br_aes_x86ni_cbcdec_keys *ctx, void *iv,
|
||||
void *data, size_t len);
|
||||
|
||||
/**
|
||||
* \brief CTR encryption and decryption with AES (`aes_x86ni` implementation).
|
||||
*
|
||||
* \param ctx context (already initialised).
|
||||
* \param iv IV (constant, 12 bytes).
|
||||
* \param cc initial block counter value.
|
||||
* \param data data to decrypt (updated).
|
||||
* \param len data length (in bytes).
|
||||
* \return new block counter value.
|
||||
*/
|
||||
uint32_t br_aes_x86ni_ctr_run(const br_aes_x86ni_ctr_keys *ctx,
|
||||
const void *iv, uint32_t cc, void *data, size_t len);
|
||||
|
||||
/**
|
||||
* \brief Obtain the `aes_x86ni` AES-CBC (encryption) implementation, if
|
||||
* available.
|
||||
*
|
||||
* This function returns a pointer to `br_aes_x86ni_cbcenc_vtable`, if
|
||||
* that implementation was compiled in the library _and_ the x86 AES
|
||||
* opcodes are available on the currently running CPU. If either of
|
||||
* these conditions is not met, then this function returns `NULL`.
|
||||
*
|
||||
* \return the `aes_x868ni` AES-CBC (encryption) implementation, or `NULL`.
|
||||
*/
|
||||
const br_block_cbcenc_class *br_aes_x86ni_cbcenc_get_vtable(void);
|
||||
|
||||
/**
|
||||
* \brief Obtain the `aes_x86ni` AES-CBC (decryption) implementation, if
|
||||
* available.
|
||||
*
|
||||
* This function returns a pointer to `br_aes_x86ni_cbcdec_vtable`, if
|
||||
* that implementation was compiled in the library _and_ the x86 AES
|
||||
* opcodes are available on the currently running CPU. If either of
|
||||
* these conditions is not met, then this function returns `NULL`.
|
||||
*
|
||||
* \return the `aes_x868ni` AES-CBC (decryption) implementation, or `NULL`.
|
||||
*/
|
||||
const br_block_cbcdec_class *br_aes_x86ni_cbcdec_get_vtable(void);
|
||||
|
||||
/**
|
||||
* \brief Obtain the `aes_x86ni` AES-CTR implementation, if available.
|
||||
*
|
||||
* This function returns a pointer to `br_aes_x86ni_ctr_vtable`, if
|
||||
* that implementation was compiled in the library _and_ the x86 AES
|
||||
* opcodes are available on the currently running CPU. If either of
|
||||
* these conditions is not met, then this function returns `NULL`.
|
||||
*
|
||||
* \return the `aes_x868ni` AES-CTR implementation, or `NULL`.
|
||||
*/
|
||||
const br_block_ctr_class *br_aes_x86ni_ctr_get_vtable(void);
|
||||
|
||||
/**
|
||||
* \brief Aggregate structure large enough to be used as context for
|
||||
* subkeys (CBC encryption) for all AES implementations.
|
||||
|
|
@ -1004,6 +1223,7 @@ typedef union {
|
|||
br_aes_small_cbcenc_keys c_small;
|
||||
br_aes_ct_cbcenc_keys c_ct;
|
||||
br_aes_ct64_cbcenc_keys c_ct64;
|
||||
br_aes_x86ni_cbcenc_keys c_x86ni;
|
||||
} br_aes_gen_cbcenc_keys;
|
||||
|
||||
/**
|
||||
|
|
@ -1016,6 +1236,7 @@ typedef union {
|
|||
br_aes_small_cbcdec_keys c_small;
|
||||
br_aes_ct_cbcdec_keys c_ct;
|
||||
br_aes_ct64_cbcdec_keys c_ct64;
|
||||
br_aes_x86ni_cbcdec_keys c_x86ni;
|
||||
} br_aes_gen_cbcdec_keys;
|
||||
|
||||
/**
|
||||
|
|
@ -1028,6 +1249,7 @@ typedef union {
|
|||
br_aes_small_ctr_keys c_small;
|
||||
br_aes_ct_ctr_keys c_ct;
|
||||
br_aes_ct64_ctr_keys c_ct64;
|
||||
br_aes_x86ni_ctr_keys c_x86ni;
|
||||
} br_aes_gen_ctr_keys;
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -512,6 +512,27 @@ extern const br_ec_impl br_ec_c25519_m31;
|
|||
*/
|
||||
extern const br_ec_impl br_ec_all_m15;
|
||||
|
||||
/**
|
||||
* \brief Aggregate EC implementation "m31".
|
||||
*
|
||||
* This implementation is a wrapper for:
|
||||
*
|
||||
* - `br_ec_c25519_m31` for Curve25519
|
||||
* - `br_ec_p256_m31` for NIST P-256
|
||||
* - `br_ec_prime_i31` for other curves (NIST P-384 and NIST-P512)
|
||||
*/
|
||||
extern const br_ec_impl br_ec_all_m31;
|
||||
|
||||
/**
|
||||
* \brief Get the "default" EC implementation for the current system.
|
||||
*
|
||||
* This returns a pointer to the preferred implementation on the
|
||||
* current system.
|
||||
*
|
||||
* \return the default EC implementation.
|
||||
*/
|
||||
const br_ec_impl *br_ec_get_default(void);
|
||||
|
||||
/**
|
||||
* \brief Convert a signature from "raw" to "asn1".
|
||||
*
|
||||
|
|
@ -732,4 +753,44 @@ uint32_t br_ecdsa_i15_vrfy_raw(const br_ec_impl *impl,
|
|||
const void *hash, size_t hash_len,
|
||||
const br_ec_public_key *pk, const void *sig, size_t sig_len);
|
||||
|
||||
/**
|
||||
* \brief Get "default" ECDSA implementation (signer, asn1 format).
|
||||
*
|
||||
* This returns the preferred implementation of ECDSA signature generation
|
||||
* ("asn1" output format) on the current system.
|
||||
*
|
||||
* \return the default implementation.
|
||||
*/
|
||||
br_ecdsa_sign br_ecdsa_sign_asn1_get_default(void);
|
||||
|
||||
/**
|
||||
* \brief Get "default" ECDSA implementation (signer, raw format).
|
||||
*
|
||||
* This returns the preferred implementation of ECDSA signature generation
|
||||
* ("raw" output format) on the current system.
|
||||
*
|
||||
* \return the default implementation.
|
||||
*/
|
||||
br_ecdsa_sign br_ecdsa_sign_raw_get_default(void);
|
||||
|
||||
/**
|
||||
* \brief Get "default" ECDSA implementation (verifier, asn1 format).
|
||||
*
|
||||
* This returns the preferred implementation of ECDSA signature verification
|
||||
* ("asn1" output format) on the current system.
|
||||
*
|
||||
* \return the default implementation.
|
||||
*/
|
||||
br_ecdsa_vrfy br_ecdsa_vrfy_asn1_get_default(void);
|
||||
|
||||
/**
|
||||
* \brief Get "default" ECDSA implementation (verifier, raw format).
|
||||
*
|
||||
* This returns the preferred implementation of ECDSA signature verification
|
||||
* ("raw" output format) on the current system.
|
||||
*
|
||||
* \return the default implementation.
|
||||
*/
|
||||
br_ecdsa_vrfy br_ecdsa_vrfy_raw_get_default(void);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -1279,4 +1279,34 @@ void br_ghash_ctmul32(void *y, const void *h, const void *data, size_t len);
|
|||
*/
|
||||
void br_ghash_ctmul64(void *y, const void *h, const void *data, size_t len);
|
||||
|
||||
/**
|
||||
* \brief GHASH implementation using the `pclmulqdq` opcode (part of the
|
||||
* AES-NI instructions).
|
||||
*
|
||||
* This implementation is available only on x86 platforms where the
|
||||
* compiler supports the relevant intrinsic functions. Even if the
|
||||
* compiler supports these functions, the local CPU might not support
|
||||
* the `pclmulqdq` opcode, meaning that a call will fail with an
|
||||
* illegal instruction exception. To safely obtain a pointer to this
|
||||
* function when supported (or 0 otherwise), use `br_ghash_pclmul_get()`.
|
||||
*
|
||||
* \param y the array to update.
|
||||
* \param h the GHASH key.
|
||||
* \param data the input data (may be `NULL` if `len` is zero).
|
||||
* \param len the input data length (in bytes).
|
||||
*/
|
||||
void br_ghash_pclmul(void *y, const void *h, const void *data, size_t len);
|
||||
|
||||
/**
|
||||
* \brief Obtain the `pclmul` GHASH implementation, if available.
|
||||
*
|
||||
* If the `pclmul` implementation was compiled in the library (depending
|
||||
* on the compiler abilities) _and_ the local CPU appears to support the
|
||||
* opcode, then this function will return a pointer to the
|
||||
* `br_ghash_pclmul()` function. Otherwise, it will return `0`.
|
||||
*
|
||||
* \return the `pclmul` GHASH implementation, or `0`.
|
||||
*/
|
||||
br_ghash br_ghash_pclmul_get(void);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -515,6 +515,46 @@ uint32_t br_rsa_i15_pkcs1_sign(const unsigned char *hash_oid,
|
|||
const unsigned char *hash, size_t hash_len,
|
||||
const br_rsa_private_key *sk, unsigned char *x);
|
||||
|
||||
/**
|
||||
* \brief Get "default" RSA implementation (public-key operations).
|
||||
*
|
||||
* This returns the preferred implementation of RSA (public-key operations)
|
||||
* on the current system.
|
||||
*
|
||||
* \return the default implementation.
|
||||
*/
|
||||
br_rsa_public br_rsa_public_get_default(void);
|
||||
|
||||
/**
|
||||
* \brief Get "default" RSA implementation (private-key operations).
|
||||
*
|
||||
* This returns the preferred implementation of RSA (private-key operations)
|
||||
* on the current system.
|
||||
*
|
||||
* \return the default implementation.
|
||||
*/
|
||||
br_rsa_private br_rsa_private_get_default(void);
|
||||
|
||||
/**
|
||||
* \brief Get "default" RSA implementation (PKCS#1 signature verification).
|
||||
*
|
||||
* This returns the preferred implementation of RSA (signature verification)
|
||||
* on the current system.
|
||||
*
|
||||
* \return the default implementation.
|
||||
*/
|
||||
br_rsa_pkcs1_vrfy br_rsa_pkcs1_vrfy_get_default(void);
|
||||
|
||||
/**
|
||||
* \brief Get "default" RSA implementation (PKCS#1 signature generation).
|
||||
*
|
||||
* This returns the preferred implementation of RSA (signature generation)
|
||||
* on the current system.
|
||||
*
|
||||
* \return the default implementation.
|
||||
*/
|
||||
br_rsa_pkcs1_sign br_rsa_pkcs1_sign_get_default(void);
|
||||
|
||||
/**
|
||||
* \brief RSA decryption helper, for SSL/TLS.
|
||||
*
|
||||
|
|
|
|||
|
|
@ -1321,6 +1321,18 @@ br_ssl_engine_set_aes_cbc(br_ssl_engine_context *cc,
|
|||
cc->iaes_cbcdec = impl_dec;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Set the "default" AES/CBC implementations.
|
||||
*
|
||||
* This function configures in the engine the AES implementations that
|
||||
* should provide best runtime performance on the local system, while
|
||||
* still being safe (in particular, constant-time). It also sets the
|
||||
* handlers for CBC records.
|
||||
*
|
||||
* \param cc SSL engine context.
|
||||
*/
|
||||
void br_ssl_engine_set_default_aes_cbc(br_ssl_engine_context *cc);
|
||||
|
||||
/**
|
||||
* \brief Set the AES/CTR implementation.
|
||||
*
|
||||
|
|
@ -1334,6 +1346,18 @@ br_ssl_engine_set_aes_ctr(br_ssl_engine_context *cc,
|
|||
cc->iaes_ctr = impl;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Set the "default" implementations for AES/GCM (AES/CTR + GHASH).
|
||||
*
|
||||
* This function configures in the engine the AES/CTR and GHASH
|
||||
* implementation that should provide best runtime performance on the local
|
||||
* system, while still being safe (in particular, constant-time). It also
|
||||
* sets the handlers for GCM records.
|
||||
*
|
||||
* \param cc SSL engine context.
|
||||
*/
|
||||
void br_ssl_engine_set_default_aes_gcm(br_ssl_engine_context *cc);
|
||||
|
||||
/**
|
||||
* \brief Set the DES/CBC implementations.
|
||||
*
|
||||
|
|
@ -1350,6 +1374,18 @@ br_ssl_engine_set_des_cbc(br_ssl_engine_context *cc,
|
|||
cc->ides_cbcdec = impl_dec;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Set the "default" DES/CBC implementations.
|
||||
*
|
||||
* This function configures in the engine the DES implementations that
|
||||
* should provide best runtime performance on the local system, while
|
||||
* still being safe (in particular, constant-time). It also sets the
|
||||
* handlers for CBC records.
|
||||
*
|
||||
* \param cc SSL engine context.
|
||||
*/
|
||||
void br_ssl_engine_set_default_des_cbc(br_ssl_engine_context *cc);
|
||||
|
||||
/**
|
||||
* \brief Set the GHASH implementation (used in GCM mode).
|
||||
*
|
||||
|
|
@ -1388,6 +1424,18 @@ br_ssl_engine_set_poly1305(br_ssl_engine_context *cc,
|
|||
cc->ipoly = ipoly;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Set the "default" ChaCha20 and Poly1305 implementations.
|
||||
*
|
||||
* This function configures in the engine the ChaCha20 and Poly1305
|
||||
* implementations that should provide best runtime performance on the
|
||||
* local system, while still being safe (in particular, constant-time).
|
||||
* It also sets the handlers for ChaCha20+Poly1305 records.
|
||||
*
|
||||
* \param cc SSL engine context.
|
||||
*/
|
||||
void br_ssl_engine_set_default_chapol(br_ssl_engine_context *cc);
|
||||
|
||||
/**
|
||||
* \brief Set the record encryption and decryption engines for CBC + HMAC.
|
||||
*
|
||||
|
|
@ -1452,6 +1500,29 @@ br_ssl_engine_set_ec(br_ssl_engine_context *cc, const br_ec_impl *iec)
|
|||
cc->iec = iec;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Set the "default" EC implementation.
|
||||
*
|
||||
* This function sets the elliptic curve implementation for ECDH and
|
||||
* ECDHE cipher suites, and for ECDSA support. It selects the fastest
|
||||
* implementation on the current system.
|
||||
*
|
||||
* \param cc SSL engine context.
|
||||
*/
|
||||
void br_ssl_engine_set_default_ec(br_ssl_engine_context *cc);
|
||||
|
||||
/**
|
||||
* \brief Get the EC implementation configured in the provided engine.
|
||||
*
|
||||
* \param cc SSL engine context.
|
||||
* \return the EC implementation.
|
||||
*/
|
||||
static inline const br_ec_impl *
|
||||
br_ssl_engine_get_ec(br_ssl_engine_context *cc)
|
||||
{
|
||||
return cc->iec;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Set the RSA signature verification implementation.
|
||||
*
|
||||
|
|
@ -1469,6 +1540,29 @@ br_ssl_engine_set_rsavrfy(br_ssl_engine_context *cc, br_rsa_pkcs1_vrfy irsavrfy)
|
|||
cc->irsavrfy = irsavrfy;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Set the "default" RSA implementation (signature verification).
|
||||
*
|
||||
* This function sets the RSA implementation (signature verification)
|
||||
* to the fastest implementation available on the current platform.
|
||||
*
|
||||
* \param cc SSL engine context.
|
||||
*/
|
||||
void br_ssl_engine_set_default_rsavrfy(br_ssl_engine_context *cc);
|
||||
|
||||
/**
|
||||
* \brief Get the RSA implementation (signature verification) configured
|
||||
* in the provided engine.
|
||||
*
|
||||
* \param cc SSL engine context.
|
||||
* \return the RSA signature verification implementation.
|
||||
*/
|
||||
static inline br_rsa_pkcs1_vrfy
|
||||
br_ssl_engine_get_rsavrfy(br_ssl_engine_context *cc)
|
||||
{
|
||||
return cc->irsavrfy;
|
||||
}
|
||||
|
||||
/*
|
||||
* \brief Set the ECDSA implementation (signature verification).
|
||||
*
|
||||
|
|
@ -1490,6 +1584,31 @@ br_ssl_engine_set_ecdsa(br_ssl_engine_context *cc, br_ecdsa_vrfy iecdsa)
|
|||
cc->iecdsa = iecdsa;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Set the "default" ECDSA implementation (signature verification).
|
||||
*
|
||||
* This function sets the ECDSA implementation (signature verification)
|
||||
* to the fastest implementation available on the current platform. This
|
||||
* call also sets the elliptic curve implementation itself, there again
|
||||
* to the fastest EC implementation available.
|
||||
*
|
||||
* \param cc SSL engine context.
|
||||
*/
|
||||
void br_ssl_engine_set_default_ecdsa(br_ssl_engine_context *cc);
|
||||
|
||||
/**
|
||||
* \brief Get the ECDSA implementation (signature verification) configured
|
||||
* in the provided engine.
|
||||
*
|
||||
* \param cc SSL engine context.
|
||||
* \return the ECDSA signature verification implementation.
|
||||
*/
|
||||
static inline br_ecdsa_vrfy
|
||||
br_ssl_engine_get_ecdsa(br_ssl_engine_context *cc)
|
||||
{
|
||||
return cc->iecdsa;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Set the I/O buffer for the SSL engine.
|
||||
*
|
||||
|
|
@ -2457,6 +2576,17 @@ br_ssl_client_set_rsapub(br_ssl_client_context *cc, br_rsa_public irsapub)
|
|||
cc->irsapub = irsapub;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Set the "default" RSA implementation for public-key operations.
|
||||
*
|
||||
* This sets the RSA implementation in the client context (for encrypting
|
||||
* the pre-master secret, in `TLS_RSA_*` cipher suites) to the fastest
|
||||
* available on the current platform.
|
||||
*
|
||||
* \param cc client context.
|
||||
*/
|
||||
void br_ssl_client_set_default_rsapub(br_ssl_client_context *cc);
|
||||
|
||||
/**
|
||||
* \brief Set the minimum ClientHello length (RFC 7685 padding).
|
||||
*
|
||||
|
|
@ -3165,8 +3295,9 @@ struct br_ssl_server_context_ {
|
|||
* 3 = TLS 1.2 with SHA-384
|
||||
* -- character 3: encryption
|
||||
* a = AES/CBC
|
||||
* g = AES/GCM
|
||||
* d = 3DES/CBC
|
||||
* g = AES/GCM
|
||||
* c = ChaCha20+Poly1305
|
||||
*/
|
||||
|
||||
/**
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue