use super::rng::generate_strong_prime;
use super::rng::generate_urandom;
use super::gm::GM;
use super::gmp::mpz::Mpz;
use super::paillier::Paillier;
use super::gmp::rand::RandState;
use super::rand::Rng;
use super::rand;
use test::Bencher;
#[test]
fn strong_prime() {
let mut rng = rand::thread_rng();
let mut randstate = RandState::new();
randstate.seed_ui( rng.gen::<u64>() );
let p = generate_strong_prime(&mut randstate, 1024);
assert!( p.probab_prime_p(40) == true);
}
#[test]
fn gm_gen_key() {
let gmcrypto = GM::new(1024);
assert!( &gmcrypto.sk.p != &gmcrypto.sk.q );
}
#[test]
fn gm_enc_dec() {
let mut gmcrypto = GM::new(1024);
let c = gmcrypto.encrypt(true);
assert!( gmcrypto.decrypt(&c) == true);
let c1 = gmcrypto.encrypt(true);
assert!( &c1 != &c );
assert!( gmcrypto.decrypt(&c1) == true);
let c2 = gmcrypto.encrypt(false);
let c3 = gmcrypto.encrypt(false);
assert!( &c2 != &c3 );
assert!( gmcrypto.decrypt(&c2) == false);
assert!( gmcrypto.decrypt(&c3) == false);
}
#[test]
fn gm_xor() {
let mut gmcrypto = GM::new(1024);
let c = gmcrypto.encrypt(true);
let c1 = gmcrypto.encrypt(true);
let c2 = gmcrypto.encrypt(false);
let c3 = gmcrypto.encrypt(false);
let cc1 = gmcrypto.xor(&c, &c1);
let cc2 = gmcrypto.xor(&c2, &c2);
let cc3 = gmcrypto.xor(&c, &c3);
let cc4 = gmcrypto.xor(&c3, &c1);
assert!( gmcrypto.decrypt( &cc1 ) == false );
assert!( gmcrypto.decrypt( &cc2 ) == false );
assert!( gmcrypto.decrypt( &cc3 ) == true );
assert!( gmcrypto.decrypt( &cc4 ) == true );
}
#[bench]
fn bench_gm_enc(b: &mut Bencher) {
let mut gmcrypto = GM::new(1024);
b.iter(|| { let c = gmcrypto.encrypt(false); c} );
}
#[bench]
fn bench_gm_dec(b: &mut Bencher) {
let mut gmcrypto = GM::new(1024);
let c = gmcrypto.encrypt(false);
b.iter(|| { let m = gmcrypto.decrypt(&c); m} );
}
#[test]
fn pai_gen_key() {
let paics = Paillier::new(1024);
assert!(&paics.pk.n == &(&paics.pk.g - Mpz::one()));
}
#[test]
fn pai_enc_dec() {
let m : Mpz = From::<i64>::from(1235);
let mut paics = Paillier::new(1024);
let c = paics.encrypt(&m);
let mm = paics.decrypt(&c);
assert!(&m == &mm);
}
#[test]
fn pai_add_cipher() {
let mut paics = Paillier::new(1024);
let m1 : Mpz = From::<i64>::from(1235);
let m2 : Mpz = From::<i64>::from(5321);
let c1 = paics.encrypt(&m1);
let c2 = paics.encrypt(&m2);
let c3 = paics.add_cipher(&c1, &c2);
let m3 = paics.decrypt(&c3);
assert!(&m3 == &From::from(6556i64));
}
#[test]
fn pai_add_const() {
let mut paics = Paillier::new(1024);
let m1 : Mpz = From::<i64>::from(1235);
let m2 : Mpz = From::<i64>::from(5321);
let c1 = paics.encrypt(&m1);
let c3 = paics.add_const(&c1, &m2);
let m3 = paics.decrypt(&c3);
assert!(&m3 == &From::from(6556i64));
}
#[test]
fn pai_mul_const() {
let mut paics = Paillier::new(1024);
let m1 : Mpz = From::<i64>::from(1235);
let m2 : Mpz = From::<i64>::from(5321);
let c1 = paics.encrypt(&m1);
let c3 = paics.mul_const(&c1, &m2);
let m3 = paics.decrypt(&c3);
assert!(&m3 == &From::from(1235i64 * 5321));
}
#[bench]
fn bench_pai_enc(b: &mut Bencher) {
let m : Mpz = From::<i64>::from(1235);
let mut paics = Paillier::new(1024);
b.iter(|| { let c = paics.encrypt(&m); c} );
}
#[bench]
fn bench_pai_dec(b: &mut Bencher) {
let m : Mpz = From::<i64>::from(1235);
let mut paics = Paillier::new(1024);
let c = paics.encrypt(&m);
b.iter(|| { let m = paics.decrypt(&c); m} );
}
#[bench]
fn bench_slow_l(b: &mut Bencher) {
let mut rng = rand::thread_rng();
let mut randstate = RandState::new();
randstate.seed_ui( rng.gen::<u64>() );
let mut n = generate_urandom(&mut randstate, 1024);
n.setbit(0);
let u = generate_urandom(&mut randstate, 1024) * &n + Mpz::one();
b.iter(|| { let m = (&u - Mpz::one()) / &n; m } )
}
#[bench]
fn bench_fast_l(b: &mut Bencher) {
let mut rng = rand::thread_rng();
let mut randstate = RandState::new();
randstate.seed_ui( rng.gen::<u64>() );
let mut n = generate_urandom(&mut randstate, 1024);
n.setbit(0);
let u = generate_urandom(&mut randstate, 1024) * &n + Mpz::one();
let len = n.bit_length();
let mut two_n = Mpz::zero();
two_n.setbit(len);
let ninv = n.invert(&two_n).unwrap();
let m = (&u - Mpz::one()) / &n;
let m1 = ( (&u - Mpz::one()) * &ninv ) % &two_n;
assert!(&m == &m1);
b.iter(|| { let m1 = ( (&u - Mpz::one()) * &ninv ) % &two_n ; m1 } )
}