Skip to content

Commit 518fb96

Browse files
Merge pull request #21 from lattice-based-cryptography/ensure_doctests_run
ensure doctests are running
2 parents 2693f9b + 7e832f4 commit 518fb96

File tree

7 files changed

+173
-176
lines changed

7 files changed

+173
-176
lines changed

src/decrypt.rs

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use polynomial_ring::Polynomial;
2-
use module_lwe::{Parameters,mul_vec_simple};
32
use ring_lwe::{polysub,nearest_int};
3+
use crate::utils::{Parameters,mul_vec_simple};
44

55
/// Decrypt a ciphertext
66
/// # Arguments
@@ -13,13 +13,12 @@ use ring_lwe::{polysub,nearest_int};
1313
/// * `decrypted_coeffs` - plaintext vector
1414
/// # Example
1515
/// ```
16-
/// use polynomial_ring::Polynomial;
17-
/// use module_lwe::decrypt;
18-
/// let params = Parameters::default();
19-
/// let (pk,sk) = keygen(&params, None);
20-
/// let m_b = vec![0,1,0,1,1,0,1,0];
21-
/// let (u, v) = encrypt(&pk.0, &pk.1, m_b, &params, None);
22-
/// let decrypted_coeffs = decrypt(&sk, params.q, &params.f, &u, &v);
16+
/// let params = module_lwe::utils::Parameters::default();
17+
/// let (pk,sk) = module_lwe::keygen::keygen(&params, None);
18+
/// let mut m_b = vec![0,1,0,1,0,0,1,1,1,0,1];
19+
/// m_b.resize(params.n, 0);
20+
/// 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);
2322
/// assert_eq!(m_b, decrypted_coeffs);
2423
/// ```
2524
pub fn decrypt(

src/encrypt.rs

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use polynomial_ring::Polynomial;
22
use ring_lwe::{polyadd,polysub,nearest_int};
3-
use module_lwe::{Parameters, add_vec, mul_mat_vec_simple, transpose, mul_vec_simple, gen_small_vector};
3+
use crate::utils::{Parameters, add_vec, mul_mat_vec_simple, transpose, mul_vec_simple, gen_small_vector};
44

55
/// Encrypt a message using the ring-LWE cryptosystem
66
/// # Arguments
@@ -13,17 +13,15 @@ use module_lwe::{Parameters, add_vec, mul_mat_vec_simple, transpose, mul_vec_sim
1313
/// * `(u, v)` - ciphertext
1414
/// # Example
1515
/// ```
16-
/// use module_lwe::Parameters;
17-
/// use module_lwe::encrypt;
18-
/// let params = Parameters::default();
19-
/// let (pk,sk) = keygen(&params, None);
16+
/// let params = module_lwe::utils::Parameters::default();
17+
/// let (pk,sk) = module_lwe::keygen::keygen(&params, None);
2018
/// let m_b = vec![0,1,0,1,1,0,1,0];
21-
/// let (u, v) = encrypt(&pk.0, &pk.1, m_b, &params, None);
19+
/// let (u, v) = module_lwe::encrypt::encrypt(&pk.0, &pk.1, &m_b, &params, None);
2220
/// ```
2321
pub fn encrypt(
2422
a: &Vec<Vec<Polynomial<i64>>>,
2523
t: &Vec<Polynomial<i64>>,
26-
m_b: Vec<i64>,
24+
m_b: &Vec<i64>,
2725
params: &Parameters,
2826
seed: Option<u64>
2927
) -> (Vec<Polynomial<i64>>, Polynomial<i64>) {
@@ -40,7 +38,7 @@ pub fn encrypt(
4038
let half_q = nearest_int(q,2);
4139

4240
// Convert binary message to polynomial
43-
let m = Polynomial::new(vec![half_q])*Polynomial::new(m_b);
41+
let m = Polynomial::new(vec![half_q])*Polynomial::new(m_b.to_vec());
4442

4543
// Compute u = a^T * r + e_1 mod q
4644
let u = add_vec(&mul_mat_vec_simple(&transpose(a), &r, q, f), &e1, q, f);
@@ -61,12 +59,12 @@ pub fn encrypt(
6159
/// * `ciphertext_str` - ciphertext string
6260
/// # Example
6361
/// ```
64-
/// use module_lwe::Parameters;
65-
/// use module_lwe::encrypt_string;
66-
/// let params = Parameters::default();
67-
/// let (pk,sk) = keygen(&params, None);
62+
/// let params = module_lwe::utils::Parameters::default();
63+
/// let keypair = module_lwe::keygen::keygen_string(&params,None);
64+
/// let pk_string = keypair.get("public").unwrap();
65+
/// let sk_string = keypair.get("secret").unwrap();
6866
/// let message_string = "Hello, world!".to_string();
69-
/// let ciphertext_string = encrypt_string(&pk_string, &message_string, &params, None);
67+
/// let ciphertext_string = module_lwe::encrypt::encrypt_string(&pk_string, &message_string, &params, None);
7068
/// ```
7169
pub fn encrypt_string(pk_string: &String, message_string: &String, params: &Parameters, seed: Option<u64>) -> String {
7270

@@ -104,7 +102,7 @@ pub fn encrypt_string(pk_string: &String, message_string: &String, params: &Para
104102
// Encrypt each block
105103
let mut ciphertext_list = vec![];
106104
for block in message_blocks {
107-
let (u, v) = encrypt(&a, &t, block, params, seed);
105+
let (u, v) = encrypt(&a, &t, &block, params, seed);
108106
let u_flattened: Vec<i64> = u.iter()
109107
.flat_map(|poly| {
110108
let mut coeffs = poly.coeffs().to_vec();

src/keygen.rs

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use polynomial_ring::Polynomial;
2-
use module_lwe::{Parameters, add_vec, mul_mat_vec_simple, gen_small_vector, gen_uniform_matrix};
32
use std::collections::HashMap;
3+
use crate::utils::{Parameters, add_vec, mul_mat_vec_simple, gen_small_vector, gen_uniform_matrix};
44

55
/// Generate public and secret keys for the ring-LWE cryptosystem
66
/// # Arguments
@@ -10,10 +10,8 @@ use std::collections::HashMap;
1010
/// * `((a, t), sk)` - public key (a, t) and secret key (sk)
1111
/// # Example
1212
/// ```
13-
/// use module_lwe::Parameters;
14-
/// use module_lwe::keygen;
15-
/// let params = Parameters::default();
16-
/// let (pk, sk) = keygen(&params, None);
13+
/// let params = module_lwe::utils::Parameters::default();
14+
/// let (pk, sk) = module_lwe::keygen::keygen(&params, None);
1715
/// ```
1816
pub fn keygen(
1917
params: &Parameters,
@@ -38,10 +36,8 @@ pub fn keygen(
3836
/// * `keys` - HashMap containing the public and secret keys
3937
/// # Example
4038
/// ```
41-
/// use module_lwe::Parameters;
42-
/// use module_lwe::keygen_string;
43-
/// let params = Parameters::default();
44-
/// let keys = keygen_string(&params, None);
39+
/// let params = module_lwe::utils::Parameters::default();
40+
/// let keys = module_lwe::keygen::keygen_string(&params, None);
4541
/// ```
4642
pub fn keygen_string(params: &Parameters, seed: Option<u64>) -> HashMap<String, String> {
4743

src/lib.rs

Lines changed: 4 additions & 141 deletions
Original file line numberDiff line numberDiff line change
@@ -1,141 +1,4 @@
1-
use polynomial_ring::Polynomial;
2-
use rand_distr::{Uniform, Distribution};
3-
use rand::SeedableRng;
4-
use rand::rngs::StdRng;
5-
use ring_lwe::{polyadd, polymul, gen_uniform_poly};
6-
7-
#[derive(Debug)]
8-
/// default parameters for module-LWE
9-
pub struct Parameters {
10-
/// degree of the polynomials
11-
pub n: usize,
12-
/// Ciphertext modulus
13-
pub q: i64,
14-
/// Plaintext modulus
15-
pub k: usize,
16-
/// Polynomial modulus
17-
pub f: Polynomial<i64>,
18-
}
19-
20-
/// default parameters for module-LWE
21-
impl Default for Parameters {
22-
fn default() -> Self {
23-
let n = 32;
24-
let q = 59049;
25-
let k = 8;
26-
let mut poly_vec = vec![0i64;n+1];
27-
poly_vec[0] = 1;
28-
poly_vec[n] = 1;
29-
let f = Polynomial::new(poly_vec);
30-
Parameters { n, q, k, f }
31-
}
32-
}
33-
34-
/// add two vectors of polynomials
35-
/// # Arguments
36-
/// * `v0` - vector of polynomials
37-
/// * `v1` - vector of polynomials
38-
/// * `modulus` - modulus
39-
/// * `poly_mod` - polynomial modulus
40-
/// # Returns
41-
/// * `result` - vector of polynomials
42-
pub fn add_vec(v0: &Vec<Polynomial<i64>>, v1: &Vec<Polynomial<i64>>, modulus: i64, poly_mod: &Polynomial<i64>) -> Vec<Polynomial<i64>> {
43-
assert!(v0.len() == v1.len());
44-
let mut result = vec![];
45-
for i in 0..v0.len() {
46-
result.push(polyadd(&v0[i], &v1[i], modulus, &poly_mod));
47-
}
48-
result
49-
}
50-
51-
/// take the dot product of two vectors of polynomials
52-
/// # Arguments
53-
/// * `v0` - vector of polynomials
54-
/// * `v1` - vector of polynomials
55-
/// * `modulus` - modulus
56-
/// * `poly_mod` - polynomial modulus
57-
/// # Returns
58-
/// * `result` - polynomial
59-
pub fn mul_vec_simple(v0: &Vec<Polynomial<i64>>, v1: &Vec<Polynomial<i64>>, modulus: i64, poly_mod: &Polynomial<i64>) -> Polynomial<i64> {
60-
assert!(v0.len() == v1.len());
61-
let mut result = Polynomial::new(vec![]);
62-
for i in 0..v0.len() {
63-
result = polyadd(&result, &polymul(&v0[i], &v1[i], modulus, &poly_mod), modulus, &poly_mod);
64-
}
65-
result
66-
}
67-
68-
/// multiply a matrix by a vector of polynomials
69-
/// # Arguments
70-
/// * `m` - matrix of polynomials
71-
/// * `v` - vector of polynomials
72-
/// * `modulus` - modulus
73-
/// * `poly_mod` - polynomial modulus
74-
/// # Returns
75-
/// * `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>> {
77-
78-
let mut result = vec![];
79-
for i in 0..m.len() {
80-
result.push(mul_vec_simple(&m[i], &v, modulus, &poly_mod));
81-
}
82-
result
83-
}
84-
85-
/// take the transpose of a matrix of polynomials
86-
/// # Arguments
87-
/// * `m` - matrix of polynomials
88-
/// # Returns
89-
/// * `result` - matrix of polynomials
90-
pub fn transpose(m: &Vec<Vec<Polynomial<i64>>>) -> Vec<Vec<Polynomial<i64>>> {
91-
let mut result = vec![vec![Polynomial::new(vec![]); m.len()]; m[0].len()];
92-
for i in 0..m.len() {
93-
for j in 0..m[0].len() {
94-
result[j][i] = m[i][j].clone();
95-
}
96-
}
97-
result
98-
}
99-
100-
/// generates a vector of given rank of degree size-1 polynomials with coefficients in {-1,0,1}
101-
/// # Arguments
102-
/// * `size` - degree of the polynomials
103-
/// * `rank` - rank of the vector
104-
/// * `seed` - seed for the random number generator
105-
/// # Returns
106-
/// * `v` - vector of polynomials
107-
pub fn gen_small_vector(size : usize, rank: usize, seed: Option<u64>) -> Vec<Polynomial<i64>> {
108-
let mut v = vec![];
109-
let between = Uniform::new(0,3);
110-
let mut rng = match seed {
111-
Some(seed) => StdRng::seed_from_u64(seed),
112-
None => StdRng::from_entropy(),
113-
};
114-
let mut coeffs = vec![0i64;size];
115-
for _i in 0..rank {
116-
for j in 0.. size {
117-
coeffs[j] = between.sample(&mut rng)-1;
118-
}
119-
v.push(Polynomial::new(coeffs.clone()));
120-
}
121-
v
122-
}
123-
124-
/// generates a `rank x rank` matrix of degree `size-1` polynomials with uniform coefficients in Z_modulus
125-
/// # Arguments
126-
/// * `size` - degree of the polynomials
127-
/// * `rank` - rank of the matrix
128-
/// * `modulus` - modulus
129-
/// * `seed` - seed for the random number generator
130-
/// # Returns
131-
/// * `m` - matrix of polynomials
132-
pub fn gen_uniform_matrix(size : usize, rank: usize, modulus: i64, seed: Option<u64>) -> Vec<Vec<Polynomial<i64>>> {
133-
let mut m = vec![vec![Polynomial::new(vec![]); rank]; rank];
134-
for i in 0..rank {
135-
for j in 0..rank {
136-
m[i][j] = gen_uniform_poly(size, modulus, seed);
137-
}
138-
}
139-
m
140-
}
141-
1+
pub mod keygen;
2+
pub mod encrypt;
3+
pub mod decrypt;
4+
pub mod utils;

src/main.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
mod keygen;
22
mod encrypt;
33
mod decrypt;
4+
mod utils;
45
mod test;
56

67
use crate::keygen::keygen_string;
78
use crate::encrypt::encrypt_string;
89
use crate::decrypt::decrypt_string;
10+
use crate::utils::Parameters;
911
use std::env;
10-
use module_lwe::Parameters;
1112
use polynomial_ring::Polynomial;
1213

1314
fn main() {

src/test.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ mod tests {
33
use crate::keygen::{keygen,keygen_string};
44
use crate::encrypt::{encrypt,encrypt_string};
55
use crate::decrypt::{decrypt,decrypt_string};
6-
use module_lwe::{Parameters,add_vec};
6+
use crate::utils::{Parameters,add_vec};
77
use ring_lwe::polyadd;
88

99
// Test for basic keygen/encrypt/decrypt of a message
@@ -42,8 +42,8 @@ mod tests {
4242
let (pk, sk) = keygen(&params,seed);
4343

4444
// Encrypt plaintext messages
45-
let u = encrypt(&pk.0, &pk.1, m0, &params, seed);
46-
let v = encrypt(&pk.0, &pk.1, m1, &params, seed);
45+
let u = encrypt(&pk.0, &pk.1, &m0, &params, seed);
46+
let v = encrypt(&pk.0, &pk.1, &m1, &params, seed);
4747

4848
// Compute sum of encrypted data
4949
let ciphertext_sum = (add_vec(&u.0,&v.0,q,f), polyadd(&u.1,&v.1,q,f));

0 commit comments

Comments
 (0)