halo2-ecc 0.5.1

In-circuit elliptic curve library for halo2.
Documentation
use crate::ff::Field as _;
use crate::fields::fp::FpChip;
use crate::fields::fp12::Fp12Chip;
use crate::fields::FieldChip;
use crate::halo2_proofs::halo2curves::bn256::{Fq, Fq12};
use halo2_base::utils::testing::base_test;
use rand_core::OsRng;

const XI_0: i64 = 9;

fn fp12_mul_test(
    k: u32,
    lookup_bits: usize,
    limb_bits: usize,
    num_limbs: usize,
    _a: Fq12,
    _b: Fq12,
) {
    base_test().k(k).lookup_bits(lookup_bits).run(|ctx, range| {
        let fp_chip = FpChip::<_, Fq>::new(range, limb_bits, num_limbs);
        let chip = Fp12Chip::<_, _, Fq12, XI_0>::new(&fp_chip);

        let [a, b] = [_a, _b].map(|x| chip.load_private(ctx, x));
        let c = chip.mul(ctx, a, b).into();

        assert_eq!(chip.get_assigned_value(&c), _a * _b);
        for c in c.into_iter() {
            assert_eq!(c.truncation.to_bigint(limb_bits), c.value);
        }
    });
}

#[test]
fn test_fp12() {
    let k = 12;
    let a = Fq12::random(OsRng);
    let b = Fq12::random(OsRng);

    fp12_mul_test(k, k as usize - 1, 88, 3, a, b);
}