noah_algebra/bls12_381/
pairing.rs1use crate::bls12_381::g2::BLSG2;
2use crate::bls12_381::gt::BLSGt;
3use crate::bls12_381::{BLSScalar, BLSG1};
4use crate::traits::Pairing;
5use ark_bls12_381::Bls12_381 as Bls12381pairing;
6use ark_ec::bls12::{G1Prepared, G2Prepared};
7use ark_ec::pairing::Pairing as ArkPairing;
8use ark_ec::CurveGroup;
9
10pub struct BLSPairingEngine;
12
13impl Pairing for BLSPairingEngine {
14 type ScalarField = BLSScalar;
15 type G1 = BLSG1;
16 type G2 = BLSG2;
17 type Gt = BLSGt;
18
19 #[inline]
20 fn pairing(a: &Self::G1, b: &Self::G2) -> Self::Gt {
21 BLSGt(Bls12381pairing::pairing(a.0, b.0).0)
22 }
23
24 #[inline]
25 fn product_of_pairings(a: &[Self::G1], b: &[Self::G2]) -> Self::Gt {
26 let c1: Vec<G1Prepared<_>> = a.iter().map(|x| x.0.into_affine().into()).collect();
27 let c2: Vec<G2Prepared<_>> = b.iter().map(|x| x.0.into_affine().into()).collect();
28 BLSGt(Bls12381pairing::multi_pairing(c1, c2).0)
29 }
30}