diff options
Diffstat (limited to '3rd_party/ed25519/sc.c')
-rw-r--r-- | 3rd_party/ed25519/sc.c | 809 |
1 files changed, 809 insertions, 0 deletions
diff --git a/3rd_party/ed25519/sc.c b/3rd_party/ed25519/sc.c new file mode 100644 index 0000000..ca5bad2 --- /dev/null +++ b/3rd_party/ed25519/sc.c | |||
@@ -0,0 +1,809 @@ | |||
1 | #include "fixedint.h" | ||
2 | #include "sc.h" | ||
3 | |||
4 | static uint64_t load_3(const unsigned char *in) { | ||
5 | uint64_t result; | ||
6 | |||
7 | result = (uint64_t) in[0]; | ||
8 | result |= ((uint64_t) in[1]) << 8; | ||
9 | result |= ((uint64_t) in[2]) << 16; | ||
10 | |||
11 | return result; | ||
12 | } | ||
13 | |||
14 | static uint64_t load_4(const unsigned char *in) { | ||
15 | uint64_t result; | ||
16 | |||
17 | result = (uint64_t) in[0]; | ||
18 | result |= ((uint64_t) in[1]) << 8; | ||
19 | result |= ((uint64_t) in[2]) << 16; | ||
20 | result |= ((uint64_t) in[3]) << 24; | ||
21 | |||
22 | return result; | ||
23 | } | ||
24 | |||
25 | /* | ||
26 | Input: | ||
27 | s[0]+256*s[1]+...+256^63*s[63] = s | ||
28 | |||
29 | Output: | ||
30 | s[0]+256*s[1]+...+256^31*s[31] = s mod l | ||
31 | where l = 2^252 + 27742317777372353535851937790883648493. | ||
32 | Overwrites s in place. | ||
33 | */ | ||
34 | |||
35 | void sc_reduce(unsigned char *s) { | ||
36 | int64_t s0 = 2097151 & load_3(s); | ||
37 | int64_t s1 = 2097151 & (load_4(s + 2) >> 5); | ||
38 | int64_t s2 = 2097151 & (load_3(s + 5) >> 2); | ||
39 | int64_t s3 = 2097151 & (load_4(s + 7) >> 7); | ||
40 | int64_t s4 = 2097151 & (load_4(s + 10) >> 4); | ||
41 | int64_t s5 = 2097151 & (load_3(s + 13) >> 1); | ||
42 | int64_t s6 = 2097151 & (load_4(s + 15) >> 6); | ||
43 | int64_t s7 = 2097151 & (load_3(s + 18) >> 3); | ||
44 | int64_t s8 = 2097151 & load_3(s + 21); | ||
45 | int64_t s9 = 2097151 & (load_4(s + 23) >> 5); | ||
46 | int64_t s10 = 2097151 & (load_3(s + 26) >> 2); | ||
47 | int64_t s11 = 2097151 & (load_4(s + 28) >> 7); | ||
48 | int64_t s12 = 2097151 & (load_4(s + 31) >> 4); | ||
49 | int64_t s13 = 2097151 & (load_3(s + 34) >> 1); | ||
50 | int64_t s14 = 2097151 & (load_4(s + 36) >> 6); | ||
51 | int64_t s15 = 2097151 & (load_3(s + 39) >> 3); | ||
52 | int64_t s16 = 2097151 & load_3(s + 42); | ||
53 | int64_t s17 = 2097151 & (load_4(s + 44) >> 5); | ||
54 | int64_t s18 = 2097151 & (load_3(s + 47) >> 2); | ||
55 | int64_t s19 = 2097151 & (load_4(s + 49) >> 7); | ||
56 | int64_t s20 = 2097151 & (load_4(s + 52) >> 4); | ||
57 | int64_t s21 = 2097151 & (load_3(s + 55) >> 1); | ||
58 | int64_t s22 = 2097151 & (load_4(s + 57) >> 6); | ||
59 | int64_t s23 = (load_4(s + 60) >> 3); | ||
60 | int64_t carry0; | ||
61 | int64_t carry1; | ||
62 | int64_t carry2; | ||
63 | int64_t carry3; | ||
64 | int64_t carry4; | ||
65 | int64_t carry5; | ||
66 | int64_t carry6; | ||
67 | int64_t carry7; | ||
68 | int64_t carry8; | ||
69 | int64_t carry9; | ||
70 | int64_t carry10; | ||
71 | int64_t carry11; | ||
72 | int64_t carry12; | ||
73 | int64_t carry13; | ||
74 | int64_t carry14; | ||
75 | int64_t carry15; | ||
76 | int64_t carry16; | ||
77 | |||
78 | s11 += s23 * 666643; | ||
79 | s12 += s23 * 470296; | ||
80 | s13 += s23 * 654183; | ||
81 | s14 -= s23 * 997805; | ||
82 | s15 += s23 * 136657; | ||
83 | s16 -= s23 * 683901; | ||
84 | s23 = 0; | ||
85 | s10 += s22 * 666643; | ||
86 | s11 += s22 * 470296; | ||
87 | s12 += s22 * 654183; | ||
88 | s13 -= s22 * 997805; | ||
89 | s14 += s22 * 136657; | ||
90 | s15 -= s22 * 683901; | ||
91 | s22 = 0; | ||
92 | s9 += s21 * 666643; | ||
93 | s10 += s21 * 470296; | ||
94 | s11 += s21 * 654183; | ||
95 | s12 -= s21 * 997805; | ||
96 | s13 += s21 * 136657; | ||
97 | s14 -= s21 * 683901; | ||
98 | s21 = 0; | ||
99 | s8 += s20 * 666643; | ||
100 | s9 += s20 * 470296; | ||
101 | s10 += s20 * 654183; | ||
102 | s11 -= s20 * 997805; | ||
103 | s12 += s20 * 136657; | ||
104 | s13 -= s20 * 683901; | ||
105 | s20 = 0; | ||
106 | s7 += s19 * 666643; | ||
107 | s8 += s19 * 470296; | ||
108 | s9 += s19 * 654183; | ||
109 | s10 -= s19 * 997805; | ||
110 | s11 += s19 * 136657; | ||
111 | s12 -= s19 * 683901; | ||
112 | s19 = 0; | ||
113 | s6 += s18 * 666643; | ||
114 | s7 += s18 * 470296; | ||
115 | s8 += s18 * 654183; | ||
116 | s9 -= s18 * 997805; | ||
117 | s10 += s18 * 136657; | ||
118 | s11 -= s18 * 683901; | ||
119 | s18 = 0; | ||
120 | carry6 = (s6 + (1 << 20)) >> 21; | ||
121 | s7 += carry6; | ||
122 | s6 -= carry6 << 21; | ||
123 | carry8 = (s8 + (1 << 20)) >> 21; | ||
124 | s9 += carry8; | ||
125 | s8 -= carry8 << 21; | ||
126 | carry10 = (s10 + (1 << 20)) >> 21; | ||
127 | s11 += carry10; | ||
128 | s10 -= carry10 << 21; | ||
129 | carry12 = (s12 + (1 << 20)) >> 21; | ||
130 | s13 += carry12; | ||
131 | s12 -= carry12 << 21; | ||
132 | carry14 = (s14 + (1 << 20)) >> 21; | ||
133 | s15 += carry14; | ||
134 | s14 -= carry14 << 21; | ||
135 | carry16 = (s16 + (1 << 20)) >> 21; | ||
136 | s17 += carry16; | ||
137 | s16 -= carry16 << 21; | ||
138 | carry7 = (s7 + (1 << 20)) >> 21; | ||
139 | s8 += carry7; | ||
140 | s7 -= carry7 << 21; | ||
141 | carry9 = (s9 + (1 << 20)) >> 21; | ||
142 | s10 += carry9; | ||
143 | s9 -= carry9 << 21; | ||
144 | carry11 = (s11 + (1 << 20)) >> 21; | ||
145 | s12 += carry11; | ||
146 | s11 -= carry11 << 21; | ||
147 | carry13 = (s13 + (1 << 20)) >> 21; | ||
148 | s14 += carry13; | ||
149 | s13 -= carry13 << 21; | ||
150 | carry15 = (s15 + (1 << 20)) >> 21; | ||
151 | s16 += carry15; | ||
152 | s15 -= carry15 << 21; | ||
153 | s5 += s17 * 666643; | ||
154 | s6 += s17 * 470296; | ||
155 | s7 += s17 * 654183; | ||
156 | s8 -= s17 * 997805; | ||
157 | s9 += s17 * 136657; | ||
158 | s10 -= s17 * 683901; | ||
159 | s17 = 0; | ||
160 | s4 += s16 * 666643; | ||
161 | s5 += s16 * 470296; | ||
162 | s6 += s16 * 654183; | ||
163 | s7 -= s16 * 997805; | ||
164 | s8 += s16 * 136657; | ||
165 | s9 -= s16 * 683901; | ||
166 | s16 = 0; | ||
167 | s3 += s15 * 666643; | ||
168 | s4 += s15 * 470296; | ||
169 | s5 += s15 * 654183; | ||
170 | s6 -= s15 * 997805; | ||
171 | s7 += s15 * 136657; | ||
172 | s8 -= s15 * 683901; | ||
173 | s15 = 0; | ||
174 | s2 += s14 * 666643; | ||
175 | s3 += s14 * 470296; | ||
176 | s4 += s14 * 654183; | ||
177 | s5 -= s14 * 997805; | ||
178 | s6 += s14 * 136657; | ||
179 | s7 -= s14 * 683901; | ||
180 | s14 = 0; | ||
181 | s1 += s13 * 666643; | ||
182 | s2 += s13 * 470296; | ||
183 | s3 += s13 * 654183; | ||
184 | s4 -= s13 * 997805; | ||
185 | s5 += s13 * 136657; | ||
186 | s6 -= s13 * 683901; | ||
187 | s13 = 0; | ||
188 | s0 += s12 * 666643; | ||
189 | s1 += s12 * 470296; | ||
190 | s2 += s12 * 654183; | ||
191 | s3 -= s12 * 997805; | ||
192 | s4 += s12 * 136657; | ||
193 | s5 -= s12 * 683901; | ||
194 | s12 = 0; | ||
195 | carry0 = (s0 + (1 << 20)) >> 21; | ||
196 | s1 += carry0; | ||
197 | s0 -= carry0 << 21; | ||
198 | carry2 = (s2 + (1 << 20)) >> 21; | ||
199 | s3 += carry2; | ||
200 | s2 -= carry2 << 21; | ||
201 | carry4 = (s4 + (1 << 20)) >> 21; | ||
202 | s5 += carry4; | ||
203 | s4 -= carry4 << 21; | ||
204 | carry6 = (s6 + (1 << 20)) >> 21; | ||
205 | s7 += carry6; | ||
206 | s6 -= carry6 << 21; | ||
207 | carry8 = (s8 + (1 << 20)) >> 21; | ||
208 | s9 += carry8; | ||
209 | s8 -= carry8 << 21; | ||
210 | carry10 = (s10 + (1 << 20)) >> 21; | ||
211 | s11 += carry10; | ||
212 | s10 -= carry10 << 21; | ||
213 | carry1 = (s1 + (1 << 20)) >> 21; | ||
214 | s2 += carry1; | ||
215 | s1 -= carry1 << 21; | ||
216 | carry3 = (s3 + (1 << 20)) >> 21; | ||
217 | s4 += carry3; | ||
218 | s3 -= carry3 << 21; | ||
219 | carry5 = (s5 + (1 << 20)) >> 21; | ||
220 | s6 += carry5; | ||
221 | s5 -= carry5 << 21; | ||
222 | carry7 = (s7 + (1 << 20)) >> 21; | ||
223 | s8 += carry7; | ||
224 | s7 -= carry7 << 21; | ||
225 | carry9 = (s9 + (1 << 20)) >> 21; | ||
226 | s10 += carry9; | ||
227 | s9 -= carry9 << 21; | ||
228 | carry11 = (s11 + (1 << 20)) >> 21; | ||
229 | s12 += carry11; | ||
230 | s11 -= carry11 << 21; | ||
231 | s0 += s12 * 666643; | ||
232 | s1 += s12 * 470296; | ||
233 | s2 += s12 * 654183; | ||
234 | s3 -= s12 * 997805; | ||
235 | s4 += s12 * 136657; | ||
236 | s5 -= s12 * 683901; | ||
237 | s12 = 0; | ||
238 | carry0 = s0 >> 21; | ||
239 | s1 += carry0; | ||
240 | s0 -= carry0 << 21; | ||
241 | carry1 = s1 >> 21; | ||
242 | s2 += carry1; | ||
243 | s1 -= carry1 << 21; | ||
244 | carry2 = s2 >> 21; | ||
245 | s3 += carry2; | ||
246 | s2 -= carry2 << 21; | ||
247 | carry3 = s3 >> 21; | ||
248 | s4 += carry3; | ||
249 | s3 -= carry3 << 21; | ||
250 | carry4 = s4 >> 21; | ||
251 | s5 += carry4; | ||
252 | s4 -= carry4 << 21; | ||
253 | carry5 = s5 >> 21; | ||
254 | s6 += carry5; | ||
255 | s5 -= carry5 << 21; | ||
256 | carry6 = s6 >> 21; | ||
257 | s7 += carry6; | ||
258 | s6 -= carry6 << 21; | ||
259 | carry7 = s7 >> 21; | ||
260 | s8 += carry7; | ||
261 | s7 -= carry7 << 21; | ||
262 | carry8 = s8 >> 21; | ||
263 | s9 += carry8; | ||
264 | s8 -= carry8 << 21; | ||
265 | carry9 = s9 >> 21; | ||
266 | s10 += carry9; | ||
267 | s9 -= carry9 << 21; | ||
268 | carry10 = s10 >> 21; | ||
269 | s11 += carry10; | ||
270 | s10 -= carry10 << 21; | ||
271 | carry11 = s11 >> 21; | ||
272 | s12 += carry11; | ||
273 | s11 -= carry11 << 21; | ||
274 | s0 += s12 * 666643; | ||
275 | s1 += s12 * 470296; | ||
276 | s2 += s12 * 654183; | ||
277 | s3 -= s12 * 997805; | ||
278 | s4 += s12 * 136657; | ||
279 | s5 -= s12 * 683901; | ||
280 | s12 = 0; | ||
281 | carry0 = s0 >> 21; | ||
282 | s1 += carry0; | ||
283 | s0 -= carry0 << 21; | ||
284 | carry1 = s1 >> 21; | ||
285 | s2 += carry1; | ||
286 | s1 -= carry1 << 21; | ||
287 | carry2 = s2 >> 21; | ||
288 | s3 += carry2; | ||
289 | s2 -= carry2 << 21; | ||
290 | carry3 = s3 >> 21; | ||
291 | s4 += carry3; | ||
292 | s3 -= carry3 << 21; | ||
293 | carry4 = s4 >> 21; | ||
294 | s5 += carry4; | ||
295 | s4 -= carry4 << 21; | ||
296 | carry5 = s5 >> 21; | ||
297 | s6 += carry5; | ||
298 | s5 -= carry5 << 21; | ||
299 | carry6 = s6 >> 21; | ||
300 | s7 += carry6; | ||
301 | s6 -= carry6 << 21; | ||
302 | carry7 = s7 >> 21; | ||
303 | s8 += carry7; | ||
304 | s7 -= carry7 << 21; | ||
305 | carry8 = s8 >> 21; | ||
306 | s9 += carry8; | ||
307 | s8 -= carry8 << 21; | ||
308 | carry9 = s9 >> 21; | ||
309 | s10 += carry9; | ||
310 | s9 -= carry9 << 21; | ||
311 | carry10 = s10 >> 21; | ||
312 | s11 += carry10; | ||
313 | s10 -= carry10 << 21; | ||
314 | |||
315 | s[0] = (unsigned char) (s0 >> 0); | ||
316 | s[1] = (unsigned char) (s0 >> 8); | ||
317 | s[2] = (unsigned char) ((s0 >> 16) | (s1 << 5)); | ||
318 | s[3] = (unsigned char) (s1 >> 3); | ||
319 | s[4] = (unsigned char) (s1 >> 11); | ||
320 | s[5] = (unsigned char) ((s1 >> 19) | (s2 << 2)); | ||
321 | s[6] = (unsigned char) (s2 >> 6); | ||
322 | s[7] = (unsigned char) ((s2 >> 14) | (s3 << 7)); | ||
323 | s[8] = (unsigned char) (s3 >> 1); | ||
324 | s[9] = (unsigned char) (s3 >> 9); | ||
325 | s[10] = (unsigned char) ((s3 >> 17) | (s4 << 4)); | ||
326 | s[11] = (unsigned char) (s4 >> 4); | ||
327 | s[12] = (unsigned char) (s4 >> 12); | ||
328 | s[13] = (unsigned char) ((s4 >> 20) | (s5 << 1)); | ||
329 | s[14] = (unsigned char) (s5 >> 7); | ||
330 | s[15] = (unsigned char) ((s5 >> 15) | (s6 << 6)); | ||
331 | s[16] = (unsigned char) (s6 >> 2); | ||
332 | s[17] = (unsigned char) (s6 >> 10); | ||
333 | s[18] = (unsigned char) ((s6 >> 18) | (s7 << 3)); | ||
334 | s[19] = (unsigned char) (s7 >> 5); | ||
335 | s[20] = (unsigned char) (s7 >> 13); | ||
336 | s[21] = (unsigned char) (s8 >> 0); | ||
337 | s[22] = (unsigned char) (s8 >> 8); | ||
338 | s[23] = (unsigned char) ((s8 >> 16) | (s9 << 5)); | ||
339 | s[24] = (unsigned char) (s9 >> 3); | ||
340 | s[25] = (unsigned char) (s9 >> 11); | ||
341 | s[26] = (unsigned char) ((s9 >> 19) | (s10 << 2)); | ||
342 | s[27] = (unsigned char) (s10 >> 6); | ||
343 | s[28] = (unsigned char) ((s10 >> 14) | (s11 << 7)); | ||
344 | s[29] = (unsigned char) (s11 >> 1); | ||
345 | s[30] = (unsigned char) (s11 >> 9); | ||
346 | s[31] = (unsigned char) (s11 >> 17); | ||
347 | } | ||
348 | |||
349 | |||
350 | |||
351 | /* | ||
352 | Input: | ||
353 | a[0]+256*a[1]+...+256^31*a[31] = a | ||
354 | b[0]+256*b[1]+...+256^31*b[31] = b | ||
355 | c[0]+256*c[1]+...+256^31*c[31] = c | ||
356 | |||
357 | Output: | ||
358 | s[0]+256*s[1]+...+256^31*s[31] = (ab+c) mod l | ||
359 | where l = 2^252 + 27742317777372353535851937790883648493. | ||
360 | */ | ||
361 | |||
362 | void sc_muladd(unsigned char *s, const unsigned char *a, const unsigned char *b, const unsigned char *c) { | ||
363 | int64_t a0 = 2097151 & load_3(a); | ||
364 | int64_t a1 = 2097151 & (load_4(a + 2) >> 5); | ||
365 | int64_t a2 = 2097151 & (load_3(a + 5) >> 2); | ||
366 | int64_t a3 = 2097151 & (load_4(a + 7) >> 7); | ||
367 | int64_t a4 = 2097151 & (load_4(a + 10) >> 4); | ||
368 | int64_t a5 = 2097151 & (load_3(a + 13) >> 1); | ||
369 | int64_t a6 = 2097151 & (load_4(a + 15) >> 6); | ||
370 | int64_t a7 = 2097151 & (load_3(a + 18) >> 3); | ||
371 | int64_t a8 = 2097151 & load_3(a + 21); | ||
372 | int64_t a9 = 2097151 & (load_4(a + 23) >> 5); | ||
373 | int64_t a10 = 2097151 & (load_3(a + 26) >> 2); | ||
374 | int64_t a11 = (load_4(a + 28) >> 7); | ||
375 | int64_t b0 = 2097151 & load_3(b); | ||
376 | int64_t b1 = 2097151 & (load_4(b + 2) >> 5); | ||
377 | int64_t b2 = 2097151 & (load_3(b + 5) >> 2); | ||
378 | int64_t b3 = 2097151 & (load_4(b + 7) >> 7); | ||
379 | int64_t b4 = 2097151 & (load_4(b + 10) >> 4); | ||
380 | int64_t b5 = 2097151 & (load_3(b + 13) >> 1); | ||
381 | int64_t b6 = 2097151 & (load_4(b + 15) >> 6); | ||
382 | int64_t b7 = 2097151 & (load_3(b + 18) >> 3); | ||
383 | int64_t b8 = 2097151 & load_3(b + 21); | ||
384 | int64_t b9 = 2097151 & (load_4(b + 23) >> 5); | ||
385 | int64_t b10 = 2097151 & (load_3(b + 26) >> 2); | ||
386 | int64_t b11 = (load_4(b + 28) >> 7); | ||
387 | int64_t c0 = 2097151 & load_3(c); | ||
388 | int64_t c1 = 2097151 & (load_4(c + 2) >> 5); | ||
389 | int64_t c2 = 2097151 & (load_3(c + 5) >> 2); | ||
390 | int64_t c3 = 2097151 & (load_4(c + 7) >> 7); | ||
391 | int64_t c4 = 2097151 & (load_4(c + 10) >> 4); | ||
392 | int64_t c5 = 2097151 & (load_3(c + 13) >> 1); | ||
393 | int64_t c6 = 2097151 & (load_4(c + 15) >> 6); | ||
394 | int64_t c7 = 2097151 & (load_3(c + 18) >> 3); | ||
395 | int64_t c8 = 2097151 & load_3(c + 21); | ||
396 | int64_t c9 = 2097151 & (load_4(c + 23) >> 5); | ||
397 | int64_t c10 = 2097151 & (load_3(c + 26) >> 2); | ||
398 | int64_t c11 = (load_4(c + 28) >> 7); | ||
399 | int64_t s0; | ||
400 | int64_t s1; | ||
401 | int64_t s2; | ||
402 | int64_t s3; | ||
403 | int64_t s4; | ||
404 | int64_t s5; | ||
405 | int64_t s6; | ||
406 | int64_t s7; | ||
407 | int64_t s8; | ||
408 | int64_t s9; | ||
409 | int64_t s10; | ||
410 | int64_t s11; | ||
411 | int64_t s12; | ||
412 | int64_t s13; | ||
413 | int64_t s14; | ||
414 | int64_t s15; | ||
415 | int64_t s16; | ||
416 | int64_t s17; | ||
417 | int64_t s18; | ||
418 | int64_t s19; | ||
419 | int64_t s20; | ||
420 | int64_t s21; | ||
421 | int64_t s22; | ||
422 | int64_t s23; | ||
423 | int64_t carry0; | ||
424 | int64_t carry1; | ||
425 | int64_t carry2; | ||
426 | int64_t carry3; | ||
427 | int64_t carry4; | ||
428 | int64_t carry5; | ||
429 | int64_t carry6; | ||
430 | int64_t carry7; | ||
431 | int64_t carry8; | ||
432 | int64_t carry9; | ||
433 | int64_t carry10; | ||
434 | int64_t carry11; | ||
435 | int64_t carry12; | ||
436 | int64_t carry13; | ||
437 | int64_t carry14; | ||
438 | int64_t carry15; | ||
439 | int64_t carry16; | ||
440 | int64_t carry17; | ||
441 | int64_t carry18; | ||
442 | int64_t carry19; | ||
443 | int64_t carry20; | ||
444 | int64_t carry21; | ||
445 | int64_t carry22; | ||
446 | |||
447 | s0 = c0 + a0 * b0; | ||
448 | s1 = c1 + a0 * b1 + a1 * b0; | ||
449 | s2 = c2 + a0 * b2 + a1 * b1 + a2 * b0; | ||
450 | s3 = c3 + a0 * b3 + a1 * b2 + a2 * b1 + a3 * b0; | ||
451 | s4 = c4 + a0 * b4 + a1 * b3 + a2 * b2 + a3 * b1 + a4 * b0; | ||
452 | s5 = c5 + a0 * b5 + a1 * b4 + a2 * b3 + a3 * b2 + a4 * b1 + a5 * b0; | ||
453 | s6 = c6 + a0 * b6 + a1 * b5 + a2 * b4 + a3 * b3 + a4 * b2 + a5 * b1 + a6 * b0; | ||
454 | s7 = c7 + a0 * b7 + a1 * b6 + a2 * b5 + a3 * b4 + a4 * b3 + a5 * b2 + a6 * b1 + a7 * b0; | ||
455 | s8 = c8 + a0 * b8 + a1 * b7 + a2 * b6 + a3 * b5 + a4 * b4 + a5 * b3 + a6 * b2 + a7 * b1 + a8 * b0; | ||
456 | s9 = c9 + a0 * b9 + a1 * b8 + a2 * b7 + a3 * b6 + a4 * b5 + a5 * b4 + a6 * b3 + a7 * b2 + a8 * b1 + a9 * b0; | ||
457 | s10 = c10 + a0 * b10 + a1 * b9 + a2 * b8 + a3 * b7 + a4 * b6 + a5 * b5 + a6 * b4 + a7 * b3 + a8 * b2 + a9 * b1 + a10 * b0; | ||
458 | s11 = c11 + a0 * b11 + a1 * b10 + a2 * b9 + a3 * b8 + a4 * b7 + a5 * b6 + a6 * b5 + a7 * b4 + a8 * b3 + a9 * b2 + a10 * b1 + a11 * b0; | ||
459 | s12 = a1 * b11 + a2 * b10 + a3 * b9 + a4 * b8 + a5 * b7 + a6 * b6 + a7 * b5 + a8 * b4 + a9 * b3 + a10 * b2 + a11 * b1; | ||
460 | s13 = a2 * b11 + a3 * b10 + a4 * b9 + a5 * b8 + a6 * b7 + a7 * b6 + a8 * b5 + a9 * b4 + a10 * b3 + a11 * b2; | ||
461 | s14 = a3 * b11 + a4 * b10 + a5 * b9 + a6 * b8 + a7 * b7 + a8 * b6 + a9 * b5 + a10 * b4 + a11 * b3; | ||
462 | s15 = a4 * b11 + a5 * b10 + a6 * b9 + a7 * b8 + a8 * b7 + a9 * b6 + a10 * b5 + a11 * b4; | ||
463 | s16 = a5 * b11 + a6 * b10 + a7 * b9 + a8 * b8 + a9 * b7 + a10 * b6 + a11 * b5; | ||
464 | s17 = a6 * b11 + a7 * b10 + a8 * b9 + a9 * b8 + a10 * b7 + a11 * b6; | ||
465 | s18 = a7 * b11 + a8 * b10 + a9 * b9 + a10 * b8 + a11 * b7; | ||
466 | s19 = a8 * b11 + a9 * b10 + a10 * b9 + a11 * b8; | ||
467 | s20 = a9 * b11 + a10 * b10 + a11 * b9; | ||
468 | s21 = a10 * b11 + a11 * b10; | ||
469 | s22 = a11 * b11; | ||
470 | s23 = 0; | ||
471 | carry0 = (s0 + (1 << 20)) >> 21; | ||
472 | s1 += carry0; | ||
473 | s0 -= carry0 << 21; | ||
474 | carry2 = (s2 + (1 << 20)) >> 21; | ||
475 | s3 += carry2; | ||
476 | s2 -= carry2 << 21; | ||
477 | carry4 = (s4 + (1 << 20)) >> 21; | ||
478 | s5 += carry4; | ||
479 | s4 -= carry4 << 21; | ||
480 | carry6 = (s6 + (1 << 20)) >> 21; | ||
481 | s7 += carry6; | ||
482 | s6 -= carry6 << 21; | ||
483 | carry8 = (s8 + (1 << 20)) >> 21; | ||
484 | s9 += carry8; | ||
485 | s8 -= carry8 << 21; | ||
486 | carry10 = (s10 + (1 << 20)) >> 21; | ||
487 | s11 += carry10; | ||
488 | s10 -= carry10 << 21; | ||
489 | carry12 = (s12 + (1 << 20)) >> 21; | ||
490 | s13 += carry12; | ||
491 | s12 -= carry12 << 21; | ||
492 | carry14 = (s14 + (1 << 20)) >> 21; | ||
493 | s15 += carry14; | ||
494 | s14 -= carry14 << 21; | ||
495 | carry16 = (s16 + (1 << 20)) >> 21; | ||
496 | s17 += carry16; | ||
497 | s16 -= carry16 << 21; | ||
498 | carry18 = (s18 + (1 << 20)) >> 21; | ||
499 | s19 += carry18; | ||
500 | s18 -= carry18 << 21; | ||
501 | carry20 = (s20 + (1 << 20)) >> 21; | ||
502 | s21 += carry20; | ||
503 | s20 -= carry20 << 21; | ||
504 | carry22 = (s22 + (1 << 20)) >> 21; | ||
505 | s23 += carry22; | ||
506 | s22 -= carry22 << 21; | ||
507 | carry1 = (s1 + (1 << 20)) >> 21; | ||
508 | s2 += carry1; | ||
509 | s1 -= carry1 << 21; | ||
510 | carry3 = (s3 + (1 << 20)) >> 21; | ||
511 | s4 += carry3; | ||
512 | s3 -= carry3 << 21; | ||
513 | carry5 = (s5 + (1 << 20)) >> 21; | ||
514 | s6 += carry5; | ||
515 | s5 -= carry5 << 21; | ||
516 | carry7 = (s7 + (1 << 20)) >> 21; | ||
517 | s8 += carry7; | ||
518 | s7 -= carry7 << 21; | ||
519 | carry9 = (s9 + (1 << 20)) >> 21; | ||
520 | s10 += carry9; | ||
521 | s9 -= carry9 << 21; | ||
522 | carry11 = (s11 + (1 << 20)) >> 21; | ||
523 | s12 += carry11; | ||
524 | s11 -= carry11 << 21; | ||
525 | carry13 = (s13 + (1 << 20)) >> 21; | ||
526 | s14 += carry13; | ||
527 | s13 -= carry13 << 21; | ||
528 | carry15 = (s15 + (1 << 20)) >> 21; | ||
529 | s16 += carry15; | ||
530 | s15 -= carry15 << 21; | ||
531 | carry17 = (s17 + (1 << 20)) >> 21; | ||
532 | s18 += carry17; | ||
533 | s17 -= carry17 << 21; | ||
534 | carry19 = (s19 + (1 << 20)) >> 21; | ||
535 | s20 += carry19; | ||
536 | s19 -= carry19 << 21; | ||
537 | carry21 = (s21 + (1 << 20)) >> 21; | ||
538 | s22 += carry21; | ||
539 | s21 -= carry21 << 21; | ||
540 | s11 += s23 * 666643; | ||
541 | s12 += s23 * 470296; | ||
542 | s13 += s23 * 654183; | ||
543 | s14 -= s23 * 997805; | ||
544 | s15 += s23 * 136657; | ||
545 | s16 -= s23 * 683901; | ||
546 | s23 = 0; | ||
547 | s10 += s22 * 666643; | ||
548 | s11 += s22 * 470296; | ||
549 | s12 += s22 * 654183; | ||
550 | s13 -= s22 * 997805; | ||
551 | s14 += s22 * 136657; | ||
552 | s15 -= s22 * 683901; | ||
553 | s22 = 0; | ||
554 | s9 += s21 * 666643; | ||
555 | s10 += s21 * 470296; | ||
556 | s11 += s21 * 654183; | ||
557 | s12 -= s21 * 997805; | ||
558 | s13 += s21 * 136657; | ||
559 | s14 -= s21 * 683901; | ||
560 | s21 = 0; | ||
561 | s8 += s20 * 666643; | ||
562 | s9 += s20 * 470296; | ||
563 | s10 += s20 * 654183; | ||
564 | s11 -= s20 * 997805; | ||
565 | s12 += s20 * 136657; | ||
566 | s13 -= s20 * 683901; | ||
567 | s20 = 0; | ||
568 | s7 += s19 * 666643; | ||
569 | s8 += s19 * 470296; | ||
570 | s9 += s19 * 654183; | ||
571 | s10 -= s19 * 997805; | ||
572 | s11 += s19 * 136657; | ||
573 | s12 -= s19 * 683901; | ||
574 | s19 = 0; | ||
575 | s6 += s18 * 666643; | ||
576 | s7 += s18 * 470296; | ||
577 | s8 += s18 * 654183; | ||
578 | s9 -= s18 * 997805; | ||
579 | s10 += s18 * 136657; | ||
580 | s11 -= s18 * 683901; | ||
581 | s18 = 0; | ||
582 | carry6 = (s6 + (1 << 20)) >> 21; | ||
583 | s7 += carry6; | ||
584 | s6 -= carry6 << 21; | ||
585 | carry8 = (s8 + (1 << 20)) >> 21; | ||
586 | s9 += carry8; | ||
587 | s8 -= carry8 << 21; | ||
588 | carry10 = (s10 + (1 << 20)) >> 21; | ||
589 | s11 += carry10; | ||
590 | s10 -= carry10 << 21; | ||
591 | carry12 = (s12 + (1 << 20)) >> 21; | ||
592 | s13 += carry12; | ||
593 | s12 -= carry12 << 21; | ||
594 | carry14 = (s14 + (1 << 20)) >> 21; | ||
595 | s15 += carry14; | ||
596 | s14 -= carry14 << 21; | ||
597 | carry16 = (s16 + (1 << 20)) >> 21; | ||
598 | s17 += carry16; | ||
599 | s16 -= carry16 << 21; | ||
600 | carry7 = (s7 + (1 << 20)) >> 21; | ||
601 | s8 += carry7; | ||
602 | s7 -= carry7 << 21; | ||
603 | carry9 = (s9 + (1 << 20)) >> 21; | ||
604 | s10 += carry9; | ||
605 | s9 -= carry9 << 21; | ||
606 | carry11 = (s11 + (1 << 20)) >> 21; | ||
607 | s12 += carry11; | ||
608 | s11 -= carry11 << 21; | ||
609 | carry13 = (s13 + (1 << 20)) >> 21; | ||
610 | s14 += carry13; | ||
611 | s13 -= carry13 << 21; | ||
612 | carry15 = (s15 + (1 << 20)) >> 21; | ||
613 | s16 += carry15; | ||
614 | s15 -= carry15 << 21; | ||
615 | s5 += s17 * 666643; | ||
616 | s6 += s17 * 470296; | ||
617 | s7 += s17 * 654183; | ||
618 | s8 -= s17 * 997805; | ||
619 | s9 += s17 * 136657; | ||
620 | s10 -= s17 * 683901; | ||
621 | s17 = 0; | ||
622 | s4 += s16 * 666643; | ||
623 | s5 += s16 * 470296; | ||
624 | s6 += s16 * 654183; | ||
625 | s7 -= s16 * 997805; | ||
626 | s8 += s16 * 136657; | ||
627 | s9 -= s16 * 683901; | ||
628 | s16 = 0; | ||
629 | s3 += s15 * 666643; | ||
630 | s4 += s15 * 470296; | ||
631 | s5 += s15 * 654183; | ||
632 | s6 -= s15 * 997805; | ||
633 | s7 += s15 * 136657; | ||
634 | s8 -= s15 * 683901; | ||
635 | s15 = 0; | ||
636 | s2 += s14 * 666643; | ||
637 | s3 += s14 * 470296; | ||
638 | s4 += s14 * 654183; | ||
639 | s5 -= s14 * 997805; | ||
640 | s6 += s14 * 136657; | ||
641 | s7 -= s14 * 683901; | ||
642 | s14 = 0; | ||
643 | s1 += s13 * 666643; | ||
644 | s2 += s13 * 470296; | ||
645 | s3 += s13 * 654183; | ||
646 | s4 -= s13 * 997805; | ||
647 | s5 += s13 * 136657; | ||
648 | s6 -= s13 * 683901; | ||
649 | s13 = 0; | ||
650 | s0 += s12 * 666643; | ||
651 | s1 += s12 * 470296; | ||
652 | s2 += s12 * 654183; | ||
653 | s3 -= s12 * 997805; | ||
654 | s4 += s12 * 136657; | ||
655 | s5 -= s12 * 683901; | ||
656 | s12 = 0; | ||
657 | carry0 = (s0 + (1 << 20)) >> 21; | ||
658 | s1 += carry0; | ||
659 | s0 -= carry0 << 21; | ||
660 | carry2 = (s2 + (1 << 20)) >> 21; | ||
661 | s3 += carry2; | ||
662 | s2 -= carry2 << 21; | ||
663 | carry4 = (s4 + (1 << 20)) >> 21; | ||
664 | s5 += carry4; | ||
665 | s4 -= carry4 << 21; | ||
666 | carry6 = (s6 + (1 << 20)) >> 21; | ||
667 | s7 += carry6; | ||
668 | s6 -= carry6 << 21; | ||
669 | carry8 = (s8 + (1 << 20)) >> 21; | ||
670 | s9 += carry8; | ||
671 | s8 -= carry8 << 21; | ||
672 | carry10 = (s10 + (1 << 20)) >> 21; | ||
673 | s11 += carry10; | ||
674 | s10 -= carry10 << 21; | ||
675 | carry1 = (s1 + (1 << 20)) >> 21; | ||
676 | s2 += carry1; | ||
677 | s1 -= carry1 << 21; | ||
678 | carry3 = (s3 + (1 << 20)) >> 21; | ||
679 | s4 += carry3; | ||
680 | s3 -= carry3 << 21; | ||
681 | carry5 = (s5 + (1 << 20)) >> 21; | ||
682 | s6 += carry5; | ||
683 | s5 -= carry5 << 21; | ||
684 | carry7 = (s7 + (1 << 20)) >> 21; | ||
685 | s8 += carry7; | ||
686 | s7 -= carry7 << 21; | ||
687 | carry9 = (s9 + (1 << 20)) >> 21; | ||
688 | s10 += carry9; | ||
689 | s9 -= carry9 << 21; | ||
690 | carry11 = (s11 + (1 << 20)) >> 21; | ||
691 | s12 += carry11; | ||
692 | s11 -= carry11 << 21; | ||
693 | s0 += s12 * 666643; | ||
694 | s1 += s12 * 470296; | ||
695 | s2 += s12 * 654183; | ||
696 | s3 -= s12 * 997805; | ||
697 | s4 += s12 * 136657; | ||
698 | s5 -= s12 * 683901; | ||
699 | s12 = 0; | ||
700 | carry0 = s0 >> 21; | ||
701 | s1 += carry0; | ||
702 | s0 -= carry0 << 21; | ||
703 | carry1 = s1 >> 21; | ||
704 | s2 += carry1; | ||
705 | s1 -= carry1 << 21; | ||
706 | carry2 = s2 >> 21; | ||
707 | s3 += carry2; | ||
708 | s2 -= carry2 << 21; | ||
709 | carry3 = s3 >> 21; | ||
710 | s4 += carry3; | ||
711 | s3 -= carry3 << 21; | ||
712 | carry4 = s4 >> 21; | ||
713 | s5 += carry4; | ||
714 | s4 -= carry4 << 21; | ||
715 | carry5 = s5 >> 21; | ||
716 | s6 += carry5; | ||
717 | s5 -= carry5 << 21; | ||
718 | carry6 = s6 >> 21; | ||
719 | s7 += carry6; | ||
720 | s6 -= carry6 << 21; | ||
721 | carry7 = s7 >> 21; | ||
722 | s8 += carry7; | ||
723 | s7 -= carry7 << 21; | ||
724 | carry8 = s8 >> 21; | ||
725 | s9 += carry8; | ||
726 | s8 -= carry8 << 21; | ||
727 | carry9 = s9 >> 21; | ||
728 | s10 += carry9; | ||
729 | s9 -= carry9 << 21; | ||
730 | carry10 = s10 >> 21; | ||
731 | s11 += carry10; | ||
732 | s10 -= carry10 << 21; | ||
733 | carry11 = s11 >> 21; | ||
734 | s12 += carry11; | ||
735 | s11 -= carry11 << 21; | ||
736 | s0 += s12 * 666643; | ||
737 | s1 += s12 * 470296; | ||
738 | s2 += s12 * 654183; | ||
739 | s3 -= s12 * 997805; | ||
740 | s4 += s12 * 136657; | ||
741 | s5 -= s12 * 683901; | ||
742 | s12 = 0; | ||
743 | carry0 = s0 >> 21; | ||
744 | s1 += carry0; | ||
745 | s0 -= carry0 << 21; | ||
746 | carry1 = s1 >> 21; | ||
747 | s2 += carry1; | ||
748 | s1 -= carry1 << 21; | ||
749 | carry2 = s2 >> 21; | ||
750 | s3 += carry2; | ||
751 | s2 -= carry2 << 21; | ||
752 | carry3 = s3 >> 21; | ||
753 | s4 += carry3; | ||
754 | s3 -= carry3 << 21; | ||
755 | carry4 = s4 >> 21; | ||
756 | s5 += carry4; | ||
757 | s4 -= carry4 << 21; | ||
758 | carry5 = s5 >> 21; | ||
759 | s6 += carry5; | ||
760 | s5 -= carry5 << 21; | ||
761 | carry6 = s6 >> 21; | ||
762 | s7 += carry6; | ||
763 | s6 -= carry6 << 21; | ||
764 | carry7 = s7 >> 21; | ||
765 | s8 += carry7; | ||
766 | s7 -= carry7 << 21; | ||
767 | carry8 = s8 >> 21; | ||
768 | s9 += carry8; | ||
769 | s8 -= carry8 << 21; | ||
770 | carry9 = s9 >> 21; | ||
771 | s10 += carry9; | ||
772 | s9 -= carry9 << 21; | ||
773 | carry10 = s10 >> 21; | ||
774 | s11 += carry10; | ||
775 | s10 -= carry10 << 21; | ||
776 | |||
777 | s[0] = (unsigned char) (s0 >> 0); | ||
778 | s[1] = (unsigned char) (s0 >> 8); | ||
779 | s[2] = (unsigned char) ((s0 >> 16) | (s1 << 5)); | ||
780 | s[3] = (unsigned char) (s1 >> 3); | ||
781 | s[4] = (unsigned char) (s1 >> 11); | ||
782 | s[5] = (unsigned char) ((s1 >> 19) | (s2 << 2)); | ||
783 | s[6] = (unsigned char) (s2 >> 6); | ||
784 | s[7] = (unsigned char) ((s2 >> 14) | (s3 << 7)); | ||
785 | s[8] = (unsigned char) (s3 >> 1); | ||
786 | s[9] = (unsigned char) (s3 >> 9); | ||
787 | s[10] = (unsigned char) ((s3 >> 17) | (s4 << 4)); | ||
788 | s[11] = (unsigned char) (s4 >> 4); | ||
789 | s[12] = (unsigned char) (s4 >> 12); | ||
790 | s[13] = (unsigned char) ((s4 >> 20) | (s5 << 1)); | ||
791 | s[14] = (unsigned char) (s5 >> 7); | ||
792 | s[15] = (unsigned char) ((s5 >> 15) | (s6 << 6)); | ||
793 | s[16] = (unsigned char) (s6 >> 2); | ||
794 | s[17] = (unsigned char) (s6 >> 10); | ||
795 | s[18] = (unsigned char) ((s6 >> 18) | (s7 << 3)); | ||
796 | s[19] = (unsigned char) (s7 >> 5); | ||
797 | s[20] = (unsigned char) (s7 >> 13); | ||
798 | s[21] = (unsigned char) (s8 >> 0); | ||
799 | s[22] = (unsigned char) (s8 >> 8); | ||
800 | s[23] = (unsigned char) ((s8 >> 16) | (s9 << 5)); | ||
801 | s[24] = (unsigned char) (s9 >> 3); | ||
802 | s[25] = (unsigned char) (s9 >> 11); | ||
803 | s[26] = (unsigned char) ((s9 >> 19) | (s10 << 2)); | ||
804 | s[27] = (unsigned char) (s10 >> 6); | ||
805 | s[28] = (unsigned char) ((s10 >> 14) | (s11 << 7)); | ||
806 | s[29] = (unsigned char) (s11 >> 1); | ||
807 | s[30] = (unsigned char) (s11 >> 9); | ||
808 | s[31] = (unsigned char) (s11 >> 17); | ||
809 | } | ||