pub trait EncryptionScheme: Sized + ToBytes + FromBytes + Debug + Clone + Eq + From<Self::Parameters> {
type CiphertextRandomizer: Clone + Debug + Default + Eq + Hash + ToBytes + FromBytes + ToBits;
type Parameters: Clone + Debug + Eq;
type PrivateKey: Clone + Debug + Default + Eq + Hash + ToBytes + FromBytes + ToBits + UniformRand;
type PublicKey: Copy + Clone + Debug + Default + Eq + ToBytes + FromBytes;
type ScalarRandomness: Copy + Clone + Debug + Default + Eq + Hash + ToBytes + FromBytes + UniformRand;
type SymmetricKey: Copy + Clone + Debug + Default + Eq + Hash + ToBytes + FromBytes + Send + Sync;
type SymmetricKeyCommitment: Copy + Clone + Debug + Default + Eq + Hash + ToBytes + FromBytes + Send + Sync;
fn setup(message: &str) -> Self;
fn generate_private_key<R: Rng + CryptoRng>(
&self,
rng: &mut R
) -> Self::PrivateKey;
fn generate_public_key(
&self,
private_key: &Self::PrivateKey
) -> Self::PublicKey;
fn generate_asymmetric_key<R: Rng + CryptoRng>(
&self,
public_key: &Self::PublicKey,
rng: &mut R
) -> (Self::ScalarRandomness, Self::CiphertextRandomizer, Self::SymmetricKey);
fn generate_symmetric_key(
&self,
private_key: &Self::PrivateKey,
ciphertext_randomizer: Self::CiphertextRandomizer
) -> Option<Self::SymmetricKey>;
fn generate_symmetric_key_commitment(
&self,
symmetric_key: &Self::SymmetricKey
) -> Self::SymmetricKeyCommitment;
fn encrypt(
&self,
symmetric_key: &Self::SymmetricKey,
message: &[u8]
) -> Result<Vec<u8>, EncryptionError>;
fn decrypt(
&self,
symmetric_key: &Self::SymmetricKey,
ciphertext: &[u8]
) -> Result<Vec<u8>, EncryptionError>;
fn parameters(&self) -> &<Self as EncryptionScheme>::Parameters;
fn private_key_size_in_bits() -> usize;
}