#![allow(incomplete_features)] #![feature(generic_const_exprs)] mod bn254; use bn254::{U256, BN254}; const TEST_COUNT: usize = 500; const SEED: [u8; 32] = [ 1, 0, 52, 0, 0, 0, 0, 0, 1, 0, 10, 0, 22, 32, 0, 0, 2, 0, 55, 49, 0, 11, 0, 0, 3, 0, 0, 0, 0, 0, 2, 92, ]; #[cfg(feature = "rand")] #[test] fn test_mont_rdc() { use rand::SeedableRng; use cryptix_field::field::{primefield::FpElement, montgomery::MontgomeryOps}; let mut rng = rand_chacha::ChaCha8Rng::from_seed(SEED); for _ in 0..TEST_COUNT { let a: FpElement = FpElement::rand(&mut rng).mont_form(); let b = FpElement::rand(&mut rng).mont_form(); let c = (a * b).mont_rdc().mont_rdc(); let d = a.mont_mul(b).mont_rdc(); assert_eq!(c, d) } } #[cfg(feature = "rand")] #[test] fn test_mont_inv() { use rand::SeedableRng; use cryptix_field::field::{primefield::FpElement, montgomery::MontgomeryOps, MulIdentity}; let mut rng = rand_chacha::ChaCha8Rng::from_seed(SEED); for _ in 0..TEST_COUNT { let a: FpElement = FpElement::rand(&mut rng).mont_form(); let ainv = a.mont_inv(); let c = a.mont_mul(ainv); assert_eq!(c.mont_rdc(), FpElement::::ONE); } } #[cfg(feature = "rand")] #[test] fn test_mont_basic() { use rand::SeedableRng; use cryptix_field::field::{primefield::FpElement, montgomery::MontgomeryOps, MulIdentity}; let mut rng = rand_chacha::ChaCha8Rng::from_seed(SEED); for _ in 0..TEST_COUNT { let a: FpElement = FpElement::rand(&mut rng).mont_form(); let b = FpElement::rand(&mut rng).mont_form(); let res1 = a.mont_mul(a).mont_mul(b); let res2 = a.mont_mul(b).mont_mul(a); assert_eq!(res1, res2); let two = FpElement::ONE + FpElement::ONE; let res1 = a.mont_mul(two); let res2 = (a + a).mont_rdc(); assert_eq!(res1, res2); } }