|
@ -77,6 +77,7 @@ mod impl_bool_frontend { |
|
|
/// Fhe Bool ciphertext
|
|
|
/// Fhe Bool ciphertext
|
|
|
#[derive(Clone)]
|
|
|
#[derive(Clone)]
|
|
|
pub struct FheBool<C> {
|
|
|
pub struct FheBool<C> {
|
|
|
|
|
|
/// LWE bool ciphertext
|
|
|
pub(crate) data: C,
|
|
|
pub(crate) data: C,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
@ -101,11 +102,11 @@ mod impl_bool_frontend { |
|
|
c: &FheBool<C>,
|
|
|
c: &FheBool<C>,
|
|
|
shares: &[Self::DecryptionShare],
|
|
|
shares: &[Self::DecryptionShare],
|
|
|
) -> bool {
|
|
|
) -> bool {
|
|
|
self.aggregate_decryption_shares(&c.data, shares)
|
|
|
|
|
|
|
|
|
self.aggregate_decryption_shares(&c.data(), shares)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
fn gen_decryption_share(&self, c: &FheBool<C>) -> Self::DecryptionShare {
|
|
|
fn gen_decryption_share(&self, c: &FheBool<C>) -> Self::DecryptionShare {
|
|
|
self.gen_decryption_share(&c.data)
|
|
|
|
|
|
|
|
|
self.gen_decryption_share(&c.data())
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
@ -192,6 +193,35 @@ mod impl_bool_frontend { |
|
|
})
|
|
|
})
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
impl FheBool {
|
|
|
|
|
|
pub fn nand(&self, rhs: &Self) -> Self {
|
|
|
|
|
|
BoolEvaluator::with_local_mut(|e| {
|
|
|
|
|
|
let key = RuntimeServerKey::global();
|
|
|
|
|
|
FheBool {
|
|
|
|
|
|
data: e.nand(self.data(), rhs.data(), key),
|
|
|
|
|
|
}
|
|
|
|
|
|
})
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
pub fn xnor(&self, rhs: &Self) -> Self {
|
|
|
|
|
|
BoolEvaluator::with_local_mut(|e| {
|
|
|
|
|
|
let key = RuntimeServerKey::global();
|
|
|
|
|
|
FheBool {
|
|
|
|
|
|
data: e.xnor(self.data(), rhs.data(), key),
|
|
|
|
|
|
}
|
|
|
|
|
|
})
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
pub fn nor(&self, rhs: &Self) -> Self {
|
|
|
|
|
|
BoolEvaluator::with_local_mut(|e| {
|
|
|
|
|
|
let key = RuntimeServerKey::global();
|
|
|
|
|
|
FheBool {
|
|
|
|
|
|
data: e.nor(self.data(), rhs.data(), key),
|
|
|
|
|
|
}
|
|
|
|
|
|
})
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|