#![allow(non_snake_case)]
extern crate amcl;
use amcl::arch;
use amcl::rand::RAND;
use amcl::types::{CurvePairingType, CurveType, ModType};
use std::time::Instant;
const MIN_ITERS: isize = 10;
const MIN_TIME: isize = 10;
fn ed25519(mut rng: &mut RAND) {
use amcl::ed25519::big;
use amcl::ed25519::ecp;
use amcl::ed25519::fp;
use amcl::ed25519::rom;
let mut fail = false;
println!("\nTesting/Timing ed25519 ECC");
if ecp::CURVETYPE == CurveType::WEIERSTRASS {
println!("Weierstrass parameterization");
}
if ecp::CURVETYPE == CurveType::EDWARDS {
println!("Edwards parameterization");
}
if ecp::CURVETYPE == CurveType::MONTGOMERY {
println!("Montgomery parameterization");
}
if fp::MODTYPE == ModType::PSEUDO_MERSENNE {
println!("Pseudo-Mersenne Modulus");
}
if fp::MODTYPE == ModType::MONTGOMERY_FRIENDLY {
println!("Montgomery friendly Modulus");
}
if fp::MODTYPE == ModType::GENERALISED_MERSENNE {
println!("Generalised-Mersenne Modulus");
}
if fp::MODTYPE == ModType::NOT_SPECIAL {
println!("Not special Modulus");
}
println!("Modulus size {:} bits", fp::MODBITS);
println!("{:} bit build", arch::CHUNK);
let G = ecp::ECP::generator();
let mut r = big::BIG::new_ints(&rom::CURVE_ORDER);
let mut s = big::BIG::randomnum(&r, &mut rng);
let P = G.mul(&mut r);
if !P.is_infinity() {
println!("FAILURE - rG!=O");
fail = true;
}
let start = Instant::now();
let mut iterations = 0;
let mut dur = 0 as u64;
while dur < (MIN_TIME as u64) * 1000 || iterations < MIN_ITERS {
let _ = G.mul(&mut s);
iterations += 1;
let elapsed = start.elapsed();
dur = (elapsed.as_secs() * 1_000) + (elapsed.subsec_nanos() / 1_000_000) as u64;
}
let duration = (dur as f64) / (iterations as f64);
print!("EC mul - {:} iterations ", iterations);
println!(" {:0.2} ms per iteration", duration);
if !fail {
println!("All tests pass");
}
}
fn nist256(mut rng: &mut RAND) {
use amcl::nist256::big;
use amcl::nist256::ecp;
use amcl::nist256::fp;
use amcl::nist256::rom;
let mut fail = false;
println!("\nTesting/Timing nist256 ECC");
if ecp::CURVETYPE == CurveType::WEIERSTRASS {
println!("Weierstrass parameterization");
}
if ecp::CURVETYPE == CurveType::EDWARDS {
println!("Edwards parameterization");
}
if ecp::CURVETYPE == CurveType::MONTGOMERY {
println!("Montgomery parameterization");
}
if fp::MODTYPE == ModType::PSEUDO_MERSENNE {
println!("Pseudo-Mersenne Modulus");
}
if fp::MODTYPE == ModType::MONTGOMERY_FRIENDLY {
println!("Montgomery friendly Modulus");
}
if fp::MODTYPE == ModType::GENERALISED_MERSENNE {
println!("Generalised-Mersenne Modulus");
}
if fp::MODTYPE == ModType::NOT_SPECIAL {
println!("Not special Modulus");
}
println!("Modulus size {:} bits", fp::MODBITS);
println!("{:} bit build", arch::CHUNK);
let G = ecp::ECP::generator();
let mut r = big::BIG::new_ints(&rom::CURVE_ORDER);
let mut s = big::BIG::randomnum(&r, &mut rng);
let P = G.mul(&mut r);
if !P.is_infinity() {
println!("FAILURE - rG!=O");
fail = true;
}
let start = Instant::now();
let mut iterations = 0;
let mut dur = 0 as u64;
while dur < (MIN_TIME as u64) * 1000 || iterations < MIN_ITERS {
let _ = G.mul(&mut s);
iterations += 1;
let elapsed = start.elapsed();
dur = (elapsed.as_secs() * 1_000) + (elapsed.subsec_nanos() / 1_000_000) as u64;
}
let duration = (dur as f64) / (iterations as f64);
print!("EC mul - {:} iterations ", iterations);
println!(" {:0.2} ms per iteration", duration);
if !fail {
println!("All tests pass");
}
}
fn goldilocks(mut rng: &mut RAND) {
use amcl::goldilocks::big;
use amcl::goldilocks::ecp;
use amcl::goldilocks::fp;
use amcl::goldilocks::rom;
let mut fail = false;
println!("\nTesting/Timing goldilocks ECC");
if ecp::CURVETYPE == CurveType::WEIERSTRASS {
println!("Weierstrass parameterization");
}
if ecp::CURVETYPE == CurveType::EDWARDS {
println!("Edwards parameterization");
}
if ecp::CURVETYPE == CurveType::MONTGOMERY {
println!("Montgomery parameterization");
}
if fp::MODTYPE == ModType::PSEUDO_MERSENNE {
println!("Pseudo-Mersenne Modulus");
}
if fp::MODTYPE == ModType::MONTGOMERY_FRIENDLY {
println!("Montgomery friendly Modulus");
}
if fp::MODTYPE == ModType::GENERALISED_MERSENNE {
println!("Generalised-Mersenne Modulus");
}
if fp::MODTYPE == ModType::NOT_SPECIAL {
println!("Not special Modulus");
}
println!("Modulus size {:} bits", fp::MODBITS);
println!("{:} bit build", arch::CHUNK);
let G = ecp::ECP::generator();
let mut r = big::BIG::new_ints(&rom::CURVE_ORDER);
let mut s = big::BIG::randomnum(&r, &mut rng);
let P = G.mul(&mut r);
if !P.is_infinity() {
println!("FAILURE - rG!=O");
fail = true;
}
let start = Instant::now();
let mut iterations = 0;
let mut dur = 0 as u64;
while dur < (MIN_TIME as u64) * 1000 || iterations < MIN_ITERS {
let _ = G.mul(&mut s);
iterations += 1;
let elapsed = start.elapsed();
dur = (elapsed.as_secs() * 1_000) + (elapsed.subsec_nanos() / 1_000_000) as u64;
}
let duration = (dur as f64) / (iterations as f64);
print!("EC mul - {:} iterations ", iterations);
println!(" {:0.2} ms per iteration", duration);
if !fail {
println!("All tests pass");
}
}
fn bn254(mut rng: &mut RAND) {
use amcl::bn254::big;
use amcl::bn254::ecp;
use amcl::bn254::ecp2;
use amcl::bn254::fp;
use amcl::bn254::pair;
use amcl::bn254::rom;
let mut fail = false;
println!("\nTesting/Timing BN254 Pairings");
if ecp::CURVE_PAIRING_TYPE == CurvePairingType::BN {
println!("BN Pairing-Friendly Curve");
}
if ecp::CURVE_PAIRING_TYPE == CurvePairingType::BLS {
println!("BLS Pairing-Friendly Curve");
}
println!("Modulus size {:} bits", fp::MODBITS);
println!("{:} bit build", arch::CHUNK);
let mut G = ecp::ECP::generator();
let mut r = big::BIG::new_ints(&rom::CURVE_ORDER);
let mut s = big::BIG::randomnum(&r, &mut rng);
let mut P = pair::g1mul(&mut G, &mut r);
if !P.is_infinity() {
println!("FAILURE - rP!=O");
fail = true;
}
let start = Instant::now();
let mut iterations = 0;
let mut dur = 0 as u64;
while dur < (MIN_TIME as u64) * 1000 || iterations < MIN_ITERS {
P = pair::g1mul(&mut G, &mut s);
iterations += 1;
let elapsed = start.elapsed();
dur = (elapsed.as_secs() * 1_000) + (elapsed.subsec_nanos() / 1_000_000) as u64;
}
let duration = (dur as f64) / (iterations as f64);
print!("G1 mul - {:} iterations ", iterations);
println!(" {:0.2} ms per iteration", duration);
let mut Q = ecp2::ECP2::generator();
let mut W = pair::g2mul(&mut Q, &mut r);
if !W.is_infinity() {
println!("FAILURE - rQ!=O");
fail = true;
}
let start = Instant::now();
let mut iterations = 0;
let mut dur = 0 as u64;
while dur < (MIN_TIME as u64) * 1000 || iterations < MIN_ITERS {
W = pair::g2mul(&mut Q, &mut s);
iterations += 1;
let elapsed = start.elapsed();
dur = (elapsed.as_secs() * 1_000) + (elapsed.subsec_nanos() / 1_000_000) as u64;
}
let duration = (dur as f64) / (iterations as f64);
print!("G2 mul - {:} iterations ", iterations);
println!(" {:0.2} ms per iteration", duration);
let mut w = pair::ate(&mut Q, &mut P);
w = pair::fexp(&w);
let mut g = pair::gtpow(&mut w, &mut r);
if !g.isunity() {
println!("FAILURE - g^r!=1");
return;
}
let start = Instant::now();
let mut iterations = 0;
let mut dur = 0 as u64;
while dur < (MIN_TIME as u64) * 1000 || iterations < MIN_ITERS {
let _ = pair::gtpow(&mut w, &mut s);
iterations += 1;
let elapsed = start.elapsed();
dur = (elapsed.as_secs() * 1_000) + (elapsed.subsec_nanos() / 1_000_000) as u64;
}
let duration = (dur as f64) / (iterations as f64);
print!("GT pow - {:} iterations ", iterations);
println!(" {:0.2} ms per iteration", duration);
let start = Instant::now();
let mut iterations = 0;
let mut dur = 0 as u64;
while dur < (MIN_TIME as u64) * 1000 || iterations < MIN_ITERS {
let _ = w.compow(&s, &mut r);
iterations += 1;
let elapsed = start.elapsed();
dur = (elapsed.as_secs() * 1_000) + (elapsed.subsec_nanos() / 1_000_000) as u64;
}
let duration = (dur as f64) / (iterations as f64);
print!("GT pow (compressed) - {:} iterations ", iterations);
println!(" {:0.2} ms per iteration", duration);
let start = Instant::now();
let mut iterations = 0;
let mut dur = 0 as u64;
while dur < (MIN_TIME as u64) * 1000 || iterations < MIN_ITERS {
w = pair::ate(&mut Q, &mut P);
iterations += 1;
let elapsed = start.elapsed();
dur = (elapsed.as_secs() * 1_000) + (elapsed.subsec_nanos() / 1_000_000) as u64;
}
let duration = (dur as f64) / (iterations as f64);
print!("PAIRing ATE - {:} iterations ", iterations);
println!(" {:0.2} ms per iteration", duration);
let start = Instant::now();
let mut iterations = 0;
let mut dur = 0 as u64;
while dur < (MIN_TIME as u64) * 1000 || iterations < MIN_ITERS {
let _ = pair::fexp(&w);
iterations += 1;
let elapsed = start.elapsed();
dur = (elapsed.as_secs() * 1_000) + (elapsed.subsec_nanos() / 1_000_000) as u64;
}
let duration = (dur as f64) / (iterations as f64);
print!("PAIRing FEXP - {:} iterations ", iterations);
println!(" {:0.2} ms per iteration", duration);
P.copy(&G);
Q.copy(&W);
P = pair::g1mul(&mut P, &mut s);
g = pair::ate(&mut Q, &mut P);
g = pair::fexp(&g);
P.copy(&G);
Q = pair::g2mul(&mut Q, &mut s);
w = pair::ate(&mut Q, &mut P);
w = pair::fexp(&w);
if !g.equals(&mut w) {
println!("FAILURE - e(sQ,p)!=e(Q,sP) ");
fail = true;
}
Q.copy(&W);
g = pair::ate(&mut Q, &mut P);
g = pair::fexp(&g);
g = pair::gtpow(&mut g, &mut s);
if !g.equals(&mut w) {
println!("FAILURE - e(sQ,p)!=e(Q,P)^s ");
fail = true;
}
if !fail {
println!("All tests pass");
}
}
fn bls383(mut rng: &mut RAND) {
use amcl::bls383::big;
use amcl::bls383::ecp;
use amcl::bls383::ecp2;
use amcl::bls383::fp;
use amcl::bls383::pair;
use amcl::bls383::rom;
let mut fail = false;
println!("\nTesting/Timing BLS383 Pairings");
if ecp::CURVE_PAIRING_TYPE == CurvePairingType::BN {
println!("BN Pairing-Friendly Curve");
}
if ecp::CURVE_PAIRING_TYPE == CurvePairingType::BLS {
println!("BLS Pairing-Friendly Curve");
}
println!("Modulus size {:} bits", fp::MODBITS);
println!("{:} bit build", arch::CHUNK);
let mut G = ecp::ECP::generator();
let mut r = big::BIG::new_ints(&rom::CURVE_ORDER);
let mut s = big::BIG::randomnum(&r, &mut rng);
let mut P = pair::g1mul(&mut G, &mut r);
if !P.is_infinity() {
println!("FAILURE - rP!=O");
fail = true;
}
let start = Instant::now();
let mut iterations = 0;
let mut dur = 0 as u64;
while dur < (MIN_TIME as u64) * 1000 || iterations < MIN_ITERS {
P = pair::g1mul(&mut G, &mut s);
iterations += 1;
let elapsed = start.elapsed();
dur = (elapsed.as_secs() * 1_000) + (elapsed.subsec_nanos() / 1_000_000) as u64;
}
let duration = (dur as f64) / (iterations as f64);
print!("G1 mul - {:} iterations ", iterations);
println!(" {:0.2} ms per iteration", duration);
let mut Q = ecp2::ECP2::generator();
let mut W = pair::g2mul(&mut Q, &mut r);
if !W.is_infinity() {
println!("FAILURE - rQ!=O");
fail = true;
}
let start = Instant::now();
let mut iterations = 0;
let mut dur = 0 as u64;
while dur < (MIN_TIME as u64) * 1000 || iterations < MIN_ITERS {
W = pair::g2mul(&mut Q, &mut s);
iterations += 1;
let elapsed = start.elapsed();
dur = (elapsed.as_secs() * 1_000) + (elapsed.subsec_nanos() / 1_000_000) as u64;
}
let duration = (dur as f64) / (iterations as f64);
print!("G2 mul - {:} iterations ", iterations);
println!(" {:0.2} ms per iteration", duration);
let mut w = pair::ate(&mut Q, &mut P);
w = pair::fexp(&w);
let mut g = pair::gtpow(&mut w, &mut r);
if !g.isunity() {
println!("FAILURE - g^r!=1");
return;
}
let start = Instant::now();
let mut iterations = 0;
let mut dur = 0 as u64;
while dur < (MIN_TIME as u64) * 1000 || iterations < MIN_ITERS {
let _ = pair::gtpow(&mut w, &mut s);
iterations += 1;
let elapsed = start.elapsed();
dur = (elapsed.as_secs() * 1_000) + (elapsed.subsec_nanos() / 1_000_000) as u64;
}
let duration = (dur as f64) / (iterations as f64);
print!("GT pow - {:} iterations ", iterations);
println!(" {:0.2} ms per iteration", duration);
let start = Instant::now();
let mut iterations = 0;
let mut dur = 0 as u64;
while dur < (MIN_TIME as u64) * 1000 || iterations < MIN_ITERS {
let _ = w.compow(&s, &mut r);
iterations += 1;
let elapsed = start.elapsed();
dur = (elapsed.as_secs() * 1_000) + (elapsed.subsec_nanos() / 1_000_000) as u64;
}
let duration = (dur as f64) / (iterations as f64);
print!("GT pow (compressed) - {:} iterations ", iterations);
println!(" {:0.2} ms per iteration", duration);
let start = Instant::now();
let mut iterations = 0;
let mut dur = 0 as u64;
while dur < (MIN_TIME as u64) * 1000 || iterations < MIN_ITERS {
w = pair::ate(&mut Q, &mut P);
iterations += 1;
let elapsed = start.elapsed();
dur = (elapsed.as_secs() * 1_000) + (elapsed.subsec_nanos() / 1_000_000) as u64;
}
let duration = (dur as f64) / (iterations as f64);
print!("PAIRing ATE - {:} iterations ", iterations);
println!(" {:0.2} ms per iteration", duration);
let start = Instant::now();
let mut iterations = 0;
let mut dur = 0 as u64;
while dur < (MIN_TIME as u64) * 1000 || iterations < MIN_ITERS {
let _ = pair::fexp(&w);
iterations += 1;
let elapsed = start.elapsed();
dur = (elapsed.as_secs() * 1_000) + (elapsed.subsec_nanos() / 1_000_000) as u64;
}
let duration = (dur as f64) / (iterations as f64);
print!("PAIRing FEXP - {:} iterations ", iterations);
println!(" {:0.2} ms per iteration", duration);
P.copy(&G);
Q.copy(&W);
P = pair::g1mul(&mut P, &mut s);
g = pair::ate(&mut Q, &mut P);
g = pair::fexp(&g);
P.copy(&G);
Q = pair::g2mul(&mut Q, &mut s);
w = pair::ate(&mut Q, &mut P);
w = pair::fexp(&w);
if !g.equals(&mut w) {
println!("FAILURE - e(sQ,p)!=e(Q,sP) ");
fail = true;
}
Q.copy(&W);
g = pair::ate(&mut Q, &mut P);
g = pair::fexp(&g);
g = pair::gtpow(&mut g, &mut s);
if !g.equals(&mut w) {
println!("FAILURE - e(sQ,p)!=e(Q,P)^s ");
fail = true;
}
if !fail {
println!("All tests pass");
}
}
fn bls24(mut rng: &mut RAND) {
use amcl::bls24::big;
use amcl::bls24::ecp;
use amcl::bls24::ecp4;
use amcl::bls24::fp;
use amcl::bls24::pair192;
use amcl::bls24::rom;
let mut fail = false;
println!("\nTesting/Timing BLS24 Pairings");
if ecp::CURVE_PAIRING_TYPE == CurvePairingType::BN {
println!("BN Pairing-Friendly Curve");
}
if ecp::CURVE_PAIRING_TYPE == CurvePairingType::BLS {
println!("BLS24 Pairing-Friendly Curve");
}
println!("Modulus size {:} bits", fp::MODBITS);
println!("{:} bit build", arch::CHUNK);
let mut G = ecp::ECP::generator();
let mut r = big::BIG::new_ints(&rom::CURVE_ORDER);
let mut s = big::BIG::randomnum(&r, &mut rng);
let mut P = pair192::g1mul(&mut G, &mut r);
if !P.is_infinity() {
println!("FAILURE - rP!=O");
fail = true;
}
let start = Instant::now();
let mut iterations = 0;
let mut dur = 0 as u64;
while dur < (MIN_TIME as u64) * 1000 || iterations < MIN_ITERS {
P = pair192::g1mul(&mut G, &mut s);
iterations += 1;
let elapsed = start.elapsed();
dur = (elapsed.as_secs() * 1_000) + (elapsed.subsec_nanos() / 1_000_000) as u64;
}
let duration = (dur as f64) / (iterations as f64);
print!("G1 mul - {:} iterations ", iterations);
println!(" {:0.2} ms per iteration", duration);
let mut Q = ecp4::ECP4::generator();
let mut W = pair192::g2mul(&mut Q, &mut r);
if !W.is_infinity() {
println!("FAILURE - rQ!=O");
fail = true;
}
let start = Instant::now();
let mut iterations = 0;
let mut dur = 0 as u64;
while dur < (MIN_TIME as u64) * 1000 || iterations < MIN_ITERS {
W = pair192::g2mul(&mut Q, &mut s);
iterations += 1;
let elapsed = start.elapsed();
dur = (elapsed.as_secs() * 1_000) + (elapsed.subsec_nanos() / 1_000_000) as u64;
}
let duration = (dur as f64) / (iterations as f64);
print!("G2 mul - {:} iterations ", iterations);
println!(" {:0.2} ms per iteration", duration);
let mut w = pair192::ate(&mut Q, &mut P);
w = pair192::fexp(&w);
let mut g = pair192::gtpow(&mut w, &mut r);
if !g.isunity() {
println!("FAILURE - g^r!=1");
return;
}
let start = Instant::now();
let mut iterations = 0;
let mut dur = 0 as u64;
while dur < (MIN_TIME as u64) * 1000 || iterations < MIN_ITERS {
let _ = pair192::gtpow(&mut w, &mut s);
iterations += 1;
let elapsed = start.elapsed();
dur = (elapsed.as_secs() * 1_000) + (elapsed.subsec_nanos() / 1_000_000) as u64;
}
let duration = (dur as f64) / (iterations as f64);
print!("GT pow - {:} iterations ", iterations);
println!(" {:0.2} ms per iteration", duration);
let start = Instant::now();
let mut iterations = 0;
let mut dur = 0 as u64;
while dur < (MIN_TIME as u64) * 1000 || iterations < MIN_ITERS {
let _ = w.compow(&s, &mut r);
iterations += 1;
let elapsed = start.elapsed();
dur = (elapsed.as_secs() * 1_000) + (elapsed.subsec_nanos() / 1_000_000) as u64;
}
let duration = (dur as f64) / (iterations as f64);
print!("GT pow (compressed) - {:} iterations ", iterations);
println!(" {:0.2} ms per iteration", duration);
let start = Instant::now();
let mut iterations = 0;
let mut dur = 0 as u64;
while dur < (MIN_TIME as u64) * 1000 || iterations < MIN_ITERS {
w = pair192::ate(&mut Q, &mut P);
iterations += 1;
let elapsed = start.elapsed();
dur = (elapsed.as_secs() * 1_000) + (elapsed.subsec_nanos() / 1_000_000) as u64;
}
let duration = (dur as f64) / (iterations as f64);
print!("PAIRing ATE - {:} iterations ", iterations);
println!(" {:0.2} ms per iteration", duration);
let start = Instant::now();
let mut iterations = 0;
let mut dur = 0 as u64;
while dur < (MIN_TIME as u64) * 1000 || iterations < MIN_ITERS {
let _ = pair192::fexp(&w);
iterations += 1;
let elapsed = start.elapsed();
dur = (elapsed.as_secs() * 1_000) + (elapsed.subsec_nanos() / 1_000_000) as u64;
}
let duration = (dur as f64) / (iterations as f64);
print!("PAIRing FEXP - {:} iterations ", iterations);
println!(" {:0.2} ms per iteration", duration);
P.copy(&G);
Q.copy(&W);
P = pair192::g1mul(&mut P, &mut s);
g = pair192::ate(&mut Q, &mut P);
g = pair192::fexp(&g);
P.copy(&G);
Q = pair192::g2mul(&mut Q, &mut s);
w = pair192::ate(&mut Q, &mut P);
w = pair192::fexp(&w);
if !g.equals(&mut w) {
println!("FAILURE - e(sQ,p)!=e(Q,sP) ");
fail = true;
}
Q.copy(&W);
g = pair192::ate(&mut Q, &mut P);
g = pair192::fexp(&g);
g = pair192::gtpow(&mut g, &mut s);
if !g.equals(&mut w) {
println!("FAILURE - e(sQ,p)!=e(Q,P)^s ");
fail = true;
}
if !fail {
println!("All tests pass");
}
}
fn bls48(mut rng: &mut RAND) {
use amcl::bls48::big;
use amcl::bls48::ecp;
use amcl::bls48::ecp8;
use amcl::bls48::fp;
use amcl::bls48::pair256;
use amcl::bls48::rom;
let mut fail = false;
println!("\nTesting/Timing BLS48 Pairings");
if ecp::CURVE_PAIRING_TYPE == CurvePairingType::BN {
println!("BN Pairing-Friendly Curve");
}
if ecp::CURVE_PAIRING_TYPE == CurvePairingType::BLS {
println!("BLS48 Pairing-Friendly Curve");
}
println!("Modulus size {:} bits", fp::MODBITS);
println!("{:} bit build", arch::CHUNK);
let mut G = ecp::ECP::generator();
let mut r = big::BIG::new_ints(&rom::CURVE_ORDER);
let mut s = big::BIG::randomnum(&r, &mut rng);
let mut P = pair256::g1mul(&mut G, &mut r);
if !P.is_infinity() {
println!("FAILURE - rP!=O");
fail = true;
}
let start = Instant::now();
let mut iterations = 0;
let mut dur = 0 as u64;
while dur < (MIN_TIME as u64) * 1000 || iterations < MIN_ITERS {
P = pair256::g1mul(&mut G, &mut s);
iterations += 1;
let elapsed = start.elapsed();
dur = (elapsed.as_secs() * 1_000) + (elapsed.subsec_nanos() / 1_000_000) as u64;
}
let duration = (dur as f64) / (iterations as f64);
print!("G1 mul - {:} iterations ", iterations);
println!(" {:0.2} ms per iteration", duration);
let mut Q = ecp8::ECP8::generator();
let mut W = pair256::g2mul(&mut Q, &mut r);
if !W.is_infinity() {
println!("FAILURE - rQ!=O");
fail = true;
}
let start = Instant::now();
let mut iterations = 0;
let mut dur = 0 as u64;
while dur < (MIN_TIME as u64) * 1000 || iterations < MIN_ITERS {
W = pair256::g2mul(&mut Q, &mut s);
iterations += 1;
let elapsed = start.elapsed();
dur = (elapsed.as_secs() * 1_000) + (elapsed.subsec_nanos() / 1_000_000) as u64;
}
let duration = (dur as f64) / (iterations as f64);
print!("G2 mul - {:} iterations ", iterations);
println!(" {:0.2} ms per iteration", duration);
let mut w = pair256::ate(&mut Q, &mut P);
w = pair256::fexp(&w);
let mut g = pair256::gtpow(&mut w, &mut r);
if !g.isunity() {
println!("FAILURE - g^r!=1");
return;
}
let start = Instant::now();
let mut iterations = 0;
let mut dur = 0 as u64;
while dur < (MIN_TIME as u64) * 1000 || iterations < MIN_ITERS {
let _ = pair256::gtpow(&mut w, &mut s);
iterations += 1;
let elapsed = start.elapsed();
dur = (elapsed.as_secs() * 1_000) + (elapsed.subsec_nanos() / 1_000_000) as u64;
}
let duration = (dur as f64) / (iterations as f64);
print!("GT pow - {:} iterations ", iterations);
println!(" {:0.2} ms per iteration", duration);
let start = Instant::now();
let mut iterations = 0;
let mut dur = 0 as u64;
while dur < (MIN_TIME as u64) * 1000 || iterations < MIN_ITERS {
let _ = w.compow(&s, &mut r);
iterations += 1;
let elapsed = start.elapsed();
dur = (elapsed.as_secs() * 1_000) + (elapsed.subsec_nanos() / 1_000_000) as u64;
}
let duration = (dur as f64) / (iterations as f64);
print!("GT pow (compressed) - {:} iterations ", iterations);
println!(" {:0.2} ms per iteration", duration);
let start = Instant::now();
let mut iterations = 0;
let mut dur = 0 as u64;
while dur < (MIN_TIME as u64) * 1000 || iterations < MIN_ITERS {
w = pair256::ate(&mut Q, &mut P);
iterations += 1;
let elapsed = start.elapsed();
dur = (elapsed.as_secs() * 1_000) + (elapsed.subsec_nanos() / 1_000_000) as u64;
}
let duration = (dur as f64) / (iterations as f64);
print!("PAIRing ATE - {:} iterations ", iterations);
println!(" {:0.2} ms per iteration", duration);
let start = Instant::now();
let mut iterations = 0;
let mut dur = 0 as u64;
while dur < (MIN_TIME as u64) * 1000 || iterations < MIN_ITERS {
let _ = pair256::fexp(&w);
iterations += 1;
let elapsed = start.elapsed();
dur = (elapsed.as_secs() * 1_000) + (elapsed.subsec_nanos() / 1_000_000) as u64;
}
let duration = (dur as f64) / (iterations as f64);
print!("PAIRing FEXP - {:} iterations ", iterations);
println!(" {:0.2} ms per iteration", duration);
P.copy(&G);
Q.copy(&W);
P = pair256::g1mul(&mut P, &mut s);
g = pair256::ate(&mut Q, &mut P);
g = pair256::fexp(&g);
P.copy(&G);
Q = pair256::g2mul(&mut Q, &mut s);
w = pair256::ate(&mut Q, &mut P);
w = pair256::fexp(&w);
if !g.equals(&mut w) {
println!("FAILURE - e(sQ,p)!=e(Q,sP) ");
fail = true;
}
Q.copy(&W);
g = pair256::ate(&mut Q, &mut P);
g = pair256::fexp(&g);
g = pair256::gtpow(&mut g, &mut s);
if !g.equals(&mut w) {
println!("FAILURE - e(sQ,p)!=e(Q,P)^s ");
fail = true;
}
if !fail {
println!("All tests pass");
}
}
fn rsa2048(mut rng: &mut RAND) {
use amcl::rsa2048::ff;
use amcl::rsa2048::rsa;
let mut pbc = rsa::new_public_key(ff::FFLEN);
let mut prv = rsa::new_private_key(ff::HFLEN);
let mut c: [u8; rsa::RFS] = [0; rsa::RFS];
let mut m: [u8; rsa::RFS] = [0; rsa::RFS];
let mut p: [u8; rsa::RFS] = [0; rsa::RFS];
let mut fail = false;
println!("\nTesting/Timing 2048-bit RSA");
println!("Generating 2048 -bit RSA public/private key pair");
let start = Instant::now();
let mut iterations = 0;
let mut dur = 0 as u64;
while dur < (MIN_TIME as u64) * 1000 || iterations < MIN_ITERS {
rsa::key_pair(&mut rng, 65537, &mut prv, &mut pbc);
iterations += 1;
let elapsed = start.elapsed();
dur = (elapsed.as_secs() * 1_000) + (elapsed.subsec_nanos() / 1_000_000) as u64;
}
let duration = (dur as f64) / (iterations as f64);
print!("RSA gen - {:} iterations ", iterations);
println!(" {:0.2} ms per iteration", duration);
for i in 0..rsa::RFS {
m[i] = (i % 128) as u8;
}
let start = Instant::now();
let mut iterations = 0;
let mut dur = 0 as u64;
while dur < (MIN_TIME as u64) * 1000 || iterations < MIN_ITERS {
rsa::encrypt(&pbc, &m, &mut c);
iterations += 1;
let elapsed = start.elapsed();
dur = (elapsed.as_secs() * 1_000) + (elapsed.subsec_nanos() / 1_000_000) as u64;
}
let duration = (dur as f64) / (iterations as f64);
print!("RSA enc - {:} iterations ", iterations);
println!(" {:0.2} ms per iteration", duration);
let start = Instant::now();
let mut iterations = 0;
let mut dur = 0 as u64;
while dur < (MIN_TIME as u64) * 1000 || iterations < MIN_ITERS {
rsa::decrypt(&prv, &c, &mut p);
iterations += 1;
let elapsed = start.elapsed();
dur = (elapsed.as_secs() * 1_000) + (elapsed.subsec_nanos() / 1_000_000) as u64;
}
let duration = (dur as f64) / (iterations as f64);
print!("RSA dec - {:} iterations ", iterations);
println!(" {:0.2} ms per iteration", duration);
let mut cmp = true;
for i in 0..rsa::RFS {
if p[i] != m[i] {
cmp = false;
}
}
if !cmp {
println!("FAILURE - RSA decryption");
fail = true;
}
if !fail {
println!("All tests pass");
}
}
#[allow(non_snake_case)]
fn main() {
let mut raw: [u8; 100] = [0; 100];
let mut rng = RAND::new();
rng.clean();
for i in 0..100 {
raw[i] = i as u8
}
rng.seed(100, &raw);
ed25519(&mut rng);
nist256(&mut rng);
goldilocks(&mut rng);
bn254(&mut rng);
bls383(&mut rng);
bls24(&mut rng);
bls48(&mut rng);
rsa2048(&mut rng);
}