//! Implementation of Sequoia crypto API using the Nettle cryptographic library. use crate::types::*; use nettle::random::{Random, Yarrow}; 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: Once we depend on nettle-rs 7.1, add cv448 feature // XXX: Once we depend on nettle-rs 7.2, add nettle::version "Nettle".to_string() } /// Fills the given buffer with random data. pub fn random(buf: &mut [u8]) { Yarrow::default().random(buf); } 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, } } }