#![doc = include_str!("../README.md")]
use rustls::crypto::{CryptoProvider, GetRandomFailed, SecureRandom, SupportedKxGroup};
use rustls::SupportedCipherSuite;
use symcrypt::symcrypt_random;
mod cipher_suites;
mod ecdh;
mod hash;
mod hmac;
mod signer;
mod tls12;
mod tls13;
mod verify;
use crate::verify::SUPPORTED_SIG_ALGS;
pub use cipher_suites::{TLS13_AES_128_GCM_SHA256, TLS13_AES_256_GCM_SHA384};
pub use cipher_suites::{
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
};
#[cfg(feature = "chacha")]
pub use cipher_suites::{
TLS13_CHACHA20_POLY1305_SHA256, TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256,
TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256,
};
pub use ecdh::{SECP256R1, SECP384R1};
#[cfg(feature = "x25519")]
pub use ecdh::X25519;
pub fn default_symcrypt_provider() -> CryptoProvider {
CryptoProvider {
cipher_suites: DEFAULT_CIPHER_SUITES.to_vec(),
kx_groups: ecdh::ALL_KX_GROUPS.to_vec(),
signature_verification_algorithms: SUPPORTED_SIG_ALGS,
secure_random: &SymCrypt,
key_provider: &signer::SymCryptProvider,
}
}
pub fn custom_symcrypt_provider(
provided_cipher_suites: Option<Vec<SupportedCipherSuite>>,
provided_kx_group: Option<Vec<&'static dyn SupportedKxGroup>>,
) -> CryptoProvider {
let cipher_suites = match provided_cipher_suites {
Some(suites) if !suites.is_empty() => suites, _ => DEFAULT_CIPHER_SUITES.to_vec(), };
let kx_group = match provided_kx_group {
Some(groups) if !groups.is_empty() => groups, _ => ecdh::ALL_KX_GROUPS.to_vec(), };
CryptoProvider {
cipher_suites,
kx_groups: kx_group,
signature_verification_algorithms: SUPPORTED_SIG_ALGS,
secure_random: &SymCrypt,
key_provider: &signer::SymCryptProvider,
}
}
pub static DEFAULT_CIPHER_SUITES: &[SupportedCipherSuite] = ALL_CIPHER_SUITES;
static ALL_CIPHER_SUITES: &[SupportedCipherSuite] = &[
TLS13_AES_256_GCM_SHA384,
TLS13_AES_128_GCM_SHA256,
#[cfg(feature = "chacha")]
TLS13_CHACHA20_POLY1305_SHA256,
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
#[cfg(feature = "chacha")]
TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256,
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
#[cfg(feature = "chacha")]
TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256,
];
#[derive(Debug)]
struct SymCrypt;
impl SecureRandom for SymCrypt {
fn fill(&self, buf: &mut [u8]) -> Result<(), GetRandomFailed> {
symcrypt_random(buf);
Ok(())
}
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn test_secure_random() {
let random = SymCrypt;
let mut buff_1 = [0u8; 10];
let mut buff_2 = [0u8; 10];
let _ = random.fill(&mut buff_1);
let _ = random.fill(&mut buff_2);
assert_ne!(buff_1, buff_2);
}
}