//! Implementation of Sequoia crypto API using the Botan cryptographic library. use crate::types::*; pub mod aead; pub mod asymmetric; pub mod ecdh; pub mod hash; pub mod symmetric; pub struct Backend(()); impl super::interface::Backend for Backend { fn backend() -> String { "Botan".to_string() } fn random(buf: &mut [u8]) -> crate::Result<()> { let mut rng = botan::RandomNumberGenerator::new_system()?; rng.fill(buf)?; Ok(()) } } 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::OCB } pub(crate) fn is_supported_by_backend(&self) -> bool { use self::AEADAlgorithm::*; match &self { EAX | OCB | GCM => true, 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, }, AEADAlgorithm::OCB => match algo { SymmetricAlgorithm::AES128 | SymmetricAlgorithm::AES192 | SymmetricAlgorithm::AES256 | SymmetricAlgorithm::Twofish | SymmetricAlgorithm::Camellia128 | SymmetricAlgorithm::Camellia192 | SymmetricAlgorithm::Camellia256 => true, _ => false, }, _ => false } } }