1
2
3
4
5 package edwards25519
6
7 import "crypto/internal/constanttime"
8
9
10 type projLookupTable struct {
11 points [8]projCached
12 }
13
14
15 type affineLookupTable struct {
16 points [8]affineCached
17 }
18
19
20 type nafLookupTable5 struct {
21 points [8]projCached
22 }
23
24
25 type nafLookupTable8 struct {
26 points [64]affineCached
27 }
28
29
30
31
32 func (v *projLookupTable) FromP3(q *Point) {
33
34
35 v.points[0].FromP3(q)
36 tmpP3 := Point{}
37 tmpP1xP1 := projP1xP1{}
38 for i := 0; i < 7; i++ {
39
40
41
42 v.points[i+1].FromP3(tmpP3.fromP1xP1(tmpP1xP1.Add(q, &v.points[i])))
43 }
44 }
45
46
47 func (v *affineLookupTable) FromP3(q *Point) {
48
49
50 v.points[0].FromP3(q)
51 tmpP3 := Point{}
52 tmpP1xP1 := projP1xP1{}
53 for i := 0; i < 7; i++ {
54
55 v.points[i+1].FromP3(tmpP3.fromP1xP1(tmpP1xP1.AddAffine(q, &v.points[i])))
56 }
57 }
58
59
60 func (v *nafLookupTable5) FromP3(q *Point) {
61
62
63 v.points[0].FromP3(q)
64 q2 := Point{}
65 q2.Add(q, q)
66 tmpP3 := Point{}
67 tmpP1xP1 := projP1xP1{}
68 for i := 0; i < 7; i++ {
69 v.points[i+1].FromP3(tmpP3.fromP1xP1(tmpP1xP1.Add(&q2, &v.points[i])))
70 }
71 }
72
73
74 func (v *nafLookupTable8) FromP3(q *Point) {
75 v.points[0].FromP3(q)
76 q2 := Point{}
77 q2.Add(q, q)
78 tmpP3 := Point{}
79 tmpP1xP1 := projP1xP1{}
80 for i := 0; i < 63; i++ {
81 v.points[i+1].FromP3(tmpP3.fromP1xP1(tmpP1xP1.AddAffine(&q2, &v.points[i])))
82 }
83 }
84
85
86
87
88 func (v *projLookupTable) SelectInto(dest *projCached, x int8) {
89
90 xmask := x >> 7
91 xabs := uint8((x + xmask) ^ xmask)
92
93 dest.Zero()
94 for j := 1; j <= 8; j++ {
95
96 cond := constanttime.ByteEq(xabs, uint8(j))
97 dest.Select(&v.points[j-1], dest, cond)
98 }
99
100 dest.CondNeg(int(xmask & 1))
101 }
102
103
104 func (v *affineLookupTable) SelectInto(dest *affineCached, x int8) {
105
106 xmask := x >> 7
107 xabs := uint8((x + xmask) ^ xmask)
108
109 dest.Zero()
110 for j := 1; j <= 8; j++ {
111
112 cond := constanttime.ByteEq(xabs, uint8(j))
113 dest.Select(&v.points[j-1], dest, cond)
114 }
115
116 dest.CondNeg(int(xmask & 1))
117 }
118
119
120 func (v *nafLookupTable5) SelectInto(dest *projCached, x int8) {
121 *dest = v.points[x/2]
122 }
123
124
125 func (v *nafLookupTable8) SelectInto(dest *affineCached, x int8) {
126 *dest = v.points[x/2]
127 }
128
View as plain text