//! Implementation of crypto primitives using the Windows CNG (Cryptographic API: Next Generation). use crate::types::*; use win_crypto_ng::random::RandomNumberGenerator; pub mod aead; pub mod asymmetric; pub mod ecdh; pub mod hash; pub mod symmetric; /// Returns a short, human-readable description of the backend. pub fn backend() -> String { // XXX: can we include features and the version? "Windows CNG".to_string() } /// Fills the given buffer with random data. pub fn random(buf: &mut [u8]) { RandomNumberGenerator::system_preferred() .gen_random(buf) .expect("system-preferred RNG not to fail") } impl PublicKeyAlgorithm { pub(crate) fn is_supported_by_backend(&self) -> bool { use PublicKeyAlgorithm::*; #[allow(deprecated)] match &self { RSAEncryptSign | RSAEncrypt | RSASign | DSA | ECDH | ECDSA | EdDSA => true, ElGamalEncrypt | ElGamalEncryptSign | Private(_) | Unknown(_) => false, } } } impl Curve { pub(crate) fn is_supported_by_backend(&self) -> bool { use self::Curve::*; match &self { NistP256 | NistP384 | NistP521 | Ed25519 | Cv25519 => true, BrainpoolP256 | BrainpoolP512 | Unknown(_) => false, } } } impl AEADAlgorithm { /// Returns the best AEAD mode supported by the backend. /// /// This SHOULD return OCB, which is the mandatory-to-implement /// algorithm and the most performing one, but fall back to any /// supported algorithm. pub(crate) const fn const_default() -> AEADAlgorithm { AEADAlgorithm::EAX } pub(crate) fn is_supported_by_backend(&self) -> bool { use self::AEADAlgorithm::*; match &self { EAX => true, OCB | Private(_) | Unknown(_) => false, } } #[cfg(test)] pub(crate) fn supports_symmetric_algo(&self, algo: &SymmetricAlgorithm) -> bool { match &self { AEADAlgorithm::EAX => match algo { SymmetricAlgorithm::AES128 | SymmetricAlgorithm::AES192 | SymmetricAlgorithm::AES256 | SymmetricAlgorithm::Twofish | SymmetricAlgorithm::Camellia128 | SymmetricAlgorithm::Camellia192 | SymmetricAlgorithm::Camellia256 => true, _ => false, }, _ => false } } }