@@ -69,13 +69,7 @@ ProjPoint<IntT> add(const evmmax::ModArith<IntT>& s, const ProjPoint<IntT>& p,
69
69
{
70
70
static_assert (A == 0 , " point addition procedure is simplified for a = 0" );
71
71
72
- if (p.is_inf ())
73
- return q;
74
- if (q.is_inf ())
75
- return p;
76
-
77
- // https://eprint.iacr.org/2015/1060 algorithm 1.
78
- // Simplified with a == 0
72
+ // https://eprint.iacr.org/2015/1060 algorithm 7.
79
73
80
74
const auto & x1 = p.x ;
81
75
const auto & y1 = p.y ;
@@ -91,7 +85,6 @@ ProjPoint<IntT> add(const evmmax::ModArith<IntT>& s, const ProjPoint<IntT>& p,
91
85
IntT t2;
92
86
IntT t3;
93
87
IntT t4;
94
- IntT t5;
95
88
96
89
t0 = s.mul (x1, x2); // 1
97
90
t1 = s.mul (y1 , y2); // 2
@@ -101,38 +94,31 @@ ProjPoint<IntT> add(const evmmax::ModArith<IntT>& s, const ProjPoint<IntT>& p,
101
94
t3 = s.mul (t3, t4); // 6
102
95
t4 = s.add (t0, t1); // 7
103
96
t3 = s.sub (t3, t4); // 8
104
- t4 = s.add (x1, z1); // 9
105
- t5 = s.add (x2, z2); // 10
106
- t4 = s.mul (t4, t5); // 11
107
- t5 = s.add (t0, t2); // 12
108
- t4 = s.sub (t4, t5); // 13
109
- t5 = s.add (y1 , z1); // 14
110
- x3 = s.add (y2, z2); // 15
111
- t5 = s.mul (t5, x3); // 16
112
- x3 = s.add (t1, t2); // 17
113
- t5 = s.sub (t5, x3); // 18
114
- // z3 = 0;//s.mul(a, t4); // 19
115
- x3 = s.mul (b3, t2); // 20
116
- // z3 = x3; //s.add(x3, z3); // 21
117
- z3 = s.add (t1, x3); // 23
118
- x3 = s.sub (t1, x3); // 22
119
- y3 = s.mul (x3, z3); // 24
120
- t1 = s.add (t0, t0); // 25
121
- t1 = s.add (t1, t0); // 26
122
- // t2 = 0; // s.mul(a, t2); // 27
123
- t4 = s.mul (b3, t4); // 28
124
- // t1 = s.add(t1, t2); // 29
125
- // t2 = t0; //s.sub(t0, t2); // 30
126
- // t2 = s.mul(a, t2); // 31
127
- // t4 = s.add(t4, t2); // 32
128
- t0 = s.mul (t1, t4); // 33
129
- y3 = s.add (y3, t0); // 34
130
- t0 = s.mul (t5, t4); // 35
131
- x3 = s.mul (t3, x3); // 36
132
- x3 = s.sub (x3, t0); // 37
133
- t0 = s.mul (t3, t1); // 38
134
- z3 = s.mul (t5, z3); // 39
135
- z3 = s.add (z3, t0); // 40
97
+ t4 = s.add (y1 , z1); // 9
98
+ x3 = s.add (y2, z2); // 10
99
+ t4 = s.mul (t4, x3); // 11
100
+ x3 = s.add (t1, t2); // 12
101
+ t4 = s.sub (t4, x3); // 13
102
+ x3 = s.add (x1, z1); // 14
103
+ y3 = s.add (x2, z2); // 15
104
+ x3 = s.mul (x3, y3); // 16
105
+ y3 = s.add (t0, t2); // 17
106
+ y3 = s.sub (x3, y3); // 18
107
+ x3 = s.add (t0, t0); // 19
108
+ t0 = s.add (x3, t0); // 20
109
+ t2 = s.mul (b3, t2); // 21
110
+ z3 = s.add (t1, t2); // 22
111
+ t1 = s.sub (t1, t2); // 23
112
+ y3 = s.mul (b3, y3); // 24
113
+ x3 = s.mul (t4, y3); // 25
114
+ t2 = s.mul (t3, t1); // 26
115
+ x3 = s.sub (t2, x3); // 27
116
+ y3 = s.mul (y3, t0); // 28
117
+ t1 = s.mul (t1, z3); // 29
118
+ y3 = s.add (t1, y3); // 30
119
+ t0 = s.mul (t0, t3); // 31
120
+ z3 = s.mul (z3, t4); // 32
121
+ z3 = s.add (z3, t0); // 33
136
122
137
123
return {x3, y3, z3};
138
124
}
@@ -143,11 +129,8 @@ ProjPoint<IntT> dbl(
143
129
const evmmax::ModArith<IntT>& s, const ProjPoint<IntT>& p, const IntT& b3) noexcept
144
130
{
145
131
static_assert (A == 0 , " point doubling procedure is simplified for a = 0" );
146
- if (p.is_inf ())
147
- return p;
148
132
149
- // https://eprint.iacr.org/2015/1060 algorithm 3.
150
- // Simplified with a == 0
133
+ // https://eprint.iacr.org/2015/1060 algorithm 9.
151
134
152
135
const auto & x = p.x ;
153
136
const auto & y = p.y ;
@@ -158,39 +141,25 @@ ProjPoint<IntT> dbl(
158
141
IntT t0;
159
142
IntT t1;
160
143
IntT t2;
161
- IntT t3;
162
144
163
- t0 = s.mul (x, x); // 1
164
- t1 = s.mul (y, y); // 2
165
- t2 = s.mul (z, z); // 3
166
- t3 = s.mul (x, y); // 4
167
- t3 = s.add (t3, t3); // 5
168
- z3 = s.mul (x, z); // 6
169
- z3 = s.add (z3, z3); // 7
170
- // x3 = s.mul(0, z3); // 8
171
- y3 = s.mul (b3, t2); // 9
172
- // y3 = s.add(x3, y3); // 10
173
- x3 = s.sub (t1, y3); // 11
174
- y3 = s.add (t1, y3); // 12
175
- y3 = s.mul (x3, y3); // 13
176
- x3 = s.mul (t3, x3); // 14
177
- z3 = s.mul (b3, z3); // 15
178
- // t2 = s.mul(0, t2); // 16
179
- // t3 = s.sub(t0, t2); // 17
180
- // t3 = s.mul(0, t3); // 18
181
- t3 = z3; // s.add(t3, z3); // 19
182
- z3 = s.add (t0, t0); // 20
183
- t0 = s.add (z3, t0); // 21
184
- // t0 = s.add(t0, t2); // 22
185
- t0 = s.mul (t0, t3); // 23
186
- y3 = s.add (y3, t0); // 24
187
- t2 = s.mul (y, z); // 25
188
- t2 = s.add (t2, t2); // 26
189
- t0 = s.mul (t2, t3); // 27
190
- x3 = s.sub (x3, t0); // 28
191
- z3 = s.mul (t2, t1); // 29
192
- z3 = s.add (z3, z3); // 30
193
- z3 = s.add (z3, z3); // 31
145
+ t0 = s.mul (y, y); // 1
146
+ z3 = s.add (t0, t0); // 2
147
+ z3 = s.add (z3, z3); // 3
148
+ z3 = s.add (z3, z3); // 4
149
+ t1 = s.mul (y, z); // 5
150
+ t2 = s.mul (z, z); // 6
151
+ t2 = s.mul (b3, t2); // 7
152
+ x3 = s.mul (t2, z3); // 8
153
+ y3 = s.add (t0, t2); // 9
154
+ z3 = s.mul (t1, z3); // 10
155
+ t1 = s.add (t2, t2); // 11
156
+ t2 = s.add (t1, t2); // 12
157
+ t0 = s.sub (t0, t2); // 13
158
+ y3 = s.mul (t0, y3); // 14
159
+ y3 = s.add (x3, y3); // 15
160
+ t1 = s.mul (x, y); // 16
161
+ x3 = s.mul (t0, t1); // 17
162
+ x3 = s.add (x3, x3); // 18
194
163
195
164
return {x3, y3, z3};
196
165
}
0 commit comments