Skip to content

Commit cd97177

Browse files
committed
use polymul_fast
Use polymul_fast function from ring_lwe for dot product and matrix multiplication. Also, decrypt function updated to use paramters as input.
1 parent 8d14f79 commit cd97177

File tree

6 files changed

+30
-23
lines changed

6 files changed

+30
-23
lines changed

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,5 @@ polynomial-ring = "0.5.0"
1313
num-traits = "=0.2.19"
1414
rand = "0.8.5"
1515
rand_distr = "0.4.3"
16+
ntt = "0.1.9"
1617
ring-lwe = "0.1.5"

src/decrypt.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,17 @@ use crate::utils::{Parameters,mul_vec_simple};
1818
/// let mut m_b = vec![0,1,0,1,0,0,1,1,1,0,1];
1919
/// m_b.resize(params.n, 0);
2020
/// let (u, v) = module_lwe::encrypt::encrypt(&pk.0, &pk.1, &m_b, &params, None);
21-
/// let decrypted_coeffs = module_lwe::decrypt::decrypt(&sk, params.q, &params.f, &u, &v);
21+
/// let decrypted_coeffs = module_lwe::decrypt::decrypt(&sk, &u, &v, &params);
2222
/// assert_eq!(m_b, decrypted_coeffs);
2323
/// ```
2424
pub fn decrypt(
2525
sk: &Vec<Polynomial<i64>>, //secret key
26-
q: i64, //ciphertext modulus
27-
f: &Polynomial<i64>, //polynomial modulus
2826
u: &Vec<Polynomial<i64>>, //ciphertext vector
29-
v: &Polynomial<i64> //ciphertext polynomial
27+
v: &Polynomial<i64> , //ciphertext polynomial
28+
params: &Parameters
3029
) -> Vec<i64> {
31-
let scaled_pt = polysub(&v, &mul_vec_simple(&sk, &u, q, &f), q, f); //Compute v-sk*u mod q
30+
let (q, f, omega) = (params.q, &params.f, params.omega); //get parameters
31+
let scaled_pt = polysub(&v, &mul_vec_simple(&sk, &u, q, &f, omega), q, f); //Compute v-sk*u mod q
3232
let half_q = nearest_int(q,2); // compute nearest integer to q/2
3333
let mut decrypted_coeffs = vec![];
3434
let mut s;
@@ -49,7 +49,7 @@ pub fn decrypt(
4949
pub fn decrypt_string(sk_string: &String, ciphertext_string: &String, params: &Parameters) -> String {
5050

5151
//get parameters
52-
let (n, q, k, f) = (params.n, params.q, params.k, &params.f);
52+
let (n, k) = (params.n, params.k);
5353

5454
// Convert the secret key string into a Vec<Polynomial<i64>>
5555
let sk_array: Vec<i64> = sk_string.split(',')
@@ -79,7 +79,7 @@ pub fn decrypt_string(sk_string: &String, ciphertext_string: &String, params: &P
7979
let v = Polynomial::new(v_array.to_vec());
8080

8181
// Decrypt the ciphertext
82-
let mut m_b = decrypt(&sk, q, &f, &u, &v);
82+
let mut m_b = decrypt(&sk, &u, &v, &params);
8383
m_b.resize(n,0);
8484

8585
message_binary.extend(m_b);

src/encrypt.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ pub fn encrypt(
2727
) -> (Vec<Polynomial<i64>>, Polynomial<i64>) {
2828

2929
//get parameters
30-
let (n, q, k, f) = (params.n, params.q, params.k, &params.f);
30+
let (n, q, k, f, omega) = (params.n, params.q, params.k, &params.f, params.omega);
3131

3232
//generate random ephermal keys
3333
let r = gen_small_vector(n, k, seed);
@@ -41,10 +41,10 @@ pub fn encrypt(
4141
let m = Polynomial::new(vec![half_q])*Polynomial::new(m_b.to_vec());
4242

4343
// Compute u = a^T * r + e_1 mod q
44-
let u = add_vec(&mul_mat_vec_simple(&transpose(a), &r, q, f), &e1, q, f);
44+
let u = add_vec(&mul_mat_vec_simple(&transpose(a), &r, q, f, omega), &e1, q, f);
4545

4646
// Compute v = t * r + e_2 - m mod q
47-
let v = polysub(&polyadd(&mul_vec_simple(t, &r, q, &f), &e2, q, f), &m, q, f);
47+
let v = polysub(&polyadd(&mul_vec_simple(t, &r, q, &f, omega), &e2, q, f), &m, q, f);
4848

4949
(u, v)
5050
}

src/keygen.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,12 @@ pub fn keygen(
1717
params: &Parameters,
1818
seed: Option<u64> //random seed
1919
) -> ((Vec<Vec<Polynomial<i64>>>, Vec<Polynomial<i64>>), Vec<Polynomial<i64>>) {
20-
let (n,q,k,f) = (params.n, params.q, params.k, &params.f);
20+
let (n,q,k,f,omega) = (params.n, params.q, params.k, &params.f, params.omega);
2121
//Generate a public and secret key
2222
let a = gen_uniform_matrix(n, k, q, seed);
2323
let sk = gen_small_vector(n, k, seed);
2424
let e = gen_small_vector(n, k, seed);
25-
let t = add_vec(&mul_mat_vec_simple(&a, &sk, q, &f), &e, q, &f);
25+
let t = add_vec(&mul_mat_vec_simple(&a, &sk, q, &f, omega), &e, q, &f);
2626

2727
//Return public key (a, t) and secret key (sk) as a 2-tuple
2828
((a, t), sk)

src/test.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ mod tests {
4949
let ciphertext_sum = (add_vec(&u.0,&v.0,q,f), polyadd(&u.1,&v.1,q,f));
5050

5151
// Decrypt ciphertext sum u+v
52-
let mut decrypted_sum = decrypt(&sk, q, f, &ciphertext_sum.0, &ciphertext_sum.1);
52+
let mut decrypted_sum = decrypt(&sk, &ciphertext_sum.0, &ciphertext_sum.1, &params);
5353
decrypted_sum.resize(n, 0);
5454

5555
assert_eq!(decrypted_sum, plaintext_sum, "test failed: {:?} != {:?}", decrypted_sum, plaintext_sum);

src/utils.rs

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ use polynomial_ring::Polynomial;
22
use rand_distr::{Uniform, Distribution};
33
use rand::SeedableRng;
44
use rand::rngs::StdRng;
5-
use ring_lwe::utils::{polyadd, polymul, gen_uniform_poly};
5+
use ring_lwe::utils::{polyadd, polymul_fast, gen_uniform_poly};
6+
use ntt::omega;
67

78
#[derive(Debug)]
89
/// default parameters for module-LWE
@@ -11,23 +12,26 @@ pub struct Parameters {
1112
pub n: usize,
1213
/// Ciphertext modulus
1314
pub q: i64,
14-
/// Plaintext modulus
15-
pub k: usize,
15+
/// Module rank
16+
pub k: usize,
17+
/// 2n-th root of unity
18+
pub omega: i64,
1619
/// Polynomial modulus
17-
pub f: Polynomial<i64>,
20+
pub f: Polynomial<i64>,
1821
}
1922

2023
/// default parameters for module-LWE
2124
impl Default for Parameters {
2225
fn default() -> Self {
2326
let n = 32;
24-
let q = 59049;
27+
let q = 12289;
2528
let k = 8;
29+
let omega = omega(q, 2*n);
2630
let mut poly_vec = vec![0i64;n+1];
2731
poly_vec[0] = 1;
2832
poly_vec[n] = 1;
2933
let f = Polynomial::new(poly_vec);
30-
Parameters { n, q, k, f }
34+
Parameters { n, q, k, omega, f }
3135
}
3236
}
3337

@@ -54,13 +58,14 @@ pub fn add_vec(v0: &Vec<Polynomial<i64>>, v1: &Vec<Polynomial<i64>>, modulus: i6
5458
/// * `v1` - vector of polynomials
5559
/// * `modulus` - modulus
5660
/// * `poly_mod` - polynomial modulus
61+
/// * `omega` - 2nth root of unity
5762
/// # Returns
5863
/// * `result` - polynomial
59-
pub fn mul_vec_simple(v0: &Vec<Polynomial<i64>>, v1: &Vec<Polynomial<i64>>, modulus: i64, poly_mod: &Polynomial<i64>) -> Polynomial<i64> {
64+
pub fn mul_vec_simple(v0: &Vec<Polynomial<i64>>, v1: &Vec<Polynomial<i64>>, modulus: i64, poly_mod: &Polynomial<i64>, omega: i64) -> Polynomial<i64> {
6065
assert!(v0.len() == v1.len());
6166
let mut result = Polynomial::new(vec![]);
6267
for i in 0..v0.len() {
63-
result = polyadd(&result, &polymul(&v0[i], &v1[i], modulus, &poly_mod), modulus, &poly_mod);
68+
result = polyadd(&result, &polymul_fast(&v0[i], &v1[i], modulus, &poly_mod, omega), modulus, &poly_mod);
6469
}
6570
result
6671
}
@@ -71,13 +76,14 @@ pub fn mul_vec_simple(v0: &Vec<Polynomial<i64>>, v1: &Vec<Polynomial<i64>>, modu
7176
/// * `v` - vector of polynomials
7277
/// * `modulus` - modulus
7378
/// * `poly_mod` - polynomial modulus
79+
/// * `omega` - 2nth root of unity
7480
/// # Returns
7581
/// * `result` - vector of polynomials
76-
pub fn mul_mat_vec_simple(m: &Vec<Vec<Polynomial<i64>>>, v: &Vec<Polynomial<i64>>, modulus: i64, poly_mod: &Polynomial<i64>) -> Vec<Polynomial<i64>> {
82+
pub fn mul_mat_vec_simple(m: &Vec<Vec<Polynomial<i64>>>, v: &Vec<Polynomial<i64>>, modulus: i64, poly_mod: &Polynomial<i64>, omega: i64) -> Vec<Polynomial<i64>> {
7783

7884
let mut result = vec![];
7985
for i in 0..m.len() {
80-
result.push(mul_vec_simple(&m[i], &v, modulus, &poly_mod));
86+
result.push(mul_vec_simple(&m[i], &v, modulus, &poly_mod, omega));
8187
}
8288
result
8389
}

0 commit comments

Comments
 (0)