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