Bug Summary

File:src/lib/libcrypto/curve25519/curve25519.c
Warning:line 3884, column 3
Value stored to 's18' is never read

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple amd64-unknown-openbsd7.4 -analyze -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name curve25519.c -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -mrelocation-model pic -pic-level 1 -pic-is-pie -mframe-pointer=all -relaxed-aliasing -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -target-feature +retpoline-indirect-calls -target-feature +retpoline-indirect-branches -tune-cpu generic -debugger-tuning=gdb -fcoverage-compilation-dir=/usr/src/lib/libcrypto/obj -resource-dir /usr/local/llvm16/lib/clang/16 -D LIBRESSL_INTERNAL -D HAVE_FUNOPEN -I /usr/src/lib/libcrypto -I /usr/src/lib/libcrypto/arch/amd64 -I /usr/src/lib/libcrypto/asn1 -I /usr/src/lib/libcrypto/bio -I /usr/src/lib/libcrypto/bn -I /usr/src/lib/libcrypto/bn/arch/amd64 -I /usr/src/lib/libcrypto/bytestring -I /usr/src/lib/libcrypto/curve25519 -I /usr/src/lib/libcrypto/dh -I /usr/src/lib/libcrypto/dsa -I /usr/src/lib/libcrypto/ec -I /usr/src/lib/libcrypto/ecdsa -I /usr/src/lib/libcrypto/evp -I /usr/src/lib/libcrypto/hidden -I /usr/src/lib/libcrypto/hmac -I /usr/src/lib/libcrypto/kdf -I /usr/src/lib/libcrypto/modes -I /usr/src/lib/libcrypto/ocsp -I /usr/src/lib/libcrypto/pkcs12 -I /usr/src/lib/libcrypto/rsa -I /usr/src/lib/libcrypto/sha -I /usr/src/lib/libcrypto/ts -I /usr/src/lib/libcrypto/x509 -I /usr/src/lib/libcrypto/obj -D AES_ASM -D BSAES_ASM -D VPAES_ASM -D OPENSSL_IA32_SSE2 -D RSA_ASM -D OPENSSL_BN_ASM_MONT -D OPENSSL_BN_ASM_MONT5 -D MD5_ASM -D GHASH_ASM -D RC4_MD5_ASM -D SHA1_ASM -D SHA256_ASM -D SHA512_ASM -D WHIRLPOOL_ASM -D OPENSSL_CPUID_OBJ -internal-isystem /usr/local/llvm16/lib/clang/16/include -internal-externc-isystem /usr/include -O2 -fdebug-compilation-dir=/usr/src/lib/libcrypto/obj -ferror-limit 19 -fwrapv -D_RET_PROTECTOR -ret-protector -fcf-protection=branch -fno-jump-tables -fgnuc-version=4.2.1 -vectorize-loops -vectorize-slp -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-valloc -fno-builtin-free -fno-builtin-strdup -fno-builtin-strndup -analyzer-output=html -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /home/ben/Projects/scan/2024-01-11-140451-98009-1 -x c /usr/src/lib/libcrypto/curve25519/curve25519.c
1/* $OpenBSD: curve25519.c,v 1.16 2023/07/08 15:12:49 beck Exp $ */
2/*
3 * Copyright (c) 2015, Google Inc.
4 *
5 * Permission to use, copy, modify, and/or distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
12 * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
14 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
15 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 */
17
18/*
19 * This code is mostly taken from the ref10 version of Ed25519 in SUPERCOP
20 * 20141124 (http://bench.cr.yp.to/supercop.html). That code is released as
21 * public domain but this file has the ISC license just to keep licencing
22 * simple.
23 *
24 * The field functions are shared by Ed25519 and X25519 where possible.
25 */
26
27#include <stdio.h>
28#include <stdlib.h>
29#include <string.h>
30
31#include <openssl/curve25519.h>
32#include <openssl/sha.h>
33
34#include "curve25519_internal.h"
35
36static const int64_t kBottom25Bits = 0x1ffffffLL;
37static const int64_t kBottom26Bits = 0x3ffffffLL;
38static const int64_t kTop39Bits = 0xfffffffffe000000LL;
39static const int64_t kTop38Bits = 0xfffffffffc000000LL;
40
41static uint64_t load_3(const uint8_t *in) {
42 uint64_t result;
43 result = (uint64_t)in[0];
44 result |= ((uint64_t)in[1]) << 8;
45 result |= ((uint64_t)in[2]) << 16;
46 return result;
47}
48
49static uint64_t load_4(const uint8_t *in) {
50 uint64_t result;
51 result = (uint64_t)in[0];
52 result |= ((uint64_t)in[1]) << 8;
53 result |= ((uint64_t)in[2]) << 16;
54 result |= ((uint64_t)in[3]) << 24;
55 return result;
56}
57
58static void fe_frombytes(fe h, const uint8_t *s) {
59 /* Ignores top bit of h. */
60 int64_t h0 = load_4(s);
61 int64_t h1 = load_3(s + 4) << 6;
62 int64_t h2 = load_3(s + 7) << 5;
63 int64_t h3 = load_3(s + 10) << 3;
64 int64_t h4 = load_3(s + 13) << 2;
65 int64_t h5 = load_4(s + 16);
66 int64_t h6 = load_3(s + 20) << 7;
67 int64_t h7 = load_3(s + 23) << 5;
68 int64_t h8 = load_3(s + 26) << 4;
69 int64_t h9 = (load_3(s + 29) & 8388607) << 2;
70 int64_t carry0;
71 int64_t carry1;
72 int64_t carry2;
73 int64_t carry3;
74 int64_t carry4;
75 int64_t carry5;
76 int64_t carry6;
77 int64_t carry7;
78 int64_t carry8;
79 int64_t carry9;
80
81 carry9 = h9 + (1 << 24); h0 += (carry9 >> 25) * 19; h9 -= carry9 & kTop39Bits;
82 carry1 = h1 + (1 << 24); h2 += carry1 >> 25; h1 -= carry1 & kTop39Bits;
83 carry3 = h3 + (1 << 24); h4 += carry3 >> 25; h3 -= carry3 & kTop39Bits;
84 carry5 = h5 + (1 << 24); h6 += carry5 >> 25; h5 -= carry5 & kTop39Bits;
85 carry7 = h7 + (1 << 24); h8 += carry7 >> 25; h7 -= carry7 & kTop39Bits;
86
87 carry0 = h0 + (1 << 25); h1 += carry0 >> 26; h0 -= carry0 & kTop38Bits;
88 carry2 = h2 + (1 << 25); h3 += carry2 >> 26; h2 -= carry2 & kTop38Bits;
89 carry4 = h4 + (1 << 25); h5 += carry4 >> 26; h4 -= carry4 & kTop38Bits;
90 carry6 = h6 + (1 << 25); h7 += carry6 >> 26; h6 -= carry6 & kTop38Bits;
91 carry8 = h8 + (1 << 25); h9 += carry8 >> 26; h8 -= carry8 & kTop38Bits;
92
93 h[0] = h0;
94 h[1] = h1;
95 h[2] = h2;
96 h[3] = h3;
97 h[4] = h4;
98 h[5] = h5;
99 h[6] = h6;
100 h[7] = h7;
101 h[8] = h8;
102 h[9] = h9;
103}
104
105/* Preconditions:
106 * |h| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc.
107 *
108 * Write p=2^255-19; q=floor(h/p).
109 * Basic claim: q = floor(2^(-255)(h + 19 2^(-25)h9 + 2^(-1))).
110 *
111 * Proof:
112 * Have |h|<=p so |q|<=1 so |19^2 2^(-255) q|<1/4.
113 * Also have |h-2^230 h9|<2^231 so |19 2^(-255)(h-2^230 h9)|<1/4.
114 *
115 * Write y=2^(-1)-19^2 2^(-255)q-19 2^(-255)(h-2^230 h9).
116 * Then 0<y<1.
117 *
118 * Write r=h-pq.
119 * Have 0<=r<=p-1=2^255-20.
120 * Thus 0<=r+19(2^-255)r<r+19(2^-255)2^255<=2^255-1.
121 *
122 * Write x=r+19(2^-255)r+y.
123 * Then 0<x<2^255 so floor(2^(-255)x) = 0 so floor(q+2^(-255)x) = q.
124 *
125 * Have q+2^(-255)x = 2^(-255)(h + 19 2^(-25) h9 + 2^(-1))
126 * so floor(2^(-255)(h + 19 2^(-25) h9 + 2^(-1))) = q. */
127static void fe_tobytes(uint8_t *s, const fe h) {
128 int32_t h0 = h[0];
129 int32_t h1 = h[1];
130 int32_t h2 = h[2];
131 int32_t h3 = h[3];
132 int32_t h4 = h[4];
133 int32_t h5 = h[5];
134 int32_t h6 = h[6];
135 int32_t h7 = h[7];
136 int32_t h8 = h[8];
137 int32_t h9 = h[9];
138 int32_t q;
139
140 q = (19 * h9 + (((int32_t) 1) << 24)) >> 25;
141 q = (h0 + q) >> 26;
142 q = (h1 + q) >> 25;
143 q = (h2 + q) >> 26;
144 q = (h3 + q) >> 25;
145 q = (h4 + q) >> 26;
146 q = (h5 + q) >> 25;
147 q = (h6 + q) >> 26;
148 q = (h7 + q) >> 25;
149 q = (h8 + q) >> 26;
150 q = (h9 + q) >> 25;
151
152 /* Goal: Output h-(2^255-19)q, which is between 0 and 2^255-20. */
153 h0 += 19 * q;
154 /* Goal: Output h-2^255 q, which is between 0 and 2^255-20. */
155
156 h1 += h0 >> 26; h0 &= kBottom26Bits;
157 h2 += h1 >> 25; h1 &= kBottom25Bits;
158 h3 += h2 >> 26; h2 &= kBottom26Bits;
159 h4 += h3 >> 25; h3 &= kBottom25Bits;
160 h5 += h4 >> 26; h4 &= kBottom26Bits;
161 h6 += h5 >> 25; h5 &= kBottom25Bits;
162 h7 += h6 >> 26; h6 &= kBottom26Bits;
163 h8 += h7 >> 25; h7 &= kBottom25Bits;
164 h9 += h8 >> 26; h8 &= kBottom26Bits;
165 h9 &= kBottom25Bits;
166 /* h10 = carry9 */
167
168 /* Goal: Output h0+...+2^255 h10-2^255 q, which is between 0 and 2^255-20.
169 * Have h0+...+2^230 h9 between 0 and 2^255-1;
170 * evidently 2^255 h10-2^255 q = 0.
171 * Goal: Output h0+...+2^230 h9. */
172
173 s[0] = h0 >> 0;
174 s[1] = h0 >> 8;
175 s[2] = h0 >> 16;
176 s[3] = (h0 >> 24) | ((uint32_t)(h1) << 2);
177 s[4] = h1 >> 6;
178 s[5] = h1 >> 14;
179 s[6] = (h1 >> 22) | ((uint32_t)(h2) << 3);
180 s[7] = h2 >> 5;
181 s[8] = h2 >> 13;
182 s[9] = (h2 >> 21) | ((uint32_t)(h3) << 5);
183 s[10] = h3 >> 3;
184 s[11] = h3 >> 11;
185 s[12] = (h3 >> 19) | ((uint32_t)(h4) << 6);
186 s[13] = h4 >> 2;
187 s[14] = h4 >> 10;
188 s[15] = h4 >> 18;
189 s[16] = h5 >> 0;
190 s[17] = h5 >> 8;
191 s[18] = h5 >> 16;
192 s[19] = (h5 >> 24) | ((uint32_t)(h6) << 1);
193 s[20] = h6 >> 7;
194 s[21] = h6 >> 15;
195 s[22] = (h6 >> 23) | ((uint32_t)(h7) << 3);
196 s[23] = h7 >> 5;
197 s[24] = h7 >> 13;
198 s[25] = (h7 >> 21) | ((uint32_t)(h8) << 4);
199 s[26] = h8 >> 4;
200 s[27] = h8 >> 12;
201 s[28] = (h8 >> 20) | ((uint32_t)(h9) << 6);
202 s[29] = h9 >> 2;
203 s[30] = h9 >> 10;
204 s[31] = h9 >> 18;
205}
206
207/* h = f */
208static void fe_copy(fe h, const fe f) {
209 memmove(h, f, sizeof(int32_t) * 10);
210}
211
212/* h = 0 */
213static void fe_0(fe h) { memset(h, 0, sizeof(int32_t) * 10); }
214
215/* h = 1 */
216static void fe_1(fe h) {
217 memset(h, 0, sizeof(int32_t) * 10);
218 h[0] = 1;
219}
220
221/* h = f + g
222 * Can overlap h with f or g.
223 *
224 * Preconditions:
225 * |f| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc.
226 * |g| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc.
227 *
228 * Postconditions:
229 * |h| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. */
230static void fe_add(fe h, const fe f, const fe g) {
231 unsigned i;
232 for (i = 0; i < 10; i++) {
233 h[i] = f[i] + g[i];
234 }
235}
236
237/* h = f - g
238 * Can overlap h with f or g.
239 *
240 * Preconditions:
241 * |f| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc.
242 * |g| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc.
243 *
244 * Postconditions:
245 * |h| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. */
246static void fe_sub(fe h, const fe f, const fe g) {
247 unsigned i;
248 for (i = 0; i < 10; i++) {
249 h[i] = f[i] - g[i];
250 }
251}
252
253/* h = f * g
254 * Can overlap h with f or g.
255 *
256 * Preconditions:
257 * |f| bounded by 1.65*2^26,1.65*2^25,1.65*2^26,1.65*2^25,etc.
258 * |g| bounded by 1.65*2^26,1.65*2^25,1.65*2^26,1.65*2^25,etc.
259 *
260 * Postconditions:
261 * |h| bounded by 1.01*2^25,1.01*2^24,1.01*2^25,1.01*2^24,etc.
262 *
263 * Notes on implementation strategy:
264 *
265 * Using schoolbook multiplication.
266 * Karatsuba would save a little in some cost models.
267 *
268 * Most multiplications by 2 and 19 are 32-bit precomputations;
269 * cheaper than 64-bit postcomputations.
270 *
271 * There is one remaining multiplication by 19 in the carry chain;
272 * one *19 precomputation can be merged into this,
273 * but the resulting data flow is considerably less clean.
274 *
275 * There are 12 carries below.
276 * 10 of them are 2-way parallelizable and vectorizable.
277 * Can get away with 11 carries, but then data flow is much deeper.
278 *
279 * With tighter constraints on inputs can squeeze carries into int32. */
280static void fe_mul(fe h, const fe f, const fe g) {
281 int32_t f0 = f[0];
282 int32_t f1 = f[1];
283 int32_t f2 = f[2];
284 int32_t f3 = f[3];
285 int32_t f4 = f[4];
286 int32_t f5 = f[5];
287 int32_t f6 = f[6];
288 int32_t f7 = f[7];
289 int32_t f8 = f[8];
290 int32_t f9 = f[9];
291 int32_t g0 = g[0];
292 int32_t g1 = g[1];
293 int32_t g2 = g[2];
294 int32_t g3 = g[3];
295 int32_t g4 = g[4];
296 int32_t g5 = g[5];
297 int32_t g6 = g[6];
298 int32_t g7 = g[7];
299 int32_t g8 = g[8];
300 int32_t g9 = g[9];
301 int32_t g1_19 = 19 * g1; /* 1.959375*2^29 */
302 int32_t g2_19 = 19 * g2; /* 1.959375*2^30; still ok */
303 int32_t g3_19 = 19 * g3;
304 int32_t g4_19 = 19 * g4;
305 int32_t g5_19 = 19 * g5;
306 int32_t g6_19 = 19 * g6;
307 int32_t g7_19 = 19 * g7;
308 int32_t g8_19 = 19 * g8;
309 int32_t g9_19 = 19 * g9;
310 int32_t f1_2 = 2 * f1;
311 int32_t f3_2 = 2 * f3;
312 int32_t f5_2 = 2 * f5;
313 int32_t f7_2 = 2 * f7;
314 int32_t f9_2 = 2 * f9;
315 int64_t f0g0 = f0 * (int64_t) g0;
316 int64_t f0g1 = f0 * (int64_t) g1;
317 int64_t f0g2 = f0 * (int64_t) g2;
318 int64_t f0g3 = f0 * (int64_t) g3;
319 int64_t f0g4 = f0 * (int64_t) g4;
320 int64_t f0g5 = f0 * (int64_t) g5;
321 int64_t f0g6 = f0 * (int64_t) g6;
322 int64_t f0g7 = f0 * (int64_t) g7;
323 int64_t f0g8 = f0 * (int64_t) g8;
324 int64_t f0g9 = f0 * (int64_t) g9;
325 int64_t f1g0 = f1 * (int64_t) g0;
326 int64_t f1g1_2 = f1_2 * (int64_t) g1;
327 int64_t f1g2 = f1 * (int64_t) g2;
328 int64_t f1g3_2 = f1_2 * (int64_t) g3;
329 int64_t f1g4 = f1 * (int64_t) g4;
330 int64_t f1g5_2 = f1_2 * (int64_t) g5;
331 int64_t f1g6 = f1 * (int64_t) g6;
332 int64_t f1g7_2 = f1_2 * (int64_t) g7;
333 int64_t f1g8 = f1 * (int64_t) g8;
334 int64_t f1g9_38 = f1_2 * (int64_t) g9_19;
335 int64_t f2g0 = f2 * (int64_t) g0;
336 int64_t f2g1 = f2 * (int64_t) g1;
337 int64_t f2g2 = f2 * (int64_t) g2;
338 int64_t f2g3 = f2 * (int64_t) g3;
339 int64_t f2g4 = f2 * (int64_t) g4;
340 int64_t f2g5 = f2 * (int64_t) g5;
341 int64_t f2g6 = f2 * (int64_t) g6;
342 int64_t f2g7 = f2 * (int64_t) g7;
343 int64_t f2g8_19 = f2 * (int64_t) g8_19;
344 int64_t f2g9_19 = f2 * (int64_t) g9_19;
345 int64_t f3g0 = f3 * (int64_t) g0;
346 int64_t f3g1_2 = f3_2 * (int64_t) g1;
347 int64_t f3g2 = f3 * (int64_t) g2;
348 int64_t f3g3_2 = f3_2 * (int64_t) g3;
349 int64_t f3g4 = f3 * (int64_t) g4;
350 int64_t f3g5_2 = f3_2 * (int64_t) g5;
351 int64_t f3g6 = f3 * (int64_t) g6;
352 int64_t f3g7_38 = f3_2 * (int64_t) g7_19;
353 int64_t f3g8_19 = f3 * (int64_t) g8_19;
354 int64_t f3g9_38 = f3_2 * (int64_t) g9_19;
355 int64_t f4g0 = f4 * (int64_t) g0;
356 int64_t f4g1 = f4 * (int64_t) g1;
357 int64_t f4g2 = f4 * (int64_t) g2;
358 int64_t f4g3 = f4 * (int64_t) g3;
359 int64_t f4g4 = f4 * (int64_t) g4;
360 int64_t f4g5 = f4 * (int64_t) g5;
361 int64_t f4g6_19 = f4 * (int64_t) g6_19;
362 int64_t f4g7_19 = f4 * (int64_t) g7_19;
363 int64_t f4g8_19 = f4 * (int64_t) g8_19;
364 int64_t f4g9_19 = f4 * (int64_t) g9_19;
365 int64_t f5g0 = f5 * (int64_t) g0;
366 int64_t f5g1_2 = f5_2 * (int64_t) g1;
367 int64_t f5g2 = f5 * (int64_t) g2;
368 int64_t f5g3_2 = f5_2 * (int64_t) g3;
369 int64_t f5g4 = f5 * (int64_t) g4;
370 int64_t f5g5_38 = f5_2 * (int64_t) g5_19;
371 int64_t f5g6_19 = f5 * (int64_t) g6_19;
372 int64_t f5g7_38 = f5_2 * (int64_t) g7_19;
373 int64_t f5g8_19 = f5 * (int64_t) g8_19;
374 int64_t f5g9_38 = f5_2 * (int64_t) g9_19;
375 int64_t f6g0 = f6 * (int64_t) g0;
376 int64_t f6g1 = f6 * (int64_t) g1;
377 int64_t f6g2 = f6 * (int64_t) g2;
378 int64_t f6g3 = f6 * (int64_t) g3;
379 int64_t f6g4_19 = f6 * (int64_t) g4_19;
380 int64_t f6g5_19 = f6 * (int64_t) g5_19;
381 int64_t f6g6_19 = f6 * (int64_t) g6_19;
382 int64_t f6g7_19 = f6 * (int64_t) g7_19;
383 int64_t f6g8_19 = f6 * (int64_t) g8_19;
384 int64_t f6g9_19 = f6 * (int64_t) g9_19;
385 int64_t f7g0 = f7 * (int64_t) g0;
386 int64_t f7g1_2 = f7_2 * (int64_t) g1;
387 int64_t f7g2 = f7 * (int64_t) g2;
388 int64_t f7g3_38 = f7_2 * (int64_t) g3_19;
389 int64_t f7g4_19 = f7 * (int64_t) g4_19;
390 int64_t f7g5_38 = f7_2 * (int64_t) g5_19;
391 int64_t f7g6_19 = f7 * (int64_t) g6_19;
392 int64_t f7g7_38 = f7_2 * (int64_t) g7_19;
393 int64_t f7g8_19 = f7 * (int64_t) g8_19;
394 int64_t f7g9_38 = f7_2 * (int64_t) g9_19;
395 int64_t f8g0 = f8 * (int64_t) g0;
396 int64_t f8g1 = f8 * (int64_t) g1;
397 int64_t f8g2_19 = f8 * (int64_t) g2_19;
398 int64_t f8g3_19 = f8 * (int64_t) g3_19;
399 int64_t f8g4_19 = f8 * (int64_t) g4_19;
400 int64_t f8g5_19 = f8 * (int64_t) g5_19;
401 int64_t f8g6_19 = f8 * (int64_t) g6_19;
402 int64_t f8g7_19 = f8 * (int64_t) g7_19;
403 int64_t f8g8_19 = f8 * (int64_t) g8_19;
404 int64_t f8g9_19 = f8 * (int64_t) g9_19;
405 int64_t f9g0 = f9 * (int64_t) g0;
406 int64_t f9g1_38 = f9_2 * (int64_t) g1_19;
407 int64_t f9g2_19 = f9 * (int64_t) g2_19;
408 int64_t f9g3_38 = f9_2 * (int64_t) g3_19;
409 int64_t f9g4_19 = f9 * (int64_t) g4_19;
410 int64_t f9g5_38 = f9_2 * (int64_t) g5_19;
411 int64_t f9g6_19 = f9 * (int64_t) g6_19;
412 int64_t f9g7_38 = f9_2 * (int64_t) g7_19;
413 int64_t f9g8_19 = f9 * (int64_t) g8_19;
414 int64_t f9g9_38 = f9_2 * (int64_t) g9_19;
415 int64_t h0 = f0g0+f1g9_38+f2g8_19+f3g7_38+f4g6_19+f5g5_38+f6g4_19+f7g3_38+f8g2_19+f9g1_38;
416 int64_t h1 = f0g1+f1g0 +f2g9_19+f3g8_19+f4g7_19+f5g6_19+f6g5_19+f7g4_19+f8g3_19+f9g2_19;
417 int64_t h2 = f0g2+f1g1_2 +f2g0 +f3g9_38+f4g8_19+f5g7_38+f6g6_19+f7g5_38+f8g4_19+f9g3_38;
418 int64_t h3 = f0g3+f1g2 +f2g1 +f3g0 +f4g9_19+f5g8_19+f6g7_19+f7g6_19+f8g5_19+f9g4_19;
419 int64_t h4 = f0g4+f1g3_2 +f2g2 +f3g1_2 +f4g0 +f5g9_38+f6g8_19+f7g7_38+f8g6_19+f9g5_38;
420 int64_t h5 = f0g5+f1g4 +f2g3 +f3g2 +f4g1 +f5g0 +f6g9_19+f7g8_19+f8g7_19+f9g6_19;
421 int64_t h6 = f0g6+f1g5_2 +f2g4 +f3g3_2 +f4g2 +f5g1_2 +f6g0 +f7g9_38+f8g8_19+f9g7_38;
422 int64_t h7 = f0g7+f1g6 +f2g5 +f3g4 +f4g3 +f5g2 +f6g1 +f7g0 +f8g9_19+f9g8_19;
423 int64_t h8 = f0g8+f1g7_2 +f2g6 +f3g5_2 +f4g4 +f5g3_2 +f6g2 +f7g1_2 +f8g0 +f9g9_38;
424 int64_t h9 = f0g9+f1g8 +f2g7 +f3g6 +f4g5 +f5g4 +f6g3 +f7g2 +f8g1 +f9g0 ;
425 int64_t carry0;
426 int64_t carry1;
427 int64_t carry2;
428 int64_t carry3;
429 int64_t carry4;
430 int64_t carry5;
431 int64_t carry6;
432 int64_t carry7;
433 int64_t carry8;
434 int64_t carry9;
435
436 /* |h0| <= (1.65*1.65*2^52*(1+19+19+19+19)+1.65*1.65*2^50*(38+38+38+38+38))
437 * i.e. |h0| <= 1.4*2^60; narrower ranges for h2, h4, h6, h8
438 * |h1| <= (1.65*1.65*2^51*(1+1+19+19+19+19+19+19+19+19))
439 * i.e. |h1| <= 1.7*2^59; narrower ranges for h3, h5, h7, h9 */
440
441 carry0 = h0 + (1 << 25); h1 += carry0 >> 26; h0 -= carry0 & kTop38Bits;
442 carry4 = h4 + (1 << 25); h5 += carry4 >> 26; h4 -= carry4 & kTop38Bits;
443 /* |h0| <= 2^25 */
444 /* |h4| <= 2^25 */
445 /* |h1| <= 1.71*2^59 */
446 /* |h5| <= 1.71*2^59 */
447
448 carry1 = h1 + (1 << 24); h2 += carry1 >> 25; h1 -= carry1 & kTop39Bits;
449 carry5 = h5 + (1 << 24); h6 += carry5 >> 25; h5 -= carry5 & kTop39Bits;
450 /* |h1| <= 2^24; from now on fits into int32 */
451 /* |h5| <= 2^24; from now on fits into int32 */
452 /* |h2| <= 1.41*2^60 */
453 /* |h6| <= 1.41*2^60 */
454
455 carry2 = h2 + (1 << 25); h3 += carry2 >> 26; h2 -= carry2 & kTop38Bits;
456 carry6 = h6 + (1 << 25); h7 += carry6 >> 26; h6 -= carry6 & kTop38Bits;
457 /* |h2| <= 2^25; from now on fits into int32 unchanged */
458 /* |h6| <= 2^25; from now on fits into int32 unchanged */
459 /* |h3| <= 1.71*2^59 */
460 /* |h7| <= 1.71*2^59 */
461
462 carry3 = h3 + (1 << 24); h4 += carry3 >> 25; h3 -= carry3 & kTop39Bits;
463 carry7 = h7 + (1 << 24); h8 += carry7 >> 25; h7 -= carry7 & kTop39Bits;
464 /* |h3| <= 2^24; from now on fits into int32 unchanged */
465 /* |h7| <= 2^24; from now on fits into int32 unchanged */
466 /* |h4| <= 1.72*2^34 */
467 /* |h8| <= 1.41*2^60 */
468
469 carry4 = h4 + (1 << 25); h5 += carry4 >> 26; h4 -= carry4 & kTop38Bits;
470 carry8 = h8 + (1 << 25); h9 += carry8 >> 26; h8 -= carry8 & kTop38Bits;
471 /* |h4| <= 2^25; from now on fits into int32 unchanged */
472 /* |h8| <= 2^25; from now on fits into int32 unchanged */
473 /* |h5| <= 1.01*2^24 */
474 /* |h9| <= 1.71*2^59 */
475
476 carry9 = h9 + (1 << 24); h0 += (carry9 >> 25) * 19; h9 -= carry9 & kTop39Bits;
477 /* |h9| <= 2^24; from now on fits into int32 unchanged */
478 /* |h0| <= 1.1*2^39 */
479
480 carry0 = h0 + (1 << 25); h1 += carry0 >> 26; h0 -= carry0 & kTop38Bits;
481 /* |h0| <= 2^25; from now on fits into int32 unchanged */
482 /* |h1| <= 1.01*2^24 */
483
484 h[0] = h0;
485 h[1] = h1;
486 h[2] = h2;
487 h[3] = h3;
488 h[4] = h4;
489 h[5] = h5;
490 h[6] = h6;
491 h[7] = h7;
492 h[8] = h8;
493 h[9] = h9;
494}
495
496/* h = f * f
497 * Can overlap h with f.
498 *
499 * Preconditions:
500 * |f| bounded by 1.65*2^26,1.65*2^25,1.65*2^26,1.65*2^25,etc.
501 *
502 * Postconditions:
503 * |h| bounded by 1.01*2^25,1.01*2^24,1.01*2^25,1.01*2^24,etc.
504 *
505 * See fe_mul.c for discussion of implementation strategy. */
506static void fe_sq(fe h, const fe f) {
507 int32_t f0 = f[0];
508 int32_t f1 = f[1];
509 int32_t f2 = f[2];
510 int32_t f3 = f[3];
511 int32_t f4 = f[4];
512 int32_t f5 = f[5];
513 int32_t f6 = f[6];
514 int32_t f7 = f[7];
515 int32_t f8 = f[8];
516 int32_t f9 = f[9];
517 int32_t f0_2 = 2 * f0;
518 int32_t f1_2 = 2 * f1;
519 int32_t f2_2 = 2 * f2;
520 int32_t f3_2 = 2 * f3;
521 int32_t f4_2 = 2 * f4;
522 int32_t f5_2 = 2 * f5;
523 int32_t f6_2 = 2 * f6;
524 int32_t f7_2 = 2 * f7;
525 int32_t f5_38 = 38 * f5; /* 1.959375*2^30 */
526 int32_t f6_19 = 19 * f6; /* 1.959375*2^30 */
527 int32_t f7_38 = 38 * f7; /* 1.959375*2^30 */
528 int32_t f8_19 = 19 * f8; /* 1.959375*2^30 */
529 int32_t f9_38 = 38 * f9; /* 1.959375*2^30 */
530 int64_t f0f0 = f0 * (int64_t) f0;
531 int64_t f0f1_2 = f0_2 * (int64_t) f1;
532 int64_t f0f2_2 = f0_2 * (int64_t) f2;
533 int64_t f0f3_2 = f0_2 * (int64_t) f3;
534 int64_t f0f4_2 = f0_2 * (int64_t) f4;
535 int64_t f0f5_2 = f0_2 * (int64_t) f5;
536 int64_t f0f6_2 = f0_2 * (int64_t) f6;
537 int64_t f0f7_2 = f0_2 * (int64_t) f7;
538 int64_t f0f8_2 = f0_2 * (int64_t) f8;
539 int64_t f0f9_2 = f0_2 * (int64_t) f9;
540 int64_t f1f1_2 = f1_2 * (int64_t) f1;
541 int64_t f1f2_2 = f1_2 * (int64_t) f2;
542 int64_t f1f3_4 = f1_2 * (int64_t) f3_2;
543 int64_t f1f4_2 = f1_2 * (int64_t) f4;
544 int64_t f1f5_4 = f1_2 * (int64_t) f5_2;
545 int64_t f1f6_2 = f1_2 * (int64_t) f6;
546 int64_t f1f7_4 = f1_2 * (int64_t) f7_2;
547 int64_t f1f8_2 = f1_2 * (int64_t) f8;
548 int64_t f1f9_76 = f1_2 * (int64_t) f9_38;
549 int64_t f2f2 = f2 * (int64_t) f2;
550 int64_t f2f3_2 = f2_2 * (int64_t) f3;
551 int64_t f2f4_2 = f2_2 * (int64_t) f4;
552 int64_t f2f5_2 = f2_2 * (int64_t) f5;
553 int64_t f2f6_2 = f2_2 * (int64_t) f6;
554 int64_t f2f7_2 = f2_2 * (int64_t) f7;
555 int64_t f2f8_38 = f2_2 * (int64_t) f8_19;
556 int64_t f2f9_38 = f2 * (int64_t) f9_38;
557 int64_t f3f3_2 = f3_2 * (int64_t) f3;
558 int64_t f3f4_2 = f3_2 * (int64_t) f4;
559 int64_t f3f5_4 = f3_2 * (int64_t) f5_2;
560 int64_t f3f6_2 = f3_2 * (int64_t) f6;
561 int64_t f3f7_76 = f3_2 * (int64_t) f7_38;
562 int64_t f3f8_38 = f3_2 * (int64_t) f8_19;
563 int64_t f3f9_76 = f3_2 * (int64_t) f9_38;
564 int64_t f4f4 = f4 * (int64_t) f4;
565 int64_t f4f5_2 = f4_2 * (int64_t) f5;
566 int64_t f4f6_38 = f4_2 * (int64_t) f6_19;
567 int64_t f4f7_38 = f4 * (int64_t) f7_38;
568 int64_t f4f8_38 = f4_2 * (int64_t) f8_19;
569 int64_t f4f9_38 = f4 * (int64_t) f9_38;
570 int64_t f5f5_38 = f5 * (int64_t) f5_38;
571 int64_t f5f6_38 = f5_2 * (int64_t) f6_19;
572 int64_t f5f7_76 = f5_2 * (int64_t) f7_38;
573 int64_t f5f8_38 = f5_2 * (int64_t) f8_19;
574 int64_t f5f9_76 = f5_2 * (int64_t) f9_38;
575 int64_t f6f6_19 = f6 * (int64_t) f6_19;
576 int64_t f6f7_38 = f6 * (int64_t) f7_38;
577 int64_t f6f8_38 = f6_2 * (int64_t) f8_19;
578 int64_t f6f9_38 = f6 * (int64_t) f9_38;
579 int64_t f7f7_38 = f7 * (int64_t) f7_38;
580 int64_t f7f8_38 = f7_2 * (int64_t) f8_19;
581 int64_t f7f9_76 = f7_2 * (int64_t) f9_38;
582 int64_t f8f8_19 = f8 * (int64_t) f8_19;
583 int64_t f8f9_38 = f8 * (int64_t) f9_38;
584 int64_t f9f9_38 = f9 * (int64_t) f9_38;
585 int64_t h0 = f0f0 +f1f9_76+f2f8_38+f3f7_76+f4f6_38+f5f5_38;
586 int64_t h1 = f0f1_2+f2f9_38+f3f8_38+f4f7_38+f5f6_38;
587 int64_t h2 = f0f2_2+f1f1_2 +f3f9_76+f4f8_38+f5f7_76+f6f6_19;
588 int64_t h3 = f0f3_2+f1f2_2 +f4f9_38+f5f8_38+f6f7_38;
589 int64_t h4 = f0f4_2+f1f3_4 +f2f2 +f5f9_76+f6f8_38+f7f7_38;
590 int64_t h5 = f0f5_2+f1f4_2 +f2f3_2 +f6f9_38+f7f8_38;
591 int64_t h6 = f0f6_2+f1f5_4 +f2f4_2 +f3f3_2 +f7f9_76+f8f8_19;
592 int64_t h7 = f0f7_2+f1f6_2 +f2f5_2 +f3f4_2 +f8f9_38;
593 int64_t h8 = f0f8_2+f1f7_4 +f2f6_2 +f3f5_4 +f4f4 +f9f9_38;
594 int64_t h9 = f0f9_2+f1f8_2 +f2f7_2 +f3f6_2 +f4f5_2;
595 int64_t carry0;
596 int64_t carry1;
597 int64_t carry2;
598 int64_t carry3;
599 int64_t carry4;
600 int64_t carry5;
601 int64_t carry6;
602 int64_t carry7;
603 int64_t carry8;
604 int64_t carry9;
605
606 carry0 = h0 + (1 << 25); h1 += carry0 >> 26; h0 -= carry0 & kTop38Bits;
607 carry4 = h4 + (1 << 25); h5 += carry4 >> 26; h4 -= carry4 & kTop38Bits;
608
609 carry1 = h1 + (1 << 24); h2 += carry1 >> 25; h1 -= carry1 & kTop39Bits;
610 carry5 = h5 + (1 << 24); h6 += carry5 >> 25; h5 -= carry5 & kTop39Bits;
611
612 carry2 = h2 + (1 << 25); h3 += carry2 >> 26; h2 -= carry2 & kTop38Bits;
613 carry6 = h6 + (1 << 25); h7 += carry6 >> 26; h6 -= carry6 & kTop38Bits;
614
615 carry3 = h3 + (1 << 24); h4 += carry3 >> 25; h3 -= carry3 & kTop39Bits;
616 carry7 = h7 + (1 << 24); h8 += carry7 >> 25; h7 -= carry7 & kTop39Bits;
617
618 carry4 = h4 + (1 << 25); h5 += carry4 >> 26; h4 -= carry4 & kTop38Bits;
619 carry8 = h8 + (1 << 25); h9 += carry8 >> 26; h8 -= carry8 & kTop38Bits;
620
621 carry9 = h9 + (1 << 24); h0 += (carry9 >> 25) * 19; h9 -= carry9 & kTop39Bits;
622
623 carry0 = h0 + (1 << 25); h1 += carry0 >> 26; h0 -= carry0 & kTop38Bits;
624
625 h[0] = h0;
626 h[1] = h1;
627 h[2] = h2;
628 h[3] = h3;
629 h[4] = h4;
630 h[5] = h5;
631 h[6] = h6;
632 h[7] = h7;
633 h[8] = h8;
634 h[9] = h9;
635}
636
637static void fe_invert(fe out, const fe z) {
638 fe t0;
639 fe t1;
640 fe t2;
641 fe t3;
642 int i;
643
644 fe_sq(t0, z);
645 fe_sq(t1, t0);
646 for (i = 1; i < 2; ++i) {
647 fe_sq(t1, t1);
648 }
649 fe_mul(t1, z, t1);
650 fe_mul(t0, t0, t1);
651 fe_sq(t2, t0);
652 fe_mul(t1, t1, t2);
653 fe_sq(t2, t1);
654 for (i = 1; i < 5; ++i) {
655 fe_sq(t2, t2);
656 }
657 fe_mul(t1, t2, t1);
658 fe_sq(t2, t1);
659 for (i = 1; i < 10; ++i) {
660 fe_sq(t2, t2);
661 }
662 fe_mul(t2, t2, t1);
663 fe_sq(t3, t2);
664 for (i = 1; i < 20; ++i) {
665 fe_sq(t3, t3);
666 }
667 fe_mul(t2, t3, t2);
668 fe_sq(t2, t2);
669 for (i = 1; i < 10; ++i) {
670 fe_sq(t2, t2);
671 }
672 fe_mul(t1, t2, t1);
673 fe_sq(t2, t1);
674 for (i = 1; i < 50; ++i) {
675 fe_sq(t2, t2);
676 }
677 fe_mul(t2, t2, t1);
678 fe_sq(t3, t2);
679 for (i = 1; i < 100; ++i) {
680 fe_sq(t3, t3);
681 }
682 fe_mul(t2, t3, t2);
683 fe_sq(t2, t2);
684 for (i = 1; i < 50; ++i) {
685 fe_sq(t2, t2);
686 }
687 fe_mul(t1, t2, t1);
688 fe_sq(t1, t1);
689 for (i = 1; i < 5; ++i) {
690 fe_sq(t1, t1);
691 }
692 fe_mul(out, t1, t0);
693}
694
695/* h = -f
696 *
697 * Preconditions:
698 * |f| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc.
699 *
700 * Postconditions:
701 * |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. */
702static void fe_neg(fe h, const fe f) {
703 unsigned i;
704 for (i = 0; i < 10; i++) {
705 h[i] = -f[i];
706 }
707}
708
709/* Replace (f,g) with (g,g) if b == 1;
710 * replace (f,g) with (f,g) if b == 0.
711 *
712 * Preconditions: b in {0,1}. */
713static void fe_cmov(fe f, const fe g, unsigned b) {
714 b = 0-b;
715 unsigned i;
716 for (i = 0; i < 10; i++) {
717 int32_t x = f[i] ^ g[i];
718 x &= b;
719 f[i] ^= x;
720 }
721}
722
723/* return 0 if f == 0
724 * return 1 if f != 0
725 *
726 * Preconditions:
727 * |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. */
728static int fe_isnonzero(const fe f) {
729 uint8_t s[32];
730 fe_tobytes(s, f);
731
732 static const uint8_t zero[32] = {0};
733 return timingsafe_memcmp(s, zero, sizeof(zero)) != 0;
734}
735
736/* return 1 if f is in {1,3,5,...,q-2}
737 * return 0 if f is in {0,2,4,...,q-1}
738 *
739 * Preconditions:
740 * |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. */
741static int fe_isnegative(const fe f) {
742 uint8_t s[32];
743 fe_tobytes(s, f);
744 return s[0] & 1;
745}
746
747/* h = 2 * f * f
748 * Can overlap h with f.
749 *
750 * Preconditions:
751 * |f| bounded by 1.65*2^26,1.65*2^25,1.65*2^26,1.65*2^25,etc.
752 *
753 * Postconditions:
754 * |h| bounded by 1.01*2^25,1.01*2^24,1.01*2^25,1.01*2^24,etc.
755 *
756 * See fe_mul.c for discussion of implementation strategy. */
757static void fe_sq2(fe h, const fe f) {
758 int32_t f0 = f[0];
759 int32_t f1 = f[1];
760 int32_t f2 = f[2];
761 int32_t f3 = f[3];
762 int32_t f4 = f[4];
763 int32_t f5 = f[5];
764 int32_t f6 = f[6];
765 int32_t f7 = f[7];
766 int32_t f8 = f[8];
767 int32_t f9 = f[9];
768 int32_t f0_2 = 2 * f0;
769 int32_t f1_2 = 2 * f1;
770 int32_t f2_2 = 2 * f2;
771 int32_t f3_2 = 2 * f3;
772 int32_t f4_2 = 2 * f4;
773 int32_t f5_2 = 2 * f5;
774 int32_t f6_2 = 2 * f6;
775 int32_t f7_2 = 2 * f7;
776 int32_t f5_38 = 38 * f5; /* 1.959375*2^30 */
777 int32_t f6_19 = 19 * f6; /* 1.959375*2^30 */
778 int32_t f7_38 = 38 * f7; /* 1.959375*2^30 */
779 int32_t f8_19 = 19 * f8; /* 1.959375*2^30 */
780 int32_t f9_38 = 38 * f9; /* 1.959375*2^30 */
781 int64_t f0f0 = f0 * (int64_t) f0;
782 int64_t f0f1_2 = f0_2 * (int64_t) f1;
783 int64_t f0f2_2 = f0_2 * (int64_t) f2;
784 int64_t f0f3_2 = f0_2 * (int64_t) f3;
785 int64_t f0f4_2 = f0_2 * (int64_t) f4;
786 int64_t f0f5_2 = f0_2 * (int64_t) f5;
787 int64_t f0f6_2 = f0_2 * (int64_t) f6;
788 int64_t f0f7_2 = f0_2 * (int64_t) f7;
789 int64_t f0f8_2 = f0_2 * (int64_t) f8;
790 int64_t f0f9_2 = f0_2 * (int64_t) f9;
791 int64_t f1f1_2 = f1_2 * (int64_t) f1;
792 int64_t f1f2_2 = f1_2 * (int64_t) f2;
793 int64_t f1f3_4 = f1_2 * (int64_t) f3_2;
794 int64_t f1f4_2 = f1_2 * (int64_t) f4;
795 int64_t f1f5_4 = f1_2 * (int64_t) f5_2;
796 int64_t f1f6_2 = f1_2 * (int64_t) f6;
797 int64_t f1f7_4 = f1_2 * (int64_t) f7_2;
798 int64_t f1f8_2 = f1_2 * (int64_t) f8;
799 int64_t f1f9_76 = f1_2 * (int64_t) f9_38;
800 int64_t f2f2 = f2 * (int64_t) f2;
801 int64_t f2f3_2 = f2_2 * (int64_t) f3;
802 int64_t f2f4_2 = f2_2 * (int64_t) f4;
803 int64_t f2f5_2 = f2_2 * (int64_t) f5;
804 int64_t f2f6_2 = f2_2 * (int64_t) f6;
805 int64_t f2f7_2 = f2_2 * (int64_t) f7;
806 int64_t f2f8_38 = f2_2 * (int64_t) f8_19;
807 int64_t f2f9_38 = f2 * (int64_t) f9_38;
808 int64_t f3f3_2 = f3_2 * (int64_t) f3;
809 int64_t f3f4_2 = f3_2 * (int64_t) f4;
810 int64_t f3f5_4 = f3_2 * (int64_t) f5_2;
811 int64_t f3f6_2 = f3_2 * (int64_t) f6;
812 int64_t f3f7_76 = f3_2 * (int64_t) f7_38;
813 int64_t f3f8_38 = f3_2 * (int64_t) f8_19;
814 int64_t f3f9_76 = f3_2 * (int64_t) f9_38;
815 int64_t f4f4 = f4 * (int64_t) f4;
816 int64_t f4f5_2 = f4_2 * (int64_t) f5;
817 int64_t f4f6_38 = f4_2 * (int64_t) f6_19;
818 int64_t f4f7_38 = f4 * (int64_t) f7_38;
819 int64_t f4f8_38 = f4_2 * (int64_t) f8_19;
820 int64_t f4f9_38 = f4 * (int64_t) f9_38;
821 int64_t f5f5_38 = f5 * (int64_t) f5_38;
822 int64_t f5f6_38 = f5_2 * (int64_t) f6_19;
823 int64_t f5f7_76 = f5_2 * (int64_t) f7_38;
824 int64_t f5f8_38 = f5_2 * (int64_t) f8_19;
825 int64_t f5f9_76 = f5_2 * (int64_t) f9_38;
826 int64_t f6f6_19 = f6 * (int64_t) f6_19;
827 int64_t f6f7_38 = f6 * (int64_t) f7_38;
828 int64_t f6f8_38 = f6_2 * (int64_t) f8_19;
829 int64_t f6f9_38 = f6 * (int64_t) f9_38;
830 int64_t f7f7_38 = f7 * (int64_t) f7_38;
831 int64_t f7f8_38 = f7_2 * (int64_t) f8_19;
832 int64_t f7f9_76 = f7_2 * (int64_t) f9_38;
833 int64_t f8f8_19 = f8 * (int64_t) f8_19;
834 int64_t f8f9_38 = f8 * (int64_t) f9_38;
835 int64_t f9f9_38 = f9 * (int64_t) f9_38;
836 int64_t h0 = f0f0 +f1f9_76+f2f8_38+f3f7_76+f4f6_38+f5f5_38;
837 int64_t h1 = f0f1_2+f2f9_38+f3f8_38+f4f7_38+f5f6_38;
838 int64_t h2 = f0f2_2+f1f1_2 +f3f9_76+f4f8_38+f5f7_76+f6f6_19;
839 int64_t h3 = f0f3_2+f1f2_2 +f4f9_38+f5f8_38+f6f7_38;
840 int64_t h4 = f0f4_2+f1f3_4 +f2f2 +f5f9_76+f6f8_38+f7f7_38;
841 int64_t h5 = f0f5_2+f1f4_2 +f2f3_2 +f6f9_38+f7f8_38;
842 int64_t h6 = f0f6_2+f1f5_4 +f2f4_2 +f3f3_2 +f7f9_76+f8f8_19;
843 int64_t h7 = f0f7_2+f1f6_2 +f2f5_2 +f3f4_2 +f8f9_38;
844 int64_t h8 = f0f8_2+f1f7_4 +f2f6_2 +f3f5_4 +f4f4 +f9f9_38;
845 int64_t h9 = f0f9_2+f1f8_2 +f2f7_2 +f3f6_2 +f4f5_2;
846 int64_t carry0;
847 int64_t carry1;
848 int64_t carry2;
849 int64_t carry3;
850 int64_t carry4;
851 int64_t carry5;
852 int64_t carry6;
853 int64_t carry7;
854 int64_t carry8;
855 int64_t carry9;
856
857 h0 += h0;
858 h1 += h1;
859 h2 += h2;
860 h3 += h3;
861 h4 += h4;
862 h5 += h5;
863 h6 += h6;
864 h7 += h7;
865 h8 += h8;
866 h9 += h9;
867
868 carry0 = h0 + (1 << 25); h1 += carry0 >> 26; h0 -= carry0 & kTop38Bits;
869 carry4 = h4 + (1 << 25); h5 += carry4 >> 26; h4 -= carry4 & kTop38Bits;
870
871 carry1 = h1 + (1 << 24); h2 += carry1 >> 25; h1 -= carry1 & kTop39Bits;
872 carry5 = h5 + (1 << 24); h6 += carry5 >> 25; h5 -= carry5 & kTop39Bits;
873
874 carry2 = h2 + (1 << 25); h3 += carry2 >> 26; h2 -= carry2 & kTop38Bits;
875 carry6 = h6 + (1 << 25); h7 += carry6 >> 26; h6 -= carry6 & kTop38Bits;
876
877 carry3 = h3 + (1 << 24); h4 += carry3 >> 25; h3 -= carry3 & kTop39Bits;
878 carry7 = h7 + (1 << 24); h8 += carry7 >> 25; h7 -= carry7 & kTop39Bits;
879
880 carry4 = h4 + (1 << 25); h5 += carry4 >> 26; h4 -= carry4 & kTop38Bits;
881 carry8 = h8 + (1 << 25); h9 += carry8 >> 26; h8 -= carry8 & kTop38Bits;
882
883 carry9 = h9 + (1 << 24); h0 += (carry9 >> 25) * 19; h9 -= carry9 & kTop39Bits;
884
885 carry0 = h0 + (1 << 25); h1 += carry0 >> 26; h0 -= carry0 & kTop38Bits;
886
887 h[0] = h0;
888 h[1] = h1;
889 h[2] = h2;
890 h[3] = h3;
891 h[4] = h4;
892 h[5] = h5;
893 h[6] = h6;
894 h[7] = h7;
895 h[8] = h8;
896 h[9] = h9;
897}
898
899static void fe_pow22523(fe out, const fe z) {
900 fe t0;
901 fe t1;
902 fe t2;
903 int i;
904
905 fe_sq(t0, z);
906 fe_sq(t1, t0);
907 for (i = 1; i < 2; ++i) {
908 fe_sq(t1, t1);
909 }
910 fe_mul(t1, z, t1);
911 fe_mul(t0, t0, t1);
912 fe_sq(t0, t0);
913 fe_mul(t0, t1, t0);
914 fe_sq(t1, t0);
915 for (i = 1; i < 5; ++i) {
916 fe_sq(t1, t1);
917 }
918 fe_mul(t0, t1, t0);
919 fe_sq(t1, t0);
920 for (i = 1; i < 10; ++i) {
921 fe_sq(t1, t1);
922 }
923 fe_mul(t1, t1, t0);
924 fe_sq(t2, t1);
925 for (i = 1; i < 20; ++i) {
926 fe_sq(t2, t2);
927 }
928 fe_mul(t1, t2, t1);
929 fe_sq(t1, t1);
930 for (i = 1; i < 10; ++i) {
931 fe_sq(t1, t1);
932 }
933 fe_mul(t0, t1, t0);
934 fe_sq(t1, t0);
935 for (i = 1; i < 50; ++i) {
936 fe_sq(t1, t1);
937 }
938 fe_mul(t1, t1, t0);
939 fe_sq(t2, t1);
940 for (i = 1; i < 100; ++i) {
941 fe_sq(t2, t2);
942 }
943 fe_mul(t1, t2, t1);
944 fe_sq(t1, t1);
945 for (i = 1; i < 50; ++i) {
946 fe_sq(t1, t1);
947 }
948 fe_mul(t0, t1, t0);
949 fe_sq(t0, t0);
950 for (i = 1; i < 2; ++i) {
951 fe_sq(t0, t0);
952 }
953 fe_mul(out, t0, z);
954}
955
956void x25519_ge_tobytes(uint8_t *s, const ge_p2 *h) {
957 fe recip;
958 fe x;
959 fe y;
960
961 fe_invert(recip, h->Z);
962 fe_mul(x, h->X, recip);
963 fe_mul(y, h->Y, recip);
964 fe_tobytes(s, y);
965 s[31] ^= fe_isnegative(x) << 7;
966}
967
968static void ge_p3_tobytes(uint8_t *s, const ge_p3 *h) {
969 fe recip;
970 fe x;
971 fe y;
972
973 fe_invert(recip, h->Z);
974 fe_mul(x, h->X, recip);
975 fe_mul(y, h->Y, recip);
976 fe_tobytes(s, y);
977 s[31] ^= fe_isnegative(x) << 7;
978}
979
980static const fe d = {-10913610, 13857413, -15372611, 6949391, 114729,
981 -8787816, -6275908, -3247719, -18696448, -12055116};
982
983static const fe sqrtm1 = {-32595792, -7943725, 9377950, 3500415, 12389472,
984 -272473, -25146209, -2005654, 326686, 11406482};
985
986int x25519_ge_frombytes_vartime(ge_p3 *h, const uint8_t *s) {
987 fe u;
988 fe v;
989 fe v3;
990 fe vxx;
991 fe check;
992
993 fe_frombytes(h->Y, s);
994 fe_1(h->Z);
995 fe_sq(u, h->Y);
996 fe_mul(v, u, d);
997 fe_sub(u, u, h->Z); /* u = y^2-1 */
998 fe_add(v, v, h->Z); /* v = dy^2+1 */
999
1000 fe_sq(v3, v);
1001 fe_mul(v3, v3, v); /* v3 = v^3 */
1002 fe_sq(h->X, v3);
1003 fe_mul(h->X, h->X, v);
1004 fe_mul(h->X, h->X, u); /* x = uv^7 */
1005
1006 fe_pow22523(h->X, h->X); /* x = (uv^7)^((q-5)/8) */
1007 fe_mul(h->X, h->X, v3);
1008 fe_mul(h->X, h->X, u); /* x = uv^3(uv^7)^((q-5)/8) */
1009
1010 fe_sq(vxx, h->X);
1011 fe_mul(vxx, vxx, v);
1012 fe_sub(check, vxx, u); /* vx^2-u */
1013 if (fe_isnonzero(check)) {
1014 fe_add(check, vxx, u); /* vx^2+u */
1015 if (fe_isnonzero(check)) {
1016 return -1;
1017 }
1018 fe_mul(h->X, h->X, sqrtm1);
1019 }
1020
1021 if (fe_isnegative(h->X) != (s[31] >> 7)) {
1022 fe_neg(h->X, h->X);
1023 }
1024
1025 fe_mul(h->T, h->X, h->Y);
1026 return 0;
1027}
1028
1029static void ge_p2_0(ge_p2 *h) {
1030 fe_0(h->X);
1031 fe_1(h->Y);
1032 fe_1(h->Z);
1033}
1034
1035static void ge_p3_0(ge_p3 *h) {
1036 fe_0(h->X);
1037 fe_1(h->Y);
1038 fe_1(h->Z);
1039 fe_0(h->T);
1040}
1041
1042static void ge_cached_0(ge_cached *h) {
1043 fe_1(h->YplusX);
1044 fe_1(h->YminusX);
1045 fe_1(h->Z);
1046 fe_0(h->T2d);
1047}
1048
1049static void ge_precomp_0(ge_precomp *h) {
1050 fe_1(h->yplusx);
1051 fe_1(h->yminusx);
1052 fe_0(h->xy2d);
1053}
1054
1055/* r = p */
1056static void ge_p3_to_p2(ge_p2 *r, const ge_p3 *p) {
1057 fe_copy(r->X, p->X);
1058 fe_copy(r->Y, p->Y);
1059 fe_copy(r->Z, p->Z);
1060}
1061
1062static const fe d2 = {-21827239, -5839606, -30745221, 13898782, 229458,
1063 15978800, -12551817, -6495438, 29715968, 9444199};
1064
1065/* r = p */
1066void x25519_ge_p3_to_cached(ge_cached *r, const ge_p3 *p) {
1067 fe_add(r->YplusX, p->Y, p->X);
1068 fe_sub(r->YminusX, p->Y, p->X);
1069 fe_copy(r->Z, p->Z);
1070 fe_mul(r->T2d, p->T, d2);
1071}
1072
1073/* r = p */
1074void x25519_ge_p1p1_to_p2(ge_p2 *r, const ge_p1p1 *p) {
1075 fe_mul(r->X, p->X, p->T);
1076 fe_mul(r->Y, p->Y, p->Z);
1077 fe_mul(r->Z, p->Z, p->T);
1078}
1079
1080/* r = p */
1081void x25519_ge_p1p1_to_p3(ge_p3 *r, const ge_p1p1 *p) {
1082 fe_mul(r->X, p->X, p->T);
1083 fe_mul(r->Y, p->Y, p->Z);
1084 fe_mul(r->Z, p->Z, p->T);
1085 fe_mul(r->T, p->X, p->Y);
1086}
1087
1088/* r = p */
1089static void ge_p1p1_to_cached(ge_cached *r, const ge_p1p1 *p) {
1090 ge_p3 t;
1091 x25519_ge_p1p1_to_p3(&t, p);
1092 x25519_ge_p3_to_cached(r, &t);
1093}
1094
1095/* r = 2 * p */
1096static void ge_p2_dbl(ge_p1p1 *r, const ge_p2 *p) {
1097 fe t0;
1098
1099 fe_sq(r->X, p->X);
1100 fe_sq(r->Z, p->Y);
1101 fe_sq2(r->T, p->Z);
1102 fe_add(r->Y, p->X, p->Y);
1103 fe_sq(t0, r->Y);
1104 fe_add(r->Y, r->Z, r->X);
1105 fe_sub(r->Z, r->Z, r->X);
1106 fe_sub(r->X, t0, r->Y);
1107 fe_sub(r->T, r->T, r->Z);
1108}
1109
1110/* r = 2 * p */
1111static void ge_p3_dbl(ge_p1p1 *r, const ge_p3 *p) {
1112 ge_p2 q;
1113 ge_p3_to_p2(&q, p);
1114 ge_p2_dbl(r, &q);
1115}
1116
1117/* r = p + q */
1118static void ge_madd(ge_p1p1 *r, const ge_p3 *p, const ge_precomp *q) {
1119 fe t0;
1120
1121 fe_add(r->X, p->Y, p->X);
1122 fe_sub(r->Y, p->Y, p->X);
1123 fe_mul(r->Z, r->X, q->yplusx);
1124 fe_mul(r->Y, r->Y, q->yminusx);
1125 fe_mul(r->T, q->xy2d, p->T);
1126 fe_add(t0, p->Z, p->Z);
1127 fe_sub(r->X, r->Z, r->Y);
1128 fe_add(r->Y, r->Z, r->Y);
1129 fe_add(r->Z, t0, r->T);
1130 fe_sub(r->T, t0, r->T);
1131}
1132
1133/* r = p - q */
1134static void ge_msub(ge_p1p1 *r, const ge_p3 *p, const ge_precomp *q) {
1135 fe t0;
1136
1137 fe_add(r->X, p->Y, p->X);
1138 fe_sub(r->Y, p->Y, p->X);
1139 fe_mul(r->Z, r->X, q->yminusx);
1140 fe_mul(r->Y, r->Y, q->yplusx);
1141 fe_mul(r->T, q->xy2d, p->T);
1142 fe_add(t0, p->Z, p->Z);
1143 fe_sub(r->X, r->Z, r->Y);
1144 fe_add(r->Y, r->Z, r->Y);
1145 fe_sub(r->Z, t0, r->T);
1146 fe_add(r->T, t0, r->T);
1147}
1148
1149/* r = p + q */
1150void x25519_ge_add(ge_p1p1 *r, const ge_p3 *p, const ge_cached *q) {
1151 fe t0;
1152
1153 fe_add(r->X, p->Y, p->X);
1154 fe_sub(r->Y, p->Y, p->X);
1155 fe_mul(r->Z, r->X, q->YplusX);
1156 fe_mul(r->Y, r->Y, q->YminusX);
1157 fe_mul(r->T, q->T2d, p->T);
1158 fe_mul(r->X, p->Z, q->Z);
1159 fe_add(t0, r->X, r->X);
1160 fe_sub(r->X, r->Z, r->Y);
1161 fe_add(r->Y, r->Z, r->Y);
1162 fe_add(r->Z, t0, r->T);
1163 fe_sub(r->T, t0, r->T);
1164}
1165
1166/* r = p - q */
1167void x25519_ge_sub(ge_p1p1 *r, const ge_p3 *p, const ge_cached *q) {
1168 fe t0;
1169
1170 fe_add(r->X, p->Y, p->X);
1171 fe_sub(r->Y, p->Y, p->X);
1172 fe_mul(r->Z, r->X, q->YminusX);
1173 fe_mul(r->Y, r->Y, q->YplusX);
1174 fe_mul(r->T, q->T2d, p->T);
1175 fe_mul(r->X, p->Z, q->Z);
1176 fe_add(t0, r->X, r->X);
1177 fe_sub(r->X, r->Z, r->Y);
1178 fe_add(r->Y, r->Z, r->Y);
1179 fe_sub(r->Z, t0, r->T);
1180 fe_add(r->T, t0, r->T);
1181}
1182
1183static uint8_t equal(signed char b, signed char c) {
1184 uint8_t ub = b;
1185 uint8_t uc = c;
1186 uint8_t x = ub ^ uc; /* 0: yes; 1..255: no */
1187 uint32_t y = x; /* 0: yes; 1..255: no */
1188 y -= 1; /* 4294967295: yes; 0..254: no */
1189 y >>= 31; /* 1: yes; 0: no */
1190 return y;
1191}
1192
1193static void cmov(ge_precomp *t, const ge_precomp *u, uint8_t b) {
1194 fe_cmov(t->yplusx, u->yplusx, b);
1195 fe_cmov(t->yminusx, u->yminusx, b);
1196 fe_cmov(t->xy2d, u->xy2d, b);
1197}
1198
1199void x25519_ge_scalarmult_small_precomp(
1200 ge_p3 *h, const uint8_t a[32], const uint8_t precomp_table[15 * 2 * 32]) {
1201 /* precomp_table is first expanded into matching |ge_precomp|
1202 * elements. */
1203 ge_precomp multiples[15];
1204
1205 unsigned i;
1206 for (i = 0; i < 15; i++) {
1207 const uint8_t *bytes = &precomp_table[i*(2 * 32)];
1208 fe x, y;
1209 fe_frombytes(x, bytes);
1210 fe_frombytes(y, bytes + 32);
1211
1212 ge_precomp *out = &multiples[i];
1213 fe_add(out->yplusx, y, x);
1214 fe_sub(out->yminusx, y, x);
1215 fe_mul(out->xy2d, x, y);
1216 fe_mul(out->xy2d, out->xy2d, d2);
1217 }
1218
1219 /* See the comment above |k25519SmallPrecomp| about the structure of the
1220 * precomputed elements. This loop does 64 additions and 64 doublings to
1221 * calculate the result. */
1222 ge_p3_0(h);
1223
1224 for (i = 63; i < 64; i--) {
1225 unsigned j;
1226 signed char index = 0;
1227
1228 for (j = 0; j < 4; j++) {
1229 const uint8_t bit = 1 & (a[(8 * j) + (i / 8)] >> (i & 7));
1230 index |= (bit << j);
1231 }
1232
1233 ge_precomp e;
1234 ge_precomp_0(&e);
1235
1236 for (j = 1; j < 16; j++) {
1237 cmov(&e, &multiples[j-1], equal(index, j));
1238 }
1239
1240 ge_cached cached;
1241 ge_p1p1 r;
1242 x25519_ge_p3_to_cached(&cached, h);
1243 x25519_ge_add(&r, h, &cached);
1244 x25519_ge_p1p1_to_p3(h, &r);
1245
1246 ge_madd(&r, h, &e);
1247 x25519_ge_p1p1_to_p3(h, &r);
1248 }
1249}
1250
1251#if defined(OPENSSL_SMALL)
1252
1253/* This block of code replaces the standard base-point table with a much smaller
1254 * one. The standard table is 30,720 bytes while this one is just 960.
1255 *
1256 * This table contains 15 pairs of group elements, (x, y), where each field
1257 * element is serialised with |fe_tobytes|. If |i| is the index of the group
1258 * element then consider i+1 as a four-bit number: (i₀, i₁, i₂, i₃) (where i₀
1259 * is the most significant bit). The value of the group element is then:
1260 * (i₀×2^192 + i₁×2^128 + i₂×2^64 + i₃)G, where G is the generator. */
1261static const uint8_t k25519SmallPrecomp[15 * 2 * 32] = {
1262 0x1a, 0xd5, 0x25, 0x8f, 0x60, 0x2d, 0x56, 0xc9, 0xb2, 0xa7, 0x25, 0x95,
1263 0x60, 0xc7, 0x2c, 0x69, 0x5c, 0xdc, 0xd6, 0xfd, 0x31, 0xe2, 0xa4, 0xc0,
1264 0xfe, 0x53, 0x6e, 0xcd, 0xd3, 0x36, 0x69, 0x21, 0x58, 0x66, 0x66, 0x66,
1265 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
1266 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
1267 0x66, 0x66, 0x66, 0x66, 0x02, 0xa2, 0xed, 0xf4, 0x8f, 0x6b, 0x0b, 0x3e,
1268 0xeb, 0x35, 0x1a, 0xd5, 0x7e, 0xdb, 0x78, 0x00, 0x96, 0x8a, 0xa0, 0xb4,
1269 0xcf, 0x60, 0x4b, 0xd4, 0xd5, 0xf9, 0x2d, 0xbf, 0x88, 0xbd, 0x22, 0x62,
1270 0x13, 0x53, 0xe4, 0x82, 0x57, 0xfa, 0x1e, 0x8f, 0x06, 0x2b, 0x90, 0xba,
1271 0x08, 0xb6, 0x10, 0x54, 0x4f, 0x7c, 0x1b, 0x26, 0xed, 0xda, 0x6b, 0xdd,
1272 0x25, 0xd0, 0x4e, 0xea, 0x42, 0xbb, 0x25, 0x03, 0xa2, 0xfb, 0xcc, 0x61,
1273 0x67, 0x06, 0x70, 0x1a, 0xc4, 0x78, 0x3a, 0xff, 0x32, 0x62, 0xdd, 0x2c,
1274 0xab, 0x50, 0x19, 0x3b, 0xf2, 0x9b, 0x7d, 0xb8, 0xfd, 0x4f, 0x29, 0x9c,
1275 0xa7, 0x91, 0xba, 0x0e, 0x46, 0x5e, 0x51, 0xfe, 0x1d, 0xbf, 0xe5, 0xe5,
1276 0x9b, 0x95, 0x0d, 0x67, 0xf8, 0xd1, 0xb5, 0x5a, 0xa1, 0x93, 0x2c, 0xc3,
1277 0xde, 0x0e, 0x97, 0x85, 0x2d, 0x7f, 0xea, 0xab, 0x3e, 0x47, 0x30, 0x18,
1278 0x24, 0xe8, 0xb7, 0x60, 0xae, 0x47, 0x80, 0xfc, 0xe5, 0x23, 0xe7, 0xc2,
1279 0xc9, 0x85, 0xe6, 0x98, 0xa0, 0x29, 0x4e, 0xe1, 0x84, 0x39, 0x2d, 0x95,
1280 0x2c, 0xf3, 0x45, 0x3c, 0xff, 0xaf, 0x27, 0x4c, 0x6b, 0xa6, 0xf5, 0x4b,
1281 0x11, 0xbd, 0xba, 0x5b, 0x9e, 0xc4, 0xa4, 0x51, 0x1e, 0xbe, 0xd0, 0x90,
1282 0x3a, 0x9c, 0xc2, 0x26, 0xb6, 0x1e, 0xf1, 0x95, 0x7d, 0xc8, 0x6d, 0x52,
1283 0xe6, 0x99, 0x2c, 0x5f, 0x9a, 0x96, 0x0c, 0x68, 0x29, 0xfd, 0xe2, 0xfb,
1284 0xe6, 0xbc, 0xec, 0x31, 0x08, 0xec, 0xe6, 0xb0, 0x53, 0x60, 0xc3, 0x8c,
1285 0xbe, 0xc1, 0xb3, 0x8a, 0x8f, 0xe4, 0x88, 0x2b, 0x55, 0xe5, 0x64, 0x6e,
1286 0x9b, 0xd0, 0xaf, 0x7b, 0x64, 0x2a, 0x35, 0x25, 0x10, 0x52, 0xc5, 0x9e,
1287 0x58, 0x11, 0x39, 0x36, 0x45, 0x51, 0xb8, 0x39, 0x93, 0xfc, 0x9d, 0x6a,
1288 0xbe, 0x58, 0xcb, 0xa4, 0x0f, 0x51, 0x3c, 0x38, 0x05, 0xca, 0xab, 0x43,
1289 0x63, 0x0e, 0xf3, 0x8b, 0x41, 0xa6, 0xf8, 0x9b, 0x53, 0x70, 0x80, 0x53,
1290 0x86, 0x5e, 0x8f, 0xe3, 0xc3, 0x0d, 0x18, 0xc8, 0x4b, 0x34, 0x1f, 0xd8,
1291 0x1d, 0xbc, 0xf2, 0x6d, 0x34, 0x3a, 0xbe, 0xdf, 0xd9, 0xf6, 0xf3, 0x89,
1292 0xa1, 0xe1, 0x94, 0x9f, 0x5d, 0x4c, 0x5d, 0xe9, 0xa1, 0x49, 0x92, 0xef,
1293 0x0e, 0x53, 0x81, 0x89, 0x58, 0x87, 0xa6, 0x37, 0xf1, 0xdd, 0x62, 0x60,
1294 0x63, 0x5a, 0x9d, 0x1b, 0x8c, 0xc6, 0x7d, 0x52, 0xea, 0x70, 0x09, 0x6a,
1295 0xe1, 0x32, 0xf3, 0x73, 0x21, 0x1f, 0x07, 0x7b, 0x7c, 0x9b, 0x49, 0xd8,
1296 0xc0, 0xf3, 0x25, 0x72, 0x6f, 0x9d, 0xed, 0x31, 0x67, 0x36, 0x36, 0x54,
1297 0x40, 0x92, 0x71, 0xe6, 0x11, 0x28, 0x11, 0xad, 0x93, 0x32, 0x85, 0x7b,
1298 0x3e, 0xb7, 0x3b, 0x49, 0x13, 0x1c, 0x07, 0xb0, 0x2e, 0x93, 0xaa, 0xfd,
1299 0xfd, 0x28, 0x47, 0x3d, 0x8d, 0xd2, 0xda, 0xc7, 0x44, 0xd6, 0x7a, 0xdb,
1300 0x26, 0x7d, 0x1d, 0xb8, 0xe1, 0xde, 0x9d, 0x7a, 0x7d, 0x17, 0x7e, 0x1c,
1301 0x37, 0x04, 0x8d, 0x2d, 0x7c, 0x5e, 0x18, 0x38, 0x1e, 0xaf, 0xc7, 0x1b,
1302 0x33, 0x48, 0x31, 0x00, 0x59, 0xf6, 0xf2, 0xca, 0x0f, 0x27, 0x1b, 0x63,
1303 0x12, 0x7e, 0x02, 0x1d, 0x49, 0xc0, 0x5d, 0x79, 0x87, 0xef, 0x5e, 0x7a,
1304 0x2f, 0x1f, 0x66, 0x55, 0xd8, 0x09, 0xd9, 0x61, 0x38, 0x68, 0xb0, 0x07,
1305 0xa3, 0xfc, 0xcc, 0x85, 0x10, 0x7f, 0x4c, 0x65, 0x65, 0xb3, 0xfa, 0xfa,
1306 0xa5, 0x53, 0x6f, 0xdb, 0x74, 0x4c, 0x56, 0x46, 0x03, 0xe2, 0xd5, 0x7a,
1307 0x29, 0x1c, 0xc6, 0x02, 0xbc, 0x59, 0xf2, 0x04, 0x75, 0x63, 0xc0, 0x84,
1308 0x2f, 0x60, 0x1c, 0x67, 0x76, 0xfd, 0x63, 0x86, 0xf3, 0xfa, 0xbf, 0xdc,
1309 0xd2, 0x2d, 0x90, 0x91, 0xbd, 0x33, 0xa9, 0xe5, 0x66, 0x0c, 0xda, 0x42,
1310 0x27, 0xca, 0xf4, 0x66, 0xc2, 0xec, 0x92, 0x14, 0x57, 0x06, 0x63, 0xd0,
1311 0x4d, 0x15, 0x06, 0xeb, 0x69, 0x58, 0x4f, 0x77, 0xc5, 0x8b, 0xc7, 0xf0,
1312 0x8e, 0xed, 0x64, 0xa0, 0xb3, 0x3c, 0x66, 0x71, 0xc6, 0x2d, 0xda, 0x0a,
1313 0x0d, 0xfe, 0x70, 0x27, 0x64, 0xf8, 0x27, 0xfa, 0xf6, 0x5f, 0x30, 0xa5,
1314 0x0d, 0x6c, 0xda, 0xf2, 0x62, 0x5e, 0x78, 0x47, 0xd3, 0x66, 0x00, 0x1c,
1315 0xfd, 0x56, 0x1f, 0x5d, 0x3f, 0x6f, 0xf4, 0x4c, 0xd8, 0xfd, 0x0e, 0x27,
1316 0xc9, 0x5c, 0x2b, 0xbc, 0xc0, 0xa4, 0xe7, 0x23, 0x29, 0x02, 0x9f, 0x31,
1317 0xd6, 0xe9, 0xd7, 0x96, 0xf4, 0xe0, 0x5e, 0x0b, 0x0e, 0x13, 0xee, 0x3c,
1318 0x09, 0xed, 0xf2, 0x3d, 0x76, 0x91, 0xc3, 0xa4, 0x97, 0xae, 0xd4, 0x87,
1319 0xd0, 0x5d, 0xf6, 0x18, 0x47, 0x1f, 0x1d, 0x67, 0xf2, 0xcf, 0x63, 0xa0,
1320 0x91, 0x27, 0xf8, 0x93, 0x45, 0x75, 0x23, 0x3f, 0xd1, 0xf1, 0xad, 0x23,
1321 0xdd, 0x64, 0x93, 0x96, 0x41, 0x70, 0x7f, 0xf7, 0xf5, 0xa9, 0x89, 0xa2,
1322 0x34, 0xb0, 0x8d, 0x1b, 0xae, 0x19, 0x15, 0x49, 0x58, 0x23, 0x6d, 0x87,
1323 0x15, 0x4f, 0x81, 0x76, 0xfb, 0x23, 0xb5, 0xea, 0xcf, 0xac, 0x54, 0x8d,
1324 0x4e, 0x42, 0x2f, 0xeb, 0x0f, 0x63, 0xdb, 0x68, 0x37, 0xa8, 0xcf, 0x8b,
1325 0xab, 0xf5, 0xa4, 0x6e, 0x96, 0x2a, 0xb2, 0xd6, 0xbe, 0x9e, 0xbd, 0x0d,
1326 0xb4, 0x42, 0xa9, 0xcf, 0x01, 0x83, 0x8a, 0x17, 0x47, 0x76, 0xc4, 0xc6,
1327 0x83, 0x04, 0x95, 0x0b, 0xfc, 0x11, 0xc9, 0x62, 0xb8, 0x0c, 0x76, 0x84,
1328 0xd9, 0xb9, 0x37, 0xfa, 0xfc, 0x7c, 0xc2, 0x6d, 0x58, 0x3e, 0xb3, 0x04,
1329 0xbb, 0x8c, 0x8f, 0x48, 0xbc, 0x91, 0x27, 0xcc, 0xf9, 0xb7, 0x22, 0x19,
1330 0x83, 0x2e, 0x09, 0xb5, 0x72, 0xd9, 0x54, 0x1c, 0x4d, 0xa1, 0xea, 0x0b,
1331 0xf1, 0xc6, 0x08, 0x72, 0x46, 0x87, 0x7a, 0x6e, 0x80, 0x56, 0x0a, 0x8a,
1332 0xc0, 0xdd, 0x11, 0x6b, 0xd6, 0xdd, 0x47, 0xdf, 0x10, 0xd9, 0xd8, 0xea,
1333 0x7c, 0xb0, 0x8f, 0x03, 0x00, 0x2e, 0xc1, 0x8f, 0x44, 0xa8, 0xd3, 0x30,
1334 0x06, 0x89, 0xa2, 0xf9, 0x34, 0xad, 0xdc, 0x03, 0x85, 0xed, 0x51, 0xa7,
1335 0x82, 0x9c, 0xe7, 0x5d, 0x52, 0x93, 0x0c, 0x32, 0x9a, 0x5b, 0xe1, 0xaa,
1336 0xca, 0xb8, 0x02, 0x6d, 0x3a, 0xd4, 0xb1, 0x3a, 0xf0, 0x5f, 0xbe, 0xb5,
1337 0x0d, 0x10, 0x6b, 0x38, 0x32, 0xac, 0x76, 0x80, 0xbd, 0xca, 0x94, 0x71,
1338 0x7a, 0xf2, 0xc9, 0x35, 0x2a, 0xde, 0x9f, 0x42, 0x49, 0x18, 0x01, 0xab,
1339 0xbc, 0xef, 0x7c, 0x64, 0x3f, 0x58, 0x3d, 0x92, 0x59, 0xdb, 0x13, 0xdb,
1340 0x58, 0x6e, 0x0a, 0xe0, 0xb7, 0x91, 0x4a, 0x08, 0x20, 0xd6, 0x2e, 0x3c,
1341 0x45, 0xc9, 0x8b, 0x17, 0x79, 0xe7, 0xc7, 0x90, 0x99, 0x3a, 0x18, 0x25,
1342};
1343
1344void x25519_ge_scalarmult_base(ge_p3 *h, const uint8_t a[32]) {
1345 x25519_ge_scalarmult_small_precomp(h, a, k25519SmallPrecomp);
1346}
1347
1348#else
1349
1350/* k25519Precomp[i][j] = (j+1)*256^i*B */
1351static const ge_precomp k25519Precomp[32][8] = {
1352 {
1353 {
1354 {25967493, -14356035, 29566456, 3660896, -12694345, 4014787,
1355 27544626, -11754271, -6079156, 2047605},
1356 {-12545711, 934262, -2722910, 3049990, -727428, 9406986, 12720692,
1357 5043384, 19500929, -15469378},
1358 {-8738181, 4489570, 9688441, -14785194, 10184609, -12363380,
1359 29287919, 11864899, -24514362, -4438546},
1360 },
1361 {
1362 {-12815894, -12976347, -21581243, 11784320, -25355658, -2750717,
1363 -11717903, -3814571, -358445, -10211303},
1364 {-21703237, 6903825, 27185491, 6451973, -29577724, -9554005,
1365 -15616551, 11189268, -26829678, -5319081},
1366 {26966642, 11152617, 32442495, 15396054, 14353839, -12752335,
1367 -3128826, -9541118, -15472047, -4166697},
1368 },
1369 {
1370 {15636291, -9688557, 24204773, -7912398, 616977, -16685262,
1371 27787600, -14772189, 28944400, -1550024},
1372 {16568933, 4717097, -11556148, -1102322, 15682896, -11807043,
1373 16354577, -11775962, 7689662, 11199574},
1374 {30464156, -5976125, -11779434, -15670865, 23220365, 15915852,
1375 7512774, 10017326, -17749093, -9920357},
1376 },
1377 {
1378 {-17036878, 13921892, 10945806, -6033431, 27105052, -16084379,
1379 -28926210, 15006023, 3284568, -6276540},
1380 {23599295, -8306047, -11193664, -7687416, 13236774, 10506355,
1381 7464579, 9656445, 13059162, 10374397},
1382 {7798556, 16710257, 3033922, 2874086, 28997861, 2835604, 32406664,
1383 -3839045, -641708, -101325},
1384 },
1385 {
1386 {10861363, 11473154, 27284546, 1981175, -30064349, 12577861,
1387 32867885, 14515107, -15438304, 10819380},
1388 {4708026, 6336745, 20377586, 9066809, -11272109, 6594696, -25653668,
1389 12483688, -12668491, 5581306},
1390 {19563160, 16186464, -29386857, 4097519, 10237984, -4348115,
1391 28542350, 13850243, -23678021, -15815942},
1392 },
1393 {
1394 {-15371964, -12862754, 32573250, 4720197, -26436522, 5875511,
1395 -19188627, -15224819, -9818940, -12085777},
1396 {-8549212, 109983, 15149363, 2178705, 22900618, 4543417, 3044240,
1397 -15689887, 1762328, 14866737},
1398 {-18199695, -15951423, -10473290, 1707278, -17185920, 3916101,
1399 -28236412, 3959421, 27914454, 4383652},
1400 },
1401 {
1402 {5153746, 9909285, 1723747, -2777874, 30523605, 5516873, 19480852,
1403 5230134, -23952439, -15175766},
1404 {-30269007, -3463509, 7665486, 10083793, 28475525, 1649722,
1405 20654025, 16520125, 30598449, 7715701},
1406 {28881845, 14381568, 9657904, 3680757, -20181635, 7843316,
1407 -31400660, 1370708, 29794553, -1409300},
1408 },
1409 {
1410 {14499471, -2729599, -33191113, -4254652, 28494862, 14271267,
1411 30290735, 10876454, -33154098, 2381726},
1412 {-7195431, -2655363, -14730155, 462251, -27724326, 3941372,
1413 -6236617, 3696005, -32300832, 15351955},
1414 {27431194, 8222322, 16448760, -3907995, -18707002, 11938355,
1415 -32961401, -2970515, 29551813, 10109425},
1416 },
1417 },
1418 {
1419 {
1420 {-13657040, -13155431, -31283750, 11777098, 21447386, 6519384,
1421 -2378284, -1627556, 10092783, -4764171},
1422 {27939166, 14210322, 4677035, 16277044, -22964462, -12398139,
1423 -32508754, 12005538, -17810127, 12803510},
1424 {17228999, -15661624, -1233527, 300140, -1224870, -11714777,
1425 30364213, -9038194, 18016357, 4397660},
1426 },
1427 {
1428 {-10958843, -7690207, 4776341, -14954238, 27850028, -15602212,
1429 -26619106, 14544525, -17477504, 982639},
1430 {29253598, 15796703, -2863982, -9908884, 10057023, 3163536, 7332899,
1431 -4120128, -21047696, 9934963},
1432 {5793303, 16271923, -24131614, -10116404, 29188560, 1206517,
1433 -14747930, 4559895, -30123922, -10897950},
1434 },
1435 {
1436 {-27643952, -11493006, 16282657, -11036493, 28414021, -15012264,
1437 24191034, 4541697, -13338309, 5500568},
1438 {12650548, -1497113, 9052871, 11355358, -17680037, -8400164,
1439 -17430592, 12264343, 10874051, 13524335},
1440 {25556948, -3045990, 714651, 2510400, 23394682, -10415330, 33119038,
1441 5080568, -22528059, 5376628},
1442 },
1443 {
1444 {-26088264, -4011052, -17013699, -3537628, -6726793, 1920897,
1445 -22321305, -9447443, 4535768, 1569007},
1446 {-2255422, 14606630, -21692440, -8039818, 28430649, 8775819,
1447 -30494562, 3044290, 31848280, 12543772},
1448 {-22028579, 2943893, -31857513, 6777306, 13784462, -4292203,
1449 -27377195, -2062731, 7718482, 14474653},
1450 },
1451 {
1452 {2385315, 2454213, -22631320, 46603, -4437935, -15680415, 656965,
1453 -7236665, 24316168, -5253567},
1454 {13741529, 10911568, -33233417, -8603737, -20177830, -1033297,
1455 33040651, -13424532, -20729456, 8321686},
1456 {21060490, -2212744, 15712757, -4336099, 1639040, 10656336,
1457 23845965, -11874838, -9984458, 608372},
1458 },
1459 {
1460 {-13672732, -15087586, -10889693, -7557059, -6036909, 11305547,
1461 1123968, -6780577, 27229399, 23887},
1462 {-23244140, -294205, -11744728, 14712571, -29465699, -2029617,
1463 12797024, -6440308, -1633405, 16678954},
1464 {-29500620, 4770662, -16054387, 14001338, 7830047, 9564805,
1465 -1508144, -4795045, -17169265, 4904953},
1466 },
1467 {
1468 {24059557, 14617003, 19037157, -15039908, 19766093, -14906429,
1469 5169211, 16191880, 2128236, -4326833},
1470 {-16981152, 4124966, -8540610, -10653797, 30336522, -14105247,
1471 -29806336, 916033, -6882542, -2986532},
1472 {-22630907, 12419372, -7134229, -7473371, -16478904, 16739175,
1473 285431, 2763829, 15736322, 4143876},
1474 },
1475 {
1476 {2379352, 11839345, -4110402, -5988665, 11274298, 794957, 212801,
1477 -14594663, 23527084, -16458268},
1478 {33431127, -11130478, -17838966, -15626900, 8909499, 8376530,
1479 -32625340, 4087881, -15188911, -14416214},
1480 {1767683, 7197987, -13205226, -2022635, -13091350, 448826, 5799055,
1481 4357868, -4774191, -16323038},
1482 },
1483 },
1484 {
1485 {
1486 {6721966, 13833823, -23523388, -1551314, 26354293, -11863321,
1487 23365147, -3949732, 7390890, 2759800},
1488 {4409041, 2052381, 23373853, 10530217, 7676779, -12885954, 21302353,
1489 -4264057, 1244380, -12919645},
1490 {-4421239, 7169619, 4982368, -2957590, 30256825, -2777540, 14086413,
1491 9208236, 15886429, 16489664},
1492 },
1493 {
1494 {1996075, 10375649, 14346367, 13311202, -6874135, -16438411,
1495 -13693198, 398369, -30606455, -712933},
1496 {-25307465, 9795880, -2777414, 14878809, -33531835, 14780363,
1497 13348553, 12076947, -30836462, 5113182},
1498 {-17770784, 11797796, 31950843, 13929123, -25888302, 12288344,
1499 -30341101, -7336386, 13847711, 5387222},
1500 },
1501 {
1502 {-18582163, -3416217, 17824843, -2340966, 22744343, -10442611,
1503 8763061, 3617786, -19600662, 10370991},
1504 {20246567, -14369378, 22358229, -543712, 18507283, -10413996,
1505 14554437, -8746092, 32232924, 16763880},
1506 {9648505, 10094563, 26416693, 14745928, -30374318, -6472621,
1507 11094161, 15689506, 3140038, -16510092},
1508 },
1509 {
1510 {-16160072, 5472695, 31895588, 4744994, 8823515, 10365685,
1511 -27224800, 9448613, -28774454, 366295},
1512 {19153450, 11523972, -11096490, -6503142, -24647631, 5420647,
1513 28344573, 8041113, 719605, 11671788},
1514 {8678025, 2694440, -6808014, 2517372, 4964326, 11152271, -15432916,
1515 -15266516, 27000813, -10195553},
1516 },
1517 {
1518 {-15157904, 7134312, 8639287, -2814877, -7235688, 10421742, 564065,
1519 5336097, 6750977, -14521026},
1520 {11836410, -3979488, 26297894, 16080799, 23455045, 15735944,
1521 1695823, -8819122, 8169720, 16220347},
1522 {-18115838, 8653647, 17578566, -6092619, -8025777, -16012763,
1523 -11144307, -2627664, -5990708, -14166033},
1524 },
1525 {
1526 {-23308498, -10968312, 15213228, -10081214, -30853605, -11050004,
1527 27884329, 2847284, 2655861, 1738395},
1528 {-27537433, -14253021, -25336301, -8002780, -9370762, 8129821,
1529 21651608, -3239336, -19087449, -11005278},
1530 {1533110, 3437855, 23735889, 459276, 29970501, 11335377, 26030092,
1531 5821408, 10478196, 8544890},
1532 },
1533 {
1534 {32173121, -16129311, 24896207, 3921497, 22579056, -3410854,
1535 19270449, 12217473, 17789017, -3395995},
1536 {-30552961, -2228401, -15578829, -10147201, 13243889, 517024,
1537 15479401, -3853233, 30460520, 1052596},
1538 {-11614875, 13323618, 32618793, 8175907, -15230173, 12596687,
1539 27491595, -4612359, 3179268, -9478891},
1540 },
1541 {
1542 {31947069, -14366651, -4640583, -15339921, -15125977, -6039709,
1543 -14756777, -16411740, 19072640, -9511060},
1544 {11685058, 11822410, 3158003, -13952594, 33402194, -4165066,
1545 5977896, -5215017, 473099, 5040608},
1546 {-20290863, 8198642, -27410132, 11602123, 1290375, -2799760,
1547 28326862, 1721092, -19558642, -3131606},
1548 },
1549 },
1550 {
1551 {
1552 {7881532, 10687937, 7578723, 7738378, -18951012, -2553952, 21820786,
1553 8076149, -27868496, 11538389},
1554 {-19935666, 3899861, 18283497, -6801568, -15728660, -11249211,
1555 8754525, 7446702, -5676054, 5797016},
1556 {-11295600, -3793569, -15782110, -7964573, 12708869, -8456199,
1557 2014099, -9050574, -2369172, -5877341},
1558 },
1559 {
1560 {-22472376, -11568741, -27682020, 1146375, 18956691, 16640559,
1561 1192730, -3714199, 15123619, 10811505},
1562 {14352098, -3419715, -18942044, 10822655, 32750596, 4699007, -70363,
1563 15776356, -28886779, -11974553},
1564 {-28241164, -8072475, -4978962, -5315317, 29416931, 1847569,
1565 -20654173, -16484855, 4714547, -9600655},
1566 },
1567 {
1568 {15200332, 8368572, 19679101, 15970074, -31872674, 1959451,
1569 24611599, -4543832, -11745876, 12340220},
1570 {12876937, -10480056, 33134381, 6590940, -6307776, 14872440,
1571 9613953, 8241152, 15370987, 9608631},
1572 {-4143277, -12014408, 8446281, -391603, 4407738, 13629032, -7724868,
1573 15866074, -28210621, -8814099},
1574 },
1575 {
1576 {26660628, -15677655, 8393734, 358047, -7401291, 992988, -23904233,
1577 858697, 20571223, 8420556},
1578 {14620715, 13067227, -15447274, 8264467, 14106269, 15080814,
1579 33531827, 12516406, -21574435, -12476749},
1580 {236881, 10476226, 57258, -14677024, 6472998, 2466984, 17258519,
1581 7256740, 8791136, 15069930},
1582 },
1583 {
1584 {1276410, -9371918, 22949635, -16322807, -23493039, -5702186,
1585 14711875, 4874229, -30663140, -2331391},
1586 {5855666, 4990204, -13711848, 7294284, -7804282, 1924647, -1423175,
1587 -7912378, -33069337, 9234253},
1588 {20590503, -9018988, 31529744, -7352666, -2706834, 10650548,
1589 31559055, -11609587, 18979186, 13396066},
1590 },
1591 {
1592 {24474287, 4968103, 22267082, 4407354, 24063882, -8325180,
1593 -18816887, 13594782, 33514650, 7021958},
1594 {-11566906, -6565505, -21365085, 15928892, -26158305, 4315421,
1595 -25948728, -3916677, -21480480, 12868082},
1596 {-28635013, 13504661, 19988037, -2132761, 21078225, 6443208,
1597 -21446107, 2244500, -12455797, -8089383},
1598 },
1599 {
1600 {-30595528, 13793479, -5852820, 319136, -25723172, -6263899,
1601 33086546, 8957937, -15233648, 5540521},
1602 {-11630176, -11503902, -8119500, -7643073, 2620056, 1022908,
1603 -23710744, -1568984, -16128528, -14962807},
1604 {23152971, 775386, 27395463, 14006635, -9701118, 4649512, 1689819,
1605 892185, -11513277, -15205948},
1606 },
1607 {
1608 {9770129, 9586738, 26496094, 4324120, 1556511, -3550024, 27453819,
1609 4763127, -19179614, 5867134},
1610 {-32765025, 1927590, 31726409, -4753295, 23962434, -16019500,
1611 27846559, 5931263, -29749703, -16108455},
1612 {27461885, -2977536, 22380810, 1815854, -23033753, -3031938,
1613 7283490, -15148073, -19526700, 7734629},
1614 },
1615 },
1616 {
1617 {
1618 {-8010264, -9590817, -11120403, 6196038, 29344158, -13430885,
1619 7585295, -3176626, 18549497, 15302069},
1620 {-32658337, -6171222, -7672793, -11051681, 6258878, 13504381,
1621 10458790, -6418461, -8872242, 8424746},
1622 {24687205, 8613276, -30667046, -3233545, 1863892, -1830544,
1623 19206234, 7134917, -11284482, -828919},
1624 },
1625 {
1626 {11334899, -9218022, 8025293, 12707519, 17523892, -10476071,
1627 10243738, -14685461, -5066034, 16498837},
1628 {8911542, 6887158, -9584260, -6958590, 11145641, -9543680, 17303925,
1629 -14124238, 6536641, 10543906},
1630 {-28946384, 15479763, -17466835, 568876, -1497683, 11223454,
1631 -2669190, -16625574, -27235709, 8876771},
1632 },
1633 {
1634 {-25742899, -12566864, -15649966, -846607, -33026686, -796288,
1635 -33481822, 15824474, -604426, -9039817},
1636 {10330056, 70051, 7957388, -9002667, 9764902, 15609756, 27698697,
1637 -4890037, 1657394, 3084098},
1638 {10477963, -7470260, 12119566, -13250805, 29016247, -5365589,
1639 31280319, 14396151, -30233575, 15272409},
1640 },
1641 {
1642 {-12288309, 3169463, 28813183, 16658753, 25116432, -5630466,
1643 -25173957, -12636138, -25014757, 1950504},
1644 {-26180358, 9489187, 11053416, -14746161, -31053720, 5825630,
1645 -8384306, -8767532, 15341279, 8373727},
1646 {28685821, 7759505, -14378516, -12002860, -31971820, 4079242,
1647 298136, -10232602, -2878207, 15190420},
1648 },
1649 {
1650 {-32932876, 13806336, -14337485, -15794431, -24004620, 10940928,
1651 8669718, 2742393, -26033313, -6875003},
1652 {-1580388, -11729417, -25979658, -11445023, -17411874, -10912854,
1653 9291594, -16247779, -12154742, 6048605},
1654 {-30305315, 14843444, 1539301, 11864366, 20201677, 1900163,
1655 13934231, 5128323, 11213262, 9168384},
1656 },
1657 {
1658 {-26280513, 11007847, 19408960, -940758, -18592965, -4328580,
1659 -5088060, -11105150, 20470157, -16398701},
1660 {-23136053, 9282192, 14855179, -15390078, -7362815, -14408560,
1661 -22783952, 14461608, 14042978, 5230683},
1662 {29969567, -2741594, -16711867, -8552442, 9175486, -2468974,
1663 21556951, 3506042, -5933891, -12449708},
1664 },
1665 {
1666 {-3144746, 8744661, 19704003, 4581278, -20430686, 6830683,
1667 -21284170, 8971513, -28539189, 15326563},
1668 {-19464629, 10110288, -17262528, -3503892, -23500387, 1355669,
1669 -15523050, 15300988, -20514118, 9168260},
1670 {-5353335, 4488613, -23803248, 16314347, 7780487, -15638939,
1671 -28948358, 9601605, 33087103, -9011387},
1672 },
1673 {
1674 {-19443170, -15512900, -20797467, -12445323, -29824447, 10229461,
1675 -27444329, -15000531, -5996870, 15664672},
1676 {23294591, -16632613, -22650781, -8470978, 27844204, 11461195,
1677 13099750, -2460356, 18151676, 13417686},
1678 {-24722913, -4176517, -31150679, 5988919, -26858785, 6685065,
1679 1661597, -12551441, 15271676, -15452665},
1680 },
1681 },
1682 {
1683 {
1684 {11433042, -13228665, 8239631, -5279517, -1985436, -725718,
1685 -18698764, 2167544, -6921301, -13440182},
1686 {-31436171, 15575146, 30436815, 12192228, -22463353, 9395379,
1687 -9917708, -8638997, 12215110, 12028277},
1688 {14098400, 6555944, 23007258, 5757252, -15427832, -12950502,
1689 30123440, 4617780, -16900089, -655628},
1690 },
1691 {
1692 {-4026201, -15240835, 11893168, 13718664, -14809462, 1847385,
1693 -15819999, 10154009, 23973261, -12684474},
1694 {-26531820, -3695990, -1908898, 2534301, -31870557, -16550355,
1695 18341390, -11419951, 32013174, -10103539},
1696 {-25479301, 10876443, -11771086, -14625140, -12369567, 1838104,
1697 21911214, 6354752, 4425632, -837822},
1698 },
1699 {
1700 {-10433389, -14612966, 22229858, -3091047, -13191166, 776729,
1701 -17415375, -12020462, 4725005, 14044970},
1702 {19268650, -7304421, 1555349, 8692754, -21474059, -9910664, 6347390,
1703 -1411784, -19522291, -16109756},
1704 {-24864089, 12986008, -10898878, -5558584, -11312371, -148526,
1705 19541418, 8180106, 9282262, 10282508},
1706 },
1707 {
1708 {-26205082, 4428547, -8661196, -13194263, 4098402, -14165257,
1709 15522535, 8372215, 5542595, -10702683},
1710 {-10562541, 14895633, 26814552, -16673850, -17480754, -2489360,
1711 -2781891, 6993761, -18093885, 10114655},
1712 {-20107055, -929418, 31422704, 10427861, -7110749, 6150669,
1713 -29091755, -11529146, 25953725, -106158},
1714 },
1715 {
1716 {-4234397, -8039292, -9119125, 3046000, 2101609, -12607294,
1717 19390020, 6094296, -3315279, 12831125},
1718 {-15998678, 7578152, 5310217, 14408357, -33548620, -224739,
1719 31575954, 6326196, 7381791, -2421839},
1720 {-20902779, 3296811, 24736065, -16328389, 18374254, 7318640,
1721 6295303, 8082724, -15362489, 12339664},
1722 },
1723 {
1724 {27724736, 2291157, 6088201, -14184798, 1792727, 5857634, 13848414,
1725 15768922, 25091167, 14856294},
1726 {-18866652, 8331043, 24373479, 8541013, -701998, -9269457, 12927300,
1727 -12695493, -22182473, -9012899},
1728 {-11423429, -5421590, 11632845, 3405020, 30536730, -11674039,
1729 -27260765, 13866390, 30146206, 9142070},
1730 },
1731 {
1732 {3924129, -15307516, -13817122, -10054960, 12291820, -668366,
1733 -27702774, 9326384, -8237858, 4171294},
1734 {-15921940, 16037937, 6713787, 16606682, -21612135, 2790944,
1735 26396185, 3731949, 345228, -5462949},
1736 {-21327538, 13448259, 25284571, 1143661, 20614966, -8849387,
1737 2031539, -12391231, -16253183, -13582083},
1738 },
1739 {
1740 {31016211, -16722429, 26371392, -14451233, -5027349, 14854137,
1741 17477601, 3842657, 28012650, -16405420},
1742 {-5075835, 9368966, -8562079, -4600902, -15249953, 6970560,
1743 -9189873, 16292057, -8867157, 3507940},
1744 {29439664, 3537914, 23333589, 6997794, -17555561, -11018068,
1745 -15209202, -15051267, -9164929, 6580396},
1746 },
1747 },
1748 {
1749 {
1750 {-12185861, -7679788, 16438269, 10826160, -8696817, -6235611,
1751 17860444, -9273846, -2095802, 9304567},
1752 {20714564, -4336911, 29088195, 7406487, 11426967, -5095705,
1753 14792667, -14608617, 5289421, -477127},
1754 {-16665533, -10650790, -6160345, -13305760, 9192020, -1802462,
1755 17271490, 12349094, 26939669, -3752294},
1756 },
1757 {
1758 {-12889898, 9373458, 31595848, 16374215, 21471720, 13221525,
1759 -27283495, -12348559, -3698806, 117887},
1760 {22263325, -6560050, 3984570, -11174646, -15114008, -566785,
1761 28311253, 5358056, -23319780, 541964},
1762 {16259219, 3261970, 2309254, -15534474, -16885711, -4581916,
1763 24134070, -16705829, -13337066, -13552195},
1764 },
1765 {
1766 {9378160, -13140186, -22845982, -12745264, 28198281, -7244098,
1767 -2399684, -717351, 690426, 14876244},
1768 {24977353, -314384, -8223969, -13465086, 28432343, -1176353,
1769 -13068804, -12297348, -22380984, 6618999},
1770 {-1538174, 11685646, 12944378, 13682314, -24389511, -14413193,
1771 8044829, -13817328, 32239829, -5652762},
1772 },
1773 {
1774 {-18603066, 4762990, -926250, 8885304, -28412480, -3187315, 9781647,
1775 -10350059, 32779359, 5095274},
1776 {-33008130, -5214506, -32264887, -3685216, 9460461, -9327423,
1777 -24601656, 14506724, 21639561, -2630236},
1778 {-16400943, -13112215, 25239338, 15531969, 3987758, -4499318,
1779 -1289502, -6863535, 17874574, 558605},
1780 },
1781 {
1782 {-13600129, 10240081, 9171883, 16131053, -20869254, 9599700,
1783 33499487, 5080151, 2085892, 5119761},
1784 {-22205145, -2519528, -16381601, 414691, -25019550, 2170430,
1785 30634760, -8363614, -31999993, -5759884},
1786 {-6845704, 15791202, 8550074, -1312654, 29928809, -12092256,
1787 27534430, -7192145, -22351378, 12961482},
1788 },
1789 {
1790 {-24492060, -9570771, 10368194, 11582341, -23397293, -2245287,
1791 16533930, 8206996, -30194652, -5159638},
1792 {-11121496, -3382234, 2307366, 6362031, -135455, 8868177, -16835630,
1793 7031275, 7589640, 8945490},
1794 {-32152748, 8917967, 6661220, -11677616, -1192060, -15793393,
1795 7251489, -11182180, 24099109, -14456170},
1796 },
1797 {
1798 {5019558, -7907470, 4244127, -14714356, -26933272, 6453165,
1799 -19118182, -13289025, -6231896, -10280736},
1800 {10853594, 10721687, 26480089, 5861829, -22995819, 1972175,
1801 -1866647, -10557898, -3363451, -6441124},
1802 {-17002408, 5906790, 221599, -6563147, 7828208, -13248918, 24362661,
1803 -2008168, -13866408, 7421392},
1804 },
1805 {
1806 {8139927, -6546497, 32257646, -5890546, 30375719, 1886181,
1807 -21175108, 15441252, 28826358, -4123029},
1808 {6267086, 9695052, 7709135, -16603597, -32869068, -1886135,
1809 14795160, -7840124, 13746021, -1742048},
1810 {28584902, 7787108, -6732942, -15050729, 22846041, -7571236,
1811 -3181936, -363524, 4771362, -8419958},
1812 },
1813 },
1814 {
1815 {
1816 {24949256, 6376279, -27466481, -8174608, -18646154, -9930606,
1817 33543569, -12141695, 3569627, 11342593},
1818 {26514989, 4740088, 27912651, 3697550, 19331575, -11472339, 6809886,
1819 4608608, 7325975, -14801071},
1820 {-11618399, -14554430, -24321212, 7655128, -1369274, 5214312,
1821 -27400540, 10258390, -17646694, -8186692},
1822 },
1823 {
1824 {11431204, 15823007, 26570245, 14329124, 18029990, 4796082,
1825 -31446179, 15580664, 9280358, -3973687},
1826 {-160783, -10326257, -22855316, -4304997, -20861367, -13621002,
1827 -32810901, -11181622, -15545091, 4387441},
1828 {-20799378, 12194512, 3937617, -5805892, -27154820, 9340370,
1829 -24513992, 8548137, 20617071, -7482001},
1830 },
1831 {
1832 {-938825, -3930586, -8714311, 16124718, 24603125, -6225393,
1833 -13775352, -11875822, 24345683, 10325460},
1834 {-19855277, -1568885, -22202708, 8714034, 14007766, 6928528,
1835 16318175, -1010689, 4766743, 3552007},
1836 {-21751364, -16730916, 1351763, -803421, -4009670, 3950935, 3217514,
1837 14481909, 10988822, -3994762},
1838 },
1839 {
1840 {15564307, -14311570, 3101243, 5684148, 30446780, -8051356,
1841 12677127, -6505343, -8295852, 13296005},
1842 {-9442290, 6624296, -30298964, -11913677, -4670981, -2057379,
1843 31521204, 9614054, -30000824, 12074674},
1844 {4771191, -135239, 14290749, -13089852, 27992298, 14998318,
1845 -1413936, -1556716, 29832613, -16391035},
1846 },
1847 {
1848 {7064884, -7541174, -19161962, -5067537, -18891269, -2912736,
1849 25825242, 5293297, -27122660, 13101590},
1850 {-2298563, 2439670, -7466610, 1719965, -27267541, -16328445,
1851 32512469, -5317593, -30356070, -4190957},
1852 {-30006540, 10162316, -33180176, 3981723, -16482138, -13070044,
1853 14413974, 9515896, 19568978, 9628812},
1854 },
1855 {
1856 {33053803, 199357, 15894591, 1583059, 27380243, -4580435, -17838894,
1857 -6106839, -6291786, 3437740},
1858 {-18978877, 3884493, 19469877, 12726490, 15913552, 13614290,
1859 -22961733, 70104, 7463304, 4176122},
1860 {-27124001, 10659917, 11482427, -16070381, 12771467, -6635117,
1861 -32719404, -5322751, 24216882, 5944158},
1862 },
1863 {
1864 {8894125, 7450974, -2664149, -9765752, -28080517, -12389115,
1865 19345746, 14680796, 11632993, 5847885},
1866 {26942781, -2315317, 9129564, -4906607, 26024105, 11769399,
1867 -11518837, 6367194, -9727230, 4782140},
1868 {19916461, -4828410, -22910704, -11414391, 25606324, -5972441,
1869 33253853, 8220911, 6358847, -1873857},
1870 },
1871 {
1872 {801428, -2081702, 16569428, 11065167, 29875704, 96627, 7908388,
1873 -4480480, -13538503, 1387155},
1874 {19646058, 5720633, -11416706, 12814209, 11607948, 12749789,
1875 14147075, 15156355, -21866831, 11835260},
1876 {19299512, 1155910, 28703737, 14890794, 2925026, 7269399, 26121523,
1877 15467869, -26560550, 5052483},
1878 },
1879 },
1880 {
1881 {
1882 {-3017432, 10058206, 1980837, 3964243, 22160966, 12322533, -6431123,
1883 -12618185, 12228557, -7003677},
1884 {32944382, 14922211, -22844894, 5188528, 21913450, -8719943,
1885 4001465, 13238564, -6114803, 8653815},
1886 {22865569, -4652735, 27603668, -12545395, 14348958, 8234005,
1887 24808405, 5719875, 28483275, 2841751},
1888 },
1889 {
1890 {-16420968, -1113305, -327719, -12107856, 21886282, -15552774,
1891 -1887966, -315658, 19932058, -12739203},
1892 {-11656086, 10087521, -8864888, -5536143, -19278573, -3055912,
1893 3999228, 13239134, -4777469, -13910208},
1894 {1382174, -11694719, 17266790, 9194690, -13324356, 9720081,
1895 20403944, 11284705, -14013818, 3093230},
1896 },
1897 {
1898 {16650921, -11037932, -1064178, 1570629, -8329746, 7352753, -302424,
1899 16271225, -24049421, -6691850},
1900 {-21911077, -5927941, -4611316, -5560156, -31744103, -10785293,
1901 24123614, 15193618, -21652117, -16739389},
1902 {-9935934, -4289447, -25279823, 4372842, 2087473, 10399484,
1903 31870908, 14690798, 17361620, 11864968},
1904 },
1905 {
1906 {-11307610, 6210372, 13206574, 5806320, -29017692, -13967200,
1907 -12331205, -7486601, -25578460, -16240689},
1908 {14668462, -12270235, 26039039, 15305210, 25515617, 4542480,
1909 10453892, 6577524, 9145645, -6443880},
1910 {5974874, 3053895, -9433049, -10385191, -31865124, 3225009,
1911 -7972642, 3936128, -5652273, -3050304},
1912 },
1913 {
1914 {30625386, -4729400, -25555961, -12792866, -20484575, 7695099,
1915 17097188, -16303496, -27999779, 1803632},
1916 {-3553091, 9865099, -5228566, 4272701, -5673832, -16689700,
1917 14911344, 12196514, -21405489, 7047412},
1918 {20093277, 9920966, -11138194, -5343857, 13161587, 12044805,
1919 -32856851, 4124601, -32343828, -10257566},
1920 },
1921 {
1922 {-20788824, 14084654, -13531713, 7842147, 19119038, -13822605,
1923 4752377, -8714640, -21679658, 2288038},
1924 {-26819236, -3283715, 29965059, 3039786, -14473765, 2540457,
1925 29457502, 14625692, -24819617, 12570232},
1926 {-1063558, -11551823, 16920318, 12494842, 1278292, -5869109,
1927 -21159943, -3498680, -11974704, 4724943},
1928 },
1929 {
1930 {17960970, -11775534, -4140968, -9702530, -8876562, -1410617,
1931 -12907383, -8659932, -29576300, 1903856},
1932 {23134274, -14279132, -10681997, -1611936, 20684485, 15770816,
1933 -12989750, 3190296, 26955097, 14109738},
1934 {15308788, 5320727, -30113809, -14318877, 22902008, 7767164,
1935 29425325, -11277562, 31960942, 11934971},
1936 },
1937 {
1938 {-27395711, 8435796, 4109644, 12222639, -24627868, 14818669,
1939 20638173, 4875028, 10491392, 1379718},
1940 {-13159415, 9197841, 3875503, -8936108, -1383712, -5879801,
1941 33518459, 16176658, 21432314, 12180697},
1942 {-11787308, 11500838, 13787581, -13832590, -22430679, 10140205,
1943 1465425, 12689540, -10301319, -13872883},
1944 },
1945 },
1946 {
1947 {
1948 {5414091, -15386041, -21007664, 9643570, 12834970, 1186149,
1949 -2622916, -1342231, 26128231, 6032912},
1950 {-26337395, -13766162, 32496025, -13653919, 17847801, -12669156,
1951 3604025, 8316894, -25875034, -10437358},
1952 {3296484, 6223048, 24680646, -12246460, -23052020, 5903205,
1953 -8862297, -4639164, 12376617, 3188849},
1954 },
1955 {
1956 {29190488, -14659046, 27549113, -1183516, 3520066, -10697301,
1957 32049515, -7309113, -16109234, -9852307},
1958 {-14744486, -9309156, 735818, -598978, -20407687, -5057904,
1959 25246078, -15795669, 18640741, -960977},
1960 {-6928835, -16430795, 10361374, 5642961, 4910474, 12345252,
1961 -31638386, -494430, 10530747, 1053335},
1962 },
1963 {
1964 {-29265967, -14186805, -13538216, -12117373, -19457059, -10655384,
1965 -31462369, -2948985, 24018831, 15026644},
1966 {-22592535, -3145277, -2289276, 5953843, -13440189, 9425631,
1967 25310643, 13003497, -2314791, -15145616},
1968 {-27419985, -603321, -8043984, -1669117, -26092265, 13987819,
1969 -27297622, 187899, -23166419, -2531735},
1970 },
1971 {
1972 {-21744398, -13810475, 1844840, 5021428, -10434399, -15911473,
1973 9716667, 16266922, -5070217, 726099},
1974 {29370922, -6053998, 7334071, -15342259, 9385287, 2247707,
1975 -13661962, -4839461, 30007388, -15823341},
1976 {-936379, 16086691, 23751945, -543318, -1167538, -5189036, 9137109,
1977 730663, 9835848, 4555336},
1978 },
1979 {
1980 {-23376435, 1410446, -22253753, -12899614, 30867635, 15826977,
1981 17693930, 544696, -11985298, 12422646},
1982 {31117226, -12215734, -13502838, 6561947, -9876867, -12757670,
1983 -5118685, -4096706, 29120153, 13924425},
1984 {-17400879, -14233209, 19675799, -2734756, -11006962, -5858820,
1985 -9383939, -11317700, 7240931, -237388},
1986 },
1987 {
1988 {-31361739, -11346780, -15007447, -5856218, -22453340, -12152771,
1989 1222336, 4389483, 3293637, -15551743},
1990 {-16684801, -14444245, 11038544, 11054958, -13801175, -3338533,
1991 -24319580, 7733547, 12796905, -6335822},
1992 {-8759414, -10817836, -25418864, 10783769, -30615557, -9746811,
1993 -28253339, 3647836, 3222231, -11160462},
1994 },
1995 {
1996 {18606113, 1693100, -25448386, -15170272, 4112353, 10045021,
1997 23603893, -2048234, -7550776, 2484985},
1998 {9255317, -3131197, -12156162, -1004256, 13098013, -9214866,
1999 16377220, -2102812, -19802075, -3034702},
2000 {-22729289, 7496160, -5742199, 11329249, 19991973, -3347502,
2001 -31718148, 9936966, -30097688, -10618797},
2002 },
2003 {
2004 {21878590, -5001297, 4338336, 13643897, -3036865, 13160960,
2005 19708896, 5415497, -7360503, -4109293},
2006 {27736861, 10103576, 12500508, 8502413, -3413016, -9633558,
2007 10436918, -1550276, -23659143, -8132100},
2008 {19492550, -12104365, -29681976, -852630, -3208171, 12403437,
2009 30066266, 8367329, 13243957, 8709688},
2010 },
2011 },
2012 {
2013 {
2014 {12015105, 2801261, 28198131, 10151021, 24818120, -4743133,
2015 -11194191, -5645734, 5150968, 7274186},
2016 {2831366, -12492146, 1478975, 6122054, 23825128, -12733586,
2017 31097299, 6083058, 31021603, -9793610},
2018 {-2529932, -2229646, 445613, 10720828, -13849527, -11505937,
2019 -23507731, 16354465, 15067285, -14147707},
2020 },
2021 {
2022 {7840942, 14037873, -33364863, 15934016, -728213, -3642706,
2023 21403988, 1057586, -19379462, -12403220},
2024 {915865, -16469274, 15608285, -8789130, -24357026, 6060030,
2025 -17371319, 8410997, -7220461, 16527025},
2026 {32922597, -556987, 20336074, -16184568, 10903705, -5384487,
2027 16957574, 52992, 23834301, 6588044},
2028 },
2029 {
2030 {32752030, 11232950, 3381995, -8714866, 22652988, -10744103,
2031 17159699, 16689107, -20314580, -1305992},
2032 {-4689649, 9166776, -25710296, -10847306, 11576752, 12733943,
2033 7924251, -2752281, 1976123, -7249027},
2034 {21251222, 16309901, -2983015, -6783122, 30810597, 12967303, 156041,
2035 -3371252, 12331345, -8237197},
2036 },
2037 {
2038 {8651614, -4477032, -16085636, -4996994, 13002507, 2950805,
2039 29054427, -5106970, 10008136, -4667901},
2040 {31486080, 15114593, -14261250, 12951354, 14369431, -7387845,
2041 16347321, -13662089, 8684155, -10532952},
2042 {19443825, 11385320, 24468943, -9659068, -23919258, 2187569,
2043 -26263207, -6086921, 31316348, 14219878},
2044 },
2045 {
2046 {-28594490, 1193785, 32245219, 11392485, 31092169, 15722801,
2047 27146014, 6992409, 29126555, 9207390},
2048 {32382935, 1110093, 18477781, 11028262, -27411763, -7548111,
2049 -4980517, 10843782, -7957600, -14435730},
2050 {2814918, 7836403, 27519878, -7868156, -20894015, -11553689,
2051 -21494559, 8550130, 28346258, 1994730},
2052 },
2053 {
2054 {-19578299, 8085545, -14000519, -3948622, 2785838, -16231307,
2055 -19516951, 7174894, 22628102, 8115180},
2056 {-30405132, 955511, -11133838, -15078069, -32447087, -13278079,
2057 -25651578, 3317160, -9943017, 930272},
2058 {-15303681, -6833769, 28856490, 1357446, 23421993, 1057177,
2059 24091212, -1388970, -22765376, -10650715},
2060 },
2061 {
2062 {-22751231, -5303997, -12907607, -12768866, -15811511, -7797053,
2063 -14839018, -16554220, -1867018, 8398970},
2064 {-31969310, 2106403, -4736360, 1362501, 12813763, 16200670,
2065 22981545, -6291273, 18009408, -15772772},
2066 {-17220923, -9545221, -27784654, 14166835, 29815394, 7444469,
2067 29551787, -3727419, 19288549, 1325865},
2068 },
2069 {
2070 {15100157, -15835752, -23923978, -1005098, -26450192, 15509408,
2071 12376730, -3479146, 33166107, -8042750},
2072 {20909231, 13023121, -9209752, 16251778, -5778415, -8094914,
2073 12412151, 10018715, 2213263, -13878373},
2074 {32529814, -11074689, 30361439, -16689753, -9135940, 1513226,
2075 22922121, 6382134, -5766928, 8371348},
2076 },
2077 },
2078 {
2079 {
2080 {9923462, 11271500, 12616794, 3544722, -29998368, -1721626,
2081 12891687, -8193132, -26442943, 10486144},
2082 {-22597207, -7012665, 8587003, -8257861, 4084309, -12970062, 361726,
2083 2610596, -23921530, -11455195},
2084 {5408411, -1136691, -4969122, 10561668, 24145918, 14240566,
2085 31319731, -4235541, 19985175, -3436086},
2086 },
2087 {
2088 {-13994457, 16616821, 14549246, 3341099, 32155958, 13648976,
2089 -17577068, 8849297, 65030, 8370684},
2090 {-8320926, -12049626, 31204563, 5839400, -20627288, -1057277,
2091 -19442942, 6922164, 12743482, -9800518},
2092 {-2361371, 12678785, 28815050, 4759974, -23893047, 4884717,
2093 23783145, 11038569, 18800704, 255233},
2094 },
2095 {
2096 {-5269658, -1773886, 13957886, 7990715, 23132995, 728773, 13393847,
2097 9066957, 19258688, -14753793},
2098 {-2936654, -10827535, -10432089, 14516793, -3640786, 4372541,
2099 -31934921, 2209390, -1524053, 2055794},
2100 {580882, 16705327, 5468415, -2683018, -30926419, -14696000,
2101 -7203346, -8994389, -30021019, 7394435},
2102 },
2103 {
2104 {23838809, 1822728, -15738443, 15242727, 8318092, -3733104,
2105 -21672180, -3492205, -4821741, 14799921},
2106 {13345610, 9759151, 3371034, -16137791, 16353039, 8577942, 31129804,
2107 13496856, -9056018, 7402518},
2108 {2286874, -4435931, -20042458, -2008336, -13696227, 5038122,
2109 11006906, -15760352, 8205061, 1607563},
2110 },
2111 {
2112 {14414086, -8002132, 3331830, -3208217, 22249151, -5594188,
2113 18364661, -2906958, 30019587, -9029278},
2114 {-27688051, 1585953, -10775053, 931069, -29120221, -11002319,
2115 -14410829, 12029093, 9944378, 8024},
2116 {4368715, -3709630, 29874200, -15022983, -20230386, -11410704,
2117 -16114594, -999085, -8142388, 5640030},
2118 },
2119 {
2120 {10299610, 13746483, 11661824, 16234854, 7630238, 5998374, 9809887,
2121 -16694564, 15219798, -14327783},
2122 {27425505, -5719081, 3055006, 10660664, 23458024, 595578, -15398605,
2123 -1173195, -18342183, 9742717},
2124 {6744077, 2427284, 26042789, 2720740, -847906, 1118974, 32324614,
2125 7406442, 12420155, 1994844},
2126 },
2127 {
2128 {14012521, -5024720, -18384453, -9578469, -26485342, -3936439,
2129 -13033478, -10909803, 24319929, -6446333},
2130 {16412690, -4507367, 10772641, 15929391, -17068788, -4658621,
2131 10555945, -10484049, -30102368, -4739048},
2132 {22397382, -7767684, -9293161, -12792868, 17166287, -9755136,
2133 -27333065, 6199366, 21880021, -12250760},
2134 },
2135 {
2136 {-4283307, 5368523, -31117018, 8163389, -30323063, 3209128,
2137 16557151, 8890729, 8840445, 4957760},
2138 {-15447727, 709327, -6919446, -10870178, -29777922, 6522332,
2139 -21720181, 12130072, -14796503, 5005757},
2140 {-2114751, -14308128, 23019042, 15765735, -25269683, 6002752,
2141 10183197, -13239326, -16395286, -2176112},
2142 },
2143 },
2144 {
2145 {
2146 {-19025756, 1632005, 13466291, -7995100, -23640451, 16573537,
2147 -32013908, -3057104, 22208662, 2000468},
2148 {3065073, -1412761, -25598674, -361432, -17683065, -5703415,
2149 -8164212, 11248527, -3691214, -7414184},
2150 {10379208, -6045554, 8877319, 1473647, -29291284, -12507580,
2151 16690915, 2553332, -3132688, 16400289},
2152 },
2153 {
2154 {15716668, 1254266, -18472690, 7446274, -8448918, 6344164,
2155 -22097271, -7285580, 26894937, 9132066},
2156 {24158887, 12938817, 11085297, -8177598, -28063478, -4457083,
2157 -30576463, 64452, -6817084, -2692882},
2158 {13488534, 7794716, 22236231, 5989356, 25426474, -12578208, 2350710,
2159 -3418511, -4688006, 2364226},
2160 },
2161 {
2162 {16335052, 9132434, 25640582, 6678888, 1725628, 8517937, -11807024,
2163 -11697457, 15445875, -7798101},
2164 {29004207, -7867081, 28661402, -640412, -12794003, -7943086,
2165 31863255, -4135540, -278050, -15759279},
2166 {-6122061, -14866665, -28614905, 14569919, -10857999, -3591829,
2167 10343412, -6976290, -29828287, -10815811},
2168 },
2169 {
2170 {27081650, 3463984, 14099042, -4517604, 1616303, -6205604, 29542636,
2171 15372179, 17293797, 960709},
2172 {20263915, 11434237, -5765435, 11236810, 13505955, -10857102,
2173 -16111345, 6493122, -19384511, 7639714},
2174 {-2830798, -14839232, 25403038, -8215196, -8317012, -16173699,
2175 18006287, -16043750, 29994677, -15808121},
2176 },
2177 {
2178 {9769828, 5202651, -24157398, -13631392, -28051003, -11561624,
2179 -24613141, -13860782, -31184575, 709464},
2180 {12286395, 13076066, -21775189, -1176622, -25003198, 4057652,
2181 -32018128, -8890874, 16102007, 13205847},
2182 {13733362, 5599946, 10557076, 3195751, -5557991, 8536970, -25540170,
2183 8525972, 10151379, 10394400},
2184 },
2185 {
2186 {4024660, -16137551, 22436262, 12276534, -9099015, -2686099,
2187 19698229, 11743039, -33302334, 8934414},
2188 {-15879800, -4525240, -8580747, -2934061, 14634845, -698278,
2189 -9449077, 3137094, -11536886, 11721158},
2190 {17555939, -5013938, 8268606, 2331751, -22738815, 9761013, 9319229,
2191 8835153, -9205489, -1280045},
2192 },
2193 {
2194 {-461409, -7830014, 20614118, 16688288, -7514766, -4807119,
2195 22300304, 505429, 6108462, -6183415},
2196 {-5070281, 12367917, -30663534, 3234473, 32617080, -8422642,
2197 29880583, -13483331, -26898490, -7867459},
2198 {-31975283, 5726539, 26934134, 10237677, -3173717, -605053,
2199 24199304, 3795095, 7592688, -14992079},
2200 },
2201 {
2202 {21594432, -14964228, 17466408, -4077222, 32537084, 2739898,
2203 6407723, 12018833, -28256052, 4298412},
2204 {-20650503, -11961496, -27236275, 570498, 3767144, -1717540,
2205 13891942, -1569194, 13717174, 10805743},
2206 {-14676630, -15644296, 15287174, 11927123, 24177847, -8175568,
2207 -796431, 14860609, -26938930, -5863836},
2208 },
2209 },
2210 {
2211 {
2212 {12962541, 5311799, -10060768, 11658280, 18855286, -7954201,
2213 13286263, -12808704, -4381056, 9882022},
2214 {18512079, 11319350, -20123124, 15090309, 18818594, 5271736,
2215 -22727904, 3666879, -23967430, -3299429},
2216 {-6789020, -3146043, 16192429, 13241070, 15898607, -14206114,
2217 -10084880, -6661110, -2403099, 5276065},
2218 },
2219 {
2220 {30169808, -5317648, 26306206, -11750859, 27814964, 7069267,
2221 7152851, 3684982, 1449224, 13082861},
2222 {10342826, 3098505, 2119311, 193222, 25702612, 12233820, 23697382,
2223 15056736, -21016438, -8202000},
2224 {-33150110, 3261608, 22745853, 7948688, 19370557, -15177665,
2225 -26171976, 6482814, -10300080, -11060101},
2226 },
2227 {
2228 {32869458, -5408545, 25609743, 15678670, -10687769, -15471071,
2229 26112421, 2521008, -22664288, 6904815},
2230 {29506923, 4457497, 3377935, -9796444, -30510046, 12935080, 1561737,
2231 3841096, -29003639, -6657642},
2232 {10340844, -6630377, -18656632, -2278430, 12621151, -13339055,
2233 30878497, -11824370, -25584551, 5181966},
2234 },
2235 {
2236 {25940115, -12658025, 17324188, -10307374, -8671468, 15029094,
2237 24396252, -16450922, -2322852, -12388574},
2238 {-21765684, 9916823, -1300409, 4079498, -1028346, 11909559, 1782390,
2239 12641087, 20603771, -6561742},
2240 {-18882287, -11673380, 24849422, 11501709, 13161720, -4768874,
2241 1925523, 11914390, 4662781, 7820689},
2242 },
2243 {
2244 {12241050, -425982, 8132691, 9393934, 32846760, -1599620, 29749456,
2245 12172924, 16136752, 15264020},
2246 {-10349955, -14680563, -8211979, 2330220, -17662549, -14545780,
2247 10658213, 6671822, 19012087, 3772772},
2248 {3753511, -3421066, 10617074, 2028709, 14841030, -6721664, 28718732,
2249 -15762884, 20527771, 12988982},
2250 },
2251 {
2252 {-14822485, -5797269, -3707987, 12689773, -898983, -10914866,
2253 -24183046, -10564943, 3299665, -12424953},
2254 {-16777703, -15253301, -9642417, 4978983, 3308785, 8755439, 6943197,
2255 6461331, -25583147, 8991218},
2256 {-17226263, 1816362, -1673288, -6086439, 31783888, -8175991,
2257 -32948145, 7417950, -30242287, 1507265},
2258 },
2259 {
2260 {29692663, 6829891, -10498800, 4334896, 20945975, -11906496,
2261 -28887608, 8209391, 14606362, -10647073},
2262 {-3481570, 8707081, 32188102, 5672294, 22096700, 1711240, -33020695,
2263 9761487, 4170404, -2085325},
2264 {-11587470, 14855945, -4127778, -1531857, -26649089, 15084046,
2265 22186522, 16002000, -14276837, -8400798},
2266 },
2267 {
2268 {-4811456, 13761029, -31703877, -2483919, -3312471, 7869047,
2269 -7113572, -9620092, 13240845, 10965870},
2270 {-7742563, -8256762, -14768334, -13656260, -23232383, 12387166,
2271 4498947, 14147411, 29514390, 4302863},
2272 {-13413405, -12407859, 20757302, -13801832, 14785143, 8976368,
2273 -5061276, -2144373, 17846988, -13971927},
2274 },
2275 },
2276 {
2277 {
2278 {-2244452, -754728, -4597030, -1066309, -6247172, 1455299,
2279 -21647728, -9214789, -5222701, 12650267},
2280 {-9906797, -16070310, 21134160, 12198166, -27064575, 708126, 387813,
2281 13770293, -19134326, 10958663},
2282 {22470984, 12369526, 23446014, -5441109, -21520802, -9698723,
2283 -11772496, -11574455, -25083830, 4271862},
2284 },
2285 {
2286 {-25169565, -10053642, -19909332, 15361595, -5984358, 2159192,
2287 75375, -4278529, -32526221, 8469673},
2288 {15854970, 4148314, -8893890, 7259002, 11666551, 13824734,
2289 -30531198, 2697372, 24154791, -9460943},
2290 {15446137, -15806644, 29759747, 14019369, 30811221, -9610191,
2291 -31582008, 12840104, 24913809, 9815020},
2292 },
2293 {
2294 {-4709286, -5614269, -31841498, -12288893, -14443537, 10799414,
2295 -9103676, 13438769, 18735128, 9466238},
2296 {11933045, 9281483, 5081055, -5183824, -2628162, -4905629, -7727821,
2297 -10896103, -22728655, 16199064},
2298 {14576810, 379472, -26786533, -8317236, -29426508, -10812974,
2299 -102766, 1876699, 30801119, 2164795},
2300 },
2301 {
2302 {15995086, 3199873, 13672555, 13712240, -19378835, -4647646,
2303 -13081610, -15496269, -13492807, 1268052},
2304 {-10290614, -3659039, -3286592, 10948818, 23037027, 3794475,
2305 -3470338, -12600221, -17055369, 3565904},
2306 {29210088, -9419337, -5919792, -4952785, 10834811, -13327726,
2307 -16512102, -10820713, -27162222, -14030531},
2308 },
2309 {
2310 {-13161890, 15508588, 16663704, -8156150, -28349942, 9019123,
2311 -29183421, -3769423, 2244111, -14001979},
2312 {-5152875, -3800936, -9306475, -6071583, 16243069, 14684434,
2313 -25673088, -16180800, 13491506, 4641841},
2314 {10813417, 643330, -19188515, -728916, 30292062, -16600078,
2315 27548447, -7721242, 14476989, -12767431},
2316 },
2317 {
2318 {10292079, 9984945, 6481436, 8279905, -7251514, 7032743, 27282937,
2319 -1644259, -27912810, 12651324},
2320 {-31185513, -813383, 22271204, 11835308, 10201545, 15351028,
2321 17099662, 3988035, 21721536, -3148940},
2322 {10202177, -6545839, -31373232, -9574638, -32150642, -8119683,
2323 -12906320, 3852694, 13216206, 14842320},
2324 },
2325 {
2326 {-15815640, -10601066, -6538952, -7258995, -6984659, -6581778,
2327 -31500847, 13765824, -27434397, 9900184},
2328 {14465505, -13833331, -32133984, -14738873, -27443187, 12990492,
2329 33046193, 15796406, -7051866, -8040114},
2330 {30924417, -8279620, 6359016, -12816335, 16508377, 9071735,
2331 -25488601, 15413635, 9524356, -7018878},
2332 },
2333 {
2334 {12274201, -13175547, 32627641, -1785326, 6736625, 13267305,
2335 5237659, -5109483, 15663516, 4035784},
2336 {-2951309, 8903985, 17349946, 601635, -16432815, -4612556,
2337 -13732739, -15889334, -22258478, 4659091},
2338 {-16916263, -4952973, -30393711, -15158821, 20774812, 15897498,
2339 5736189, 15026997, -2178256, -13455585},
2340 },
2341 },
2342 {
2343 {
2344 {-8858980, -2219056, 28571666, -10155518, -474467, -10105698,
2345 -3801496, 278095, 23440562, -290208},
2346 {10226241, -5928702, 15139956, 120818, -14867693, 5218603, 32937275,
2347 11551483, -16571960, -7442864},
2348 {17932739, -12437276, -24039557, 10749060, 11316803, 7535897,
2349 22503767, 5561594, -3646624, 3898661},
2350 },
2351 {
2352 {7749907, -969567, -16339731, -16464, -25018111, 15122143, -1573531,
2353 7152530, 21831162, 1245233},
2354 {26958459, -14658026, 4314586, 8346991, -5677764, 11960072,
2355 -32589295, -620035, -30402091, -16716212},
2356 {-12165896, 9166947, 33491384, 13673479, 29787085, 13096535,
2357 6280834, 14587357, -22338025, 13987525},
2358 },
2359 {
2360 {-24349909, 7778775, 21116000, 15572597, -4833266, -5357778,
2361 -4300898, -5124639, -7469781, -2858068},
2362 {9681908, -6737123, -31951644, 13591838, -6883821, 386950, 31622781,
2363 6439245, -14581012, 4091397},
2364 {-8426427, 1470727, -28109679, -1596990, 3978627, -5123623,
2365 -19622683, 12092163, 29077877, -14741988},
2366 },
2367 {
2368 {5269168, -6859726, -13230211, -8020715, 25932563, 1763552,
2369 -5606110, -5505881, -20017847, 2357889},
2370 {32264008, -15407652, -5387735, -1160093, -2091322, -3946900,
2371 23104804, -12869908, 5727338, 189038},
2372 {14609123, -8954470, -6000566, -16622781, -14577387, -7743898,
2373 -26745169, 10942115, -25888931, -14884697},
2374 },
2375 {
2376 {20513500, 5557931, -15604613, 7829531, 26413943, -2019404,
2377 -21378968, 7471781, 13913677, -5137875},
2378 {-25574376, 11967826, 29233242, 12948236, -6754465, 4713227,
2379 -8940970, 14059180, 12878652, 8511905},
2380 {-25656801, 3393631, -2955415, -7075526, -2250709, 9366908,
2381 -30223418, 6812974, 5568676, -3127656},
2382 },
2383 {
2384 {11630004, 12144454, 2116339, 13606037, 27378885, 15676917,
2385 -17408753, -13504373, -14395196, 8070818},
2386 {27117696, -10007378, -31282771, -5570088, 1127282, 12772488,
2387 -29845906, 10483306, -11552749, -1028714},
2388 {10637467, -5688064, 5674781, 1072708, -26343588, -6982302,
2389 -1683975, 9177853, -27493162, 15431203},
2390 },
2391 {
2392 {20525145, 10892566, -12742472, 12779443, -29493034, 16150075,
2393 -28240519, 14943142, -15056790, -7935931},
2394 {-30024462, 5626926, -551567, -9981087, 753598, 11981191, 25244767,
2395 -3239766, -3356550, 9594024},
2396 {-23752644, 2636870, -5163910, -10103818, 585134, 7877383, 11345683,
2397 -6492290, 13352335, -10977084},
2398 },
2399 {
2400 {-1931799, -5407458, 3304649, -12884869, 17015806, -4877091,
2401 -29783850, -7752482, -13215537, -319204},
2402 {20239939, 6607058, 6203985, 3483793, -18386976, -779229, -20723742,
2403 15077870, -22750759, 14523817},
2404 {27406042, -6041657, 27423596, -4497394, 4996214, 10002360,
2405 -28842031, -4545494, -30172742, -4805667},
2406 },
2407 },
2408 {
2409 {
2410 {11374242, 12660715, 17861383, -12540833, 10935568, 1099227,
2411 -13886076, -9091740, -27727044, 11358504},
2412 {-12730809, 10311867, 1510375, 10778093, -2119455, -9145702,
2413 32676003, 11149336, -26123651, 4985768},
2414 {-19096303, 341147, -6197485, -239033, 15756973, -8796662, -983043,
2415 13794114, -19414307, -15621255},
2416 },
2417 {
2418 {6490081, 11940286, 25495923, -7726360, 8668373, -8751316, 3367603,
2419 6970005, -1691065, -9004790},
2420 {1656497, 13457317, 15370807, 6364910, 13605745, 8362338, -19174622,
2421 -5475723, -16796596, -5031438},
2422 {-22273315, -13524424, -64685, -4334223, -18605636, -10921968,
2423 -20571065, -7007978, -99853, -10237333},
2424 },
2425 {
2426 {17747465, 10039260, 19368299, -4050591, -20630635, -16041286,
2427 31992683, -15857976, -29260363, -5511971},
2428 {31932027, -4986141, -19612382, 16366580, 22023614, 88450, 11371999,
2429 -3744247, 4882242, -10626905},
2430 {29796507, 37186, 19818052, 10115756, -11829032, 3352736, 18551198,
2431 3272828, -5190932, -4162409},
2432 },
2433 {
2434 {12501286, 4044383, -8612957, -13392385, -32430052, 5136599,
2435 -19230378, -3529697, 330070, -3659409},
2436 {6384877, 2899513, 17807477, 7663917, -2358888, 12363165, 25366522,
2437 -8573892, -271295, 12071499},
2438 {-8365515, -4042521, 25133448, -4517355, -6211027, 2265927,
2439 -32769618, 1936675, -5159697, 3829363},
2440 },
2441 {
2442 {28425966, -5835433, -577090, -4697198, -14217555, 6870930, 7921550,
2443 -6567787, 26333140, 14267664},
2444 {-11067219, 11871231, 27385719, -10559544, -4585914, -11189312,
2445 10004786, -8709488, -21761224, 8930324},
2446 {-21197785, -16396035, 25654216, -1725397, 12282012, 11008919,
2447 1541940, 4757911, -26491501, -16408940},
2448 },
2449 {
2450 {13537262, -7759490, -20604840, 10961927, -5922820, -13218065,
2451 -13156584, 6217254, -15943699, 13814990},
2452 {-17422573, 15157790, 18705543, 29619, 24409717, -260476, 27361681,
2453 9257833, -1956526, -1776914},
2454 {-25045300, -10191966, 15366585, 15166509, -13105086, 8423556,
2455 -29171540, 12361135, -18685978, 4578290},
2456 },
2457 {
2458 {24579768, 3711570, 1342322, -11180126, -27005135, 14124956,
2459 -22544529, 14074919, 21964432, 8235257},
2460 {-6528613, -2411497, 9442966, -5925588, 12025640, -1487420,
2461 -2981514, -1669206, 13006806, 2355433},
2462 {-16304899, -13605259, -6632427, -5142349, 16974359, -10911083,
2463 27202044, 1719366, 1141648, -12796236},
2464 },
2465 {
2466 {-12863944, -13219986, -8318266, -11018091, -6810145, -4843894,
2467 13475066, -3133972, 32674895, 13715045},
2468 {11423335, -5468059, 32344216, 8962751, 24989809, 9241752,
2469 -13265253, 16086212, -28740881, -15642093},
2470 {-1409668, 12530728, -6368726, 10847387, 19531186, -14132160,
2471 -11709148, 7791794, -27245943, 4383347},
2472 },
2473 },
2474 {
2475 {
2476 {-28970898, 5271447, -1266009, -9736989, -12455236, 16732599,
2477 -4862407, -4906449, 27193557, 6245191},
2478 {-15193956, 5362278, -1783893, 2695834, 4960227, 12840725, 23061898,
2479 3260492, 22510453, 8577507},
2480 {-12632451, 11257346, -32692994, 13548177, -721004, 10879011,
2481 31168030, 13952092, -29571492, -3635906},
2482 },
2483 {
2484 {3877321, -9572739, 32416692, 5405324, -11004407, -13656635,
2485 3759769, 11935320, 5611860, 8164018},
2486 {-16275802, 14667797, 15906460, 12155291, -22111149, -9039718,
2487 32003002, -8832289, 5773085, -8422109},
2488 {-23788118, -8254300, 1950875, 8937633, 18686727, 16459170, -905725,
2489 12376320, 31632953, 190926},
2490 },
2491 {
2492 {-24593607, -16138885, -8423991, 13378746, 14162407, 6901328,
2493 -8288749, 4508564, -25341555, -3627528},
2494 {8884438, -5884009, 6023974, 10104341, -6881569, -4941533, 18722941,
2495 -14786005, -1672488, 827625},
2496 {-32720583, -16289296, -32503547, 7101210, 13354605, 2659080,
2497 -1800575, -14108036, -24878478, 1541286},
2498 },
2499 {
2500 {2901347, -1117687, 3880376, -10059388, -17620940, -3612781,
2501 -21802117, -3567481, 20456845, -1885033},
2502 {27019610, 12299467, -13658288, -1603234, -12861660, -4861471,
2503 -19540150, -5016058, 29439641, 15138866},
2504 {21536104, -6626420, -32447818, -10690208, -22408077, 5175814,
2505 -5420040, -16361163, 7779328, 109896},
2506 },
2507 {
2508 {30279744, 14648750, -8044871, 6425558, 13639621, -743509, 28698390,
2509 12180118, 23177719, -554075},
2510 {26572847, 3405927, -31701700, 12890905, -19265668, 5335866,
2511 -6493768, 2378492, 4439158, -13279347},
2512 {-22716706, 3489070, -9225266, -332753, 18875722, -1140095,
2513 14819434, -12731527, -17717757, -5461437},
2514 },
2515 {
2516 {-5056483, 16566551, 15953661, 3767752, -10436499, 15627060,
2517 -820954, 2177225, 8550082, -15114165},
2518 {-18473302, 16596775, -381660, 15663611, 22860960, 15585581,
2519 -27844109, -3582739, -23260460, -8428588},
2520 {-32480551, 15707275, -8205912, -5652081, 29464558, 2713815,
2521 -22725137, 15860482, -21902570, 1494193},
2522 },
2523 {
2524 {-19562091, -14087393, -25583872, -9299552, 13127842, 759709,
2525 21923482, 16529112, 8742704, 12967017},
2526 {-28464899, 1553205, 32536856, -10473729, -24691605, -406174,
2527 -8914625, -2933896, -29903758, 15553883},
2528 {21877909, 3230008, 9881174, 10539357, -4797115, 2841332, 11543572,
2529 14513274, 19375923, -12647961},
2530 },
2531 {
2532 {8832269, -14495485, 13253511, 5137575, 5037871, 4078777, 24880818,
2533 -6222716, 2862653, 9455043},
2534 {29306751, 5123106, 20245049, -14149889, 9592566, 8447059, -2077124,
2535 -2990080, 15511449, 4789663},
2536 {-20679756, 7004547, 8824831, -9434977, -4045704, -3750736,
2537 -5754762, 108893, 23513200, 16652362},
2538 },
2539 },
2540 {
2541 {
2542 {-33256173, 4144782, -4476029, -6579123, 10770039, -7155542,
2543 -6650416, -12936300, -18319198, 10212860},
2544 {2756081, 8598110, 7383731, -6859892, 22312759, -1105012, 21179801,
2545 2600940, -9988298, -12506466},
2546 {-24645692, 13317462, -30449259, -15653928, 21365574, -10869657,
2547 11344424, 864440, -2499677, -16710063},
2548 },
2549 {
2550 {-26432803, 6148329, -17184412, -14474154, 18782929, -275997,
2551 -22561534, 211300, 2719757, 4940997},
2552 {-1323882, 3911313, -6948744, 14759765, -30027150, 7851207,
2553 21690126, 8518463, 26699843, 5276295},
2554 {-13149873, -6429067, 9396249, 365013, 24703301, -10488939, 1321586,
2555 149635, -15452774, 7159369},
2556 },
2557 {
2558 {9987780, -3404759, 17507962, 9505530, 9731535, -2165514, 22356009,
2559 8312176, 22477218, -8403385},
2560 {18155857, -16504990, 19744716, 9006923, 15154154, -10538976,
2561 24256460, -4864995, -22548173, 9334109},
2562 {2986088, -4911893, 10776628, -3473844, 10620590, -7083203,
2563 -21413845, 14253545, -22587149, 536906},
2564 },
2565 {
2566 {4377756, 8115836, 24567078, 15495314, 11625074, 13064599, 7390551,
2567 10589625, 10838060, -15420424},
2568 {-19342404, 867880, 9277171, -3218459, -14431572, -1986443,
2569 19295826, -15796950, 6378260, 699185},
2570 {7895026, 4057113, -7081772, -13077756, -17886831, -323126, -716039,
2571 15693155, -5045064, -13373962},
2572 },
2573 {
2574 {-7737563, -5869402, -14566319, -7406919, 11385654, 13201616,
2575 31730678, -10962840, -3918636, -9669325},
2576 {10188286, -15770834, -7336361, 13427543, 22223443, 14896287,
2577 30743455, 7116568, -21786507, 5427593},
2578 {696102, 13206899, 27047647, -10632082, 15285305, -9853179,
2579 10798490, -4578720, 19236243, 12477404},
2580 },
2581 {
2582 {-11229439, 11243796, -17054270, -8040865, -788228, -8167967,
2583 -3897669, 11180504, -23169516, 7733644},
2584 {17800790, -14036179, -27000429, -11766671, 23887827, 3149671,
2585 23466177, -10538171, 10322027, 15313801},
2586 {26246234, 11968874, 32263343, -5468728, 6830755, -13323031,
2587 -15794704, -101982, -24449242, 10890804},
2588 },
2589 {
2590 {-31365647, 10271363, -12660625, -6267268, 16690207, -13062544,
2591 -14982212, 16484931, 25180797, -5334884},
2592 {-586574, 10376444, -32586414, -11286356, 19801893, 10997610,
2593 2276632, 9482883, 316878, 13820577},
2594 {-9882808, -4510367, -2115506, 16457136, -11100081, 11674996,
2595 30756178, -7515054, 30696930, -3712849},
2596 },
2597 {
2598 {32988917, -9603412, 12499366, 7910787, -10617257, -11931514,
2599 -7342816, -9985397, -32349517, 7392473},
2600 {-8855661, 15927861, 9866406, -3649411, -2396914, -16655781,
2601 -30409476, -9134995, 25112947, -2926644},
2602 {-2504044, -436966, 25621774, -5678772, 15085042, -5479877,
2603 -24884878, -13526194, 5537438, -13914319},
2604 },
2605 },
2606 {
2607 {
2608 {-11225584, 2320285, -9584280, 10149187, -33444663, 5808648,
2609 -14876251, -1729667, 31234590, 6090599},
2610 {-9633316, 116426, 26083934, 2897444, -6364437, -2688086, 609721,
2611 15878753, -6970405, -9034768},
2612 {-27757857, 247744, -15194774, -9002551, 23288161, -10011936,
2613 -23869595, 6503646, 20650474, 1804084},
2614 },
2615 {
2616 {-27589786, 15456424, 8972517, 8469608, 15640622, 4439847, 3121995,
2617 -10329713, 27842616, -202328},
2618 {-15306973, 2839644, 22530074, 10026331, 4602058, 5048462, 28248656,
2619 5031932, -11375082, 12714369},
2620 {20807691, -7270825, 29286141, 11421711, -27876523, -13868230,
2621 -21227475, 1035546, -19733229, 12796920},
2622 },
2623 {
2624 {12076899, -14301286, -8785001, -11848922, -25012791, 16400684,
2625 -17591495, -12899438, 3480665, -15182815},
2626 {-32361549, 5457597, 28548107, 7833186, 7303070, -11953545,
2627 -24363064, -15921875, -33374054, 2771025},
2628 {-21389266, 421932, 26597266, 6860826, 22486084, -6737172,
2629 -17137485, -4210226, -24552282, 15673397},
2630 },
2631 {
2632 {-20184622, 2338216, 19788685, -9620956, -4001265, -8740893,
2633 -20271184, 4733254, 3727144, -12934448},
2634 {6120119, 814863, -11794402, -622716, 6812205, -15747771, 2019594,
2635 7975683, 31123697, -10958981},
2636 {30069250, -11435332, 30434654, 2958439, 18399564, -976289,
2637 12296869, 9204260, -16432438, 9648165},
2638 },
2639 {
2640 {32705432, -1550977, 30705658, 7451065, -11805606, 9631813, 3305266,
2641 5248604, -26008332, -11377501},
2642 {17219865, 2375039, -31570947, -5575615, -19459679, 9219903, 294711,
2643 15298639, 2662509, -16297073},
2644 {-1172927, -7558695, -4366770, -4287744, -21346413, -8434326,
2645 32087529, -1222777, 32247248, -14389861},
2646 },
2647 {
2648 {14312628, 1221556, 17395390, -8700143, -4945741, -8684635,
2649 -28197744, -9637817, -16027623, -13378845},
2650 {-1428825, -9678990, -9235681, 6549687, -7383069, -468664, 23046502,
2651 9803137, 17597934, 2346211},
2652 {18510800, 15337574, 26171504, 981392, -22241552, 7827556,
2653 -23491134, -11323352, 3059833, -11782870},
2654 },
2655 {
2656 {10141598, 6082907, 17829293, -1947643, 9830092, 13613136,
2657 -25556636, -5544586, -33502212, 3592096},
2658 {33114168, -15889352, -26525686, -13343397, 33076705, 8716171,
2659 1151462, 1521897, -982665, -6837803},
2660 {-32939165, -4255815, 23947181, -324178, -33072974, -12305637,
2661 -16637686, 3891704, 26353178, 693168},
2662 },
2663 {
2664 {30374239, 1595580, -16884039, 13186931, 4600344, 406904, 9585294,
2665 -400668, 31375464, 14369965},
2666 {-14370654, -7772529, 1510301, 6434173, -18784789, -6262728,
2667 32732230, -13108839, 17901441, 16011505},
2668 {18171223, -11934626, -12500402, 15197122, -11038147, -15230035,
2669 -19172240, -16046376, 8764035, 12309598},
2670 },
2671 },
2672 {
2673 {
2674 {5975908, -5243188, -19459362, -9681747, -11541277, 14015782,
2675 -23665757, 1228319, 17544096, -10593782},
2676 {5811932, -1715293, 3442887, -2269310, -18367348, -8359541,
2677 -18044043, -15410127, -5565381, 12348900},
2678 {-31399660, 11407555, 25755363, 6891399, -3256938, 14872274,
2679 -24849353, 8141295, -10632534, -585479},
2680 },
2681 {
2682 {-12675304, 694026, -5076145, 13300344, 14015258, -14451394,
2683 -9698672, -11329050, 30944593, 1130208},
2684 {8247766, -6710942, -26562381, -7709309, -14401939, -14648910,
2685 4652152, 2488540, 23550156, -271232},
2686 {17294316, -3788438, 7026748, 15626851, 22990044, 113481, 2267737,
2687 -5908146, -408818, -137719},
2688 },
2689 {
2690 {16091085, -16253926, 18599252, 7340678, 2137637, -1221657,
2691 -3364161, 14550936, 3260525, -7166271},
2692 {-4910104, -13332887, 18550887, 10864893, -16459325, -7291596,
2693 -23028869, -13204905, -12748722, 2701326},
2694 {-8574695, 16099415, 4629974, -16340524, -20786213, -6005432,
2695 -10018363, 9276971, 11329923, 1862132},
2696 },
2697 {
2698 {14763076, -15903608, -30918270, 3689867, 3511892, 10313526,
2699 -21951088, 12219231, -9037963, -940300},
2700 {8894987, -3446094, 6150753, 3013931, 301220, 15693451, -31981216,
2701 -2909717, -15438168, 11595570},
2702 {15214962, 3537601, -26238722, -14058872, 4418657, -15230761,
2703 13947276, 10730794, -13489462, -4363670},
2704 },
2705 {
2706 {-2538306, 7682793, 32759013, 263109, -29984731, -7955452,
2707 -22332124, -10188635, 977108, 699994},
2708 {-12466472, 4195084, -9211532, 550904, -15565337, 12917920,
2709 19118110, -439841, -30534533, -14337913},
2710 {31788461, -14507657, 4799989, 7372237, 8808585, -14747943, 9408237,
2711 -10051775, 12493932, -5409317},
2712 },
2713 {
2714 {-25680606, 5260744, -19235809, -6284470, -3695942, 16566087,
2715 27218280, 2607121, 29375955, 6024730},
2716 {842132, -2794693, -4763381, -8722815, 26332018, -12405641,
2717 11831880, 6985184, -9940361, 2854096},
2718 {-4847262, -7969331, 2516242, -5847713, 9695691, -7221186, 16512645,
2719 960770, 12121869, 16648078},
2720 },
2721 {
2722 {-15218652, 14667096, -13336229, 2013717, 30598287, -464137,
2723 -31504922, -7882064, 20237806, 2838411},
2724 {-19288047, 4453152, 15298546, -16178388, 22115043, -15972604,
2725 12544294, -13470457, 1068881, -12499905},
2726 {-9558883, -16518835, 33238498, 13506958, 30505848, -1114596,
2727 -8486907, -2630053, 12521378, 4845654},
2728 },
2729 {
2730 {-28198521, 10744108, -2958380, 10199664, 7759311, -13088600,
2731 3409348, -873400, -6482306, -12885870},
2732 {-23561822, 6230156, -20382013, 10655314, -24040585, -11621172,
2733 10477734, -1240216, -3113227, 13974498},
2734 {12966261, 15550616, -32038948, -1615346, 21025980, -629444,
2735 5642325, 7188737, 18895762, 12629579},
2736 },
2737 },
2738 {
2739 {
2740 {14741879, -14946887, 22177208, -11721237, 1279741, 8058600,
2741 11758140, 789443, 32195181, 3895677},
2742 {10758205, 15755439, -4509950, 9243698, -4879422, 6879879, -2204575,
2743 -3566119, -8982069, 4429647},
2744 {-2453894, 15725973, -20436342, -10410672, -5803908, -11040220,
2745 -7135870, -11642895, 18047436, -15281743},
2746 },
2747 {
2748 {-25173001, -11307165, 29759956, 11776784, -22262383, -15820455,
2749 10993114, -12850837, -17620701, -9408468},
2750 {21987233, 700364, -24505048, 14972008, -7774265, -5718395,
2751 32155026, 2581431, -29958985, 8773375},
2752 {-25568350, 454463, -13211935, 16126715, 25240068, 8594567,
2753 20656846, 12017935, -7874389, -13920155},
2754 },
2755 {
2756 {6028182, 6263078, -31011806, -11301710, -818919, 2461772,
2757 -31841174, -5468042, -1721788, -2776725},
2758 {-12278994, 16624277, 987579, -5922598, 32908203, 1248608, 7719845,
2759 -4166698, 28408820, 6816612},
2760 {-10358094, -8237829, 19549651, -12169222, 22082623, 16147817,
2761 20613181, 13982702, -10339570, 5067943},
2762 },
2763 {
2764 {-30505967, -3821767, 12074681, 13582412, -19877972, 2443951,
2765 -19719286, 12746132, 5331210, -10105944},
2766 {30528811, 3601899, -1957090, 4619785, -27361822, -15436388,
2767 24180793, -12570394, 27679908, -1648928},
2768 {9402404, -13957065, 32834043, 10838634, -26580150, -13237195,
2769 26653274, -8685565, 22611444, -12715406},
2770 },
2771 {
2772 {22190590, 1118029, 22736441, 15130463, -30460692, -5991321,
2773 19189625, -4648942, 4854859, 6622139},
2774 {-8310738, -2953450, -8262579, -3388049, -10401731, -271929,
2775 13424426, -3567227, 26404409, 13001963},
2776 {-31241838, -15415700, -2994250, 8939346, 11562230, -12840670,
2777 -26064365, -11621720, -15405155, 11020693},
2778 },
2779 {
2780 {1866042, -7949489, -7898649, -10301010, 12483315, 13477547,
2781 3175636, -12424163, 28761762, 1406734},
2782 {-448555, -1777666, 13018551, 3194501, -9580420, -11161737,
2783 24760585, -4347088, 25577411, -13378680},
2784 {-24290378, 4759345, -690653, -1852816, 2066747, 10693769,
2785 -29595790, 9884936, -9368926, 4745410},
2786 },
2787 {
2788 {-9141284, 6049714, -19531061, -4341411, -31260798, 9944276,
2789 -15462008, -11311852, 10931924, -11931931},
2790 {-16561513, 14112680, -8012645, 4817318, -8040464, -11414606,
2791 -22853429, 10856641, -20470770, 13434654},
2792 {22759489, -10073434, -16766264, -1871422, 13637442, -10168091,
2793 1765144, -12654326, 28445307, -5364710},
2794 },
2795 {
2796 {29875063, 12493613, 2795536, -3786330, 1710620, 15181182,
2797 -10195717, -8788675, 9074234, 1167180},
2798 {-26205683, 11014233, -9842651, -2635485, -26908120, 7532294,
2799 -18716888, -9535498, 3843903, 9367684},
2800 {-10969595, -6403711, 9591134, 9582310, 11349256, 108879, 16235123,
2801 8601684, -139197, 4242895},
2802 },
2803 },
2804 {
2805 {
2806 {22092954, -13191123, -2042793, -11968512, 32186753, -11517388,
2807 -6574341, 2470660, -27417366, 16625501},
2808 {-11057722, 3042016, 13770083, -9257922, 584236, -544855, -7770857,
2809 2602725, -27351616, 14247413},
2810 {6314175, -10264892, -32772502, 15957557, -10157730, 168750,
2811 -8618807, 14290061, 27108877, -1180880},
2812 },
2813 {
2814 {-8586597, -7170966, 13241782, 10960156, -32991015, -13794596,
2815 33547976, -11058889, -27148451, 981874},
2816 {22833440, 9293594, -32649448, -13618667, -9136966, 14756819,
2817 -22928859, -13970780, -10479804, -16197962},
2818 {-7768587, 3326786, -28111797, 10783824, 19178761, 14905060,
2819 22680049, 13906969, -15933690, 3797899},
2820 },
2821 {
2822 {21721356, -4212746, -12206123, 9310182, -3882239, -13653110,
2823 23740224, -2709232, 20491983, -8042152},
2824 {9209270, -15135055, -13256557, -6167798, -731016, 15289673,
2825 25947805, 15286587, 30997318, -6703063},
2826 {7392032, 16618386, 23946583, -8039892, -13265164, -1533858,
2827 -14197445, -2321576, 17649998, -250080},
2828 },
2829 {
2830 {-9301088, -14193827, 30609526, -3049543, -25175069, -1283752,
2831 -15241566, -9525724, -2233253, 7662146},
2832 {-17558673, 1763594, -33114336, 15908610, -30040870, -12174295,
2833 7335080, -8472199, -3174674, 3440183},
2834 {-19889700, -5977008, -24111293, -9688870, 10799743, -16571957,
2835 40450, -4431835, 4862400, 1133},
2836 },
2837 {
2838 {-32856209, -7873957, -5422389, 14860950, -16319031, 7956142,
2839 7258061, 311861, -30594991, -7379421},
2840 {-3773428, -1565936, 28985340, 7499440, 24445838, 9325937, 29727763,
2841 16527196, 18278453, 15405622},
2842 {-4381906, 8508652, -19898366, -3674424, -5984453, 15149970,
2843 -13313598, 843523, -21875062, 13626197},
2844 },
2845 {
2846 {2281448, -13487055, -10915418, -2609910, 1879358, 16164207,
2847 -10783882, 3953792, 13340839, 15928663},
2848 {31727126, -7179855, -18437503, -8283652, 2875793, -16390330,
2849 -25269894, -7014826, -23452306, 5964753},
2850 {4100420, -5959452, -17179337, 6017714, -18705837, 12227141,
2851 -26684835, 11344144, 2538215, -7570755},
2852 },
2853 {
2854 {-9433605, 6123113, 11159803, -2156608, 30016280, 14966241,
2855 -20474983, 1485421, -629256, -15958862},
2856 {-26804558, 4260919, 11851389, 9658551, -32017107, 16367492,
2857 -20205425, -13191288, 11659922, -11115118},
2858 {26180396, 10015009, -30844224, -8581293, 5418197, 9480663, 2231568,
2859 -10170080, 33100372, -1306171},
2860 },
2861 {
2862 {15121113, -5201871, -10389905, 15427821, -27509937, -15992507,
2863 21670947, 4486675, -5931810, -14466380},
2864 {16166486, -9483733, -11104130, 6023908, -31926798, -1364923,
2865 2340060, -16254968, -10735770, -10039824},
2866 {28042865, -3557089, -12126526, 12259706, -3717498, -6945899,
2867 6766453, -8689599, 18036436, 5803270},
2868 },
2869 },
2870 {
2871 {
2872 {-817581, 6763912, 11803561, 1585585, 10958447, -2671165, 23855391,
2873 4598332, -6159431, -14117438},
2874 {-31031306, -14256194, 17332029, -2383520, 31312682, -5967183,
2875 696309, 50292, -20095739, 11763584},
2876 {-594563, -2514283, -32234153, 12643980, 12650761, 14811489, 665117,
2877 -12613632, -19773211, -10713562},
2878 },
2879 {
2880 {30464590, -11262872, -4127476, -12734478, 19835327, -7105613,
2881 -24396175, 2075773, -17020157, 992471},
2882 {18357185, -6994433, 7766382, 16342475, -29324918, 411174, 14578841,
2883 8080033, -11574335, -10601610},
2884 {19598397, 10334610, 12555054, 2555664, 18821899, -10339780,
2885 21873263, 16014234, 26224780, 16452269},
2886 },
2887 {
2888 {-30223925, 5145196, 5944548, 16385966, 3976735, 2009897, -11377804,
2889 -7618186, -20533829, 3698650},
2890 {14187449, 3448569, -10636236, -10810935, -22663880, -3433596,
2891 7268410, -10890444, 27394301, 12015369},
2892 {19695761, 16087646, 28032085, 12999827, 6817792, 11427614,
2893 20244189, -1312777, -13259127, -3402461},
2894 },
2895 {
2896 {30860103, 12735208, -1888245, -4699734, -16974906, 2256940,
2897 -8166013, 12298312, -8550524, -10393462},
2898 {-5719826, -11245325, -1910649, 15569035, 26642876, -7587760,
2899 -5789354, -15118654, -4976164, 12651793},
2900 {-2848395, 9953421, 11531313, -5282879, 26895123, -12697089,
2901 -13118820, -16517902, 9768698, -2533218},
2902 },
2903 {
2904 {-24719459, 1894651, -287698, -4704085, 15348719, -8156530,
2905 32767513, 12765450, 4940095, 10678226},
2906 {18860224, 15980149, -18987240, -1562570, -26233012, -11071856,
2907 -7843882, 13944024, -24372348, 16582019},
2908 {-15504260, 4970268, -29893044, 4175593, -20993212, -2199756,
2909 -11704054, 15444560, -11003761, 7989037},
2910 },
2911 {
2912 {31490452, 5568061, -2412803, 2182383, -32336847, 4531686,
2913 -32078269, 6200206, -19686113, -14800171},
2914 {-17308668, -15879940, -31522777, -2831, -32887382, 16375549,
2915 8680158, -16371713, 28550068, -6857132},
2916 {-28126887, -5688091, 16837845, -1820458, -6850681, 12700016,
2917 -30039981, 4364038, 1155602, 5988841},
2918 },
2919 {
2920 {21890435, -13272907, -12624011, 12154349, -7831873, 15300496,
2921 23148983, -4470481, 24618407, 8283181},
2922 {-33136107, -10512751, 9975416, 6841041, -31559793, 16356536,
2923 3070187, -7025928, 1466169, 10740210},
2924 {-1509399, -15488185, -13503385, -10655916, 32799044, 909394,
2925 -13938903, -5779719, -32164649, -15327040},
2926 },
2927 {
2928 {3960823, -14267803, -28026090, -15918051, -19404858, 13146868,
2929 15567327, 951507, -3260321, -573935},
2930 {24740841, 5052253, -30094131, 8961361, 25877428, 6165135,
2931 -24368180, 14397372, -7380369, -6144105},
2932 {-28888365, 3510803, -28103278, -1158478, -11238128, -10631454,
2933 -15441463, -14453128, -1625486, -6494814},
2934 },
2935 },
2936 {
2937 {
2938 {793299, -9230478, 8836302, -6235707, -27360908, -2369593, 33152843,
2939 -4885251, -9906200, -621852},
2940 {5666233, 525582, 20782575, -8038419, -24538499, 14657740, 16099374,
2941 1468826, -6171428, -15186581},
2942 {-4859255, -3779343, -2917758, -6748019, 7778750, 11688288,
2943 -30404353, -9871238, -1558923, -9863646},
2944 },
2945 {
2946 {10896332, -7719704, 824275, 472601, -19460308, 3009587, 25248958,
2947 14783338, -30581476, -15757844},
2948 {10566929, 12612572, -31944212, 11118703, -12633376, 12362879,
2949 21752402, 8822496, 24003793, 14264025},
2950 {27713862, -7355973, -11008240, 9227530, 27050101, 2504721,
2951 23886875, -13117525, 13958495, -5732453},
2952 },
2953 {
2954 {-23481610, 4867226, -27247128, 3900521, 29838369, -8212291,
2955 -31889399, -10041781, 7340521, -15410068},
2956 {4646514, -8011124, -22766023, -11532654, 23184553, 8566613,
2957 31366726, -1381061, -15066784, -10375192},
2958 {-17270517, 12723032, -16993061, 14878794, 21619651, -6197576,
2959 27584817, 3093888, -8843694, 3849921},
2960 },
2961 {
2962 {-9064912, 2103172, 25561640, -15125738, -5239824, 9582958,
2963 32477045, -9017955, 5002294, -15550259},
2964 {-12057553, -11177906, 21115585, -13365155, 8808712, -12030708,
2965 16489530, 13378448, -25845716, 12741426},
2966 {-5946367, 10645103, -30911586, 15390284, -3286982, -7118677,
2967 24306472, 15852464, 28834118, -7646072},
2968 },
2969 {
2970 {-17335748, -9107057, -24531279, 9434953, -8472084, -583362,
2971 -13090771, 455841, 20461858, 5491305},
2972 {13669248, -16095482, -12481974, -10203039, -14569770, -11893198,
2973 -24995986, 11293807, -28588204, -9421832},
2974 {28497928, 6272777, -33022994, 14470570, 8906179, -1225630,
2975 18504674, -14165166, 29867745, -8795943},
2976 },
2977 {
2978 {-16207023, 13517196, -27799630, -13697798, 24009064, -6373891,
2979 -6367600, -13175392, 22853429, -4012011},
2980 {24191378, 16712145, -13931797, 15217831, 14542237, 1646131,
2981 18603514, -11037887, 12876623, -2112447},
2982 {17902668, 4518229, -411702, -2829247, 26878217, 5258055, -12860753,
2983 608397, 16031844, 3723494},
2984 },
2985 {
2986 {-28632773, 12763728, -20446446, 7577504, 33001348, -13017745,
2987 17558842, -7872890, 23896954, -4314245},
2988 {-20005381, -12011952, 31520464, 605201, 2543521, 5991821, -2945064,
2989 7229064, -9919646, -8826859},
2990 {28816045, 298879, -28165016, -15920938, 19000928, -1665890,
2991 -12680833, -2949325, -18051778, -2082915},
2992 },
2993 {
2994 {16000882, -344896, 3493092, -11447198, -29504595, -13159789,
2995 12577740, 16041268, -19715240, 7847707},
2996 {10151868, 10572098, 27312476, 7922682, 14825339, 4723128,
2997 -32855931, -6519018, -10020567, 3852848},
2998 {-11430470, 15697596, -21121557, -4420647, 5386314, 15063598,
2999 16514493, -15932110, 29330899, -15076224},
3000 },
3001 },
3002 {
3003 {
3004 {-25499735, -4378794, -15222908, -6901211, 16615731, 2051784,
3005 3303702, 15490, -27548796, 12314391},
3006 {15683520, -6003043, 18109120, -9980648, 15337968, -5997823,
3007 -16717435, 15921866, 16103996, -3731215},
3008 {-23169824, -10781249, 13588192, -1628807, -3798557, -1074929,
3009 -19273607, 5402699, -29815713, -9841101},
3010 },
3011 {
3012 {23190676, 2384583, -32714340, 3462154, -29903655, -1529132,
3013 -11266856, 8911517, -25205859, 2739713},
3014 {21374101, -3554250, -33524649, 9874411, 15377179, 11831242,
3015 -33529904, 6134907, 4931255, 11987849},
3016 {-7732, -2978858, -16223486, 7277597, 105524, -322051, -31480539,
3017 13861388, -30076310, 10117930},
3018 },
3019 {
3020 {-29501170, -10744872, -26163768, 13051539, -25625564, 5089643,
3021 -6325503, 6704079, 12890019, 15728940},
3022 {-21972360, -11771379, -951059, -4418840, 14704840, 2695116, 903376,
3023 -10428139, 12885167, 8311031},
3024 {-17516482, 5352194, 10384213, -13811658, 7506451, 13453191,
3025 26423267, 4384730, 1888765, -5435404},
3026 },
3027 {
3028 {-25817338, -3107312, -13494599, -3182506, 30896459, -13921729,
3029 -32251644, -12707869, -19464434, -3340243},
3030 {-23607977, -2665774, -526091, 4651136, 5765089, 4618330, 6092245,
3031 14845197, 17151279, -9854116},
3032 {-24830458, -12733720, -15165978, 10367250, -29530908, -265356,
3033 22825805, -7087279, -16866484, 16176525},
3034 },
3035 {
3036 {-23583256, 6564961, 20063689, 3798228, -4740178, 7359225, 2006182,
3037 -10363426, -28746253, -10197509},
3038 {-10626600, -4486402, -13320562, -5125317, 3432136, -6393229,
3039 23632037, -1940610, 32808310, 1099883},
3040 {15030977, 5768825, -27451236, -2887299, -6427378, -15361371,
3041 -15277896, -6809350, 2051441, -15225865},
3042 },
3043 {
3044 {-3362323, -7239372, 7517890, 9824992, 23555850, 295369, 5148398,
3045 -14154188, -22686354, 16633660},
3046 {4577086, -16752288, 13249841, -15304328, 19958763, -14537274,
3047 18559670, -10759549, 8402478, -9864273},
3048 {-28406330, -1051581, -26790155, -907698, -17212414, -11030789,
3049 9453451, -14980072, 17983010, 9967138},
3050 },
3051 {
3052 {-25762494, 6524722, 26585488, 9969270, 24709298, 1220360, -1677990,
3053 7806337, 17507396, 3651560},
3054 {-10420457, -4118111, 14584639, 15971087, -15768321, 8861010,
3055 26556809, -5574557, -18553322, -11357135},
3056 {2839101, 14284142, 4029895, 3472686, 14402957, 12689363, -26642121,
3057 8459447, -5605463, -7621941},
3058 },
3059 {
3060 {-4839289, -3535444, 9744961, 2871048, 25113978, 3187018, -25110813,
3061 -849066, 17258084, -7977739},
3062 {18164541, -10595176, -17154882, -1542417, 19237078, -9745295,
3063 23357533, -15217008, 26908270, 12150756},
3064 {-30264870, -7647865, 5112249, -7036672, -1499807, -6974257, 43168,
3065 -5537701, -32302074, 16215819},
3066 },
3067 },
3068 {
3069 {
3070 {-6898905, 9824394, -12304779, -4401089, -31397141, -6276835,
3071 32574489, 12532905, -7503072, -8675347},
3072 {-27343522, -16515468, -27151524, -10722951, 946346, 16291093,
3073 254968, 7168080, 21676107, -1943028},
3074 {21260961, -8424752, -16831886, -11920822, -23677961, 3968121,
3075 -3651949, -6215466, -3556191, -7913075},
3076 },
3077 {
3078 {16544754, 13250366, -16804428, 15546242, -4583003, 12757258,
3079 -2462308, -8680336, -18907032, -9662799},
3080 {-2415239, -15577728, 18312303, 4964443, -15272530, -12653564,
3081 26820651, 16690659, 25459437, -4564609},
3082 {-25144690, 11425020, 28423002, -11020557, -6144921, -15826224,
3083 9142795, -2391602, -6432418, -1644817},
3084 },
3085 {
3086 {-23104652, 6253476, 16964147, -3768872, -25113972, -12296437,
3087 -27457225, -16344658, 6335692, 7249989},
3088 {-30333227, 13979675, 7503222, -12368314, -11956721, -4621693,
3089 -30272269, 2682242, 25993170, -12478523},
3090 {4364628, 5930691, 32304656, -10044554, -8054781, 15091131,
3091 22857016, -10598955, 31820368, 15075278},
3092 },
3093 {
3094 {31879134, -8918693, 17258761, 90626, -8041836, -4917709, 24162788,
3095 -9650886, -17970238, 12833045},
3096 {19073683, 14851414, -24403169, -11860168, 7625278, 11091125,
3097 -19619190, 2074449, -9413939, 14905377},
3098 {24483667, -11935567, -2518866, -11547418, -1553130, 15355506,
3099 -25282080, 9253129, 27628530, -7555480},
3100 },
3101 {
3102 {17597607, 8340603, 19355617, 552187, 26198470, -3176583, 4593324,
3103 -9157582, -14110875, 15297016},
3104 {510886, 14337390, -31785257, 16638632, 6328095, 2713355, -20217417,
3105 -11864220, 8683221, 2921426},
3106 {18606791, 11874196, 27155355, -5281482, -24031742, 6265446,
3107 -25178240, -1278924, 4674690, 13890525},
3108 },
3109 {
3110 {13609624, 13069022, -27372361, -13055908, 24360586, 9592974,
3111 14977157, 9835105, 4389687, 288396},
3112 {9922506, -519394, 13613107, 5883594, -18758345, -434263, -12304062,
3113 8317628, 23388070, 16052080},
3114 {12720016, 11937594, -31970060, -5028689, 26900120, 8561328,
3115 -20155687, -11632979, -14754271, -10812892},
3116 },
3117 {
3118 {15961858, 14150409, 26716931, -665832, -22794328, 13603569,
3119 11829573, 7467844, -28822128, 929275},
3120 {11038231, -11582396, -27310482, -7316562, -10498527, -16307831,
3121 -23479533, -9371869, -21393143, 2465074},
3122 {20017163, -4323226, 27915242, 1529148, 12396362, 15675764,
3123 13817261, -9658066, 2463391, -4622140},
3124 },
3125 {
3126 {-16358878, -12663911, -12065183, 4996454, -1256422, 1073572,
3127 9583558, 12851107, 4003896, 12673717},
3128 {-1731589, -15155870, -3262930, 16143082, 19294135, 13385325,
3129 14741514, -9103726, 7903886, 2348101},
3130 {24536016, -16515207, 12715592, -3862155, 1511293, 10047386,
3131 -3842346, -7129159, -28377538, 10048127},
3132 },
3133 },
3134 {
3135 {
3136 {-12622226, -6204820, 30718825, 2591312, -10617028, 12192840,
3137 18873298, -7297090, -32297756, 15221632},
3138 {-26478122, -11103864, 11546244, -1852483, 9180880, 7656409,
3139 -21343950, 2095755, 29769758, 6593415},
3140 {-31994208, -2907461, 4176912, 3264766, 12538965, -868111, 26312345,
3141 -6118678, 30958054, 8292160},
3142 },
3143 {
3144 {31429822, -13959116, 29173532, 15632448, 12174511, -2760094,
3145 32808831, 3977186, 26143136, -3148876},
3146 {22648901, 1402143, -22799984, 13746059, 7936347, 365344, -8668633,
3147 -1674433, -3758243, -2304625},
3148 {-15491917, 8012313, -2514730, -12702462, -23965846, -10254029,
3149 -1612713, -1535569, -16664475, 8194478},
3150 },
3151 {
3152 {27338066, -7507420, -7414224, 10140405, -19026427, -6589889,
3153 27277191, 8855376, 28572286, 3005164},
3154 {26287124, 4821776, 25476601, -4145903, -3764513, -15788984,
3155 -18008582, 1182479, -26094821, -13079595},
3156 {-7171154, 3178080, 23970071, 6201893, -17195577, -4489192,
3157 -21876275, -13982627, 32208683, -1198248},
3158 },
3159 {
3160 {-16657702, 2817643, -10286362, 14811298, 6024667, 13349505,
3161 -27315504, -10497842, -27672585, -11539858},
3162 {15941029, -9405932, -21367050, 8062055, 31876073, -238629,
3163 -15278393, -1444429, 15397331, -4130193},
3164 {8934485, -13485467, -23286397, -13423241, -32446090, 14047986,
3165 31170398, -1441021, -27505566, 15087184},
3166 },
3167 {
3168 {-18357243, -2156491, 24524913, -16677868, 15520427, -6360776,
3169 -15502406, 11461896, 16788528, -5868942},
3170 {-1947386, 16013773, 21750665, 3714552, -17401782, -16055433,
3171 -3770287, -10323320, 31322514, -11615635},
3172 {21426655, -5650218, -13648287, -5347537, -28812189, -4920970,
3173 -18275391, -14621414, 13040862, -12112948},
3174 },
3175 {
3176 {11293895, 12478086, -27136401, 15083750, -29307421, 14748872,
3177 14555558, -13417103, 1613711, 4896935},
3178 {-25894883, 15323294, -8489791, -8057900, 25967126, -13425460,
3179 2825960, -4897045, -23971776, -11267415},
3180 {-15924766, -5229880, -17443532, 6410664, 3622847, 10243618,
3181 20615400, 12405433, -23753030, -8436416},
3182 },
3183 {
3184 {-7091295, 12556208, -20191352, 9025187, -17072479, 4333801,
3185 4378436, 2432030, 23097949, -566018},
3186 {4565804, -16025654, 20084412, -7842817, 1724999, 189254, 24767264,
3187 10103221, -18512313, 2424778},
3188 {366633, -11976806, 8173090, -6890119, 30788634, 5745705, -7168678,
3189 1344109, -3642553, 12412659},
3190 },
3191 {
3192 {-24001791, 7690286, 14929416, -168257, -32210835, -13412986,
3193 24162697, -15326504, -3141501, 11179385},
3194 {18289522, -14724954, 8056945, 16430056, -21729724, 7842514,
3195 -6001441, -1486897, -18684645, -11443503},
3196 {476239, 6601091, -6152790, -9723375, 17503545, -4863900, 27672959,
3197 13403813, 11052904, 5219329},
3198 },
3199 },
3200 {
3201 {
3202 {20678546, -8375738, -32671898, 8849123, -5009758, 14574752,
3203 31186971, -3973730, 9014762, -8579056},
3204 {-13644050, -10350239, -15962508, 5075808, -1514661, -11534600,
3205 -33102500, 9160280, 8473550, -3256838},
3206 {24900749, 14435722, 17209120, -15292541, -22592275, 9878983,
3207 -7689309, -16335821, -24568481, 11788948},
3208 },
3209 {
3210 {-3118155, -11395194, -13802089, 14797441, 9652448, -6845904,
3211 -20037437, 10410733, -24568470, -1458691},
3212 {-15659161, 16736706, -22467150, 10215878, -9097177, 7563911,
3213 11871841, -12505194, -18513325, 8464118},
3214 {-23400612, 8348507, -14585951, -861714, -3950205, -6373419,
3215 14325289, 8628612, 33313881, -8370517},
3216 },
3217 {
3218 {-20186973, -4967935, 22367356, 5271547, -1097117, -4788838,
3219 -24805667, -10236854, -8940735, -5818269},
3220 {-6948785, -1795212, -32625683, -16021179, 32635414, -7374245,
3221 15989197, -12838188, 28358192, -4253904},
3222 {-23561781, -2799059, -32351682, -1661963, -9147719, 10429267,
3223 -16637684, 4072016, -5351664, 5596589},
3224 },
3225 {
3226 {-28236598, -3390048, 12312896, 6213178, 3117142, 16078565,
3227 29266239, 2557221, 1768301, 15373193},
3228 {-7243358, -3246960, -4593467, -7553353, -127927, -912245, -1090902,
3229 -4504991, -24660491, 3442910},
3230 {-30210571, 5124043, 14181784, 8197961, 18964734, -11939093,
3231 22597931, 7176455, -18585478, 13365930},
3232 },
3233 {
3234 {-7877390, -1499958, 8324673, 4690079, 6261860, 890446, 24538107,
3235 -8570186, -9689599, -3031667},
3236 {25008904, -10771599, -4305031, -9638010, 16265036, 15721635,
3237 683793, -11823784, 15723479, -15163481},
3238 {-9660625, 12374379, -27006999, -7026148, -7724114, -12314514,
3239 11879682, 5400171, 519526, -1235876},
3240 },
3241 {
3242 {22258397, -16332233, -7869817, 14613016, -22520255, -2950923,
3243 -20353881, 7315967, 16648397, 7605640},
3244 {-8081308, -8464597, -8223311, 9719710, 19259459, -15348212,
3245 23994942, -5281555, -9468848, 4763278},
3246 {-21699244, 9220969, -15730624, 1084137, -25476107, -2852390,
3247 31088447, -7764523, -11356529, 728112},
3248 },
3249 {
3250 {26047220, -11751471, -6900323, -16521798, 24092068, 9158119,
3251 -4273545, -12555558, -29365436, -5498272},
3252 {17510331, -322857, 5854289, 8403524, 17133918, -3112612, -28111007,
3253 12327945, 10750447, 10014012},
3254 {-10312768, 3936952, 9156313, -8897683, 16498692, -994647,
3255 -27481051, -666732, 3424691, 7540221},
3256 },
3257 {
3258 {30322361, -6964110, 11361005, -4143317, 7433304, 4989748, -7071422,
3259 -16317219, -9244265, 15258046},
3260 {13054562, -2779497, 19155474, 469045, -12482797, 4566042, 5631406,
3261 2711395, 1062915, -5136345},
3262 {-19240248, -11254599, -29509029, -7499965, -5835763, 13005411,
3263 -6066489, 12194497, 32960380, 1459310},
3264 },
3265 },
3266 {
3267 {
3268 {19852034, 7027924, 23669353, 10020366, 8586503, -6657907, 394197,
3269 -6101885, 18638003, -11174937},
3270 {31395534, 15098109, 26581030, 8030562, -16527914, -5007134,
3271 9012486, -7584354, -6643087, -5442636},
3272 {-9192165, -2347377, -1997099, 4529534, 25766844, 607986, -13222,
3273 9677543, -32294889, -6456008},
3274 },
3275 {
3276 {-2444496, -149937, 29348902, 8186665, 1873760, 12489863, -30934579,
3277 -7839692, -7852844, -8138429},
3278 {-15236356, -15433509, 7766470, 746860, 26346930, -10221762,
3279 -27333451, 10754588, -9431476, 5203576},
3280 {31834314, 14135496, -770007, 5159118, 20917671, -16768096,
3281 -7467973, -7337524, 31809243, 7347066},
3282 },
3283 {
3284 {-9606723, -11874240, 20414459, 13033986, 13716524, -11691881,
3285 19797970, -12211255, 15192876, -2087490},
3286 {-12663563, -2181719, 1168162, -3804809, 26747877, -14138091,
3287 10609330, 12694420, 33473243, -13382104},
3288 {33184999, 11180355, 15832085, -11385430, -1633671, 225884,
3289 15089336, -11023903, -6135662, 14480053},
3290 },
3291 {
3292 {31308717, -5619998, 31030840, -1897099, 15674547, -6582883,
3293 5496208, 13685227, 27595050, 8737275},
3294 {-20318852, -15150239, 10933843, -16178022, 8335352, -7546022,
3295 -31008351, -12610604, 26498114, 66511},
3296 {22644454, -8761729, -16671776, 4884562, -3105614, -13559366,
3297 30540766, -4286747, -13327787, -7515095},
3298 },
3299 {
3300 {-28017847, 9834845, 18617207, -2681312, -3401956, -13307506,
3301 8205540, 13585437, -17127465, 15115439},
3302 {23711543, -672915, 31206561, -8362711, 6164647, -9709987,
3303 -33535882, -1426096, 8236921, 16492939},
3304 {-23910559, -13515526, -26299483, -4503841, 25005590, -7687270,
3305 19574902, 10071562, 6708380, -6222424},
3306 },
3307 {
3308 {2101391, -4930054, 19702731, 2367575, -15427167, 1047675, 5301017,
3309 9328700, 29955601, -11678310},
3310 {3096359, 9271816, -21620864, -15521844, -14847996, -7592937,
3311 -25892142, -12635595, -9917575, 6216608},
3312 {-32615849, 338663, -25195611, 2510422, -29213566, -13820213,
3313 24822830, -6146567, -26767480, 7525079},
3314 },
3315 {
3316 {-23066649, -13985623, 16133487, -7896178, -3389565, 778788,
3317 -910336, -2782495, -19386633, 11994101},
3318 {21691500, -13624626, -641331, -14367021, 3285881, -3483596,
3319 -25064666, 9718258, -7477437, 13381418},
3320 {18445390, -4202236, 14979846, 11622458, -1727110, -3582980,
3321 23111648, -6375247, 28535282, 15779576},
3322 },
3323 {
3324 {30098053, 3089662, -9234387, 16662135, -21306940, 11308411,
3325 -14068454, 12021730, 9955285, -16303356},
3326 {9734894, -14576830, -7473633, -9138735, 2060392, 11313496,
3327 -18426029, 9924399, 20194861, 13380996},
3328 {-26378102, -7965207, -22167821, 15789297, -18055342, -6168792,
3329 -1984914, 15707771, 26342023, 10146099},
3330 },
3331 },
3332 {
3333 {
3334 {-26016874, -219943, 21339191, -41388, 19745256, -2878700,
3335 -29637280, 2227040, 21612326, -545728},
3336 {-13077387, 1184228, 23562814, -5970442, -20351244, -6348714,
3337 25764461, 12243797, -20856566, 11649658},
3338 {-10031494, 11262626, 27384172, 2271902, 26947504, -15997771, 39944,
3339 6114064, 33514190, 2333242},
3340 },
3341 {
3342 {-21433588, -12421821, 8119782, 7219913, -21830522, -9016134,
3343 -6679750, -12670638, 24350578, -13450001},
3344 {-4116307, -11271533, -23886186, 4843615, -30088339, 690623,
3345 -31536088, -10406836, 8317860, 12352766},
3346 {18200138, -14475911, -33087759, -2696619, -23702521, -9102511,
3347 -23552096, -2287550, 20712163, 6719373},
3348 },
3349 {
3350 {26656208, 6075253, -7858556, 1886072, -28344043, 4262326, 11117530,
3351 -3763210, 26224235, -3297458},
3352 {-17168938, -14854097, -3395676, -16369877, -19954045, 14050420,
3353 21728352, 9493610, 18620611, -16428628},
3354 {-13323321, 13325349, 11432106, 5964811, 18609221, 6062965,
3355 -5269471, -9725556, -30701573, -16479657},
3356 },
3357 {
3358 {-23860538, -11233159, 26961357, 1640861, -32413112, -16737940,
3359 12248509, -5240639, 13735342, 1934062},
3360 {25089769, 6742589, 17081145, -13406266, 21909293, -16067981,
3361 -15136294, -3765346, -21277997, 5473616},
3362 {31883677, -7961101, 1083432, -11572403, 22828471, 13290673,
3363 -7125085, 12469656, 29111212, -5451014},
3364 },
3365 {
3366 {24244947, -15050407, -26262976, 2791540, -14997599, 16666678,
3367 24367466, 6388839, -10295587, 452383},
3368 {-25640782, -3417841, 5217916, 16224624, 19987036, -4082269,
3369 -24236251, -5915248, 15766062, 8407814},
3370 {-20406999, 13990231, 15495425, 16395525, 5377168, 15166495,
3371 -8917023, -4388953, -8067909, 2276718},
3372 },
3373 {
3374 {30157918, 12924066, -17712050, 9245753, 19895028, 3368142,
3375 -23827587, 5096219, 22740376, -7303417},
3376 {2041139, -14256350, 7783687, 13876377, -25946985, -13352459,
3377 24051124, 13742383, -15637599, 13295222},
3378 {33338237, -8505733, 12532113, 7977527, 9106186, -1715251,
3379 -17720195, -4612972, -4451357, -14669444},
3380 },
3381 {
3382 {-20045281, 5454097, -14346548, 6447146, 28862071, 1883651,
3383 -2469266, -4141880, 7770569, 9620597},
3384 {23208068, 7979712, 33071466, 8149229, 1758231, -10834995, 30945528,
3385 -1694323, -33502340, -14767970},
3386 {1439958, -16270480, -1079989, -793782, 4625402, 10647766, -5043801,
3387 1220118, 30494170, -11440799},
3388 },
3389 {
3390 {-5037580, -13028295, -2970559, -3061767, 15640974, -6701666,
3391 -26739026, 926050, -1684339, -13333647},
3392 {13908495, -3549272, 30919928, -6273825, -21521863, 7989039,
3393 9021034, 9078865, 3353509, 4033511},
3394 {-29663431, -15113610, 32259991, -344482, 24295849, -12912123,
3395 23161163, 8839127, 27485041, 7356032},
3396 },
3397 },
3398 {
3399 {
3400 {9661027, 705443, 11980065, -5370154, -1628543, 14661173, -6346142,
3401 2625015, 28431036, -16771834},
3402 {-23839233, -8311415, -25945511, 7480958, -17681669, -8354183,
3403 -22545972, 14150565, 15970762, 4099461},
3404 {29262576, 16756590, 26350592, -8793563, 8529671, -11208050,
3405 13617293, -9937143, 11465739, 8317062},
3406 },
3407 {
3408 {-25493081, -6962928, 32500200, -9419051, -23038724, -2302222,
3409 14898637, 3848455, 20969334, -5157516},
3410 {-20384450, -14347713, -18336405, 13884722, -33039454, 2842114,
3411 -21610826, -3649888, 11177095, 14989547},
3412 {-24496721, -11716016, 16959896, 2278463, 12066309, 10137771,
3413 13515641, 2581286, -28487508, 9930240},
3414 },
3415 {
3416 {-17751622, -2097826, 16544300, -13009300, -15914807, -14949081,
3417 18345767, -13403753, 16291481, -5314038},
3418 {-33229194, 2553288, 32678213, 9875984, 8534129, 6889387, -9676774,
3419 6957617, 4368891, 9788741},
3420 {16660756, 7281060, -10830758, 12911820, 20108584, -8101676,
3421 -21722536, -8613148, 16250552, -11111103},
3422 },
3423 {
3424 {-19765507, 2390526, -16551031, 14161980, 1905286, 6414907, 4689584,
3425 10604807, -30190403, 4782747},
3426 {-1354539, 14736941, -7367442, -13292886, 7710542, -14155590,
3427 -9981571, 4383045, 22546403, 437323},
3428 {31665577, -12180464, -16186830, 1491339, -18368625, 3294682,
3429 27343084, 2786261, -30633590, -14097016},
3430 },
3431 {
3432 {-14467279, -683715, -33374107, 7448552, 19294360, 14334329,
3433 -19690631, 2355319, -19284671, -6114373},
3434 {15121312, -15796162, 6377020, -6031361, -10798111, -12957845,
3435 18952177, 15496498, -29380133, 11754228},
3436 {-2637277, -13483075, 8488727, -14303896, 12728761, -1622493,
3437 7141596, 11724556, 22761615, -10134141},
3438 },
3439 {
3440 {16918416, 11729663, -18083579, 3022987, -31015732, -13339659,
3441 -28741185, -12227393, 32851222, 11717399},
3442 {11166634, 7338049, -6722523, 4531520, -29468672, -7302055,
3443 31474879, 3483633, -1193175, -4030831},
3444 {-185635, 9921305, 31456609, -13536438, -12013818, 13348923,
3445 33142652, 6546660, -19985279, -3948376},
3446 },
3447 {
3448 {-32460596, 11266712, -11197107, -7899103, 31703694, 3855903,
3449 -8537131, -12833048, -30772034, -15486313},
3450 {-18006477, 12709068, 3991746, -6479188, -21491523, -10550425,
3451 -31135347, -16049879, 10928917, 3011958},
3452 {-6957757, -15594337, 31696059, 334240, 29576716, 14796075,
3453 -30831056, -12805180, 18008031, 10258577},
3454 },
3455 {
3456 {-22448644, 15655569, 7018479, -4410003, -30314266, -1201591,
3457 -1853465, 1367120, 25127874, 6671743},
3458 {29701166, -14373934, -10878120, 9279288, -17568, 13127210,
3459 21382910, 11042292, 25838796, 4642684},
3460 {-20430234, 14955537, -24126347, 8124619, -5369288, -5990470,
3461 30468147, -13900640, 18423289, 4177476},
3462 },
3463 },
3464};
3465
3466static uint8_t negative(signed char b) {
3467 uint32_t x = b;
3468 x >>= 31; /* 1: yes; 0: no */
3469 return x;
3470}
3471
3472static void table_select(ge_precomp *t, int pos, signed char b) {
3473 ge_precomp minust;
3474 uint8_t bnegative = negative(b);
3475 uint8_t babs = b - ((uint8_t)((-bnegative) & b) << 1);
3476
3477 ge_precomp_0(t);
3478 cmov(t, &k25519Precomp[pos][0], equal(babs, 1));
3479 cmov(t, &k25519Precomp[pos][1], equal(babs, 2));
3480 cmov(t, &k25519Precomp[pos][2], equal(babs, 3));
3481 cmov(t, &k25519Precomp[pos][3], equal(babs, 4));
3482 cmov(t, &k25519Precomp[pos][4], equal(babs, 5));
3483 cmov(t, &k25519Precomp[pos][5], equal(babs, 6));
3484 cmov(t, &k25519Precomp[pos][6], equal(babs, 7));
3485 cmov(t, &k25519Precomp[pos][7], equal(babs, 8));
3486 fe_copy(minust.yplusx, t->yminusx);
3487 fe_copy(minust.yminusx, t->yplusx);
3488 fe_neg(minust.xy2d, t->xy2d);
3489 cmov(t, &minust, bnegative);
3490}
3491
3492/* h = a * B
3493 * where a = a[0]+256*a[1]+...+256^31 a[31]
3494 * B is the Ed25519 base point (x,4/5) with x positive.
3495 *
3496 * Preconditions:
3497 * a[31] <= 127 */
3498void x25519_ge_scalarmult_base(ge_p3 *h, const uint8_t a[32]) {
3499 signed char e[64];
3500 signed char carry;
3501 ge_p1p1 r;
3502 ge_p2 s;
3503 ge_precomp t;
3504 int i;
3505
3506 for (i = 0; i < 32; ++i) {
3507 e[2 * i + 0] = (a[i] >> 0) & 15;
3508 e[2 * i + 1] = (a[i] >> 4) & 15;
3509 }
3510 /* each e[i] is between 0 and 15 */
3511 /* e[63] is between 0 and 7 */
3512
3513 carry = 0;
3514 for (i = 0; i < 63; ++i) {
3515 e[i] += carry;
3516 carry = e[i] + 8;
3517 carry >>= 4;
3518 e[i] -= carry << 4;
3519 }
3520 e[63] += carry;
3521 /* each e[i] is between -8 and 8 */
3522
3523 ge_p3_0(h);
3524 for (i = 1; i < 64; i += 2) {
3525 table_select(&t, i / 2, e[i]);
3526 ge_madd(&r, h, &t);
3527 x25519_ge_p1p1_to_p3(h, &r);
3528 }
3529
3530 ge_p3_dbl(&r, h);
3531 x25519_ge_p1p1_to_p2(&s, &r);
3532 ge_p2_dbl(&r, &s);
3533 x25519_ge_p1p1_to_p2(&s, &r);
3534 ge_p2_dbl(&r, &s);
3535 x25519_ge_p1p1_to_p2(&s, &r);
3536 ge_p2_dbl(&r, &s);
3537 x25519_ge_p1p1_to_p3(h, &r);
3538
3539 for (i = 0; i < 64; i += 2) {
3540 table_select(&t, i / 2, e[i]);
3541 ge_madd(&r, h, &t);
3542 x25519_ge_p1p1_to_p3(h, &r);
3543 }
3544}
3545
3546#endif
3547
3548static void cmov_cached(ge_cached *t, ge_cached *u, uint8_t b) {
3549 fe_cmov(t->YplusX, u->YplusX, b);
3550 fe_cmov(t->YminusX, u->YminusX, b);
3551 fe_cmov(t->Z, u->Z, b);
3552 fe_cmov(t->T2d, u->T2d, b);
3553}
3554
3555/* r = scalar * A.
3556 * where a = a[0]+256*a[1]+...+256^31 a[31]. */
3557void x25519_ge_scalarmult(ge_p2 *r, const uint8_t *scalar, const ge_p3 *A) {
3558 ge_p2 Ai_p2[8];
3559 ge_cached Ai[16];
3560 ge_p1p1 t;
3561
3562 ge_cached_0(&Ai[0]);
3563 x25519_ge_p3_to_cached(&Ai[1], A);
3564 ge_p3_to_p2(&Ai_p2[1], A);
3565
3566 unsigned i;
3567 for (i = 2; i < 16; i += 2) {
3568 ge_p2_dbl(&t, &Ai_p2[i / 2]);
3569 ge_p1p1_to_cached(&Ai[i], &t);
3570 if (i < 8) {
3571 x25519_ge_p1p1_to_p2(&Ai_p2[i], &t);
3572 }
3573 x25519_ge_add(&t, A, &Ai[i]);
3574 ge_p1p1_to_cached(&Ai[i + 1], &t);
3575 if (i < 7) {
3576 x25519_ge_p1p1_to_p2(&Ai_p2[i + 1], &t);
3577 }
3578 }
3579
3580 ge_p2_0(r);
3581 ge_p3 u;
3582
3583 for (i = 0; i < 256; i += 4) {
3584 ge_p2_dbl(&t, r);
3585 x25519_ge_p1p1_to_p2(r, &t);
3586 ge_p2_dbl(&t, r);
3587 x25519_ge_p1p1_to_p2(r, &t);
3588 ge_p2_dbl(&t, r);
3589 x25519_ge_p1p1_to_p2(r, &t);
3590 ge_p2_dbl(&t, r);
3591 x25519_ge_p1p1_to_p3(&u, &t);
3592
3593 uint8_t index = scalar[31 - i/8];
3594 index >>= 4 - (i & 4);
3595 index &= 0xf;
3596
3597 unsigned j;
3598 ge_cached selected;
3599 ge_cached_0(&selected);
3600 for (j = 0; j < 16; j++) {
3601 cmov_cached(&selected, &Ai[j], equal(j, index));
3602 }
3603
3604 x25519_ge_add(&t, &u, &selected);
3605 x25519_ge_p1p1_to_p2(r, &t);
3606 }
3607}
3608
3609static void slide(signed char *r, const uint8_t *a) {
3610 int i;
3611 int b;
3612 int k;
3613
3614 for (i = 0; i < 256; ++i) {
3615 r[i] = 1 & (a[i >> 3] >> (i & 7));
3616 }
3617
3618 for (i = 0; i < 256; ++i) {
3619 if (r[i]) {
3620 for (b = 1; b <= 6 && i + b < 256; ++b) {
3621 if (r[i + b]) {
3622 if (r[i] + (r[i + b] << b) <= 15) {
3623 r[i] += r[i + b] << b;
3624 r[i + b] = 0;
3625 } else if (r[i] - (r[i + b] << b) >= -15) {
3626 r[i] -= r[i + b] << b;
3627 for (k = i + b; k < 256; ++k) {
3628 if (!r[k]) {
3629 r[k] = 1;
3630 break;
3631 }
3632 r[k] = 0;
3633 }
3634 } else {
3635 break;
3636 }
3637 }
3638 }
3639 }
3640 }
3641}
3642
3643static const ge_precomp Bi[8] = {
3644 {
3645 {25967493, -14356035, 29566456, 3660896, -12694345, 4014787, 27544626,
3646 -11754271, -6079156, 2047605},
3647 {-12545711, 934262, -2722910, 3049990, -727428, 9406986, 12720692,
3648 5043384, 19500929, -15469378},
3649 {-8738181, 4489570, 9688441, -14785194, 10184609, -12363380, 29287919,
3650 11864899, -24514362, -4438546},
3651 },
3652 {
3653 {15636291, -9688557, 24204773, -7912398, 616977, -16685262, 27787600,
3654 -14772189, 28944400, -1550024},
3655 {16568933, 4717097, -11556148, -1102322, 15682896, -11807043, 16354577,
3656 -11775962, 7689662, 11199574},
3657 {30464156, -5976125, -11779434, -15670865, 23220365, 15915852, 7512774,
3658 10017326, -17749093, -9920357},
3659 },
3660 {
3661 {10861363, 11473154, 27284546, 1981175, -30064349, 12577861, 32867885,
3662 14515107, -15438304, 10819380},
3663 {4708026, 6336745, 20377586, 9066809, -11272109, 6594696, -25653668,
3664 12483688, -12668491, 5581306},
3665 {19563160, 16186464, -29386857, 4097519, 10237984, -4348115, 28542350,
3666 13850243, -23678021, -15815942},
3667 },
3668 {
3669 {5153746, 9909285, 1723747, -2777874, 30523605, 5516873, 19480852,
3670 5230134, -23952439, -15175766},
3671 {-30269007, -3463509, 7665486, 10083793, 28475525, 1649722, 20654025,
3672 16520125, 30598449, 7715701},
3673 {28881845, 14381568, 9657904, 3680757, -20181635, 7843316, -31400660,
3674 1370708, 29794553, -1409300},
3675 },
3676 {
3677 {-22518993, -6692182, 14201702, -8745502, -23510406, 8844726, 18474211,
3678 -1361450, -13062696, 13821877},
3679 {-6455177, -7839871, 3374702, -4740862, -27098617, -10571707, 31655028,
3680 -7212327, 18853322, -14220951},
3681 {4566830, -12963868, -28974889, -12240689, -7602672, -2830569, -8514358,
3682 -10431137, 2207753, -3209784},
3683 },
3684 {
3685 {-25154831, -4185821, 29681144, 7868801, -6854661, -9423865, -12437364,
3686 -663000, -31111463, -16132436},
3687 {25576264, -2703214, 7349804, -11814844, 16472782, 9300885, 3844789,
3688 15725684, 171356, 6466918},
3689 {23103977, 13316479, 9739013, -16149481, 817875, -15038942, 8965339,
3690 -14088058, -30714912, 16193877},
3691 },
3692 {
3693 {-33521811, 3180713, -2394130, 14003687, -16903474, -16270840, 17238398,
3694 4729455, -18074513, 9256800},
3695 {-25182317, -4174131, 32336398, 5036987, -21236817, 11360617, 22616405,
3696 9761698, -19827198, 630305},
3697 {-13720693, 2639453, -24237460, -7406481, 9494427, -5774029, -6554551,
3698 -15960994, -2449256, -14291300},
3699 },
3700 {
3701 {-3151181, -5046075, 9282714, 6866145, -31907062, -863023, -18940575,
3702 15033784, 25105118, -7894876},
3703 {-24326370, 15950226, -31801215, -14592823, -11662737, -5090925,
3704 1573892, -2625887, 2198790, -15804619},
3705 {-3099351, 10324967, -2241613, 7453183, -5446979, -2735503, -13812022,
3706 -16236442, -32461234, -12290683},
3707 },
3708};
3709
3710/* r = a * A + b * B
3711 * where a = a[0]+256*a[1]+...+256^31 a[31].
3712 * and b = b[0]+256*b[1]+...+256^31 b[31].
3713 * B is the Ed25519 base point (x,4/5) with x positive. */
3714static void
3715ge_double_scalarmult_vartime(ge_p2 *r, const uint8_t *a,
3716 const ge_p3 *A, const uint8_t *b) {
3717 signed char aslide[256];
3718 signed char bslide[256];
3719 ge_cached Ai[8]; /* A,3A,5A,7A,9A,11A,13A,15A */
3720 ge_p1p1 t;
3721 ge_p3 u;
3722 ge_p3 A2;
3723 int i;
3724
3725 slide(aslide, a);
3726 slide(bslide, b);
3727
3728 x25519_ge_p3_to_cached(&Ai[0], A);
3729 ge_p3_dbl(&t, A);
3730 x25519_ge_p1p1_to_p3(&A2, &t);
3731 x25519_ge_add(&t, &A2, &Ai[0]);
3732 x25519_ge_p1p1_to_p3(&u, &t);
3733 x25519_ge_p3_to_cached(&Ai[1], &u);
3734 x25519_ge_add(&t, &A2, &Ai[1]);
3735 x25519_ge_p1p1_to_p3(&u, &t);
3736 x25519_ge_p3_to_cached(&Ai[2], &u);
3737 x25519_ge_add(&t, &A2, &Ai[2]);
3738 x25519_ge_p1p1_to_p3(&u, &t);
3739 x25519_ge_p3_to_cached(&Ai[3], &u);
3740 x25519_ge_add(&t, &A2, &Ai[3]);
3741 x25519_ge_p1p1_to_p3(&u, &t);
3742 x25519_ge_p3_to_cached(&Ai[4], &u);
3743 x25519_ge_add(&t, &A2, &Ai[4]);
3744 x25519_ge_p1p1_to_p3(&u, &t);
3745 x25519_ge_p3_to_cached(&Ai[5], &u);
3746 x25519_ge_add(&t, &A2, &Ai[5]);
3747 x25519_ge_p1p1_to_p3(&u, &t);
3748 x25519_ge_p3_to_cached(&Ai[6], &u);
3749 x25519_ge_add(&t, &A2, &Ai[6]);
3750 x25519_ge_p1p1_to_p3(&u, &t);
3751 x25519_ge_p3_to_cached(&Ai[7], &u);
3752
3753 ge_p2_0(r);
3754
3755 for (i = 255; i >= 0; --i) {
3756 if (aslide[i] || bslide[i]) {
3757 break;
3758 }
3759 }
3760
3761 for (; i >= 0; --i) {
3762 ge_p2_dbl(&t, r);
3763
3764 if (aslide[i] > 0) {
3765 x25519_ge_p1p1_to_p3(&u, &t);
3766 x25519_ge_add(&t, &u, &Ai[aslide[i] / 2]);
3767 } else if (aslide[i] < 0) {
3768 x25519_ge_p1p1_to_p3(&u, &t);
3769 x25519_ge_sub(&t, &u, &Ai[(-aslide[i]) / 2]);
3770 }
3771
3772 if (bslide[i] > 0) {
3773 x25519_ge_p1p1_to_p3(&u, &t);
3774 ge_madd(&t, &u, &Bi[bslide[i] / 2]);
3775 } else if (bslide[i] < 0) {
3776 x25519_ge_p1p1_to_p3(&u, &t);
3777 ge_msub(&t, &u, &Bi[(-bslide[i]) / 2]);
3778 }
3779
3780 x25519_ge_p1p1_to_p2(r, &t);
3781 }
3782}
3783
3784/* The set of scalars is \Z/l
3785 * where l = 2^252 + 27742317777372353535851937790883648493. */
3786
3787/* Input:
3788 * s[0]+256*s[1]+...+256^63*s[63] = s
3789 *
3790 * Output:
3791 * s[0]+256*s[1]+...+256^31*s[31] = s mod l
3792 * where l = 2^252 + 27742317777372353535851937790883648493.
3793 * Overwrites s in place. */
3794void
3795x25519_sc_reduce(uint8_t *s) {
3796 int64_t s0 = 2097151 & load_3(s);
3797 int64_t s1 = 2097151 & (load_4(s + 2) >> 5);
3798 int64_t s2 = 2097151 & (load_3(s + 5) >> 2);
3799 int64_t s3 = 2097151 & (load_4(s + 7) >> 7);
3800 int64_t s4 = 2097151 & (load_4(s + 10) >> 4);
3801 int64_t s5 = 2097151 & (load_3(s + 13) >> 1);
3802 int64_t s6 = 2097151 & (load_4(s + 15) >> 6);
3803 int64_t s7 = 2097151 & (load_3(s + 18) >> 3);
3804 int64_t s8 = 2097151 & load_3(s + 21);
3805 int64_t s9 = 2097151 & (load_4(s + 23) >> 5);
3806 int64_t s10 = 2097151 & (load_3(s + 26) >> 2);
3807 int64_t s11 = 2097151 & (load_4(s + 28) >> 7);
3808 int64_t s12 = 2097151 & (load_4(s + 31) >> 4);
3809 int64_t s13 = 2097151 & (load_3(s + 34) >> 1);
3810 int64_t s14 = 2097151 & (load_4(s + 36) >> 6);
3811 int64_t s15 = 2097151 & (load_3(s + 39) >> 3);
3812 int64_t s16 = 2097151 & load_3(s + 42);
3813 int64_t s17 = 2097151 & (load_4(s + 44) >> 5);
3814 int64_t s18 = 2097151 & (load_3(s + 47) >> 2);
3815 int64_t s19 = 2097151 & (load_4(s + 49) >> 7);
3816 int64_t s20 = 2097151 & (load_4(s + 52) >> 4);
3817 int64_t s21 = 2097151 & (load_3(s + 55) >> 1);
3818 int64_t s22 = 2097151 & (load_4(s + 57) >> 6);
3819 int64_t s23 = (load_4(s + 60) >> 3);
3820 int64_t carry0;
3821 int64_t carry1;
3822 int64_t carry2;
3823 int64_t carry3;
3824 int64_t carry4;
3825 int64_t carry5;
3826 int64_t carry6;
3827 int64_t carry7;
3828 int64_t carry8;
3829 int64_t carry9;
3830 int64_t carry10;
3831 int64_t carry11;
3832 int64_t carry12;
3833 int64_t carry13;
3834 int64_t carry14;
3835 int64_t carry15;
3836 int64_t carry16;
3837
3838 s11 += s23 * 666643;
3839 s12 += s23 * 470296;
3840 s13 += s23 * 654183;
3841 s14 -= s23 * 997805;
3842 s15 += s23 * 136657;
3843 s16 -= s23 * 683901;
3844 s23 = 0;
3845
3846 s10 += s22 * 666643;
3847 s11 += s22 * 470296;
3848 s12 += s22 * 654183;
3849 s13 -= s22 * 997805;
3850 s14 += s22 * 136657;
3851 s15 -= s22 * 683901;
3852 s22 = 0;
3853
3854 s9 += s21 * 666643;
3855 s10 += s21 * 470296;
3856 s11 += s21 * 654183;
3857 s12 -= s21 * 997805;
3858 s13 += s21 * 136657;
3859 s14 -= s21 * 683901;
3860 s21 = 0;
3861
3862 s8 += s20 * 666643;
3863 s9 += s20 * 470296;
3864 s10 += s20 * 654183;
3865 s11 -= s20 * 997805;
3866 s12 += s20 * 136657;
3867 s13 -= s20 * 683901;
3868 s20 = 0;
3869
3870 s7 += s19 * 666643;
3871 s8 += s19 * 470296;
3872 s9 += s19 * 654183;
3873 s10 -= s19 * 997805;
3874 s11 += s19 * 136657;
3875 s12 -= s19 * 683901;
3876 s19 = 0;
3877
3878 s6 += s18 * 666643;
3879 s7 += s18 * 470296;
3880 s8 += s18 * 654183;
3881 s9 -= s18 * 997805;
3882 s10 += s18 * 136657;
3883 s11 -= s18 * 683901;
3884 s18 = 0;
Value stored to 's18' is never read
3885
3886 carry6 = (s6 + (1 << 20)) >> 21;
3887 s7 += carry6;
3888 s6 -= carry6 << 21;
3889 carry8 = (s8 + (1 << 20)) >> 21;
3890 s9 += carry8;
3891 s8 -= carry8 << 21;
3892 carry10 = (s10 + (1 << 20)) >> 21;
3893 s11 += carry10;
3894 s10 -= carry10 << 21;
3895 carry12 = (s12 + (1 << 20)) >> 21;
3896 s13 += carry12;
3897 s12 -= carry12 << 21;
3898 carry14 = (s14 + (1 << 20)) >> 21;
3899 s15 += carry14;
3900 s14 -= carry14 << 21;
3901 carry16 = (s16 + (1 << 20)) >> 21;
3902 s17 += carry16;
3903 s16 -= carry16 << 21;
3904
3905 carry7 = (s7 + (1 << 20)) >> 21;
3906 s8 += carry7;
3907 s7 -= carry7 << 21;
3908 carry9 = (s9 + (1 << 20)) >> 21;
3909 s10 += carry9;
3910 s9 -= carry9 << 21;
3911 carry11 = (s11 + (1 << 20)) >> 21;
3912 s12 += carry11;
3913 s11 -= carry11 << 21;
3914 carry13 = (s13 + (1 << 20)) >> 21;
3915 s14 += carry13;
3916 s13 -= carry13 << 21;
3917 carry15 = (s15 + (1 << 20)) >> 21;
3918 s16 += carry15;
3919 s15 -= carry15 << 21;
3920
3921 s5 += s17 * 666643;
3922 s6 += s17 * 470296;
3923 s7 += s17 * 654183;
3924 s8 -= s17 * 997805;
3925 s9 += s17 * 136657;
3926 s10 -= s17 * 683901;
3927 s17 = 0;
3928
3929 s4 += s16 * 666643;
3930 s5 += s16 * 470296;
3931 s6 += s16 * 654183;
3932 s7 -= s16 * 997805;
3933 s8 += s16 * 136657;
3934 s9 -= s16 * 683901;
3935 s16 = 0;
3936
3937 s3 += s15 * 666643;
3938 s4 += s15 * 470296;
3939 s5 += s15 * 654183;
3940 s6 -= s15 * 997805;
3941 s7 += s15 * 136657;
3942 s8 -= s15 * 683901;
3943 s15 = 0;
3944
3945 s2 += s14 * 666643;
3946 s3 += s14 * 470296;
3947 s4 += s14 * 654183;
3948 s5 -= s14 * 997805;
3949 s6 += s14 * 136657;
3950 s7 -= s14 * 683901;
3951 s14 = 0;
3952
3953 s1 += s13 * 666643;
3954 s2 += s13 * 470296;
3955 s3 += s13 * 654183;
3956 s4 -= s13 * 997805;
3957 s5 += s13 * 136657;
3958 s6 -= s13 * 683901;
3959 s13 = 0;
3960
3961 s0 += s12 * 666643;
3962 s1 += s12 * 470296;
3963 s2 += s12 * 654183;
3964 s3 -= s12 * 997805;
3965 s4 += s12 * 136657;
3966 s5 -= s12 * 683901;
3967 s12 = 0;
3968
3969 carry0 = (s0 + (1 << 20)) >> 21;
3970 s1 += carry0;
3971 s0 -= carry0 << 21;
3972 carry2 = (s2 + (1 << 20)) >> 21;
3973 s3 += carry2;
3974 s2 -= carry2 << 21;
3975 carry4 = (s4 + (1 << 20)) >> 21;
3976 s5 += carry4;
3977 s4 -= carry4 << 21;
3978 carry6 = (s6 + (1 << 20)) >> 21;
3979 s7 += carry6;
3980 s6 -= carry6 << 21;
3981 carry8 = (s8 + (1 << 20)) >> 21;
3982 s9 += carry8;
3983 s8 -= carry8 << 21;
3984 carry10 = (s10 + (1 << 20)) >> 21;
3985 s11 += carry10;
3986 s10 -= carry10 << 21;
3987
3988 carry1 = (s1 + (1 << 20)) >> 21;
3989 s2 += carry1;
3990 s1 -= carry1 << 21;
3991 carry3 = (s3 + (1 << 20)) >> 21;
3992 s4 += carry3;
3993 s3 -= carry3 << 21;
3994 carry5 = (s5 + (1 << 20)) >> 21;
3995 s6 += carry5;
3996 s5 -= carry5 << 21;
3997 carry7 = (s7 + (1 << 20)) >> 21;
3998 s8 += carry7;
3999 s7 -= carry7 << 21;
4000 carry9 = (s9 + (1 << 20)) >> 21;
4001 s10 += carry9;
4002 s9 -= carry9 << 21;
4003 carry11 = (s11 + (1 << 20)) >> 21;
4004 s12 += carry11;
4005 s11 -= carry11 << 21;
4006
4007 s0 += s12 * 666643;
4008 s1 += s12 * 470296;
4009 s2 += s12 * 654183;
4010 s3 -= s12 * 997805;
4011 s4 += s12 * 136657;
4012 s5 -= s12 * 683901;
4013 s12 = 0;
4014
4015 carry0 = s0 >> 21;
4016 s1 += carry0;
4017 s0 -= carry0 << 21;
4018 carry1 = s1 >> 21;
4019 s2 += carry1;
4020 s1 -= carry1 << 21;
4021 carry2 = s2 >> 21;
4022 s3 += carry2;
4023 s2 -= carry2 << 21;
4024 carry3 = s3 >> 21;
4025 s4 += carry3;
4026 s3 -= carry3 << 21;
4027 carry4 = s4 >> 21;
4028 s5 += carry4;
4029 s4 -= carry4 << 21;
4030 carry5 = s5 >> 21;
4031 s6 += carry5;
4032 s5 -= carry5 << 21;
4033 carry6 = s6 >> 21;
4034 s7 += carry6;
4035 s6 -= carry6 << 21;
4036 carry7 = s7 >> 21;
4037 s8 += carry7;
4038 s7 -= carry7 << 21;
4039 carry8 = s8 >> 21;
4040 s9 += carry8;
4041 s8 -= carry8 << 21;
4042 carry9 = s9 >> 21;
4043 s10 += carry9;
4044 s9 -= carry9 << 21;
4045 carry10 = s10 >> 21;
4046 s11 += carry10;
4047 s10 -= carry10 << 21;
4048 carry11 = s11 >> 21;
4049 s12 += carry11;
4050 s11 -= carry11 << 21;
4051
4052 s0 += s12 * 666643;
4053 s1 += s12 * 470296;
4054 s2 += s12 * 654183;
4055 s3 -= s12 * 997805;
4056 s4 += s12 * 136657;
4057 s5 -= s12 * 683901;
4058 s12 = 0;
4059
4060 carry0 = s0 >> 21;
4061 s1 += carry0;
4062 s0 -= carry0 << 21;
4063 carry1 = s1 >> 21;
4064 s2 += carry1;
4065 s1 -= carry1 << 21;
4066 carry2 = s2 >> 21;
4067 s3 += carry2;
4068 s2 -= carry2 << 21;
4069 carry3 = s3 >> 21;
4070 s4 += carry3;
4071 s3 -= carry3 << 21;
4072 carry4 = s4 >> 21;
4073 s5 += carry4;
4074 s4 -= carry4 << 21;
4075 carry5 = s5 >> 21;
4076 s6 += carry5;
4077 s5 -= carry5 << 21;
4078 carry6 = s6 >> 21;
4079 s7 += carry6;
4080 s6 -= carry6 << 21;
4081 carry7 = s7 >> 21;
4082 s8 += carry7;
4083 s7 -= carry7 << 21;
4084 carry8 = s8 >> 21;
4085 s9 += carry8;
4086 s8 -= carry8 << 21;
4087 carry9 = s9 >> 21;
4088 s10 += carry9;
4089 s9 -= carry9 << 21;
4090 carry10 = s10 >> 21;
4091 s11 += carry10;
4092 s10 -= carry10 << 21;
4093
4094 s[0] = s0 >> 0;
4095 s[1] = s0 >> 8;
4096 s[2] = (s0 >> 16) | (s1 << 5);
4097 s[3] = s1 >> 3;
4098 s[4] = s1 >> 11;
4099 s[5] = (s1 >> 19) | (s2 << 2);
4100 s[6] = s2 >> 6;
4101 s[7] = (s2 >> 14) | (s3 << 7);
4102 s[8] = s3 >> 1;
4103 s[9] = s3 >> 9;
4104 s[10] = (s3 >> 17) | (s4 << 4);
4105 s[11] = s4 >> 4;
4106 s[12] = s4 >> 12;
4107 s[13] = (s4 >> 20) | (s5 << 1);
4108 s[14] = s5 >> 7;
4109 s[15] = (s5 >> 15) | (s6 << 6);
4110 s[16] = s6 >> 2;
4111 s[17] = s6 >> 10;
4112 s[18] = (s6 >> 18) | (s7 << 3);
4113 s[19] = s7 >> 5;
4114 s[20] = s7 >> 13;
4115 s[21] = s8 >> 0;
4116 s[22] = s8 >> 8;
4117 s[23] = (s8 >> 16) | (s9 << 5);
4118 s[24] = s9 >> 3;
4119 s[25] = s9 >> 11;
4120 s[26] = (s9 >> 19) | (s10 << 2);
4121 s[27] = s10 >> 6;
4122 s[28] = (s10 >> 14) | (s11 << 7);
4123 s[29] = s11 >> 1;
4124 s[30] = s11 >> 9;
4125 s[31] = s11 >> 17;
4126}
4127
4128/* Input:
4129 * a[0]+256*a[1]+...+256^31*a[31] = a
4130 * b[0]+256*b[1]+...+256^31*b[31] = b
4131 * c[0]+256*c[1]+...+256^31*c[31] = c
4132 *
4133 * Output:
4134 * s[0]+256*s[1]+...+256^31*s[31] = (ab+c) mod l
4135 * where l = 2^252 + 27742317777372353535851937790883648493. */
4136static void
4137sc_muladd(uint8_t *s, const uint8_t *a, const uint8_t *b,
4138 const uint8_t *c)
4139{
4140 int64_t a0 = 2097151 & load_3(a);
4141 int64_t a1 = 2097151 & (load_4(a + 2) >> 5);
4142 int64_t a2 = 2097151 & (load_3(a + 5) >> 2);
4143 int64_t a3 = 2097151 & (load_4(a + 7) >> 7);
4144 int64_t a4 = 2097151 & (load_4(a + 10) >> 4);
4145 int64_t a5 = 2097151 & (load_3(a + 13) >> 1);
4146 int64_t a6 = 2097151 & (load_4(a + 15) >> 6);
4147 int64_t a7 = 2097151 & (load_3(a + 18) >> 3);
4148 int64_t a8 = 2097151 & load_3(a + 21);
4149 int64_t a9 = 2097151 & (load_4(a + 23) >> 5);
4150 int64_t a10 = 2097151 & (load_3(a + 26) >> 2);
4151 int64_t a11 = (load_4(a + 28) >> 7);
4152 int64_t b0 = 2097151 & load_3(b);
4153 int64_t b1 = 2097151 & (load_4(b + 2) >> 5);
4154 int64_t b2 = 2097151 & (load_3(b + 5) >> 2);
4155 int64_t b3 = 2097151 & (load_4(b + 7) >> 7);
4156 int64_t b4 = 2097151 & (load_4(b + 10) >> 4);
4157 int64_t b5 = 2097151 & (load_3(b + 13) >> 1);
4158 int64_t b6 = 2097151 & (load_4(b + 15) >> 6);
4159 int64_t b7 = 2097151 & (load_3(b + 18) >> 3);
4160 int64_t b8 = 2097151 & load_3(b + 21);
4161 int64_t b9 = 2097151 & (load_4(b + 23) >> 5);
4162 int64_t b10 = 2097151 & (load_3(b + 26) >> 2);
4163 int64_t b11 = (load_4(b + 28) >> 7);
4164 int64_t c0 = 2097151 & load_3(c);
4165 int64_t c1 = 2097151 & (load_4(c + 2) >> 5);
4166 int64_t c2 = 2097151 & (load_3(c + 5) >> 2);
4167 int64_t c3 = 2097151 & (load_4(c + 7) >> 7);
4168 int64_t c4 = 2097151 & (load_4(c + 10) >> 4);
4169 int64_t c5 = 2097151 & (load_3(c + 13) >> 1);
4170 int64_t c6 = 2097151 & (load_4(c + 15) >> 6);
4171 int64_t c7 = 2097151 & (load_3(c + 18) >> 3);
4172 int64_t c8 = 2097151 & load_3(c + 21);
4173 int64_t c9 = 2097151 & (load_4(c + 23) >> 5);
4174 int64_t c10 = 2097151 & (load_3(c + 26) >> 2);
4175 int64_t c11 = (load_4(c + 28) >> 7);
4176 int64_t s0;
4177 int64_t s1;
4178 int64_t s2;
4179 int64_t s3;
4180 int64_t s4;
4181 int64_t s5;
4182 int64_t s6;
4183 int64_t s7;
4184 int64_t s8;
4185 int64_t s9;
4186 int64_t s10;
4187 int64_t s11;
4188 int64_t s12;
4189 int64_t s13;
4190 int64_t s14;
4191 int64_t s15;
4192 int64_t s16;
4193 int64_t s17;
4194 int64_t s18;
4195 int64_t s19;
4196 int64_t s20;
4197 int64_t s21;
4198 int64_t s22;
4199 int64_t s23;
4200 int64_t carry0;
4201 int64_t carry1;
4202 int64_t carry2;
4203 int64_t carry3;
4204 int64_t carry4;
4205 int64_t carry5;
4206 int64_t carry6;
4207 int64_t carry7;
4208 int64_t carry8;
4209 int64_t carry9;
4210 int64_t carry10;
4211 int64_t carry11;
4212 int64_t carry12;
4213 int64_t carry13;
4214 int64_t carry14;
4215 int64_t carry15;
4216 int64_t carry16;
4217 int64_t carry17;
4218 int64_t carry18;
4219 int64_t carry19;
4220 int64_t carry20;
4221 int64_t carry21;
4222 int64_t carry22;
4223
4224 s0 = c0 + a0 * b0;
4225 s1 = c1 + a0 * b1 + a1 * b0;
4226 s2 = c2 + a0 * b2 + a1 * b1 + a2 * b0;
4227 s3 = c3 + a0 * b3 + a1 * b2 + a2 * b1 + a3 * b0;
4228 s4 = c4 + a0 * b4 + a1 * b3 + a2 * b2 + a3 * b1 + a4 * b0;
4229 s5 = c5 + a0 * b5 + a1 * b4 + a2 * b3 + a3 * b2 + a4 * b1 + a5 * b0;
4230 s6 = c6 + a0 * b6 + a1 * b5 + a2 * b4 + a3 * b3 + a4 * b2 + a5 * b1 + a6 * b0;
4231 s7 = c7 + a0 * b7 + a1 * b6 + a2 * b5 + a3 * b4 + a4 * b3 + a5 * b2 +
4232 a6 * b1 + a7 * b0;
4233 s8 = c8 + a0 * b8 + a1 * b7 + a2 * b6 + a3 * b5 + a4 * b4 + a5 * b3 +
4234 a6 * b2 + a7 * b1 + a8 * b0;
4235 s9 = c9 + a0 * b9 + a1 * b8 + a2 * b7 + a3 * b6 + a4 * b5 + a5 * b4 +
4236 a6 * b3 + a7 * b2 + a8 * b1 + a9 * b0;
4237 s10 = c10 + a0 * b10 + a1 * b9 + a2 * b8 + a3 * b7 + a4 * b6 + a5 * b5 +
4238 a6 * b4 + a7 * b3 + a8 * b2 + a9 * b1 + a10 * b0;
4239 s11 = c11 + a0 * b11 + a1 * b10 + a2 * b9 + a3 * b8 + a4 * b7 + a5 * b6 +
4240 a6 * b5 + a7 * b4 + a8 * b3 + a9 * b2 + a10 * b1 + a11 * b0;
4241 s12 = a1 * b11 + a2 * b10 + a3 * b9 + a4 * b8 + a5 * b7 + a6 * b6 + a7 * b5 +
4242 a8 * b4 + a9 * b3 + a10 * b2 + a11 * b1;
4243 s13 = a2 * b11 + a3 * b10 + a4 * b9 + a5 * b8 + a6 * b7 + a7 * b6 + a8 * b5 +
4244 a9 * b4 + a10 * b3 + a11 * b2;
4245 s14 = a3 * b11 + a4 * b10 + a5 * b9 + a6 * b8 + a7 * b7 + a8 * b6 + a9 * b5 +
4246 a10 * b4 + a11 * b3;
4247 s15 = a4 * b11 + a5 * b10 + a6 * b9 + a7 * b8 + a8 * b7 + a9 * b6 + a10 * b5 +
4248 a11 * b4;
4249 s16 = a5 * b11 + a6 * b10 + a7 * b9 + a8 * b8 + a9 * b7 + a10 * b6 + a11 * b5;
4250 s17 = a6 * b11 + a7 * b10 + a8 * b9 + a9 * b8 + a10 * b7 + a11 * b6;
4251 s18 = a7 * b11 + a8 * b10 + a9 * b9 + a10 * b8 + a11 * b7;
4252 s19 = a8 * b11 + a9 * b10 + a10 * b9 + a11 * b8;
4253 s20 = a9 * b11 + a10 * b10 + a11 * b9;
4254 s21 = a10 * b11 + a11 * b10;
4255 s22 = a11 * b11;
4256 s23 = 0;
4257
4258 carry0 = (s0 + (1 << 20)) >> 21;
4259 s1 += carry0;
4260 s0 -= carry0 << 21;
4261 carry2 = (s2 + (1 << 20)) >> 21;
4262 s3 += carry2;
4263 s2 -= carry2 << 21;
4264 carry4 = (s4 + (1 << 20)) >> 21;
4265 s5 += carry4;
4266 s4 -= carry4 << 21;
4267 carry6 = (s6 + (1 << 20)) >> 21;
4268 s7 += carry6;
4269 s6 -= carry6 << 21;
4270 carry8 = (s8 + (1 << 20)) >> 21;
4271 s9 += carry8;
4272 s8 -= carry8 << 21;
4273 carry10 = (s10 + (1 << 20)) >> 21;
4274 s11 += carry10;
4275 s10 -= carry10 << 21;
4276 carry12 = (s12 + (1 << 20)) >> 21;
4277 s13 += carry12;
4278 s12 -= carry12 << 21;
4279 carry14 = (s14 + (1 << 20)) >> 21;
4280 s15 += carry14;
4281 s14 -= carry14 << 21;
4282 carry16 = (s16 + (1 << 20)) >> 21;
4283 s17 += carry16;
4284 s16 -= carry16 << 21;
4285 carry18 = (s18 + (1 << 20)) >> 21;
4286 s19 += carry18;
4287 s18 -= carry18 << 21;
4288 carry20 = (s20 + (1 << 20)) >> 21;
4289 s21 += carry20;
4290 s20 -= carry20 << 21;
4291 carry22 = (s22 + (1 << 20)) >> 21;
4292 s23 += carry22;
4293 s22 -= carry22 << 21;
4294
4295 carry1 = (s1 + (1 << 20)) >> 21;
4296 s2 += carry1;
4297 s1 -= carry1 << 21;
4298 carry3 = (s3 + (1 << 20)) >> 21;
4299 s4 += carry3;
4300 s3 -= carry3 << 21;
4301 carry5 = (s5 + (1 << 20)) >> 21;
4302 s6 += carry5;
4303 s5 -= carry5 << 21;
4304 carry7 = (s7 + (1 << 20)) >> 21;
4305 s8 += carry7;
4306 s7 -= carry7 << 21;
4307 carry9 = (s9 + (1 << 20)) >> 21;
4308 s10 += carry9;
4309 s9 -= carry9 << 21;
4310 carry11 = (s11 + (1 << 20)) >> 21;
4311 s12 += carry11;
4312 s11 -= carry11 << 21;
4313 carry13 = (s13 + (1 << 20)) >> 21;
4314 s14 += carry13;
4315 s13 -= carry13 << 21;
4316 carry15 = (s15 + (1 << 20)) >> 21;
4317 s16 += carry15;
4318 s15 -= carry15 << 21;
4319 carry17 = (s17 + (1 << 20)) >> 21;
4320 s18 += carry17;
4321 s17 -= carry17 << 21;
4322 carry19 = (s19 + (1 << 20)) >> 21;
4323 s20 += carry19;
4324 s19 -= carry19 << 21;
4325 carry21 = (s21 + (1 << 20)) >> 21;
4326 s22 += carry21;
4327 s21 -= carry21 << 21;
4328
4329 s11 += s23 * 666643;
4330 s12 += s23 * 470296;
4331 s13 += s23 * 654183;
4332 s14 -= s23 * 997805;
4333 s15 += s23 * 136657;
4334 s16 -= s23 * 683901;
4335 s23 = 0;
4336
4337 s10 += s22 * 666643;
4338 s11 += s22 * 470296;
4339 s12 += s22 * 654183;
4340 s13 -= s22 * 997805;
4341 s14 += s22 * 136657;
4342 s15 -= s22 * 683901;
4343 s22 = 0;
4344
4345 s9 += s21 * 666643;
4346 s10 += s21 * 470296;
4347 s11 += s21 * 654183;
4348 s12 -= s21 * 997805;
4349 s13 += s21 * 136657;
4350 s14 -= s21 * 683901;
4351 s21 = 0;
4352
4353 s8 += s20 * 666643;
4354 s9 += s20 * 470296;
4355 s10 += s20 * 654183;
4356 s11 -= s20 * 997805;
4357 s12 += s20 * 136657;
4358 s13 -= s20 * 683901;
4359 s20 = 0;
4360
4361 s7 += s19 * 666643;
4362 s8 += s19 * 470296;
4363 s9 += s19 * 654183;
4364 s10 -= s19 * 997805;
4365 s11 += s19 * 136657;
4366 s12 -= s19 * 683901;
4367 s19 = 0;
4368
4369 s6 += s18 * 666643;
4370 s7 += s18 * 470296;
4371 s8 += s18 * 654183;
4372 s9 -= s18 * 997805;
4373 s10 += s18 * 136657;
4374 s11 -= s18 * 683901;
4375 s18 = 0;
4376
4377 carry6 = (s6 + (1 << 20)) >> 21;
4378 s7 += carry6;
4379 s6 -= carry6 << 21;
4380 carry8 = (s8 + (1 << 20)) >> 21;
4381 s9 += carry8;
4382 s8 -= carry8 << 21;
4383 carry10 = (s10 + (1 << 20)) >> 21;
4384 s11 += carry10;
4385 s10 -= carry10 << 21;
4386 carry12 = (s12 + (1 << 20)) >> 21;
4387 s13 += carry12;
4388 s12 -= carry12 << 21;
4389 carry14 = (s14 + (1 << 20)) >> 21;
4390 s15 += carry14;
4391 s14 -= carry14 << 21;
4392 carry16 = (s16 + (1 << 20)) >> 21;
4393 s17 += carry16;
4394 s16 -= carry16 << 21;
4395
4396 carry7 = (s7 + (1 << 20)) >> 21;
4397 s8 += carry7;
4398 s7 -= carry7 << 21;
4399 carry9 = (s9 + (1 << 20)) >> 21;
4400 s10 += carry9;
4401 s9 -= carry9 << 21;
4402 carry11 = (s11 + (1 << 20)) >> 21;
4403 s12 += carry11;
4404 s11 -= carry11 << 21;
4405 carry13 = (s13 + (1 << 20)) >> 21;
4406 s14 += carry13;
4407 s13 -= carry13 << 21;
4408 carry15 = (s15 + (1 << 20)) >> 21;
4409 s16 += carry15;
4410 s15 -= carry15 << 21;
4411
4412 s5 += s17 * 666643;
4413 s6 += s17 * 470296;
4414 s7 += s17 * 654183;
4415 s8 -= s17 * 997805;
4416 s9 += s17 * 136657;
4417 s10 -= s17 * 683901;
4418 s17 = 0;
4419
4420 s4 += s16 * 666643;
4421 s5 += s16 * 470296;
4422 s6 += s16 * 654183;
4423 s7 -= s16 * 997805;
4424 s8 += s16 * 136657;
4425 s9 -= s16 * 683901;
4426 s16 = 0;
4427
4428 s3 += s15 * 666643;
4429 s4 += s15 * 470296;
4430 s5 += s15 * 654183;
4431 s6 -= s15 * 997805;
4432 s7 += s15 * 136657;
4433 s8 -= s15 * 683901;
4434 s15 = 0;
4435
4436 s2 += s14 * 666643;
4437 s3 += s14 * 470296;
4438 s4 += s14 * 654183;
4439 s5 -= s14 * 997805;
4440 s6 += s14 * 136657;
4441 s7 -= s14 * 683901;
4442 s14 = 0;
4443
4444 s1 += s13 * 666643;
4445 s2 += s13 * 470296;
4446 s3 += s13 * 654183;
4447 s4 -= s13 * 997805;
4448 s5 += s13 * 136657;
4449 s6 -= s13 * 683901;
4450 s13 = 0;
4451
4452 s0 += s12 * 666643;
4453 s1 += s12 * 470296;
4454 s2 += s12 * 654183;
4455 s3 -= s12 * 997805;
4456 s4 += s12 * 136657;
4457 s5 -= s12 * 683901;
4458 s12 = 0;
4459
4460 carry0 = (s0 + (1 << 20)) >> 21;
4461 s1 += carry0;
4462 s0 -= carry0 << 21;
4463 carry2 = (s2 + (1 << 20)) >> 21;
4464 s3 += carry2;
4465 s2 -= carry2 << 21;
4466 carry4 = (s4 + (1 << 20)) >> 21;
4467 s5 += carry4;
4468 s4 -= carry4 << 21;
4469 carry6 = (s6 + (1 << 20)) >> 21;
4470 s7 += carry6;
4471 s6 -= carry6 << 21;
4472 carry8 = (s8 + (1 << 20)) >> 21;
4473 s9 += carry8;
4474 s8 -= carry8 << 21;
4475 carry10 = (s10 + (1 << 20)) >> 21;
4476 s11 += carry10;
4477 s10 -= carry10 << 21;
4478
4479 carry1 = (s1 + (1 << 20)) >> 21;
4480 s2 += carry1;
4481 s1 -= carry1 << 21;
4482 carry3 = (s3 + (1 << 20)) >> 21;
4483 s4 += carry3;
4484 s3 -= carry3 << 21;
4485 carry5 = (s5 + (1 << 20)) >> 21;
4486 s6 += carry5;
4487 s5 -= carry5 << 21;
4488 carry7 = (s7 + (1 << 20)) >> 21;
4489 s8 += carry7;
4490 s7 -= carry7 << 21;
4491 carry9 = (s9 + (1 << 20)) >> 21;
4492 s10 += carry9;
4493 s9 -= carry9 << 21;
4494 carry11 = (s11 + (1 << 20)) >> 21;
4495 s12 += carry11;
4496 s11 -= carry11 << 21;
4497
4498 s0 += s12 * 666643;
4499 s1 += s12 * 470296;
4500 s2 += s12 * 654183;
4501 s3 -= s12 * 997805;
4502 s4 += s12 * 136657;
4503 s5 -= s12 * 683901;
4504 s12 = 0;
4505
4506 carry0 = s0 >> 21;
4507 s1 += carry0;
4508 s0 -= carry0 << 21;
4509 carry1 = s1 >> 21;
4510 s2 += carry1;
4511 s1 -= carry1 << 21;
4512 carry2 = s2 >> 21;
4513 s3 += carry2;
4514 s2 -= carry2 << 21;
4515 carry3 = s3 >> 21;
4516 s4 += carry3;
4517 s3 -= carry3 << 21;
4518 carry4 = s4 >> 21;
4519 s5 += carry4;
4520 s4 -= carry4 << 21;
4521 carry5 = s5 >> 21;
4522 s6 += carry5;
4523 s5 -= carry5 << 21;
4524 carry6 = s6 >> 21;
4525 s7 += carry6;
4526 s6 -= carry6 << 21;
4527 carry7 = s7 >> 21;
4528 s8 += carry7;
4529 s7 -= carry7 << 21;
4530 carry8 = s8 >> 21;
4531 s9 += carry8;
4532 s8 -= carry8 << 21;
4533 carry9 = s9 >> 21;
4534 s10 += carry9;
4535 s9 -= carry9 << 21;
4536 carry10 = s10 >> 21;
4537 s11 += carry10;
4538 s10 -= carry10 << 21;
4539 carry11 = s11 >> 21;
4540 s12 += carry11;
4541 s11 -= carry11 << 21;
4542
4543 s0 += s12 * 666643;
4544 s1 += s12 * 470296;
4545 s2 += s12 * 654183;
4546 s3 -= s12 * 997805;
4547 s4 += s12 * 136657;
4548 s5 -= s12 * 683901;
4549 s12 = 0;
4550
4551 carry0 = s0 >> 21;
4552 s1 += carry0;
4553 s0 -= carry0 << 21;
4554 carry1 = s1 >> 21;
4555 s2 += carry1;
4556 s1 -= carry1 << 21;
4557 carry2 = s2 >> 21;
4558 s3 += carry2;
4559 s2 -= carry2 << 21;
4560 carry3 = s3 >> 21;
4561 s4 += carry3;
4562 s3 -= carry3 << 21;
4563 carry4 = s4 >> 21;
4564 s5 += carry4;
4565 s4 -= carry4 << 21;
4566 carry5 = s5 >> 21;
4567 s6 += carry5;
4568 s5 -= carry5 << 21;
4569 carry6 = s6 >> 21;
4570 s7 += carry6;
4571 s6 -= carry6 << 21;
4572 carry7 = s7 >> 21;
4573 s8 += carry7;
4574 s7 -= carry7 << 21;
4575 carry8 = s8 >> 21;
4576 s9 += carry8;
4577 s8 -= carry8 << 21;
4578 carry9 = s9 >> 21;
4579 s10 += carry9;
4580 s9 -= carry9 << 21;
4581 carry10 = s10 >> 21;
4582 s11 += carry10;
4583 s10 -= carry10 << 21;
4584
4585 s[0] = s0 >> 0;
4586 s[1] = s0 >> 8;
4587 s[2] = (s0 >> 16) | (s1 << 5);
4588 s[3] = s1 >> 3;
4589 s[4] = s1 >> 11;
4590 s[5] = (s1 >> 19) | (s2 << 2);
4591 s[6] = s2 >> 6;
4592 s[7] = (s2 >> 14) | (s3 << 7);
4593 s[8] = s3 >> 1;
4594 s[9] = s3 >> 9;
4595 s[10] = (s3 >> 17) | (s4 << 4);
4596 s[11] = s4 >> 4;
4597 s[12] = s4 >> 12;
4598 s[13] = (s4 >> 20) | (s5 << 1);
4599 s[14] = s5 >> 7;
4600 s[15] = (s5 >> 15) | (s6 << 6);
4601 s[16] = s6 >> 2;
4602 s[17] = s6 >> 10;
4603 s[18] = (s6 >> 18) | (s7 << 3);
4604 s[19] = s7 >> 5;
4605 s[20] = s7 >> 13;
4606 s[21] = s8 >> 0;
4607 s[22] = s8 >> 8;
4608 s[23] = (s8 >> 16) | (s9 << 5);
4609 s[24] = s9 >> 3;
4610 s[25] = s9 >> 11;
4611 s[26] = (s9 >> 19) | (s10 << 2);
4612 s[27] = s10 >> 6;
4613 s[28] = (s10 >> 14) | (s11 << 7);
4614 s[29] = s11 >> 1;
4615 s[30] = s11 >> 9;
4616 s[31] = s11 >> 17;
4617}
4618
4619void ED25519_public_from_private(uint8_t out_public_key[ED25519_PUBLIC_KEY_LENGTH32],
4620 const uint8_t private_key[ED25519_PRIVATE_KEY_LENGTH32]) {
4621 uint8_t az[SHA512_DIGEST_LENGTH64];
4622 SHA512(private_key, 32, az);
4623
4624 az[0] &= 248;
4625 az[31] &= 63;
4626 az[31] |= 64;
4627
4628 ge_p3 A;
4629 x25519_ge_scalarmult_base(&A, az);
4630 ge_p3_tobytes(out_public_key, &A);
4631}
4632
4633void ED25519_keypair(uint8_t out_public_key[ED25519_PUBLIC_KEY_LENGTH32],
4634 uint8_t out_private_key[ED25519_PRIVATE_KEY_LENGTH32]) {
4635 arc4random_buf(out_private_key, 32);
4636
4637 ED25519_public_from_private(out_public_key, out_private_key);
4638}
4639LCRYPTO_ALIAS(ED25519_keypair)asm("");
4640
4641int ED25519_sign(uint8_t *out_sig, const uint8_t *message, size_t message_len,
4642 const uint8_t public_key[ED25519_PUBLIC_KEY_LENGTH32],
4643 const uint8_t private_key[ED25519_PRIVATE_KEY_LENGTH32]) {
4644 uint8_t az[SHA512_DIGEST_LENGTH64];
4645 SHA512(private_key, 32, az);
4646
4647 az[0] &= 248;
4648 az[31] &= 63;
4649 az[31] |= 64;
4650
4651 SHA512_CTX hash_ctx;
4652 SHA512_Init(&hash_ctx);
4653 SHA512_Update(&hash_ctx, az + 32, 32);
4654 SHA512_Update(&hash_ctx, message, message_len);
4655 uint8_t nonce[SHA512_DIGEST_LENGTH64];
4656 SHA512_Final(nonce, &hash_ctx);
4657
4658 x25519_sc_reduce(nonce);
4659 ge_p3 R;
4660 x25519_ge_scalarmult_base(&R, nonce);
4661 ge_p3_tobytes(out_sig, &R);
4662
4663 SHA512_Init(&hash_ctx);
4664 SHA512_Update(&hash_ctx, out_sig, 32);
4665 SHA512_Update(&hash_ctx, public_key, 32);
4666 SHA512_Update(&hash_ctx, message, message_len);
4667 uint8_t hram[SHA512_DIGEST_LENGTH64];
4668 SHA512_Final(hram, &hash_ctx);
4669
4670 x25519_sc_reduce(hram);
4671 sc_muladd(out_sig + 32, hram, az, nonce);
4672
4673 return 1;
4674}
4675LCRYPTO_ALIAS(ED25519_sign)asm("");
4676
4677/*
4678 * Little endian representation of the order of edwards25519,
4679 * see https://www.rfc-editor.org/rfc/rfc7748#section-4.1
4680 */
4681static const uint8_t order[] = {
4682 0xed, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58,
4683 0xd6, 0x9c, 0xf7, 0xa2, 0xde, 0xf9, 0xde, 0x14,
4684 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4685 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,
4686};
4687
4688int ED25519_verify(const uint8_t *message, size_t message_len,
4689 const uint8_t signature[ED25519_SIGNATURE_LENGTH64],
4690 const uint8_t public_key[ED25519_PUBLIC_KEY_LENGTH32]) {
4691 ge_p3 A;
4692 int i;
4693 if ((signature[63] & 224) != 0 ||
4694 x25519_ge_frombytes_vartime(&A, public_key) != 0) {
4695 return 0;
4696 }
4697
4698 fe_neg(A.X, A.X);
4699 fe_neg(A.T, A.T);
4700
4701 uint8_t pkcopy[32];
4702 memcpy(pkcopy, public_key, 32);
4703 uint8_t rcopy[32];
4704 memcpy(rcopy, signature, 32);
4705 uint8_t scopy[32];
4706 memcpy(scopy, signature + 32, 32);
4707
4708 /*
4709 * https://tools.ietf.org/html/rfc8032#section-5.1.7 requires that scopy be
4710 * in the range [0, order) to prevent signature malleability. This value is
4711 * public, so there is no need to make this constant time.
4712 */
4713 for (i = 31; i >= 0; i--) {
4714 if (scopy[i] > order[i])
4715 return 0;
4716 if (scopy[i] < order[i])
4717 break;
4718 if (i == 0)
4719 return 0;
4720 }
4721
4722 SHA512_CTX hash_ctx;
4723 SHA512_Init(&hash_ctx);
4724 SHA512_Update(&hash_ctx, signature, 32);
4725 SHA512_Update(&hash_ctx, public_key, 32);
4726 SHA512_Update(&hash_ctx, message, message_len);
4727 uint8_t h[SHA512_DIGEST_LENGTH64];
4728 SHA512_Final(h, &hash_ctx);
4729
4730 x25519_sc_reduce(h);
4731
4732 ge_p2 R;
4733 ge_double_scalarmult_vartime(&R, h, &A, scopy);
4734
4735 uint8_t rcheck[32];
4736 x25519_ge_tobytes(rcheck, &R);
4737
4738 return timingsafe_memcmp(rcheck, rcopy, sizeof(rcheck)) == 0;
4739}
4740LCRYPTO_ALIAS(ED25519_verify)asm("");
4741
4742/* Replace (f,g) with (g,f) if b == 1;
4743 * replace (f,g) with (f,g) if b == 0.
4744 *
4745 * Preconditions: b in {0,1}. */
4746static void fe_cswap(fe f, fe g, unsigned int b) {
4747 b = 0-b;
4748 unsigned i;
4749 for (i = 0; i < 10; i++) {
4750 int32_t x = f[i] ^ g[i];
4751 x &= b;
4752 f[i] ^= x;
4753 g[i] ^= x;
4754 }
4755}
4756
4757/* h = f * 121666
4758 * Can overlap h with f.
4759 *
4760 * Preconditions:
4761 * |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc.
4762 *
4763 * Postconditions:
4764 * |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. */
4765static void fe_mul121666(fe h, fe f) {
4766 int32_t f0 = f[0];
4767 int32_t f1 = f[1];
4768 int32_t f2 = f[2];
4769 int32_t f3 = f[3];
4770 int32_t f4 = f[4];
4771 int32_t f5 = f[5];
4772 int32_t f6 = f[6];
4773 int32_t f7 = f[7];
4774 int32_t f8 = f[8];
4775 int32_t f9 = f[9];
4776 int64_t h0 = f0 * (int64_t) 121666;
4777 int64_t h1 = f1 * (int64_t) 121666;
4778 int64_t h2 = f2 * (int64_t) 121666;
4779 int64_t h3 = f3 * (int64_t) 121666;
4780 int64_t h4 = f4 * (int64_t) 121666;
4781 int64_t h5 = f5 * (int64_t) 121666;
4782 int64_t h6 = f6 * (int64_t) 121666;
4783 int64_t h7 = f7 * (int64_t) 121666;
4784 int64_t h8 = f8 * (int64_t) 121666;
4785 int64_t h9 = f9 * (int64_t) 121666;
4786 int64_t carry0;
4787 int64_t carry1;
4788 int64_t carry2;
4789 int64_t carry3;
4790 int64_t carry4;
4791 int64_t carry5;
4792 int64_t carry6;
4793 int64_t carry7;
4794 int64_t carry8;
4795 int64_t carry9;
4796
4797 carry9 = h9 + (1 << 24); h0 += (carry9 >> 25) * 19; h9 -= carry9 & kTop39Bits;
4798 carry1 = h1 + (1 << 24); h2 += carry1 >> 25; h1 -= carry1 & kTop39Bits;
4799 carry3 = h3 + (1 << 24); h4 += carry3 >> 25; h3 -= carry3 & kTop39Bits;
4800 carry5 = h5 + (1 << 24); h6 += carry5 >> 25; h5 -= carry5 & kTop39Bits;
4801 carry7 = h7 + (1 << 24); h8 += carry7 >> 25; h7 -= carry7 & kTop39Bits;
4802
4803 carry0 = h0 + (1 << 25); h1 += carry0 >> 26; h0 -= carry0 & kTop38Bits;
4804 carry2 = h2 + (1 << 25); h3 += carry2 >> 26; h2 -= carry2 & kTop38Bits;
4805 carry4 = h4 + (1 << 25); h5 += carry4 >> 26; h4 -= carry4 & kTop38Bits;
4806 carry6 = h6 + (1 << 25); h7 += carry6 >> 26; h6 -= carry6 & kTop38Bits;
4807 carry8 = h8 + (1 << 25); h9 += carry8 >> 26; h8 -= carry8 & kTop38Bits;
4808
4809 h[0] = h0;
4810 h[1] = h1;
4811 h[2] = h2;
4812 h[3] = h3;
4813 h[4] = h4;
4814 h[5] = h5;
4815 h[6] = h6;
4816 h[7] = h7;
4817 h[8] = h8;
4818 h[9] = h9;
4819}
4820
4821void
4822x25519_scalar_mult_generic(uint8_t out[32], const uint8_t scalar[32],
4823 const uint8_t point[32]) {
4824 fe x1, x2, z2, x3, z3, tmp0, tmp1;
4825
4826 uint8_t e[32];
4827 memcpy(e, scalar, 32);
4828 e[0] &= 248;
4829 e[31] &= 127;
4830 e[31] |= 64;
4831 fe_frombytes(x1, point);
4832 fe_1(x2);
4833 fe_0(z2);
4834 fe_copy(x3, x1);
4835 fe_1(z3);
4836
4837 unsigned swap = 0;
4838 int pos;
4839 for (pos = 254; pos >= 0; --pos) {
4840 unsigned b = 1 & (e[pos / 8] >> (pos & 7));
4841 swap ^= b;
4842 fe_cswap(x2, x3, swap);
4843 fe_cswap(z2, z3, swap);
4844 swap = b;
4845 fe_sub(tmp0, x3, z3);
4846 fe_sub(tmp1, x2, z2);
4847 fe_add(x2, x2, z2);
4848 fe_add(z2, x3, z3);
4849 fe_mul(z3, tmp0, x2);
4850 fe_mul(z2, z2, tmp1);
4851 fe_sq(tmp0, tmp1);
4852 fe_sq(tmp1, x2);
4853 fe_add(x3, z3, z2);
4854 fe_sub(z2, z3, z2);
4855 fe_mul(x2, tmp1, tmp0);
4856 fe_sub(tmp1, tmp1, tmp0);
4857 fe_sq(z2, z2);
4858 fe_mul121666(z3, tmp1);
4859 fe_sq(x3, x3);
4860 fe_add(tmp0, tmp0, z3);
4861 fe_mul(z3, x1, z2);
4862 fe_mul(z2, tmp1, tmp0);
4863 }
4864 fe_cswap(x2, x3, swap);
4865 fe_cswap(z2, z3, swap);
4866
4867 fe_invert(z2, z2);
4868 fe_mul(x2, x2, z2);
4869 fe_tobytes(out, x2);
4870}
4871
4872#ifdef unused
4873void
4874x25519_public_from_private_generic(uint8_t out_public_key[32],
4875 const uint8_t private_key[32])
4876{
4877 uint8_t e[32];
4878
4879 memcpy(e, private_key, 32);
4880 e[0] &= 248;
4881 e[31] &= 127;
4882 e[31] |= 64;
4883
4884 ge_p3 A;
4885 x25519_ge_scalarmult_base(&A, e);
4886
4887 /* We only need the u-coordinate of the curve25519 point. The map is
4888 * u=(y+1)/(1-y). Since y=Y/Z, this gives u=(Z+Y)/(Z-Y). */
4889 fe zplusy, zminusy, zminusy_inv;
4890 fe_add(zplusy, A.Z, A.Y);
4891 fe_sub(zminusy, A.Z, A.Y);
4892 fe_invert(zminusy_inv, zminusy);
4893 fe_mul(zplusy, zplusy, zminusy_inv);
4894 fe_tobytes(out_public_key, zplusy);
4895}
4896#endif
4897
4898void
4899X25519_public_from_private(uint8_t out_public_key[X25519_KEY_LENGTH32],
4900 const uint8_t private_key[X25519_KEY_LENGTH32])
4901{
4902 static const uint8_t kMongomeryBasePoint[32] = {9};
4903
4904 x25519_scalar_mult(out_public_key, private_key, kMongomeryBasePoint);
4905}
4906
4907void
4908X25519_keypair(uint8_t out_public_key[X25519_KEY_LENGTH32],
4909 uint8_t out_private_key[X25519_KEY_LENGTH32])
4910{
4911 /* All X25519 implementations should decode scalars correctly (see
4912 * https://tools.ietf.org/html/rfc7748#section-5). However, if an
4913 * implementation doesn't then it might interoperate with random keys a
4914 * fraction of the time because they'll, randomly, happen to be correctly
4915 * formed.
4916 *
4917 * Thus we do the opposite of the masking here to make sure that our private
4918 * keys are never correctly masked and so, hopefully, any incorrect
4919 * implementations are deterministically broken.
4920 *
4921 * This does not affect security because, although we're throwing away
4922 * entropy, a valid implementation of scalarmult should throw away the exact
4923 * same bits anyway. */
4924 arc4random_buf(out_private_key, 32);
4925
4926 out_private_key[0] |= 7;
4927 out_private_key[31] &= 63;
4928 out_private_key[31] |= 128;
4929
4930 X25519_public_from_private(out_public_key, out_private_key);
4931}
4932LCRYPTO_ALIAS(X25519_keypair)asm("");
4933
4934int
4935X25519(uint8_t out_shared_key[X25519_KEY_LENGTH32],
4936 const uint8_t private_key[X25519_KEY_LENGTH32],
4937 const uint8_t peer_public_key[X25519_KEY_LENGTH32])
4938{
4939 static const uint8_t kZeros[32] = {0};
4940
4941 x25519_scalar_mult(out_shared_key, private_key, peer_public_key);
4942
4943 /* The all-zero output results when the input is a point of small order. */
4944 return timingsafe_memcmp(kZeros, out_shared_key, 32) != 0;
4945}
4946LCRYPTO_ALIAS(X25519)asm("");