use std::convert::Infallible;
use tfhe_versionable::{Upgrade, Version, VersionsDispatch};
use super::parameters::compact_public_key_only::CompactPublicKeyEncryptionParameters;
use super::parameters::{
AtomicPatternKind, CompactCiphertextListExpansionKind, DynamicDistribution, PBSOrder,
SupportedCompactPkeZkScheme,
};
use super::prelude::*;
#[derive(Version)]
pub enum CompactCiphertextListExpansionKindV0 {
RequiresCasting,
NoCasting(PBSOrder),
}
impl Upgrade<CompactCiphertextListExpansionKind> for CompactCiphertextListExpansionKindV0 {
type Error = Infallible;
fn upgrade(self) -> Result<CompactCiphertextListExpansionKind, Self::Error> {
match self {
Self::RequiresCasting => Ok(CompactCiphertextListExpansionKind::RequiresCasting),
Self::NoCasting(pbs_order) => Ok(CompactCiphertextListExpansionKind::NoCasting(
AtomicPatternKind::Standard(pbs_order),
)),
}
}
}
#[derive(VersionsDispatch)]
pub enum CompactCiphertextListExpansionKindVersions {
V0(CompactCiphertextListExpansionKindV0),
V1(CompactCiphertextListExpansionKind),
}
#[derive(Version)]
pub struct CompactPublicKeyEncryptionParametersV0 {
pub encryption_lwe_dimension: LweDimension,
pub encryption_noise_distribution: DynamicDistribution<u64>,
pub message_modulus: MessageModulus,
pub carry_modulus: CarryModulus,
pub ciphertext_modulus: CiphertextModulus,
pub expansion_kind: CompactCiphertextListExpansionKind,
}
impl Upgrade<CompactPublicKeyEncryptionParameters> for CompactPublicKeyEncryptionParametersV0 {
type Error = Infallible;
fn upgrade(self) -> Result<CompactPublicKeyEncryptionParameters, Self::Error> {
Ok(CompactPublicKeyEncryptionParameters {
encryption_lwe_dimension: self.encryption_lwe_dimension,
encryption_noise_distribution: self.encryption_noise_distribution,
message_modulus: self.message_modulus,
carry_modulus: self.carry_modulus,
ciphertext_modulus: self.ciphertext_modulus,
expansion_kind: self.expansion_kind,
zk_scheme: SupportedCompactPkeZkScheme::V1,
})
}
}
#[derive(VersionsDispatch)]
pub enum CompactPublicKeyEncryptionParametersVersions {
V0(CompactPublicKeyEncryptionParametersV0),
V1(CompactPublicKeyEncryptionParameters),
}