arnaucube
arnaucube/phantom-zonePublic Self-hosted repository
phantom-zone/src/bool/mod.rs
src/bool/mod.rsRaw
  1pub(crate) mod evaluator;
  2pub(crate) mod keys;
  3pub mod noise;
  4pub(crate) mod parameters;
  5
  6pub type FheBool = Vec<u64>;
  7
  8use std::{cell::RefCell, sync::OnceLock};
  9
 10use evaluator::*;
 11use keys::*;
 12use parameters::*;
 13
 14use crate::{
 15    backend::ModularOpsU64,
 16    ntt::NttBackendU64,
 17    random::{DefaultSecureRng, NewWithSeed},
 18    utils::{Global, WithLocal},
 19};
 20
 21thread_local! {
 22    static BOOL_EVALUATOR: RefCell<BoolEvaluator<Vec<Vec<u64>>, NttBackendU64, ModularOpsU64<CiphertextModulus<u64>>,  ModularOpsU64<CiphertextModulus<u64>>>> = RefCell::new(BoolEvaluator::new(MP_BOOL_PARAMS));
 23
 24}
 25static BOOL_SERVER_KEY: OnceLock<
 26    ServerKeyEvaluationDomain<Vec<Vec<u64>>, DefaultSecureRng, NttBackendU64>,
 27> = OnceLock::new();
 28
 29static MULTI_PARTY_CRS: OnceLock<MultiPartyCrs<[u8; 32]>> = OnceLock::new();
 30
 31pub fn set_parameter_set(parameter: &BoolParameters<u64>) {
 32    BoolEvaluator::with_local_mut(|e| *e = BoolEvaluator::new(parameter.clone()))
 33}
 34
 35pub fn set_mp_seed(seed: [u8; 32]) {
 36    assert!(
 37        MULTI_PARTY_CRS.set(MultiPartyCrs { seed: seed }).is_ok(),
 38        "Attempted to set MP SEED twice."
 39    )
 40}
 41
 42fn set_server_key(key: ServerKeyEvaluationDomain<Vec<Vec<u64>>, DefaultSecureRng, NttBackendU64>) {
 43    assert!(
 44        BOOL_SERVER_KEY.set(key).is_ok(),
 45        "Attempted to set server key twice."
 46    );
 47}
 48
 49pub(crate) fn gen_keys() -> (
 50    ClientKey,
 51    SeededServerKey<Vec<Vec<u64>>, BoolParameters<u64>, [u8; 32]>,
 52) {
 53    BoolEvaluator::with_local_mut(|e| {
 54        let ck = e.client_key();
 55        let sk = e.server_key(&ck);
 56
 57        (ck, sk)
 58    })
 59}
 60
 61pub fn gen_client_key() -> ClientKey {
 62    BoolEvaluator::with_local(|e| e.client_key())
 63}
 64
 65pub fn gen_mp_keys_phase1(
 66    ck: &ClientKey,
 67) -> CommonReferenceSeededCollectivePublicKeyShare<Vec<u64>, [u8; 32], BoolParameters<u64>> {
 68    let seed = MultiPartyCrs::global().public_key_share_seed::<DefaultSecureRng>();
 69    BoolEvaluator::with_local(|e| {
 70        let pk_share = e.multi_party_public_key_share(seed, &ck);
 71        pk_share
 72    })
 73}
 74
 75pub fn gen_mp_keys_phase2<R, ModOp>(
 76    ck: &ClientKey,
 77    pk: &PublicKey<Vec<Vec<u64>>, R, ModOp>,
 78) -> CommonReferenceSeededMultiPartyServerKeyShare<Vec<Vec<u64>>, BoolParameters<u64>, [u8; 32]> {
 79    let seed = MultiPartyCrs::global().server_key_share_seed::<DefaultSecureRng>();
 80    BoolEvaluator::with_local_mut(|e| {
 81        let server_key_share = e.multi_party_server_key_share(seed, pk.key(), ck);
 82        server_key_share
 83    })
 84}
 85
 86pub fn aggregate_public_key_shares(
 87    shares: &[CommonReferenceSeededCollectivePublicKeyShare<
 88        Vec<u64>,
 89        [u8; 32],
 90        BoolParameters<u64>,
 91    >],
 92) -> PublicKey<Vec<Vec<u64>>, DefaultSecureRng, ModularOpsU64<CiphertextModulus<u64>>> {
 93    PublicKey::from(shares)
 94}
 95
 96pub fn aggregate_server_key_shares(
 97    shares: &[CommonReferenceSeededMultiPartyServerKeyShare<
 98        Vec<Vec<u64>>,
 99        BoolParameters<u64>,
100        [u8; 32],
101    >],
102) -> SeededMultiPartyServerKey<Vec<Vec<u64>>, [u8; 32], BoolParameters<u64>> {
103    BoolEvaluator::with_local(|e| e.aggregate_multi_party_server_key_shares(shares))
104}
105
106// SERVER KEY EVAL DOMAIN //
107impl SeededServerKey<Vec<Vec<u64>>, BoolParameters<u64>, [u8; 32]> {
108    pub fn set_server_key(&self) {
109        set_server_key(ServerKeyEvaluationDomain::<
110            _,
111            DefaultSecureRng,
112            NttBackendU64,
113        >::from(self));
114    }
115}
116
117impl
118    SeededMultiPartyServerKey<
119        Vec<Vec<u64>>,
120        <DefaultSecureRng as NewWithSeed>::Seed,
121        BoolParameters<u64>,
122    >
123{
124    pub fn set_server_key(&self) {
125        set_server_key(ServerKeyEvaluationDomain::<
126            Vec<Vec<u64>>,
127            DefaultSecureRng,
128            NttBackendU64,
129        >::from(self))
130    }
131}
132
133impl Global for ServerKeyEvaluationDomain<Vec<Vec<u64>>, DefaultSecureRng, NttBackendU64> {
134    fn global() -> &'static Self {
135        BOOL_SERVER_KEY.get().unwrap()
136    }
137}
138
139//  MULTIPARTY CRS  //
140impl Global for MultiPartyCrs<[u8; 32]> {
141    fn global() -> &'static Self {
142        MULTI_PARTY_CRS
143            .get()
144            .expect("Multi Party Common Reference String not set")
145    }
146}
147
148// BOOL EVALUATOR //
149impl WithLocal
150    for BoolEvaluator<
151        Vec<Vec<u64>>,
152        NttBackendU64,
153        ModularOpsU64<CiphertextModulus<u64>>,
154        ModularOpsU64<CiphertextModulus<u64>>,
155    >
156{
157    fn with_local<F, R>(func: F) -> R
158    where
159        F: Fn(&Self) -> R,
160    {
161        BOOL_EVALUATOR.with_borrow(|s| func(s))
162    }
163
164    fn with_local_mut<F, R>(func: F) -> R
165    where
166        F: Fn(&mut Self) -> R,
167    {
168        BOOL_EVALUATOR.with_borrow_mut(|s| func(s))
169    }
170
171    fn with_local_mut_mut<F, R>(func: &mut F) -> R
172    where
173        F: FnMut(&mut Self) -> R,
174    {
175        BOOL_EVALUATOR.with_borrow_mut(|s| func(s))
176    }
177}