-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathpoint.go
73 lines (55 loc) · 1.11 KB
/
point.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
package p384
import (
"math/big"
)
type affinePoint struct {
x, y gfP
}
func newAffinePoint(X, Y *big.Int) *affinePoint {
x, y := &gfP{}, &gfP{}
copy(x[:], X.Bits())
copy(y[:], Y.Bits())
montEncode(x, x)
montEncode(y, y)
return &affinePoint{*x, *y}
}
func (ap *affinePoint) ToJacobian() *jacobianPoint {
return &jacobianPoint{ap.x, ap.y, *newGFp(1)}
}
func (ap *affinePoint) ToInt() (*big.Int, *big.Int) {
x, y := &gfP{}, &gfP{}
*x, *y = ap.x, ap.y
montDecode(x, x)
montDecode(y, y)
return x.Int(), y.Int()
}
func (ap *affinePoint) IsZero() bool {
zero := gfP{}
return ap.x == zero && ap.y == zero
}
type jacobianPoint struct {
x, y, z gfP
}
func (jp *jacobianPoint) ToAffine() *affinePoint {
if jp.IsZero() {
return &affinePoint{}
}
z := &gfP{}
*z = jp.z
z.Invert(z)
x, y := &gfP{}, &gfP{}
*x, *y = jp.x, jp.y
gfpMul(x, x, z)
gfpMul(x, x, z)
gfpMul(y, y, z)
gfpMul(y, y, z)
gfpMul(y, y, z)
return &affinePoint{*x, *y}
}
func (jp *jacobianPoint) IsZero() bool {
zero := gfP{}
return jp.z == zero
}
func (jp *jacobianPoint) Dup() *jacobianPoint {
return &jacobianPoint{jp.x, jp.y, jp.z}
}