use std::fmt::Debug;
use snarkvm_algorithms::traits::EncryptionScheme;
use snarkvm_r1cs::{errors::SynthesisError, ConstraintSystem};
use crate::{
bits::ToBytesGadget,
traits::{alloc::AllocGadget, eq::EqGadget},
UInt8,
};
use snarkvm_fields::PrimeField;
pub trait EncryptionGadget<E: EncryptionScheme, F: PrimeField>: AllocGadget<E, F> + Clone {
type CiphertextRandomizer: AllocGadget<<E as EncryptionScheme>::CiphertextRandomizer, F>
+ EqGadget<F>
+ ToBytesGadget<F>
+ Clone
+ Sized
+ Debug;
type PrivateKeyGadget: AllocGadget<<E as EncryptionScheme>::PrivateKey, F>
+ ToBytesGadget<F>
+ Clone
+ Sized
+ Debug;
type PublicKeyGadget: AllocGadget<<E as EncryptionScheme>::PublicKey, F>
+ EqGadget<F>
+ ToBytesGadget<F>
+ Clone
+ Sized
+ Debug;
type ScalarRandomnessGadget: AllocGadget<E::ScalarRandomness, F> + Clone + Sized + Debug;
type SymmetricKeyGadget: AllocGadget<<E as EncryptionScheme>::SymmetricKey, F>
+ ToBytesGadget<F>
+ Clone
+ Sized
+ Debug;
type SymmetricKeyCommitmentGadget: AllocGadget<<E as EncryptionScheme>::SymmetricKey, F>
+ ToBytesGadget<F>
+ Clone
+ Sized
+ Debug;
fn check_public_key_gadget<CS: ConstraintSystem<F>>(
&self,
cs: CS,
private_key: &Self::PrivateKeyGadget,
) -> Result<Self::PublicKeyGadget, SynthesisError>;
fn check_symmetric_key_commitment<CS: ConstraintSystem<F>>(
&self,
cs: CS,
symmetric_key: &Self::SymmetricKeyGadget,
) -> Result<Self::SymmetricKeyCommitmentGadget, SynthesisError>;
fn check_encryption_from_scalar_randomness<CS: ConstraintSystem<F>>(
&self,
cs: CS,
randomness: &Self::ScalarRandomnessGadget,
public_key: &Self::PublicKeyGadget,
input: &[UInt8],
) -> Result<(Self::CiphertextRandomizer, Vec<UInt8>, Self::SymmetricKeyGadget), SynthesisError>;
fn check_encryption_from_symmetric_key<CS: ConstraintSystem<F>>(
&self,
cs: CS,
symmetric_key: &Self::SymmetricKeyGadget,
plaintext: &[UInt8],
) -> Result<Vec<UInt8>, SynthesisError>;
fn check_encryption_from_ciphertext_randomizer<CS: ConstraintSystem<F>>(
&self,
cs: CS,
ciphertext_randomizer: &Self::CiphertextRandomizer,
private_key: &Self::PrivateKeyGadget,
message: &[UInt8],
) -> Result<Vec<UInt8>, SynthesisError>;
}