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