main
Raw Download raw file
 1package goldilocks
 2
 3import fp "github.com/cloudflare/circl/math/fp448"
 4
 5func (Curve) pull(P *twistPoint) *Point      { return twistCurve{}.push(P) }
 6func (twistCurve) pull(P *Point) *twistPoint { return Curve{}.push(P) }
 7
 8// push sends a point on the Goldilocks curve to a point on the twist curve.
 9func (Curve) push(P *Point) *twistPoint {
10	Q := &twistPoint{}
11	Px, Py, Pz := &P.x, &P.y, &P.z
12	a, b, c, d, e, f, g, h := &Q.x, &Q.y, &Q.z, &fp.Elt{}, &Q.ta, &Q.x, &Q.y, &Q.tb
13	fp.Add(e, Px, Py)  // x+y
14	fp.Sqr(a, Px)      // A = x^2
15	fp.Sqr(b, Py)      // B = y^2
16	fp.Sqr(c, Pz)      // z^2
17	fp.Add(c, c, c)    // C = 2*z^2
18	*d = *a            // D = A
19	fp.Sqr(e, e)       // (x+y)^2
20	fp.Sub(e, e, a)    // (x+y)^2-A
21	fp.Sub(e, e, b)    // E = (x+y)^2-A-B
22	fp.Add(h, b, d)    // H = B+D
23	fp.Sub(g, b, d)    // G = B-D
24	fp.Sub(f, c, h)    // F = C-H
25	fp.Mul(&Q.z, f, g) // Z = F * G
26	fp.Mul(&Q.x, e, f) // X = E * F
27	fp.Mul(&Q.y, g, h) // Y = G * H, // T = E * H
28	return Q
29}
30
31// push sends a point on the twist curve to a point on the Goldilocks curve.
32func (twistCurve) push(P *twistPoint) *Point {
33	Q := &Point{}
34	Px, Py, Pz := &P.x, &P.y, &P.z
35	a, b, c, d, e, f, g, h := &Q.x, &Q.y, &Q.z, &fp.Elt{}, &Q.ta, &Q.x, &Q.y, &Q.tb
36	fp.Add(e, Px, Py)  // x+y
37	fp.Sqr(a, Px)      // A = x^2
38	fp.Sqr(b, Py)      // B = y^2
39	fp.Sqr(c, Pz)      // z^2
40	fp.Add(c, c, c)    // C = 2*z^2
41	fp.Neg(d, a)       // D = -A
42	fp.Sqr(e, e)       // (x+y)^2
43	fp.Sub(e, e, a)    // (x+y)^2-A
44	fp.Sub(e, e, b)    // E = (x+y)^2-A-B
45	fp.Add(h, b, d)    // H = B+D
46	fp.Sub(g, b, d)    // G = B-D
47	fp.Sub(f, c, h)    // F = C-H
48	fp.Mul(&Q.z, f, g) // Z = F * G
49	fp.Mul(&Q.x, e, f) // X = E * F
50	fp.Mul(&Q.y, g, h) // Y = G * H, // T = E * H
51	return Q
52}