1 package bls12381
2
3 import (
4 "fmt"
5
6 "github.com/cloudflare/circl/ecc/bls12381/ff"
7 )
8
9 type isogG1Point struct{ x, y, z ff.Fp }
10
11 func (p isogG1Point) String() string { return fmt.Sprintf("x: %v\ny: %v\nz: %v", p.x, p.y, p.z) }
12
13
14 func (p *isogG1Point) IsOnCurve() bool {
15 var x2, x3, z2, z3, y2 ff.Fp
16 y2.Sqr(&p.y)
17 y2.Mul(&y2, &p.z)
18 z2.Sqr(&p.z)
19 z3.Mul(&z2, &p.z)
20 z3.Mul(&z3, &g1Isog11.b)
21 x2.Sqr(&p.x)
22 x3.Mul(&z2, &g1Isog11.a)
23 x3.Add(&x3, &x2)
24 x3.Mul(&x3, &p.x)
25 x3.Add(&x3, &z3)
26
27 return y2.IsEqual(&x3) == 1 && *p != isogG1Point{}
28 }
29
30
31
32 func (p *isogG1Point) sswu(u *ff.Fp) {
33
34
35 tv1, tv2, tv3, tv4 := &ff.Fp{}, &ff.Fp{}, &ff.Fp{}, &ff.Fp{}
36 xd, x1n, gxd, gx1 := &ff.Fp{}, &ff.Fp{}, &ff.Fp{}, &ff.Fp{}
37 y, y1, x2n, y2, xn := &ff.Fp{}, &ff.Fp{}, &ff.Fp{}, &ff.Fp{}, &ff.Fp{}
38
39 tv1.Sqr(u)
40 tv3.Mul(&g1sswu.Z, tv1)
41 tv2.Sqr(tv3)
42 xd.Add(tv2, tv3)
43 tv4.SetOne()
44 x1n.Add(xd, tv4)
45 x1n.Mul(x1n, &g1Isog11.b)
46 xd.Mul(&g1Isog11.a, xd)
47 xd.Neg()
48 e1 := xd.IsZero()
49 tv4.Mul(&g1sswu.Z, &g1Isog11.a)
50 xd.CMov(xd, tv4, e1)
51 tv2.Sqr(xd)
52 gxd.Mul(tv2, xd)
53 tv2.Mul(&g1Isog11.a, tv2)
54 gx1.Sqr(x1n)
55 gx1.Add(gx1, tv2)
56 gx1.Mul(gx1, x1n)
57 tv2.Mul(&g1Isog11.b, gxd)
58 gx1.Add(gx1, tv2)
59 tv4.Sqr(gxd)
60 tv2.Mul(gx1, gxd)
61 tv4.Mul(tv4, tv2)
62 y1.ExpVarTime(tv4, g1sswu.c1[:])
63 y1.Mul(y1, tv2)
64 x2n.Mul(tv3, x1n)
65 y2.Mul(y1, &g1sswu.c2)
66 y2.Mul(y2, tv1)
67 y2.Mul(y2, u)
68 tv2.Sqr(y1)
69 tv2.Mul(tv2, gxd)
70 e2 := tv2.IsEqual(gx1)
71 xn.CMov(x2n, x1n, e2)
72 y.CMov(y2, y1, e2)
73 e3 := u.Sgn0() ^ y.Sgn0()
74 *tv1 = *y
75 tv1.Neg()
76 y.CMov(tv1, y, ^e3)
77 p.x = *xn
78 p.y.Mul(y, xd)
79 p.z = *xd
80 }
81
82
83
84 func (g *G1) evalIsogG1(p *isogG1Point) {
85 x, y, z := &p.x, &p.y, &p.z
86 t, zi := &ff.Fp{}, &ff.Fp{}
87 xNum, xDen, yNum, yDen := &ff.Fp{}, &ff.Fp{}, &ff.Fp{}, &ff.Fp{}
88
89 ixn := len(g1Isog11.xNum) - 1
90 ixd := len(g1Isog11.xDen) - 1
91 iyn := len(g1Isog11.yNum) - 1
92 iyd := len(g1Isog11.yDen) - 1
93
94 *xNum = g1Isog11.xNum[ixn]
95 *xDen = g1Isog11.xDen[ixd]
96 *yNum = g1Isog11.yNum[iyn]
97 *yDen = g1Isog11.yDen[iyd]
98 *zi = *z
99
100 for (ixn | ixd | iyn | iyd) != 0 {
101 if ixn > 0 {
102 ixn--
103 t.Mul(zi, &g1Isog11.xNum[ixn])
104 xNum.Mul(xNum, x)
105 xNum.Add(xNum, t)
106 }
107 if ixd > 0 {
108 ixd--
109 t.Mul(zi, &g1Isog11.xDen[ixd])
110 xDen.Mul(xDen, x)
111 xDen.Add(xDen, t)
112 }
113 if iyn > 0 {
114 iyn--
115 t.Mul(zi, &g1Isog11.yNum[iyn])
116 yNum.Mul(yNum, x)
117 yNum.Add(yNum, t)
118 }
119 if iyd > 0 {
120 iyd--
121 t.Mul(zi, &g1Isog11.yDen[iyd])
122 yDen.Mul(yDen, x)
123 yDen.Add(yDen, t)
124 }
125
126 zi.Mul(zi, z)
127 }
128
129 g.x.Mul(xNum, yDen)
130 g.y.Mul(yNum, xDen)
131 g.y.Mul(&g.y, y)
132 g.z.Mul(xDen, yDen)
133 g.z.Mul(&g.z, z)
134 }
135
View as plain text