Testing "pairing function" in the context of Elliptic Curves constructed using a tower of field extensions.
Elliptic curves:
- BN128 (file
src/BN128.hs) - BLS12-381 (file
src/BLS12381.hs)
Let G1 be the elliptic curve over Fp1 (the base field) and G2 the elliptic curve over Fp2 (the first extension). Then
pairing :: G1 -> G2 -> Fp12where Fp12 is the extended field according to the curve's embedding degree 'k = 12' ("top floor" in the tower).
A point in G1 is constructed with ecExp g1Gen n:
ghci> :t ecExp g1Gen
ecExp g1Gen :: Integer -> G1Likewise, a point in G2 is constructed with ecExp g2Gen n.
Here n is an integer between 0 and q, with
- For BN128:
q = 21888242871839275222246405745257275088548364400416034343698204186575808495617
- For BLS12-381:
q = 52435875175126190479447740508185965837690552500527637822603658699938581184513
Function ecExp is an efficient implementation of the exponential function on an elliptic curve, so that e.g. ecExp p 5 is effectively equivalent to p <> p <> p <> p <> p.
As a check, one can test that a constructed point p is on the elliptic curve with isOnCurve p,
ghci> :t isOnCurve
isOnCurve :: Field a => EllipticCurve a -> BoolIt is expected that the pairing satisfies the bilinearity property:
pairing (p1 <> p2) q == pairing p1 q * pairing p2 qpairing p (q1 <> q2) == pairing p q1 * pairing p q2The test of the property can be checked for the BN-128 curve with the following commands:
cabal test bilineal-property-128And the BLS12-381 curve:
cabal test bilineal-property-381To check the viability of using our pairing implementation in conjunction with an open source ZK tooling like snarkjs, we test the validation of a proof produced by such a tool; see files in src/Groth16 and corresponding log in directory logs.