phantom-zone/src/multi_party.rs
src/multi_party.rsRaw
1use crate::{
2 backend::VectorOps,
3 ntt::Ntt,
4 random::{NewWithSeed, RandomGaussianDist, RandomUniformDist},
5 utils::TryConvertFrom,
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>,
13 NttOp: Ntt<Element = R::Element>,
14 Rng: RandomGaussianDist<[R::Element], Parameters = R::Element>,
15 PRng: RandomUniformDist<[R::Element], Parameters = R::Element>,
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: TryConvertFrom<[S], Parameters = R::Element>,
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 RandomUniformDist::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 RandomGaussianDist::random_fill(rng, &q, share_out.as_mut());
46 modop.elwise_add_mut(share_out.as_mut(), s.as_ref()); // s*e + e
47}