@@ -272,36 +272,48 @@ func (P *Point) Unmarshal(in *[Size]byte) bool {
272
272
273
273
func (P * pointR1 ) IsOnCurve () bool {
274
274
t0 , lhs , rhs := & Fq {}, & Fq {}, & Fq {}
275
+ // Check z != 0
276
+ eq0 := ! P .Z .isZero ()
275
277
278
+ // Check Eq 1: -X^2 + Y^2 == Z^2 + dT^2
276
279
fqAdd (t0 , & P .Y , & P .X ) // t0 = y + x
277
280
fqSub (lhs , & P .Y , & P .X ) // lhs = y - x
278
281
fqMul (lhs , lhs , t0 ) // lhs = y^2 - x^2
279
- fqMul (rhs , & P .X , & P .Y ) // rhs = xy
280
- fqSqr (rhs , rhs ) // rhs = x^2y^2
281
- fqMul (rhs , rhs , & paramD ) // rhs = dx^2y^2
282
- t0 .setOne () // t0 = 1
283
- fqAdd (rhs , rhs , t0 ) // rhs = 1 + dx^2y^2
284
- fqSub (t0 , lhs , rhs ) // t0 = -x^2 + y^2 - (1 + dx^2y^2)
285
- return t0 .isZero ()
282
+ fqMul (rhs , & P .Ta , & P .Tb ) // rhs = T = Ta * Tb
283
+ fqSqr (rhs , rhs ) // rhs = T^2
284
+ fqMul (rhs , rhs , & paramD ) // rhs = dT^2
285
+ fqSqr (t0 , & P .Z ) // t0 = Z^2
286
+ fqAdd (rhs , rhs , t0 ) // rhs = Z^2 + dT^2
287
+ fqSub (t0 , lhs , rhs ) // t0 = (-X^2 + Y^2) - (Z^2 + dT^2)
288
+ eq1 := t0 .isZero ()
289
+
290
+ // Check Eq 2: (Ta*Tb)*Z == X*Y
291
+ fqMul (lhs , & P .Ta , & P .Tb ) // lhs = Ta*Tb = T
292
+ fqMul (lhs , lhs , & P .Z ) // lhs = T * Z
293
+ fqMul (rhs , & P .X , & P .Y ) // rhs = X * Y
294
+ fqSub (t0 , lhs , rhs ) // t0 = Ta*Tb*Z - X*Y
295
+ eq2 := t0 .isZero ()
296
+
297
+ return eq0 && eq1 && eq2
286
298
}
287
299
288
300
func (P * pointR1 ) isEqual (Q * pointR1 ) bool {
289
301
l , r := & Fq {}, & Fq {}
290
- fqMul (l , & P .X , & Q .Z )
291
- fqMul (r , & Q .X , & P .Z )
292
- fqSub (l , l , r )
302
+ fqMul (l , & P .X , & Q .Z ) // l = X1*Z2
303
+ fqMul (r , & Q .X , & P .Z ) // r = X2*Z1
304
+ fqSub (l , l , r ) // l = l-r
293
305
b := l .isZero ()
294
- fqMul (l , & P .Y , & Q .Z )
295
- fqMul (r , & Q .Y , & P .Z )
296
- fqSub (l , l , r )
306
+ fqMul (l , & P .Y , & Q .Z ) // l = Y1*Z2
307
+ fqMul (r , & Q .Y , & P .Z ) // r = Y2*Z1
308
+ fqSub (l , l , r ) // l = l-r
297
309
b = b && l .isZero ()
298
- fqMul (l , & P .Ta , & P .Tb )
299
- fqMul (l , l , & Q .Z )
300
- fqMul (r , & Q .Ta , & Q .Tb )
301
- fqMul (r , r , & P .Z )
302
- fqSub (l , l , r )
310
+ fqMul (l , & P .Ta , & P .Tb ) // l = T1 = Ta1*Tb1
311
+ fqMul (l , l , & Q .Z ) // l = T1*Z2
312
+ fqMul (r , & Q .Ta , & Q .Tb ) // r = T2 = Ta2*Tb2
313
+ fqMul (r , r , & P .Z ) // r = T2*Z1
314
+ fqSub (l , l , r ) // l = l-r
303
315
b = b && l .isZero ()
304
- return b
316
+ return b && ! P . Z . isZero () && ! Q . Z . isZero ()
305
317
}
306
318
307
319
func (P * pointR1 ) ClearCofactor () {
0 commit comments