client.rs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. use std::collections::HashMap;
  2. use crate::{poly::*, params::*, discrete_gaussian::*, gadget::*};
  3. pub struct PublicParameters<'a> {
  4. v_packing: Vec<PolyMatrixNTT<'a>>, // Ws
  5. v_expansion_left: Vec<PolyMatrixNTT<'a>>,
  6. v_expansion_right: Vec<PolyMatrixNTT<'a>>,
  7. v_conversion: PolyMatrixNTT<'a>, // V
  8. }
  9. impl<'a> PublicParameters<'a> {
  10. fn init(params: &'a Params) -> Self {
  11. PublicParameters {
  12. v_packing: Vec::new(),
  13. v_expansion_left: Vec::new(),
  14. v_expansion_right: Vec::new(),
  15. v_conversion: PolyMatrixNTT::zero(params, 2, 2 * params.m_conv())
  16. }
  17. }
  18. }
  19. pub struct Client<'a> {
  20. params: &'a Params,
  21. sk_gsw: PolyMatrixRaw<'a>,
  22. sk_reg: PolyMatrixRaw<'a>,
  23. sk_gsw_full: PolyMatrixRaw<'a>,
  24. sk_reg_full: PolyMatrixRaw<'a>,
  25. dg: DiscreteGaussian,
  26. }
  27. fn matrix_with_identity<'a> (p: &PolyMatrixRaw<'a>) -> PolyMatrixRaw<'a> {
  28. assert_eq!(p.cols, 1);
  29. let mut r = PolyMatrixRaw::zero(p.params, p.rows, p.rows + 1);
  30. r.copy_into(p, 0, 0);
  31. r.copy_into(&PolyMatrixRaw::identity(p.params, p.rows, p.rows), 0, 1);
  32. r
  33. }
  34. impl<'a> Client<'a> {
  35. pub fn init(params: &'a Params) -> Self {
  36. let sk_gsw_dims = params.get_sk_gsw();
  37. let sk_reg_dims = params.get_sk_reg();
  38. let sk_gsw = PolyMatrixRaw::zero(params, sk_gsw_dims.0, sk_gsw_dims.1);
  39. let sk_reg = PolyMatrixRaw::zero(params, sk_reg_dims.0, sk_reg_dims.1);
  40. let sk_gsw_full = matrix_with_identity(&sk_gsw);
  41. let sk_reg_full = matrix_with_identity(&sk_reg);
  42. let dg = DiscreteGaussian::init(params);
  43. Self {
  44. params,
  45. sk_gsw,
  46. sk_reg,
  47. sk_gsw_full,
  48. sk_reg_full,
  49. dg,
  50. }
  51. }
  52. fn get_fresh_gsw_public_key(&mut self, m: usize) -> PolyMatrixRaw<'a> {
  53. let params = self.params;
  54. let n = params.n;
  55. let a = PolyMatrixRaw::random(params, 1, m);
  56. let e = PolyMatrixRaw::noise(params, n, m, &mut self.dg);
  57. let a_inv = -&a;
  58. let b_p = &self.sk_gsw.ntt() * &a.ntt();
  59. let b = &e.ntt() + &b_p;
  60. let p = stack(&a_inv, &b.raw());
  61. p
  62. }
  63. fn encrypt_matrix_gsw(&mut self, ag: PolyMatrixNTT<'a>) -> PolyMatrixNTT<'a> {
  64. let params = self.params;
  65. let mx = ag.cols;
  66. let p = self.get_fresh_gsw_public_key(mx);
  67. let res = &(p.ntt()) + &(ag.pad_top(1));
  68. res
  69. }
  70. pub fn generate_keys(&mut self) -> PublicParameters {
  71. let params = self.params;
  72. self.dg.sample_matrix(&mut self.sk_gsw);
  73. self.dg.sample_matrix(&mut self.sk_reg);
  74. self.sk_gsw_full = matrix_with_identity(&self.sk_gsw);
  75. self.sk_reg_full = matrix_with_identity(&self.sk_reg);
  76. let sk_reg_ntt = to_ntt_alloc(&self.sk_reg);
  77. let m_conv = params.m_conv();
  78. let mut pp = PublicParameters::init(params);
  79. // Params for packing
  80. let gadget_conv = build_gadget(params, 1, m_conv);
  81. let gadget_conv_ntt = to_ntt_alloc(&gadget_conv);
  82. for i in 0..params.n {
  83. let scaled = scalar_multiply_alloc(&sk_reg_ntt, &gadget_conv_ntt);
  84. let mut ag = PolyMatrixNTT::zero(params, params.n, m_conv);
  85. ag.copy_into(&scaled, i, 0);
  86. let w = self.encrypt_matrix_gsw(ag);
  87. pp.v_packing.push(w);
  88. }
  89. // Params for expansion
  90. // Params for converison
  91. pp
  92. }
  93. // fn generate_query(&self) -> Query<'a, Params>;
  94. }