noah_algebra/bls12_381/
pairing.rs

1use 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
10/// The pairing engine for BLS12-381
11pub 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}