1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
use crate::EncryptionError;
use snarkvm_utilities::{rand::UniformRand, FromBytes, ToBits, ToBytes};
use rand::{CryptoRng, Rng};
use std::{fmt::Debug, hash::Hash};
pub trait EncryptionScheme:
Sized + ToBytes + FromBytes + Debug + Clone + Eq + From<<Self as EncryptionScheme>::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;
}