use alloc::vec::Vec;
use crate::error::CryptoError;
pub use aead::{Aead, AeadCore, AeadInPlace, KeyInit};
pub trait CryptoAead: Aead {}
pub trait SymmetricEncryption {
fn encrypt<K: AsRef<[u8]>, P: AsRef<[u8]>>(
&self,
key: K,
iv: Option<&[u8]>,
plaintext: P,
) -> Result<Vec<u8>, CryptoError>;
fn decrypt<K: AsRef<[u8]>, C: AsRef<[u8]>>(&self, key: K, ciphertext: C) -> Result<Vec<u8>, CryptoError>;
fn key_size(&self) -> usize;
fn block_size(&self) -> usize;
}
pub trait AsymmetricEncryption {
fn encrypt<P: AsRef<[u8]>>(&self, plaintext: P) -> Result<Vec<u8>, CryptoError>;
fn decrypt<C: AsRef<[u8]>>(&self, cipher_text: C) -> Result<Vec<u8>, CryptoError>;
}
pub trait KeyGeneration {
type Error;
fn generate_random() -> Result<Self, Self::Error>
where
Self: Sized;
}
pub trait NonceGeneration {
type Nonce: AsRef<[u8]>;
fn generate_nonce() -> Self::Nonce;
fn nonce_size() -> usize;
}
pub trait KeyExchange {
type PublicKey;
type SharedSecret: AsRef<[u8]>;
fn ecdh(&self, other_public_key: &Self::PublicKey) -> Result<Self::SharedSecret, CryptoError>;
fn key_exchange<K: AsRef<[u8]>>(&self, their_public_key: K) -> Result<Self::SharedSecret, CryptoError>;
fn derive_aead_key<A>(&self, shared_secret: &Self::SharedSecret) -> Result<A, CryptoError>
where
A: KeyInit;
}