@@ -153,12 +153,29 @@ func FuzzPair(data []byte) int {
153
153
if ! bytes .Equal (clPair , gPair ) {
154
154
panic ("pairing mismatch: cloudflare/google" )
155
155
}
156
-
157
156
cPair , err := bn254 .Pair ([]bn254.G1Affine {* ps }, []bn254.G2Affine {* ts })
158
157
if err != nil {
159
158
panic (fmt .Sprintf ("gnark/bn254 encountered error: %v" , err ))
160
159
}
161
- if ! bytes .Equal (clPair , cPair .Marshal ()) {
160
+
161
+ // gnark uses a different pairing algorithm which might produce
162
+ // different but also correct outputs, we need to scale the output by s
163
+
164
+ u , _ := new (big.Int ).SetString ("0x44e992b44a6909f1" , 0 )
165
+ u_exp2 := new (big.Int ).Exp (u , big .NewInt (2 ), nil ) // u^2
166
+ u_6_exp2 := new (big.Int ).Mul (big .NewInt (6 ), u_exp2 ) // 6*u^2
167
+ u_3 := new (big.Int ).Mul (big .NewInt (3 ), u ) // 3*u
168
+ inner := u_6_exp2 .Add (u_6_exp2 , u_3 ) // 6*u^2 + 3*u
169
+ inner .Add (inner , big .NewInt (1 )) // 6*u^2 + 3*u + 1
170
+ u_2 := new (big.Int ).Mul (big .NewInt (2 ), u ) // 2*u
171
+ s := u_2 .Mul (u_2 , inner ) // 2*u(6*u^2 + 3*u + 1)
172
+
173
+ gRes := new (bn254.GT )
174
+ if err := gRes .SetBytes (clPair ); err != nil {
175
+ panic (err )
176
+ }
177
+ gRes = gRes .Exp (* gRes , s )
178
+ if ! bytes .Equal (cPair .Marshal (), gRes .Marshal ()) {
162
179
panic ("pairing mismatch: cloudflare/gnark" )
163
180
}
164
181
0 commit comments