arnaucube
arnaucube/phantom-zonePublic Self-hosted repository
phantom-zone/src/multi_party.rs
src/multi_party.rsRaw
 1use crate::{
 2    backend::VectorOps,
 3    ntt::{self, Ntt},
 4    random::{NewWithSeed, RandomGaussianDist, RandomUniformDist},
 5    utils::TryConvertFrom,
 6    Matrix, Row, RowEntity, RowMut,
 7};
 8
 9fn public_key_share<
10    R: Row + RowMut + RowEntity,
11    S,
12    ModOp: VectorOps<Element = R::Element>,
13    NttOp: Ntt<Element = R::Element>,
14    Rng: RandomGaussianDist<[R::Element], Parameters = R::Element>
15        + NewWithSeed
16        + RandomUniformDist<[R::Element], Parameters = R::Element>,
17>(
18    share_out: &mut R,
19    s_i: &[S],
20    modop: &ModOp,
21    nttop: &NttOp,
22    crp_seed: Rng::Seed,
23    rng: &mut Rng,
24) where
25    R: TryConvertFrom<[S], Parameters = R::Element>,
26{
27    let ring_size = share_out.as_ref().len();
28    assert!(s_i.len() == ring_size);
29
30    let q = modop.modulus();
31
32    // a*s
33    let mut a = R::zeros(ring_size);
34    let mut p_rng = Rng::new_with_seed(crp_seed);
35    RandomUniformDist::random_fill(&mut p_rng, &q, a.as_mut());
36    nttop.forward(a.as_mut());
37    let mut s = R::try_convert_from(s_i, &q);
38    nttop.forward(s.as_mut());
39    modop.elwise_mul_mut(s.as_mut(), a.as_ref());
40    nttop.backward(s.as_mut());
41
42    RandomGaussianDist::random_fill(rng, &q, share_out.as_mut());
43    modop.elwise_add_mut(share_out.as_mut(), s.as_ref()); // s*e + e
44}
45
46fn rlwe_galois_auto_key_share<M: Matrix>() {}