1
1
package ted448
2
2
3
3
import (
4
- "errors"
5
4
"fmt"
6
5
7
6
fp "github.com/cloudflare/circl/math/fp448"
8
7
)
9
8
10
9
// Point defines a point on the ted448 curve.
11
- type Point struct { x , y , z , ta , tb fp.Elt }
10
+ type Point struct { X , Y , Z , Ta , Tb fp.Elt }
12
11
13
12
type prePointAffine struct { addYX , subYX , dt2 fp.Elt }
14
13
@@ -18,36 +17,24 @@ type prePointProy struct {
18
17
}
19
18
20
19
func (P Point ) String () string {
21
- return fmt .Sprintf ("x: %v\n y: %v\n ta: %v\n tb: %v\n z: %v" , P .x , P .y , P .ta , P .tb , P .z )
20
+ return fmt .Sprintf ("x: %v\n y: %v\n ta: %v\n tb: %v\n z: %v" , P .X , P .Y , P .Ta , P .Tb , P .Z )
22
21
}
23
22
24
- // NewPoint creates a point from affine coordinates.
25
- func NewPoint (x , y * fp.Elt ) (* Point , error ) {
26
- P := & Point {x : * x , y : * y , ta : * x , tb : * y , z : fp .One ()}
27
- if ! IsOnCurve (P ) {
28
- return nil , errors .New ("invalid point" )
29
- }
30
- return P , nil
31
- }
32
-
33
- // Coordinates returns a copy of the coordinates.
34
- func (P * Point ) Coordinates () (x , y , ta , tb , z fp.Elt ) { return P .x , P .y , P .ta , P .tb , P .z }
35
-
36
23
// cneg conditionally negates the point if b=1.
37
24
func (P * Point ) cneg (b uint ) {
38
25
t := & fp.Elt {}
39
- fp .Neg (t , & P .x )
40
- fp .Cmov (& P .x , t , b )
41
- fp .Neg (t , & P .ta )
42
- fp .Cmov (& P .ta , t , b )
26
+ fp .Neg (t , & P .X )
27
+ fp .Cmov (& P .X , t , b )
28
+ fp .Neg (t , & P .Ta )
29
+ fp .Cmov (& P .Ta , t , b )
43
30
}
44
31
45
32
// Double updates P with 2P.
46
33
func (P * Point ) Double () {
47
34
// This is formula (7) from "ed448 Edwards Curves Revisited" by
48
35
// Hisil H., Wong K.KH., Carter G., Dawson E. (2008)
49
36
// https://doi.org/10.1007/978-3-540-89255-7_20
50
- Px , Py , Pz , Pta , Ptb := & P .x , & P .y , & P .z , & P .ta , & P .tb
37
+ Px , Py , Pz , Pta , Ptb := & P .X , & P .Y , & P .Z , & P .Ta , & P .Tb
51
38
a , b , c , e , f , g , h := Px , Py , Pz , Pta , Px , Py , Ptb
52
39
fp .Add (e , Px , Py ) // x+y
53
40
fp .Sqr (a , Px ) // A = x^2
@@ -66,7 +53,7 @@ func (P *Point) Double() {
66
53
67
54
// mixAdd calulates P= P+Q, where Q is a precomputed448 point with Z_Q = 1.
68
55
func (P * Point ) mixAddZ1 (Q * prePointAffine ) {
69
- fp .Add (& P .z , & P .z , & P .z ) // D = 2*z1 (z2=1)
56
+ fp .Add (& P .Z , & P .Z , & P .Z ) // D = 2*z1 (z2=1)
70
57
P .coreAddition (Q )
71
58
}
72
59
@@ -75,7 +62,7 @@ func (P *Point) coreAddition(Q *prePointAffine) {
75
62
// This is the formula following (5) from "ed448 Edwards Curves Revisited" by
76
63
// Hisil H., Wong K.KH., Carter G., Dawson E. (2008)
77
64
// https://doi.org/10.1007/978-3-540-89255-7_20
78
- Px , Py , Pz , Pta , Ptb := & P .x , & P .y , & P .z , & P .ta , & P .tb
65
+ Px , Py , Pz , Pta , Ptb := & P .X , & P .Y , & P .Z , & P .Ta , & P .Tb
79
66
addYX2 , subYX2 , dt2 := & Q .addYX , & Q .subYX , & Q .dt2
80
67
a , b , c , d , e , f , g , h := Px , Py , & fp.Elt {}, Pz , Pta , Px , Py , Ptb
81
68
fp .Mul (c , Pta , Ptb ) // t1 = ta*tb
@@ -113,37 +100,37 @@ func (P *prePointAffine) cmov(Q *prePointAffine, b uint) {
113
100
114
101
// mixAdd calculates P= P+Q, where Q is a precomputed448 point with Z_Q != 1.
115
102
func (P * Point ) mixAdd (Q * prePointProy ) {
116
- fp .Mul (& P .z , & P .z , & Q .z2 ) // D = 2*z1*z2
103
+ fp .Mul (& P .Z , & P .Z , & Q .z2 ) // D = 2*z1*z2
117
104
P .coreAddition (& Q .prePointAffine )
118
105
}
119
106
120
107
// IsIdentity returns True is P is the identity.
121
108
func (P * Point ) IsIdentity () bool {
122
- return fp .IsZero (& P .x ) && ! fp .IsZero (& P .y ) && ! fp .IsZero (& P .z ) && P .y == P .z
109
+ return fp .IsZero (& P .X ) && ! fp .IsZero (& P .Y ) && ! fp .IsZero (& P .Z ) && P .Y == P .Z
123
110
}
124
111
125
112
// IsEqual returns True if P is equivalent to Q.
126
113
func (P * Point ) IsEqual (Q * Point ) bool {
127
114
l , r := & fp.Elt {}, & fp.Elt {}
128
- fp .Mul (l , & P .x , & Q .z )
129
- fp .Mul (r , & Q .x , & P .z )
115
+ fp .Mul (l , & P .X , & Q .Z )
116
+ fp .Mul (r , & Q .X , & P .Z )
130
117
fp .Sub (l , l , r )
131
118
b := fp .IsZero (l )
132
- fp .Mul (l , & P .y , & Q .z )
133
- fp .Mul (r , & Q .y , & P .z )
119
+ fp .Mul (l , & P .Y , & Q .Z )
120
+ fp .Mul (r , & Q .Y , & P .Z )
134
121
fp .Sub (l , l , r )
135
122
b = b && fp .IsZero (l )
136
- fp .Mul (l , & P .ta , & P .tb )
137
- fp .Mul (l , l , & Q .z )
138
- fp .Mul (r , & Q .ta , & Q .tb )
139
- fp .Mul (r , r , & P .z )
123
+ fp .Mul (l , & P .Ta , & P .Tb )
124
+ fp .Mul (l , l , & Q .Z )
125
+ fp .Mul (r , & Q .Ta , & Q .Tb )
126
+ fp .Mul (r , r , & P .Z )
140
127
fp .Sub (l , l , r )
141
128
b = b && fp .IsZero (l )
142
129
return b
143
130
}
144
131
145
132
// Neg obtains the inverse of P.
146
- func (P * Point ) Neg () { fp .Neg (& P .x , & P .x ); fp .Neg (& P .ta , & P .ta ) }
133
+ func (P * Point ) Neg () { fp .Neg (& P .X , & P .X ); fp .Neg (& P .Ta , & P .Ta ) }
147
134
148
135
// Add calculates P = P+Q.
149
136
func (P * Point ) Add (Q * Point ) {
@@ -176,10 +163,10 @@ func (P *prePointProy) cmov(Q *prePointProy, b uint) {
176
163
177
164
// FromPoint precomputes some coordinates of Q for mised addition.
178
165
func (P * prePointProy ) FromPoint (Q * Point ) {
179
- fp .Add (& P .addYX , & Q .y , & Q .x ) // addYX = X + Y
180
- fp .Sub (& P .subYX , & Q .y , & Q .x ) // subYX = Y - X
181
- fp .Mul (& P .dt2 , & Q .ta , & Q .tb ) // T = ta*tb
166
+ fp .Add (& P .addYX , & Q .Y , & Q .X ) // addYX = X + Y
167
+ fp .Sub (& P .subYX , & Q .Y , & Q .X ) // subYX = Y - X
168
+ fp .Mul (& P .dt2 , & Q .Ta , & Q .Tb ) // T = ta*tb
182
169
fp .Mul (& P .dt2 , & P .dt2 , & ParamD ) // D*T
183
170
fp .Add (& P .dt2 , & P .dt2 , & P .dt2 ) // dt2 = 2*D*T
184
- fp .Add (& P .z2 , & Q .z , & Q .z ) // z2 = 2*Z
171
+ fp .Add (& P .z2 , & Q .Z , & Q .Z ) // z2 = 2*Z
185
172
}
0 commit comments