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