...
1
2 package goldilocks
3
4 import fp "github.com/cloudflare/circl/math/fp448"
5
6
7 type Curve struct{}
8
9
10 func (Curve) Identity() *Point {
11 return &Point{
12 y: fp.One(),
13 z: fp.One(),
14 }
15 }
16
17
18 func (Curve) IsOnCurve(P *Point) bool {
19 x2, y2, t, t2, z2 := &fp.Elt{}, &fp.Elt{}, &fp.Elt{}, &fp.Elt{}, &fp.Elt{}
20 rhs, lhs := &fp.Elt{}, &fp.Elt{}
21 fp.Mul(t, &P.ta, &P.tb)
22 fp.Sqr(x2, &P.x)
23 fp.Sqr(y2, &P.y)
24 fp.Sqr(z2, &P.z)
25 fp.Sqr(t2, t)
26 fp.Add(lhs, x2, y2)
27 fp.Mul(rhs, t2, ¶mD)
28 fp.Add(rhs, rhs, z2)
29 fp.Sub(lhs, lhs, rhs)
30 eq0 := fp.IsZero(lhs)
31
32 fp.Mul(lhs, &P.x, &P.y)
33 fp.Mul(rhs, t, &P.z)
34 fp.Sub(lhs, lhs, rhs)
35 eq1 := fp.IsZero(lhs)
36 return eq0 && eq1
37 }
38
39
40 func (Curve) Generator() *Point {
41 return &Point{
42 x: genX,
43 y: genY,
44 z: fp.One(),
45 ta: genX,
46 tb: genY,
47 }
48 }
49
50
51 func (Curve) Order() Scalar { return order }
52
53
54 func (Curve) Double(P *Point) *Point { R := *P; R.Double(); return &R }
55
56
57 func (Curve) Add(P, Q *Point) *Point { R := *P; R.Add(Q); return &R }
58
59
60 func (e Curve) ScalarMult(k *Scalar, P *Point) *Point {
61 k4 := &Scalar{}
62 k4.divBy4(k)
63 return e.pull(twistCurve{}.ScalarMult(k4, e.push(P)))
64 }
65
66
67 func (e Curve) ScalarBaseMult(k *Scalar) *Point {
68 k4 := &Scalar{}
69 k4.divBy4(k)
70 return e.pull(twistCurve{}.ScalarBaseMult(k4))
71 }
72
73
74 func (e Curve) CombinedMult(m, n *Scalar, P *Point) *Point {
75 m4 := &Scalar{}
76 n4 := &Scalar{}
77 m4.divBy4(m)
78 n4.divBy4(n)
79 return e.pull(twistCurve{}.CombinedMult(m4, n4, twistCurve{}.pull(P)))
80 }
81
View as plain text