use super::GroupElement; use fields::{FieldElement, Fr}; use rand::Rng; fn random_test_addition(rng: &mut R) { for _ in 0..50 { let r1 = G::random(rng); let r2 = G::random(rng); let r3 = G::random(rng); assert_eq!((r1 + r2) + r3, r1 + (r2 + r3)); assert!(((r1 + r2 + r3) - r2 - r3 - r1).is_zero()); } } fn random_test_doubling(rng: &mut R) { for _ in 0..50 { let r1 = G::random(rng); let r2 = G::random(rng); let ti = Fr::from_str("2").unwrap().inverse().unwrap(); assert_eq!((r1 + r2) + r1, r1.double() + r2); assert_eq!(r1, r1.double() * ti); } } fn random_test_dh(rng: &mut R) { for _ in 0..50 { let alice_sk = Fr::random(rng); let bob_sk = Fr::random(rng); let alice_pk = G::one() * alice_sk; let bob_pk = G::one() * bob_sk; let alice_shared = bob_pk * alice_sk; let bob_shared = alice_pk * bob_sk; assert_eq!(alice_shared, bob_shared); } } fn random_test_equality(rng: &mut R) { for _ in 0..50 { let begin = G::random(rng); let mut acc = begin; // Do a bunch of random things. let a = Fr::random(rng); let b = G::random(rng); let c = Fr::random(rng); let d = G::random(rng); for _ in 0..10 { acc = acc * a; acc = -acc; acc = acc + b; acc = acc * c; acc = -acc; acc = acc - d; acc = acc.double(); } // Then reverse the operations let ai = a.inverse().unwrap(); let ci = c.inverse().unwrap(); let ti = Fr::from_str("2").unwrap().inverse().unwrap(); for _ in 0..10 { acc = acc * ti; acc = acc + d; acc = -acc; acc = acc * ci; acc = acc - b; acc = -acc; acc = acc * ai; } assert_eq!(acc, begin); } } pub fn group_trials() { assert!(G::zero().is_zero()); assert!((G::one() - G::one()).is_zero()); assert_eq!(G::one() + G::one(), G::one() * Fr::from_str("2").unwrap()); assert!(G::zero().double().is_zero()); assert!((G::one() * (-Fr::one()) + G::one()).is_zero()); use rand::{SeedableRng,StdRng}; // let seed: [usize; 4] = [103245, 191922, 1293, 192103]; let seed: [u8; 32] = [1, 2,3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32]; let mut rng: StdRng = SeedableRng::from_seed(seed); random_test_addition::(&mut rng); random_test_doubling::(&mut rng); random_test_dh::(&mut rng); random_test_equality::(&mut rng); }