cryptix-bn254 0.1.0

A library for bn254 elliptic curve related algorithms
Documentation
use cryptix_ecc::CurvePoint;
use cryptix_field::field::{montgomery::MontgomeryOps, MulIdentity};
use cryptix_bn254::{galoisfield::{FpElement, fp12::Fp12Element}, pairing::{e1::BN254Fp, e2::BN254Fp2, o_ate::OptimalAte, Pairing}};

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,
];

#[test]
fn test_ate_bilinear() {
    use rand_chacha::rand_core::SeedableRng;
    let mut rng = rand_chacha::ChaCha8Rng::from_seed(SEED);

    for _ in 0..5 {
        let k = FpElement::rand(&mut rng).repr();
        let p = BN254Fp::GENERATOR.scalar_mul(k);
        let q = BN254Fp2::GENERATOR;

        let f = OptimalAte::pairing(p, q);
        let g = OptimalAte::pairing(-p, q);
        
        let q = f.mont_mul(g).mont_rdc();
        // e(P, Q)e(-P, Q) = e(0, Q)
        assert_eq!(q, Fp12Element::ONE);

        let g = OptimalAte::pairing(BN254Fp::GENERATOR, BN254Fp2::GENERATOR);
        let left = g.mont_rdc().mont_exp(k);
        
        let right = OptimalAte::pairing(
            BN254Fp::GENERATOR.scalar_mul(k).normalize(), 
            BN254Fp2::GENERATOR.normalize()
        ).mont_rdc();
        // l = e(Q_1, Q_2)^k
        // r = e(kQ_1, Q_2)
        assert_eq!(left, right)
    }
}