Fast subgroup checks used by EIP-2537

Fields and Groups

Field Fp is defined as the finite field of size p with elements represented as integers between 0 and p-1 (both inclusive).

Field Fp2 is defined as Fp[X]/(X^2-nr2) with elements el = c0 + c1 * v, where v is the formal square root of nr2 represented as integer pairs (c0,c1).

Group G1 is defined as a set of Fp pairs (points) (x,y) such that either (x,y) is (0,0) or x,y satisfy the curve Fp equation.

Group G2 is defined as a set of Fp2 pairs (points) (x', y') such that either (x', y') is (0,0) or (x', y') satisfy the curve Fp2 equation.

Curve parameters

The set of parameters used by fast subgroup checks:

|x| (seed) = 15132376222941642752
x is negative = true
Cube root of unity modulo p - Beta = 793479390729215512621379701633421447060886740281060493010456487427281649075476305620758731620350
r = 4002409555221667392624310435006688643935503118305586438271171395842971157480381377015405980053539358417135540939437 * v
s = 2973677408986561043442465346520108879172042883009249989176415018091420807192182638567116318576472649347015917690530 + 1028732146235106349975324479215795277384839936929757896155643118032610843298655225875571310552543014690878354869257 * v

Helper function to compute the conjugate over Fp2 - conjugate

conjugate(c0 + c1 * v) := c0 - c1 * v

G1 endomorphism - phi

The endomorphism phi transform the point from (x,y) to (Beta*x,y) where Beta is a precomputed cube root of unity modulo p given above in parameters sections:

phi((x,y)) := (Beta*x,y)

G2 endomorphism - psi

psi((x,y)) := (conjugate(x)*r,conjugate(y)*s)

The G1 case

Before accepting a point P as input that purports to be a member of G1 subject the input to the following endomorphism test: phi(P) + x^2*P = 0

The G2 case

Before accepting a point P as input that purports to be a member of G2 subject the input to the following endomorphism test: psi(P) + x*P = 0

Resources

  • https://eprint.iacr.org/2021/1130.pdf, sec.4
  • https://eprint.iacr.org/2022/352.pdf, sec. 4.2