ssh lib
Embed:
(wiki syntax)
Show/hide line numbers
sp_arm64.c
00001 /* sp.c 00002 * 00003 * Copyright (C) 2006-2018 wolfSSL Inc. 00004 * 00005 * This file is part of wolfSSL. 00006 * 00007 * wolfSSL is free software; you can redistribute it and/or modify 00008 * it under the terms of the GNU General Public License as published by 00009 * the Free Software Foundation; either version 2 of the License, or 00010 * (at your option) any later version. 00011 * 00012 * wolfSSL is distributed in the hope that it will be useful, 00013 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00015 * GNU General Public License for more details. 00016 * 00017 * You should have received a copy of the GNU General Public License 00018 * along with this program; if not, write to the Free Software 00019 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA 00020 */ 00021 00022 /* Implementation by Sean Parkinson. */ 00023 00024 #ifdef HAVE_CONFIG_H 00025 #include <config.h> 00026 #endif 00027 00028 #include <wolfcrypt/settings.h> 00029 #include <wolfcrypt/error-crypt.h> 00030 #include <wolfcrypt/cpuid.h> 00031 #ifdef NO_INLINE 00032 #include <wolfcrypt/misc.h> 00033 #else 00034 #define WOLFSSL_MISC_INCLUDED 00035 #include <wolfcrypt/src/misc.c> 00036 #endif 00037 00038 #if defined(WOLFSSL_HAVE_SP_RSA) || defined(WOLFSSL_HAVE_SP_DH) || \ 00039 defined(WOLFSSL_HAVE_SP_ECC) 00040 00041 #ifdef RSA_LOW_MEM 00042 #define SP_RSA_PRIVATE_EXP_D 00043 00044 #ifndef WOLFSSL_SP_SMALL 00045 #define WOLFSSL_SP_SMALL 00046 #endif 00047 #endif 00048 00049 #include <wolfcrypt/sp.h> 00050 00051 #ifdef WOLFSSL_SP_ARM64_ASM 00052 #if defined(WOLFSSL_HAVE_SP_RSA) || defined(WOLFSSL_HAVE_SP_DH) 00053 #ifndef WOLFSSL_SP_NO_2048 00054 /* Read big endian unsigned byte aray into r. 00055 * 00056 * r A single precision integer. 00057 * a Byte array. 00058 * n Number of bytes in array to read. 00059 */ 00060 static void sp_2048_from_bin(sp_digit* r, int max, const byte* a, int n) 00061 { 00062 int i, j = 0, s = 0; 00063 00064 r[0] = 0; 00065 for (i = n-1; i >= 0; i--) { 00066 r[j] |= ((sp_digit)a[i]) << s; 00067 if (s >= 56) { 00068 r[j] &= 0xffffffffffffffffl; 00069 s = 64 - s; 00070 if (j + 1 >= max) 00071 break; 00072 r[++j] = a[i] >> s; 00073 s = 8 - s; 00074 } 00075 else 00076 s += 8; 00077 } 00078 00079 for (j++; j < max; j++) 00080 r[j] = 0; 00081 } 00082 00083 /* Convert an mp_int to an array of sp_digit. 00084 * 00085 * r A single precision integer. 00086 * a A multi-precision integer. 00087 */ 00088 static void sp_2048_from_mp(sp_digit* r, int max, mp_int* a) 00089 { 00090 #if DIGIT_BIT == 64 00091 int j; 00092 00093 XMEMCPY(r, a->dp, sizeof(sp_digit) * a->used); 00094 00095 for (j = a->used; j < max; j++) 00096 r[j] = 0; 00097 #elif DIGIT_BIT > 64 00098 int i, j = 0, s = 0; 00099 00100 r[0] = 0; 00101 for (i = 0; i < a->used && j < max; i++) { 00102 r[j] |= a->dp[i] << s; 00103 r[j] &= 0xffffffffffffffffl; 00104 s = 64 - s; 00105 if (j + 1 >= max) 00106 break; 00107 r[++j] = a->dp[i] >> s; 00108 while (s + 64 <= DIGIT_BIT) { 00109 s += 64; 00110 r[j] &= 0xffffffffffffffffl; 00111 if (j + 1 >= max) 00112 break; 00113 if (s < DIGIT_BIT) 00114 r[++j] = a->dp[i] >> s; 00115 else 00116 r[++j] = 0; 00117 } 00118 s = DIGIT_BIT - s; 00119 } 00120 00121 for (j++; j < max; j++) 00122 r[j] = 0; 00123 #else 00124 int i, j = 0, s = 0; 00125 00126 r[0] = 0; 00127 for (i = 0; i < a->used && j < max; i++) { 00128 r[j] |= ((sp_digit)a->dp[i]) << s; 00129 if (s + DIGIT_BIT >= 64) { 00130 r[j] &= 0xffffffffffffffffl; 00131 if (j + 1 >= max) 00132 break; 00133 s = 64 - s; 00134 if (s == DIGIT_BIT) { 00135 r[++j] = 0; 00136 s = 0; 00137 } 00138 else { 00139 r[++j] = a->dp[i] >> s; 00140 s = DIGIT_BIT - s; 00141 } 00142 } 00143 else 00144 s += DIGIT_BIT; 00145 } 00146 00147 for (j++; j < max; j++) 00148 r[j] = 0; 00149 #endif 00150 } 00151 00152 /* Write r as big endian to byte aray. 00153 * Fixed length number of bytes written: 256 00154 * 00155 * r A single precision integer. 00156 * a Byte array. 00157 */ 00158 static void sp_2048_to_bin(sp_digit* r, byte* a) 00159 { 00160 int i, j, s = 0, b; 00161 00162 j = 2048 / 8 - 1; 00163 a[j] = 0; 00164 for (i=0; i<32 && j>=0; i++) { 00165 b = 0; 00166 a[j--] |= r[i] << s; b += 8 - s; 00167 if (j < 0) 00168 break; 00169 while (b < 64) { 00170 a[j--] = r[i] >> b; b += 8; 00171 if (j < 0) 00172 break; 00173 } 00174 s = 8 - (b - 64); 00175 if (j >= 0) 00176 a[j] = 0; 00177 if (s != 0) 00178 j++; 00179 } 00180 } 00181 00182 #ifndef WOLFSSL_SP_SMALL 00183 /* Multiply a and b into r. (r = a * b) 00184 * 00185 * r A single precision integer. 00186 * a A single precision integer. 00187 * b A single precision integer. 00188 */ 00189 static void sp_2048_mul_8(sp_digit* r, const sp_digit* a, const sp_digit* b) 00190 { 00191 sp_digit tmp[8]; 00192 00193 __asm__ __volatile__ ( 00194 "ldp x8, x9, [%[a], 0]\n\t" 00195 "ldp x10, x11, [%[a], 16]\n\t" 00196 "ldp x12, x13, [%[a], 32]\n\t" 00197 "ldp x14, x15, [%[a], 48]\n\t" 00198 "ldp x16, x17, [%[b], 0]\n\t" 00199 "ldp x18, x19, [%[b], 16]\n\t" 00200 "ldp x20, x21, [%[b], 32]\n\t" 00201 "ldp x22, x23, [%[b], 48]\n\t" 00202 "# A[0] * B[0]\n\t" 00203 "mul x3, x8, x16\n\t" 00204 "umulh x4, x8, x16\n\t" 00205 "str x3, [%[tmp]]\n\t" 00206 "# A[0] * B[1]\n\t" 00207 "mul x6, x8, x17\n\t" 00208 "umulh x7, x8, x17\n\t" 00209 "adds x4, x4, x6\n\t" 00210 "adc x5, xzr, x7\n\t" 00211 "# A[1] * B[0]\n\t" 00212 "mul x6, x9, x16\n\t" 00213 "umulh x7, x9, x16\n\t" 00214 "adds x4, x4, x6\n\t" 00215 "adcs x5, x5, x7\n\t" 00216 "adc x3, xzr, xzr\n\t" 00217 "str x4, [%[tmp], 8]\n\t" 00218 "# A[0] * B[2]\n\t" 00219 "mul x6, x8, x18\n\t" 00220 "umulh x7, x8, x18\n\t" 00221 "adds x5, x5, x6\n\t" 00222 "adcs x3, x3, x7\n\t" 00223 "adc x4, xzr, xzr\n\t" 00224 "# A[1] * B[1]\n\t" 00225 "mul x6, x9, x17\n\t" 00226 "umulh x7, x9, x17\n\t" 00227 "adds x5, x5, x6\n\t" 00228 "adcs x3, x3, x7\n\t" 00229 "adc x4, x4, xzr\n\t" 00230 "# A[2] * B[0]\n\t" 00231 "mul x6, x10, x16\n\t" 00232 "umulh x7, x10, x16\n\t" 00233 "adds x5, x5, x6\n\t" 00234 "adcs x3, x3, x7\n\t" 00235 "adc x4, x4, xzr\n\t" 00236 "str x5, [%[tmp], 16]\n\t" 00237 "# A[0] * B[3]\n\t" 00238 "mul x6, x8, x19\n\t" 00239 "umulh x7, x8, x19\n\t" 00240 "adds x3, x3, x6\n\t" 00241 "adcs x4, x4, x7\n\t" 00242 "adc x5, xzr, xzr\n\t" 00243 "# A[1] * B[2]\n\t" 00244 "mul x6, x9, x18\n\t" 00245 "umulh x7, x9, x18\n\t" 00246 "adds x3, x3, x6\n\t" 00247 "adcs x4, x4, x7\n\t" 00248 "adc x5, x5, xzr\n\t" 00249 "# A[2] * B[1]\n\t" 00250 "mul x6, x10, x17\n\t" 00251 "umulh x7, x10, x17\n\t" 00252 "adds x3, x3, x6\n\t" 00253 "adcs x4, x4, x7\n\t" 00254 "adc x5, x5, xzr\n\t" 00255 "# A[3] * B[0]\n\t" 00256 "mul x6, x11, x16\n\t" 00257 "umulh x7, x11, x16\n\t" 00258 "adds x3, x3, x6\n\t" 00259 "adcs x4, x4, x7\n\t" 00260 "adc x5, x5, xzr\n\t" 00261 "str x3, [%[tmp], 24]\n\t" 00262 "# A[0] * B[4]\n\t" 00263 "mul x6, x8, x20\n\t" 00264 "umulh x7, x8, x20\n\t" 00265 "adds x4, x4, x6\n\t" 00266 "adcs x5, x5, x7\n\t" 00267 "adc x3, xzr, xzr\n\t" 00268 "# A[1] * B[3]\n\t" 00269 "mul x6, x9, x19\n\t" 00270 "umulh x7, x9, x19\n\t" 00271 "adds x4, x4, x6\n\t" 00272 "adcs x5, x5, x7\n\t" 00273 "adc x3, x3, xzr\n\t" 00274 "# A[2] * B[2]\n\t" 00275 "mul x6, x10, x18\n\t" 00276 "umulh x7, x10, x18\n\t" 00277 "adds x4, x4, x6\n\t" 00278 "adcs x5, x5, x7\n\t" 00279 "adc x3, x3, xzr\n\t" 00280 "# A[3] * B[1]\n\t" 00281 "mul x6, x11, x17\n\t" 00282 "umulh x7, x11, x17\n\t" 00283 "adds x4, x4, x6\n\t" 00284 "adcs x5, x5, x7\n\t" 00285 "adc x3, x3, xzr\n\t" 00286 "# A[4] * B[0]\n\t" 00287 "mul x6, x12, x16\n\t" 00288 "umulh x7, x12, x16\n\t" 00289 "adds x4, x4, x6\n\t" 00290 "adcs x5, x5, x7\n\t" 00291 "adc x3, x3, xzr\n\t" 00292 "str x4, [%[tmp], 32]\n\t" 00293 "# A[0] * B[5]\n\t" 00294 "mul x6, x8, x21\n\t" 00295 "umulh x7, x8, x21\n\t" 00296 "adds x5, x5, x6\n\t" 00297 "adcs x3, x3, x7\n\t" 00298 "adc x4, xzr, xzr\n\t" 00299 "# A[1] * B[4]\n\t" 00300 "mul x6, x9, x20\n\t" 00301 "umulh x7, x9, x20\n\t" 00302 "adds x5, x5, x6\n\t" 00303 "adcs x3, x3, x7\n\t" 00304 "adc x4, x4, xzr\n\t" 00305 "# A[2] * B[3]\n\t" 00306 "mul x6, x10, x19\n\t" 00307 "umulh x7, x10, x19\n\t" 00308 "adds x5, x5, x6\n\t" 00309 "adcs x3, x3, x7\n\t" 00310 "adc x4, x4, xzr\n\t" 00311 "# A[3] * B[2]\n\t" 00312 "mul x6, x11, x18\n\t" 00313 "umulh x7, x11, x18\n\t" 00314 "adds x5, x5, x6\n\t" 00315 "adcs x3, x3, x7\n\t" 00316 "adc x4, x4, xzr\n\t" 00317 "# A[4] * B[1]\n\t" 00318 "mul x6, x12, x17\n\t" 00319 "umulh x7, x12, x17\n\t" 00320 "adds x5, x5, x6\n\t" 00321 "adcs x3, x3, x7\n\t" 00322 "adc x4, x4, xzr\n\t" 00323 "# A[5] * B[0]\n\t" 00324 "mul x6, x13, x16\n\t" 00325 "umulh x7, x13, x16\n\t" 00326 "adds x5, x5, x6\n\t" 00327 "adcs x3, x3, x7\n\t" 00328 "adc x4, x4, xzr\n\t" 00329 "str x5, [%[tmp], 40]\n\t" 00330 "# A[0] * B[6]\n\t" 00331 "mul x6, x8, x22\n\t" 00332 "umulh x7, x8, x22\n\t" 00333 "adds x3, x3, x6\n\t" 00334 "adcs x4, x4, x7\n\t" 00335 "adc x5, xzr, xzr\n\t" 00336 "# A[1] * B[5]\n\t" 00337 "mul x6, x9, x21\n\t" 00338 "umulh x7, x9, x21\n\t" 00339 "adds x3, x3, x6\n\t" 00340 "adcs x4, x4, x7\n\t" 00341 "adc x5, x5, xzr\n\t" 00342 "# A[2] * B[4]\n\t" 00343 "mul x6, x10, x20\n\t" 00344 "umulh x7, x10, x20\n\t" 00345 "adds x3, x3, x6\n\t" 00346 "adcs x4, x4, x7\n\t" 00347 "adc x5, x5, xzr\n\t" 00348 "# A[3] * B[3]\n\t" 00349 "mul x6, x11, x19\n\t" 00350 "umulh x7, x11, x19\n\t" 00351 "adds x3, x3, x6\n\t" 00352 "adcs x4, x4, x7\n\t" 00353 "adc x5, x5, xzr\n\t" 00354 "# A[4] * B[2]\n\t" 00355 "mul x6, x12, x18\n\t" 00356 "umulh x7, x12, x18\n\t" 00357 "adds x3, x3, x6\n\t" 00358 "adcs x4, x4, x7\n\t" 00359 "adc x5, x5, xzr\n\t" 00360 "# A[5] * B[1]\n\t" 00361 "mul x6, x13, x17\n\t" 00362 "umulh x7, x13, x17\n\t" 00363 "adds x3, x3, x6\n\t" 00364 "adcs x4, x4, x7\n\t" 00365 "adc x5, x5, xzr\n\t" 00366 "# A[6] * B[0]\n\t" 00367 "mul x6, x14, x16\n\t" 00368 "umulh x7, x14, x16\n\t" 00369 "adds x3, x3, x6\n\t" 00370 "adcs x4, x4, x7\n\t" 00371 "adc x5, x5, xzr\n\t" 00372 "str x3, [%[tmp], 48]\n\t" 00373 "# A[0] * B[7]\n\t" 00374 "mul x6, x8, x23\n\t" 00375 "umulh x7, x8, x23\n\t" 00376 "adds x4, x4, x6\n\t" 00377 "adcs x5, x5, x7\n\t" 00378 "adc x3, xzr, xzr\n\t" 00379 "# A[1] * B[6]\n\t" 00380 "mul x6, x9, x22\n\t" 00381 "umulh x7, x9, x22\n\t" 00382 "adds x4, x4, x6\n\t" 00383 "adcs x5, x5, x7\n\t" 00384 "adc x3, x3, xzr\n\t" 00385 "# A[2] * B[5]\n\t" 00386 "mul x6, x10, x21\n\t" 00387 "umulh x7, x10, x21\n\t" 00388 "adds x4, x4, x6\n\t" 00389 "adcs x5, x5, x7\n\t" 00390 "adc x3, x3, xzr\n\t" 00391 "# A[3] * B[4]\n\t" 00392 "mul x6, x11, x20\n\t" 00393 "umulh x7, x11, x20\n\t" 00394 "adds x4, x4, x6\n\t" 00395 "adcs x5, x5, x7\n\t" 00396 "adc x3, x3, xzr\n\t" 00397 "# A[4] * B[3]\n\t" 00398 "mul x6, x12, x19\n\t" 00399 "umulh x7, x12, x19\n\t" 00400 "adds x4, x4, x6\n\t" 00401 "adcs x5, x5, x7\n\t" 00402 "adc x3, x3, xzr\n\t" 00403 "# A[5] * B[2]\n\t" 00404 "mul x6, x13, x18\n\t" 00405 "umulh x7, x13, x18\n\t" 00406 "adds x4, x4, x6\n\t" 00407 "adcs x5, x5, x7\n\t" 00408 "adc x3, x3, xzr\n\t" 00409 "# A[6] * B[1]\n\t" 00410 "mul x6, x14, x17\n\t" 00411 "umulh x7, x14, x17\n\t" 00412 "adds x4, x4, x6\n\t" 00413 "adcs x5, x5, x7\n\t" 00414 "adc x3, x3, xzr\n\t" 00415 "# A[7] * B[0]\n\t" 00416 "mul x6, x15, x16\n\t" 00417 "umulh x7, x15, x16\n\t" 00418 "adds x4, x4, x6\n\t" 00419 "adcs x5, x5, x7\n\t" 00420 "adc x3, x3, xzr\n\t" 00421 "str x4, [%[tmp], 56]\n\t" 00422 "# A[1] * B[7]\n\t" 00423 "mul x6, x9, x23\n\t" 00424 "umulh x7, x9, x23\n\t" 00425 "adds x5, x5, x6\n\t" 00426 "adcs x3, x3, x7\n\t" 00427 "adc x4, xzr, xzr\n\t" 00428 "# A[2] * B[6]\n\t" 00429 "mul x6, x10, x22\n\t" 00430 "umulh x7, x10, x22\n\t" 00431 "adds x5, x5, x6\n\t" 00432 "adcs x3, x3, x7\n\t" 00433 "adc x4, x4, xzr\n\t" 00434 "# A[3] * B[5]\n\t" 00435 "mul x6, x11, x21\n\t" 00436 "umulh x7, x11, x21\n\t" 00437 "adds x5, x5, x6\n\t" 00438 "adcs x3, x3, x7\n\t" 00439 "adc x4, x4, xzr\n\t" 00440 "# A[4] * B[4]\n\t" 00441 "mul x6, x12, x20\n\t" 00442 "umulh x7, x12, x20\n\t" 00443 "adds x5, x5, x6\n\t" 00444 "adcs x3, x3, x7\n\t" 00445 "adc x4, x4, xzr\n\t" 00446 "# A[5] * B[3]\n\t" 00447 "mul x6, x13, x19\n\t" 00448 "umulh x7, x13, x19\n\t" 00449 "adds x5, x5, x6\n\t" 00450 "adcs x3, x3, x7\n\t" 00451 "adc x4, x4, xzr\n\t" 00452 "# A[6] * B[2]\n\t" 00453 "mul x6, x14, x18\n\t" 00454 "umulh x7, x14, x18\n\t" 00455 "adds x5, x5, x6\n\t" 00456 "adcs x3, x3, x7\n\t" 00457 "adc x4, x4, xzr\n\t" 00458 "# A[7] * B[1]\n\t" 00459 "mul x6, x15, x17\n\t" 00460 "umulh x7, x15, x17\n\t" 00461 "adds x5, x5, x6\n\t" 00462 "adcs x3, x3, x7\n\t" 00463 "adc x4, x4, xzr\n\t" 00464 "str x5, [%[r], 64]\n\t" 00465 "# A[2] * B[7]\n\t" 00466 "mul x6, x10, x23\n\t" 00467 "umulh x7, x10, x23\n\t" 00468 "adds x3, x3, x6\n\t" 00469 "adcs x4, x4, x7\n\t" 00470 "adc x5, xzr, xzr\n\t" 00471 "# A[3] * B[6]\n\t" 00472 "mul x6, x11, x22\n\t" 00473 "umulh x7, x11, x22\n\t" 00474 "adds x3, x3, x6\n\t" 00475 "adcs x4, x4, x7\n\t" 00476 "adc x5, x5, xzr\n\t" 00477 "# A[4] * B[5]\n\t" 00478 "mul x6, x12, x21\n\t" 00479 "umulh x7, x12, x21\n\t" 00480 "adds x3, x3, x6\n\t" 00481 "adcs x4, x4, x7\n\t" 00482 "adc x5, x5, xzr\n\t" 00483 "# A[5] * B[4]\n\t" 00484 "mul x6, x13, x20\n\t" 00485 "umulh x7, x13, x20\n\t" 00486 "adds x3, x3, x6\n\t" 00487 "adcs x4, x4, x7\n\t" 00488 "adc x5, x5, xzr\n\t" 00489 "# A[6] * B[3]\n\t" 00490 "mul x6, x14, x19\n\t" 00491 "umulh x7, x14, x19\n\t" 00492 "adds x3, x3, x6\n\t" 00493 "adcs x4, x4, x7\n\t" 00494 "adc x5, x5, xzr\n\t" 00495 "# A[7] * B[2]\n\t" 00496 "mul x6, x15, x18\n\t" 00497 "umulh x7, x15, x18\n\t" 00498 "adds x3, x3, x6\n\t" 00499 "adcs x4, x4, x7\n\t" 00500 "adc x5, x5, xzr\n\t" 00501 "str x3, [%[r], 72]\n\t" 00502 "# A[3] * B[7]\n\t" 00503 "mul x6, x11, x23\n\t" 00504 "umulh x7, x11, x23\n\t" 00505 "adds x4, x4, x6\n\t" 00506 "adcs x5, x5, x7\n\t" 00507 "adc x3, xzr, xzr\n\t" 00508 "# A[4] * B[6]\n\t" 00509 "mul x6, x12, x22\n\t" 00510 "umulh x7, x12, x22\n\t" 00511 "adds x4, x4, x6\n\t" 00512 "adcs x5, x5, x7\n\t" 00513 "adc x3, x3, xzr\n\t" 00514 "# A[5] * B[5]\n\t" 00515 "mul x6, x13, x21\n\t" 00516 "umulh x7, x13, x21\n\t" 00517 "adds x4, x4, x6\n\t" 00518 "adcs x5, x5, x7\n\t" 00519 "adc x3, x3, xzr\n\t" 00520 "# A[6] * B[4]\n\t" 00521 "mul x6, x14, x20\n\t" 00522 "umulh x7, x14, x20\n\t" 00523 "adds x4, x4, x6\n\t" 00524 "adcs x5, x5, x7\n\t" 00525 "adc x3, x3, xzr\n\t" 00526 "# A[7] * B[3]\n\t" 00527 "mul x6, x15, x19\n\t" 00528 "umulh x7, x15, x19\n\t" 00529 "adds x4, x4, x6\n\t" 00530 "adcs x5, x5, x7\n\t" 00531 "adc x3, x3, xzr\n\t" 00532 "str x4, [%[r], 80]\n\t" 00533 "# A[4] * B[7]\n\t" 00534 "mul x6, x12, x23\n\t" 00535 "umulh x7, x12, x23\n\t" 00536 "adds x5, x5, x6\n\t" 00537 "adcs x3, x3, x7\n\t" 00538 "adc x4, xzr, xzr\n\t" 00539 "# A[5] * B[6]\n\t" 00540 "mul x6, x13, x22\n\t" 00541 "umulh x7, x13, x22\n\t" 00542 "adds x5, x5, x6\n\t" 00543 "adcs x3, x3, x7\n\t" 00544 "adc x4, x4, xzr\n\t" 00545 "# A[6] * B[5]\n\t" 00546 "mul x6, x14, x21\n\t" 00547 "umulh x7, x14, x21\n\t" 00548 "adds x5, x5, x6\n\t" 00549 "adcs x3, x3, x7\n\t" 00550 "adc x4, x4, xzr\n\t" 00551 "# A[7] * B[4]\n\t" 00552 "mul x6, x15, x20\n\t" 00553 "umulh x7, x15, x20\n\t" 00554 "adds x5, x5, x6\n\t" 00555 "adcs x3, x3, x7\n\t" 00556 "adc x4, x4, xzr\n\t" 00557 "str x5, [%[r], 88]\n\t" 00558 "# A[5] * B[7]\n\t" 00559 "mul x6, x13, x23\n\t" 00560 "umulh x7, x13, x23\n\t" 00561 "adds x3, x3, x6\n\t" 00562 "adcs x4, x4, x7\n\t" 00563 "adc x5, xzr, xzr\n\t" 00564 "# A[6] * B[6]\n\t" 00565 "mul x6, x14, x22\n\t" 00566 "umulh x7, x14, x22\n\t" 00567 "adds x3, x3, x6\n\t" 00568 "adcs x4, x4, x7\n\t" 00569 "adc x5, x5, xzr\n\t" 00570 "# A[7] * B[5]\n\t" 00571 "mul x6, x15, x21\n\t" 00572 "umulh x7, x15, x21\n\t" 00573 "adds x3, x3, x6\n\t" 00574 "adcs x4, x4, x7\n\t" 00575 "adc x5, x5, xzr\n\t" 00576 "str x3, [%[r], 96]\n\t" 00577 "# A[6] * B[7]\n\t" 00578 "mul x6, x14, x23\n\t" 00579 "umulh x7, x14, x23\n\t" 00580 "adds x4, x4, x6\n\t" 00581 "adcs x5, x5, x7\n\t" 00582 "adc x3, xzr, xzr\n\t" 00583 "# A[7] * B[6]\n\t" 00584 "mul x6, x15, x22\n\t" 00585 "umulh x7, x15, x22\n\t" 00586 "adds x4, x4, x6\n\t" 00587 "adcs x5, x5, x7\n\t" 00588 "adc x3, x3, xzr\n\t" 00589 "str x4, [%[r], 104]\n\t" 00590 "# A[7] * B[7]\n\t" 00591 "mul x6, x15, x23\n\t" 00592 "umulh x7, x15, x23\n\t" 00593 "adds x5, x5, x6\n\t" 00594 "adc x3, x3, x7\n\t" 00595 "stp x5, x3, [%[r], 112]\n\t" 00596 : 00597 : [r] "r" (r), [a] "r" (a), [b] "r" (b), [tmp] "r" (tmp) 00598 : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21", "x22", "x23" 00599 ); 00600 00601 XMEMCPY(r, tmp, sizeof(tmp)); 00602 } 00603 00604 /* Square a and put result in r. (r = a * a) 00605 * 00606 * r A single precision integer. 00607 * a A single precision integer. 00608 */ 00609 static void sp_2048_sqr_8(sp_digit* r, const sp_digit* a) 00610 { 00611 sp_digit tmp[8]; 00612 00613 __asm__ __volatile__ ( 00614 "ldp x10, x11, [%[a], 0]\n\t" 00615 "ldp x12, x13, [%[a], 16]\n\t" 00616 "ldp x14, x15, [%[a], 32]\n\t" 00617 "ldp x16, x17, [%[a], 48]\n\t" 00618 "# A[0] * A[0]\n\t" 00619 "mul x2, x10, x10\n\t" 00620 "umulh x3, x10, x10\n\t" 00621 "str x2, [%[tmp]]\n\t" 00622 "mov x4, 0\n\t" 00623 "# A[0] * A[1]\n\t" 00624 "mul x8, x10, x11\n\t" 00625 "umulh x9, x10, x11\n\t" 00626 "adds x3, x3, x8\n\t" 00627 "adcs x4, x4, x9\n\t" 00628 "adc x2, xzr, xzr\n\t" 00629 "adds x3, x3, x8\n\t" 00630 "adcs x4, x4, x9\n\t" 00631 "adc x2, x2, xzr\n\t" 00632 "str x3, [%[tmp], 8]\n\t" 00633 "# A[0] * A[2]\n\t" 00634 "mul x8, x10, x12\n\t" 00635 "umulh x9, x10, x12\n\t" 00636 "adds x4, x4, x8\n\t" 00637 "adcs x2, x2, x9\n\t" 00638 "adc x3, xzr, xzr\n\t" 00639 "adds x4, x4, x8\n\t" 00640 "adcs x2, x2, x9\n\t" 00641 "adc x3, x3, xzr\n\t" 00642 "# A[1] * A[1]\n\t" 00643 "mul x8, x11, x11\n\t" 00644 "umulh x9, x11, x11\n\t" 00645 "adds x4, x4, x8\n\t" 00646 "adcs x2, x2, x9\n\t" 00647 "adc x3, x3, xzr\n\t" 00648 "str x4, [%[tmp], 16]\n\t" 00649 "# A[0] * A[3]\n\t" 00650 "mul x8, x10, x13\n\t" 00651 "umulh x9, x10, x13\n\t" 00652 "adds x2, x2, x8\n\t" 00653 "adcs x3, x3, x9\n\t" 00654 "adc x4, xzr, xzr\n\t" 00655 "adds x2, x2, x8\n\t" 00656 "adcs x3, x3, x9\n\t" 00657 "adc x4, x4, xzr\n\t" 00658 "# A[1] * A[2]\n\t" 00659 "mul x8, x11, x12\n\t" 00660 "umulh x9, x11, x12\n\t" 00661 "adds x2, x2, x8\n\t" 00662 "adcs x3, x3, x9\n\t" 00663 "adc x4, x4, xzr\n\t" 00664 "adds x2, x2, x8\n\t" 00665 "adcs x3, x3, x9\n\t" 00666 "adc x4, x4, xzr\n\t" 00667 "str x2, [%[tmp], 24]\n\t" 00668 "# A[0] * A[4]\n\t" 00669 "mul x8, x10, x14\n\t" 00670 "umulh x9, x10, x14\n\t" 00671 "adds x3, x3, x8\n\t" 00672 "adcs x4, x4, x9\n\t" 00673 "adc x2, xzr, xzr\n\t" 00674 "adds x3, x3, x8\n\t" 00675 "adcs x4, x4, x9\n\t" 00676 "adc x2, x2, xzr\n\t" 00677 "# A[1] * A[3]\n\t" 00678 "mul x8, x11, x13\n\t" 00679 "umulh x9, x11, x13\n\t" 00680 "adds x3, x3, x8\n\t" 00681 "adcs x4, x4, x9\n\t" 00682 "adc x2, x2, xzr\n\t" 00683 "adds x3, x3, x8\n\t" 00684 "adcs x4, x4, x9\n\t" 00685 "adc x2, x2, xzr\n\t" 00686 "# A[2] * A[2]\n\t" 00687 "mul x8, x12, x12\n\t" 00688 "umulh x9, x12, x12\n\t" 00689 "adds x3, x3, x8\n\t" 00690 "adcs x4, x4, x9\n\t" 00691 "adc x2, x2, xzr\n\t" 00692 "str x3, [%[tmp], 32]\n\t" 00693 "# A[0] * A[5]\n\t" 00694 "mul x5, x10, x15\n\t" 00695 "umulh x6, x10, x15\n\t" 00696 "mov x3, 0\n\t" 00697 "mov x7, 0\n\t" 00698 "# A[1] * A[4]\n\t" 00699 "mul x8, x11, x14\n\t" 00700 "umulh x9, x11, x14\n\t" 00701 "adds x5, x5, x8\n\t" 00702 "adcs x6, x6, x9\n\t" 00703 "adc x7, x7, xzr\n\t" 00704 "# A[2] * A[3]\n\t" 00705 "mul x8, x12, x13\n\t" 00706 "umulh x9, x12, x13\n\t" 00707 "adds x5, x5, x8\n\t" 00708 "adcs x6, x6, x9\n\t" 00709 "adc x7, x7, xzr\n\t" 00710 "adds x5, x5, x5\n\t" 00711 "adcs x6, x6, x6\n\t" 00712 "adc x7, x7, x7\n\t" 00713 "adds x4, x4, x5\n\t" 00714 "adcs x2, x2, x6\n\t" 00715 "adc x3, x3, x7\n\t" 00716 "str x4, [%[tmp], 40]\n\t" 00717 "# A[0] * A[6]\n\t" 00718 "mul x5, x10, x16\n\t" 00719 "umulh x6, x10, x16\n\t" 00720 "mov x4, 0\n\t" 00721 "mov x7, 0\n\t" 00722 "# A[1] * A[5]\n\t" 00723 "mul x8, x11, x15\n\t" 00724 "umulh x9, x11, x15\n\t" 00725 "adds x5, x5, x8\n\t" 00726 "adcs x6, x6, x9\n\t" 00727 "adc x7, x7, xzr\n\t" 00728 "# A[2] * A[4]\n\t" 00729 "mul x8, x12, x14\n\t" 00730 "umulh x9, x12, x14\n\t" 00731 "adds x5, x5, x8\n\t" 00732 "adcs x6, x6, x9\n\t" 00733 "adc x7, x7, xzr\n\t" 00734 "# A[3] * A[3]\n\t" 00735 "mul x8, x13, x13\n\t" 00736 "umulh x9, x13, x13\n\t" 00737 "adds x5, x5, x5\n\t" 00738 "adcs x6, x6, x6\n\t" 00739 "adc x7, x7, x7\n\t" 00740 "adds x5, x5, x8\n\t" 00741 "adcs x6, x6, x9\n\t" 00742 "adc x7, x7, xzr\n\t" 00743 "adds x2, x2, x5\n\t" 00744 "adcs x3, x3, x6\n\t" 00745 "adc x4, x4, x7\n\t" 00746 "str x2, [%[tmp], 48]\n\t" 00747 "# A[0] * A[7]\n\t" 00748 "mul x5, x10, x17\n\t" 00749 "umulh x6, x10, x17\n\t" 00750 "mov x2, 0\n\t" 00751 "mov x7, 0\n\t" 00752 "# A[1] * A[6]\n\t" 00753 "mul x8, x11, x16\n\t" 00754 "umulh x9, x11, x16\n\t" 00755 "adds x5, x5, x8\n\t" 00756 "adcs x6, x6, x9\n\t" 00757 "adc x7, x7, xzr\n\t" 00758 "# A[2] * A[5]\n\t" 00759 "mul x8, x12, x15\n\t" 00760 "umulh x9, x12, x15\n\t" 00761 "adds x5, x5, x8\n\t" 00762 "adcs x6, x6, x9\n\t" 00763 "adc x7, x7, xzr\n\t" 00764 "# A[3] * A[4]\n\t" 00765 "mul x8, x13, x14\n\t" 00766 "umulh x9, x13, x14\n\t" 00767 "adds x5, x5, x8\n\t" 00768 "adcs x6, x6, x9\n\t" 00769 "adc x7, x7, xzr\n\t" 00770 "adds x5, x5, x5\n\t" 00771 "adcs x6, x6, x6\n\t" 00772 "adc x7, x7, x7\n\t" 00773 "adds x3, x3, x5\n\t" 00774 "adcs x4, x4, x6\n\t" 00775 "adc x2, x2, x7\n\t" 00776 "str x3, [%[tmp], 56]\n\t" 00777 "# A[1] * A[7]\n\t" 00778 "mul x5, x11, x17\n\t" 00779 "umulh x6, x11, x17\n\t" 00780 "mov x3, 0\n\t" 00781 "mov x7, 0\n\t" 00782 "# A[2] * A[6]\n\t" 00783 "mul x8, x12, x16\n\t" 00784 "umulh x9, x12, x16\n\t" 00785 "adds x5, x5, x8\n\t" 00786 "adcs x6, x6, x9\n\t" 00787 "adc x7, x7, xzr\n\t" 00788 "# A[3] * A[5]\n\t" 00789 "mul x8, x13, x15\n\t" 00790 "umulh x9, x13, x15\n\t" 00791 "adds x5, x5, x8\n\t" 00792 "adcs x6, x6, x9\n\t" 00793 "adc x7, x7, xzr\n\t" 00794 "# A[4] * A[4]\n\t" 00795 "mul x8, x14, x14\n\t" 00796 "umulh x9, x14, x14\n\t" 00797 "adds x5, x5, x5\n\t" 00798 "adcs x6, x6, x6\n\t" 00799 "adc x7, x7, x7\n\t" 00800 "adds x5, x5, x8\n\t" 00801 "adcs x6, x6, x9\n\t" 00802 "adc x7, x7, xzr\n\t" 00803 "adds x4, x4, x5\n\t" 00804 "adcs x2, x2, x6\n\t" 00805 "adc x3, x3, x7\n\t" 00806 "str x4, [%[r], 64]\n\t" 00807 "# A[2] * A[7]\n\t" 00808 "mul x5, x12, x17\n\t" 00809 "umulh x6, x12, x17\n\t" 00810 "mov x4, 0\n\t" 00811 "mov x7, 0\n\t" 00812 "# A[3] * A[6]\n\t" 00813 "mul x8, x13, x16\n\t" 00814 "umulh x9, x13, x16\n\t" 00815 "adds x5, x5, x8\n\t" 00816 "adcs x6, x6, x9\n\t" 00817 "adc x7, x7, xzr\n\t" 00818 "# A[4] * A[5]\n\t" 00819 "mul x8, x14, x15\n\t" 00820 "umulh x9, x14, x15\n\t" 00821 "adds x5, x5, x8\n\t" 00822 "adcs x6, x6, x9\n\t" 00823 "adc x7, x7, xzr\n\t" 00824 "adds x5, x5, x5\n\t" 00825 "adcs x6, x6, x6\n\t" 00826 "adc x7, x7, x7\n\t" 00827 "adds x2, x2, x5\n\t" 00828 "adcs x3, x3, x6\n\t" 00829 "adc x4, x4, x7\n\t" 00830 "str x2, [%[r], 72]\n\t" 00831 "# A[3] * A[7]\n\t" 00832 "mul x8, x13, x17\n\t" 00833 "umulh x9, x13, x17\n\t" 00834 "adds x3, x3, x8\n\t" 00835 "adcs x4, x4, x9\n\t" 00836 "adc x2, xzr, xzr\n\t" 00837 "adds x3, x3, x8\n\t" 00838 "adcs x4, x4, x9\n\t" 00839 "adc x2, x2, xzr\n\t" 00840 "# A[4] * A[6]\n\t" 00841 "mul x8, x14, x16\n\t" 00842 "umulh x9, x14, x16\n\t" 00843 "adds x3, x3, x8\n\t" 00844 "adcs x4, x4, x9\n\t" 00845 "adc x2, x2, xzr\n\t" 00846 "adds x3, x3, x8\n\t" 00847 "adcs x4, x4, x9\n\t" 00848 "adc x2, x2, xzr\n\t" 00849 "# A[5] * A[5]\n\t" 00850 "mul x8, x15, x15\n\t" 00851 "umulh x9, x15, x15\n\t" 00852 "adds x3, x3, x8\n\t" 00853 "adcs x4, x4, x9\n\t" 00854 "adc x2, x2, xzr\n\t" 00855 "str x3, [%[r], 80]\n\t" 00856 "# A[4] * A[7]\n\t" 00857 "mul x8, x14, x17\n\t" 00858 "umulh x9, x14, x17\n\t" 00859 "adds x4, x4, x8\n\t" 00860 "adcs x2, x2, x9\n\t" 00861 "adc x3, xzr, xzr\n\t" 00862 "adds x4, x4, x8\n\t" 00863 "adcs x2, x2, x9\n\t" 00864 "adc x3, x3, xzr\n\t" 00865 "# A[5] * A[6]\n\t" 00866 "mul x8, x15, x16\n\t" 00867 "umulh x9, x15, x16\n\t" 00868 "adds x4, x4, x8\n\t" 00869 "adcs x2, x2, x9\n\t" 00870 "adc x3, x3, xzr\n\t" 00871 "adds x4, x4, x8\n\t" 00872 "adcs x2, x2, x9\n\t" 00873 "adc x3, x3, xzr\n\t" 00874 "str x4, [%[r], 88]\n\t" 00875 "# A[5] * A[7]\n\t" 00876 "mul x8, x15, x17\n\t" 00877 "umulh x9, x15, x17\n\t" 00878 "adds x2, x2, x8\n\t" 00879 "adcs x3, x3, x9\n\t" 00880 "adc x4, xzr, xzr\n\t" 00881 "adds x2, x2, x8\n\t" 00882 "adcs x3, x3, x9\n\t" 00883 "adc x4, x4, xzr\n\t" 00884 "# A[6] * A[6]\n\t" 00885 "mul x8, x16, x16\n\t" 00886 "umulh x9, x16, x16\n\t" 00887 "adds x2, x2, x8\n\t" 00888 "adcs x3, x3, x9\n\t" 00889 "adc x4, x4, xzr\n\t" 00890 "str x2, [%[r], 96]\n\t" 00891 "# A[6] * A[7]\n\t" 00892 "mul x8, x16, x17\n\t" 00893 "umulh x9, x16, x17\n\t" 00894 "adds x3, x3, x8\n\t" 00895 "adcs x4, x4, x9\n\t" 00896 "adc x2, xzr, xzr\n\t" 00897 "adds x3, x3, x8\n\t" 00898 "adcs x4, x4, x9\n\t" 00899 "adc x2, x2, xzr\n\t" 00900 "str x3, [%[r], 104]\n\t" 00901 "# A[7] * A[7]\n\t" 00902 "mul x8, x17, x17\n\t" 00903 "umulh x9, x17, x17\n\t" 00904 "adds x4, x4, x8\n\t" 00905 "adc x2, x2, x9\n\t" 00906 "stp x4, x2, [%[r], 112]\n\t" 00907 : 00908 : [r] "r" (r), [a] "r" (a), [tmp] "r" (tmp) 00909 : "memory", "x2", "x3", "x4", "x8", "x9", "x10", "x5", "x6", "x7", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17" 00910 ); 00911 00912 XMEMCPY(r, tmp, sizeof(tmp)); 00913 } 00914 00915 /* Add b to a into r. (r = a + b) 00916 * 00917 * r A single precision integer. 00918 * a A single precision integer. 00919 * b A single precision integer. 00920 */ 00921 static sp_digit sp_2048_add_8(sp_digit* r, const sp_digit* a, 00922 const sp_digit* b) 00923 { 00924 sp_digit c = 0; 00925 00926 __asm__ __volatile__ ( 00927 "ldp x3, x4, [%[a], 0]\n\t" 00928 "ldp x5, x6, [%[a], 16]\n\t" 00929 "ldp x7, x8, [%[b], 0]\n\t" 00930 "ldp x9, x10, [%[b], 16]\n\t" 00931 "adds x3, x3, x7\n\t" 00932 "adcs x4, x4, x8\n\t" 00933 "adcs x5, x5, x9\n\t" 00934 "adcs x6, x6, x10\n\t" 00935 "stp x3, x4, [%[r], 0]\n\t" 00936 "stp x5, x6, [%[r], 16]\n\t" 00937 "ldp x3, x4, [%[a], 32]\n\t" 00938 "ldp x5, x6, [%[a], 48]\n\t" 00939 "ldp x7, x8, [%[b], 32]\n\t" 00940 "ldp x9, x10, [%[b], 48]\n\t" 00941 "adcs x3, x3, x7\n\t" 00942 "adcs x4, x4, x8\n\t" 00943 "adcs x5, x5, x9\n\t" 00944 "adcs x6, x6, x10\n\t" 00945 "stp x3, x4, [%[r], 32]\n\t" 00946 "stp x5, x6, [%[r], 48]\n\t" 00947 "cset %[c], cs\n\t" 00948 : [c] "+r" (c) 00949 : [r] "r" (r), [a] "r" (a), [b] "r" (b) 00950 : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10" 00951 ); 00952 00953 return c; 00954 } 00955 00956 /* Sub b from a into a. (a -= b) 00957 * 00958 * a A single precision integer and result. 00959 * b A single precision integer. 00960 */ 00961 static sp_digit sp_2048_sub_in_place_16(sp_digit* a, const sp_digit* b) 00962 { 00963 sp_digit c = 0; 00964 00965 __asm__ __volatile__ ( 00966 "ldp x2, x3, [%[a], 0]\n\t" 00967 "ldp x4, x5, [%[a], 16]\n\t" 00968 "ldp x6, x7, [%[b], 0]\n\t" 00969 "ldp x8, x9, [%[b], 16]\n\t" 00970 "subs x2, x2, x6\n\t" 00971 "sbcs x3, x3, x7\n\t" 00972 "sbcs x4, x4, x8\n\t" 00973 "sbcs x5, x5, x9\n\t" 00974 "stp x2, x3, [%[a], 0]\n\t" 00975 "stp x4, x5, [%[a], 16]\n\t" 00976 "ldp x2, x3, [%[a], 32]\n\t" 00977 "ldp x4, x5, [%[a], 48]\n\t" 00978 "ldp x6, x7, [%[b], 32]\n\t" 00979 "ldp x8, x9, [%[b], 48]\n\t" 00980 "sbcs x2, x2, x6\n\t" 00981 "sbcs x3, x3, x7\n\t" 00982 "sbcs x4, x4, x8\n\t" 00983 "sbcs x5, x5, x9\n\t" 00984 "stp x2, x3, [%[a], 32]\n\t" 00985 "stp x4, x5, [%[a], 48]\n\t" 00986 "ldp x2, x3, [%[a], 64]\n\t" 00987 "ldp x4, x5, [%[a], 80]\n\t" 00988 "ldp x6, x7, [%[b], 64]\n\t" 00989 "ldp x8, x9, [%[b], 80]\n\t" 00990 "sbcs x2, x2, x6\n\t" 00991 "sbcs x3, x3, x7\n\t" 00992 "sbcs x4, x4, x8\n\t" 00993 "sbcs x5, x5, x9\n\t" 00994 "stp x2, x3, [%[a], 64]\n\t" 00995 "stp x4, x5, [%[a], 80]\n\t" 00996 "ldp x2, x3, [%[a], 96]\n\t" 00997 "ldp x4, x5, [%[a], 112]\n\t" 00998 "ldp x6, x7, [%[b], 96]\n\t" 00999 "ldp x8, x9, [%[b], 112]\n\t" 01000 "sbcs x2, x2, x6\n\t" 01001 "sbcs x3, x3, x7\n\t" 01002 "sbcs x4, x4, x8\n\t" 01003 "sbcs x5, x5, x9\n\t" 01004 "stp x2, x3, [%[a], 96]\n\t" 01005 "stp x4, x5, [%[a], 112]\n\t" 01006 "csetm %[c], cc\n\t" 01007 : [c] "+r" (c) 01008 : [a] "r" (a), [b] "r" (b) 01009 : "memory", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9" 01010 ); 01011 01012 return c; 01013 } 01014 01015 /* Add b to a into r. (r = a + b) 01016 * 01017 * r A single precision integer. 01018 * a A single precision integer. 01019 * b A single precision integer. 01020 */ 01021 static sp_digit sp_2048_add_16(sp_digit* r, const sp_digit* a, 01022 const sp_digit* b) 01023 { 01024 sp_digit c = 0; 01025 01026 __asm__ __volatile__ ( 01027 "ldp x3, x4, [%[a], 0]\n\t" 01028 "ldp x5, x6, [%[a], 16]\n\t" 01029 "ldp x7, x8, [%[b], 0]\n\t" 01030 "ldp x9, x10, [%[b], 16]\n\t" 01031 "adds x3, x3, x7\n\t" 01032 "adcs x4, x4, x8\n\t" 01033 "adcs x5, x5, x9\n\t" 01034 "adcs x6, x6, x10\n\t" 01035 "stp x3, x4, [%[r], 0]\n\t" 01036 "stp x5, x6, [%[r], 16]\n\t" 01037 "ldp x3, x4, [%[a], 32]\n\t" 01038 "ldp x5, x6, [%[a], 48]\n\t" 01039 "ldp x7, x8, [%[b], 32]\n\t" 01040 "ldp x9, x10, [%[b], 48]\n\t" 01041 "adcs x3, x3, x7\n\t" 01042 "adcs x4, x4, x8\n\t" 01043 "adcs x5, x5, x9\n\t" 01044 "adcs x6, x6, x10\n\t" 01045 "stp x3, x4, [%[r], 32]\n\t" 01046 "stp x5, x6, [%[r], 48]\n\t" 01047 "ldp x3, x4, [%[a], 64]\n\t" 01048 "ldp x5, x6, [%[a], 80]\n\t" 01049 "ldp x7, x8, [%[b], 64]\n\t" 01050 "ldp x9, x10, [%[b], 80]\n\t" 01051 "adcs x3, x3, x7\n\t" 01052 "adcs x4, x4, x8\n\t" 01053 "adcs x5, x5, x9\n\t" 01054 "adcs x6, x6, x10\n\t" 01055 "stp x3, x4, [%[r], 64]\n\t" 01056 "stp x5, x6, [%[r], 80]\n\t" 01057 "ldp x3, x4, [%[a], 96]\n\t" 01058 "ldp x5, x6, [%[a], 112]\n\t" 01059 "ldp x7, x8, [%[b], 96]\n\t" 01060 "ldp x9, x10, [%[b], 112]\n\t" 01061 "adcs x3, x3, x7\n\t" 01062 "adcs x4, x4, x8\n\t" 01063 "adcs x5, x5, x9\n\t" 01064 "adcs x6, x6, x10\n\t" 01065 "stp x3, x4, [%[r], 96]\n\t" 01066 "stp x5, x6, [%[r], 112]\n\t" 01067 "cset %[c], cs\n\t" 01068 : [c] "+r" (c) 01069 : [r] "r" (r), [a] "r" (a), [b] "r" (b) 01070 : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10" 01071 ); 01072 01073 return c; 01074 } 01075 01076 /* AND m into each word of a and store in r. 01077 * 01078 * r A single precision integer. 01079 * a A single precision integer. 01080 * m Mask to AND against each digit. 01081 */ 01082 static void sp_2048_mask_8(sp_digit* r, sp_digit* a, sp_digit m) 01083 { 01084 #ifdef WOLFSSL_SP_SMALL 01085 int i; 01086 01087 for (i=0; i<8; i++) 01088 r[i] = a[i] & m; 01089 #else 01090 r[0] = a[0] & m; 01091 r[1] = a[1] & m; 01092 r[2] = a[2] & m; 01093 r[3] = a[3] & m; 01094 r[4] = a[4] & m; 01095 r[5] = a[5] & m; 01096 r[6] = a[6] & m; 01097 r[7] = a[7] & m; 01098 #endif 01099 } 01100 01101 /* Multiply a and b into r. (r = a * b) 01102 * 01103 * r A single precision integer. 01104 * a A single precision integer. 01105 * b A single precision integer. 01106 */ 01107 static void sp_2048_mul_16(sp_digit* r, const sp_digit* a, 01108 const sp_digit* b) 01109 { 01110 sp_digit* z0 = r; 01111 sp_digit z1[16]; 01112 sp_digit a1[8]; 01113 sp_digit b1[8]; 01114 sp_digit z2[16]; 01115 sp_digit u, ca, cb; 01116 01117 ca = sp_2048_add_8(a1, a, &a[8]); 01118 cb = sp_2048_add_8(b1, b, &b[8]); 01119 u = ca & cb; 01120 sp_2048_mul_8(z1, a1, b1); 01121 sp_2048_mul_8(z2, &a[8], &b[8]); 01122 sp_2048_mul_8(z0, a, b); 01123 sp_2048_mask_8(r + 16, a1, 0 - cb); 01124 sp_2048_mask_8(b1, b1, 0 - ca); 01125 u += sp_2048_add_8(r + 16, r + 16, b1); 01126 u += sp_2048_sub_in_place_16(z1, z2); 01127 u += sp_2048_sub_in_place_16(z1, z0); 01128 u += sp_2048_add_16(r + 8, r + 8, z1); 01129 r[24] = u; 01130 XMEMSET(r + 24 + 1, 0, sizeof(sp_digit) * (8 - 1)); 01131 sp_2048_add_16(r + 16, r + 16, z2); 01132 } 01133 01134 /* Square a and put result in r. (r = a * a) 01135 * 01136 * r A single precision integer. 01137 * a A single precision integer. 01138 */ 01139 static void sp_2048_sqr_16(sp_digit* r, const sp_digit* a) 01140 { 01141 sp_digit* z0 = r; 01142 sp_digit z2[16]; 01143 sp_digit z1[16]; 01144 sp_digit a1[8]; 01145 sp_digit u; 01146 01147 u = sp_2048_add_8(a1, a, &a[8]); 01148 sp_2048_sqr_8(z1, a1); 01149 sp_2048_sqr_8(z2, &a[8]); 01150 sp_2048_sqr_8(z0, a); 01151 sp_2048_mask_8(r + 16, a1, 0 - u); 01152 u += sp_2048_add_8(r + 16, r + 16, r + 16); 01153 u += sp_2048_sub_in_place_16(z1, z2); 01154 u += sp_2048_sub_in_place_16(z1, z0); 01155 u += sp_2048_add_16(r + 8, r + 8, z1); 01156 r[24] = u; 01157 XMEMSET(r + 24 + 1, 0, sizeof(sp_digit) * (8 - 1)); 01158 sp_2048_add_16(r + 16, r + 16, z2); 01159 } 01160 01161 /* Sub b from a into a. (a -= b) 01162 * 01163 * a A single precision integer and result. 01164 * b A single precision integer. 01165 */ 01166 static sp_digit sp_2048_sub_in_place_32(sp_digit* a, const sp_digit* b) 01167 { 01168 sp_digit c = 0; 01169 01170 __asm__ __volatile__ ( 01171 "ldp x2, x3, [%[a], 0]\n\t" 01172 "ldp x4, x5, [%[a], 16]\n\t" 01173 "ldp x6, x7, [%[b], 0]\n\t" 01174 "ldp x8, x9, [%[b], 16]\n\t" 01175 "subs x2, x2, x6\n\t" 01176 "sbcs x3, x3, x7\n\t" 01177 "sbcs x4, x4, x8\n\t" 01178 "sbcs x5, x5, x9\n\t" 01179 "stp x2, x3, [%[a], 0]\n\t" 01180 "stp x4, x5, [%[a], 16]\n\t" 01181 "ldp x2, x3, [%[a], 32]\n\t" 01182 "ldp x4, x5, [%[a], 48]\n\t" 01183 "ldp x6, x7, [%[b], 32]\n\t" 01184 "ldp x8, x9, [%[b], 48]\n\t" 01185 "sbcs x2, x2, x6\n\t" 01186 "sbcs x3, x3, x7\n\t" 01187 "sbcs x4, x4, x8\n\t" 01188 "sbcs x5, x5, x9\n\t" 01189 "stp x2, x3, [%[a], 32]\n\t" 01190 "stp x4, x5, [%[a], 48]\n\t" 01191 "ldp x2, x3, [%[a], 64]\n\t" 01192 "ldp x4, x5, [%[a], 80]\n\t" 01193 "ldp x6, x7, [%[b], 64]\n\t" 01194 "ldp x8, x9, [%[b], 80]\n\t" 01195 "sbcs x2, x2, x6\n\t" 01196 "sbcs x3, x3, x7\n\t" 01197 "sbcs x4, x4, x8\n\t" 01198 "sbcs x5, x5, x9\n\t" 01199 "stp x2, x3, [%[a], 64]\n\t" 01200 "stp x4, x5, [%[a], 80]\n\t" 01201 "ldp x2, x3, [%[a], 96]\n\t" 01202 "ldp x4, x5, [%[a], 112]\n\t" 01203 "ldp x6, x7, [%[b], 96]\n\t" 01204 "ldp x8, x9, [%[b], 112]\n\t" 01205 "sbcs x2, x2, x6\n\t" 01206 "sbcs x3, x3, x7\n\t" 01207 "sbcs x4, x4, x8\n\t" 01208 "sbcs x5, x5, x9\n\t" 01209 "stp x2, x3, [%[a], 96]\n\t" 01210 "stp x4, x5, [%[a], 112]\n\t" 01211 "ldp x2, x3, [%[a], 128]\n\t" 01212 "ldp x4, x5, [%[a], 144]\n\t" 01213 "ldp x6, x7, [%[b], 128]\n\t" 01214 "ldp x8, x9, [%[b], 144]\n\t" 01215 "sbcs x2, x2, x6\n\t" 01216 "sbcs x3, x3, x7\n\t" 01217 "sbcs x4, x4, x8\n\t" 01218 "sbcs x5, x5, x9\n\t" 01219 "stp x2, x3, [%[a], 128]\n\t" 01220 "stp x4, x5, [%[a], 144]\n\t" 01221 "ldp x2, x3, [%[a], 160]\n\t" 01222 "ldp x4, x5, [%[a], 176]\n\t" 01223 "ldp x6, x7, [%[b], 160]\n\t" 01224 "ldp x8, x9, [%[b], 176]\n\t" 01225 "sbcs x2, x2, x6\n\t" 01226 "sbcs x3, x3, x7\n\t" 01227 "sbcs x4, x4, x8\n\t" 01228 "sbcs x5, x5, x9\n\t" 01229 "stp x2, x3, [%[a], 160]\n\t" 01230 "stp x4, x5, [%[a], 176]\n\t" 01231 "ldp x2, x3, [%[a], 192]\n\t" 01232 "ldp x4, x5, [%[a], 208]\n\t" 01233 "ldp x6, x7, [%[b], 192]\n\t" 01234 "ldp x8, x9, [%[b], 208]\n\t" 01235 "sbcs x2, x2, x6\n\t" 01236 "sbcs x3, x3, x7\n\t" 01237 "sbcs x4, x4, x8\n\t" 01238 "sbcs x5, x5, x9\n\t" 01239 "stp x2, x3, [%[a], 192]\n\t" 01240 "stp x4, x5, [%[a], 208]\n\t" 01241 "ldp x2, x3, [%[a], 224]\n\t" 01242 "ldp x4, x5, [%[a], 240]\n\t" 01243 "ldp x6, x7, [%[b], 224]\n\t" 01244 "ldp x8, x9, [%[b], 240]\n\t" 01245 "sbcs x2, x2, x6\n\t" 01246 "sbcs x3, x3, x7\n\t" 01247 "sbcs x4, x4, x8\n\t" 01248 "sbcs x5, x5, x9\n\t" 01249 "stp x2, x3, [%[a], 224]\n\t" 01250 "stp x4, x5, [%[a], 240]\n\t" 01251 "csetm %[c], cc\n\t" 01252 : [c] "+r" (c) 01253 : [a] "r" (a), [b] "r" (b) 01254 : "memory", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9" 01255 ); 01256 01257 return c; 01258 } 01259 01260 /* Add b to a into r. (r = a + b) 01261 * 01262 * r A single precision integer. 01263 * a A single precision integer. 01264 * b A single precision integer. 01265 */ 01266 static sp_digit sp_2048_add_32(sp_digit* r, const sp_digit* a, 01267 const sp_digit* b) 01268 { 01269 sp_digit c = 0; 01270 01271 __asm__ __volatile__ ( 01272 "ldp x3, x4, [%[a], 0]\n\t" 01273 "ldp x5, x6, [%[a], 16]\n\t" 01274 "ldp x7, x8, [%[b], 0]\n\t" 01275 "ldp x9, x10, [%[b], 16]\n\t" 01276 "adds x3, x3, x7\n\t" 01277 "adcs x4, x4, x8\n\t" 01278 "adcs x5, x5, x9\n\t" 01279 "adcs x6, x6, x10\n\t" 01280 "stp x3, x4, [%[r], 0]\n\t" 01281 "stp x5, x6, [%[r], 16]\n\t" 01282 "ldp x3, x4, [%[a], 32]\n\t" 01283 "ldp x5, x6, [%[a], 48]\n\t" 01284 "ldp x7, x8, [%[b], 32]\n\t" 01285 "ldp x9, x10, [%[b], 48]\n\t" 01286 "adcs x3, x3, x7\n\t" 01287 "adcs x4, x4, x8\n\t" 01288 "adcs x5, x5, x9\n\t" 01289 "adcs x6, x6, x10\n\t" 01290 "stp x3, x4, [%[r], 32]\n\t" 01291 "stp x5, x6, [%[r], 48]\n\t" 01292 "ldp x3, x4, [%[a], 64]\n\t" 01293 "ldp x5, x6, [%[a], 80]\n\t" 01294 "ldp x7, x8, [%[b], 64]\n\t" 01295 "ldp x9, x10, [%[b], 80]\n\t" 01296 "adcs x3, x3, x7\n\t" 01297 "adcs x4, x4, x8\n\t" 01298 "adcs x5, x5, x9\n\t" 01299 "adcs x6, x6, x10\n\t" 01300 "stp x3, x4, [%[r], 64]\n\t" 01301 "stp x5, x6, [%[r], 80]\n\t" 01302 "ldp x3, x4, [%[a], 96]\n\t" 01303 "ldp x5, x6, [%[a], 112]\n\t" 01304 "ldp x7, x8, [%[b], 96]\n\t" 01305 "ldp x9, x10, [%[b], 112]\n\t" 01306 "adcs x3, x3, x7\n\t" 01307 "adcs x4, x4, x8\n\t" 01308 "adcs x5, x5, x9\n\t" 01309 "adcs x6, x6, x10\n\t" 01310 "stp x3, x4, [%[r], 96]\n\t" 01311 "stp x5, x6, [%[r], 112]\n\t" 01312 "ldp x3, x4, [%[a], 128]\n\t" 01313 "ldp x5, x6, [%[a], 144]\n\t" 01314 "ldp x7, x8, [%[b], 128]\n\t" 01315 "ldp x9, x10, [%[b], 144]\n\t" 01316 "adcs x3, x3, x7\n\t" 01317 "adcs x4, x4, x8\n\t" 01318 "adcs x5, x5, x9\n\t" 01319 "adcs x6, x6, x10\n\t" 01320 "stp x3, x4, [%[r], 128]\n\t" 01321 "stp x5, x6, [%[r], 144]\n\t" 01322 "ldp x3, x4, [%[a], 160]\n\t" 01323 "ldp x5, x6, [%[a], 176]\n\t" 01324 "ldp x7, x8, [%[b], 160]\n\t" 01325 "ldp x9, x10, [%[b], 176]\n\t" 01326 "adcs x3, x3, x7\n\t" 01327 "adcs x4, x4, x8\n\t" 01328 "adcs x5, x5, x9\n\t" 01329 "adcs x6, x6, x10\n\t" 01330 "stp x3, x4, [%[r], 160]\n\t" 01331 "stp x5, x6, [%[r], 176]\n\t" 01332 "ldp x3, x4, [%[a], 192]\n\t" 01333 "ldp x5, x6, [%[a], 208]\n\t" 01334 "ldp x7, x8, [%[b], 192]\n\t" 01335 "ldp x9, x10, [%[b], 208]\n\t" 01336 "adcs x3, x3, x7\n\t" 01337 "adcs x4, x4, x8\n\t" 01338 "adcs x5, x5, x9\n\t" 01339 "adcs x6, x6, x10\n\t" 01340 "stp x3, x4, [%[r], 192]\n\t" 01341 "stp x5, x6, [%[r], 208]\n\t" 01342 "ldp x3, x4, [%[a], 224]\n\t" 01343 "ldp x5, x6, [%[a], 240]\n\t" 01344 "ldp x7, x8, [%[b], 224]\n\t" 01345 "ldp x9, x10, [%[b], 240]\n\t" 01346 "adcs x3, x3, x7\n\t" 01347 "adcs x4, x4, x8\n\t" 01348 "adcs x5, x5, x9\n\t" 01349 "adcs x6, x6, x10\n\t" 01350 "stp x3, x4, [%[r], 224]\n\t" 01351 "stp x5, x6, [%[r], 240]\n\t" 01352 "cset %[c], cs\n\t" 01353 : [c] "+r" (c) 01354 : [r] "r" (r), [a] "r" (a), [b] "r" (b) 01355 : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10" 01356 ); 01357 01358 return c; 01359 } 01360 01361 /* AND m into each word of a and store in r. 01362 * 01363 * r A single precision integer. 01364 * a A single precision integer. 01365 * m Mask to AND against each digit. 01366 */ 01367 static void sp_2048_mask_16(sp_digit* r, sp_digit* a, sp_digit m) 01368 { 01369 #ifdef WOLFSSL_SP_SMALL 01370 int i; 01371 01372 for (i=0; i<16; i++) 01373 r[i] = a[i] & m; 01374 #else 01375 int i; 01376 01377 for (i = 0; i < 16; i += 8) { 01378 r[i+0] = a[i+0] & m; 01379 r[i+1] = a[i+1] & m; 01380 r[i+2] = a[i+2] & m; 01381 r[i+3] = a[i+3] & m; 01382 r[i+4] = a[i+4] & m; 01383 r[i+5] = a[i+5] & m; 01384 r[i+6] = a[i+6] & m; 01385 r[i+7] = a[i+7] & m; 01386 } 01387 #endif 01388 } 01389 01390 /* Multiply a and b into r. (r = a * b) 01391 * 01392 * r A single precision integer. 01393 * a A single precision integer. 01394 * b A single precision integer. 01395 */ 01396 static void sp_2048_mul_32(sp_digit* r, const sp_digit* a, 01397 const sp_digit* b) 01398 { 01399 sp_digit* z0 = r; 01400 sp_digit z1[32]; 01401 sp_digit a1[16]; 01402 sp_digit b1[16]; 01403 sp_digit z2[32]; 01404 sp_digit u, ca, cb; 01405 01406 ca = sp_2048_add_16(a1, a, &a[16]); 01407 cb = sp_2048_add_16(b1, b, &b[16]); 01408 u = ca & cb; 01409 sp_2048_mul_16(z1, a1, b1); 01410 sp_2048_mul_16(z2, &a[16], &b[16]); 01411 sp_2048_mul_16(z0, a, b); 01412 sp_2048_mask_16(r + 32, a1, 0 - cb); 01413 sp_2048_mask_16(b1, b1, 0 - ca); 01414 u += sp_2048_add_16(r + 32, r + 32, b1); 01415 u += sp_2048_sub_in_place_32(z1, z2); 01416 u += sp_2048_sub_in_place_32(z1, z0); 01417 u += sp_2048_add_32(r + 16, r + 16, z1); 01418 r[48] = u; 01419 XMEMSET(r + 48 + 1, 0, sizeof(sp_digit) * (16 - 1)); 01420 sp_2048_add_32(r + 32, r + 32, z2); 01421 } 01422 01423 /* Square a and put result in r. (r = a * a) 01424 * 01425 * r A single precision integer. 01426 * a A single precision integer. 01427 */ 01428 static void sp_2048_sqr_32(sp_digit* r, const sp_digit* a) 01429 { 01430 sp_digit* z0 = r; 01431 sp_digit z2[32]; 01432 sp_digit z1[32]; 01433 sp_digit a1[16]; 01434 sp_digit u; 01435 01436 u = sp_2048_add_16(a1, a, &a[16]); 01437 sp_2048_sqr_16(z1, a1); 01438 sp_2048_sqr_16(z2, &a[16]); 01439 sp_2048_sqr_16(z0, a); 01440 sp_2048_mask_16(r + 32, a1, 0 - u); 01441 u += sp_2048_add_16(r + 32, r + 32, r + 32); 01442 u += sp_2048_sub_in_place_32(z1, z2); 01443 u += sp_2048_sub_in_place_32(z1, z0); 01444 u += sp_2048_add_32(r + 16, r + 16, z1); 01445 r[48] = u; 01446 XMEMSET(r + 48 + 1, 0, sizeof(sp_digit) * (16 - 1)); 01447 sp_2048_add_32(r + 32, r + 32, z2); 01448 } 01449 01450 #endif /* WOLFSSL_SP_SMALL */ 01451 #ifdef WOLFSSL_SP_SMALL 01452 /* Add b to a into r. (r = a + b) 01453 * 01454 * r A single precision integer. 01455 * a A single precision integer. 01456 * b A single precision integer. 01457 */ 01458 static sp_digit sp_2048_add_32(sp_digit* r, const sp_digit* a, 01459 const sp_digit* b) 01460 { 01461 sp_digit c = 0; 01462 01463 __asm__ __volatile__ ( 01464 "add x11, %[a], 256\n\t" 01465 "\n1:\n\t" 01466 "adds %[c], %[c], #-1\n\t" 01467 "ldp x3, x4, [%[a]], #16\n\t" 01468 "ldp x5, x6, [%[a]], #16\n\t" 01469 "ldp x7, x8, [%[b]], #16\n\t" 01470 "ldp x9, x10, [%[b]], #16\n\t" 01471 "adcs x3, x3, x7\n\t" 01472 "adcs x4, x4, x8\n\t" 01473 "adcs x5, x5, x9\n\t" 01474 "adcs x6, x6, x10\n\t" 01475 "stp x3, x4, [%[r]], #16\n\t" 01476 "stp x5, x6, [%[r]], #16\n\t" 01477 "cset %[c], cs\n\t" 01478 "cmp %[a], x11\n\t" 01479 "b.ne 1b\n\t" 01480 : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) 01481 : 01482 : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11" 01483 ); 01484 01485 return c; 01486 } 01487 01488 #endif /* WOLFSSL_SP_SMALL */ 01489 #ifdef WOLFSSL_SP_SMALL 01490 /* Sub b from a into a. (a -= b) 01491 * 01492 * a A single precision integer. 01493 * b A single precision integer. 01494 */ 01495 static sp_digit sp_2048_sub_in_place_32(sp_digit* a, const sp_digit* b) 01496 { 01497 sp_digit c = 0; 01498 01499 __asm__ __volatile__ ( 01500 "add x10, %[a], 256\n\t" 01501 "\n1:\n\t" 01502 "subs %[c], xzr, %[c]\n\t" 01503 "ldp x2, x3, [%[a]]\n\t" 01504 "ldp x4, x5, [%[a], #16]\n\t" 01505 "ldp x6, x7, [%[b]], #16\n\t" 01506 "ldp x8, x9, [%[b]], #16\n\t" 01507 "sbcs x2, x2, x6\n\t" 01508 "sbcs x3, x3, x7\n\t" 01509 "sbcs x4, x4, x8\n\t" 01510 "sbcs x5, x5, x9\n\t" 01511 "stp x2, x3, [%[a]], #16\n\t" 01512 "stp x4, x5, [%[a]], #16\n\t" 01513 "csetm %[c], cc\n\t" 01514 "cmp %[a], x10\n\t" 01515 "b.ne 1b\n\t" 01516 : [c] "+r" (c), [a] "+r" (a), [b] "+r" (b) 01517 : 01518 : "memory", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10" 01519 ); 01520 01521 return c; 01522 } 01523 01524 #endif /* WOLFSSL_SP_SMALL */ 01525 #ifdef WOLFSSL_SP_SMALL 01526 /* Multiply a and b into r. (r = a * b) 01527 * 01528 * r A single precision integer. 01529 * a A single precision integer. 01530 * b A single precision integer. 01531 */ 01532 static void sp_2048_mul_32(sp_digit* r, const sp_digit* a, const sp_digit* b) 01533 { 01534 sp_digit tmp[64]; 01535 01536 __asm__ __volatile__ ( 01537 "mov x5, 0\n\t" 01538 "mov x6, 0\n\t" 01539 "mov x7, 0\n\t" 01540 "mov x8, 0\n\t" 01541 "\n1:\n\t" 01542 "subs x3, x5, 248\n\t" 01543 "csel x3, xzr, x3, cc\n\t" 01544 "sub x4, x5, x3\n\t" 01545 "\n2:\n\t" 01546 "ldr x10, [%[a], x3]\n\t" 01547 "ldr x11, [%[b], x4]\n\t" 01548 "mul x9, x10, x11\n\t" 01549 "umulh x10, x10, x11\n\t" 01550 "adds x6, x6, x9\n\t" 01551 "adcs x7, x7, x10\n\t" 01552 "adc x8, x8, xzr\n\t" 01553 "add x3, x3, #8\n\t" 01554 "sub x4, x4, #8\n\t" 01555 "cmp x3, 256\n\t" 01556 "b.eq 3f\n\t" 01557 "cmp x3, x5\n\t" 01558 "b.le 2b\n\t" 01559 "\n3:\n\t" 01560 "str x6, [%[r], x5]\n\t" 01561 "mov x6, x7\n\t" 01562 "mov x7, x8\n\t" 01563 "mov x8, #0\n\t" 01564 "add x5, x5, #8\n\t" 01565 "cmp x5, 496\n\t" 01566 "b.le 1b\n\t" 01567 "str x6, [%[r], x5]\n\t" 01568 : 01569 : [r] "r" (tmp), [a] "r" (a), [b] "r" (b) 01570 : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11" 01571 ); 01572 01573 XMEMCPY(r, tmp, sizeof(tmp)); 01574 } 01575 01576 /* Square a and put result in r. (r = a * a) 01577 * 01578 * r A single precision integer. 01579 * a A single precision integer. 01580 */ 01581 static void sp_2048_sqr_32(sp_digit* r, const sp_digit* a) 01582 { 01583 sp_digit tmp[64]; 01584 01585 __asm__ __volatile__ ( 01586 "mov x6, 0\n\t" 01587 "mov x7, 0\n\t" 01588 "mov x8, 0\n\t" 01589 "mov x5, 0\n\t" 01590 "\n1:\n\t" 01591 "subs x3, x5, 248\n\t" 01592 "csel x3, xzr, x3, cc\n\t" 01593 "sub x4, x5, x3\n\t" 01594 "\n2:\n\t" 01595 "cmp x4, x3\n\t" 01596 "b.eq 4f\n\t" 01597 "ldr x10, [%[a], x3]\n\t" 01598 "ldr x11, [%[a], x4]\n\t" 01599 "mul x9, x10, x11\n\t" 01600 "umulh x10, x10, x11\n\t" 01601 "adds x6, x6, x9\n\t" 01602 "adcs x7, x7, x10\n\t" 01603 "adc x8, x8, xzr\n\t" 01604 "adds x6, x6, x9\n\t" 01605 "adcs x7, x7, x10\n\t" 01606 "adc x8, x8, xzr\n\t" 01607 "b.al 5f\n\t" 01608 "\n4:\n\t" 01609 "ldr x10, [%[a], x3]\n\t" 01610 "mul x9, x10, x10\n\t" 01611 "umulh x10, x10, x10\n\t" 01612 "adds x6, x6, x9\n\t" 01613 "adcs x7, x7, x10\n\t" 01614 "adc x8, x8, xzr\n\t" 01615 "\n5:\n\t" 01616 "add x3, x3, #8\n\t" 01617 "sub x4, x4, #8\n\t" 01618 "cmp x3, 256\n\t" 01619 "b.eq 3f\n\t" 01620 "cmp x3, x4\n\t" 01621 "b.gt 3f\n\t" 01622 "cmp x3, x5\n\t" 01623 "b.le 2b\n\t" 01624 "\n3:\n\t" 01625 "str x6, [%[r], x5]\n\t" 01626 "mov x6, x7\n\t" 01627 "mov x7, x8\n\t" 01628 "mov x8, #0\n\t" 01629 "add x5, x5, #8\n\t" 01630 "cmp x5, 496\n\t" 01631 "b.le 1b\n\t" 01632 "str x6, [%[r], x5]\n\t" 01633 : 01634 : [r] "r" (tmp), [a] "r" (a) 01635 : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11" 01636 ); 01637 01638 XMEMCPY(r, tmp, sizeof(tmp)); 01639 } 01640 01641 #endif /* WOLFSSL_SP_SMALL */ 01642 #if !defined(SP_RSA_PRIVATE_EXP_D) && defined(WOLFSSL_HAVE_SP_RSA) 01643 #ifdef WOLFSSL_SP_SMALL 01644 /* AND m into each word of a and store in r. 01645 * 01646 * r A single precision integer. 01647 * a A single precision integer. 01648 * m Mask to AND against each digit. 01649 */ 01650 static void sp_2048_mask_16(sp_digit* r, sp_digit* a, sp_digit m) 01651 { 01652 int i; 01653 01654 for (i=0; i<16; i++) 01655 r[i] = a[i] & m; 01656 } 01657 01658 #endif /* WOLFSSL_SP_SMALL */ 01659 #ifdef WOLFSSL_SP_SMALL 01660 /* Add b to a into r. (r = a + b) 01661 * 01662 * r A single precision integer. 01663 * a A single precision integer. 01664 * b A single precision integer. 01665 */ 01666 static sp_digit sp_2048_add_16(sp_digit* r, const sp_digit* a, 01667 const sp_digit* b) 01668 { 01669 sp_digit c = 0; 01670 01671 __asm__ __volatile__ ( 01672 "add x11, %[a], 128\n\t" 01673 "\n1:\n\t" 01674 "adds %[c], %[c], #-1\n\t" 01675 "ldp x3, x4, [%[a]], #16\n\t" 01676 "ldp x5, x6, [%[a]], #16\n\t" 01677 "ldp x7, x8, [%[b]], #16\n\t" 01678 "ldp x9, x10, [%[b]], #16\n\t" 01679 "adcs x3, x3, x7\n\t" 01680 "adcs x4, x4, x8\n\t" 01681 "adcs x5, x5, x9\n\t" 01682 "adcs x6, x6, x10\n\t" 01683 "stp x3, x4, [%[r]], #16\n\t" 01684 "stp x5, x6, [%[r]], #16\n\t" 01685 "cset %[c], cs\n\t" 01686 "cmp %[a], x11\n\t" 01687 "b.ne 1b\n\t" 01688 : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) 01689 : 01690 : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11" 01691 ); 01692 01693 return c; 01694 } 01695 01696 #endif /* WOLFSSL_SP_SMALL */ 01697 #ifdef WOLFSSL_SP_SMALL 01698 /* Sub b from a into a. (a -= b) 01699 * 01700 * a A single precision integer. 01701 * b A single precision integer. 01702 */ 01703 static sp_digit sp_2048_sub_in_place_16(sp_digit* a, const sp_digit* b) 01704 { 01705 sp_digit c = 0; 01706 01707 __asm__ __volatile__ ( 01708 "add x10, %[a], 128\n\t" 01709 "\n1:\n\t" 01710 "subs %[c], xzr, %[c]\n\t" 01711 "ldp x2, x3, [%[a]]\n\t" 01712 "ldp x4, x5, [%[a], #16]\n\t" 01713 "ldp x6, x7, [%[b]], #16\n\t" 01714 "ldp x8, x9, [%[b]], #16\n\t" 01715 "sbcs x2, x2, x6\n\t" 01716 "sbcs x3, x3, x7\n\t" 01717 "sbcs x4, x4, x8\n\t" 01718 "sbcs x5, x5, x9\n\t" 01719 "stp x2, x3, [%[a]], #16\n\t" 01720 "stp x4, x5, [%[a]], #16\n\t" 01721 "csetm %[c], cc\n\t" 01722 "cmp %[a], x10\n\t" 01723 "b.ne 1b\n\t" 01724 : [c] "+r" (c), [a] "+r" (a), [b] "+r" (b) 01725 : 01726 : "memory", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10" 01727 ); 01728 01729 return c; 01730 } 01731 01732 #endif /* WOLFSSL_SP_SMALL */ 01733 #ifdef WOLFSSL_SP_SMALL 01734 /* Multiply a and b into r. (r = a * b) 01735 * 01736 * r A single precision integer. 01737 * a A single precision integer. 01738 * b A single precision integer. 01739 */ 01740 static void sp_2048_mul_16(sp_digit* r, const sp_digit* a, const sp_digit* b) 01741 { 01742 sp_digit tmp[32]; 01743 01744 __asm__ __volatile__ ( 01745 "mov x5, 0\n\t" 01746 "mov x6, 0\n\t" 01747 "mov x7, 0\n\t" 01748 "mov x8, 0\n\t" 01749 "\n1:\n\t" 01750 "subs x3, x5, 120\n\t" 01751 "csel x3, xzr, x3, cc\n\t" 01752 "sub x4, x5, x3\n\t" 01753 "\n2:\n\t" 01754 "ldr x10, [%[a], x3]\n\t" 01755 "ldr x11, [%[b], x4]\n\t" 01756 "mul x9, x10, x11\n\t" 01757 "umulh x10, x10, x11\n\t" 01758 "adds x6, x6, x9\n\t" 01759 "adcs x7, x7, x10\n\t" 01760 "adc x8, x8, xzr\n\t" 01761 "add x3, x3, #8\n\t" 01762 "sub x4, x4, #8\n\t" 01763 "cmp x3, 128\n\t" 01764 "b.eq 3f\n\t" 01765 "cmp x3, x5\n\t" 01766 "b.le 2b\n\t" 01767 "\n3:\n\t" 01768 "str x6, [%[r], x5]\n\t" 01769 "mov x6, x7\n\t" 01770 "mov x7, x8\n\t" 01771 "mov x8, #0\n\t" 01772 "add x5, x5, #8\n\t" 01773 "cmp x5, 240\n\t" 01774 "b.le 1b\n\t" 01775 "str x6, [%[r], x5]\n\t" 01776 : 01777 : [r] "r" (tmp), [a] "r" (a), [b] "r" (b) 01778 : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11" 01779 ); 01780 01781 XMEMCPY(r, tmp, sizeof(tmp)); 01782 } 01783 01784 /* Square a and put result in r. (r = a * a) 01785 * 01786 * r A single precision integer. 01787 * a A single precision integer. 01788 */ 01789 static void sp_2048_sqr_16(sp_digit* r, const sp_digit* a) 01790 { 01791 sp_digit tmp[32]; 01792 01793 __asm__ __volatile__ ( 01794 "mov x6, 0\n\t" 01795 "mov x7, 0\n\t" 01796 "mov x8, 0\n\t" 01797 "mov x5, 0\n\t" 01798 "\n1:\n\t" 01799 "subs x3, x5, 120\n\t" 01800 "csel x3, xzr, x3, cc\n\t" 01801 "sub x4, x5, x3\n\t" 01802 "\n2:\n\t" 01803 "cmp x4, x3\n\t" 01804 "b.eq 4f\n\t" 01805 "ldr x10, [%[a], x3]\n\t" 01806 "ldr x11, [%[a], x4]\n\t" 01807 "mul x9, x10, x11\n\t" 01808 "umulh x10, x10, x11\n\t" 01809 "adds x6, x6, x9\n\t" 01810 "adcs x7, x7, x10\n\t" 01811 "adc x8, x8, xzr\n\t" 01812 "adds x6, x6, x9\n\t" 01813 "adcs x7, x7, x10\n\t" 01814 "adc x8, x8, xzr\n\t" 01815 "b.al 5f\n\t" 01816 "\n4:\n\t" 01817 "ldr x10, [%[a], x3]\n\t" 01818 "mul x9, x10, x10\n\t" 01819 "umulh x10, x10, x10\n\t" 01820 "adds x6, x6, x9\n\t" 01821 "adcs x7, x7, x10\n\t" 01822 "adc x8, x8, xzr\n\t" 01823 "\n5:\n\t" 01824 "add x3, x3, #8\n\t" 01825 "sub x4, x4, #8\n\t" 01826 "cmp x3, 128\n\t" 01827 "b.eq 3f\n\t" 01828 "cmp x3, x4\n\t" 01829 "b.gt 3f\n\t" 01830 "cmp x3, x5\n\t" 01831 "b.le 2b\n\t" 01832 "\n3:\n\t" 01833 "str x6, [%[r], x5]\n\t" 01834 "mov x6, x7\n\t" 01835 "mov x7, x8\n\t" 01836 "mov x8, #0\n\t" 01837 "add x5, x5, #8\n\t" 01838 "cmp x5, 240\n\t" 01839 "b.le 1b\n\t" 01840 "str x6, [%[r], x5]\n\t" 01841 : 01842 : [r] "r" (tmp), [a] "r" (a) 01843 : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11" 01844 ); 01845 01846 XMEMCPY(r, tmp, sizeof(tmp)); 01847 } 01848 01849 #endif /* WOLFSSL_SP_SMALL */ 01850 #endif /* !SP_RSA_PRIVATE_EXP_D && WOLFSSL_HAVE_SP_RSA */ 01851 01852 /* Caclulate the bottom digit of -1/a mod 2^n. 01853 * 01854 * a A single precision number. 01855 * rho Bottom word of inverse. 01856 */ 01857 static void sp_2048_mont_setup(sp_digit* a, sp_digit* rho) 01858 { 01859 sp_digit x, b; 01860 01861 b = a[0]; 01862 x = (((b + 2) & 4) << 1) + b; /* here x*a==1 mod 2**4 */ 01863 x *= 2 - b * x; /* here x*a==1 mod 2**8 */ 01864 x *= 2 - b * x; /* here x*a==1 mod 2**16 */ 01865 x *= 2 - b * x; /* here x*a==1 mod 2**32 */ 01866 x *= 2 - b * x; /* here x*a==1 mod 2**64 */ 01867 01868 /* rho = -1/m mod b */ 01869 *rho = -x; 01870 } 01871 01872 #if !defined(SP_RSA_PRIVATE_EXP_D) && defined(WOLFSSL_HAVE_SP_RSA) 01873 /* r = 2^n mod m where n is the number of bits to reduce by. 01874 * Given m must be 2048 bits, just need to subtract. 01875 * 01876 * r A single precision number. 01877 * m A signle precision number. 01878 */ 01879 static void sp_2048_mont_norm_16(sp_digit* r, sp_digit* m) 01880 { 01881 XMEMSET(r, 0, sizeof(sp_digit) * 16); 01882 01883 /* r = 2^n mod m */ 01884 sp_2048_sub_in_place_16(r, m); 01885 } 01886 01887 /* Conditionally subtract b from a using the mask m. 01888 * m is -1 to subtract and 0 when not copying. 01889 * 01890 * r A single precision number representing condition subtract result. 01891 * a A single precision number to subtract from. 01892 * b A single precision number to subtract. 01893 * m Mask value to apply. 01894 */ 01895 static sp_digit sp_2048_cond_sub_16(sp_digit* r, sp_digit* a, sp_digit* b, 01896 sp_digit m) 01897 { 01898 sp_digit c = 0; 01899 01900 #ifdef WOLFSSL_SP_SMALL 01901 __asm__ __volatile__ ( 01902 "mov x8, #0\n\t" 01903 "1:\n\t" 01904 "subs %[c], xzr, %[c]\n\t" 01905 "ldr x4, [%[a], x8]\n\t" 01906 "ldr x5, [%[b], x8]\n\t" 01907 "and x5, x5, %[m]\n\t" 01908 "sbcs x4, x4, x5\n\t" 01909 "csetm %[c], cc\n\t" 01910 "str x4, [%[r], x8]\n\t" 01911 "add x8, x8, #8\n\t" 01912 "cmp x8, 128\n\t" 01913 "b.lt 1b\n\t" 01914 : [c] "+r" (c) 01915 : [r] "r" (r), [a] "r" (a), [b] "r" (b), [m] "r" (m) 01916 : "memory", "x4", "x6", "x5", "x7", "x8" 01917 ); 01918 #else 01919 __asm__ __volatile__ ( 01920 01921 "ldr x4, [%[a], 0]\n\t" 01922 "ldr x6, [%[a], 8]\n\t" 01923 "ldr x5, [%[b], 0]\n\t" 01924 "ldr x7, [%[b], 8]\n\t" 01925 "and x5, x5, %[m]\n\t" 01926 "and x7, x7, %[m]\n\t" 01927 "subs x4, x4, x5\n\t" 01928 "sbcs x6, x6, x7\n\t" 01929 "str x4, [%[r], 0]\n\t" 01930 "str x6, [%[r], 8]\n\t" 01931 "ldr x4, [%[a], 16]\n\t" 01932 "ldr x6, [%[a], 24]\n\t" 01933 "ldr x5, [%[b], 16]\n\t" 01934 "ldr x7, [%[b], 24]\n\t" 01935 "and x5, x5, %[m]\n\t" 01936 "and x7, x7, %[m]\n\t" 01937 "sbcs x4, x4, x5\n\t" 01938 "sbcs x6, x6, x7\n\t" 01939 "str x4, [%[r], 16]\n\t" 01940 "str x6, [%[r], 24]\n\t" 01941 "ldr x4, [%[a], 32]\n\t" 01942 "ldr x6, [%[a], 40]\n\t" 01943 "ldr x5, [%[b], 32]\n\t" 01944 "ldr x7, [%[b], 40]\n\t" 01945 "and x5, x5, %[m]\n\t" 01946 "and x7, x7, %[m]\n\t" 01947 "sbcs x4, x4, x5\n\t" 01948 "sbcs x6, x6, x7\n\t" 01949 "str x4, [%[r], 32]\n\t" 01950 "str x6, [%[r], 40]\n\t" 01951 "ldr x4, [%[a], 48]\n\t" 01952 "ldr x6, [%[a], 56]\n\t" 01953 "ldr x5, [%[b], 48]\n\t" 01954 "ldr x7, [%[b], 56]\n\t" 01955 "and x5, x5, %[m]\n\t" 01956 "and x7, x7, %[m]\n\t" 01957 "sbcs x4, x4, x5\n\t" 01958 "sbcs x6, x6, x7\n\t" 01959 "str x4, [%[r], 48]\n\t" 01960 "str x6, [%[r], 56]\n\t" 01961 "ldr x4, [%[a], 64]\n\t" 01962 "ldr x6, [%[a], 72]\n\t" 01963 "ldr x5, [%[b], 64]\n\t" 01964 "ldr x7, [%[b], 72]\n\t" 01965 "and x5, x5, %[m]\n\t" 01966 "and x7, x7, %[m]\n\t" 01967 "sbcs x4, x4, x5\n\t" 01968 "sbcs x6, x6, x7\n\t" 01969 "str x4, [%[r], 64]\n\t" 01970 "str x6, [%[r], 72]\n\t" 01971 "ldr x4, [%[a], 80]\n\t" 01972 "ldr x6, [%[a], 88]\n\t" 01973 "ldr x5, [%[b], 80]\n\t" 01974 "ldr x7, [%[b], 88]\n\t" 01975 "and x5, x5, %[m]\n\t" 01976 "and x7, x7, %[m]\n\t" 01977 "sbcs x4, x4, x5\n\t" 01978 "sbcs x6, x6, x7\n\t" 01979 "str x4, [%[r], 80]\n\t" 01980 "str x6, [%[r], 88]\n\t" 01981 "ldr x4, [%[a], 96]\n\t" 01982 "ldr x6, [%[a], 104]\n\t" 01983 "ldr x5, [%[b], 96]\n\t" 01984 "ldr x7, [%[b], 104]\n\t" 01985 "and x5, x5, %[m]\n\t" 01986 "and x7, x7, %[m]\n\t" 01987 "sbcs x4, x4, x5\n\t" 01988 "sbcs x6, x6, x7\n\t" 01989 "str x4, [%[r], 96]\n\t" 01990 "str x6, [%[r], 104]\n\t" 01991 "ldr x4, [%[a], 112]\n\t" 01992 "ldr x6, [%[a], 120]\n\t" 01993 "ldr x5, [%[b], 112]\n\t" 01994 "ldr x7, [%[b], 120]\n\t" 01995 "and x5, x5, %[m]\n\t" 01996 "and x7, x7, %[m]\n\t" 01997 "sbcs x4, x4, x5\n\t" 01998 "sbcs x6, x6, x7\n\t" 01999 "str x4, [%[r], 112]\n\t" 02000 "str x6, [%[r], 120]\n\t" 02001 "csetm %[c], cc\n\t" 02002 : [c] "+r" (c) 02003 : [r] "r" (r), [a] "r" (a), [b] "r" (b), [m] "r" (m) 02004 : "memory", "x4", "x6", "x5", "x7", "x8" 02005 ); 02006 #endif /* WOLFSSL_SP_SMALL */ 02007 02008 return c; 02009 } 02010 02011 /* Reduce the number back to 2048 bits using Montgomery reduction. 02012 * 02013 * a A single precision number to reduce in place. 02014 * m The single precision number representing the modulus. 02015 * mp The digit representing the negative inverse of m mod 2^n. 02016 */ 02017 SP_NOINLINE static void sp_2048_mont_reduce_16(sp_digit* a, sp_digit* m, 02018 sp_digit mp) 02019 { 02020 sp_digit ca = 0; 02021 02022 __asm__ __volatile__ ( 02023 "ldp x12, x13, [%[m], 0]\n\t" 02024 "ldp x14, x15, [%[m], 16]\n\t" 02025 "ldp x16, x17, [%[m], 32]\n\t" 02026 "ldp x18, x19, [%[m], 48]\n\t" 02027 "ldp x20, x21, [%[m], 64]\n\t" 02028 "ldp x22, x23, [%[m], 80]\n\t" 02029 "ldp x24, x25, [%[m], 96]\n\t" 02030 "ldp x26, x27, [%[m], 112]\n\t" 02031 "# i = 0\n\t" 02032 "mov x3, 0\n\t" 02033 "ldp x10, x11, [%[a], 0]\n\t" 02034 "\n1:\n\t" 02035 "# mu = a[i] * mp\n\t" 02036 "mul x8, %[mp], x10\n\t" 02037 "# a[i+0] += m[0] * mu\n\t" 02038 "ldr x9, [%[a], 0]\n\t" 02039 "mul x6, x12, x8\n\t" 02040 "umulh x7, x12, x8\n\t" 02041 "adds x10, x10, x6\n\t" 02042 "adc x5, x7, xzr\n\t" 02043 "# a[i+1] += m[1] * mu\n\t" 02044 "ldr x9, [%[a], 8]\n\t" 02045 "mul x6, x13, x8\n\t" 02046 "umulh x7, x13, x8\n\t" 02047 "adds x10, x11, x6\n\t" 02048 "adc x4, x7, xzr\n\t" 02049 "adds x10, x10, x5\n\t" 02050 "adc x4, x4, xzr\n\t" 02051 "# a[i+2] += m[2] * mu\n\t" 02052 "ldr x11, [%[a], 16]\n\t" 02053 "mul x6, x14, x8\n\t" 02054 "umulh x7, x14, x8\n\t" 02055 "adds x11, x11, x6\n\t" 02056 "adc x5, x7, xzr\n\t" 02057 "adds x11, x11, x4\n\t" 02058 "adc x5, x5, xzr\n\t" 02059 "# a[i+3] += m[3] * mu\n\t" 02060 "ldr x9, [%[a], 24]\n\t" 02061 "mul x6, x15, x8\n\t" 02062 "umulh x7, x15, x8\n\t" 02063 "adds x9, x9, x6\n\t" 02064 "adc x4, x7, xzr\n\t" 02065 "adds x9, x9, x5\n\t" 02066 "str x9, [%[a], 24]\n\t" 02067 "adc x4, x4, xzr\n\t" 02068 "# a[i+4] += m[4] * mu\n\t" 02069 "ldr x9, [%[a], 32]\n\t" 02070 "mul x6, x16, x8\n\t" 02071 "umulh x7, x16, x8\n\t" 02072 "adds x9, x9, x6\n\t" 02073 "adc x5, x7, xzr\n\t" 02074 "adds x9, x9, x4\n\t" 02075 "str x9, [%[a], 32]\n\t" 02076 "adc x5, x5, xzr\n\t" 02077 "# a[i+5] += m[5] * mu\n\t" 02078 "ldr x9, [%[a], 40]\n\t" 02079 "mul x6, x17, x8\n\t" 02080 "umulh x7, x17, x8\n\t" 02081 "adds x9, x9, x6\n\t" 02082 "adc x4, x7, xzr\n\t" 02083 "adds x9, x9, x5\n\t" 02084 "str x9, [%[a], 40]\n\t" 02085 "adc x4, x4, xzr\n\t" 02086 "# a[i+6] += m[6] * mu\n\t" 02087 "ldr x9, [%[a], 48]\n\t" 02088 "mul x6, x18, x8\n\t" 02089 "umulh x7, x18, x8\n\t" 02090 "adds x9, x9, x6\n\t" 02091 "adc x5, x7, xzr\n\t" 02092 "adds x9, x9, x4\n\t" 02093 "str x9, [%[a], 48]\n\t" 02094 "adc x5, x5, xzr\n\t" 02095 "# a[i+7] += m[7] * mu\n\t" 02096 "ldr x9, [%[a], 56]\n\t" 02097 "mul x6, x19, x8\n\t" 02098 "umulh x7, x19, x8\n\t" 02099 "adds x9, x9, x6\n\t" 02100 "adc x4, x7, xzr\n\t" 02101 "adds x9, x9, x5\n\t" 02102 "str x9, [%[a], 56]\n\t" 02103 "adc x4, x4, xzr\n\t" 02104 "# a[i+8] += m[8] * mu\n\t" 02105 "ldr x9, [%[a], 64]\n\t" 02106 "mul x6, x20, x8\n\t" 02107 "umulh x7, x20, x8\n\t" 02108 "adds x9, x9, x6\n\t" 02109 "adc x5, x7, xzr\n\t" 02110 "adds x9, x9, x4\n\t" 02111 "str x9, [%[a], 64]\n\t" 02112 "adc x5, x5, xzr\n\t" 02113 "# a[i+9] += m[9] * mu\n\t" 02114 "ldr x9, [%[a], 72]\n\t" 02115 "mul x6, x21, x8\n\t" 02116 "umulh x7, x21, x8\n\t" 02117 "adds x9, x9, x6\n\t" 02118 "adc x4, x7, xzr\n\t" 02119 "adds x9, x9, x5\n\t" 02120 "str x9, [%[a], 72]\n\t" 02121 "adc x4, x4, xzr\n\t" 02122 "# a[i+10] += m[10] * mu\n\t" 02123 "ldr x9, [%[a], 80]\n\t" 02124 "mul x6, x22, x8\n\t" 02125 "umulh x7, x22, x8\n\t" 02126 "adds x9, x9, x6\n\t" 02127 "adc x5, x7, xzr\n\t" 02128 "adds x9, x9, x4\n\t" 02129 "str x9, [%[a], 80]\n\t" 02130 "adc x5, x5, xzr\n\t" 02131 "# a[i+11] += m[11] * mu\n\t" 02132 "ldr x9, [%[a], 88]\n\t" 02133 "mul x6, x23, x8\n\t" 02134 "umulh x7, x23, x8\n\t" 02135 "adds x9, x9, x6\n\t" 02136 "adc x4, x7, xzr\n\t" 02137 "adds x9, x9, x5\n\t" 02138 "str x9, [%[a], 88]\n\t" 02139 "adc x4, x4, xzr\n\t" 02140 "# a[i+12] += m[12] * mu\n\t" 02141 "ldr x9, [%[a], 96]\n\t" 02142 "mul x6, x24, x8\n\t" 02143 "umulh x7, x24, x8\n\t" 02144 "adds x9, x9, x6\n\t" 02145 "adc x5, x7, xzr\n\t" 02146 "adds x9, x9, x4\n\t" 02147 "str x9, [%[a], 96]\n\t" 02148 "adc x5, x5, xzr\n\t" 02149 "# a[i+13] += m[13] * mu\n\t" 02150 "ldr x9, [%[a], 104]\n\t" 02151 "mul x6, x25, x8\n\t" 02152 "umulh x7, x25, x8\n\t" 02153 "adds x9, x9, x6\n\t" 02154 "adc x4, x7, xzr\n\t" 02155 "adds x9, x9, x5\n\t" 02156 "str x9, [%[a], 104]\n\t" 02157 "adc x4, x4, xzr\n\t" 02158 "# a[i+14] += m[14] * mu\n\t" 02159 "ldr x9, [%[a], 112]\n\t" 02160 "mul x6, x26, x8\n\t" 02161 "umulh x7, x26, x8\n\t" 02162 "adds x9, x9, x6\n\t" 02163 "adc x5, x7, xzr\n\t" 02164 "adds x9, x9, x4\n\t" 02165 "str x9, [%[a], 112]\n\t" 02166 "adc x5, x5, xzr\n\t" 02167 "# a[i+15] += m[15] * mu\n\t" 02168 "ldr x9, [%[a], 120]\n\t" 02169 "mul x6, x27, x8\n\t" 02170 "umulh x7, x27, x8\n\t" 02171 "adds x5, x5, x6\n\t" 02172 "adcs x7, x7, %[ca]\n\t" 02173 "cset %[ca], cs\n\t" 02174 "adds x9, x9, x5\n\t" 02175 "str x9, [%[a], 120]\n\t" 02176 "ldr x9, [%[a], 128]\n\t" 02177 "adcs x9, x9, x7\n\t" 02178 "str x9, [%[a], 128]\n\t" 02179 "adc %[ca], %[ca], xzr\n\t" 02180 "# i += 1\n\t" 02181 "add %[a], %[a], 8\n\t" 02182 "add x3, x3, 8\n\t" 02183 "cmp x3, 128\n\t" 02184 "blt 1b\n\t" 02185 "str x10, [%[a], 0]\n\t" 02186 "str x11, [%[a], 8]\n\t" 02187 : [ca] "+r" (ca), [a] "+r" (a) 02188 : [m] "r" (m), [mp] "r" (mp) 02189 : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21", "x22", "x23", "x24", "x25", "x26", "x27" 02190 ); 02191 02192 sp_2048_cond_sub_16(a - 16, a, m, (sp_digit)0 - ca); 02193 } 02194 02195 /* Multiply two Montogmery form numbers mod the modulus (prime). 02196 * (r = a * b mod m) 02197 * 02198 * r Result of multiplication. 02199 * a First number to multiply in Montogmery form. 02200 * b Second number to multiply in Montogmery form. 02201 * m Modulus (prime). 02202 * mp Montogmery mulitplier. 02203 */ 02204 static void sp_2048_mont_mul_16(sp_digit* r, sp_digit* a, sp_digit* b, 02205 sp_digit* m, sp_digit mp) 02206 { 02207 sp_2048_mul_16(r, a, b); 02208 sp_2048_mont_reduce_16(r, m, mp); 02209 } 02210 02211 /* Square the Montgomery form number. (r = a * a mod m) 02212 * 02213 * r Result of squaring. 02214 * a Number to square in Montogmery form. 02215 * m Modulus (prime). 02216 * mp Montogmery mulitplier. 02217 */ 02218 static void sp_2048_mont_sqr_16(sp_digit* r, sp_digit* a, sp_digit* m, 02219 sp_digit mp) 02220 { 02221 sp_2048_sqr_16(r, a); 02222 sp_2048_mont_reduce_16(r, m, mp); 02223 } 02224 02225 /* Mul a by digit b into r. (r = a * b) 02226 * 02227 * r A single precision integer. 02228 * a A single precision integer. 02229 * b A single precision digit. 02230 */ 02231 static void sp_2048_mul_d_16(sp_digit* r, const sp_digit* a, 02232 const sp_digit b) 02233 { 02234 #ifdef WOLFSSL_SP_SMALL 02235 __asm__ __volatile__ ( 02236 "# A[0] * B\n\t" 02237 "ldr x8, [%[a]]\n\t" 02238 "mul x5, %[b], x8\n\t" 02239 "umulh x3, %[b], x8\n\t" 02240 "mov x4, 0\n\t" 02241 "str x5, [%[r]]\n\t" 02242 "mov x5, 0\n\t" 02243 "mov x9, #8\n\t" 02244 "1:\n\t" 02245 "ldr x8, [%[a], x9]\n\t" 02246 "mul x6, %[b], x8\n\t" 02247 "umulh x7, %[b], x8\n\t" 02248 "adds x3, x3, x6\n\t" 02249 "adcs x4, x4, x7\n\t" 02250 "adc x5, xzr, xzr\n\t" 02251 "str x3, [%[r], x9]\n\t" 02252 "mov x3, x4\n\t" 02253 "mov x4, x5\n\t" 02254 "mov x5, #0\n\t" 02255 "add x9, x9, #8\n\t" 02256 "cmp x9, 128\n\t" 02257 "b.lt 1b\n\t" 02258 "str x3, [%[r], 128]\n\t" 02259 : 02260 : [r] "r" (r), [a] "r" (a), [b] "r" (b) 02261 : "memory", "x3", "x4", "x5", "x6", "x7", "x8" 02262 ); 02263 #else 02264 __asm__ __volatile__ ( 02265 "# A[0] * B\n\t" 02266 "ldr x8, [%[a]]\n\t" 02267 "mul x3, %[b], x8\n\t" 02268 "umulh x4, %[b], x8\n\t" 02269 "mov x5, 0\n\t" 02270 "str x3, [%[r]]\n\t" 02271 "# A[1] * B\n\t" 02272 "ldr x8, [%[a], 8]\n\t" 02273 "mov x3, 0\n\t" 02274 "mul x6, %[b], x8\n\t" 02275 "umulh x7, %[b], x8\n\t" 02276 "adds x4, x4, x6\n\t" 02277 "adcs x5, x5, x7\n\t" 02278 "adc x3, xzr, xzr\n\t" 02279 "str x4, [%[r], 8]\n\t" 02280 "# A[2] * B\n\t" 02281 "ldr x8, [%[a], 16]\n\t" 02282 "mov x4, 0\n\t" 02283 "mul x6, %[b], x8\n\t" 02284 "umulh x7, %[b], x8\n\t" 02285 "adds x5, x5, x6\n\t" 02286 "adcs x3, x3, x7\n\t" 02287 "adc x4, xzr, xzr\n\t" 02288 "str x5, [%[r], 16]\n\t" 02289 "# A[3] * B\n\t" 02290 "ldr x8, [%[a], 24]\n\t" 02291 "mov x5, 0\n\t" 02292 "mul x6, %[b], x8\n\t" 02293 "umulh x7, %[b], x8\n\t" 02294 "adds x3, x3, x6\n\t" 02295 "adcs x4, x4, x7\n\t" 02296 "adc x5, xzr, xzr\n\t" 02297 "str x3, [%[r], 24]\n\t" 02298 "# A[4] * B\n\t" 02299 "ldr x8, [%[a], 32]\n\t" 02300 "mov x3, 0\n\t" 02301 "mul x6, %[b], x8\n\t" 02302 "umulh x7, %[b], x8\n\t" 02303 "adds x4, x4, x6\n\t" 02304 "adcs x5, x5, x7\n\t" 02305 "adc x3, xzr, xzr\n\t" 02306 "str x4, [%[r], 32]\n\t" 02307 "# A[5] * B\n\t" 02308 "ldr x8, [%[a], 40]\n\t" 02309 "mov x4, 0\n\t" 02310 "mul x6, %[b], x8\n\t" 02311 "umulh x7, %[b], x8\n\t" 02312 "adds x5, x5, x6\n\t" 02313 "adcs x3, x3, x7\n\t" 02314 "adc x4, xzr, xzr\n\t" 02315 "str x5, [%[r], 40]\n\t" 02316 "# A[6] * B\n\t" 02317 "ldr x8, [%[a], 48]\n\t" 02318 "mov x5, 0\n\t" 02319 "mul x6, %[b], x8\n\t" 02320 "umulh x7, %[b], x8\n\t" 02321 "adds x3, x3, x6\n\t" 02322 "adcs x4, x4, x7\n\t" 02323 "adc x5, xzr, xzr\n\t" 02324 "str x3, [%[r], 48]\n\t" 02325 "# A[7] * B\n\t" 02326 "ldr x8, [%[a], 56]\n\t" 02327 "mov x3, 0\n\t" 02328 "mul x6, %[b], x8\n\t" 02329 "umulh x7, %[b], x8\n\t" 02330 "adds x4, x4, x6\n\t" 02331 "adcs x5, x5, x7\n\t" 02332 "adc x3, xzr, xzr\n\t" 02333 "str x4, [%[r], 56]\n\t" 02334 "# A[8] * B\n\t" 02335 "ldr x8, [%[a], 64]\n\t" 02336 "mov x4, 0\n\t" 02337 "mul x6, %[b], x8\n\t" 02338 "umulh x7, %[b], x8\n\t" 02339 "adds x5, x5, x6\n\t" 02340 "adcs x3, x3, x7\n\t" 02341 "adc x4, xzr, xzr\n\t" 02342 "str x5, [%[r], 64]\n\t" 02343 "# A[9] * B\n\t" 02344 "ldr x8, [%[a], 72]\n\t" 02345 "mov x5, 0\n\t" 02346 "mul x6, %[b], x8\n\t" 02347 "umulh x7, %[b], x8\n\t" 02348 "adds x3, x3, x6\n\t" 02349 "adcs x4, x4, x7\n\t" 02350 "adc x5, xzr, xzr\n\t" 02351 "str x3, [%[r], 72]\n\t" 02352 "# A[10] * B\n\t" 02353 "ldr x8, [%[a], 80]\n\t" 02354 "mov x3, 0\n\t" 02355 "mul x6, %[b], x8\n\t" 02356 "umulh x7, %[b], x8\n\t" 02357 "adds x4, x4, x6\n\t" 02358 "adcs x5, x5, x7\n\t" 02359 "adc x3, xzr, xzr\n\t" 02360 "str x4, [%[r], 80]\n\t" 02361 "# A[11] * B\n\t" 02362 "ldr x8, [%[a], 88]\n\t" 02363 "mov x4, 0\n\t" 02364 "mul x6, %[b], x8\n\t" 02365 "umulh x7, %[b], x8\n\t" 02366 "adds x5, x5, x6\n\t" 02367 "adcs x3, x3, x7\n\t" 02368 "adc x4, xzr, xzr\n\t" 02369 "str x5, [%[r], 88]\n\t" 02370 "# A[12] * B\n\t" 02371 "ldr x8, [%[a], 96]\n\t" 02372 "mov x5, 0\n\t" 02373 "mul x6, %[b], x8\n\t" 02374 "umulh x7, %[b], x8\n\t" 02375 "adds x3, x3, x6\n\t" 02376 "adcs x4, x4, x7\n\t" 02377 "adc x5, xzr, xzr\n\t" 02378 "str x3, [%[r], 96]\n\t" 02379 "# A[13] * B\n\t" 02380 "ldr x8, [%[a], 104]\n\t" 02381 "mov x3, 0\n\t" 02382 "mul x6, %[b], x8\n\t" 02383 "umulh x7, %[b], x8\n\t" 02384 "adds x4, x4, x6\n\t" 02385 "adcs x5, x5, x7\n\t" 02386 "adc x3, xzr, xzr\n\t" 02387 "str x4, [%[r], 104]\n\t" 02388 "# A[14] * B\n\t" 02389 "ldr x8, [%[a], 112]\n\t" 02390 "mov x4, 0\n\t" 02391 "mul x6, %[b], x8\n\t" 02392 "umulh x7, %[b], x8\n\t" 02393 "adds x5, x5, x6\n\t" 02394 "adcs x3, x3, x7\n\t" 02395 "adc x4, xzr, xzr\n\t" 02396 "str x5, [%[r], 112]\n\t" 02397 "# A[15] * B\n\t" 02398 "ldr x8, [%[a], 120]\n\t" 02399 "mul x6, %[b], x8\n\t" 02400 "umulh x7, %[b], x8\n\t" 02401 "adds x3, x3, x6\n\t" 02402 "adc x4, x4, x7\n\t" 02403 "str x3, [%[r], 120]\n\t" 02404 "str x4, [%[r], 128]\n\t" 02405 : 02406 : [r] "r" (r), [a] "r" (a), [b] "r" (b) 02407 : "memory", "x3", "x4", "x5", "x6", "x7", "x8" 02408 ); 02409 #endif 02410 } 02411 02412 /* Divide the double width number (d1|d0) by the dividend. (d1|d0 / div) 02413 * 02414 * d1 The high order half of the number to divide. 02415 * d0 The low order half of the number to divide. 02416 * div The dividend. 02417 * returns the result of the division. 02418 */ 02419 static sp_digit div_2048_word_16(sp_digit d1, sp_digit d0, sp_digit div) 02420 { 02421 sp_digit r; 02422 02423 __asm__ __volatile__ ( 02424 "lsr x5, %[div], 32\n\t" 02425 "add x5, x5, 1\n\t" 02426 02427 "udiv x3, %[d1], x5\n\t" 02428 "lsl x6, x3, 32\n\t" 02429 "mul x4, %[div], x6\n\t" 02430 "umulh x3, %[div], x6\n\t" 02431 "subs %[d0], %[d0], x4\n\t" 02432 "sbc %[d1], %[d1], x3\n\t" 02433 02434 "udiv x3, %[d1], x5\n\t" 02435 "lsl x3, x3, 32\n\t" 02436 "add x6, x6, x3\n\t" 02437 "mul x4, %[div], x3\n\t" 02438 "umulh x3, %[div], x3\n\t" 02439 "subs %[d0], %[d0], x4\n\t" 02440 "sbc %[d1], %[d1], x3\n\t" 02441 02442 "lsl x3, %[d1], 32\n\t" 02443 "orr x3, x3, %[d0], lsr 32\n\t" 02444 02445 "udiv x3, x3, x5\n\t" 02446 "add x6, x6, x3\n\t" 02447 "mul x4, %[div], x3\n\t" 02448 "umulh x3, %[div], x3\n\t" 02449 "subs %[d0], %[d0], x4\n\t" 02450 "sbc %[d1], %[d1], x3\n\t" 02451 02452 "lsl x3, %[d1], 32\n\t" 02453 "orr x3, x3, %[d0], lsr 32\n\t" 02454 02455 "udiv x3, x3, x5\n\t" 02456 "add x6, x6, x3\n\t" 02457 "mul x4, %[div], x3\n\t" 02458 "umulh x3, %[div], x3\n\t" 02459 "subs %[d0], %[d0], x4\n\t" 02460 "sbc %[d1], %[d1], x3\n\t" 02461 02462 "udiv x3, %[d0], %[div]\n\t" 02463 "add x6, x6, x3\n\t" 02464 "mul x3, %[div], x3\n\t" 02465 "sub %[d0], %[d0], x3\n\t" 02466 "mov %[r], x6\n\t" 02467 02468 : [r] "=r" (r) 02469 : [d1] "r" (d1), [d0] "r" (d0), [div] "r" (div) 02470 : "x3", "x4", "x5", "x6" 02471 ); 02472 02473 return r; 02474 } 02475 02476 /* Compare a with b in constant time. 02477 * 02478 * a A single precision integer. 02479 * b A single precision integer. 02480 * return -ve, 0 or +ve if a is less than, equal to or greater than b 02481 * respectively. 02482 */ 02483 static int64_t sp_2048_cmp_16(sp_digit* a, sp_digit* b) 02484 { 02485 sp_digit r = -1; 02486 sp_digit one = 1; 02487 02488 #ifdef WOLFSSL_SP_SMALL 02489 __asm__ __volatile__ ( 02490 "mov x3, -1\n\t" 02491 "mov x6, 120\n\t" 02492 "1:\n\t" 02493 "ldr x4, [%[a], x6]\n\t" 02494 "ldr x5, [%[b], x6]\n\t" 02495 "and x4, x4, x3\n\t" 02496 "and x5, x5, x3\n\t" 02497 "subs x4, x4, x5\n\t" 02498 "csel %[r], %[one], %[r], hi\n\t" 02499 "csel %[r], x3, %[r], lo\n\t" 02500 "csel x3, x3, xzr, eq\n\t" 02501 "sub x6, x6, #8\n\t" 02502 "b.cc 1b\n\t" 02503 "eor %[r], %[r], x3\n\t" 02504 : [r] "+r" (r) 02505 : [a] "r" (a), [b] "r" (b), [one] "r" (one) 02506 : "x2", "x3", "x4", "x5", "x6" 02507 ); 02508 #else 02509 __asm__ __volatile__ ( 02510 "mov x3, -1\n\t" 02511 "ldr x4, [%[a], 120]\n\t" 02512 "ldr x5, [%[b], 120]\n\t" 02513 "and x4, x4, x3\n\t" 02514 "and x5, x5, x3\n\t" 02515 "subs x4, x4, x5\n\t" 02516 "csel %[r], %[one], %[r], hi\n\t" 02517 "csel %[r], x3, %[r], lo\n\t" 02518 "csel x3, x3, xzr, eq\n\t" 02519 "ldr x4, [%[a], 112]\n\t" 02520 "ldr x5, [%[b], 112]\n\t" 02521 "and x4, x4, x3\n\t" 02522 "and x5, x5, x3\n\t" 02523 "subs x4, x4, x5\n\t" 02524 "csel %[r], %[one], %[r], hi\n\t" 02525 "csel %[r], x3, %[r], lo\n\t" 02526 "csel x3, x3, xzr, eq\n\t" 02527 "ldr x4, [%[a], 104]\n\t" 02528 "ldr x5, [%[b], 104]\n\t" 02529 "and x4, x4, x3\n\t" 02530 "and x5, x5, x3\n\t" 02531 "subs x4, x4, x5\n\t" 02532 "csel %[r], %[one], %[r], hi\n\t" 02533 "csel %[r], x3, %[r], lo\n\t" 02534 "csel x3, x3, xzr, eq\n\t" 02535 "ldr x4, [%[a], 96]\n\t" 02536 "ldr x5, [%[b], 96]\n\t" 02537 "and x4, x4, x3\n\t" 02538 "and x5, x5, x3\n\t" 02539 "subs x4, x4, x5\n\t" 02540 "csel %[r], %[one], %[r], hi\n\t" 02541 "csel %[r], x3, %[r], lo\n\t" 02542 "csel x3, x3, xzr, eq\n\t" 02543 "ldr x4, [%[a], 88]\n\t" 02544 "ldr x5, [%[b], 88]\n\t" 02545 "and x4, x4, x3\n\t" 02546 "and x5, x5, x3\n\t" 02547 "subs x4, x4, x5\n\t" 02548 "csel %[r], %[one], %[r], hi\n\t" 02549 "csel %[r], x3, %[r], lo\n\t" 02550 "csel x3, x3, xzr, eq\n\t" 02551 "ldr x4, [%[a], 80]\n\t" 02552 "ldr x5, [%[b], 80]\n\t" 02553 "and x4, x4, x3\n\t" 02554 "and x5, x5, x3\n\t" 02555 "subs x4, x4, x5\n\t" 02556 "csel %[r], %[one], %[r], hi\n\t" 02557 "csel %[r], x3, %[r], lo\n\t" 02558 "csel x3, x3, xzr, eq\n\t" 02559 "ldr x4, [%[a], 72]\n\t" 02560 "ldr x5, [%[b], 72]\n\t" 02561 "and x4, x4, x3\n\t" 02562 "and x5, x5, x3\n\t" 02563 "subs x4, x4, x5\n\t" 02564 "csel %[r], %[one], %[r], hi\n\t" 02565 "csel %[r], x3, %[r], lo\n\t" 02566 "csel x3, x3, xzr, eq\n\t" 02567 "ldr x4, [%[a], 64]\n\t" 02568 "ldr x5, [%[b], 64]\n\t" 02569 "and x4, x4, x3\n\t" 02570 "and x5, x5, x3\n\t" 02571 "subs x4, x4, x5\n\t" 02572 "csel %[r], %[one], %[r], hi\n\t" 02573 "csel %[r], x3, %[r], lo\n\t" 02574 "csel x3, x3, xzr, eq\n\t" 02575 "ldr x4, [%[a], 56]\n\t" 02576 "ldr x5, [%[b], 56]\n\t" 02577 "and x4, x4, x3\n\t" 02578 "and x5, x5, x3\n\t" 02579 "subs x4, x4, x5\n\t" 02580 "csel %[r], %[one], %[r], hi\n\t" 02581 "csel %[r], x3, %[r], lo\n\t" 02582 "csel x3, x3, xzr, eq\n\t" 02583 "ldr x4, [%[a], 48]\n\t" 02584 "ldr x5, [%[b], 48]\n\t" 02585 "and x4, x4, x3\n\t" 02586 "and x5, x5, x3\n\t" 02587 "subs x4, x4, x5\n\t" 02588 "csel %[r], %[one], %[r], hi\n\t" 02589 "csel %[r], x3, %[r], lo\n\t" 02590 "csel x3, x3, xzr, eq\n\t" 02591 "ldr x4, [%[a], 40]\n\t" 02592 "ldr x5, [%[b], 40]\n\t" 02593 "and x4, x4, x3\n\t" 02594 "and x5, x5, x3\n\t" 02595 "subs x4, x4, x5\n\t" 02596 "csel %[r], %[one], %[r], hi\n\t" 02597 "csel %[r], x3, %[r], lo\n\t" 02598 "csel x3, x3, xzr, eq\n\t" 02599 "ldr x4, [%[a], 32]\n\t" 02600 "ldr x5, [%[b], 32]\n\t" 02601 "and x4, x4, x3\n\t" 02602 "and x5, x5, x3\n\t" 02603 "subs x4, x4, x5\n\t" 02604 "csel %[r], %[one], %[r], hi\n\t" 02605 "csel %[r], x3, %[r], lo\n\t" 02606 "csel x3, x3, xzr, eq\n\t" 02607 "ldr x4, [%[a], 24]\n\t" 02608 "ldr x5, [%[b], 24]\n\t" 02609 "and x4, x4, x3\n\t" 02610 "and x5, x5, x3\n\t" 02611 "subs x4, x4, x5\n\t" 02612 "csel %[r], %[one], %[r], hi\n\t" 02613 "csel %[r], x3, %[r], lo\n\t" 02614 "csel x3, x3, xzr, eq\n\t" 02615 "ldr x4, [%[a], 16]\n\t" 02616 "ldr x5, [%[b], 16]\n\t" 02617 "and x4, x4, x3\n\t" 02618 "and x5, x5, x3\n\t" 02619 "subs x4, x4, x5\n\t" 02620 "csel %[r], %[one], %[r], hi\n\t" 02621 "csel %[r], x3, %[r], lo\n\t" 02622 "csel x3, x3, xzr, eq\n\t" 02623 "ldr x4, [%[a], 8]\n\t" 02624 "ldr x5, [%[b], 8]\n\t" 02625 "and x4, x4, x3\n\t" 02626 "and x5, x5, x3\n\t" 02627 "subs x4, x4, x5\n\t" 02628 "csel %[r], %[one], %[r], hi\n\t" 02629 "csel %[r], x3, %[r], lo\n\t" 02630 "csel x3, x3, xzr, eq\n\t" 02631 "ldr x4, [%[a], 0]\n\t" 02632 "ldr x5, [%[b], 0]\n\t" 02633 "and x4, x4, x3\n\t" 02634 "and x5, x5, x3\n\t" 02635 "subs x4, x4, x5\n\t" 02636 "csel %[r], %[one], %[r], hi\n\t" 02637 "csel %[r], x3, %[r], lo\n\t" 02638 "csel x3, x3, xzr, eq\n\t" 02639 "eor %[r], %[r], x3\n\t" 02640 : [r] "+r" (r) 02641 : [a] "r" (a), [b] "r" (b), [one] "r" (one) 02642 : "x2", "x3", "x4", "x5", "x6" 02643 ); 02644 #endif 02645 02646 return r; 02647 } 02648 02649 /* Divide d in a and put remainder into r (m*d + r = a) 02650 * m is not calculated as it is not needed at this time. 02651 * 02652 * a Nmber to be divided. 02653 * d Number to divide with. 02654 * m Multiplier result. 02655 * r Remainder from the division. 02656 * returns MP_OKAY indicating success. 02657 */ 02658 static WC_INLINE int sp_2048_div_16(sp_digit* a, sp_digit* d, sp_digit* m, 02659 sp_digit* r) 02660 { 02661 sp_digit t1[32], t2[17]; 02662 sp_digit div, r1; 02663 int i; 02664 02665 (void)m; 02666 02667 div = d[15]; 02668 XMEMCPY(t1, a, sizeof(*t1) * 2 * 16); 02669 for (i=15; i>=0; i--) { 02670 r1 = div_2048_word_16(t1[16 + i], t1[16 + i - 1], div); 02671 02672 sp_2048_mul_d_16(t2, d, r1); 02673 t1[16 + i] += sp_2048_sub_in_place_16(&t1[i], t2); 02674 t1[16 + i] -= t2[16]; 02675 sp_2048_mask_16(t2, d, t1[16 + i]); 02676 t1[16 + i] += sp_2048_add_16(&t1[i], &t1[i], t2); 02677 sp_2048_mask_16(t2, d, t1[16 + i]); 02678 t1[16 + i] += sp_2048_add_16(&t1[i], &t1[i], t2); 02679 } 02680 02681 r1 = sp_2048_cmp_16(t1, d) >= 0; 02682 sp_2048_cond_sub_16(r, t1, t2, (sp_digit)0 - r1); 02683 02684 return MP_OKAY; 02685 } 02686 02687 /* Reduce a modulo m into r. (r = a mod m) 02688 * 02689 * r A single precision number that is the reduced result. 02690 * a A single precision number that is to be reduced. 02691 * m A single precision number that is the modulus to reduce with. 02692 * returns MP_OKAY indicating success. 02693 */ 02694 static WC_INLINE int sp_2048_mod_16(sp_digit* r, sp_digit* a, sp_digit* m) 02695 { 02696 return sp_2048_div_16(a, m, NULL, r); 02697 } 02698 02699 #ifdef WOLFSSL_SP_SMALL 02700 /* Modular exponentiate a to the e mod m. (r = a^e mod m) 02701 * 02702 * r A single precision number that is the result of the operation. 02703 * a A single precision number being exponentiated. 02704 * e A single precision number that is the exponent. 02705 * bits The number of bits in the exponent. 02706 * m A single precision number that is the modulus. 02707 * returns 0 on success and MEMORY_E on dynamic memory allocation failure. 02708 */ 02709 static int sp_2048_mod_exp_16(sp_digit* r, sp_digit* a, sp_digit* e, 02710 int bits, sp_digit* m, int reduceA) 02711 { 02712 #ifndef WOLFSSL_SMALL_STACK 02713 sp_digit t[16][32]; 02714 #else 02715 sp_digit* t[16]; 02716 sp_digit* td; 02717 #endif 02718 sp_digit* norm; 02719 sp_digit mp = 1; 02720 sp_digit n; 02721 sp_digit mask; 02722 int i; 02723 int c, y; 02724 int err = MP_OKAY; 02725 02726 #ifdef WOLFSSL_SMALL_STACK 02727 td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 16 * 32, NULL, 02728 DYNAMIC_TYPE_TMP_BUFFER); 02729 if (td == NULL) 02730 err = MEMORY_E; 02731 02732 if (err == MP_OKAY) { 02733 for (i=0; i<16; i++) 02734 t[i] = td + i * 32; 02735 norm = t[0]; 02736 } 02737 #else 02738 norm = t[0]; 02739 #endif 02740 02741 if (err == MP_OKAY) { 02742 sp_2048_mont_setup(m, &mp); 02743 sp_2048_mont_norm_16(norm, m); 02744 02745 XMEMSET(t[1], 0, sizeof(sp_digit) * 16); 02746 if (reduceA) { 02747 err = sp_2048_mod_16(t[1] + 16, a, m); 02748 if (err == MP_OKAY) 02749 err = sp_2048_mod_16(t[1], t[1], m); 02750 } 02751 else { 02752 XMEMCPY(t[1] + 16, a, sizeof(sp_digit) * 16); 02753 err = sp_2048_mod_16(t[1], t[1], m); 02754 } 02755 } 02756 02757 if (err == MP_OKAY) { 02758 sp_2048_mont_sqr_16(t[ 2], t[ 1], m, mp); 02759 sp_2048_mont_mul_16(t[ 3], t[ 2], t[ 1], m, mp); 02760 sp_2048_mont_sqr_16(t[ 4], t[ 2], m, mp); 02761 sp_2048_mont_mul_16(t[ 5], t[ 3], t[ 2], m, mp); 02762 sp_2048_mont_sqr_16(t[ 6], t[ 3], m, mp); 02763 sp_2048_mont_mul_16(t[ 7], t[ 4], t[ 3], m, mp); 02764 sp_2048_mont_sqr_16(t[ 8], t[ 4], m, mp); 02765 sp_2048_mont_mul_16(t[ 9], t[ 5], t[ 4], m, mp); 02766 sp_2048_mont_sqr_16(t[10], t[ 5], m, mp); 02767 sp_2048_mont_mul_16(t[11], t[ 6], t[ 5], m, mp); 02768 sp_2048_mont_sqr_16(t[12], t[ 6], m, mp); 02769 sp_2048_mont_mul_16(t[13], t[ 7], t[ 6], m, mp); 02770 sp_2048_mont_sqr_16(t[14], t[ 7], m, mp); 02771 sp_2048_mont_mul_16(t[15], t[ 8], t[ 7], m, mp); 02772 02773 i = (bits - 1) / 64; 02774 n = e[i--]; 02775 y = n >> 60; 02776 n <<= 4; 02777 c = 60; 02778 XMEMCPY(r, t[y], sizeof(sp_digit) * 16); 02779 for (; i>=0 || c>=4; ) { 02780 if (c == 0) { 02781 n = e[i--]; 02782 y = n >> 60; 02783 n <<= 4; 02784 c = 60; 02785 } 02786 else if (c < 4) { 02787 y = n >> 60; 02788 n = e[i--]; 02789 c = 4 - c; 02790 y |= n >> (64 - c); 02791 n <<= c; 02792 c = 64 - c; 02793 } 02794 else { 02795 y = (n >> 60) & 0xf; 02796 n <<= 4; 02797 c -= 4; 02798 } 02799 02800 sp_2048_mont_sqr_16(r, r, m, mp); 02801 sp_2048_mont_sqr_16(r, r, m, mp); 02802 sp_2048_mont_sqr_16(r, r, m, mp); 02803 sp_2048_mont_sqr_16(r, r, m, mp); 02804 02805 sp_2048_mont_mul_16(r, r, t[y], m, mp); 02806 } 02807 02808 XMEMSET(&r[16], 0, sizeof(sp_digit) * 16); 02809 sp_2048_mont_reduce_16(r, m, mp); 02810 02811 mask = 0 - (sp_2048_cmp_16(r, m) >= 0); 02812 sp_2048_cond_sub_16(r, r, m, mask); 02813 } 02814 02815 #ifdef WOLFSSL_SMALL_STACK 02816 if (td != NULL) 02817 XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); 02818 #endif 02819 02820 return err; 02821 } 02822 #else 02823 /* Modular exponentiate a to the e mod m. (r = a^e mod m) 02824 * 02825 * r A single precision number that is the result of the operation. 02826 * a A single precision number being exponentiated. 02827 * e A single precision number that is the exponent. 02828 * bits The number of bits in the exponent. 02829 * m A single precision number that is the modulus. 02830 * returns 0 on success and MEMORY_E on dynamic memory allocation failure. 02831 */ 02832 static int sp_2048_mod_exp_16(sp_digit* r, sp_digit* a, sp_digit* e, 02833 int bits, sp_digit* m, int reduceA) 02834 { 02835 #ifndef WOLFSSL_SMALL_STACK 02836 sp_digit t[32][32]; 02837 #else 02838 sp_digit* t[32]; 02839 sp_digit* td; 02840 #endif 02841 sp_digit* norm; 02842 sp_digit mp = 1; 02843 sp_digit n; 02844 sp_digit mask; 02845 int i; 02846 int c, y; 02847 int err = MP_OKAY; 02848 02849 #ifdef WOLFSSL_SMALL_STACK 02850 td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32 * 32, NULL, 02851 DYNAMIC_TYPE_TMP_BUFFER); 02852 if (td == NULL) 02853 err = MEMORY_E; 02854 02855 if (err == MP_OKAY) { 02856 for (i=0; i<32; i++) 02857 t[i] = td + i * 32; 02858 norm = t[0]; 02859 } 02860 #else 02861 norm = t[0]; 02862 #endif 02863 02864 if (err == MP_OKAY) { 02865 sp_2048_mont_setup(m, &mp); 02866 sp_2048_mont_norm_16(norm, m); 02867 02868 XMEMSET(t[1], 0, sizeof(sp_digit) * 16); 02869 if (reduceA) { 02870 err = sp_2048_mod_16(t[1] + 16, a, m); 02871 if (err == MP_OKAY) 02872 err = sp_2048_mod_16(t[1], t[1], m); 02873 } 02874 else { 02875 XMEMCPY(t[1] + 16, a, sizeof(sp_digit) * 16); 02876 err = sp_2048_mod_16(t[1], t[1], m); 02877 } 02878 } 02879 02880 if (err == MP_OKAY) { 02881 sp_2048_mont_sqr_16(t[ 2], t[ 1], m, mp); 02882 sp_2048_mont_mul_16(t[ 3], t[ 2], t[ 1], m, mp); 02883 sp_2048_mont_sqr_16(t[ 4], t[ 2], m, mp); 02884 sp_2048_mont_mul_16(t[ 5], t[ 3], t[ 2], m, mp); 02885 sp_2048_mont_sqr_16(t[ 6], t[ 3], m, mp); 02886 sp_2048_mont_mul_16(t[ 7], t[ 4], t[ 3], m, mp); 02887 sp_2048_mont_sqr_16(t[ 8], t[ 4], m, mp); 02888 sp_2048_mont_mul_16(t[ 9], t[ 5], t[ 4], m, mp); 02889 sp_2048_mont_sqr_16(t[10], t[ 5], m, mp); 02890 sp_2048_mont_mul_16(t[11], t[ 6], t[ 5], m, mp); 02891 sp_2048_mont_sqr_16(t[12], t[ 6], m, mp); 02892 sp_2048_mont_mul_16(t[13], t[ 7], t[ 6], m, mp); 02893 sp_2048_mont_sqr_16(t[14], t[ 7], m, mp); 02894 sp_2048_mont_mul_16(t[15], t[ 8], t[ 7], m, mp); 02895 sp_2048_mont_sqr_16(t[16], t[ 8], m, mp); 02896 sp_2048_mont_mul_16(t[17], t[ 9], t[ 8], m, mp); 02897 sp_2048_mont_sqr_16(t[18], t[ 9], m, mp); 02898 sp_2048_mont_mul_16(t[19], t[10], t[ 9], m, mp); 02899 sp_2048_mont_sqr_16(t[20], t[10], m, mp); 02900 sp_2048_mont_mul_16(t[21], t[11], t[10], m, mp); 02901 sp_2048_mont_sqr_16(t[22], t[11], m, mp); 02902 sp_2048_mont_mul_16(t[23], t[12], t[11], m, mp); 02903 sp_2048_mont_sqr_16(t[24], t[12], m, mp); 02904 sp_2048_mont_mul_16(t[25], t[13], t[12], m, mp); 02905 sp_2048_mont_sqr_16(t[26], t[13], m, mp); 02906 sp_2048_mont_mul_16(t[27], t[14], t[13], m, mp); 02907 sp_2048_mont_sqr_16(t[28], t[14], m, mp); 02908 sp_2048_mont_mul_16(t[29], t[15], t[14], m, mp); 02909 sp_2048_mont_sqr_16(t[30], t[15], m, mp); 02910 sp_2048_mont_mul_16(t[31], t[16], t[15], m, mp); 02911 02912 i = (bits - 1) / 64; 02913 n = e[i--]; 02914 y = n >> 59; 02915 n <<= 5; 02916 c = 59; 02917 XMEMCPY(r, t[y], sizeof(sp_digit) * 16); 02918 for (; i>=0 || c>=5; ) { 02919 if (c == 0) { 02920 n = e[i--]; 02921 y = n >> 59; 02922 n <<= 5; 02923 c = 59; 02924 } 02925 else if (c < 5) { 02926 y = n >> 59; 02927 n = e[i--]; 02928 c = 5 - c; 02929 y |= n >> (64 - c); 02930 n <<= c; 02931 c = 64 - c; 02932 } 02933 else { 02934 y = (n >> 59) & 0x1f; 02935 n <<= 5; 02936 c -= 5; 02937 } 02938 02939 sp_2048_mont_sqr_16(r, r, m, mp); 02940 sp_2048_mont_sqr_16(r, r, m, mp); 02941 sp_2048_mont_sqr_16(r, r, m, mp); 02942 sp_2048_mont_sqr_16(r, r, m, mp); 02943 sp_2048_mont_sqr_16(r, r, m, mp); 02944 02945 sp_2048_mont_mul_16(r, r, t[y], m, mp); 02946 } 02947 y = e[0] & 0xf; 02948 sp_2048_mont_sqr_16(r, r, m, mp); 02949 sp_2048_mont_sqr_16(r, r, m, mp); 02950 sp_2048_mont_sqr_16(r, r, m, mp); 02951 sp_2048_mont_sqr_16(r, r, m, mp); 02952 sp_2048_mont_mul_16(r, r, t[y], m, mp); 02953 02954 XMEMSET(&r[16], 0, sizeof(sp_digit) * 16); 02955 sp_2048_mont_reduce_16(r, m, mp); 02956 02957 mask = 0 - (sp_2048_cmp_16(r, m) >= 0); 02958 sp_2048_cond_sub_16(r, r, m, mask); 02959 } 02960 02961 #ifdef WOLFSSL_SMALL_STACK 02962 if (td != NULL) 02963 XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); 02964 #endif 02965 02966 return err; 02967 } 02968 #endif /* WOLFSSL_SP_SMALL */ 02969 02970 #endif /* !SP_RSA_PRIVATE_EXP_D && WOLFSSL_HAVE_SP_RSA */ 02971 02972 /* r = 2^n mod m where n is the number of bits to reduce by. 02973 * Given m must be 2048 bits, just need to subtract. 02974 * 02975 * r A single precision number. 02976 * m A signle precision number. 02977 */ 02978 static void sp_2048_mont_norm_32(sp_digit* r, sp_digit* m) 02979 { 02980 XMEMSET(r, 0, sizeof(sp_digit) * 32); 02981 02982 /* r = 2^n mod m */ 02983 sp_2048_sub_in_place_32(r, m); 02984 } 02985 02986 /* Conditionally subtract b from a using the mask m. 02987 * m is -1 to subtract and 0 when not copying. 02988 * 02989 * r A single precision number representing condition subtract result. 02990 * a A single precision number to subtract from. 02991 * b A single precision number to subtract. 02992 * m Mask value to apply. 02993 */ 02994 static sp_digit sp_2048_cond_sub_32(sp_digit* r, sp_digit* a, sp_digit* b, 02995 sp_digit m) 02996 { 02997 sp_digit c = 0; 02998 02999 #ifdef WOLFSSL_SP_SMALL 03000 __asm__ __volatile__ ( 03001 "mov x8, #0\n\t" 03002 "1:\n\t" 03003 "subs %[c], xzr, %[c]\n\t" 03004 "ldr x4, [%[a], x8]\n\t" 03005 "ldr x5, [%[b], x8]\n\t" 03006 "and x5, x5, %[m]\n\t" 03007 "sbcs x4, x4, x5\n\t" 03008 "csetm %[c], cc\n\t" 03009 "str x4, [%[r], x8]\n\t" 03010 "add x8, x8, #8\n\t" 03011 "cmp x8, 256\n\t" 03012 "b.lt 1b\n\t" 03013 : [c] "+r" (c) 03014 : [r] "r" (r), [a] "r" (a), [b] "r" (b), [m] "r" (m) 03015 : "memory", "x4", "x6", "x5", "x7", "x8" 03016 ); 03017 #else 03018 __asm__ __volatile__ ( 03019 03020 "ldr x4, [%[a], 0]\n\t" 03021 "ldr x6, [%[a], 8]\n\t" 03022 "ldr x5, [%[b], 0]\n\t" 03023 "ldr x7, [%[b], 8]\n\t" 03024 "and x5, x5, %[m]\n\t" 03025 "and x7, x7, %[m]\n\t" 03026 "subs x4, x4, x5\n\t" 03027 "sbcs x6, x6, x7\n\t" 03028 "str x4, [%[r], 0]\n\t" 03029 "str x6, [%[r], 8]\n\t" 03030 "ldr x4, [%[a], 16]\n\t" 03031 "ldr x6, [%[a], 24]\n\t" 03032 "ldr x5, [%[b], 16]\n\t" 03033 "ldr x7, [%[b], 24]\n\t" 03034 "and x5, x5, %[m]\n\t" 03035 "and x7, x7, %[m]\n\t" 03036 "sbcs x4, x4, x5\n\t" 03037 "sbcs x6, x6, x7\n\t" 03038 "str x4, [%[r], 16]\n\t" 03039 "str x6, [%[r], 24]\n\t" 03040 "ldr x4, [%[a], 32]\n\t" 03041 "ldr x6, [%[a], 40]\n\t" 03042 "ldr x5, [%[b], 32]\n\t" 03043 "ldr x7, [%[b], 40]\n\t" 03044 "and x5, x5, %[m]\n\t" 03045 "and x7, x7, %[m]\n\t" 03046 "sbcs x4, x4, x5\n\t" 03047 "sbcs x6, x6, x7\n\t" 03048 "str x4, [%[r], 32]\n\t" 03049 "str x6, [%[r], 40]\n\t" 03050 "ldr x4, [%[a], 48]\n\t" 03051 "ldr x6, [%[a], 56]\n\t" 03052 "ldr x5, [%[b], 48]\n\t" 03053 "ldr x7, [%[b], 56]\n\t" 03054 "and x5, x5, %[m]\n\t" 03055 "and x7, x7, %[m]\n\t" 03056 "sbcs x4, x4, x5\n\t" 03057 "sbcs x6, x6, x7\n\t" 03058 "str x4, [%[r], 48]\n\t" 03059 "str x6, [%[r], 56]\n\t" 03060 "ldr x4, [%[a], 64]\n\t" 03061 "ldr x6, [%[a], 72]\n\t" 03062 "ldr x5, [%[b], 64]\n\t" 03063 "ldr x7, [%[b], 72]\n\t" 03064 "and x5, x5, %[m]\n\t" 03065 "and x7, x7, %[m]\n\t" 03066 "sbcs x4, x4, x5\n\t" 03067 "sbcs x6, x6, x7\n\t" 03068 "str x4, [%[r], 64]\n\t" 03069 "str x6, [%[r], 72]\n\t" 03070 "ldr x4, [%[a], 80]\n\t" 03071 "ldr x6, [%[a], 88]\n\t" 03072 "ldr x5, [%[b], 80]\n\t" 03073 "ldr x7, [%[b], 88]\n\t" 03074 "and x5, x5, %[m]\n\t" 03075 "and x7, x7, %[m]\n\t" 03076 "sbcs x4, x4, x5\n\t" 03077 "sbcs x6, x6, x7\n\t" 03078 "str x4, [%[r], 80]\n\t" 03079 "str x6, [%[r], 88]\n\t" 03080 "ldr x4, [%[a], 96]\n\t" 03081 "ldr x6, [%[a], 104]\n\t" 03082 "ldr x5, [%[b], 96]\n\t" 03083 "ldr x7, [%[b], 104]\n\t" 03084 "and x5, x5, %[m]\n\t" 03085 "and x7, x7, %[m]\n\t" 03086 "sbcs x4, x4, x5\n\t" 03087 "sbcs x6, x6, x7\n\t" 03088 "str x4, [%[r], 96]\n\t" 03089 "str x6, [%[r], 104]\n\t" 03090 "ldr x4, [%[a], 112]\n\t" 03091 "ldr x6, [%[a], 120]\n\t" 03092 "ldr x5, [%[b], 112]\n\t" 03093 "ldr x7, [%[b], 120]\n\t" 03094 "and x5, x5, %[m]\n\t" 03095 "and x7, x7, %[m]\n\t" 03096 "sbcs x4, x4, x5\n\t" 03097 "sbcs x6, x6, x7\n\t" 03098 "str x4, [%[r], 112]\n\t" 03099 "str x6, [%[r], 120]\n\t" 03100 "ldr x4, [%[a], 128]\n\t" 03101 "ldr x6, [%[a], 136]\n\t" 03102 "ldr x5, [%[b], 128]\n\t" 03103 "ldr x7, [%[b], 136]\n\t" 03104 "and x5, x5, %[m]\n\t" 03105 "and x7, x7, %[m]\n\t" 03106 "sbcs x4, x4, x5\n\t" 03107 "sbcs x6, x6, x7\n\t" 03108 "str x4, [%[r], 128]\n\t" 03109 "str x6, [%[r], 136]\n\t" 03110 "ldr x4, [%[a], 144]\n\t" 03111 "ldr x6, [%[a], 152]\n\t" 03112 "ldr x5, [%[b], 144]\n\t" 03113 "ldr x7, [%[b], 152]\n\t" 03114 "and x5, x5, %[m]\n\t" 03115 "and x7, x7, %[m]\n\t" 03116 "sbcs x4, x4, x5\n\t" 03117 "sbcs x6, x6, x7\n\t" 03118 "str x4, [%[r], 144]\n\t" 03119 "str x6, [%[r], 152]\n\t" 03120 "ldr x4, [%[a], 160]\n\t" 03121 "ldr x6, [%[a], 168]\n\t" 03122 "ldr x5, [%[b], 160]\n\t" 03123 "ldr x7, [%[b], 168]\n\t" 03124 "and x5, x5, %[m]\n\t" 03125 "and x7, x7, %[m]\n\t" 03126 "sbcs x4, x4, x5\n\t" 03127 "sbcs x6, x6, x7\n\t" 03128 "str x4, [%[r], 160]\n\t" 03129 "str x6, [%[r], 168]\n\t" 03130 "ldr x4, [%[a], 176]\n\t" 03131 "ldr x6, [%[a], 184]\n\t" 03132 "ldr x5, [%[b], 176]\n\t" 03133 "ldr x7, [%[b], 184]\n\t" 03134 "and x5, x5, %[m]\n\t" 03135 "and x7, x7, %[m]\n\t" 03136 "sbcs x4, x4, x5\n\t" 03137 "sbcs x6, x6, x7\n\t" 03138 "str x4, [%[r], 176]\n\t" 03139 "str x6, [%[r], 184]\n\t" 03140 "ldr x4, [%[a], 192]\n\t" 03141 "ldr x6, [%[a], 200]\n\t" 03142 "ldr x5, [%[b], 192]\n\t" 03143 "ldr x7, [%[b], 200]\n\t" 03144 "and x5, x5, %[m]\n\t" 03145 "and x7, x7, %[m]\n\t" 03146 "sbcs x4, x4, x5\n\t" 03147 "sbcs x6, x6, x7\n\t" 03148 "str x4, [%[r], 192]\n\t" 03149 "str x6, [%[r], 200]\n\t" 03150 "ldr x4, [%[a], 208]\n\t" 03151 "ldr x6, [%[a], 216]\n\t" 03152 "ldr x5, [%[b], 208]\n\t" 03153 "ldr x7, [%[b], 216]\n\t" 03154 "and x5, x5, %[m]\n\t" 03155 "and x7, x7, %[m]\n\t" 03156 "sbcs x4, x4, x5\n\t" 03157 "sbcs x6, x6, x7\n\t" 03158 "str x4, [%[r], 208]\n\t" 03159 "str x6, [%[r], 216]\n\t" 03160 "ldr x4, [%[a], 224]\n\t" 03161 "ldr x6, [%[a], 232]\n\t" 03162 "ldr x5, [%[b], 224]\n\t" 03163 "ldr x7, [%[b], 232]\n\t" 03164 "and x5, x5, %[m]\n\t" 03165 "and x7, x7, %[m]\n\t" 03166 "sbcs x4, x4, x5\n\t" 03167 "sbcs x6, x6, x7\n\t" 03168 "str x4, [%[r], 224]\n\t" 03169 "str x6, [%[r], 232]\n\t" 03170 "ldr x4, [%[a], 240]\n\t" 03171 "ldr x6, [%[a], 248]\n\t" 03172 "ldr x5, [%[b], 240]\n\t" 03173 "ldr x7, [%[b], 248]\n\t" 03174 "and x5, x5, %[m]\n\t" 03175 "and x7, x7, %[m]\n\t" 03176 "sbcs x4, x4, x5\n\t" 03177 "sbcs x6, x6, x7\n\t" 03178 "str x4, [%[r], 240]\n\t" 03179 "str x6, [%[r], 248]\n\t" 03180 "csetm %[c], cc\n\t" 03181 : [c] "+r" (c) 03182 : [r] "r" (r), [a] "r" (a), [b] "r" (b), [m] "r" (m) 03183 : "memory", "x4", "x6", "x5", "x7", "x8" 03184 ); 03185 #endif /* WOLFSSL_SP_SMALL */ 03186 03187 return c; 03188 } 03189 03190 /* Reduce the number back to 2048 bits using Montgomery reduction. 03191 * 03192 * a A single precision number to reduce in place. 03193 * m The single precision number representing the modulus. 03194 * mp The digit representing the negative inverse of m mod 2^n. 03195 */ 03196 SP_NOINLINE static void sp_2048_mont_reduce_32(sp_digit* a, sp_digit* m, 03197 sp_digit mp) 03198 { 03199 sp_digit ca = 0; 03200 03201 __asm__ __volatile__ ( 03202 "ldp x12, x13, [%[m], 0]\n\t" 03203 "ldp x14, x15, [%[m], 16]\n\t" 03204 "ldp x16, x17, [%[m], 32]\n\t" 03205 "ldp x18, x19, [%[m], 48]\n\t" 03206 "ldp x20, x21, [%[m], 64]\n\t" 03207 "ldp x22, x23, [%[m], 80]\n\t" 03208 "ldp x24, x25, [%[m], 96]\n\t" 03209 "ldp x26, x27, [%[m], 112]\n\t" 03210 "# i = 0\n\t" 03211 "mov x3, 0\n\t" 03212 "ldp x10, x11, [%[a], 0]\n\t" 03213 "\n1:\n\t" 03214 "# mu = a[i] * mp\n\t" 03215 "mul x8, %[mp], x10\n\t" 03216 "# a[i+0] += m[0] * mu\n\t" 03217 "ldr x9, [%[a], 0]\n\t" 03218 "mul x6, x12, x8\n\t" 03219 "umulh x7, x12, x8\n\t" 03220 "adds x10, x10, x6\n\t" 03221 "adc x5, x7, xzr\n\t" 03222 "# a[i+1] += m[1] * mu\n\t" 03223 "ldr x9, [%[a], 8]\n\t" 03224 "mul x6, x13, x8\n\t" 03225 "umulh x7, x13, x8\n\t" 03226 "adds x10, x11, x6\n\t" 03227 "adc x4, x7, xzr\n\t" 03228 "adds x10, x10, x5\n\t" 03229 "adc x4, x4, xzr\n\t" 03230 "# a[i+2] += m[2] * mu\n\t" 03231 "ldr x11, [%[a], 16]\n\t" 03232 "mul x6, x14, x8\n\t" 03233 "umulh x7, x14, x8\n\t" 03234 "adds x11, x11, x6\n\t" 03235 "adc x5, x7, xzr\n\t" 03236 "adds x11, x11, x4\n\t" 03237 "adc x5, x5, xzr\n\t" 03238 "# a[i+3] += m[3] * mu\n\t" 03239 "ldr x9, [%[a], 24]\n\t" 03240 "mul x6, x15, x8\n\t" 03241 "umulh x7, x15, x8\n\t" 03242 "adds x9, x9, x6\n\t" 03243 "adc x4, x7, xzr\n\t" 03244 "adds x9, x9, x5\n\t" 03245 "str x9, [%[a], 24]\n\t" 03246 "adc x4, x4, xzr\n\t" 03247 "# a[i+4] += m[4] * mu\n\t" 03248 "ldr x9, [%[a], 32]\n\t" 03249 "mul x6, x16, x8\n\t" 03250 "umulh x7, x16, x8\n\t" 03251 "adds x9, x9, x6\n\t" 03252 "adc x5, x7, xzr\n\t" 03253 "adds x9, x9, x4\n\t" 03254 "str x9, [%[a], 32]\n\t" 03255 "adc x5, x5, xzr\n\t" 03256 "# a[i+5] += m[5] * mu\n\t" 03257 "ldr x9, [%[a], 40]\n\t" 03258 "mul x6, x17, x8\n\t" 03259 "umulh x7, x17, x8\n\t" 03260 "adds x9, x9, x6\n\t" 03261 "adc x4, x7, xzr\n\t" 03262 "adds x9, x9, x5\n\t" 03263 "str x9, [%[a], 40]\n\t" 03264 "adc x4, x4, xzr\n\t" 03265 "# a[i+6] += m[6] * mu\n\t" 03266 "ldr x9, [%[a], 48]\n\t" 03267 "mul x6, x18, x8\n\t" 03268 "umulh x7, x18, x8\n\t" 03269 "adds x9, x9, x6\n\t" 03270 "adc x5, x7, xzr\n\t" 03271 "adds x9, x9, x4\n\t" 03272 "str x9, [%[a], 48]\n\t" 03273 "adc x5, x5, xzr\n\t" 03274 "# a[i+7] += m[7] * mu\n\t" 03275 "ldr x9, [%[a], 56]\n\t" 03276 "mul x6, x19, x8\n\t" 03277 "umulh x7, x19, x8\n\t" 03278 "adds x9, x9, x6\n\t" 03279 "adc x4, x7, xzr\n\t" 03280 "adds x9, x9, x5\n\t" 03281 "str x9, [%[a], 56]\n\t" 03282 "adc x4, x4, xzr\n\t" 03283 "# a[i+8] += m[8] * mu\n\t" 03284 "ldr x9, [%[a], 64]\n\t" 03285 "mul x6, x20, x8\n\t" 03286 "umulh x7, x20, x8\n\t" 03287 "adds x9, x9, x6\n\t" 03288 "adc x5, x7, xzr\n\t" 03289 "adds x9, x9, x4\n\t" 03290 "str x9, [%[a], 64]\n\t" 03291 "adc x5, x5, xzr\n\t" 03292 "# a[i+9] += m[9] * mu\n\t" 03293 "ldr x9, [%[a], 72]\n\t" 03294 "mul x6, x21, x8\n\t" 03295 "umulh x7, x21, x8\n\t" 03296 "adds x9, x9, x6\n\t" 03297 "adc x4, x7, xzr\n\t" 03298 "adds x9, x9, x5\n\t" 03299 "str x9, [%[a], 72]\n\t" 03300 "adc x4, x4, xzr\n\t" 03301 "# a[i+10] += m[10] * mu\n\t" 03302 "ldr x9, [%[a], 80]\n\t" 03303 "mul x6, x22, x8\n\t" 03304 "umulh x7, x22, x8\n\t" 03305 "adds x9, x9, x6\n\t" 03306 "adc x5, x7, xzr\n\t" 03307 "adds x9, x9, x4\n\t" 03308 "str x9, [%[a], 80]\n\t" 03309 "adc x5, x5, xzr\n\t" 03310 "# a[i+11] += m[11] * mu\n\t" 03311 "ldr x9, [%[a], 88]\n\t" 03312 "mul x6, x23, x8\n\t" 03313 "umulh x7, x23, x8\n\t" 03314 "adds x9, x9, x6\n\t" 03315 "adc x4, x7, xzr\n\t" 03316 "adds x9, x9, x5\n\t" 03317 "str x9, [%[a], 88]\n\t" 03318 "adc x4, x4, xzr\n\t" 03319 "# a[i+12] += m[12] * mu\n\t" 03320 "ldr x9, [%[a], 96]\n\t" 03321 "mul x6, x24, x8\n\t" 03322 "umulh x7, x24, x8\n\t" 03323 "adds x9, x9, x6\n\t" 03324 "adc x5, x7, xzr\n\t" 03325 "adds x9, x9, x4\n\t" 03326 "str x9, [%[a], 96]\n\t" 03327 "adc x5, x5, xzr\n\t" 03328 "# a[i+13] += m[13] * mu\n\t" 03329 "ldr x9, [%[a], 104]\n\t" 03330 "mul x6, x25, x8\n\t" 03331 "umulh x7, x25, x8\n\t" 03332 "adds x9, x9, x6\n\t" 03333 "adc x4, x7, xzr\n\t" 03334 "adds x9, x9, x5\n\t" 03335 "str x9, [%[a], 104]\n\t" 03336 "adc x4, x4, xzr\n\t" 03337 "# a[i+14] += m[14] * mu\n\t" 03338 "ldr x9, [%[a], 112]\n\t" 03339 "mul x6, x26, x8\n\t" 03340 "umulh x7, x26, x8\n\t" 03341 "adds x9, x9, x6\n\t" 03342 "adc x5, x7, xzr\n\t" 03343 "adds x9, x9, x4\n\t" 03344 "str x9, [%[a], 112]\n\t" 03345 "adc x5, x5, xzr\n\t" 03346 "# a[i+15] += m[15] * mu\n\t" 03347 "ldr x9, [%[a], 120]\n\t" 03348 "mul x6, x27, x8\n\t" 03349 "umulh x7, x27, x8\n\t" 03350 "adds x9, x9, x6\n\t" 03351 "adc x4, x7, xzr\n\t" 03352 "adds x9, x9, x5\n\t" 03353 "str x9, [%[a], 120]\n\t" 03354 "adc x4, x4, xzr\n\t" 03355 "# a[i+16] += m[16] * mu\n\t" 03356 "ldr x7, [%[m], 128]\n\t" 03357 "ldr x9, [%[a], 128]\n\t" 03358 "mul x6, x7, x8\n\t" 03359 "umulh x7, x7, x8\n\t" 03360 "adds x9, x9, x6\n\t" 03361 "adc x5, x7, xzr\n\t" 03362 "adds x9, x9, x4\n\t" 03363 "str x9, [%[a], 128]\n\t" 03364 "adc x5, x5, xzr\n\t" 03365 "# a[i+17] += m[17] * mu\n\t" 03366 "ldr x7, [%[m], 136]\n\t" 03367 "ldr x9, [%[a], 136]\n\t" 03368 "mul x6, x7, x8\n\t" 03369 "umulh x7, x7, x8\n\t" 03370 "adds x9, x9, x6\n\t" 03371 "adc x4, x7, xzr\n\t" 03372 "adds x9, x9, x5\n\t" 03373 "str x9, [%[a], 136]\n\t" 03374 "adc x4, x4, xzr\n\t" 03375 "# a[i+18] += m[18] * mu\n\t" 03376 "ldr x7, [%[m], 144]\n\t" 03377 "ldr x9, [%[a], 144]\n\t" 03378 "mul x6, x7, x8\n\t" 03379 "umulh x7, x7, x8\n\t" 03380 "adds x9, x9, x6\n\t" 03381 "adc x5, x7, xzr\n\t" 03382 "adds x9, x9, x4\n\t" 03383 "str x9, [%[a], 144]\n\t" 03384 "adc x5, x5, xzr\n\t" 03385 "# a[i+19] += m[19] * mu\n\t" 03386 "ldr x7, [%[m], 152]\n\t" 03387 "ldr x9, [%[a], 152]\n\t" 03388 "mul x6, x7, x8\n\t" 03389 "umulh x7, x7, x8\n\t" 03390 "adds x9, x9, x6\n\t" 03391 "adc x4, x7, xzr\n\t" 03392 "adds x9, x9, x5\n\t" 03393 "str x9, [%[a], 152]\n\t" 03394 "adc x4, x4, xzr\n\t" 03395 "# a[i+20] += m[20] * mu\n\t" 03396 "ldr x7, [%[m], 160]\n\t" 03397 "ldr x9, [%[a], 160]\n\t" 03398 "mul x6, x7, x8\n\t" 03399 "umulh x7, x7, x8\n\t" 03400 "adds x9, x9, x6\n\t" 03401 "adc x5, x7, xzr\n\t" 03402 "adds x9, x9, x4\n\t" 03403 "str x9, [%[a], 160]\n\t" 03404 "adc x5, x5, xzr\n\t" 03405 "# a[i+21] += m[21] * mu\n\t" 03406 "ldr x7, [%[m], 168]\n\t" 03407 "ldr x9, [%[a], 168]\n\t" 03408 "mul x6, x7, x8\n\t" 03409 "umulh x7, x7, x8\n\t" 03410 "adds x9, x9, x6\n\t" 03411 "adc x4, x7, xzr\n\t" 03412 "adds x9, x9, x5\n\t" 03413 "str x9, [%[a], 168]\n\t" 03414 "adc x4, x4, xzr\n\t" 03415 "# a[i+22] += m[22] * mu\n\t" 03416 "ldr x7, [%[m], 176]\n\t" 03417 "ldr x9, [%[a], 176]\n\t" 03418 "mul x6, x7, x8\n\t" 03419 "umulh x7, x7, x8\n\t" 03420 "adds x9, x9, x6\n\t" 03421 "adc x5, x7, xzr\n\t" 03422 "adds x9, x9, x4\n\t" 03423 "str x9, [%[a], 176]\n\t" 03424 "adc x5, x5, xzr\n\t" 03425 "# a[i+23] += m[23] * mu\n\t" 03426 "ldr x7, [%[m], 184]\n\t" 03427 "ldr x9, [%[a], 184]\n\t" 03428 "mul x6, x7, x8\n\t" 03429 "umulh x7, x7, x8\n\t" 03430 "adds x9, x9, x6\n\t" 03431 "adc x4, x7, xzr\n\t" 03432 "adds x9, x9, x5\n\t" 03433 "str x9, [%[a], 184]\n\t" 03434 "adc x4, x4, xzr\n\t" 03435 "# a[i+24] += m[24] * mu\n\t" 03436 "ldr x7, [%[m], 192]\n\t" 03437 "ldr x9, [%[a], 192]\n\t" 03438 "mul x6, x7, x8\n\t" 03439 "umulh x7, x7, x8\n\t" 03440 "adds x9, x9, x6\n\t" 03441 "adc x5, x7, xzr\n\t" 03442 "adds x9, x9, x4\n\t" 03443 "str x9, [%[a], 192]\n\t" 03444 "adc x5, x5, xzr\n\t" 03445 "# a[i+25] += m[25] * mu\n\t" 03446 "ldr x7, [%[m], 200]\n\t" 03447 "ldr x9, [%[a], 200]\n\t" 03448 "mul x6, x7, x8\n\t" 03449 "umulh x7, x7, x8\n\t" 03450 "adds x9, x9, x6\n\t" 03451 "adc x4, x7, xzr\n\t" 03452 "adds x9, x9, x5\n\t" 03453 "str x9, [%[a], 200]\n\t" 03454 "adc x4, x4, xzr\n\t" 03455 "# a[i+26] += m[26] * mu\n\t" 03456 "ldr x7, [%[m], 208]\n\t" 03457 "ldr x9, [%[a], 208]\n\t" 03458 "mul x6, x7, x8\n\t" 03459 "umulh x7, x7, x8\n\t" 03460 "adds x9, x9, x6\n\t" 03461 "adc x5, x7, xzr\n\t" 03462 "adds x9, x9, x4\n\t" 03463 "str x9, [%[a], 208]\n\t" 03464 "adc x5, x5, xzr\n\t" 03465 "# a[i+27] += m[27] * mu\n\t" 03466 "ldr x7, [%[m], 216]\n\t" 03467 "ldr x9, [%[a], 216]\n\t" 03468 "mul x6, x7, x8\n\t" 03469 "umulh x7, x7, x8\n\t" 03470 "adds x9, x9, x6\n\t" 03471 "adc x4, x7, xzr\n\t" 03472 "adds x9, x9, x5\n\t" 03473 "str x9, [%[a], 216]\n\t" 03474 "adc x4, x4, xzr\n\t" 03475 "# a[i+28] += m[28] * mu\n\t" 03476 "ldr x7, [%[m], 224]\n\t" 03477 "ldr x9, [%[a], 224]\n\t" 03478 "mul x6, x7, x8\n\t" 03479 "umulh x7, x7, x8\n\t" 03480 "adds x9, x9, x6\n\t" 03481 "adc x5, x7, xzr\n\t" 03482 "adds x9, x9, x4\n\t" 03483 "str x9, [%[a], 224]\n\t" 03484 "adc x5, x5, xzr\n\t" 03485 "# a[i+29] += m[29] * mu\n\t" 03486 "ldr x7, [%[m], 232]\n\t" 03487 "ldr x9, [%[a], 232]\n\t" 03488 "mul x6, x7, x8\n\t" 03489 "umulh x7, x7, x8\n\t" 03490 "adds x9, x9, x6\n\t" 03491 "adc x4, x7, xzr\n\t" 03492 "adds x9, x9, x5\n\t" 03493 "str x9, [%[a], 232]\n\t" 03494 "adc x4, x4, xzr\n\t" 03495 "# a[i+30] += m[30] * mu\n\t" 03496 "ldr x7, [%[m], 240]\n\t" 03497 "ldr x9, [%[a], 240]\n\t" 03498 "mul x6, x7, x8\n\t" 03499 "umulh x7, x7, x8\n\t" 03500 "adds x9, x9, x6\n\t" 03501 "adc x5, x7, xzr\n\t" 03502 "adds x9, x9, x4\n\t" 03503 "str x9, [%[a], 240]\n\t" 03504 "adc x5, x5, xzr\n\t" 03505 "# a[i+31] += m[31] * mu\n\t" 03506 "ldr x7, [%[m], 248]\n\t" 03507 "ldr x9, [%[a], 248]\n\t" 03508 "mul x6, x7, x8\n\t" 03509 "umulh x7, x7, x8\n\t" 03510 "adds x5, x5, x6\n\t" 03511 "adcs x7, x7, %[ca]\n\t" 03512 "cset %[ca], cs\n\t" 03513 "adds x9, x9, x5\n\t" 03514 "str x9, [%[a], 248]\n\t" 03515 "ldr x9, [%[a], 256]\n\t" 03516 "adcs x9, x9, x7\n\t" 03517 "str x9, [%[a], 256]\n\t" 03518 "adc %[ca], %[ca], xzr\n\t" 03519 "# i += 1\n\t" 03520 "add %[a], %[a], 8\n\t" 03521 "add x3, x3, 8\n\t" 03522 "cmp x3, 256\n\t" 03523 "blt 1b\n\t" 03524 "str x10, [%[a], 0]\n\t" 03525 "str x11, [%[a], 8]\n\t" 03526 : [ca] "+r" (ca), [a] "+r" (a) 03527 : [m] "r" (m), [mp] "r" (mp) 03528 : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21", "x22", "x23", "x24", "x25", "x26", "x27" 03529 ); 03530 03531 sp_2048_cond_sub_32(a - 32, a, m, (sp_digit)0 - ca); 03532 } 03533 03534 /* Multiply two Montogmery form numbers mod the modulus (prime). 03535 * (r = a * b mod m) 03536 * 03537 * r Result of multiplication. 03538 * a First number to multiply in Montogmery form. 03539 * b Second number to multiply in Montogmery form. 03540 * m Modulus (prime). 03541 * mp Montogmery mulitplier. 03542 */ 03543 static void sp_2048_mont_mul_32(sp_digit* r, sp_digit* a, sp_digit* b, 03544 sp_digit* m, sp_digit mp) 03545 { 03546 sp_2048_mul_32(r, a, b); 03547 sp_2048_mont_reduce_32(r, m, mp); 03548 } 03549 03550 /* Square the Montgomery form number. (r = a * a mod m) 03551 * 03552 * r Result of squaring. 03553 * a Number to square in Montogmery form. 03554 * m Modulus (prime). 03555 * mp Montogmery mulitplier. 03556 */ 03557 static void sp_2048_mont_sqr_32(sp_digit* r, sp_digit* a, sp_digit* m, 03558 sp_digit mp) 03559 { 03560 sp_2048_sqr_32(r, a); 03561 sp_2048_mont_reduce_32(r, m, mp); 03562 } 03563 03564 /* Mul a by digit b into r. (r = a * b) 03565 * 03566 * r A single precision integer. 03567 * a A single precision integer. 03568 * b A single precision digit. 03569 */ 03570 static void sp_2048_mul_d_32(sp_digit* r, const sp_digit* a, 03571 const sp_digit b) 03572 { 03573 #ifdef WOLFSSL_SP_SMALL 03574 __asm__ __volatile__ ( 03575 "# A[0] * B\n\t" 03576 "ldr x8, [%[a]]\n\t" 03577 "mul x5, %[b], x8\n\t" 03578 "umulh x3, %[b], x8\n\t" 03579 "mov x4, 0\n\t" 03580 "str x5, [%[r]]\n\t" 03581 "mov x5, 0\n\t" 03582 "mov x9, #8\n\t" 03583 "1:\n\t" 03584 "ldr x8, [%[a], x9]\n\t" 03585 "mul x6, %[b], x8\n\t" 03586 "umulh x7, %[b], x8\n\t" 03587 "adds x3, x3, x6\n\t" 03588 "adcs x4, x4, x7\n\t" 03589 "adc x5, xzr, xzr\n\t" 03590 "str x3, [%[r], x9]\n\t" 03591 "mov x3, x4\n\t" 03592 "mov x4, x5\n\t" 03593 "mov x5, #0\n\t" 03594 "add x9, x9, #8\n\t" 03595 "cmp x9, 256\n\t" 03596 "b.lt 1b\n\t" 03597 "str x3, [%[r], 256]\n\t" 03598 : 03599 : [r] "r" (r), [a] "r" (a), [b] "r" (b) 03600 : "memory", "x3", "x4", "x5", "x6", "x7", "x8" 03601 ); 03602 #else 03603 __asm__ __volatile__ ( 03604 "# A[0] * B\n\t" 03605 "ldr x8, [%[a]]\n\t" 03606 "mul x3, %[b], x8\n\t" 03607 "umulh x4, %[b], x8\n\t" 03608 "mov x5, 0\n\t" 03609 "str x3, [%[r]]\n\t" 03610 "# A[1] * B\n\t" 03611 "ldr x8, [%[a], 8]\n\t" 03612 "mov x3, 0\n\t" 03613 "mul x6, %[b], x8\n\t" 03614 "umulh x7, %[b], x8\n\t" 03615 "adds x4, x4, x6\n\t" 03616 "adcs x5, x5, x7\n\t" 03617 "adc x3, xzr, xzr\n\t" 03618 "str x4, [%[r], 8]\n\t" 03619 "# A[2] * B\n\t" 03620 "ldr x8, [%[a], 16]\n\t" 03621 "mov x4, 0\n\t" 03622 "mul x6, %[b], x8\n\t" 03623 "umulh x7, %[b], x8\n\t" 03624 "adds x5, x5, x6\n\t" 03625 "adcs x3, x3, x7\n\t" 03626 "adc x4, xzr, xzr\n\t" 03627 "str x5, [%[r], 16]\n\t" 03628 "# A[3] * B\n\t" 03629 "ldr x8, [%[a], 24]\n\t" 03630 "mov x5, 0\n\t" 03631 "mul x6, %[b], x8\n\t" 03632 "umulh x7, %[b], x8\n\t" 03633 "adds x3, x3, x6\n\t" 03634 "adcs x4, x4, x7\n\t" 03635 "adc x5, xzr, xzr\n\t" 03636 "str x3, [%[r], 24]\n\t" 03637 "# A[4] * B\n\t" 03638 "ldr x8, [%[a], 32]\n\t" 03639 "mov x3, 0\n\t" 03640 "mul x6, %[b], x8\n\t" 03641 "umulh x7, %[b], x8\n\t" 03642 "adds x4, x4, x6\n\t" 03643 "adcs x5, x5, x7\n\t" 03644 "adc x3, xzr, xzr\n\t" 03645 "str x4, [%[r], 32]\n\t" 03646 "# A[5] * B\n\t" 03647 "ldr x8, [%[a], 40]\n\t" 03648 "mov x4, 0\n\t" 03649 "mul x6, %[b], x8\n\t" 03650 "umulh x7, %[b], x8\n\t" 03651 "adds x5, x5, x6\n\t" 03652 "adcs x3, x3, x7\n\t" 03653 "adc x4, xzr, xzr\n\t" 03654 "str x5, [%[r], 40]\n\t" 03655 "# A[6] * B\n\t" 03656 "ldr x8, [%[a], 48]\n\t" 03657 "mov x5, 0\n\t" 03658 "mul x6, %[b], x8\n\t" 03659 "umulh x7, %[b], x8\n\t" 03660 "adds x3, x3, x6\n\t" 03661 "adcs x4, x4, x7\n\t" 03662 "adc x5, xzr, xzr\n\t" 03663 "str x3, [%[r], 48]\n\t" 03664 "# A[7] * B\n\t" 03665 "ldr x8, [%[a], 56]\n\t" 03666 "mov x3, 0\n\t" 03667 "mul x6, %[b], x8\n\t" 03668 "umulh x7, %[b], x8\n\t" 03669 "adds x4, x4, x6\n\t" 03670 "adcs x5, x5, x7\n\t" 03671 "adc x3, xzr, xzr\n\t" 03672 "str x4, [%[r], 56]\n\t" 03673 "# A[8] * B\n\t" 03674 "ldr x8, [%[a], 64]\n\t" 03675 "mov x4, 0\n\t" 03676 "mul x6, %[b], x8\n\t" 03677 "umulh x7, %[b], x8\n\t" 03678 "adds x5, x5, x6\n\t" 03679 "adcs x3, x3, x7\n\t" 03680 "adc x4, xzr, xzr\n\t" 03681 "str x5, [%[r], 64]\n\t" 03682 "# A[9] * B\n\t" 03683 "ldr x8, [%[a], 72]\n\t" 03684 "mov x5, 0\n\t" 03685 "mul x6, %[b], x8\n\t" 03686 "umulh x7, %[b], x8\n\t" 03687 "adds x3, x3, x6\n\t" 03688 "adcs x4, x4, x7\n\t" 03689 "adc x5, xzr, xzr\n\t" 03690 "str x3, [%[r], 72]\n\t" 03691 "# A[10] * B\n\t" 03692 "ldr x8, [%[a], 80]\n\t" 03693 "mov x3, 0\n\t" 03694 "mul x6, %[b], x8\n\t" 03695 "umulh x7, %[b], x8\n\t" 03696 "adds x4, x4, x6\n\t" 03697 "adcs x5, x5, x7\n\t" 03698 "adc x3, xzr, xzr\n\t" 03699 "str x4, [%[r], 80]\n\t" 03700 "# A[11] * B\n\t" 03701 "ldr x8, [%[a], 88]\n\t" 03702 "mov x4, 0\n\t" 03703 "mul x6, %[b], x8\n\t" 03704 "umulh x7, %[b], x8\n\t" 03705 "adds x5, x5, x6\n\t" 03706 "adcs x3, x3, x7\n\t" 03707 "adc x4, xzr, xzr\n\t" 03708 "str x5, [%[r], 88]\n\t" 03709 "# A[12] * B\n\t" 03710 "ldr x8, [%[a], 96]\n\t" 03711 "mov x5, 0\n\t" 03712 "mul x6, %[b], x8\n\t" 03713 "umulh x7, %[b], x8\n\t" 03714 "adds x3, x3, x6\n\t" 03715 "adcs x4, x4, x7\n\t" 03716 "adc x5, xzr, xzr\n\t" 03717 "str x3, [%[r], 96]\n\t" 03718 "# A[13] * B\n\t" 03719 "ldr x8, [%[a], 104]\n\t" 03720 "mov x3, 0\n\t" 03721 "mul x6, %[b], x8\n\t" 03722 "umulh x7, %[b], x8\n\t" 03723 "adds x4, x4, x6\n\t" 03724 "adcs x5, x5, x7\n\t" 03725 "adc x3, xzr, xzr\n\t" 03726 "str x4, [%[r], 104]\n\t" 03727 "# A[14] * B\n\t" 03728 "ldr x8, [%[a], 112]\n\t" 03729 "mov x4, 0\n\t" 03730 "mul x6, %[b], x8\n\t" 03731 "umulh x7, %[b], x8\n\t" 03732 "adds x5, x5, x6\n\t" 03733 "adcs x3, x3, x7\n\t" 03734 "adc x4, xzr, xzr\n\t" 03735 "str x5, [%[r], 112]\n\t" 03736 "# A[15] * B\n\t" 03737 "ldr x8, [%[a], 120]\n\t" 03738 "mov x5, 0\n\t" 03739 "mul x6, %[b], x8\n\t" 03740 "umulh x7, %[b], x8\n\t" 03741 "adds x3, x3, x6\n\t" 03742 "adcs x4, x4, x7\n\t" 03743 "adc x5, xzr, xzr\n\t" 03744 "str x3, [%[r], 120]\n\t" 03745 "# A[16] * B\n\t" 03746 "ldr x8, [%[a], 128]\n\t" 03747 "mov x3, 0\n\t" 03748 "mul x6, %[b], x8\n\t" 03749 "umulh x7, %[b], x8\n\t" 03750 "adds x4, x4, x6\n\t" 03751 "adcs x5, x5, x7\n\t" 03752 "adc x3, xzr, xzr\n\t" 03753 "str x4, [%[r], 128]\n\t" 03754 "# A[17] * B\n\t" 03755 "ldr x8, [%[a], 136]\n\t" 03756 "mov x4, 0\n\t" 03757 "mul x6, %[b], x8\n\t" 03758 "umulh x7, %[b], x8\n\t" 03759 "adds x5, x5, x6\n\t" 03760 "adcs x3, x3, x7\n\t" 03761 "adc x4, xzr, xzr\n\t" 03762 "str x5, [%[r], 136]\n\t" 03763 "# A[18] * B\n\t" 03764 "ldr x8, [%[a], 144]\n\t" 03765 "mov x5, 0\n\t" 03766 "mul x6, %[b], x8\n\t" 03767 "umulh x7, %[b], x8\n\t" 03768 "adds x3, x3, x6\n\t" 03769 "adcs x4, x4, x7\n\t" 03770 "adc x5, xzr, xzr\n\t" 03771 "str x3, [%[r], 144]\n\t" 03772 "# A[19] * B\n\t" 03773 "ldr x8, [%[a], 152]\n\t" 03774 "mov x3, 0\n\t" 03775 "mul x6, %[b], x8\n\t" 03776 "umulh x7, %[b], x8\n\t" 03777 "adds x4, x4, x6\n\t" 03778 "adcs x5, x5, x7\n\t" 03779 "adc x3, xzr, xzr\n\t" 03780 "str x4, [%[r], 152]\n\t" 03781 "# A[20] * B\n\t" 03782 "ldr x8, [%[a], 160]\n\t" 03783 "mov x4, 0\n\t" 03784 "mul x6, %[b], x8\n\t" 03785 "umulh x7, %[b], x8\n\t" 03786 "adds x5, x5, x6\n\t" 03787 "adcs x3, x3, x7\n\t" 03788 "adc x4, xzr, xzr\n\t" 03789 "str x5, [%[r], 160]\n\t" 03790 "# A[21] * B\n\t" 03791 "ldr x8, [%[a], 168]\n\t" 03792 "mov x5, 0\n\t" 03793 "mul x6, %[b], x8\n\t" 03794 "umulh x7, %[b], x8\n\t" 03795 "adds x3, x3, x6\n\t" 03796 "adcs x4, x4, x7\n\t" 03797 "adc x5, xzr, xzr\n\t" 03798 "str x3, [%[r], 168]\n\t" 03799 "# A[22] * B\n\t" 03800 "ldr x8, [%[a], 176]\n\t" 03801 "mov x3, 0\n\t" 03802 "mul x6, %[b], x8\n\t" 03803 "umulh x7, %[b], x8\n\t" 03804 "adds x4, x4, x6\n\t" 03805 "adcs x5, x5, x7\n\t" 03806 "adc x3, xzr, xzr\n\t" 03807 "str x4, [%[r], 176]\n\t" 03808 "# A[23] * B\n\t" 03809 "ldr x8, [%[a], 184]\n\t" 03810 "mov x4, 0\n\t" 03811 "mul x6, %[b], x8\n\t" 03812 "umulh x7, %[b], x8\n\t" 03813 "adds x5, x5, x6\n\t" 03814 "adcs x3, x3, x7\n\t" 03815 "adc x4, xzr, xzr\n\t" 03816 "str x5, [%[r], 184]\n\t" 03817 "# A[24] * B\n\t" 03818 "ldr x8, [%[a], 192]\n\t" 03819 "mov x5, 0\n\t" 03820 "mul x6, %[b], x8\n\t" 03821 "umulh x7, %[b], x8\n\t" 03822 "adds x3, x3, x6\n\t" 03823 "adcs x4, x4, x7\n\t" 03824 "adc x5, xzr, xzr\n\t" 03825 "str x3, [%[r], 192]\n\t" 03826 "# A[25] * B\n\t" 03827 "ldr x8, [%[a], 200]\n\t" 03828 "mov x3, 0\n\t" 03829 "mul x6, %[b], x8\n\t" 03830 "umulh x7, %[b], x8\n\t" 03831 "adds x4, x4, x6\n\t" 03832 "adcs x5, x5, x7\n\t" 03833 "adc x3, xzr, xzr\n\t" 03834 "str x4, [%[r], 200]\n\t" 03835 "# A[26] * B\n\t" 03836 "ldr x8, [%[a], 208]\n\t" 03837 "mov x4, 0\n\t" 03838 "mul x6, %[b], x8\n\t" 03839 "umulh x7, %[b], x8\n\t" 03840 "adds x5, x5, x6\n\t" 03841 "adcs x3, x3, x7\n\t" 03842 "adc x4, xzr, xzr\n\t" 03843 "str x5, [%[r], 208]\n\t" 03844 "# A[27] * B\n\t" 03845 "ldr x8, [%[a], 216]\n\t" 03846 "mov x5, 0\n\t" 03847 "mul x6, %[b], x8\n\t" 03848 "umulh x7, %[b], x8\n\t" 03849 "adds x3, x3, x6\n\t" 03850 "adcs x4, x4, x7\n\t" 03851 "adc x5, xzr, xzr\n\t" 03852 "str x3, [%[r], 216]\n\t" 03853 "# A[28] * B\n\t" 03854 "ldr x8, [%[a], 224]\n\t" 03855 "mov x3, 0\n\t" 03856 "mul x6, %[b], x8\n\t" 03857 "umulh x7, %[b], x8\n\t" 03858 "adds x4, x4, x6\n\t" 03859 "adcs x5, x5, x7\n\t" 03860 "adc x3, xzr, xzr\n\t" 03861 "str x4, [%[r], 224]\n\t" 03862 "# A[29] * B\n\t" 03863 "ldr x8, [%[a], 232]\n\t" 03864 "mov x4, 0\n\t" 03865 "mul x6, %[b], x8\n\t" 03866 "umulh x7, %[b], x8\n\t" 03867 "adds x5, x5, x6\n\t" 03868 "adcs x3, x3, x7\n\t" 03869 "adc x4, xzr, xzr\n\t" 03870 "str x5, [%[r], 232]\n\t" 03871 "# A[30] * B\n\t" 03872 "ldr x8, [%[a], 240]\n\t" 03873 "mov x5, 0\n\t" 03874 "mul x6, %[b], x8\n\t" 03875 "umulh x7, %[b], x8\n\t" 03876 "adds x3, x3, x6\n\t" 03877 "adcs x4, x4, x7\n\t" 03878 "adc x5, xzr, xzr\n\t" 03879 "str x3, [%[r], 240]\n\t" 03880 "# A[31] * B\n\t" 03881 "ldr x8, [%[a], 248]\n\t" 03882 "mul x6, %[b], x8\n\t" 03883 "umulh x7, %[b], x8\n\t" 03884 "adds x4, x4, x6\n\t" 03885 "adc x5, x5, x7\n\t" 03886 "str x4, [%[r], 248]\n\t" 03887 "str x5, [%[r], 256]\n\t" 03888 : 03889 : [r] "r" (r), [a] "r" (a), [b] "r" (b) 03890 : "memory", "x3", "x4", "x5", "x6", "x7", "x8" 03891 ); 03892 #endif 03893 } 03894 03895 /* Divide the double width number (d1|d0) by the dividend. (d1|d0 / div) 03896 * 03897 * d1 The high order half of the number to divide. 03898 * d0 The low order half of the number to divide. 03899 * div The dividend. 03900 * returns the result of the division. 03901 */ 03902 static sp_digit div_2048_word_32(sp_digit d1, sp_digit d0, sp_digit div) 03903 { 03904 sp_digit r; 03905 03906 __asm__ __volatile__ ( 03907 "lsr x5, %[div], 32\n\t" 03908 "add x5, x5, 1\n\t" 03909 03910 "udiv x3, %[d1], x5\n\t" 03911 "lsl x6, x3, 32\n\t" 03912 "mul x4, %[div], x6\n\t" 03913 "umulh x3, %[div], x6\n\t" 03914 "subs %[d0], %[d0], x4\n\t" 03915 "sbc %[d1], %[d1], x3\n\t" 03916 03917 "udiv x3, %[d1], x5\n\t" 03918 "lsl x3, x3, 32\n\t" 03919 "add x6, x6, x3\n\t" 03920 "mul x4, %[div], x3\n\t" 03921 "umulh x3, %[div], x3\n\t" 03922 "subs %[d0], %[d0], x4\n\t" 03923 "sbc %[d1], %[d1], x3\n\t" 03924 03925 "lsl x3, %[d1], 32\n\t" 03926 "orr x3, x3, %[d0], lsr 32\n\t" 03927 03928 "udiv x3, x3, x5\n\t" 03929 "add x6, x6, x3\n\t" 03930 "mul x4, %[div], x3\n\t" 03931 "umulh x3, %[div], x3\n\t" 03932 "subs %[d0], %[d0], x4\n\t" 03933 "sbc %[d1], %[d1], x3\n\t" 03934 03935 "lsl x3, %[d1], 32\n\t" 03936 "orr x3, x3, %[d0], lsr 32\n\t" 03937 03938 "udiv x3, x3, x5\n\t" 03939 "add x6, x6, x3\n\t" 03940 "mul x4, %[div], x3\n\t" 03941 "umulh x3, %[div], x3\n\t" 03942 "subs %[d0], %[d0], x4\n\t" 03943 "sbc %[d1], %[d1], x3\n\t" 03944 03945 "udiv x3, %[d0], %[div]\n\t" 03946 "add x6, x6, x3\n\t" 03947 "mul x3, %[div], x3\n\t" 03948 "sub %[d0], %[d0], x3\n\t" 03949 "mov %[r], x6\n\t" 03950 03951 : [r] "=r" (r) 03952 : [d1] "r" (d1), [d0] "r" (d0), [div] "r" (div) 03953 : "x3", "x4", "x5", "x6" 03954 ); 03955 03956 return r; 03957 } 03958 03959 /* AND m into each word of a and store in r. 03960 * 03961 * r A single precision integer. 03962 * a A single precision integer. 03963 * m Mask to AND against each digit. 03964 */ 03965 static void sp_2048_mask_32(sp_digit* r, sp_digit* a, sp_digit m) 03966 { 03967 #ifdef WOLFSSL_SP_SMALL 03968 int i; 03969 03970 for (i=0; i<32; i++) 03971 r[i] = a[i] & m; 03972 #else 03973 int i; 03974 03975 for (i = 0; i < 32; i += 8) { 03976 r[i+0] = a[i+0] & m; 03977 r[i+1] = a[i+1] & m; 03978 r[i+2] = a[i+2] & m; 03979 r[i+3] = a[i+3] & m; 03980 r[i+4] = a[i+4] & m; 03981 r[i+5] = a[i+5] & m; 03982 r[i+6] = a[i+6] & m; 03983 r[i+7] = a[i+7] & m; 03984 } 03985 #endif 03986 } 03987 03988 /* Compare a with b in constant time. 03989 * 03990 * a A single precision integer. 03991 * b A single precision integer. 03992 * return -ve, 0 or +ve if a is less than, equal to or greater than b 03993 * respectively. 03994 */ 03995 static int64_t sp_2048_cmp_32(sp_digit* a, sp_digit* b) 03996 { 03997 sp_digit r = -1; 03998 sp_digit one = 1; 03999 04000 #ifdef WOLFSSL_SP_SMALL 04001 __asm__ __volatile__ ( 04002 "mov x3, -1\n\t" 04003 "mov x6, 248\n\t" 04004 "1:\n\t" 04005 "ldr x4, [%[a], x6]\n\t" 04006 "ldr x5, [%[b], x6]\n\t" 04007 "and x4, x4, x3\n\t" 04008 "and x5, x5, x3\n\t" 04009 "subs x4, x4, x5\n\t" 04010 "csel %[r], %[one], %[r], hi\n\t" 04011 "csel %[r], x3, %[r], lo\n\t" 04012 "csel x3, x3, xzr, eq\n\t" 04013 "sub x6, x6, #8\n\t" 04014 "b.cc 1b\n\t" 04015 "eor %[r], %[r], x3\n\t" 04016 : [r] "+r" (r) 04017 : [a] "r" (a), [b] "r" (b), [one] "r" (one) 04018 : "x2", "x3", "x4", "x5", "x6" 04019 ); 04020 #else 04021 __asm__ __volatile__ ( 04022 "mov x3, -1\n\t" 04023 "ldr x4, [%[a], 248]\n\t" 04024 "ldr x5, [%[b], 248]\n\t" 04025 "and x4, x4, x3\n\t" 04026 "and x5, x5, x3\n\t" 04027 "subs x4, x4, x5\n\t" 04028 "csel %[r], %[one], %[r], hi\n\t" 04029 "csel %[r], x3, %[r], lo\n\t" 04030 "csel x3, x3, xzr, eq\n\t" 04031 "ldr x4, [%[a], 240]\n\t" 04032 "ldr x5, [%[b], 240]\n\t" 04033 "and x4, x4, x3\n\t" 04034 "and x5, x5, x3\n\t" 04035 "subs x4, x4, x5\n\t" 04036 "csel %[r], %[one], %[r], hi\n\t" 04037 "csel %[r], x3, %[r], lo\n\t" 04038 "csel x3, x3, xzr, eq\n\t" 04039 "ldr x4, [%[a], 232]\n\t" 04040 "ldr x5, [%[b], 232]\n\t" 04041 "and x4, x4, x3\n\t" 04042 "and x5, x5, x3\n\t" 04043 "subs x4, x4, x5\n\t" 04044 "csel %[r], %[one], %[r], hi\n\t" 04045 "csel %[r], x3, %[r], lo\n\t" 04046 "csel x3, x3, xzr, eq\n\t" 04047 "ldr x4, [%[a], 224]\n\t" 04048 "ldr x5, [%[b], 224]\n\t" 04049 "and x4, x4, x3\n\t" 04050 "and x5, x5, x3\n\t" 04051 "subs x4, x4, x5\n\t" 04052 "csel %[r], %[one], %[r], hi\n\t" 04053 "csel %[r], x3, %[r], lo\n\t" 04054 "csel x3, x3, xzr, eq\n\t" 04055 "ldr x4, [%[a], 216]\n\t" 04056 "ldr x5, [%[b], 216]\n\t" 04057 "and x4, x4, x3\n\t" 04058 "and x5, x5, x3\n\t" 04059 "subs x4, x4, x5\n\t" 04060 "csel %[r], %[one], %[r], hi\n\t" 04061 "csel %[r], x3, %[r], lo\n\t" 04062 "csel x3, x3, xzr, eq\n\t" 04063 "ldr x4, [%[a], 208]\n\t" 04064 "ldr x5, [%[b], 208]\n\t" 04065 "and x4, x4, x3\n\t" 04066 "and x5, x5, x3\n\t" 04067 "subs x4, x4, x5\n\t" 04068 "csel %[r], %[one], %[r], hi\n\t" 04069 "csel %[r], x3, %[r], lo\n\t" 04070 "csel x3, x3, xzr, eq\n\t" 04071 "ldr x4, [%[a], 200]\n\t" 04072 "ldr x5, [%[b], 200]\n\t" 04073 "and x4, x4, x3\n\t" 04074 "and x5, x5, x3\n\t" 04075 "subs x4, x4, x5\n\t" 04076 "csel %[r], %[one], %[r], hi\n\t" 04077 "csel %[r], x3, %[r], lo\n\t" 04078 "csel x3, x3, xzr, eq\n\t" 04079 "ldr x4, [%[a], 192]\n\t" 04080 "ldr x5, [%[b], 192]\n\t" 04081 "and x4, x4, x3\n\t" 04082 "and x5, x5, x3\n\t" 04083 "subs x4, x4, x5\n\t" 04084 "csel %[r], %[one], %[r], hi\n\t" 04085 "csel %[r], x3, %[r], lo\n\t" 04086 "csel x3, x3, xzr, eq\n\t" 04087 "ldr x4, [%[a], 184]\n\t" 04088 "ldr x5, [%[b], 184]\n\t" 04089 "and x4, x4, x3\n\t" 04090 "and x5, x5, x3\n\t" 04091 "subs x4, x4, x5\n\t" 04092 "csel %[r], %[one], %[r], hi\n\t" 04093 "csel %[r], x3, %[r], lo\n\t" 04094 "csel x3, x3, xzr, eq\n\t" 04095 "ldr x4, [%[a], 176]\n\t" 04096 "ldr x5, [%[b], 176]\n\t" 04097 "and x4, x4, x3\n\t" 04098 "and x5, x5, x3\n\t" 04099 "subs x4, x4, x5\n\t" 04100 "csel %[r], %[one], %[r], hi\n\t" 04101 "csel %[r], x3, %[r], lo\n\t" 04102 "csel x3, x3, xzr, eq\n\t" 04103 "ldr x4, [%[a], 168]\n\t" 04104 "ldr x5, [%[b], 168]\n\t" 04105 "and x4, x4, x3\n\t" 04106 "and x5, x5, x3\n\t" 04107 "subs x4, x4, x5\n\t" 04108 "csel %[r], %[one], %[r], hi\n\t" 04109 "csel %[r], x3, %[r], lo\n\t" 04110 "csel x3, x3, xzr, eq\n\t" 04111 "ldr x4, [%[a], 160]\n\t" 04112 "ldr x5, [%[b], 160]\n\t" 04113 "and x4, x4, x3\n\t" 04114 "and x5, x5, x3\n\t" 04115 "subs x4, x4, x5\n\t" 04116 "csel %[r], %[one], %[r], hi\n\t" 04117 "csel %[r], x3, %[r], lo\n\t" 04118 "csel x3, x3, xzr, eq\n\t" 04119 "ldr x4, [%[a], 152]\n\t" 04120 "ldr x5, [%[b], 152]\n\t" 04121 "and x4, x4, x3\n\t" 04122 "and x5, x5, x3\n\t" 04123 "subs x4, x4, x5\n\t" 04124 "csel %[r], %[one], %[r], hi\n\t" 04125 "csel %[r], x3, %[r], lo\n\t" 04126 "csel x3, x3, xzr, eq\n\t" 04127 "ldr x4, [%[a], 144]\n\t" 04128 "ldr x5, [%[b], 144]\n\t" 04129 "and x4, x4, x3\n\t" 04130 "and x5, x5, x3\n\t" 04131 "subs x4, x4, x5\n\t" 04132 "csel %[r], %[one], %[r], hi\n\t" 04133 "csel %[r], x3, %[r], lo\n\t" 04134 "csel x3, x3, xzr, eq\n\t" 04135 "ldr x4, [%[a], 136]\n\t" 04136 "ldr x5, [%[b], 136]\n\t" 04137 "and x4, x4, x3\n\t" 04138 "and x5, x5, x3\n\t" 04139 "subs x4, x4, x5\n\t" 04140 "csel %[r], %[one], %[r], hi\n\t" 04141 "csel %[r], x3, %[r], lo\n\t" 04142 "csel x3, x3, xzr, eq\n\t" 04143 "ldr x4, [%[a], 128]\n\t" 04144 "ldr x5, [%[b], 128]\n\t" 04145 "and x4, x4, x3\n\t" 04146 "and x5, x5, x3\n\t" 04147 "subs x4, x4, x5\n\t" 04148 "csel %[r], %[one], %[r], hi\n\t" 04149 "csel %[r], x3, %[r], lo\n\t" 04150 "csel x3, x3, xzr, eq\n\t" 04151 "ldr x4, [%[a], 120]\n\t" 04152 "ldr x5, [%[b], 120]\n\t" 04153 "and x4, x4, x3\n\t" 04154 "and x5, x5, x3\n\t" 04155 "subs x4, x4, x5\n\t" 04156 "csel %[r], %[one], %[r], hi\n\t" 04157 "csel %[r], x3, %[r], lo\n\t" 04158 "csel x3, x3, xzr, eq\n\t" 04159 "ldr x4, [%[a], 112]\n\t" 04160 "ldr x5, [%[b], 112]\n\t" 04161 "and x4, x4, x3\n\t" 04162 "and x5, x5, x3\n\t" 04163 "subs x4, x4, x5\n\t" 04164 "csel %[r], %[one], %[r], hi\n\t" 04165 "csel %[r], x3, %[r], lo\n\t" 04166 "csel x3, x3, xzr, eq\n\t" 04167 "ldr x4, [%[a], 104]\n\t" 04168 "ldr x5, [%[b], 104]\n\t" 04169 "and x4, x4, x3\n\t" 04170 "and x5, x5, x3\n\t" 04171 "subs x4, x4, x5\n\t" 04172 "csel %[r], %[one], %[r], hi\n\t" 04173 "csel %[r], x3, %[r], lo\n\t" 04174 "csel x3, x3, xzr, eq\n\t" 04175 "ldr x4, [%[a], 96]\n\t" 04176 "ldr x5, [%[b], 96]\n\t" 04177 "and x4, x4, x3\n\t" 04178 "and x5, x5, x3\n\t" 04179 "subs x4, x4, x5\n\t" 04180 "csel %[r], %[one], %[r], hi\n\t" 04181 "csel %[r], x3, %[r], lo\n\t" 04182 "csel x3, x3, xzr, eq\n\t" 04183 "ldr x4, [%[a], 88]\n\t" 04184 "ldr x5, [%[b], 88]\n\t" 04185 "and x4, x4, x3\n\t" 04186 "and x5, x5, x3\n\t" 04187 "subs x4, x4, x5\n\t" 04188 "csel %[r], %[one], %[r], hi\n\t" 04189 "csel %[r], x3, %[r], lo\n\t" 04190 "csel x3, x3, xzr, eq\n\t" 04191 "ldr x4, [%[a], 80]\n\t" 04192 "ldr x5, [%[b], 80]\n\t" 04193 "and x4, x4, x3\n\t" 04194 "and x5, x5, x3\n\t" 04195 "subs x4, x4, x5\n\t" 04196 "csel %[r], %[one], %[r], hi\n\t" 04197 "csel %[r], x3, %[r], lo\n\t" 04198 "csel x3, x3, xzr, eq\n\t" 04199 "ldr x4, [%[a], 72]\n\t" 04200 "ldr x5, [%[b], 72]\n\t" 04201 "and x4, x4, x3\n\t" 04202 "and x5, x5, x3\n\t" 04203 "subs x4, x4, x5\n\t" 04204 "csel %[r], %[one], %[r], hi\n\t" 04205 "csel %[r], x3, %[r], lo\n\t" 04206 "csel x3, x3, xzr, eq\n\t" 04207 "ldr x4, [%[a], 64]\n\t" 04208 "ldr x5, [%[b], 64]\n\t" 04209 "and x4, x4, x3\n\t" 04210 "and x5, x5, x3\n\t" 04211 "subs x4, x4, x5\n\t" 04212 "csel %[r], %[one], %[r], hi\n\t" 04213 "csel %[r], x3, %[r], lo\n\t" 04214 "csel x3, x3, xzr, eq\n\t" 04215 "ldr x4, [%[a], 56]\n\t" 04216 "ldr x5, [%[b], 56]\n\t" 04217 "and x4, x4, x3\n\t" 04218 "and x5, x5, x3\n\t" 04219 "subs x4, x4, x5\n\t" 04220 "csel %[r], %[one], %[r], hi\n\t" 04221 "csel %[r], x3, %[r], lo\n\t" 04222 "csel x3, x3, xzr, eq\n\t" 04223 "ldr x4, [%[a], 48]\n\t" 04224 "ldr x5, [%[b], 48]\n\t" 04225 "and x4, x4, x3\n\t" 04226 "and x5, x5, x3\n\t" 04227 "subs x4, x4, x5\n\t" 04228 "csel %[r], %[one], %[r], hi\n\t" 04229 "csel %[r], x3, %[r], lo\n\t" 04230 "csel x3, x3, xzr, eq\n\t" 04231 "ldr x4, [%[a], 40]\n\t" 04232 "ldr x5, [%[b], 40]\n\t" 04233 "and x4, x4, x3\n\t" 04234 "and x5, x5, x3\n\t" 04235 "subs x4, x4, x5\n\t" 04236 "csel %[r], %[one], %[r], hi\n\t" 04237 "csel %[r], x3, %[r], lo\n\t" 04238 "csel x3, x3, xzr, eq\n\t" 04239 "ldr x4, [%[a], 32]\n\t" 04240 "ldr x5, [%[b], 32]\n\t" 04241 "and x4, x4, x3\n\t" 04242 "and x5, x5, x3\n\t" 04243 "subs x4, x4, x5\n\t" 04244 "csel %[r], %[one], %[r], hi\n\t" 04245 "csel %[r], x3, %[r], lo\n\t" 04246 "csel x3, x3, xzr, eq\n\t" 04247 "ldr x4, [%[a], 24]\n\t" 04248 "ldr x5, [%[b], 24]\n\t" 04249 "and x4, x4, x3\n\t" 04250 "and x5, x5, x3\n\t" 04251 "subs x4, x4, x5\n\t" 04252 "csel %[r], %[one], %[r], hi\n\t" 04253 "csel %[r], x3, %[r], lo\n\t" 04254 "csel x3, x3, xzr, eq\n\t" 04255 "ldr x4, [%[a], 16]\n\t" 04256 "ldr x5, [%[b], 16]\n\t" 04257 "and x4, x4, x3\n\t" 04258 "and x5, x5, x3\n\t" 04259 "subs x4, x4, x5\n\t" 04260 "csel %[r], %[one], %[r], hi\n\t" 04261 "csel %[r], x3, %[r], lo\n\t" 04262 "csel x3, x3, xzr, eq\n\t" 04263 "ldr x4, [%[a], 8]\n\t" 04264 "ldr x5, [%[b], 8]\n\t" 04265 "and x4, x4, x3\n\t" 04266 "and x5, x5, x3\n\t" 04267 "subs x4, x4, x5\n\t" 04268 "csel %[r], %[one], %[r], hi\n\t" 04269 "csel %[r], x3, %[r], lo\n\t" 04270 "csel x3, x3, xzr, eq\n\t" 04271 "ldr x4, [%[a], 0]\n\t" 04272 "ldr x5, [%[b], 0]\n\t" 04273 "and x4, x4, x3\n\t" 04274 "and x5, x5, x3\n\t" 04275 "subs x4, x4, x5\n\t" 04276 "csel %[r], %[one], %[r], hi\n\t" 04277 "csel %[r], x3, %[r], lo\n\t" 04278 "csel x3, x3, xzr, eq\n\t" 04279 "eor %[r], %[r], x3\n\t" 04280 : [r] "+r" (r) 04281 : [a] "r" (a), [b] "r" (b), [one] "r" (one) 04282 : "x2", "x3", "x4", "x5", "x6" 04283 ); 04284 #endif 04285 04286 return r; 04287 } 04288 04289 /* Divide d in a and put remainder into r (m*d + r = a) 04290 * m is not calculated as it is not needed at this time. 04291 * 04292 * a Nmber to be divided. 04293 * d Number to divide with. 04294 * m Multiplier result. 04295 * r Remainder from the division. 04296 * returns MP_OKAY indicating success. 04297 */ 04298 static WC_INLINE int sp_2048_div_32(sp_digit* a, sp_digit* d, sp_digit* m, 04299 sp_digit* r) 04300 { 04301 sp_digit t1[64], t2[33]; 04302 sp_digit div, r1; 04303 int i; 04304 04305 (void)m; 04306 04307 div = d[31]; 04308 XMEMCPY(t1, a, sizeof(*t1) * 2 * 32); 04309 for (i=31; i>=0; i--) { 04310 r1 = div_2048_word_32(t1[32 + i], t1[32 + i - 1], div); 04311 04312 sp_2048_mul_d_32(t2, d, r1); 04313 t1[32 + i] += sp_2048_sub_in_place_32(&t1[i], t2); 04314 t1[32 + i] -= t2[32]; 04315 sp_2048_mask_32(t2, d, t1[32 + i]); 04316 t1[32 + i] += sp_2048_add_32(&t1[i], &t1[i], t2); 04317 sp_2048_mask_32(t2, d, t1[32 + i]); 04318 t1[32 + i] += sp_2048_add_32(&t1[i], &t1[i], t2); 04319 } 04320 04321 r1 = sp_2048_cmp_32(t1, d) >= 0; 04322 sp_2048_cond_sub_32(r, t1, t2, (sp_digit)0 - r1); 04323 04324 return MP_OKAY; 04325 } 04326 04327 /* Reduce a modulo m into r. (r = a mod m) 04328 * 04329 * r A single precision number that is the reduced result. 04330 * a A single precision number that is to be reduced. 04331 * m A single precision number that is the modulus to reduce with. 04332 * returns MP_OKAY indicating success. 04333 */ 04334 static WC_INLINE int sp_2048_mod_32(sp_digit* r, sp_digit* a, sp_digit* m) 04335 { 04336 return sp_2048_div_32(a, m, NULL, r); 04337 } 04338 04339 /* Divide d in a and put remainder into r (m*d + r = a) 04340 * m is not calculated as it is not needed at this time. 04341 * 04342 * a Nmber to be divided. 04343 * d Number to divide with. 04344 * m Multiplier result. 04345 * r Remainder from the division. 04346 * returns MP_OKAY indicating success. 04347 */ 04348 static WC_INLINE int sp_2048_div_32_cond(sp_digit* a, sp_digit* d, sp_digit* m, 04349 sp_digit* r) 04350 { 04351 sp_digit t1[64], t2[33]; 04352 sp_digit div, r1; 04353 int i; 04354 04355 (void)m; 04356 04357 div = d[31]; 04358 XMEMCPY(t1, a, sizeof(*t1) * 2 * 32); 04359 for (i=31; i>=0; i--) { 04360 r1 = div_2048_word_32(t1[32 + i], t1[32 + i - 1], div); 04361 04362 sp_2048_mul_d_32(t2, d, r1); 04363 t1[32 + i] += sp_2048_sub_in_place_32(&t1[i], t2); 04364 t1[32 + i] -= t2[32]; 04365 if (t1[32 + i] != 0) { 04366 t1[32 + i] += sp_2048_add_32(&t1[i], &t1[i], d); 04367 if (t1[32 + i] != 0) 04368 t1[32 + i] += sp_2048_add_32(&t1[i], &t1[i], d); 04369 } 04370 } 04371 04372 r1 = sp_2048_cmp_32(t1, d) >= 0; 04373 sp_2048_cond_sub_32(r, t1, t2, (sp_digit)0 - r1); 04374 04375 return MP_OKAY; 04376 } 04377 04378 /* Reduce a modulo m into r. (r = a mod m) 04379 * 04380 * r A single precision number that is the reduced result. 04381 * a A single precision number that is to be reduced. 04382 * m A single precision number that is the modulus to reduce with. 04383 * returns MP_OKAY indicating success. 04384 */ 04385 static WC_INLINE int sp_2048_mod_32_cond(sp_digit* r, sp_digit* a, sp_digit* m) 04386 { 04387 return sp_2048_div_32_cond(a, m, NULL, r); 04388 } 04389 04390 #if defined(SP_RSA_PRIVATE_EXP_D) || defined(WOLFSSL_HAVE_SP_DH) 04391 #ifdef WOLFSSL_SP_SMALL 04392 /* Modular exponentiate a to the e mod m. (r = a^e mod m) 04393 * 04394 * r A single precision number that is the result of the operation. 04395 * a A single precision number being exponentiated. 04396 * e A single precision number that is the exponent. 04397 * bits The number of bits in the exponent. 04398 * m A single precision number that is the modulus. 04399 * returns 0 on success and MEMORY_E on dynamic memory allocation failure. 04400 */ 04401 static int sp_2048_mod_exp_32(sp_digit* r, sp_digit* a, sp_digit* e, 04402 int bits, sp_digit* m, int reduceA) 04403 { 04404 #ifndef WOLFSSL_SMALL_STACK 04405 sp_digit t[16][64]; 04406 #else 04407 sp_digit* t[16]; 04408 sp_digit* td; 04409 #endif 04410 sp_digit* norm; 04411 sp_digit mp = 1; 04412 sp_digit n; 04413 sp_digit mask; 04414 int i; 04415 int c, y; 04416 int err = MP_OKAY; 04417 04418 #ifdef WOLFSSL_SMALL_STACK 04419 td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 16 * 64, NULL, 04420 DYNAMIC_TYPE_TMP_BUFFER); 04421 if (td == NULL) 04422 err = MEMORY_E; 04423 04424 if (err == MP_OKAY) { 04425 for (i=0; i<16; i++) 04426 t[i] = td + i * 64; 04427 norm = t[0]; 04428 } 04429 #else 04430 norm = t[0]; 04431 #endif 04432 04433 if (err == MP_OKAY) { 04434 sp_2048_mont_setup(m, &mp); 04435 sp_2048_mont_norm_32(norm, m); 04436 04437 XMEMSET(t[1], 0, sizeof(sp_digit) * 32); 04438 if (reduceA) { 04439 err = sp_2048_mod_32(t[1] + 32, a, m); 04440 if (err == MP_OKAY) 04441 err = sp_2048_mod_32(t[1], t[1], m); 04442 } 04443 else { 04444 XMEMCPY(t[1] + 32, a, sizeof(sp_digit) * 32); 04445 err = sp_2048_mod_32(t[1], t[1], m); 04446 } 04447 } 04448 04449 if (err == MP_OKAY) { 04450 sp_2048_mont_sqr_32(t[ 2], t[ 1], m, mp); 04451 sp_2048_mont_mul_32(t[ 3], t[ 2], t[ 1], m, mp); 04452 sp_2048_mont_sqr_32(t[ 4], t[ 2], m, mp); 04453 sp_2048_mont_mul_32(t[ 5], t[ 3], t[ 2], m, mp); 04454 sp_2048_mont_sqr_32(t[ 6], t[ 3], m, mp); 04455 sp_2048_mont_mul_32(t[ 7], t[ 4], t[ 3], m, mp); 04456 sp_2048_mont_sqr_32(t[ 8], t[ 4], m, mp); 04457 sp_2048_mont_mul_32(t[ 9], t[ 5], t[ 4], m, mp); 04458 sp_2048_mont_sqr_32(t[10], t[ 5], m, mp); 04459 sp_2048_mont_mul_32(t[11], t[ 6], t[ 5], m, mp); 04460 sp_2048_mont_sqr_32(t[12], t[ 6], m, mp); 04461 sp_2048_mont_mul_32(t[13], t[ 7], t[ 6], m, mp); 04462 sp_2048_mont_sqr_32(t[14], t[ 7], m, mp); 04463 sp_2048_mont_mul_32(t[15], t[ 8], t[ 7], m, mp); 04464 04465 i = (bits - 1) / 64; 04466 n = e[i--]; 04467 y = n >> 60; 04468 n <<= 4; 04469 c = 60; 04470 XMEMCPY(r, t[y], sizeof(sp_digit) * 32); 04471 for (; i>=0 || c>=4; ) { 04472 if (c == 0) { 04473 n = e[i--]; 04474 y = n >> 60; 04475 n <<= 4; 04476 c = 60; 04477 } 04478 else if (c < 4) { 04479 y = n >> 60; 04480 n = e[i--]; 04481 c = 4 - c; 04482 y |= n >> (64 - c); 04483 n <<= c; 04484 c = 64 - c; 04485 } 04486 else { 04487 y = (n >> 60) & 0xf; 04488 n <<= 4; 04489 c -= 4; 04490 } 04491 04492 sp_2048_mont_sqr_32(r, r, m, mp); 04493 sp_2048_mont_sqr_32(r, r, m, mp); 04494 sp_2048_mont_sqr_32(r, r, m, mp); 04495 sp_2048_mont_sqr_32(r, r, m, mp); 04496 04497 sp_2048_mont_mul_32(r, r, t[y], m, mp); 04498 } 04499 04500 XMEMSET(&r[32], 0, sizeof(sp_digit) * 32); 04501 sp_2048_mont_reduce_32(r, m, mp); 04502 04503 mask = 0 - (sp_2048_cmp_32(r, m) >= 0); 04504 sp_2048_cond_sub_32(r, r, m, mask); 04505 } 04506 04507 #ifdef WOLFSSL_SMALL_STACK 04508 if (td != NULL) 04509 XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); 04510 #endif 04511 04512 return err; 04513 } 04514 #else 04515 /* Modular exponentiate a to the e mod m. (r = a^e mod m) 04516 * 04517 * r A single precision number that is the result of the operation. 04518 * a A single precision number being exponentiated. 04519 * e A single precision number that is the exponent. 04520 * bits The number of bits in the exponent. 04521 * m A single precision number that is the modulus. 04522 * returns 0 on success and MEMORY_E on dynamic memory allocation failure. 04523 */ 04524 static int sp_2048_mod_exp_32(sp_digit* r, sp_digit* a, sp_digit* e, 04525 int bits, sp_digit* m, int reduceA) 04526 { 04527 #ifndef WOLFSSL_SMALL_STACK 04528 sp_digit t[32][64]; 04529 #else 04530 sp_digit* t[32]; 04531 sp_digit* td; 04532 #endif 04533 sp_digit* norm; 04534 sp_digit mp = 1; 04535 sp_digit n; 04536 sp_digit mask; 04537 int i; 04538 int c, y; 04539 int err = MP_OKAY; 04540 04541 #ifdef WOLFSSL_SMALL_STACK 04542 td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32 * 64, NULL, 04543 DYNAMIC_TYPE_TMP_BUFFER); 04544 if (td == NULL) 04545 err = MEMORY_E; 04546 04547 if (err == MP_OKAY) { 04548 for (i=0; i<32; i++) 04549 t[i] = td + i * 64; 04550 norm = t[0]; 04551 } 04552 #else 04553 norm = t[0]; 04554 #endif 04555 04556 if (err == MP_OKAY) { 04557 sp_2048_mont_setup(m, &mp); 04558 sp_2048_mont_norm_32(norm, m); 04559 04560 XMEMSET(t[1], 0, sizeof(sp_digit) * 32); 04561 if (reduceA) { 04562 err = sp_2048_mod_32(t[1] + 32, a, m); 04563 if (err == MP_OKAY) 04564 err = sp_2048_mod_32(t[1], t[1], m); 04565 } 04566 else { 04567 XMEMCPY(t[1] + 32, a, sizeof(sp_digit) * 32); 04568 err = sp_2048_mod_32(t[1], t[1], m); 04569 } 04570 } 04571 04572 if (err == MP_OKAY) { 04573 sp_2048_mont_sqr_32(t[ 2], t[ 1], m, mp); 04574 sp_2048_mont_mul_32(t[ 3], t[ 2], t[ 1], m, mp); 04575 sp_2048_mont_sqr_32(t[ 4], t[ 2], m, mp); 04576 sp_2048_mont_mul_32(t[ 5], t[ 3], t[ 2], m, mp); 04577 sp_2048_mont_sqr_32(t[ 6], t[ 3], m, mp); 04578 sp_2048_mont_mul_32(t[ 7], t[ 4], t[ 3], m, mp); 04579 sp_2048_mont_sqr_32(t[ 8], t[ 4], m, mp); 04580 sp_2048_mont_mul_32(t[ 9], t[ 5], t[ 4], m, mp); 04581 sp_2048_mont_sqr_32(t[10], t[ 5], m, mp); 04582 sp_2048_mont_mul_32(t[11], t[ 6], t[ 5], m, mp); 04583 sp_2048_mont_sqr_32(t[12], t[ 6], m, mp); 04584 sp_2048_mont_mul_32(t[13], t[ 7], t[ 6], m, mp); 04585 sp_2048_mont_sqr_32(t[14], t[ 7], m, mp); 04586 sp_2048_mont_mul_32(t[15], t[ 8], t[ 7], m, mp); 04587 sp_2048_mont_sqr_32(t[16], t[ 8], m, mp); 04588 sp_2048_mont_mul_32(t[17], t[ 9], t[ 8], m, mp); 04589 sp_2048_mont_sqr_32(t[18], t[ 9], m, mp); 04590 sp_2048_mont_mul_32(t[19], t[10], t[ 9], m, mp); 04591 sp_2048_mont_sqr_32(t[20], t[10], m, mp); 04592 sp_2048_mont_mul_32(t[21], t[11], t[10], m, mp); 04593 sp_2048_mont_sqr_32(t[22], t[11], m, mp); 04594 sp_2048_mont_mul_32(t[23], t[12], t[11], m, mp); 04595 sp_2048_mont_sqr_32(t[24], t[12], m, mp); 04596 sp_2048_mont_mul_32(t[25], t[13], t[12], m, mp); 04597 sp_2048_mont_sqr_32(t[26], t[13], m, mp); 04598 sp_2048_mont_mul_32(t[27], t[14], t[13], m, mp); 04599 sp_2048_mont_sqr_32(t[28], t[14], m, mp); 04600 sp_2048_mont_mul_32(t[29], t[15], t[14], m, mp); 04601 sp_2048_mont_sqr_32(t[30], t[15], m, mp); 04602 sp_2048_mont_mul_32(t[31], t[16], t[15], m, mp); 04603 04604 i = (bits - 1) / 64; 04605 n = e[i--]; 04606 y = n >> 59; 04607 n <<= 5; 04608 c = 59; 04609 XMEMCPY(r, t[y], sizeof(sp_digit) * 32); 04610 for (; i>=0 || c>=5; ) { 04611 if (c == 0) { 04612 n = e[i--]; 04613 y = n >> 59; 04614 n <<= 5; 04615 c = 59; 04616 } 04617 else if (c < 5) { 04618 y = n >> 59; 04619 n = e[i--]; 04620 c = 5 - c; 04621 y |= n >> (64 - c); 04622 n <<= c; 04623 c = 64 - c; 04624 } 04625 else { 04626 y = (n >> 59) & 0x1f; 04627 n <<= 5; 04628 c -= 5; 04629 } 04630 04631 sp_2048_mont_sqr_32(r, r, m, mp); 04632 sp_2048_mont_sqr_32(r, r, m, mp); 04633 sp_2048_mont_sqr_32(r, r, m, mp); 04634 sp_2048_mont_sqr_32(r, r, m, mp); 04635 sp_2048_mont_sqr_32(r, r, m, mp); 04636 04637 sp_2048_mont_mul_32(r, r, t[y], m, mp); 04638 } 04639 y = e[0] & 0x7; 04640 sp_2048_mont_sqr_32(r, r, m, mp); 04641 sp_2048_mont_sqr_32(r, r, m, mp); 04642 sp_2048_mont_sqr_32(r, r, m, mp); 04643 sp_2048_mont_mul_32(r, r, t[y], m, mp); 04644 04645 XMEMSET(&r[32], 0, sizeof(sp_digit) * 32); 04646 sp_2048_mont_reduce_32(r, m, mp); 04647 04648 mask = 0 - (sp_2048_cmp_32(r, m) >= 0); 04649 sp_2048_cond_sub_32(r, r, m, mask); 04650 } 04651 04652 #ifdef WOLFSSL_SMALL_STACK 04653 if (td != NULL) 04654 XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); 04655 #endif 04656 04657 return err; 04658 } 04659 #endif /* WOLFSSL_SP_SMALL */ 04660 #endif /* SP_RSA_PRIVATE_EXP_D || WOLFSSL_HAVE_SP_DH */ 04661 04662 #ifdef WOLFSSL_HAVE_SP_RSA 04663 /* RSA public key operation. 04664 * 04665 * in Array of bytes representing the number to exponentiate, base. 04666 * inLen Number of bytes in base. 04667 * em Public exponent. 04668 * mm Modulus. 04669 * out Buffer to hold big-endian bytes of exponentiation result. 04670 * Must be at least 256 bytes long. 04671 * outLen Number of bytes in result. 04672 * returns 0 on success, MP_TO_E when the outLen is too small, MP_READ_E when 04673 * an array is too long and MEMORY_E when dynamic memory allocation fails. 04674 */ 04675 int sp_RsaPublic_2048(const byte* in, word32 inLen, mp_int* em, mp_int* mm, 04676 byte* out, word32* outLen) 04677 { 04678 #if !defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SMALL_STACK) 04679 sp_digit ad[64], md[32], rd[64]; 04680 #else 04681 sp_digit* d = NULL; 04682 #endif 04683 sp_digit* a; 04684 sp_digit *ah; 04685 sp_digit* m; 04686 sp_digit* r; 04687 sp_digit e[1]; 04688 int err = MP_OKAY; 04689 04690 if (*outLen < 256) 04691 err = MP_TO_E; 04692 if (err == MP_OKAY && (mp_count_bits(em) > 64 || inLen > 256 || 04693 mp_count_bits(mm) != 2048)) 04694 err = MP_READ_E; 04695 04696 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK) 04697 if (err == MP_OKAY) { 04698 d = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32 * 5, NULL, 04699 DYNAMIC_TYPE_TMP_BUFFER); 04700 if (d == NULL) 04701 err = MEMORY_E; 04702 } 04703 04704 if (err == MP_OKAY) { 04705 a = d; 04706 r = a + 32 * 2; 04707 m = r + 32 * 2; 04708 ah = a + 32; 04709 } 04710 #else 04711 a = ad; 04712 m = md; 04713 r = rd; 04714 ah = a + 32; 04715 #endif 04716 04717 if (err == MP_OKAY) { 04718 sp_2048_from_bin(ah, 32, in, inLen); 04719 #if DIGIT_BIT >= 64 04720 e[0] = em->dp[0]; 04721 #else 04722 e[0] = em->dp[0]; 04723 if (em->used > 1) 04724 e[0] |= ((sp_digit)em->dp[1]) << DIGIT_BIT; 04725 #endif 04726 if (e[0] == 0) 04727 err = MP_EXPTMOD_E; 04728 } 04729 if (err == MP_OKAY) { 04730 sp_2048_from_mp(m, 32, mm); 04731 04732 if (e[0] == 0x3) { 04733 if (err == MP_OKAY) { 04734 sp_2048_sqr_32(r, ah); 04735 err = sp_2048_mod_32_cond(r, r, m); 04736 } 04737 if (err == MP_OKAY) { 04738 sp_2048_mul_32(r, ah, r); 04739 err = sp_2048_mod_32_cond(r, r, m); 04740 } 04741 } 04742 else { 04743 int i; 04744 sp_digit mp; 04745 04746 sp_2048_mont_setup(m, &mp); 04747 04748 /* Convert to Montgomery form. */ 04749 XMEMSET(a, 0, sizeof(sp_digit) * 32); 04750 err = sp_2048_mod_32_cond(a, a, m); 04751 04752 if (err == MP_OKAY) { 04753 for (i=63; i>=0; i--) 04754 if (e[0] >> i) 04755 break; 04756 04757 XMEMCPY(r, a, sizeof(sp_digit) * 32); 04758 for (i--; i>=0; i--) { 04759 sp_2048_mont_sqr_32(r, r, m, mp); 04760 if (((e[0] >> i) & 1) == 1) 04761 sp_2048_mont_mul_32(r, r, a, m, mp); 04762 } 04763 XMEMSET(&r[32], 0, sizeof(sp_digit) * 32); 04764 sp_2048_mont_reduce_32(r, m, mp); 04765 04766 for (i = 31; i > 0; i--) { 04767 if (r[i] != m[i]) 04768 break; 04769 } 04770 if (r[i] >= m[i]) 04771 sp_2048_sub_in_place_32(r, m); 04772 } 04773 } 04774 } 04775 04776 if (err == MP_OKAY) { 04777 sp_2048_to_bin(r, out); 04778 *outLen = 256; 04779 } 04780 04781 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK) 04782 if (d != NULL) 04783 XFREE(d, NULL, DYNAMIC_TYPE_TMP_BUFFER); 04784 #endif 04785 04786 return err; 04787 } 04788 04789 /* RSA private key operation. 04790 * 04791 * in Array of bytes representing the number to exponentiate, base. 04792 * inLen Number of bytes in base. 04793 * dm Private exponent. 04794 * pm First prime. 04795 * qm Second prime. 04796 * dpm First prime's CRT exponent. 04797 * dqm Second prime's CRT exponent. 04798 * qim Inverse of second prime mod p. 04799 * mm Modulus. 04800 * out Buffer to hold big-endian bytes of exponentiation result. 04801 * Must be at least 256 bytes long. 04802 * outLen Number of bytes in result. 04803 * returns 0 on success, MP_TO_E when the outLen is too small, MP_READ_E when 04804 * an array is too long and MEMORY_E when dynamic memory allocation fails. 04805 */ 04806 int sp_RsaPrivate_2048(const byte* in, word32 inLen, mp_int* dm, 04807 mp_int* pm, mp_int* qm, mp_int* dpm, mp_int* dqm, mp_int* qim, mp_int* mm, 04808 byte* out, word32* outLen) 04809 { 04810 #if !defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SMALL_STACK) 04811 sp_digit ad[32 * 2]; 04812 sp_digit pd[16], qd[16], dpd[16]; 04813 sp_digit tmpad[32], tmpbd[32]; 04814 #else 04815 sp_digit* t = NULL; 04816 #endif 04817 sp_digit* a; 04818 sp_digit* p; 04819 sp_digit* q; 04820 sp_digit* dp; 04821 sp_digit* dq; 04822 sp_digit* qi; 04823 sp_digit* tmp; 04824 sp_digit* tmpa; 04825 sp_digit* tmpb; 04826 sp_digit* r; 04827 sp_digit c; 04828 int err = MP_OKAY; 04829 04830 (void)dm; 04831 (void)mm; 04832 04833 if (*outLen < 256) 04834 err = MP_TO_E; 04835 if (err == MP_OKAY && (inLen > 256 || mp_count_bits(mm) != 2048)) 04836 err = MP_READ_E; 04837 04838 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK) 04839 if (err == MP_OKAY) { 04840 t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 16 * 11, NULL, 04841 DYNAMIC_TYPE_TMP_BUFFER); 04842 if (t == NULL) 04843 err = MEMORY_E; 04844 } 04845 if (err == MP_OKAY) { 04846 a = t; 04847 p = a + 32 * 2; 04848 q = p + 16; 04849 qi = dq = dp = q + 16; 04850 tmpa = qi + 16; 04851 tmpb = tmpa + 32; 04852 04853 tmp = t; 04854 r = tmp + 32; 04855 } 04856 #else 04857 r = a = ad; 04858 p = pd; 04859 q = qd; 04860 qi = dq = dp = dpd; 04861 tmpa = tmpad; 04862 tmpb = tmpbd; 04863 tmp = a + 32; 04864 #endif 04865 04866 if (err == MP_OKAY) { 04867 sp_2048_from_bin(a, 32, in, inLen); 04868 sp_2048_from_mp(p, 16, pm); 04869 sp_2048_from_mp(q, 16, qm); 04870 sp_2048_from_mp(dp, 16, dpm); 04871 04872 err = sp_2048_mod_exp_16(tmpa, a, dp, 1024, p, 1); 04873 } 04874 if (err == MP_OKAY) { 04875 sp_2048_from_mp(dq, 16, dqm); 04876 err = sp_2048_mod_exp_16(tmpb, a, dq, 1024, q, 1); 04877 } 04878 04879 if (err == MP_OKAY) { 04880 c = sp_2048_sub_in_place_16(tmpa, tmpb); 04881 sp_2048_mask_16(tmp, p, c); 04882 sp_2048_add_16(tmpa, tmpa, tmp); 04883 04884 sp_2048_from_mp(qi, 16, qim); 04885 sp_2048_mul_16(tmpa, tmpa, qi); 04886 err = sp_2048_mod_16(tmpa, tmpa, p); 04887 } 04888 04889 if (err == MP_OKAY) { 04890 sp_2048_mul_16(tmpa, q, tmpa); 04891 XMEMSET(&tmpb[16], 0, sizeof(sp_digit) * 16); 04892 sp_2048_add_32(r, tmpb, tmpa); 04893 04894 sp_2048_to_bin(r, out); 04895 *outLen = 256; 04896 } 04897 04898 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK) 04899 if (t != NULL) { 04900 XMEMSET(t, 0, sizeof(sp_digit) * 16 * 11); 04901 XFREE(t, NULL, DYNAMIC_TYPE_TMP_BUFFER); 04902 } 04903 #else 04904 XMEMSET(tmpad, 0, sizeof(tmpad)); 04905 XMEMSET(tmpbd, 0, sizeof(tmpbd)); 04906 XMEMSET(pd, 0, sizeof(pd)); 04907 XMEMSET(qd, 0, sizeof(qd)); 04908 XMEMSET(dpd, 0, sizeof(dpd)); 04909 #endif 04910 04911 return err; 04912 } 04913 #endif /* WOLFSSL_HAVE_SP_RSA */ 04914 #ifdef WOLFSSL_HAVE_SP_DH 04915 /* Convert an array of sp_digit to an mp_int. 04916 * 04917 * a A single precision integer. 04918 * r A multi-precision integer. 04919 */ 04920 static int sp_2048_to_mp(sp_digit* a, mp_int* r) 04921 { 04922 int err; 04923 04924 err = mp_grow(r, (2048 + DIGIT_BIT - 1) / DIGIT_BIT); 04925 if (err == MP_OKAY) { 04926 #if DIGIT_BIT == 64 04927 XMEMCPY(r->dp, a, sizeof(sp_digit) * 32); 04928 r->used = 32; 04929 mp_clamp(r); 04930 #elif DIGIT_BIT < 64 04931 int i, j = 0, s = 0; 04932 04933 r->dp[0] = 0; 04934 for (i = 0; i < 32; i++) { 04935 r->dp[j] |= a[i] << s; 04936 r->dp[j] &= (1l << DIGIT_BIT) - 1; 04937 s = DIGIT_BIT - s; 04938 r->dp[++j] = a[i] >> s; 04939 while (s + DIGIT_BIT <= 64) { 04940 s += DIGIT_BIT; 04941 r->dp[j] &= (1l << DIGIT_BIT) - 1; 04942 r->dp[++j] = a[i] >> s; 04943 } 04944 s = 64 - s; 04945 } 04946 r->used = (2048 + DIGIT_BIT - 1) / DIGIT_BIT; 04947 mp_clamp(r); 04948 #else 04949 int i, j = 0, s = 0; 04950 04951 r->dp[0] = 0; 04952 for (i = 0; i < 32; i++) { 04953 r->dp[j] |= ((mp_digit)a[i]) << s; 04954 if (s + 64 >= DIGIT_BIT) { 04955 #if DIGIT_BIT < 64 04956 r->dp[j] &= (1l << DIGIT_BIT) - 1; 04957 #endif 04958 s = DIGIT_BIT - s; 04959 r->dp[++j] = a[i] >> s; 04960 s = 64 - s; 04961 } 04962 else 04963 s += 64; 04964 } 04965 r->used = (2048 + DIGIT_BIT - 1) / DIGIT_BIT; 04966 mp_clamp(r); 04967 #endif 04968 } 04969 04970 return err; 04971 } 04972 04973 /* Perform the modular exponentiation for Diffie-Hellman. 04974 * 04975 * base Base. MP integer. 04976 * exp Exponent. MP integer. 04977 * mod Modulus. MP integer. 04978 * res Result. MP integer. 04979 * returs 0 on success, MP_READ_E if there are too many bytes in an array 04980 * and MEMORY_E if memory allocation fails. 04981 */ 04982 int sp_ModExp_2048(mp_int* base, mp_int* exp, mp_int* mod, mp_int* res) 04983 { 04984 int err = MP_OKAY; 04985 sp_digit b[64], e[32], m[32]; 04986 sp_digit* r = b; 04987 int expBits = mp_count_bits(exp); 04988 04989 if (mp_count_bits(base) > 2048 || expBits > 2048 || 04990 mp_count_bits(mod) != 2048) { 04991 err = MP_READ_E; 04992 } 04993 04994 if (err == MP_OKAY) { 04995 sp_2048_from_mp(b, 32, base); 04996 sp_2048_from_mp(e, 32, exp); 04997 sp_2048_from_mp(m, 32, mod); 04998 04999 err = sp_2048_mod_exp_32(r, b, e, expBits, m, 0); 05000 } 05001 05002 if (err == MP_OKAY) { 05003 err = sp_2048_to_mp(r, res); 05004 } 05005 05006 XMEMSET(e, 0, sizeof(e)); 05007 05008 return err; 05009 } 05010 05011 /* Perform the modular exponentiation for Diffie-Hellman. 05012 * 05013 * base Base. 05014 * exp Array of bytes that is the exponent. 05015 * expLen Length of data, in bytes, in exponent. 05016 * mod Modulus. 05017 * out Buffer to hold big-endian bytes of exponentiation result. 05018 * Must be at least 256 bytes long. 05019 * outLen Length, in bytes, of exponentiation result. 05020 * returs 0 on success, MP_READ_E if there are too many bytes in an array 05021 * and MEMORY_E if memory allocation fails. 05022 */ 05023 int sp_DhExp_2048(mp_int* base, const byte* exp, word32 expLen, 05024 mp_int* mod, byte* out, word32* outLen) 05025 { 05026 int err = MP_OKAY; 05027 sp_digit b[64], e[32], m[32]; 05028 sp_digit* r = b; 05029 word32 i; 05030 05031 if (mp_count_bits(base) > 2048 || expLen > 256 || 05032 mp_count_bits(mod) != 2048) { 05033 err = MP_READ_E; 05034 } 05035 05036 if (err == MP_OKAY) { 05037 sp_2048_from_mp(b, 32, base); 05038 sp_2048_from_bin(e, 32, exp, expLen); 05039 sp_2048_from_mp(m, 32, mod); 05040 05041 err = sp_2048_mod_exp_32(r, b, e, expLen * 8, m, 0); 05042 } 05043 05044 if (err == MP_OKAY) { 05045 sp_2048_to_bin(r, out); 05046 *outLen = 256; 05047 for (i=0; i<256 && out[i] == 0; i++) { 05048 } 05049 *outLen -= i; 05050 XMEMMOVE(out, out + i, *outLen); 05051 05052 } 05053 05054 XMEMSET(e, 0, sizeof(e)); 05055 05056 return err; 05057 } 05058 05059 #endif /* WOLFSSL_HAVE_SP_DH */ 05060 05061 #endif /* WOLFSSL_SP_NO_2048 */ 05062 05063 #ifndef WOLFSSL_SP_NO_3072 05064 /* Read big endian unsigned byte aray into r. 05065 * 05066 * r A single precision integer. 05067 * a Byte array. 05068 * n Number of bytes in array to read. 05069 */ 05070 static void sp_3072_from_bin(sp_digit* r, int max, const byte* a, int n) 05071 { 05072 int i, j = 0, s = 0; 05073 05074 r[0] = 0; 05075 for (i = n-1; i >= 0; i--) { 05076 r[j] |= ((sp_digit)a[i]) << s; 05077 if (s >= 56) { 05078 r[j] &= 0xffffffffffffffffl; 05079 s = 64 - s; 05080 if (j + 1 >= max) 05081 break; 05082 r[++j] = a[i] >> s; 05083 s = 8 - s; 05084 } 05085 else 05086 s += 8; 05087 } 05088 05089 for (j++; j < max; j++) 05090 r[j] = 0; 05091 } 05092 05093 /* Convert an mp_int to an array of sp_digit. 05094 * 05095 * r A single precision integer. 05096 * a A multi-precision integer. 05097 */ 05098 static void sp_3072_from_mp(sp_digit* r, int max, mp_int* a) 05099 { 05100 #if DIGIT_BIT == 64 05101 int j; 05102 05103 XMEMCPY(r, a->dp, sizeof(sp_digit) * a->used); 05104 05105 for (j = a->used; j < max; j++) 05106 r[j] = 0; 05107 #elif DIGIT_BIT > 64 05108 int i, j = 0, s = 0; 05109 05110 r[0] = 0; 05111 for (i = 0; i < a->used && j < max; i++) { 05112 r[j] |= a->dp[i] << s; 05113 r[j] &= 0xffffffffffffffffl; 05114 s = 64 - s; 05115 if (j + 1 >= max) 05116 break; 05117 r[++j] = a->dp[i] >> s; 05118 while (s + 64 <= DIGIT_BIT) { 05119 s += 64; 05120 r[j] &= 0xffffffffffffffffl; 05121 if (j + 1 >= max) 05122 break; 05123 if (s < DIGIT_BIT) 05124 r[++j] = a->dp[i] >> s; 05125 else 05126 r[++j] = 0; 05127 } 05128 s = DIGIT_BIT - s; 05129 } 05130 05131 for (j++; j < max; j++) 05132 r[j] = 0; 05133 #else 05134 int i, j = 0, s = 0; 05135 05136 r[0] = 0; 05137 for (i = 0; i < a->used && j < max; i++) { 05138 r[j] |= ((sp_digit)a->dp[i]) << s; 05139 if (s + DIGIT_BIT >= 64) { 05140 r[j] &= 0xffffffffffffffffl; 05141 if (j + 1 >= max) 05142 break; 05143 s = 64 - s; 05144 if (s == DIGIT_BIT) { 05145 r[++j] = 0; 05146 s = 0; 05147 } 05148 else { 05149 r[++j] = a->dp[i] >> s; 05150 s = DIGIT_BIT - s; 05151 } 05152 } 05153 else 05154 s += DIGIT_BIT; 05155 } 05156 05157 for (j++; j < max; j++) 05158 r[j] = 0; 05159 #endif 05160 } 05161 05162 /* Write r as big endian to byte aray. 05163 * Fixed length number of bytes written: 384 05164 * 05165 * r A single precision integer. 05166 * a Byte array. 05167 */ 05168 static void sp_3072_to_bin(sp_digit* r, byte* a) 05169 { 05170 int i, j, s = 0, b; 05171 05172 j = 3072 / 8 - 1; 05173 a[j] = 0; 05174 for (i=0; i<48 && j>=0; i++) { 05175 b = 0; 05176 a[j--] |= r[i] << s; b += 8 - s; 05177 if (j < 0) 05178 break; 05179 while (b < 64) { 05180 a[j--] = r[i] >> b; b += 8; 05181 if (j < 0) 05182 break; 05183 } 05184 s = 8 - (b - 64); 05185 if (j >= 0) 05186 a[j] = 0; 05187 if (s != 0) 05188 j++; 05189 } 05190 } 05191 05192 #ifndef WOLFSSL_SP_SMALL 05193 /* Multiply a and b into r. (r = a * b) 05194 * 05195 * r A single precision integer. 05196 * a A single precision integer. 05197 * b A single precision integer. 05198 */ 05199 static void sp_3072_mul_12(sp_digit* r, const sp_digit* a, const sp_digit* b) 05200 { 05201 sp_digit tmp[12]; 05202 05203 __asm__ __volatile__ ( 05204 "# A[0] * B[0]\n\t" 05205 "ldr x7, [%[a], 0]\n\t" 05206 "ldr x8, [%[b], 0]\n\t" 05207 "mul x3, x7, x8\n\t" 05208 "umulh x4, x7, x8\n\t" 05209 "mov x5, 0\n\t" 05210 "str x3, [%[tmp]]\n\t" 05211 "# A[0] * B[1]\n\t" 05212 "ldr x7, [%[a], 0]\n\t" 05213 "ldr x8, [%[b], 8]\n\t" 05214 "mul x6, x7, x8\n\t" 05215 "umulh x7, x7, x8\n\t" 05216 "adds x4, x4, x6\n\t" 05217 "adcs x5, x5, x7\n\t" 05218 "adc x3, xzr, xzr\n\t" 05219 "# A[1] * B[0]\n\t" 05220 "ldr x7, [%[a], 8]\n\t" 05221 "ldr x8, [%[b], 0]\n\t" 05222 "mul x6, x7, x8\n\t" 05223 "umulh x7, x7, x8\n\t" 05224 "adds x4, x4, x6\n\t" 05225 "adcs x5, x5, x7\n\t" 05226 "adc x3, x3, xzr\n\t" 05227 "str x4, [%[tmp], 8]\n\t" 05228 "# A[0] * B[2]\n\t" 05229 "ldr x7, [%[a], 0]\n\t" 05230 "ldr x8, [%[b], 16]\n\t" 05231 "mul x6, x7, x8\n\t" 05232 "umulh x7, x7, x8\n\t" 05233 "adds x5, x5, x6\n\t" 05234 "adcs x3, x3, x7\n\t" 05235 "adc x4, xzr, xzr\n\t" 05236 "# A[1] * B[1]\n\t" 05237 "ldr x7, [%[a], 8]\n\t" 05238 "ldr x8, [%[b], 8]\n\t" 05239 "mul x6, x7, x8\n\t" 05240 "umulh x7, x7, x8\n\t" 05241 "adds x5, x5, x6\n\t" 05242 "adcs x3, x3, x7\n\t" 05243 "adc x4, x4, xzr\n\t" 05244 "# A[2] * B[0]\n\t" 05245 "ldr x7, [%[a], 16]\n\t" 05246 "ldr x8, [%[b], 0]\n\t" 05247 "mul x6, x7, x8\n\t" 05248 "umulh x7, x7, x8\n\t" 05249 "adds x5, x5, x6\n\t" 05250 "adcs x3, x3, x7\n\t" 05251 "adc x4, x4, xzr\n\t" 05252 "str x5, [%[tmp], 16]\n\t" 05253 "# A[0] * B[3]\n\t" 05254 "ldr x7, [%[a], 0]\n\t" 05255 "ldr x8, [%[b], 24]\n\t" 05256 "mul x6, x7, x8\n\t" 05257 "umulh x7, x7, x8\n\t" 05258 "adds x3, x3, x6\n\t" 05259 "adcs x4, x4, x7\n\t" 05260 "adc x5, xzr, xzr\n\t" 05261 "# A[1] * B[2]\n\t" 05262 "ldr x7, [%[a], 8]\n\t" 05263 "ldr x8, [%[b], 16]\n\t" 05264 "mul x6, x7, x8\n\t" 05265 "umulh x7, x7, x8\n\t" 05266 "adds x3, x3, x6\n\t" 05267 "adcs x4, x4, x7\n\t" 05268 "adc x5, x5, xzr\n\t" 05269 "# A[2] * B[1]\n\t" 05270 "ldr x7, [%[a], 16]\n\t" 05271 "ldr x8, [%[b], 8]\n\t" 05272 "mul x6, x7, x8\n\t" 05273 "umulh x7, x7, x8\n\t" 05274 "adds x3, x3, x6\n\t" 05275 "adcs x4, x4, x7\n\t" 05276 "adc x5, x5, xzr\n\t" 05277 "# A[3] * B[0]\n\t" 05278 "ldr x7, [%[a], 24]\n\t" 05279 "ldr x8, [%[b], 0]\n\t" 05280 "mul x6, x7, x8\n\t" 05281 "umulh x7, x7, x8\n\t" 05282 "adds x3, x3, x6\n\t" 05283 "adcs x4, x4, x7\n\t" 05284 "adc x5, x5, xzr\n\t" 05285 "str x3, [%[tmp], 24]\n\t" 05286 "# A[0] * B[4]\n\t" 05287 "ldr x7, [%[a], 0]\n\t" 05288 "ldr x8, [%[b], 32]\n\t" 05289 "mul x6, x7, x8\n\t" 05290 "umulh x7, x7, x8\n\t" 05291 "adds x4, x4, x6\n\t" 05292 "adcs x5, x5, x7\n\t" 05293 "adc x3, xzr, xzr\n\t" 05294 "# A[1] * B[3]\n\t" 05295 "ldr x7, [%[a], 8]\n\t" 05296 "ldr x8, [%[b], 24]\n\t" 05297 "mul x6, x7, x8\n\t" 05298 "umulh x7, x7, x8\n\t" 05299 "adds x4, x4, x6\n\t" 05300 "adcs x5, x5, x7\n\t" 05301 "adc x3, x3, xzr\n\t" 05302 "# A[2] * B[2]\n\t" 05303 "ldr x7, [%[a], 16]\n\t" 05304 "ldr x8, [%[b], 16]\n\t" 05305 "mul x6, x7, x8\n\t" 05306 "umulh x7, x7, x8\n\t" 05307 "adds x4, x4, x6\n\t" 05308 "adcs x5, x5, x7\n\t" 05309 "adc x3, x3, xzr\n\t" 05310 "# A[3] * B[1]\n\t" 05311 "ldr x7, [%[a], 24]\n\t" 05312 "ldr x8, [%[b], 8]\n\t" 05313 "mul x6, x7, x8\n\t" 05314 "umulh x7, x7, x8\n\t" 05315 "adds x4, x4, x6\n\t" 05316 "adcs x5, x5, x7\n\t" 05317 "adc x3, x3, xzr\n\t" 05318 "# A[4] * B[0]\n\t" 05319 "ldr x7, [%[a], 32]\n\t" 05320 "ldr x8, [%[b], 0]\n\t" 05321 "mul x6, x7, x8\n\t" 05322 "umulh x7, x7, x8\n\t" 05323 "adds x4, x4, x6\n\t" 05324 "adcs x5, x5, x7\n\t" 05325 "adc x3, x3, xzr\n\t" 05326 "str x4, [%[tmp], 32]\n\t" 05327 "# A[0] * B[5]\n\t" 05328 "ldr x7, [%[a], 0]\n\t" 05329 "ldr x8, [%[b], 40]\n\t" 05330 "mul x6, x7, x8\n\t" 05331 "umulh x7, x7, x8\n\t" 05332 "adds x5, x5, x6\n\t" 05333 "adcs x3, x3, x7\n\t" 05334 "adc x4, xzr, xzr\n\t" 05335 "# A[1] * B[4]\n\t" 05336 "ldr x7, [%[a], 8]\n\t" 05337 "ldr x8, [%[b], 32]\n\t" 05338 "mul x6, x7, x8\n\t" 05339 "umulh x7, x7, x8\n\t" 05340 "adds x5, x5, x6\n\t" 05341 "adcs x3, x3, x7\n\t" 05342 "adc x4, x4, xzr\n\t" 05343 "# A[2] * B[3]\n\t" 05344 "ldr x7, [%[a], 16]\n\t" 05345 "ldr x8, [%[b], 24]\n\t" 05346 "mul x6, x7, x8\n\t" 05347 "umulh x7, x7, x8\n\t" 05348 "adds x5, x5, x6\n\t" 05349 "adcs x3, x3, x7\n\t" 05350 "adc x4, x4, xzr\n\t" 05351 "# A[3] * B[2]\n\t" 05352 "ldr x7, [%[a], 24]\n\t" 05353 "ldr x8, [%[b], 16]\n\t" 05354 "mul x6, x7, x8\n\t" 05355 "umulh x7, x7, x8\n\t" 05356 "adds x5, x5, x6\n\t" 05357 "adcs x3, x3, x7\n\t" 05358 "adc x4, x4, xzr\n\t" 05359 "# A[4] * B[1]\n\t" 05360 "ldr x7, [%[a], 32]\n\t" 05361 "ldr x8, [%[b], 8]\n\t" 05362 "mul x6, x7, x8\n\t" 05363 "umulh x7, x7, x8\n\t" 05364 "adds x5, x5, x6\n\t" 05365 "adcs x3, x3, x7\n\t" 05366 "adc x4, x4, xzr\n\t" 05367 "# A[5] * B[0]\n\t" 05368 "ldr x7, [%[a], 40]\n\t" 05369 "ldr x8, [%[b], 0]\n\t" 05370 "mul x6, x7, x8\n\t" 05371 "umulh x7, x7, x8\n\t" 05372 "adds x5, x5, x6\n\t" 05373 "adcs x3, x3, x7\n\t" 05374 "adc x4, x4, xzr\n\t" 05375 "str x5, [%[tmp], 40]\n\t" 05376 "# A[0] * B[6]\n\t" 05377 "ldr x7, [%[a], 0]\n\t" 05378 "ldr x8, [%[b], 48]\n\t" 05379 "mul x6, x7, x8\n\t" 05380 "umulh x7, x7, x8\n\t" 05381 "adds x3, x3, x6\n\t" 05382 "adcs x4, x4, x7\n\t" 05383 "adc x5, xzr, xzr\n\t" 05384 "# A[1] * B[5]\n\t" 05385 "ldr x7, [%[a], 8]\n\t" 05386 "ldr x8, [%[b], 40]\n\t" 05387 "mul x6, x7, x8\n\t" 05388 "umulh x7, x7, x8\n\t" 05389 "adds x3, x3, x6\n\t" 05390 "adcs x4, x4, x7\n\t" 05391 "adc x5, x5, xzr\n\t" 05392 "# A[2] * B[4]\n\t" 05393 "ldr x7, [%[a], 16]\n\t" 05394 "ldr x8, [%[b], 32]\n\t" 05395 "mul x6, x7, x8\n\t" 05396 "umulh x7, x7, x8\n\t" 05397 "adds x3, x3, x6\n\t" 05398 "adcs x4, x4, x7\n\t" 05399 "adc x5, x5, xzr\n\t" 05400 "# A[3] * B[3]\n\t" 05401 "ldr x7, [%[a], 24]\n\t" 05402 "ldr x8, [%[b], 24]\n\t" 05403 "mul x6, x7, x8\n\t" 05404 "umulh x7, x7, x8\n\t" 05405 "adds x3, x3, x6\n\t" 05406 "adcs x4, x4, x7\n\t" 05407 "adc x5, x5, xzr\n\t" 05408 "# A[4] * B[2]\n\t" 05409 "ldr x7, [%[a], 32]\n\t" 05410 "ldr x8, [%[b], 16]\n\t" 05411 "mul x6, x7, x8\n\t" 05412 "umulh x7, x7, x8\n\t" 05413 "adds x3, x3, x6\n\t" 05414 "adcs x4, x4, x7\n\t" 05415 "adc x5, x5, xzr\n\t" 05416 "# A[5] * B[1]\n\t" 05417 "ldr x7, [%[a], 40]\n\t" 05418 "ldr x8, [%[b], 8]\n\t" 05419 "mul x6, x7, x8\n\t" 05420 "umulh x7, x7, x8\n\t" 05421 "adds x3, x3, x6\n\t" 05422 "adcs x4, x4, x7\n\t" 05423 "adc x5, x5, xzr\n\t" 05424 "# A[6] * B[0]\n\t" 05425 "ldr x7, [%[a], 48]\n\t" 05426 "ldr x8, [%[b], 0]\n\t" 05427 "mul x6, x7, x8\n\t" 05428 "umulh x7, x7, x8\n\t" 05429 "adds x3, x3, x6\n\t" 05430 "adcs x4, x4, x7\n\t" 05431 "adc x5, x5, xzr\n\t" 05432 "str x3, [%[tmp], 48]\n\t" 05433 "# A[0] * B[7]\n\t" 05434 "ldr x7, [%[a], 0]\n\t" 05435 "ldr x8, [%[b], 56]\n\t" 05436 "mul x6, x7, x8\n\t" 05437 "umulh x7, x7, x8\n\t" 05438 "adds x4, x4, x6\n\t" 05439 "adcs x5, x5, x7\n\t" 05440 "adc x3, xzr, xzr\n\t" 05441 "# A[1] * B[6]\n\t" 05442 "ldr x7, [%[a], 8]\n\t" 05443 "ldr x8, [%[b], 48]\n\t" 05444 "mul x6, x7, x8\n\t" 05445 "umulh x7, x7, x8\n\t" 05446 "adds x4, x4, x6\n\t" 05447 "adcs x5, x5, x7\n\t" 05448 "adc x3, x3, xzr\n\t" 05449 "# A[2] * B[5]\n\t" 05450 "ldr x7, [%[a], 16]\n\t" 05451 "ldr x8, [%[b], 40]\n\t" 05452 "mul x6, x7, x8\n\t" 05453 "umulh x7, x7, x8\n\t" 05454 "adds x4, x4, x6\n\t" 05455 "adcs x5, x5, x7\n\t" 05456 "adc x3, x3, xzr\n\t" 05457 "# A[3] * B[4]\n\t" 05458 "ldr x7, [%[a], 24]\n\t" 05459 "ldr x8, [%[b], 32]\n\t" 05460 "mul x6, x7, x8\n\t" 05461 "umulh x7, x7, x8\n\t" 05462 "adds x4, x4, x6\n\t" 05463 "adcs x5, x5, x7\n\t" 05464 "adc x3, x3, xzr\n\t" 05465 "# A[4] * B[3]\n\t" 05466 "ldr x7, [%[a], 32]\n\t" 05467 "ldr x8, [%[b], 24]\n\t" 05468 "mul x6, x7, x8\n\t" 05469 "umulh x7, x7, x8\n\t" 05470 "adds x4, x4, x6\n\t" 05471 "adcs x5, x5, x7\n\t" 05472 "adc x3, x3, xzr\n\t" 05473 "# A[5] * B[2]\n\t" 05474 "ldr x7, [%[a], 40]\n\t" 05475 "ldr x8, [%[b], 16]\n\t" 05476 "mul x6, x7, x8\n\t" 05477 "umulh x7, x7, x8\n\t" 05478 "adds x4, x4, x6\n\t" 05479 "adcs x5, x5, x7\n\t" 05480 "adc x3, x3, xzr\n\t" 05481 "# A[6] * B[1]\n\t" 05482 "ldr x7, [%[a], 48]\n\t" 05483 "ldr x8, [%[b], 8]\n\t" 05484 "mul x6, x7, x8\n\t" 05485 "umulh x7, x7, x8\n\t" 05486 "adds x4, x4, x6\n\t" 05487 "adcs x5, x5, x7\n\t" 05488 "adc x3, x3, xzr\n\t" 05489 "# A[7] * B[0]\n\t" 05490 "ldr x7, [%[a], 56]\n\t" 05491 "ldr x8, [%[b], 0]\n\t" 05492 "mul x6, x7, x8\n\t" 05493 "umulh x7, x7, x8\n\t" 05494 "adds x4, x4, x6\n\t" 05495 "adcs x5, x5, x7\n\t" 05496 "adc x3, x3, xzr\n\t" 05497 "str x4, [%[tmp], 56]\n\t" 05498 "# A[0] * B[8]\n\t" 05499 "ldr x7, [%[a], 0]\n\t" 05500 "ldr x8, [%[b], 64]\n\t" 05501 "mul x6, x7, x8\n\t" 05502 "umulh x7, x7, x8\n\t" 05503 "adds x5, x5, x6\n\t" 05504 "adcs x3, x3, x7\n\t" 05505 "adc x4, xzr, xzr\n\t" 05506 "# A[1] * B[7]\n\t" 05507 "ldr x7, [%[a], 8]\n\t" 05508 "ldr x8, [%[b], 56]\n\t" 05509 "mul x6, x7, x8\n\t" 05510 "umulh x7, x7, x8\n\t" 05511 "adds x5, x5, x6\n\t" 05512 "adcs x3, x3, x7\n\t" 05513 "adc x4, x4, xzr\n\t" 05514 "# A[2] * B[6]\n\t" 05515 "ldr x7, [%[a], 16]\n\t" 05516 "ldr x8, [%[b], 48]\n\t" 05517 "mul x6, x7, x8\n\t" 05518 "umulh x7, x7, x8\n\t" 05519 "adds x5, x5, x6\n\t" 05520 "adcs x3, x3, x7\n\t" 05521 "adc x4, x4, xzr\n\t" 05522 "# A[3] * B[5]\n\t" 05523 "ldr x7, [%[a], 24]\n\t" 05524 "ldr x8, [%[b], 40]\n\t" 05525 "mul x6, x7, x8\n\t" 05526 "umulh x7, x7, x8\n\t" 05527 "adds x5, x5, x6\n\t" 05528 "adcs x3, x3, x7\n\t" 05529 "adc x4, x4, xzr\n\t" 05530 "# A[4] * B[4]\n\t" 05531 "ldr x7, [%[a], 32]\n\t" 05532 "ldr x8, [%[b], 32]\n\t" 05533 "mul x6, x7, x8\n\t" 05534 "umulh x7, x7, x8\n\t" 05535 "adds x5, x5, x6\n\t" 05536 "adcs x3, x3, x7\n\t" 05537 "adc x4, x4, xzr\n\t" 05538 "# A[5] * B[3]\n\t" 05539 "ldr x7, [%[a], 40]\n\t" 05540 "ldr x8, [%[b], 24]\n\t" 05541 "mul x6, x7, x8\n\t" 05542 "umulh x7, x7, x8\n\t" 05543 "adds x5, x5, x6\n\t" 05544 "adcs x3, x3, x7\n\t" 05545 "adc x4, x4, xzr\n\t" 05546 "# A[6] * B[2]\n\t" 05547 "ldr x7, [%[a], 48]\n\t" 05548 "ldr x8, [%[b], 16]\n\t" 05549 "mul x6, x7, x8\n\t" 05550 "umulh x7, x7, x8\n\t" 05551 "adds x5, x5, x6\n\t" 05552 "adcs x3, x3, x7\n\t" 05553 "adc x4, x4, xzr\n\t" 05554 "# A[7] * B[1]\n\t" 05555 "ldr x7, [%[a], 56]\n\t" 05556 "ldr x8, [%[b], 8]\n\t" 05557 "mul x6, x7, x8\n\t" 05558 "umulh x7, x7, x8\n\t" 05559 "adds x5, x5, x6\n\t" 05560 "adcs x3, x3, x7\n\t" 05561 "adc x4, x4, xzr\n\t" 05562 "# A[8] * B[0]\n\t" 05563 "ldr x7, [%[a], 64]\n\t" 05564 "ldr x8, [%[b], 0]\n\t" 05565 "mul x6, x7, x8\n\t" 05566 "umulh x7, x7, x8\n\t" 05567 "adds x5, x5, x6\n\t" 05568 "adcs x3, x3, x7\n\t" 05569 "adc x4, x4, xzr\n\t" 05570 "str x5, [%[tmp], 64]\n\t" 05571 "# A[0] * B[9]\n\t" 05572 "ldr x7, [%[a], 0]\n\t" 05573 "ldr x8, [%[b], 72]\n\t" 05574 "mul x6, x7, x8\n\t" 05575 "umulh x7, x7, x8\n\t" 05576 "adds x3, x3, x6\n\t" 05577 "adcs x4, x4, x7\n\t" 05578 "adc x5, xzr, xzr\n\t" 05579 "# A[1] * B[8]\n\t" 05580 "ldr x7, [%[a], 8]\n\t" 05581 "ldr x8, [%[b], 64]\n\t" 05582 "mul x6, x7, x8\n\t" 05583 "umulh x7, x7, x8\n\t" 05584 "adds x3, x3, x6\n\t" 05585 "adcs x4, x4, x7\n\t" 05586 "adc x5, x5, xzr\n\t" 05587 "# A[2] * B[7]\n\t" 05588 "ldr x7, [%[a], 16]\n\t" 05589 "ldr x8, [%[b], 56]\n\t" 05590 "mul x6, x7, x8\n\t" 05591 "umulh x7, x7, x8\n\t" 05592 "adds x3, x3, x6\n\t" 05593 "adcs x4, x4, x7\n\t" 05594 "adc x5, x5, xzr\n\t" 05595 "# A[3] * B[6]\n\t" 05596 "ldr x7, [%[a], 24]\n\t" 05597 "ldr x8, [%[b], 48]\n\t" 05598 "mul x6, x7, x8\n\t" 05599 "umulh x7, x7, x8\n\t" 05600 "adds x3, x3, x6\n\t" 05601 "adcs x4, x4, x7\n\t" 05602 "adc x5, x5, xzr\n\t" 05603 "# A[4] * B[5]\n\t" 05604 "ldr x7, [%[a], 32]\n\t" 05605 "ldr x8, [%[b], 40]\n\t" 05606 "mul x6, x7, x8\n\t" 05607 "umulh x7, x7, x8\n\t" 05608 "adds x3, x3, x6\n\t" 05609 "adcs x4, x4, x7\n\t" 05610 "adc x5, x5, xzr\n\t" 05611 "# A[5] * B[4]\n\t" 05612 "ldr x7, [%[a], 40]\n\t" 05613 "ldr x8, [%[b], 32]\n\t" 05614 "mul x6, x7, x8\n\t" 05615 "umulh x7, x7, x8\n\t" 05616 "adds x3, x3, x6\n\t" 05617 "adcs x4, x4, x7\n\t" 05618 "adc x5, x5, xzr\n\t" 05619 "# A[6] * B[3]\n\t" 05620 "ldr x7, [%[a], 48]\n\t" 05621 "ldr x8, [%[b], 24]\n\t" 05622 "mul x6, x7, x8\n\t" 05623 "umulh x7, x7, x8\n\t" 05624 "adds x3, x3, x6\n\t" 05625 "adcs x4, x4, x7\n\t" 05626 "adc x5, x5, xzr\n\t" 05627 "# A[7] * B[2]\n\t" 05628 "ldr x7, [%[a], 56]\n\t" 05629 "ldr x8, [%[b], 16]\n\t" 05630 "mul x6, x7, x8\n\t" 05631 "umulh x7, x7, x8\n\t" 05632 "adds x3, x3, x6\n\t" 05633 "adcs x4, x4, x7\n\t" 05634 "adc x5, x5, xzr\n\t" 05635 "# A[8] * B[1]\n\t" 05636 "ldr x7, [%[a], 64]\n\t" 05637 "ldr x8, [%[b], 8]\n\t" 05638 "mul x6, x7, x8\n\t" 05639 "umulh x7, x7, x8\n\t" 05640 "adds x3, x3, x6\n\t" 05641 "adcs x4, x4, x7\n\t" 05642 "adc x5, x5, xzr\n\t" 05643 "# A[9] * B[0]\n\t" 05644 "ldr x7, [%[a], 72]\n\t" 05645 "ldr x8, [%[b], 0]\n\t" 05646 "mul x6, x7, x8\n\t" 05647 "umulh x7, x7, x8\n\t" 05648 "adds x3, x3, x6\n\t" 05649 "adcs x4, x4, x7\n\t" 05650 "adc x5, x5, xzr\n\t" 05651 "str x3, [%[tmp], 72]\n\t" 05652 "# A[0] * B[10]\n\t" 05653 "ldr x7, [%[a], 0]\n\t" 05654 "ldr x8, [%[b], 80]\n\t" 05655 "mul x6, x7, x8\n\t" 05656 "umulh x7, x7, x8\n\t" 05657 "adds x4, x4, x6\n\t" 05658 "adcs x5, x5, x7\n\t" 05659 "adc x3, xzr, xzr\n\t" 05660 "# A[1] * B[9]\n\t" 05661 "ldr x7, [%[a], 8]\n\t" 05662 "ldr x8, [%[b], 72]\n\t" 05663 "mul x6, x7, x8\n\t" 05664 "umulh x7, x7, x8\n\t" 05665 "adds x4, x4, x6\n\t" 05666 "adcs x5, x5, x7\n\t" 05667 "adc x3, x3, xzr\n\t" 05668 "# A[2] * B[8]\n\t" 05669 "ldr x7, [%[a], 16]\n\t" 05670 "ldr x8, [%[b], 64]\n\t" 05671 "mul x6, x7, x8\n\t" 05672 "umulh x7, x7, x8\n\t" 05673 "adds x4, x4, x6\n\t" 05674 "adcs x5, x5, x7\n\t" 05675 "adc x3, x3, xzr\n\t" 05676 "# A[3] * B[7]\n\t" 05677 "ldr x7, [%[a], 24]\n\t" 05678 "ldr x8, [%[b], 56]\n\t" 05679 "mul x6, x7, x8\n\t" 05680 "umulh x7, x7, x8\n\t" 05681 "adds x4, x4, x6\n\t" 05682 "adcs x5, x5, x7\n\t" 05683 "adc x3, x3, xzr\n\t" 05684 "# A[4] * B[6]\n\t" 05685 "ldr x7, [%[a], 32]\n\t" 05686 "ldr x8, [%[b], 48]\n\t" 05687 "mul x6, x7, x8\n\t" 05688 "umulh x7, x7, x8\n\t" 05689 "adds x4, x4, x6\n\t" 05690 "adcs x5, x5, x7\n\t" 05691 "adc x3, x3, xzr\n\t" 05692 "# A[5] * B[5]\n\t" 05693 "ldr x7, [%[a], 40]\n\t" 05694 "ldr x8, [%[b], 40]\n\t" 05695 "mul x6, x7, x8\n\t" 05696 "umulh x7, x7, x8\n\t" 05697 "adds x4, x4, x6\n\t" 05698 "adcs x5, x5, x7\n\t" 05699 "adc x3, x3, xzr\n\t" 05700 "# A[6] * B[4]\n\t" 05701 "ldr x7, [%[a], 48]\n\t" 05702 "ldr x8, [%[b], 32]\n\t" 05703 "mul x6, x7, x8\n\t" 05704 "umulh x7, x7, x8\n\t" 05705 "adds x4, x4, x6\n\t" 05706 "adcs x5, x5, x7\n\t" 05707 "adc x3, x3, xzr\n\t" 05708 "# A[7] * B[3]\n\t" 05709 "ldr x7, [%[a], 56]\n\t" 05710 "ldr x8, [%[b], 24]\n\t" 05711 "mul x6, x7, x8\n\t" 05712 "umulh x7, x7, x8\n\t" 05713 "adds x4, x4, x6\n\t" 05714 "adcs x5, x5, x7\n\t" 05715 "adc x3, x3, xzr\n\t" 05716 "# A[8] * B[2]\n\t" 05717 "ldr x7, [%[a], 64]\n\t" 05718 "ldr x8, [%[b], 16]\n\t" 05719 "mul x6, x7, x8\n\t" 05720 "umulh x7, x7, x8\n\t" 05721 "adds x4, x4, x6\n\t" 05722 "adcs x5, x5, x7\n\t" 05723 "adc x3, x3, xzr\n\t" 05724 "# A[9] * B[1]\n\t" 05725 "ldr x7, [%[a], 72]\n\t" 05726 "ldr x8, [%[b], 8]\n\t" 05727 "mul x6, x7, x8\n\t" 05728 "umulh x7, x7, x8\n\t" 05729 "adds x4, x4, x6\n\t" 05730 "adcs x5, x5, x7\n\t" 05731 "adc x3, x3, xzr\n\t" 05732 "# A[10] * B[0]\n\t" 05733 "ldr x7, [%[a], 80]\n\t" 05734 "ldr x8, [%[b], 0]\n\t" 05735 "mul x6, x7, x8\n\t" 05736 "umulh x7, x7, x8\n\t" 05737 "adds x4, x4, x6\n\t" 05738 "adcs x5, x5, x7\n\t" 05739 "adc x3, x3, xzr\n\t" 05740 "str x4, [%[tmp], 80]\n\t" 05741 "# A[0] * B[11]\n\t" 05742 "ldr x7, [%[a], 0]\n\t" 05743 "ldr x8, [%[b], 88]\n\t" 05744 "mul x6, x7, x8\n\t" 05745 "umulh x7, x7, x8\n\t" 05746 "adds x5, x5, x6\n\t" 05747 "adcs x3, x3, x7\n\t" 05748 "adc x4, xzr, xzr\n\t" 05749 "# A[1] * B[10]\n\t" 05750 "ldr x7, [%[a], 8]\n\t" 05751 "ldr x8, [%[b], 80]\n\t" 05752 "mul x6, x7, x8\n\t" 05753 "umulh x7, x7, x8\n\t" 05754 "adds x5, x5, x6\n\t" 05755 "adcs x3, x3, x7\n\t" 05756 "adc x4, x4, xzr\n\t" 05757 "# A[2] * B[9]\n\t" 05758 "ldr x7, [%[a], 16]\n\t" 05759 "ldr x8, [%[b], 72]\n\t" 05760 "mul x6, x7, x8\n\t" 05761 "umulh x7, x7, x8\n\t" 05762 "adds x5, x5, x6\n\t" 05763 "adcs x3, x3, x7\n\t" 05764 "adc x4, x4, xzr\n\t" 05765 "# A[3] * B[8]\n\t" 05766 "ldr x7, [%[a], 24]\n\t" 05767 "ldr x8, [%[b], 64]\n\t" 05768 "mul x6, x7, x8\n\t" 05769 "umulh x7, x7, x8\n\t" 05770 "adds x5, x5, x6\n\t" 05771 "adcs x3, x3, x7\n\t" 05772 "adc x4, x4, xzr\n\t" 05773 "# A[4] * B[7]\n\t" 05774 "ldr x7, [%[a], 32]\n\t" 05775 "ldr x8, [%[b], 56]\n\t" 05776 "mul x6, x7, x8\n\t" 05777 "umulh x7, x7, x8\n\t" 05778 "adds x5, x5, x6\n\t" 05779 "adcs x3, x3, x7\n\t" 05780 "adc x4, x4, xzr\n\t" 05781 "# A[5] * B[6]\n\t" 05782 "ldr x7, [%[a], 40]\n\t" 05783 "ldr x8, [%[b], 48]\n\t" 05784 "mul x6, x7, x8\n\t" 05785 "umulh x7, x7, x8\n\t" 05786 "adds x5, x5, x6\n\t" 05787 "adcs x3, x3, x7\n\t" 05788 "adc x4, x4, xzr\n\t" 05789 "# A[6] * B[5]\n\t" 05790 "ldr x7, [%[a], 48]\n\t" 05791 "ldr x8, [%[b], 40]\n\t" 05792 "mul x6, x7, x8\n\t" 05793 "umulh x7, x7, x8\n\t" 05794 "adds x5, x5, x6\n\t" 05795 "adcs x3, x3, x7\n\t" 05796 "adc x4, x4, xzr\n\t" 05797 "# A[7] * B[4]\n\t" 05798 "ldr x7, [%[a], 56]\n\t" 05799 "ldr x8, [%[b], 32]\n\t" 05800 "mul x6, x7, x8\n\t" 05801 "umulh x7, x7, x8\n\t" 05802 "adds x5, x5, x6\n\t" 05803 "adcs x3, x3, x7\n\t" 05804 "adc x4, x4, xzr\n\t" 05805 "# A[8] * B[3]\n\t" 05806 "ldr x7, [%[a], 64]\n\t" 05807 "ldr x8, [%[b], 24]\n\t" 05808 "mul x6, x7, x8\n\t" 05809 "umulh x7, x7, x8\n\t" 05810 "adds x5, x5, x6\n\t" 05811 "adcs x3, x3, x7\n\t" 05812 "adc x4, x4, xzr\n\t" 05813 "# A[9] * B[2]\n\t" 05814 "ldr x7, [%[a], 72]\n\t" 05815 "ldr x8, [%[b], 16]\n\t" 05816 "mul x6, x7, x8\n\t" 05817 "umulh x7, x7, x8\n\t" 05818 "adds x5, x5, x6\n\t" 05819 "adcs x3, x3, x7\n\t" 05820 "adc x4, x4, xzr\n\t" 05821 "# A[10] * B[1]\n\t" 05822 "ldr x7, [%[a], 80]\n\t" 05823 "ldr x8, [%[b], 8]\n\t" 05824 "mul x6, x7, x8\n\t" 05825 "umulh x7, x7, x8\n\t" 05826 "adds x5, x5, x6\n\t" 05827 "adcs x3, x3, x7\n\t" 05828 "adc x4, x4, xzr\n\t" 05829 "# A[11] * B[0]\n\t" 05830 "ldr x7, [%[a], 88]\n\t" 05831 "ldr x8, [%[b], 0]\n\t" 05832 "mul x6, x7, x8\n\t" 05833 "umulh x7, x7, x8\n\t" 05834 "adds x5, x5, x6\n\t" 05835 "adcs x3, x3, x7\n\t" 05836 "adc x4, x4, xzr\n\t" 05837 "str x5, [%[tmp], 88]\n\t" 05838 "# A[1] * B[11]\n\t" 05839 "ldr x7, [%[a], 8]\n\t" 05840 "ldr x8, [%[b], 88]\n\t" 05841 "mul x6, x7, x8\n\t" 05842 "umulh x7, x7, x8\n\t" 05843 "adds x3, x3, x6\n\t" 05844 "adcs x4, x4, x7\n\t" 05845 "adc x5, xzr, xzr\n\t" 05846 "# A[2] * B[10]\n\t" 05847 "ldr x7, [%[a], 16]\n\t" 05848 "ldr x8, [%[b], 80]\n\t" 05849 "mul x6, x7, x8\n\t" 05850 "umulh x7, x7, x8\n\t" 05851 "adds x3, x3, x6\n\t" 05852 "adcs x4, x4, x7\n\t" 05853 "adc x5, x5, xzr\n\t" 05854 "# A[3] * B[9]\n\t" 05855 "ldr x7, [%[a], 24]\n\t" 05856 "ldr x8, [%[b], 72]\n\t" 05857 "mul x6, x7, x8\n\t" 05858 "umulh x7, x7, x8\n\t" 05859 "adds x3, x3, x6\n\t" 05860 "adcs x4, x4, x7\n\t" 05861 "adc x5, x5, xzr\n\t" 05862 "# A[4] * B[8]\n\t" 05863 "ldr x7, [%[a], 32]\n\t" 05864 "ldr x8, [%[b], 64]\n\t" 05865 "mul x6, x7, x8\n\t" 05866 "umulh x7, x7, x8\n\t" 05867 "adds x3, x3, x6\n\t" 05868 "adcs x4, x4, x7\n\t" 05869 "adc x5, x5, xzr\n\t" 05870 "# A[5] * B[7]\n\t" 05871 "ldr x7, [%[a], 40]\n\t" 05872 "ldr x8, [%[b], 56]\n\t" 05873 "mul x6, x7, x8\n\t" 05874 "umulh x7, x7, x8\n\t" 05875 "adds x3, x3, x6\n\t" 05876 "adcs x4, x4, x7\n\t" 05877 "adc x5, x5, xzr\n\t" 05878 "# A[6] * B[6]\n\t" 05879 "ldr x7, [%[a], 48]\n\t" 05880 "ldr x8, [%[b], 48]\n\t" 05881 "mul x6, x7, x8\n\t" 05882 "umulh x7, x7, x8\n\t" 05883 "adds x3, x3, x6\n\t" 05884 "adcs x4, x4, x7\n\t" 05885 "adc x5, x5, xzr\n\t" 05886 "# A[7] * B[5]\n\t" 05887 "ldr x7, [%[a], 56]\n\t" 05888 "ldr x8, [%[b], 40]\n\t" 05889 "mul x6, x7, x8\n\t" 05890 "umulh x7, x7, x8\n\t" 05891 "adds x3, x3, x6\n\t" 05892 "adcs x4, x4, x7\n\t" 05893 "adc x5, x5, xzr\n\t" 05894 "# A[8] * B[4]\n\t" 05895 "ldr x7, [%[a], 64]\n\t" 05896 "ldr x8, [%[b], 32]\n\t" 05897 "mul x6, x7, x8\n\t" 05898 "umulh x7, x7, x8\n\t" 05899 "adds x3, x3, x6\n\t" 05900 "adcs x4, x4, x7\n\t" 05901 "adc x5, x5, xzr\n\t" 05902 "# A[9] * B[3]\n\t" 05903 "ldr x7, [%[a], 72]\n\t" 05904 "ldr x8, [%[b], 24]\n\t" 05905 "mul x6, x7, x8\n\t" 05906 "umulh x7, x7, x8\n\t" 05907 "adds x3, x3, x6\n\t" 05908 "adcs x4, x4, x7\n\t" 05909 "adc x5, x5, xzr\n\t" 05910 "# A[10] * B[2]\n\t" 05911 "ldr x7, [%[a], 80]\n\t" 05912 "ldr x8, [%[b], 16]\n\t" 05913 "mul x6, x7, x8\n\t" 05914 "umulh x7, x7, x8\n\t" 05915 "adds x3, x3, x6\n\t" 05916 "adcs x4, x4, x7\n\t" 05917 "adc x5, x5, xzr\n\t" 05918 "# A[11] * B[1]\n\t" 05919 "ldr x7, [%[a], 88]\n\t" 05920 "ldr x8, [%[b], 8]\n\t" 05921 "mul x6, x7, x8\n\t" 05922 "umulh x7, x7, x8\n\t" 05923 "adds x3, x3, x6\n\t" 05924 "adcs x4, x4, x7\n\t" 05925 "adc x5, x5, xzr\n\t" 05926 "str x3, [%[r], 96]\n\t" 05927 "# A[2] * B[11]\n\t" 05928 "ldr x7, [%[a], 16]\n\t" 05929 "ldr x8, [%[b], 88]\n\t" 05930 "mul x6, x7, x8\n\t" 05931 "umulh x7, x7, x8\n\t" 05932 "adds x4, x4, x6\n\t" 05933 "adcs x5, x5, x7\n\t" 05934 "adc x3, xzr, xzr\n\t" 05935 "# A[3] * B[10]\n\t" 05936 "ldr x7, [%[a], 24]\n\t" 05937 "ldr x8, [%[b], 80]\n\t" 05938 "mul x6, x7, x8\n\t" 05939 "umulh x7, x7, x8\n\t" 05940 "adds x4, x4, x6\n\t" 05941 "adcs x5, x5, x7\n\t" 05942 "adc x3, x3, xzr\n\t" 05943 "# A[4] * B[9]\n\t" 05944 "ldr x7, [%[a], 32]\n\t" 05945 "ldr x8, [%[b], 72]\n\t" 05946 "mul x6, x7, x8\n\t" 05947 "umulh x7, x7, x8\n\t" 05948 "adds x4, x4, x6\n\t" 05949 "adcs x5, x5, x7\n\t" 05950 "adc x3, x3, xzr\n\t" 05951 "# A[5] * B[8]\n\t" 05952 "ldr x7, [%[a], 40]\n\t" 05953 "ldr x8, [%[b], 64]\n\t" 05954 "mul x6, x7, x8\n\t" 05955 "umulh x7, x7, x8\n\t" 05956 "adds x4, x4, x6\n\t" 05957 "adcs x5, x5, x7\n\t" 05958 "adc x3, x3, xzr\n\t" 05959 "# A[6] * B[7]\n\t" 05960 "ldr x7, [%[a], 48]\n\t" 05961 "ldr x8, [%[b], 56]\n\t" 05962 "mul x6, x7, x8\n\t" 05963 "umulh x7, x7, x8\n\t" 05964 "adds x4, x4, x6\n\t" 05965 "adcs x5, x5, x7\n\t" 05966 "adc x3, x3, xzr\n\t" 05967 "# A[7] * B[6]\n\t" 05968 "ldr x7, [%[a], 56]\n\t" 05969 "ldr x8, [%[b], 48]\n\t" 05970 "mul x6, x7, x8\n\t" 05971 "umulh x7, x7, x8\n\t" 05972 "adds x4, x4, x6\n\t" 05973 "adcs x5, x5, x7\n\t" 05974 "adc x3, x3, xzr\n\t" 05975 "# A[8] * B[5]\n\t" 05976 "ldr x7, [%[a], 64]\n\t" 05977 "ldr x8, [%[b], 40]\n\t" 05978 "mul x6, x7, x8\n\t" 05979 "umulh x7, x7, x8\n\t" 05980 "adds x4, x4, x6\n\t" 05981 "adcs x5, x5, x7\n\t" 05982 "adc x3, x3, xzr\n\t" 05983 "# A[9] * B[4]\n\t" 05984 "ldr x7, [%[a], 72]\n\t" 05985 "ldr x8, [%[b], 32]\n\t" 05986 "mul x6, x7, x8\n\t" 05987 "umulh x7, x7, x8\n\t" 05988 "adds x4, x4, x6\n\t" 05989 "adcs x5, x5, x7\n\t" 05990 "adc x3, x3, xzr\n\t" 05991 "# A[10] * B[3]\n\t" 05992 "ldr x7, [%[a], 80]\n\t" 05993 "ldr x8, [%[b], 24]\n\t" 05994 "mul x6, x7, x8\n\t" 05995 "umulh x7, x7, x8\n\t" 05996 "adds x4, x4, x6\n\t" 05997 "adcs x5, x5, x7\n\t" 05998 "adc x3, x3, xzr\n\t" 05999 "# A[11] * B[2]\n\t" 06000 "ldr x7, [%[a], 88]\n\t" 06001 "ldr x8, [%[b], 16]\n\t" 06002 "mul x6, x7, x8\n\t" 06003 "umulh x7, x7, x8\n\t" 06004 "adds x4, x4, x6\n\t" 06005 "adcs x5, x5, x7\n\t" 06006 "adc x3, x3, xzr\n\t" 06007 "str x4, [%[r], 104]\n\t" 06008 "# A[3] * B[11]\n\t" 06009 "ldr x7, [%[a], 24]\n\t" 06010 "ldr x8, [%[b], 88]\n\t" 06011 "mul x6, x7, x8\n\t" 06012 "umulh x7, x7, x8\n\t" 06013 "adds x5, x5, x6\n\t" 06014 "adcs x3, x3, x7\n\t" 06015 "adc x4, xzr, xzr\n\t" 06016 "# A[4] * B[10]\n\t" 06017 "ldr x7, [%[a], 32]\n\t" 06018 "ldr x8, [%[b], 80]\n\t" 06019 "mul x6, x7, x8\n\t" 06020 "umulh x7, x7, x8\n\t" 06021 "adds x5, x5, x6\n\t" 06022 "adcs x3, x3, x7\n\t" 06023 "adc x4, x4, xzr\n\t" 06024 "# A[5] * B[9]\n\t" 06025 "ldr x7, [%[a], 40]\n\t" 06026 "ldr x8, [%[b], 72]\n\t" 06027 "mul x6, x7, x8\n\t" 06028 "umulh x7, x7, x8\n\t" 06029 "adds x5, x5, x6\n\t" 06030 "adcs x3, x3, x7\n\t" 06031 "adc x4, x4, xzr\n\t" 06032 "# A[6] * B[8]\n\t" 06033 "ldr x7, [%[a], 48]\n\t" 06034 "ldr x8, [%[b], 64]\n\t" 06035 "mul x6, x7, x8\n\t" 06036 "umulh x7, x7, x8\n\t" 06037 "adds x5, x5, x6\n\t" 06038 "adcs x3, x3, x7\n\t" 06039 "adc x4, x4, xzr\n\t" 06040 "# A[7] * B[7]\n\t" 06041 "ldr x7, [%[a], 56]\n\t" 06042 "ldr x8, [%[b], 56]\n\t" 06043 "mul x6, x7, x8\n\t" 06044 "umulh x7, x7, x8\n\t" 06045 "adds x5, x5, x6\n\t" 06046 "adcs x3, x3, x7\n\t" 06047 "adc x4, x4, xzr\n\t" 06048 "# A[8] * B[6]\n\t" 06049 "ldr x7, [%[a], 64]\n\t" 06050 "ldr x8, [%[b], 48]\n\t" 06051 "mul x6, x7, x8\n\t" 06052 "umulh x7, x7, x8\n\t" 06053 "adds x5, x5, x6\n\t" 06054 "adcs x3, x3, x7\n\t" 06055 "adc x4, x4, xzr\n\t" 06056 "# A[9] * B[5]\n\t" 06057 "ldr x7, [%[a], 72]\n\t" 06058 "ldr x8, [%[b], 40]\n\t" 06059 "mul x6, x7, x8\n\t" 06060 "umulh x7, x7, x8\n\t" 06061 "adds x5, x5, x6\n\t" 06062 "adcs x3, x3, x7\n\t" 06063 "adc x4, x4, xzr\n\t" 06064 "# A[10] * B[4]\n\t" 06065 "ldr x7, [%[a], 80]\n\t" 06066 "ldr x8, [%[b], 32]\n\t" 06067 "mul x6, x7, x8\n\t" 06068 "umulh x7, x7, x8\n\t" 06069 "adds x5, x5, x6\n\t" 06070 "adcs x3, x3, x7\n\t" 06071 "adc x4, x4, xzr\n\t" 06072 "# A[11] * B[3]\n\t" 06073 "ldr x7, [%[a], 88]\n\t" 06074 "ldr x8, [%[b], 24]\n\t" 06075 "mul x6, x7, x8\n\t" 06076 "umulh x7, x7, x8\n\t" 06077 "adds x5, x5, x6\n\t" 06078 "adcs x3, x3, x7\n\t" 06079 "adc x4, x4, xzr\n\t" 06080 "str x5, [%[r], 112]\n\t" 06081 "# A[4] * B[11]\n\t" 06082 "ldr x7, [%[a], 32]\n\t" 06083 "ldr x8, [%[b], 88]\n\t" 06084 "mul x6, x7, x8\n\t" 06085 "umulh x7, x7, x8\n\t" 06086 "adds x3, x3, x6\n\t" 06087 "adcs x4, x4, x7\n\t" 06088 "adc x5, xzr, xzr\n\t" 06089 "# A[5] * B[10]\n\t" 06090 "ldr x7, [%[a], 40]\n\t" 06091 "ldr x8, [%[b], 80]\n\t" 06092 "mul x6, x7, x8\n\t" 06093 "umulh x7, x7, x8\n\t" 06094 "adds x3, x3, x6\n\t" 06095 "adcs x4, x4, x7\n\t" 06096 "adc x5, x5, xzr\n\t" 06097 "# A[6] * B[9]\n\t" 06098 "ldr x7, [%[a], 48]\n\t" 06099 "ldr x8, [%[b], 72]\n\t" 06100 "mul x6, x7, x8\n\t" 06101 "umulh x7, x7, x8\n\t" 06102 "adds x3, x3, x6\n\t" 06103 "adcs x4, x4, x7\n\t" 06104 "adc x5, x5, xzr\n\t" 06105 "# A[7] * B[8]\n\t" 06106 "ldr x7, [%[a], 56]\n\t" 06107 "ldr x8, [%[b], 64]\n\t" 06108 "mul x6, x7, x8\n\t" 06109 "umulh x7, x7, x8\n\t" 06110 "adds x3, x3, x6\n\t" 06111 "adcs x4, x4, x7\n\t" 06112 "adc x5, x5, xzr\n\t" 06113 "# A[8] * B[7]\n\t" 06114 "ldr x7, [%[a], 64]\n\t" 06115 "ldr x8, [%[b], 56]\n\t" 06116 "mul x6, x7, x8\n\t" 06117 "umulh x7, x7, x8\n\t" 06118 "adds x3, x3, x6\n\t" 06119 "adcs x4, x4, x7\n\t" 06120 "adc x5, x5, xzr\n\t" 06121 "# A[9] * B[6]\n\t" 06122 "ldr x7, [%[a], 72]\n\t" 06123 "ldr x8, [%[b], 48]\n\t" 06124 "mul x6, x7, x8\n\t" 06125 "umulh x7, x7, x8\n\t" 06126 "adds x3, x3, x6\n\t" 06127 "adcs x4, x4, x7\n\t" 06128 "adc x5, x5, xzr\n\t" 06129 "# A[10] * B[5]\n\t" 06130 "ldr x7, [%[a], 80]\n\t" 06131 "ldr x8, [%[b], 40]\n\t" 06132 "mul x6, x7, x8\n\t" 06133 "umulh x7, x7, x8\n\t" 06134 "adds x3, x3, x6\n\t" 06135 "adcs x4, x4, x7\n\t" 06136 "adc x5, x5, xzr\n\t" 06137 "# A[11] * B[4]\n\t" 06138 "ldr x7, [%[a], 88]\n\t" 06139 "ldr x8, [%[b], 32]\n\t" 06140 "mul x6, x7, x8\n\t" 06141 "umulh x7, x7, x8\n\t" 06142 "adds x3, x3, x6\n\t" 06143 "adcs x4, x4, x7\n\t" 06144 "adc x5, x5, xzr\n\t" 06145 "str x3, [%[r], 120]\n\t" 06146 "# A[5] * B[11]\n\t" 06147 "ldr x7, [%[a], 40]\n\t" 06148 "ldr x8, [%[b], 88]\n\t" 06149 "mul x6, x7, x8\n\t" 06150 "umulh x7, x7, x8\n\t" 06151 "adds x4, x4, x6\n\t" 06152 "adcs x5, x5, x7\n\t" 06153 "adc x3, xzr, xzr\n\t" 06154 "# A[6] * B[10]\n\t" 06155 "ldr x7, [%[a], 48]\n\t" 06156 "ldr x8, [%[b], 80]\n\t" 06157 "mul x6, x7, x8\n\t" 06158 "umulh x7, x7, x8\n\t" 06159 "adds x4, x4, x6\n\t" 06160 "adcs x5, x5, x7\n\t" 06161 "adc x3, x3, xzr\n\t" 06162 "# A[7] * B[9]\n\t" 06163 "ldr x7, [%[a], 56]\n\t" 06164 "ldr x8, [%[b], 72]\n\t" 06165 "mul x6, x7, x8\n\t" 06166 "umulh x7, x7, x8\n\t" 06167 "adds x4, x4, x6\n\t" 06168 "adcs x5, x5, x7\n\t" 06169 "adc x3, x3, xzr\n\t" 06170 "# A[8] * B[8]\n\t" 06171 "ldr x7, [%[a], 64]\n\t" 06172 "ldr x8, [%[b], 64]\n\t" 06173 "mul x6, x7, x8\n\t" 06174 "umulh x7, x7, x8\n\t" 06175 "adds x4, x4, x6\n\t" 06176 "adcs x5, x5, x7\n\t" 06177 "adc x3, x3, xzr\n\t" 06178 "# A[9] * B[7]\n\t" 06179 "ldr x7, [%[a], 72]\n\t" 06180 "ldr x8, [%[b], 56]\n\t" 06181 "mul x6, x7, x8\n\t" 06182 "umulh x7, x7, x8\n\t" 06183 "adds x4, x4, x6\n\t" 06184 "adcs x5, x5, x7\n\t" 06185 "adc x3, x3, xzr\n\t" 06186 "# A[10] * B[6]\n\t" 06187 "ldr x7, [%[a], 80]\n\t" 06188 "ldr x8, [%[b], 48]\n\t" 06189 "mul x6, x7, x8\n\t" 06190 "umulh x7, x7, x8\n\t" 06191 "adds x4, x4, x6\n\t" 06192 "adcs x5, x5, x7\n\t" 06193 "adc x3, x3, xzr\n\t" 06194 "# A[11] * B[5]\n\t" 06195 "ldr x7, [%[a], 88]\n\t" 06196 "ldr x8, [%[b], 40]\n\t" 06197 "mul x6, x7, x8\n\t" 06198 "umulh x7, x7, x8\n\t" 06199 "adds x4, x4, x6\n\t" 06200 "adcs x5, x5, x7\n\t" 06201 "adc x3, x3, xzr\n\t" 06202 "str x4, [%[r], 128]\n\t" 06203 "# A[6] * B[11]\n\t" 06204 "ldr x7, [%[a], 48]\n\t" 06205 "ldr x8, [%[b], 88]\n\t" 06206 "mul x6, x7, x8\n\t" 06207 "umulh x7, x7, x8\n\t" 06208 "adds x5, x5, x6\n\t" 06209 "adcs x3, x3, x7\n\t" 06210 "adc x4, xzr, xzr\n\t" 06211 "# A[7] * B[10]\n\t" 06212 "ldr x7, [%[a], 56]\n\t" 06213 "ldr x8, [%[b], 80]\n\t" 06214 "mul x6, x7, x8\n\t" 06215 "umulh x7, x7, x8\n\t" 06216 "adds x5, x5, x6\n\t" 06217 "adcs x3, x3, x7\n\t" 06218 "adc x4, x4, xzr\n\t" 06219 "# A[8] * B[9]\n\t" 06220 "ldr x7, [%[a], 64]\n\t" 06221 "ldr x8, [%[b], 72]\n\t" 06222 "mul x6, x7, x8\n\t" 06223 "umulh x7, x7, x8\n\t" 06224 "adds x5, x5, x6\n\t" 06225 "adcs x3, x3, x7\n\t" 06226 "adc x4, x4, xzr\n\t" 06227 "# A[9] * B[8]\n\t" 06228 "ldr x7, [%[a], 72]\n\t" 06229 "ldr x8, [%[b], 64]\n\t" 06230 "mul x6, x7, x8\n\t" 06231 "umulh x7, x7, x8\n\t" 06232 "adds x5, x5, x6\n\t" 06233 "adcs x3, x3, x7\n\t" 06234 "adc x4, x4, xzr\n\t" 06235 "# A[10] * B[7]\n\t" 06236 "ldr x7, [%[a], 80]\n\t" 06237 "ldr x8, [%[b], 56]\n\t" 06238 "mul x6, x7, x8\n\t" 06239 "umulh x7, x7, x8\n\t" 06240 "adds x5, x5, x6\n\t" 06241 "adcs x3, x3, x7\n\t" 06242 "adc x4, x4, xzr\n\t" 06243 "# A[11] * B[6]\n\t" 06244 "ldr x7, [%[a], 88]\n\t" 06245 "ldr x8, [%[b], 48]\n\t" 06246 "mul x6, x7, x8\n\t" 06247 "umulh x7, x7, x8\n\t" 06248 "adds x5, x5, x6\n\t" 06249 "adcs x3, x3, x7\n\t" 06250 "adc x4, x4, xzr\n\t" 06251 "str x5, [%[r], 136]\n\t" 06252 "# A[7] * B[11]\n\t" 06253 "ldr x7, [%[a], 56]\n\t" 06254 "ldr x8, [%[b], 88]\n\t" 06255 "mul x6, x7, x8\n\t" 06256 "umulh x7, x7, x8\n\t" 06257 "adds x3, x3, x6\n\t" 06258 "adcs x4, x4, x7\n\t" 06259 "adc x5, xzr, xzr\n\t" 06260 "# A[8] * B[10]\n\t" 06261 "ldr x7, [%[a], 64]\n\t" 06262 "ldr x8, [%[b], 80]\n\t" 06263 "mul x6, x7, x8\n\t" 06264 "umulh x7, x7, x8\n\t" 06265 "adds x3, x3, x6\n\t" 06266 "adcs x4, x4, x7\n\t" 06267 "adc x5, x5, xzr\n\t" 06268 "# A[9] * B[9]\n\t" 06269 "ldr x7, [%[a], 72]\n\t" 06270 "ldr x8, [%[b], 72]\n\t" 06271 "mul x6, x7, x8\n\t" 06272 "umulh x7, x7, x8\n\t" 06273 "adds x3, x3, x6\n\t" 06274 "adcs x4, x4, x7\n\t" 06275 "adc x5, x5, xzr\n\t" 06276 "# A[10] * B[8]\n\t" 06277 "ldr x7, [%[a], 80]\n\t" 06278 "ldr x8, [%[b], 64]\n\t" 06279 "mul x6, x7, x8\n\t" 06280 "umulh x7, x7, x8\n\t" 06281 "adds x3, x3, x6\n\t" 06282 "adcs x4, x4, x7\n\t" 06283 "adc x5, x5, xzr\n\t" 06284 "# A[11] * B[7]\n\t" 06285 "ldr x7, [%[a], 88]\n\t" 06286 "ldr x8, [%[b], 56]\n\t" 06287 "mul x6, x7, x8\n\t" 06288 "umulh x7, x7, x8\n\t" 06289 "adds x3, x3, x6\n\t" 06290 "adcs x4, x4, x7\n\t" 06291 "adc x5, x5, xzr\n\t" 06292 "str x3, [%[r], 144]\n\t" 06293 "# A[8] * B[11]\n\t" 06294 "ldr x7, [%[a], 64]\n\t" 06295 "ldr x8, [%[b], 88]\n\t" 06296 "mul x6, x7, x8\n\t" 06297 "umulh x7, x7, x8\n\t" 06298 "adds x4, x4, x6\n\t" 06299 "adcs x5, x5, x7\n\t" 06300 "adc x3, xzr, xzr\n\t" 06301 "# A[9] * B[10]\n\t" 06302 "ldr x7, [%[a], 72]\n\t" 06303 "ldr x8, [%[b], 80]\n\t" 06304 "mul x6, x7, x8\n\t" 06305 "umulh x7, x7, x8\n\t" 06306 "adds x4, x4, x6\n\t" 06307 "adcs x5, x5, x7\n\t" 06308 "adc x3, x3, xzr\n\t" 06309 "# A[10] * B[9]\n\t" 06310 "ldr x7, [%[a], 80]\n\t" 06311 "ldr x8, [%[b], 72]\n\t" 06312 "mul x6, x7, x8\n\t" 06313 "umulh x7, x7, x8\n\t" 06314 "adds x4, x4, x6\n\t" 06315 "adcs x5, x5, x7\n\t" 06316 "adc x3, x3, xzr\n\t" 06317 "# A[11] * B[8]\n\t" 06318 "ldr x7, [%[a], 88]\n\t" 06319 "ldr x8, [%[b], 64]\n\t" 06320 "mul x6, x7, x8\n\t" 06321 "umulh x7, x7, x8\n\t" 06322 "adds x4, x4, x6\n\t" 06323 "adcs x5, x5, x7\n\t" 06324 "adc x3, x3, xzr\n\t" 06325 "str x4, [%[r], 152]\n\t" 06326 "# A[9] * B[11]\n\t" 06327 "ldr x7, [%[a], 72]\n\t" 06328 "ldr x8, [%[b], 88]\n\t" 06329 "mul x6, x7, x8\n\t" 06330 "umulh x7, x7, x8\n\t" 06331 "adds x5, x5, x6\n\t" 06332 "adcs x3, x3, x7\n\t" 06333 "adc x4, xzr, xzr\n\t" 06334 "# A[10] * B[10]\n\t" 06335 "ldr x7, [%[a], 80]\n\t" 06336 "ldr x8, [%[b], 80]\n\t" 06337 "mul x6, x7, x8\n\t" 06338 "umulh x7, x7, x8\n\t" 06339 "adds x5, x5, x6\n\t" 06340 "adcs x3, x3, x7\n\t" 06341 "adc x4, x4, xzr\n\t" 06342 "# A[11] * B[9]\n\t" 06343 "ldr x7, [%[a], 88]\n\t" 06344 "ldr x8, [%[b], 72]\n\t" 06345 "mul x6, x7, x8\n\t" 06346 "umulh x7, x7, x8\n\t" 06347 "adds x5, x5, x6\n\t" 06348 "adcs x3, x3, x7\n\t" 06349 "adc x4, x4, xzr\n\t" 06350 "str x5, [%[r], 160]\n\t" 06351 "# A[10] * B[11]\n\t" 06352 "ldr x7, [%[a], 80]\n\t" 06353 "ldr x8, [%[b], 88]\n\t" 06354 "mul x6, x7, x8\n\t" 06355 "umulh x7, x7, x8\n\t" 06356 "adds x3, x3, x6\n\t" 06357 "adcs x4, x4, x7\n\t" 06358 "adc x5, xzr, xzr\n\t" 06359 "# A[11] * B[10]\n\t" 06360 "ldr x7, [%[a], 88]\n\t" 06361 "ldr x8, [%[b], 80]\n\t" 06362 "mul x6, x7, x8\n\t" 06363 "umulh x7, x7, x8\n\t" 06364 "adds x3, x3, x6\n\t" 06365 "adcs x4, x4, x7\n\t" 06366 "adc x5, x5, xzr\n\t" 06367 "str x3, [%[r], 168]\n\t" 06368 "# A[11] * B[11]\n\t" 06369 "ldr x7, [%[a], 88]\n\t" 06370 "ldr x8, [%[b], 88]\n\t" 06371 "mul x6, x7, x8\n\t" 06372 "umulh x7, x7, x8\n\t" 06373 "adds x4, x4, x6\n\t" 06374 "adc x5, x5, x7\n\t" 06375 "stp x4, x5, [%[r], 176]\n\t" 06376 : 06377 : [r] "r" (r), [a] "r" (a), [b] "r" (b), [tmp] "r" (tmp) 06378 : "memory", "x3", "x4", "x5", "x6", "x7", "x8" 06379 ); 06380 06381 XMEMCPY(r, tmp, sizeof(tmp)); 06382 } 06383 06384 /* Square a and put result in r. (r = a * a) 06385 * 06386 * r A single precision integer. 06387 * a A single precision integer. 06388 */ 06389 static void sp_3072_sqr_12(sp_digit* r, const sp_digit* a) 06390 { 06391 sp_digit tmp[12]; 06392 06393 __asm__ __volatile__ ( 06394 "ldp x10, x11, [%[a], 0]\n\t" 06395 "ldp x12, x13, [%[a], 16]\n\t" 06396 "ldp x14, x15, [%[a], 32]\n\t" 06397 "ldp x16, x17, [%[a], 48]\n\t" 06398 "ldp x18, x19, [%[a], 64]\n\t" 06399 "ldp x20, x21, [%[a], 80]\n\t" 06400 "# A[0] * A[0]\n\t" 06401 "mul x2, x10, x10\n\t" 06402 "umulh x3, x10, x10\n\t" 06403 "str x2, [%[tmp]]\n\t" 06404 "mov x4, 0\n\t" 06405 "# A[0] * A[1]\n\t" 06406 "mul x8, x10, x11\n\t" 06407 "umulh x9, x10, x11\n\t" 06408 "adds x3, x3, x8\n\t" 06409 "adcs x4, x4, x9\n\t" 06410 "adc x2, xzr, xzr\n\t" 06411 "adds x3, x3, x8\n\t" 06412 "adcs x4, x4, x9\n\t" 06413 "adc x2, x2, xzr\n\t" 06414 "str x3, [%[tmp], 8]\n\t" 06415 "# A[0] * A[2]\n\t" 06416 "mul x8, x10, x12\n\t" 06417 "umulh x9, x10, x12\n\t" 06418 "adds x4, x4, x8\n\t" 06419 "adcs x2, x2, x9\n\t" 06420 "adc x3, xzr, xzr\n\t" 06421 "adds x4, x4, x8\n\t" 06422 "adcs x2, x2, x9\n\t" 06423 "adc x3, x3, xzr\n\t" 06424 "# A[1] * A[1]\n\t" 06425 "mul x8, x11, x11\n\t" 06426 "umulh x9, x11, x11\n\t" 06427 "adds x4, x4, x8\n\t" 06428 "adcs x2, x2, x9\n\t" 06429 "adc x3, x3, xzr\n\t" 06430 "str x4, [%[tmp], 16]\n\t" 06431 "# A[0] * A[3]\n\t" 06432 "mul x8, x10, x13\n\t" 06433 "umulh x9, x10, x13\n\t" 06434 "adds x2, x2, x8\n\t" 06435 "adcs x3, x3, x9\n\t" 06436 "adc x4, xzr, xzr\n\t" 06437 "adds x2, x2, x8\n\t" 06438 "adcs x3, x3, x9\n\t" 06439 "adc x4, x4, xzr\n\t" 06440 "# A[1] * A[2]\n\t" 06441 "mul x8, x11, x12\n\t" 06442 "umulh x9, x11, x12\n\t" 06443 "adds x2, x2, x8\n\t" 06444 "adcs x3, x3, x9\n\t" 06445 "adc x4, x4, xzr\n\t" 06446 "adds x2, x2, x8\n\t" 06447 "adcs x3, x3, x9\n\t" 06448 "adc x4, x4, xzr\n\t" 06449 "str x2, [%[tmp], 24]\n\t" 06450 "# A[0] * A[4]\n\t" 06451 "mul x8, x10, x14\n\t" 06452 "umulh x9, x10, x14\n\t" 06453 "adds x3, x3, x8\n\t" 06454 "adcs x4, x4, x9\n\t" 06455 "adc x2, xzr, xzr\n\t" 06456 "adds x3, x3, x8\n\t" 06457 "adcs x4, x4, x9\n\t" 06458 "adc x2, x2, xzr\n\t" 06459 "# A[1] * A[3]\n\t" 06460 "mul x8, x11, x13\n\t" 06461 "umulh x9, x11, x13\n\t" 06462 "adds x3, x3, x8\n\t" 06463 "adcs x4, x4, x9\n\t" 06464 "adc x2, x2, xzr\n\t" 06465 "adds x3, x3, x8\n\t" 06466 "adcs x4, x4, x9\n\t" 06467 "adc x2, x2, xzr\n\t" 06468 "# A[2] * A[2]\n\t" 06469 "mul x8, x12, x12\n\t" 06470 "umulh x9, x12, x12\n\t" 06471 "adds x3, x3, x8\n\t" 06472 "adcs x4, x4, x9\n\t" 06473 "adc x2, x2, xzr\n\t" 06474 "str x3, [%[tmp], 32]\n\t" 06475 "# A[0] * A[5]\n\t" 06476 "mul x5, x10, x15\n\t" 06477 "umulh x6, x10, x15\n\t" 06478 "mov x3, 0\n\t" 06479 "mov x7, 0\n\t" 06480 "# A[1] * A[4]\n\t" 06481 "mul x8, x11, x14\n\t" 06482 "umulh x9, x11, x14\n\t" 06483 "adds x5, x5, x8\n\t" 06484 "adcs x6, x6, x9\n\t" 06485 "adc x7, x7, xzr\n\t" 06486 "# A[2] * A[3]\n\t" 06487 "mul x8, x12, x13\n\t" 06488 "umulh x9, x12, x13\n\t" 06489 "adds x5, x5, x8\n\t" 06490 "adcs x6, x6, x9\n\t" 06491 "adc x7, x7, xzr\n\t" 06492 "adds x5, x5, x5\n\t" 06493 "adcs x6, x6, x6\n\t" 06494 "adc x7, x7, x7\n\t" 06495 "adds x4, x4, x5\n\t" 06496 "adcs x2, x2, x6\n\t" 06497 "adc x3, x3, x7\n\t" 06498 "str x4, [%[tmp], 40]\n\t" 06499 "# A[0] * A[6]\n\t" 06500 "mul x5, x10, x16\n\t" 06501 "umulh x6, x10, x16\n\t" 06502 "mov x4, 0\n\t" 06503 "mov x7, 0\n\t" 06504 "# A[1] * A[5]\n\t" 06505 "mul x8, x11, x15\n\t" 06506 "umulh x9, x11, x15\n\t" 06507 "adds x5, x5, x8\n\t" 06508 "adcs x6, x6, x9\n\t" 06509 "adc x7, x7, xzr\n\t" 06510 "# A[2] * A[4]\n\t" 06511 "mul x8, x12, x14\n\t" 06512 "umulh x9, x12, x14\n\t" 06513 "adds x5, x5, x8\n\t" 06514 "adcs x6, x6, x9\n\t" 06515 "adc x7, x7, xzr\n\t" 06516 "# A[3] * A[3]\n\t" 06517 "mul x8, x13, x13\n\t" 06518 "umulh x9, x13, x13\n\t" 06519 "adds x5, x5, x5\n\t" 06520 "adcs x6, x6, x6\n\t" 06521 "adc x7, x7, x7\n\t" 06522 "adds x5, x5, x8\n\t" 06523 "adcs x6, x6, x9\n\t" 06524 "adc x7, x7, xzr\n\t" 06525 "adds x2, x2, x5\n\t" 06526 "adcs x3, x3, x6\n\t" 06527 "adc x4, x4, x7\n\t" 06528 "str x2, [%[tmp], 48]\n\t" 06529 "# A[0] * A[7]\n\t" 06530 "mul x5, x10, x17\n\t" 06531 "umulh x6, x10, x17\n\t" 06532 "mov x2, 0\n\t" 06533 "mov x7, 0\n\t" 06534 "# A[1] * A[6]\n\t" 06535 "mul x8, x11, x16\n\t" 06536 "umulh x9, x11, x16\n\t" 06537 "adds x5, x5, x8\n\t" 06538 "adcs x6, x6, x9\n\t" 06539 "adc x7, x7, xzr\n\t" 06540 "# A[2] * A[5]\n\t" 06541 "mul x8, x12, x15\n\t" 06542 "umulh x9, x12, x15\n\t" 06543 "adds x5, x5, x8\n\t" 06544 "adcs x6, x6, x9\n\t" 06545 "adc x7, x7, xzr\n\t" 06546 "# A[3] * A[4]\n\t" 06547 "mul x8, x13, x14\n\t" 06548 "umulh x9, x13, x14\n\t" 06549 "adds x5, x5, x8\n\t" 06550 "adcs x6, x6, x9\n\t" 06551 "adc x7, x7, xzr\n\t" 06552 "adds x5, x5, x5\n\t" 06553 "adcs x6, x6, x6\n\t" 06554 "adc x7, x7, x7\n\t" 06555 "adds x3, x3, x5\n\t" 06556 "adcs x4, x4, x6\n\t" 06557 "adc x2, x2, x7\n\t" 06558 "str x3, [%[tmp], 56]\n\t" 06559 "# A[0] * A[8]\n\t" 06560 "mul x5, x10, x18\n\t" 06561 "umulh x6, x10, x18\n\t" 06562 "mov x3, 0\n\t" 06563 "mov x7, 0\n\t" 06564 "# A[1] * A[7]\n\t" 06565 "mul x8, x11, x17\n\t" 06566 "umulh x9, x11, x17\n\t" 06567 "adds x5, x5, x8\n\t" 06568 "adcs x6, x6, x9\n\t" 06569 "adc x7, x7, xzr\n\t" 06570 "# A[2] * A[6]\n\t" 06571 "mul x8, x12, x16\n\t" 06572 "umulh x9, x12, x16\n\t" 06573 "adds x5, x5, x8\n\t" 06574 "adcs x6, x6, x9\n\t" 06575 "adc x7, x7, xzr\n\t" 06576 "# A[3] * A[5]\n\t" 06577 "mul x8, x13, x15\n\t" 06578 "umulh x9, x13, x15\n\t" 06579 "adds x5, x5, x8\n\t" 06580 "adcs x6, x6, x9\n\t" 06581 "adc x7, x7, xzr\n\t" 06582 "# A[4] * A[4]\n\t" 06583 "mul x8, x14, x14\n\t" 06584 "umulh x9, x14, x14\n\t" 06585 "adds x5, x5, x5\n\t" 06586 "adcs x6, x6, x6\n\t" 06587 "adc x7, x7, x7\n\t" 06588 "adds x5, x5, x8\n\t" 06589 "adcs x6, x6, x9\n\t" 06590 "adc x7, x7, xzr\n\t" 06591 "adds x4, x4, x5\n\t" 06592 "adcs x2, x2, x6\n\t" 06593 "adc x3, x3, x7\n\t" 06594 "str x4, [%[tmp], 64]\n\t" 06595 "# A[0] * A[9]\n\t" 06596 "mul x5, x10, x19\n\t" 06597 "umulh x6, x10, x19\n\t" 06598 "mov x4, 0\n\t" 06599 "mov x7, 0\n\t" 06600 "# A[1] * A[8]\n\t" 06601 "mul x8, x11, x18\n\t" 06602 "umulh x9, x11, x18\n\t" 06603 "adds x5, x5, x8\n\t" 06604 "adcs x6, x6, x9\n\t" 06605 "adc x7, x7, xzr\n\t" 06606 "# A[2] * A[7]\n\t" 06607 "mul x8, x12, x17\n\t" 06608 "umulh x9, x12, x17\n\t" 06609 "adds x5, x5, x8\n\t" 06610 "adcs x6, x6, x9\n\t" 06611 "adc x7, x7, xzr\n\t" 06612 "# A[3] * A[6]\n\t" 06613 "mul x8, x13, x16\n\t" 06614 "umulh x9, x13, x16\n\t" 06615 "adds x5, x5, x8\n\t" 06616 "adcs x6, x6, x9\n\t" 06617 "adc x7, x7, xzr\n\t" 06618 "# A[4] * A[5]\n\t" 06619 "mul x8, x14, x15\n\t" 06620 "umulh x9, x14, x15\n\t" 06621 "adds x5, x5, x8\n\t" 06622 "adcs x6, x6, x9\n\t" 06623 "adc x7, x7, xzr\n\t" 06624 "adds x5, x5, x5\n\t" 06625 "adcs x6, x6, x6\n\t" 06626 "adc x7, x7, x7\n\t" 06627 "adds x2, x2, x5\n\t" 06628 "adcs x3, x3, x6\n\t" 06629 "adc x4, x4, x7\n\t" 06630 "str x2, [%[tmp], 72]\n\t" 06631 "# A[0] * A[10]\n\t" 06632 "mul x5, x10, x20\n\t" 06633 "umulh x6, x10, x20\n\t" 06634 "mov x2, 0\n\t" 06635 "mov x7, 0\n\t" 06636 "# A[1] * A[9]\n\t" 06637 "mul x8, x11, x19\n\t" 06638 "umulh x9, x11, x19\n\t" 06639 "adds x5, x5, x8\n\t" 06640 "adcs x6, x6, x9\n\t" 06641 "adc x7, x7, xzr\n\t" 06642 "# A[2] * A[8]\n\t" 06643 "mul x8, x12, x18\n\t" 06644 "umulh x9, x12, x18\n\t" 06645 "adds x5, x5, x8\n\t" 06646 "adcs x6, x6, x9\n\t" 06647 "adc x7, x7, xzr\n\t" 06648 "# A[3] * A[7]\n\t" 06649 "mul x8, x13, x17\n\t" 06650 "umulh x9, x13, x17\n\t" 06651 "adds x5, x5, x8\n\t" 06652 "adcs x6, x6, x9\n\t" 06653 "adc x7, x7, xzr\n\t" 06654 "# A[4] * A[6]\n\t" 06655 "mul x8, x14, x16\n\t" 06656 "umulh x9, x14, x16\n\t" 06657 "adds x5, x5, x8\n\t" 06658 "adcs x6, x6, x9\n\t" 06659 "adc x7, x7, xzr\n\t" 06660 "# A[5] * A[5]\n\t" 06661 "mul x8, x15, x15\n\t" 06662 "umulh x9, x15, x15\n\t" 06663 "adds x5, x5, x5\n\t" 06664 "adcs x6, x6, x6\n\t" 06665 "adc x7, x7, x7\n\t" 06666 "adds x5, x5, x8\n\t" 06667 "adcs x6, x6, x9\n\t" 06668 "adc x7, x7, xzr\n\t" 06669 "adds x3, x3, x5\n\t" 06670 "adcs x4, x4, x6\n\t" 06671 "adc x2, x2, x7\n\t" 06672 "str x3, [%[tmp], 80]\n\t" 06673 "# A[0] * A[11]\n\t" 06674 "mul x5, x10, x21\n\t" 06675 "umulh x6, x10, x21\n\t" 06676 "mov x3, 0\n\t" 06677 "mov x7, 0\n\t" 06678 "# A[1] * A[10]\n\t" 06679 "mul x8, x11, x20\n\t" 06680 "umulh x9, x11, x20\n\t" 06681 "adds x5, x5, x8\n\t" 06682 "adcs x6, x6, x9\n\t" 06683 "adc x7, x7, xzr\n\t" 06684 "# A[2] * A[9]\n\t" 06685 "mul x8, x12, x19\n\t" 06686 "umulh x9, x12, x19\n\t" 06687 "adds x5, x5, x8\n\t" 06688 "adcs x6, x6, x9\n\t" 06689 "adc x7, x7, xzr\n\t" 06690 "# A[3] * A[8]\n\t" 06691 "mul x8, x13, x18\n\t" 06692 "umulh x9, x13, x18\n\t" 06693 "adds x5, x5, x8\n\t" 06694 "adcs x6, x6, x9\n\t" 06695 "adc x7, x7, xzr\n\t" 06696 "# A[4] * A[7]\n\t" 06697 "mul x8, x14, x17\n\t" 06698 "umulh x9, x14, x17\n\t" 06699 "adds x5, x5, x8\n\t" 06700 "adcs x6, x6, x9\n\t" 06701 "adc x7, x7, xzr\n\t" 06702 "# A[5] * A[6]\n\t" 06703 "mul x8, x15, x16\n\t" 06704 "umulh x9, x15, x16\n\t" 06705 "adds x5, x5, x8\n\t" 06706 "adcs x6, x6, x9\n\t" 06707 "adc x7, x7, xzr\n\t" 06708 "adds x5, x5, x5\n\t" 06709 "adcs x6, x6, x6\n\t" 06710 "adc x7, x7, x7\n\t" 06711 "adds x4, x4, x5\n\t" 06712 "adcs x2, x2, x6\n\t" 06713 "adc x3, x3, x7\n\t" 06714 "str x4, [%[tmp], 88]\n\t" 06715 "# A[1] * A[11]\n\t" 06716 "mul x5, x11, x21\n\t" 06717 "umulh x6, x11, x21\n\t" 06718 "mov x4, 0\n\t" 06719 "mov x7, 0\n\t" 06720 "# A[2] * A[10]\n\t" 06721 "mul x8, x12, x20\n\t" 06722 "umulh x9, x12, x20\n\t" 06723 "adds x5, x5, x8\n\t" 06724 "adcs x6, x6, x9\n\t" 06725 "adc x7, x7, xzr\n\t" 06726 "# A[3] * A[9]\n\t" 06727 "mul x8, x13, x19\n\t" 06728 "umulh x9, x13, x19\n\t" 06729 "adds x5, x5, x8\n\t" 06730 "adcs x6, x6, x9\n\t" 06731 "adc x7, x7, xzr\n\t" 06732 "# A[4] * A[8]\n\t" 06733 "mul x8, x14, x18\n\t" 06734 "umulh x9, x14, x18\n\t" 06735 "adds x5, x5, x8\n\t" 06736 "adcs x6, x6, x9\n\t" 06737 "adc x7, x7, xzr\n\t" 06738 "# A[5] * A[7]\n\t" 06739 "mul x8, x15, x17\n\t" 06740 "umulh x9, x15, x17\n\t" 06741 "adds x5, x5, x8\n\t" 06742 "adcs x6, x6, x9\n\t" 06743 "adc x7, x7, xzr\n\t" 06744 "# A[6] * A[6]\n\t" 06745 "mul x8, x16, x16\n\t" 06746 "umulh x9, x16, x16\n\t" 06747 "adds x5, x5, x5\n\t" 06748 "adcs x6, x6, x6\n\t" 06749 "adc x7, x7, x7\n\t" 06750 "adds x5, x5, x8\n\t" 06751 "adcs x6, x6, x9\n\t" 06752 "adc x7, x7, xzr\n\t" 06753 "adds x2, x2, x5\n\t" 06754 "adcs x3, x3, x6\n\t" 06755 "adc x4, x4, x7\n\t" 06756 "str x2, [%[r], 96]\n\t" 06757 "# A[2] * A[11]\n\t" 06758 "mul x5, x12, x21\n\t" 06759 "umulh x6, x12, x21\n\t" 06760 "mov x2, 0\n\t" 06761 "mov x7, 0\n\t" 06762 "# A[3] * A[10]\n\t" 06763 "mul x8, x13, x20\n\t" 06764 "umulh x9, x13, x20\n\t" 06765 "adds x5, x5, x8\n\t" 06766 "adcs x6, x6, x9\n\t" 06767 "adc x7, x7, xzr\n\t" 06768 "# A[4] * A[9]\n\t" 06769 "mul x8, x14, x19\n\t" 06770 "umulh x9, x14, x19\n\t" 06771 "adds x5, x5, x8\n\t" 06772 "adcs x6, x6, x9\n\t" 06773 "adc x7, x7, xzr\n\t" 06774 "# A[5] * A[8]\n\t" 06775 "mul x8, x15, x18\n\t" 06776 "umulh x9, x15, x18\n\t" 06777 "adds x5, x5, x8\n\t" 06778 "adcs x6, x6, x9\n\t" 06779 "adc x7, x7, xzr\n\t" 06780 "# A[6] * A[7]\n\t" 06781 "mul x8, x16, x17\n\t" 06782 "umulh x9, x16, x17\n\t" 06783 "adds x5, x5, x8\n\t" 06784 "adcs x6, x6, x9\n\t" 06785 "adc x7, x7, xzr\n\t" 06786 "adds x5, x5, x5\n\t" 06787 "adcs x6, x6, x6\n\t" 06788 "adc x7, x7, x7\n\t" 06789 "adds x3, x3, x5\n\t" 06790 "adcs x4, x4, x6\n\t" 06791 "adc x2, x2, x7\n\t" 06792 "str x3, [%[r], 104]\n\t" 06793 "# A[3] * A[11]\n\t" 06794 "mul x5, x13, x21\n\t" 06795 "umulh x6, x13, x21\n\t" 06796 "mov x3, 0\n\t" 06797 "mov x7, 0\n\t" 06798 "# A[4] * A[10]\n\t" 06799 "mul x8, x14, x20\n\t" 06800 "umulh x9, x14, x20\n\t" 06801 "adds x5, x5, x8\n\t" 06802 "adcs x6, x6, x9\n\t" 06803 "adc x7, x7, xzr\n\t" 06804 "# A[5] * A[9]\n\t" 06805 "mul x8, x15, x19\n\t" 06806 "umulh x9, x15, x19\n\t" 06807 "adds x5, x5, x8\n\t" 06808 "adcs x6, x6, x9\n\t" 06809 "adc x7, x7, xzr\n\t" 06810 "# A[6] * A[8]\n\t" 06811 "mul x8, x16, x18\n\t" 06812 "umulh x9, x16, x18\n\t" 06813 "adds x5, x5, x8\n\t" 06814 "adcs x6, x6, x9\n\t" 06815 "adc x7, x7, xzr\n\t" 06816 "# A[7] * A[7]\n\t" 06817 "mul x8, x17, x17\n\t" 06818 "umulh x9, x17, x17\n\t" 06819 "adds x5, x5, x5\n\t" 06820 "adcs x6, x6, x6\n\t" 06821 "adc x7, x7, x7\n\t" 06822 "adds x5, x5, x8\n\t" 06823 "adcs x6, x6, x9\n\t" 06824 "adc x7, x7, xzr\n\t" 06825 "adds x4, x4, x5\n\t" 06826 "adcs x2, x2, x6\n\t" 06827 "adc x3, x3, x7\n\t" 06828 "str x4, [%[r], 112]\n\t" 06829 "# A[4] * A[11]\n\t" 06830 "mul x5, x14, x21\n\t" 06831 "umulh x6, x14, x21\n\t" 06832 "mov x4, 0\n\t" 06833 "mov x7, 0\n\t" 06834 "# A[5] * A[10]\n\t" 06835 "mul x8, x15, x20\n\t" 06836 "umulh x9, x15, x20\n\t" 06837 "adds x5, x5, x8\n\t" 06838 "adcs x6, x6, x9\n\t" 06839 "adc x7, x7, xzr\n\t" 06840 "# A[6] * A[9]\n\t" 06841 "mul x8, x16, x19\n\t" 06842 "umulh x9, x16, x19\n\t" 06843 "adds x5, x5, x8\n\t" 06844 "adcs x6, x6, x9\n\t" 06845 "adc x7, x7, xzr\n\t" 06846 "# A[7] * A[8]\n\t" 06847 "mul x8, x17, x18\n\t" 06848 "umulh x9, x17, x18\n\t" 06849 "adds x5, x5, x8\n\t" 06850 "adcs x6, x6, x9\n\t" 06851 "adc x7, x7, xzr\n\t" 06852 "adds x5, x5, x5\n\t" 06853 "adcs x6, x6, x6\n\t" 06854 "adc x7, x7, x7\n\t" 06855 "adds x2, x2, x5\n\t" 06856 "adcs x3, x3, x6\n\t" 06857 "adc x4, x4, x7\n\t" 06858 "str x2, [%[r], 120]\n\t" 06859 "# A[5] * A[11]\n\t" 06860 "mul x5, x15, x21\n\t" 06861 "umulh x6, x15, x21\n\t" 06862 "mov x2, 0\n\t" 06863 "mov x7, 0\n\t" 06864 "# A[6] * A[10]\n\t" 06865 "mul x8, x16, x20\n\t" 06866 "umulh x9, x16, x20\n\t" 06867 "adds x5, x5, x8\n\t" 06868 "adcs x6, x6, x9\n\t" 06869 "adc x7, x7, xzr\n\t" 06870 "# A[7] * A[9]\n\t" 06871 "mul x8, x17, x19\n\t" 06872 "umulh x9, x17, x19\n\t" 06873 "adds x5, x5, x8\n\t" 06874 "adcs x6, x6, x9\n\t" 06875 "adc x7, x7, xzr\n\t" 06876 "# A[8] * A[8]\n\t" 06877 "mul x8, x18, x18\n\t" 06878 "umulh x9, x18, x18\n\t" 06879 "adds x5, x5, x5\n\t" 06880 "adcs x6, x6, x6\n\t" 06881 "adc x7, x7, x7\n\t" 06882 "adds x5, x5, x8\n\t" 06883 "adcs x6, x6, x9\n\t" 06884 "adc x7, x7, xzr\n\t" 06885 "adds x3, x3, x5\n\t" 06886 "adcs x4, x4, x6\n\t" 06887 "adc x2, x2, x7\n\t" 06888 "str x3, [%[r], 128]\n\t" 06889 "# A[6] * A[11]\n\t" 06890 "mul x5, x16, x21\n\t" 06891 "umulh x6, x16, x21\n\t" 06892 "mov x3, 0\n\t" 06893 "mov x7, 0\n\t" 06894 "# A[7] * A[10]\n\t" 06895 "mul x8, x17, x20\n\t" 06896 "umulh x9, x17, x20\n\t" 06897 "adds x5, x5, x8\n\t" 06898 "adcs x6, x6, x9\n\t" 06899 "adc x7, x7, xzr\n\t" 06900 "# A[8] * A[9]\n\t" 06901 "mul x8, x18, x19\n\t" 06902 "umulh x9, x18, x19\n\t" 06903 "adds x5, x5, x8\n\t" 06904 "adcs x6, x6, x9\n\t" 06905 "adc x7, x7, xzr\n\t" 06906 "adds x5, x5, x5\n\t" 06907 "adcs x6, x6, x6\n\t" 06908 "adc x7, x7, x7\n\t" 06909 "adds x4, x4, x5\n\t" 06910 "adcs x2, x2, x6\n\t" 06911 "adc x3, x3, x7\n\t" 06912 "str x4, [%[r], 136]\n\t" 06913 "# A[7] * A[11]\n\t" 06914 "mul x8, x17, x21\n\t" 06915 "umulh x9, x17, x21\n\t" 06916 "adds x2, x2, x8\n\t" 06917 "adcs x3, x3, x9\n\t" 06918 "adc x4, xzr, xzr\n\t" 06919 "adds x2, x2, x8\n\t" 06920 "adcs x3, x3, x9\n\t" 06921 "adc x4, x4, xzr\n\t" 06922 "# A[8] * A[10]\n\t" 06923 "mul x8, x18, x20\n\t" 06924 "umulh x9, x18, x20\n\t" 06925 "adds x2, x2, x8\n\t" 06926 "adcs x3, x3, x9\n\t" 06927 "adc x4, x4, xzr\n\t" 06928 "adds x2, x2, x8\n\t" 06929 "adcs x3, x3, x9\n\t" 06930 "adc x4, x4, xzr\n\t" 06931 "# A[9] * A[9]\n\t" 06932 "mul x8, x19, x19\n\t" 06933 "umulh x9, x19, x19\n\t" 06934 "adds x2, x2, x8\n\t" 06935 "adcs x3, x3, x9\n\t" 06936 "adc x4, x4, xzr\n\t" 06937 "str x2, [%[r], 144]\n\t" 06938 "# A[8] * A[11]\n\t" 06939 "mul x8, x18, x21\n\t" 06940 "umulh x9, x18, x21\n\t" 06941 "adds x3, x3, x8\n\t" 06942 "adcs x4, x4, x9\n\t" 06943 "adc x2, xzr, xzr\n\t" 06944 "adds x3, x3, x8\n\t" 06945 "adcs x4, x4, x9\n\t" 06946 "adc x2, x2, xzr\n\t" 06947 "# A[9] * A[10]\n\t" 06948 "mul x8, x19, x20\n\t" 06949 "umulh x9, x19, x20\n\t" 06950 "adds x3, x3, x8\n\t" 06951 "adcs x4, x4, x9\n\t" 06952 "adc x2, x2, xzr\n\t" 06953 "adds x3, x3, x8\n\t" 06954 "adcs x4, x4, x9\n\t" 06955 "adc x2, x2, xzr\n\t" 06956 "str x3, [%[r], 152]\n\t" 06957 "# A[9] * A[11]\n\t" 06958 "mul x8, x19, x21\n\t" 06959 "umulh x9, x19, x21\n\t" 06960 "adds x4, x4, x8\n\t" 06961 "adcs x2, x2, x9\n\t" 06962 "adc x3, xzr, xzr\n\t" 06963 "adds x4, x4, x8\n\t" 06964 "adcs x2, x2, x9\n\t" 06965 "adc x3, x3, xzr\n\t" 06966 "# A[10] * A[10]\n\t" 06967 "mul x8, x20, x20\n\t" 06968 "umulh x9, x20, x20\n\t" 06969 "adds x4, x4, x8\n\t" 06970 "adcs x2, x2, x9\n\t" 06971 "adc x3, x3, xzr\n\t" 06972 "str x4, [%[r], 160]\n\t" 06973 "# A[10] * A[11]\n\t" 06974 "mul x8, x20, x21\n\t" 06975 "umulh x9, x20, x21\n\t" 06976 "adds x2, x2, x8\n\t" 06977 "adcs x3, x3, x9\n\t" 06978 "adc x4, xzr, xzr\n\t" 06979 "adds x2, x2, x8\n\t" 06980 "adcs x3, x3, x9\n\t" 06981 "adc x4, x4, xzr\n\t" 06982 "str x2, [%[r], 168]\n\t" 06983 "# A[11] * A[11]\n\t" 06984 "mul x8, x21, x21\n\t" 06985 "umulh x9, x21, x21\n\t" 06986 "adds x3, x3, x8\n\t" 06987 "adc x4, x4, x9\n\t" 06988 "stp x3, x4, [%[r], 176]\n\t" 06989 : 06990 : [r] "r" (r), [a] "r" (a), [tmp] "r" (tmp) 06991 : "memory", "x2", "x3", "x4", "x8", "x9", "x10", "x5", "x6", "x7", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21" 06992 ); 06993 06994 XMEMCPY(r, tmp, sizeof(tmp)); 06995 } 06996 06997 /* Add b to a into r. (r = a + b) 06998 * 06999 * r A single precision integer. 07000 * a A single precision integer. 07001 * b A single precision integer. 07002 */ 07003 static sp_digit sp_3072_add_12(sp_digit* r, const sp_digit* a, 07004 const sp_digit* b) 07005 { 07006 sp_digit c = 0; 07007 07008 __asm__ __volatile__ ( 07009 "ldp x3, x4, [%[a], 0]\n\t" 07010 "ldp x5, x6, [%[a], 16]\n\t" 07011 "ldp x7, x8, [%[b], 0]\n\t" 07012 "ldp x9, x10, [%[b], 16]\n\t" 07013 "adds x3, x3, x7\n\t" 07014 "adcs x4, x4, x8\n\t" 07015 "adcs x5, x5, x9\n\t" 07016 "adcs x6, x6, x10\n\t" 07017 "stp x3, x4, [%[r], 0]\n\t" 07018 "stp x5, x6, [%[r], 16]\n\t" 07019 "ldp x3, x4, [%[a], 32]\n\t" 07020 "ldp x5, x6, [%[a], 48]\n\t" 07021 "ldp x7, x8, [%[b], 32]\n\t" 07022 "ldp x9, x10, [%[b], 48]\n\t" 07023 "adcs x3, x3, x7\n\t" 07024 "adcs x4, x4, x8\n\t" 07025 "adcs x5, x5, x9\n\t" 07026 "adcs x6, x6, x10\n\t" 07027 "stp x3, x4, [%[r], 32]\n\t" 07028 "stp x5, x6, [%[r], 48]\n\t" 07029 "ldp x3, x4, [%[a], 64]\n\t" 07030 "ldp x5, x6, [%[a], 80]\n\t" 07031 "ldp x7, x8, [%[b], 64]\n\t" 07032 "ldp x9, x10, [%[b], 80]\n\t" 07033 "adcs x3, x3, x7\n\t" 07034 "adcs x4, x4, x8\n\t" 07035 "adcs x5, x5, x9\n\t" 07036 "adcs x6, x6, x10\n\t" 07037 "stp x3, x4, [%[r], 64]\n\t" 07038 "stp x5, x6, [%[r], 80]\n\t" 07039 "cset %[c], cs\n\t" 07040 : [c] "+r" (c) 07041 : [r] "r" (r), [a] "r" (a), [b] "r" (b) 07042 : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10" 07043 ); 07044 07045 return c; 07046 } 07047 07048 /* Sub b from a into a. (a -= b) 07049 * 07050 * a A single precision integer and result. 07051 * b A single precision integer. 07052 */ 07053 static sp_digit sp_3072_sub_in_place_24(sp_digit* a, const sp_digit* b) 07054 { 07055 sp_digit c = 0; 07056 07057 __asm__ __volatile__ ( 07058 "ldp x2, x3, [%[a], 0]\n\t" 07059 "ldp x4, x5, [%[a], 16]\n\t" 07060 "ldp x6, x7, [%[b], 0]\n\t" 07061 "ldp x8, x9, [%[b], 16]\n\t" 07062 "subs x2, x2, x6\n\t" 07063 "sbcs x3, x3, x7\n\t" 07064 "sbcs x4, x4, x8\n\t" 07065 "sbcs x5, x5, x9\n\t" 07066 "stp x2, x3, [%[a], 0]\n\t" 07067 "stp x4, x5, [%[a], 16]\n\t" 07068 "ldp x2, x3, [%[a], 32]\n\t" 07069 "ldp x4, x5, [%[a], 48]\n\t" 07070 "ldp x6, x7, [%[b], 32]\n\t" 07071 "ldp x8, x9, [%[b], 48]\n\t" 07072 "sbcs x2, x2, x6\n\t" 07073 "sbcs x3, x3, x7\n\t" 07074 "sbcs x4, x4, x8\n\t" 07075 "sbcs x5, x5, x9\n\t" 07076 "stp x2, x3, [%[a], 32]\n\t" 07077 "stp x4, x5, [%[a], 48]\n\t" 07078 "ldp x2, x3, [%[a], 64]\n\t" 07079 "ldp x4, x5, [%[a], 80]\n\t" 07080 "ldp x6, x7, [%[b], 64]\n\t" 07081 "ldp x8, x9, [%[b], 80]\n\t" 07082 "sbcs x2, x2, x6\n\t" 07083 "sbcs x3, x3, x7\n\t" 07084 "sbcs x4, x4, x8\n\t" 07085 "sbcs x5, x5, x9\n\t" 07086 "stp x2, x3, [%[a], 64]\n\t" 07087 "stp x4, x5, [%[a], 80]\n\t" 07088 "ldp x2, x3, [%[a], 96]\n\t" 07089 "ldp x4, x5, [%[a], 112]\n\t" 07090 "ldp x6, x7, [%[b], 96]\n\t" 07091 "ldp x8, x9, [%[b], 112]\n\t" 07092 "sbcs x2, x2, x6\n\t" 07093 "sbcs x3, x3, x7\n\t" 07094 "sbcs x4, x4, x8\n\t" 07095 "sbcs x5, x5, x9\n\t" 07096 "stp x2, x3, [%[a], 96]\n\t" 07097 "stp x4, x5, [%[a], 112]\n\t" 07098 "ldp x2, x3, [%[a], 128]\n\t" 07099 "ldp x4, x5, [%[a], 144]\n\t" 07100 "ldp x6, x7, [%[b], 128]\n\t" 07101 "ldp x8, x9, [%[b], 144]\n\t" 07102 "sbcs x2, x2, x6\n\t" 07103 "sbcs x3, x3, x7\n\t" 07104 "sbcs x4, x4, x8\n\t" 07105 "sbcs x5, x5, x9\n\t" 07106 "stp x2, x3, [%[a], 128]\n\t" 07107 "stp x4, x5, [%[a], 144]\n\t" 07108 "ldp x2, x3, [%[a], 160]\n\t" 07109 "ldp x4, x5, [%[a], 176]\n\t" 07110 "ldp x6, x7, [%[b], 160]\n\t" 07111 "ldp x8, x9, [%[b], 176]\n\t" 07112 "sbcs x2, x2, x6\n\t" 07113 "sbcs x3, x3, x7\n\t" 07114 "sbcs x4, x4, x8\n\t" 07115 "sbcs x5, x5, x9\n\t" 07116 "stp x2, x3, [%[a], 160]\n\t" 07117 "stp x4, x5, [%[a], 176]\n\t" 07118 "csetm %[c], cc\n\t" 07119 : [c] "+r" (c) 07120 : [a] "r" (a), [b] "r" (b) 07121 : "memory", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9" 07122 ); 07123 07124 return c; 07125 } 07126 07127 /* Add b to a into r. (r = a + b) 07128 * 07129 * r A single precision integer. 07130 * a A single precision integer. 07131 * b A single precision integer. 07132 */ 07133 static sp_digit sp_3072_add_24(sp_digit* r, const sp_digit* a, 07134 const sp_digit* b) 07135 { 07136 sp_digit c = 0; 07137 07138 __asm__ __volatile__ ( 07139 "ldp x3, x4, [%[a], 0]\n\t" 07140 "ldp x5, x6, [%[a], 16]\n\t" 07141 "ldp x7, x8, [%[b], 0]\n\t" 07142 "ldp x9, x10, [%[b], 16]\n\t" 07143 "adds x3, x3, x7\n\t" 07144 "adcs x4, x4, x8\n\t" 07145 "adcs x5, x5, x9\n\t" 07146 "adcs x6, x6, x10\n\t" 07147 "stp x3, x4, [%[r], 0]\n\t" 07148 "stp x5, x6, [%[r], 16]\n\t" 07149 "ldp x3, x4, [%[a], 32]\n\t" 07150 "ldp x5, x6, [%[a], 48]\n\t" 07151 "ldp x7, x8, [%[b], 32]\n\t" 07152 "ldp x9, x10, [%[b], 48]\n\t" 07153 "adcs x3, x3, x7\n\t" 07154 "adcs x4, x4, x8\n\t" 07155 "adcs x5, x5, x9\n\t" 07156 "adcs x6, x6, x10\n\t" 07157 "stp x3, x4, [%[r], 32]\n\t" 07158 "stp x5, x6, [%[r], 48]\n\t" 07159 "ldp x3, x4, [%[a], 64]\n\t" 07160 "ldp x5, x6, [%[a], 80]\n\t" 07161 "ldp x7, x8, [%[b], 64]\n\t" 07162 "ldp x9, x10, [%[b], 80]\n\t" 07163 "adcs x3, x3, x7\n\t" 07164 "adcs x4, x4, x8\n\t" 07165 "adcs x5, x5, x9\n\t" 07166 "adcs x6, x6, x10\n\t" 07167 "stp x3, x4, [%[r], 64]\n\t" 07168 "stp x5, x6, [%[r], 80]\n\t" 07169 "ldp x3, x4, [%[a], 96]\n\t" 07170 "ldp x5, x6, [%[a], 112]\n\t" 07171 "ldp x7, x8, [%[b], 96]\n\t" 07172 "ldp x9, x10, [%[b], 112]\n\t" 07173 "adcs x3, x3, x7\n\t" 07174 "adcs x4, x4, x8\n\t" 07175 "adcs x5, x5, x9\n\t" 07176 "adcs x6, x6, x10\n\t" 07177 "stp x3, x4, [%[r], 96]\n\t" 07178 "stp x5, x6, [%[r], 112]\n\t" 07179 "ldp x3, x4, [%[a], 128]\n\t" 07180 "ldp x5, x6, [%[a], 144]\n\t" 07181 "ldp x7, x8, [%[b], 128]\n\t" 07182 "ldp x9, x10, [%[b], 144]\n\t" 07183 "adcs x3, x3, x7\n\t" 07184 "adcs x4, x4, x8\n\t" 07185 "adcs x5, x5, x9\n\t" 07186 "adcs x6, x6, x10\n\t" 07187 "stp x3, x4, [%[r], 128]\n\t" 07188 "stp x5, x6, [%[r], 144]\n\t" 07189 "ldp x3, x4, [%[a], 160]\n\t" 07190 "ldp x5, x6, [%[a], 176]\n\t" 07191 "ldp x7, x8, [%[b], 160]\n\t" 07192 "ldp x9, x10, [%[b], 176]\n\t" 07193 "adcs x3, x3, x7\n\t" 07194 "adcs x4, x4, x8\n\t" 07195 "adcs x5, x5, x9\n\t" 07196 "adcs x6, x6, x10\n\t" 07197 "stp x3, x4, [%[r], 160]\n\t" 07198 "stp x5, x6, [%[r], 176]\n\t" 07199 "cset %[c], cs\n\t" 07200 : [c] "+r" (c) 07201 : [r] "r" (r), [a] "r" (a), [b] "r" (b) 07202 : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10" 07203 ); 07204 07205 return c; 07206 } 07207 07208 /* AND m into each word of a and store in r. 07209 * 07210 * r A single precision integer. 07211 * a A single precision integer. 07212 * m Mask to AND against each digit. 07213 */ 07214 static void sp_3072_mask_12(sp_digit* r, sp_digit* a, sp_digit m) 07215 { 07216 #ifdef WOLFSSL_SP_SMALL 07217 int i; 07218 07219 for (i=0; i<12; i++) 07220 r[i] = a[i] & m; 07221 #else 07222 r[0] = a[0] & m; 07223 r[1] = a[1] & m; 07224 r[2] = a[2] & m; 07225 r[3] = a[3] & m; 07226 r[4] = a[4] & m; 07227 r[5] = a[5] & m; 07228 r[6] = a[6] & m; 07229 r[7] = a[7] & m; 07230 r[8] = a[8] & m; 07231 r[9] = a[9] & m; 07232 r[10] = a[10] & m; 07233 r[11] = a[11] & m; 07234 #endif 07235 } 07236 07237 /* Multiply a and b into r. (r = a * b) 07238 * 07239 * r A single precision integer. 07240 * a A single precision integer. 07241 * b A single precision integer. 07242 */ 07243 static void sp_3072_mul_24(sp_digit* r, const sp_digit* a, 07244 const sp_digit* b) 07245 { 07246 sp_digit* z0 = r; 07247 sp_digit z1[24]; 07248 sp_digit a1[12]; 07249 sp_digit b1[12]; 07250 sp_digit z2[24]; 07251 sp_digit u, ca, cb; 07252 07253 ca = sp_3072_add_12(a1, a, &a[12]); 07254 cb = sp_3072_add_12(b1, b, &b[12]); 07255 u = ca & cb; 07256 sp_3072_mul_12(z1, a1, b1); 07257 sp_3072_mul_12(z2, &a[12], &b[12]); 07258 sp_3072_mul_12(z0, a, b); 07259 sp_3072_mask_12(r + 24, a1, 0 - cb); 07260 sp_3072_mask_12(b1, b1, 0 - ca); 07261 u += sp_3072_add_12(r + 24, r + 24, b1); 07262 u += sp_3072_sub_in_place_24(z1, z2); 07263 u += sp_3072_sub_in_place_24(z1, z0); 07264 u += sp_3072_add_24(r + 12, r + 12, z1); 07265 r[36] = u; 07266 XMEMSET(r + 36 + 1, 0, sizeof(sp_digit) * (12 - 1)); 07267 sp_3072_add_24(r + 24, r + 24, z2); 07268 } 07269 07270 /* Square a and put result in r. (r = a * a) 07271 * 07272 * r A single precision integer. 07273 * a A single precision integer. 07274 */ 07275 static void sp_3072_sqr_24(sp_digit* r, const sp_digit* a) 07276 { 07277 sp_digit* z0 = r; 07278 sp_digit z2[24]; 07279 sp_digit z1[24]; 07280 sp_digit a1[12]; 07281 sp_digit u; 07282 07283 u = sp_3072_add_12(a1, a, &a[12]); 07284 sp_3072_sqr_12(z1, a1); 07285 sp_3072_sqr_12(z2, &a[12]); 07286 sp_3072_sqr_12(z0, a); 07287 sp_3072_mask_12(r + 24, a1, 0 - u); 07288 u += sp_3072_add_12(r + 24, r + 24, r + 24); 07289 u += sp_3072_sub_in_place_24(z1, z2); 07290 u += sp_3072_sub_in_place_24(z1, z0); 07291 u += sp_3072_add_24(r + 12, r + 12, z1); 07292 r[36] = u; 07293 XMEMSET(r + 36 + 1, 0, sizeof(sp_digit) * (12 - 1)); 07294 sp_3072_add_24(r + 24, r + 24, z2); 07295 } 07296 07297 /* Sub b from a into a. (a -= b) 07298 * 07299 * a A single precision integer and result. 07300 * b A single precision integer. 07301 */ 07302 static sp_digit sp_3072_sub_in_place_48(sp_digit* a, const sp_digit* b) 07303 { 07304 sp_digit c = 0; 07305 07306 __asm__ __volatile__ ( 07307 "ldp x2, x3, [%[a], 0]\n\t" 07308 "ldp x4, x5, [%[a], 16]\n\t" 07309 "ldp x6, x7, [%[b], 0]\n\t" 07310 "ldp x8, x9, [%[b], 16]\n\t" 07311 "subs x2, x2, x6\n\t" 07312 "sbcs x3, x3, x7\n\t" 07313 "sbcs x4, x4, x8\n\t" 07314 "sbcs x5, x5, x9\n\t" 07315 "stp x2, x3, [%[a], 0]\n\t" 07316 "stp x4, x5, [%[a], 16]\n\t" 07317 "ldp x2, x3, [%[a], 32]\n\t" 07318 "ldp x4, x5, [%[a], 48]\n\t" 07319 "ldp x6, x7, [%[b], 32]\n\t" 07320 "ldp x8, x9, [%[b], 48]\n\t" 07321 "sbcs x2, x2, x6\n\t" 07322 "sbcs x3, x3, x7\n\t" 07323 "sbcs x4, x4, x8\n\t" 07324 "sbcs x5, x5, x9\n\t" 07325 "stp x2, x3, [%[a], 32]\n\t" 07326 "stp x4, x5, [%[a], 48]\n\t" 07327 "ldp x2, x3, [%[a], 64]\n\t" 07328 "ldp x4, x5, [%[a], 80]\n\t" 07329 "ldp x6, x7, [%[b], 64]\n\t" 07330 "ldp x8, x9, [%[b], 80]\n\t" 07331 "sbcs x2, x2, x6\n\t" 07332 "sbcs x3, x3, x7\n\t" 07333 "sbcs x4, x4, x8\n\t" 07334 "sbcs x5, x5, x9\n\t" 07335 "stp x2, x3, [%[a], 64]\n\t" 07336 "stp x4, x5, [%[a], 80]\n\t" 07337 "ldp x2, x3, [%[a], 96]\n\t" 07338 "ldp x4, x5, [%[a], 112]\n\t" 07339 "ldp x6, x7, [%[b], 96]\n\t" 07340 "ldp x8, x9, [%[b], 112]\n\t" 07341 "sbcs x2, x2, x6\n\t" 07342 "sbcs x3, x3, x7\n\t" 07343 "sbcs x4, x4, x8\n\t" 07344 "sbcs x5, x5, x9\n\t" 07345 "stp x2, x3, [%[a], 96]\n\t" 07346 "stp x4, x5, [%[a], 112]\n\t" 07347 "ldp x2, x3, [%[a], 128]\n\t" 07348 "ldp x4, x5, [%[a], 144]\n\t" 07349 "ldp x6, x7, [%[b], 128]\n\t" 07350 "ldp x8, x9, [%[b], 144]\n\t" 07351 "sbcs x2, x2, x6\n\t" 07352 "sbcs x3, x3, x7\n\t" 07353 "sbcs x4, x4, x8\n\t" 07354 "sbcs x5, x5, x9\n\t" 07355 "stp x2, x3, [%[a], 128]\n\t" 07356 "stp x4, x5, [%[a], 144]\n\t" 07357 "ldp x2, x3, [%[a], 160]\n\t" 07358 "ldp x4, x5, [%[a], 176]\n\t" 07359 "ldp x6, x7, [%[b], 160]\n\t" 07360 "ldp x8, x9, [%[b], 176]\n\t" 07361 "sbcs x2, x2, x6\n\t" 07362 "sbcs x3, x3, x7\n\t" 07363 "sbcs x4, x4, x8\n\t" 07364 "sbcs x5, x5, x9\n\t" 07365 "stp x2, x3, [%[a], 160]\n\t" 07366 "stp x4, x5, [%[a], 176]\n\t" 07367 "ldp x2, x3, [%[a], 192]\n\t" 07368 "ldp x4, x5, [%[a], 208]\n\t" 07369 "ldp x6, x7, [%[b], 192]\n\t" 07370 "ldp x8, x9, [%[b], 208]\n\t" 07371 "sbcs x2, x2, x6\n\t" 07372 "sbcs x3, x3, x7\n\t" 07373 "sbcs x4, x4, x8\n\t" 07374 "sbcs x5, x5, x9\n\t" 07375 "stp x2, x3, [%[a], 192]\n\t" 07376 "stp x4, x5, [%[a], 208]\n\t" 07377 "ldp x2, x3, [%[a], 224]\n\t" 07378 "ldp x4, x5, [%[a], 240]\n\t" 07379 "ldp x6, x7, [%[b], 224]\n\t" 07380 "ldp x8, x9, [%[b], 240]\n\t" 07381 "sbcs x2, x2, x6\n\t" 07382 "sbcs x3, x3, x7\n\t" 07383 "sbcs x4, x4, x8\n\t" 07384 "sbcs x5, x5, x9\n\t" 07385 "stp x2, x3, [%[a], 224]\n\t" 07386 "stp x4, x5, [%[a], 240]\n\t" 07387 "ldp x2, x3, [%[a], 256]\n\t" 07388 "ldp x4, x5, [%[a], 272]\n\t" 07389 "ldp x6, x7, [%[b], 256]\n\t" 07390 "ldp x8, x9, [%[b], 272]\n\t" 07391 "sbcs x2, x2, x6\n\t" 07392 "sbcs x3, x3, x7\n\t" 07393 "sbcs x4, x4, x8\n\t" 07394 "sbcs x5, x5, x9\n\t" 07395 "stp x2, x3, [%[a], 256]\n\t" 07396 "stp x4, x5, [%[a], 272]\n\t" 07397 "ldp x2, x3, [%[a], 288]\n\t" 07398 "ldp x4, x5, [%[a], 304]\n\t" 07399 "ldp x6, x7, [%[b], 288]\n\t" 07400 "ldp x8, x9, [%[b], 304]\n\t" 07401 "sbcs x2, x2, x6\n\t" 07402 "sbcs x3, x3, x7\n\t" 07403 "sbcs x4, x4, x8\n\t" 07404 "sbcs x5, x5, x9\n\t" 07405 "stp x2, x3, [%[a], 288]\n\t" 07406 "stp x4, x5, [%[a], 304]\n\t" 07407 "ldp x2, x3, [%[a], 320]\n\t" 07408 "ldp x4, x5, [%[a], 336]\n\t" 07409 "ldp x6, x7, [%[b], 320]\n\t" 07410 "ldp x8, x9, [%[b], 336]\n\t" 07411 "sbcs x2, x2, x6\n\t" 07412 "sbcs x3, x3, x7\n\t" 07413 "sbcs x4, x4, x8\n\t" 07414 "sbcs x5, x5, x9\n\t" 07415 "stp x2, x3, [%[a], 320]\n\t" 07416 "stp x4, x5, [%[a], 336]\n\t" 07417 "ldp x2, x3, [%[a], 352]\n\t" 07418 "ldp x4, x5, [%[a], 368]\n\t" 07419 "ldp x6, x7, [%[b], 352]\n\t" 07420 "ldp x8, x9, [%[b], 368]\n\t" 07421 "sbcs x2, x2, x6\n\t" 07422 "sbcs x3, x3, x7\n\t" 07423 "sbcs x4, x4, x8\n\t" 07424 "sbcs x5, x5, x9\n\t" 07425 "stp x2, x3, [%[a], 352]\n\t" 07426 "stp x4, x5, [%[a], 368]\n\t" 07427 "csetm %[c], cc\n\t" 07428 : [c] "+r" (c) 07429 : [a] "r" (a), [b] "r" (b) 07430 : "memory", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9" 07431 ); 07432 07433 return c; 07434 } 07435 07436 /* Add b to a into r. (r = a + b) 07437 * 07438 * r A single precision integer. 07439 * a A single precision integer. 07440 * b A single precision integer. 07441 */ 07442 static sp_digit sp_3072_add_48(sp_digit* r, const sp_digit* a, 07443 const sp_digit* b) 07444 { 07445 sp_digit c = 0; 07446 07447 __asm__ __volatile__ ( 07448 "ldp x3, x4, [%[a], 0]\n\t" 07449 "ldp x5, x6, [%[a], 16]\n\t" 07450 "ldp x7, x8, [%[b], 0]\n\t" 07451 "ldp x9, x10, [%[b], 16]\n\t" 07452 "adds x3, x3, x7\n\t" 07453 "adcs x4, x4, x8\n\t" 07454 "adcs x5, x5, x9\n\t" 07455 "adcs x6, x6, x10\n\t" 07456 "stp x3, x4, [%[r], 0]\n\t" 07457 "stp x5, x6, [%[r], 16]\n\t" 07458 "ldp x3, x4, [%[a], 32]\n\t" 07459 "ldp x5, x6, [%[a], 48]\n\t" 07460 "ldp x7, x8, [%[b], 32]\n\t" 07461 "ldp x9, x10, [%[b], 48]\n\t" 07462 "adcs x3, x3, x7\n\t" 07463 "adcs x4, x4, x8\n\t" 07464 "adcs x5, x5, x9\n\t" 07465 "adcs x6, x6, x10\n\t" 07466 "stp x3, x4, [%[r], 32]\n\t" 07467 "stp x5, x6, [%[r], 48]\n\t" 07468 "ldp x3, x4, [%[a], 64]\n\t" 07469 "ldp x5, x6, [%[a], 80]\n\t" 07470 "ldp x7, x8, [%[b], 64]\n\t" 07471 "ldp x9, x10, [%[b], 80]\n\t" 07472 "adcs x3, x3, x7\n\t" 07473 "adcs x4, x4, x8\n\t" 07474 "adcs x5, x5, x9\n\t" 07475 "adcs x6, x6, x10\n\t" 07476 "stp x3, x4, [%[r], 64]\n\t" 07477 "stp x5, x6, [%[r], 80]\n\t" 07478 "ldp x3, x4, [%[a], 96]\n\t" 07479 "ldp x5, x6, [%[a], 112]\n\t" 07480 "ldp x7, x8, [%[b], 96]\n\t" 07481 "ldp x9, x10, [%[b], 112]\n\t" 07482 "adcs x3, x3, x7\n\t" 07483 "adcs x4, x4, x8\n\t" 07484 "adcs x5, x5, x9\n\t" 07485 "adcs x6, x6, x10\n\t" 07486 "stp x3, x4, [%[r], 96]\n\t" 07487 "stp x5, x6, [%[r], 112]\n\t" 07488 "ldp x3, x4, [%[a], 128]\n\t" 07489 "ldp x5, x6, [%[a], 144]\n\t" 07490 "ldp x7, x8, [%[b], 128]\n\t" 07491 "ldp x9, x10, [%[b], 144]\n\t" 07492 "adcs x3, x3, x7\n\t" 07493 "adcs x4, x4, x8\n\t" 07494 "adcs x5, x5, x9\n\t" 07495 "adcs x6, x6, x10\n\t" 07496 "stp x3, x4, [%[r], 128]\n\t" 07497 "stp x5, x6, [%[r], 144]\n\t" 07498 "ldp x3, x4, [%[a], 160]\n\t" 07499 "ldp x5, x6, [%[a], 176]\n\t" 07500 "ldp x7, x8, [%[b], 160]\n\t" 07501 "ldp x9, x10, [%[b], 176]\n\t" 07502 "adcs x3, x3, x7\n\t" 07503 "adcs x4, x4, x8\n\t" 07504 "adcs x5, x5, x9\n\t" 07505 "adcs x6, x6, x10\n\t" 07506 "stp x3, x4, [%[r], 160]\n\t" 07507 "stp x5, x6, [%[r], 176]\n\t" 07508 "ldp x3, x4, [%[a], 192]\n\t" 07509 "ldp x5, x6, [%[a], 208]\n\t" 07510 "ldp x7, x8, [%[b], 192]\n\t" 07511 "ldp x9, x10, [%[b], 208]\n\t" 07512 "adcs x3, x3, x7\n\t" 07513 "adcs x4, x4, x8\n\t" 07514 "adcs x5, x5, x9\n\t" 07515 "adcs x6, x6, x10\n\t" 07516 "stp x3, x4, [%[r], 192]\n\t" 07517 "stp x5, x6, [%[r], 208]\n\t" 07518 "ldp x3, x4, [%[a], 224]\n\t" 07519 "ldp x5, x6, [%[a], 240]\n\t" 07520 "ldp x7, x8, [%[b], 224]\n\t" 07521 "ldp x9, x10, [%[b], 240]\n\t" 07522 "adcs x3, x3, x7\n\t" 07523 "adcs x4, x4, x8\n\t" 07524 "adcs x5, x5, x9\n\t" 07525 "adcs x6, x6, x10\n\t" 07526 "stp x3, x4, [%[r], 224]\n\t" 07527 "stp x5, x6, [%[r], 240]\n\t" 07528 "ldp x3, x4, [%[a], 256]\n\t" 07529 "ldp x5, x6, [%[a], 272]\n\t" 07530 "ldp x7, x8, [%[b], 256]\n\t" 07531 "ldp x9, x10, [%[b], 272]\n\t" 07532 "adcs x3, x3, x7\n\t" 07533 "adcs x4, x4, x8\n\t" 07534 "adcs x5, x5, x9\n\t" 07535 "adcs x6, x6, x10\n\t" 07536 "stp x3, x4, [%[r], 256]\n\t" 07537 "stp x5, x6, [%[r], 272]\n\t" 07538 "ldp x3, x4, [%[a], 288]\n\t" 07539 "ldp x5, x6, [%[a], 304]\n\t" 07540 "ldp x7, x8, [%[b], 288]\n\t" 07541 "ldp x9, x10, [%[b], 304]\n\t" 07542 "adcs x3, x3, x7\n\t" 07543 "adcs x4, x4, x8\n\t" 07544 "adcs x5, x5, x9\n\t" 07545 "adcs x6, x6, x10\n\t" 07546 "stp x3, x4, [%[r], 288]\n\t" 07547 "stp x5, x6, [%[r], 304]\n\t" 07548 "ldp x3, x4, [%[a], 320]\n\t" 07549 "ldp x5, x6, [%[a], 336]\n\t" 07550 "ldp x7, x8, [%[b], 320]\n\t" 07551 "ldp x9, x10, [%[b], 336]\n\t" 07552 "adcs x3, x3, x7\n\t" 07553 "adcs x4, x4, x8\n\t" 07554 "adcs x5, x5, x9\n\t" 07555 "adcs x6, x6, x10\n\t" 07556 "stp x3, x4, [%[r], 320]\n\t" 07557 "stp x5, x6, [%[r], 336]\n\t" 07558 "ldp x3, x4, [%[a], 352]\n\t" 07559 "ldp x5, x6, [%[a], 368]\n\t" 07560 "ldp x7, x8, [%[b], 352]\n\t" 07561 "ldp x9, x10, [%[b], 368]\n\t" 07562 "adcs x3, x3, x7\n\t" 07563 "adcs x4, x4, x8\n\t" 07564 "adcs x5, x5, x9\n\t" 07565 "adcs x6, x6, x10\n\t" 07566 "stp x3, x4, [%[r], 352]\n\t" 07567 "stp x5, x6, [%[r], 368]\n\t" 07568 "cset %[c], cs\n\t" 07569 : [c] "+r" (c) 07570 : [r] "r" (r), [a] "r" (a), [b] "r" (b) 07571 : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10" 07572 ); 07573 07574 return c; 07575 } 07576 07577 /* AND m into each word of a and store in r. 07578 * 07579 * r A single precision integer. 07580 * a A single precision integer. 07581 * m Mask to AND against each digit. 07582 */ 07583 static void sp_3072_mask_24(sp_digit* r, sp_digit* a, sp_digit m) 07584 { 07585 #ifdef WOLFSSL_SP_SMALL 07586 int i; 07587 07588 for (i=0; i<24; i++) 07589 r[i] = a[i] & m; 07590 #else 07591 int i; 07592 07593 for (i = 0; i < 24; i += 8) { 07594 r[i+0] = a[i+0] & m; 07595 r[i+1] = a[i+1] & m; 07596 r[i+2] = a[i+2] & m; 07597 r[i+3] = a[i+3] & m; 07598 r[i+4] = a[i+4] & m; 07599 r[i+5] = a[i+5] & m; 07600 r[i+6] = a[i+6] & m; 07601 r[i+7] = a[i+7] & m; 07602 } 07603 #endif 07604 } 07605 07606 /* Multiply a and b into r. (r = a * b) 07607 * 07608 * r A single precision integer. 07609 * a A single precision integer. 07610 * b A single precision integer. 07611 */ 07612 static void sp_3072_mul_48(sp_digit* r, const sp_digit* a, 07613 const sp_digit* b) 07614 { 07615 sp_digit* z0 = r; 07616 sp_digit z1[48]; 07617 sp_digit a1[24]; 07618 sp_digit b1[24]; 07619 sp_digit z2[48]; 07620 sp_digit u, ca, cb; 07621 07622 ca = sp_3072_add_24(a1, a, &a[24]); 07623 cb = sp_3072_add_24(b1, b, &b[24]); 07624 u = ca & cb; 07625 sp_3072_mul_24(z1, a1, b1); 07626 sp_3072_mul_24(z2, &a[24], &b[24]); 07627 sp_3072_mul_24(z0, a, b); 07628 sp_3072_mask_24(r + 48, a1, 0 - cb); 07629 sp_3072_mask_24(b1, b1, 0 - ca); 07630 u += sp_3072_add_24(r + 48, r + 48, b1); 07631 u += sp_3072_sub_in_place_48(z1, z2); 07632 u += sp_3072_sub_in_place_48(z1, z0); 07633 u += sp_3072_add_48(r + 24, r + 24, z1); 07634 r[72] = u; 07635 XMEMSET(r + 72 + 1, 0, sizeof(sp_digit) * (24 - 1)); 07636 sp_3072_add_48(r + 48, r + 48, z2); 07637 } 07638 07639 /* Square a and put result in r. (r = a * a) 07640 * 07641 * r A single precision integer. 07642 * a A single precision integer. 07643 */ 07644 static void sp_3072_sqr_48(sp_digit* r, const sp_digit* a) 07645 { 07646 sp_digit* z0 = r; 07647 sp_digit z2[48]; 07648 sp_digit z1[48]; 07649 sp_digit a1[24]; 07650 sp_digit u; 07651 07652 u = sp_3072_add_24(a1, a, &a[24]); 07653 sp_3072_sqr_24(z1, a1); 07654 sp_3072_sqr_24(z2, &a[24]); 07655 sp_3072_sqr_24(z0, a); 07656 sp_3072_mask_24(r + 48, a1, 0 - u); 07657 u += sp_3072_add_24(r + 48, r + 48, r + 48); 07658 u += sp_3072_sub_in_place_48(z1, z2); 07659 u += sp_3072_sub_in_place_48(z1, z0); 07660 u += sp_3072_add_48(r + 24, r + 24, z1); 07661 r[72] = u; 07662 XMEMSET(r + 72 + 1, 0, sizeof(sp_digit) * (24 - 1)); 07663 sp_3072_add_48(r + 48, r + 48, z2); 07664 } 07665 07666 #endif /* WOLFSSL_SP_SMALL */ 07667 #ifdef WOLFSSL_SP_SMALL 07668 /* Add b to a into r. (r = a + b) 07669 * 07670 * r A single precision integer. 07671 * a A single precision integer. 07672 * b A single precision integer. 07673 */ 07674 static sp_digit sp_3072_add_48(sp_digit* r, const sp_digit* a, 07675 const sp_digit* b) 07676 { 07677 sp_digit c = 0; 07678 07679 __asm__ __volatile__ ( 07680 "add x11, %[a], 384\n\t" 07681 "\n1:\n\t" 07682 "adds %[c], %[c], #-1\n\t" 07683 "ldp x3, x4, [%[a]], #16\n\t" 07684 "ldp x5, x6, [%[a]], #16\n\t" 07685 "ldp x7, x8, [%[b]], #16\n\t" 07686 "ldp x9, x10, [%[b]], #16\n\t" 07687 "adcs x3, x3, x7\n\t" 07688 "adcs x4, x4, x8\n\t" 07689 "adcs x5, x5, x9\n\t" 07690 "adcs x6, x6, x10\n\t" 07691 "stp x3, x4, [%[r]], #16\n\t" 07692 "stp x5, x6, [%[r]], #16\n\t" 07693 "cset %[c], cs\n\t" 07694 "cmp %[a], x11\n\t" 07695 "b.ne 1b\n\t" 07696 : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) 07697 : 07698 : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11" 07699 ); 07700 07701 return c; 07702 } 07703 07704 #endif /* WOLFSSL_SP_SMALL */ 07705 #ifdef WOLFSSL_SP_SMALL 07706 /* Sub b from a into a. (a -= b) 07707 * 07708 * a A single precision integer. 07709 * b A single precision integer. 07710 */ 07711 static sp_digit sp_3072_sub_in_place_48(sp_digit* a, const sp_digit* b) 07712 { 07713 sp_digit c = 0; 07714 07715 __asm__ __volatile__ ( 07716 "add x10, %[a], 384\n\t" 07717 "\n1:\n\t" 07718 "subs %[c], xzr, %[c]\n\t" 07719 "ldp x2, x3, [%[a]]\n\t" 07720 "ldp x4, x5, [%[a], #16]\n\t" 07721 "ldp x6, x7, [%[b]], #16\n\t" 07722 "ldp x8, x9, [%[b]], #16\n\t" 07723 "sbcs x2, x2, x6\n\t" 07724 "sbcs x3, x3, x7\n\t" 07725 "sbcs x4, x4, x8\n\t" 07726 "sbcs x5, x5, x9\n\t" 07727 "stp x2, x3, [%[a]], #16\n\t" 07728 "stp x4, x5, [%[a]], #16\n\t" 07729 "csetm %[c], cc\n\t" 07730 "cmp %[a], x10\n\t" 07731 "b.ne 1b\n\t" 07732 : [c] "+r" (c), [a] "+r" (a), [b] "+r" (b) 07733 : 07734 : "memory", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10" 07735 ); 07736 07737 return c; 07738 } 07739 07740 #endif /* WOLFSSL_SP_SMALL */ 07741 #ifdef WOLFSSL_SP_SMALL 07742 /* Multiply a and b into r. (r = a * b) 07743 * 07744 * r A single precision integer. 07745 * a A single precision integer. 07746 * b A single precision integer. 07747 */ 07748 static void sp_3072_mul_48(sp_digit* r, const sp_digit* a, const sp_digit* b) 07749 { 07750 sp_digit tmp[96]; 07751 07752 __asm__ __volatile__ ( 07753 "mov x5, 0\n\t" 07754 "mov x6, 0\n\t" 07755 "mov x7, 0\n\t" 07756 "mov x8, 0\n\t" 07757 "\n1:\n\t" 07758 "subs x3, x5, 376\n\t" 07759 "csel x3, xzr, x3, cc\n\t" 07760 "sub x4, x5, x3\n\t" 07761 "\n2:\n\t" 07762 "ldr x10, [%[a], x3]\n\t" 07763 "ldr x11, [%[b], x4]\n\t" 07764 "mul x9, x10, x11\n\t" 07765 "umulh x10, x10, x11\n\t" 07766 "adds x6, x6, x9\n\t" 07767 "adcs x7, x7, x10\n\t" 07768 "adc x8, x8, xzr\n\t" 07769 "add x3, x3, #8\n\t" 07770 "sub x4, x4, #8\n\t" 07771 "cmp x3, 384\n\t" 07772 "b.eq 3f\n\t" 07773 "cmp x3, x5\n\t" 07774 "b.le 2b\n\t" 07775 "\n3:\n\t" 07776 "str x6, [%[r], x5]\n\t" 07777 "mov x6, x7\n\t" 07778 "mov x7, x8\n\t" 07779 "mov x8, #0\n\t" 07780 "add x5, x5, #8\n\t" 07781 "cmp x5, 752\n\t" 07782 "b.le 1b\n\t" 07783 "str x6, [%[r], x5]\n\t" 07784 : 07785 : [r] "r" (tmp), [a] "r" (a), [b] "r" (b) 07786 : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11" 07787 ); 07788 07789 XMEMCPY(r, tmp, sizeof(tmp)); 07790 } 07791 07792 /* Square a and put result in r. (r = a * a) 07793 * 07794 * r A single precision integer. 07795 * a A single precision integer. 07796 */ 07797 static void sp_3072_sqr_48(sp_digit* r, const sp_digit* a) 07798 { 07799 sp_digit tmp[96]; 07800 07801 __asm__ __volatile__ ( 07802 "mov x6, 0\n\t" 07803 "mov x7, 0\n\t" 07804 "mov x8, 0\n\t" 07805 "mov x5, 0\n\t" 07806 "\n1:\n\t" 07807 "subs x3, x5, 376\n\t" 07808 "csel x3, xzr, x3, cc\n\t" 07809 "sub x4, x5, x3\n\t" 07810 "\n2:\n\t" 07811 "cmp x4, x3\n\t" 07812 "b.eq 4f\n\t" 07813 "ldr x10, [%[a], x3]\n\t" 07814 "ldr x11, [%[a], x4]\n\t" 07815 "mul x9, x10, x11\n\t" 07816 "umulh x10, x10, x11\n\t" 07817 "adds x6, x6, x9\n\t" 07818 "adcs x7, x7, x10\n\t" 07819 "adc x8, x8, xzr\n\t" 07820 "adds x6, x6, x9\n\t" 07821 "adcs x7, x7, x10\n\t" 07822 "adc x8, x8, xzr\n\t" 07823 "b.al 5f\n\t" 07824 "\n4:\n\t" 07825 "ldr x10, [%[a], x3]\n\t" 07826 "mul x9, x10, x10\n\t" 07827 "umulh x10, x10, x10\n\t" 07828 "adds x6, x6, x9\n\t" 07829 "adcs x7, x7, x10\n\t" 07830 "adc x8, x8, xzr\n\t" 07831 "\n5:\n\t" 07832 "add x3, x3, #8\n\t" 07833 "sub x4, x4, #8\n\t" 07834 "cmp x3, 384\n\t" 07835 "b.eq 3f\n\t" 07836 "cmp x3, x4\n\t" 07837 "b.gt 3f\n\t" 07838 "cmp x3, x5\n\t" 07839 "b.le 2b\n\t" 07840 "\n3:\n\t" 07841 "str x6, [%[r], x5]\n\t" 07842 "mov x6, x7\n\t" 07843 "mov x7, x8\n\t" 07844 "mov x8, #0\n\t" 07845 "add x5, x5, #8\n\t" 07846 "cmp x5, 752\n\t" 07847 "b.le 1b\n\t" 07848 "str x6, [%[r], x5]\n\t" 07849 : 07850 : [r] "r" (tmp), [a] "r" (a) 07851 : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11" 07852 ); 07853 07854 XMEMCPY(r, tmp, sizeof(tmp)); 07855 } 07856 07857 #endif /* WOLFSSL_SP_SMALL */ 07858 #if !defined(SP_RSA_PRIVATE_EXP_D) && defined(WOLFSSL_HAVE_SP_RSA) 07859 #ifdef WOLFSSL_SP_SMALL 07860 /* AND m into each word of a and store in r. 07861 * 07862 * r A single precision integer. 07863 * a A single precision integer. 07864 * m Mask to AND against each digit. 07865 */ 07866 static void sp_3072_mask_24(sp_digit* r, sp_digit* a, sp_digit m) 07867 { 07868 int i; 07869 07870 for (i=0; i<24; i++) 07871 r[i] = a[i] & m; 07872 } 07873 07874 #endif /* WOLFSSL_SP_SMALL */ 07875 #ifdef WOLFSSL_SP_SMALL 07876 /* Add b to a into r. (r = a + b) 07877 * 07878 * r A single precision integer. 07879 * a A single precision integer. 07880 * b A single precision integer. 07881 */ 07882 static sp_digit sp_3072_add_24(sp_digit* r, const sp_digit* a, 07883 const sp_digit* b) 07884 { 07885 sp_digit c = 0; 07886 07887 __asm__ __volatile__ ( 07888 "add x11, %[a], 192\n\t" 07889 "\n1:\n\t" 07890 "adds %[c], %[c], #-1\n\t" 07891 "ldp x3, x4, [%[a]], #16\n\t" 07892 "ldp x5, x6, [%[a]], #16\n\t" 07893 "ldp x7, x8, [%[b]], #16\n\t" 07894 "ldp x9, x10, [%[b]], #16\n\t" 07895 "adcs x3, x3, x7\n\t" 07896 "adcs x4, x4, x8\n\t" 07897 "adcs x5, x5, x9\n\t" 07898 "adcs x6, x6, x10\n\t" 07899 "stp x3, x4, [%[r]], #16\n\t" 07900 "stp x5, x6, [%[r]], #16\n\t" 07901 "cset %[c], cs\n\t" 07902 "cmp %[a], x11\n\t" 07903 "b.ne 1b\n\t" 07904 : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) 07905 : 07906 : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11" 07907 ); 07908 07909 return c; 07910 } 07911 07912 #endif /* WOLFSSL_SP_SMALL */ 07913 #ifdef WOLFSSL_SP_SMALL 07914 /* Sub b from a into a. (a -= b) 07915 * 07916 * a A single precision integer. 07917 * b A single precision integer. 07918 */ 07919 static sp_digit sp_3072_sub_in_place_24(sp_digit* a, const sp_digit* b) 07920 { 07921 sp_digit c = 0; 07922 07923 __asm__ __volatile__ ( 07924 "add x10, %[a], 192\n\t" 07925 "\n1:\n\t" 07926 "subs %[c], xzr, %[c]\n\t" 07927 "ldp x2, x3, [%[a]]\n\t" 07928 "ldp x4, x5, [%[a], #16]\n\t" 07929 "ldp x6, x7, [%[b]], #16\n\t" 07930 "ldp x8, x9, [%[b]], #16\n\t" 07931 "sbcs x2, x2, x6\n\t" 07932 "sbcs x3, x3, x7\n\t" 07933 "sbcs x4, x4, x8\n\t" 07934 "sbcs x5, x5, x9\n\t" 07935 "stp x2, x3, [%[a]], #16\n\t" 07936 "stp x4, x5, [%[a]], #16\n\t" 07937 "csetm %[c], cc\n\t" 07938 "cmp %[a], x10\n\t" 07939 "b.ne 1b\n\t" 07940 : [c] "+r" (c), [a] "+r" (a), [b] "+r" (b) 07941 : 07942 : "memory", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10" 07943 ); 07944 07945 return c; 07946 } 07947 07948 #endif /* WOLFSSL_SP_SMALL */ 07949 #ifdef WOLFSSL_SP_SMALL 07950 /* Multiply a and b into r. (r = a * b) 07951 * 07952 * r A single precision integer. 07953 * a A single precision integer. 07954 * b A single precision integer. 07955 */ 07956 static void sp_3072_mul_24(sp_digit* r, const sp_digit* a, const sp_digit* b) 07957 { 07958 sp_digit tmp[48]; 07959 07960 __asm__ __volatile__ ( 07961 "mov x5, 0\n\t" 07962 "mov x6, 0\n\t" 07963 "mov x7, 0\n\t" 07964 "mov x8, 0\n\t" 07965 "\n1:\n\t" 07966 "subs x3, x5, 184\n\t" 07967 "csel x3, xzr, x3, cc\n\t" 07968 "sub x4, x5, x3\n\t" 07969 "\n2:\n\t" 07970 "ldr x10, [%[a], x3]\n\t" 07971 "ldr x11, [%[b], x4]\n\t" 07972 "mul x9, x10, x11\n\t" 07973 "umulh x10, x10, x11\n\t" 07974 "adds x6, x6, x9\n\t" 07975 "adcs x7, x7, x10\n\t" 07976 "adc x8, x8, xzr\n\t" 07977 "add x3, x3, #8\n\t" 07978 "sub x4, x4, #8\n\t" 07979 "cmp x3, 192\n\t" 07980 "b.eq 3f\n\t" 07981 "cmp x3, x5\n\t" 07982 "b.le 2b\n\t" 07983 "\n3:\n\t" 07984 "str x6, [%[r], x5]\n\t" 07985 "mov x6, x7\n\t" 07986 "mov x7, x8\n\t" 07987 "mov x8, #0\n\t" 07988 "add x5, x5, #8\n\t" 07989 "cmp x5, 368\n\t" 07990 "b.le 1b\n\t" 07991 "str x6, [%[r], x5]\n\t" 07992 : 07993 : [r] "r" (tmp), [a] "r" (a), [b] "r" (b) 07994 : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11" 07995 ); 07996 07997 XMEMCPY(r, tmp, sizeof(tmp)); 07998 } 07999 08000 /* Square a and put result in r. (r = a * a) 08001 * 08002 * r A single precision integer. 08003 * a A single precision integer. 08004 */ 08005 static void sp_3072_sqr_24(sp_digit* r, const sp_digit* a) 08006 { 08007 sp_digit tmp[48]; 08008 08009 __asm__ __volatile__ ( 08010 "mov x6, 0\n\t" 08011 "mov x7, 0\n\t" 08012 "mov x8, 0\n\t" 08013 "mov x5, 0\n\t" 08014 "\n1:\n\t" 08015 "subs x3, x5, 184\n\t" 08016 "csel x3, xzr, x3, cc\n\t" 08017 "sub x4, x5, x3\n\t" 08018 "\n2:\n\t" 08019 "cmp x4, x3\n\t" 08020 "b.eq 4f\n\t" 08021 "ldr x10, [%[a], x3]\n\t" 08022 "ldr x11, [%[a], x4]\n\t" 08023 "mul x9, x10, x11\n\t" 08024 "umulh x10, x10, x11\n\t" 08025 "adds x6, x6, x9\n\t" 08026 "adcs x7, x7, x10\n\t" 08027 "adc x8, x8, xzr\n\t" 08028 "adds x6, x6, x9\n\t" 08029 "adcs x7, x7, x10\n\t" 08030 "adc x8, x8, xzr\n\t" 08031 "b.al 5f\n\t" 08032 "\n4:\n\t" 08033 "ldr x10, [%[a], x3]\n\t" 08034 "mul x9, x10, x10\n\t" 08035 "umulh x10, x10, x10\n\t" 08036 "adds x6, x6, x9\n\t" 08037 "adcs x7, x7, x10\n\t" 08038 "adc x8, x8, xzr\n\t" 08039 "\n5:\n\t" 08040 "add x3, x3, #8\n\t" 08041 "sub x4, x4, #8\n\t" 08042 "cmp x3, 192\n\t" 08043 "b.eq 3f\n\t" 08044 "cmp x3, x4\n\t" 08045 "b.gt 3f\n\t" 08046 "cmp x3, x5\n\t" 08047 "b.le 2b\n\t" 08048 "\n3:\n\t" 08049 "str x6, [%[r], x5]\n\t" 08050 "mov x6, x7\n\t" 08051 "mov x7, x8\n\t" 08052 "mov x8, #0\n\t" 08053 "add x5, x5, #8\n\t" 08054 "cmp x5, 368\n\t" 08055 "b.le 1b\n\t" 08056 "str x6, [%[r], x5]\n\t" 08057 : 08058 : [r] "r" (tmp), [a] "r" (a) 08059 : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11" 08060 ); 08061 08062 XMEMCPY(r, tmp, sizeof(tmp)); 08063 } 08064 08065 #endif /* WOLFSSL_SP_SMALL */ 08066 #endif /* !SP_RSA_PRIVATE_EXP_D && WOLFSSL_HAVE_SP_RSA */ 08067 08068 /* Caclulate the bottom digit of -1/a mod 2^n. 08069 * 08070 * a A single precision number. 08071 * rho Bottom word of inverse. 08072 */ 08073 static void sp_3072_mont_setup(sp_digit* a, sp_digit* rho) 08074 { 08075 sp_digit x, b; 08076 08077 b = a[0]; 08078 x = (((b + 2) & 4) << 1) + b; /* here x*a==1 mod 2**4 */ 08079 x *= 2 - b * x; /* here x*a==1 mod 2**8 */ 08080 x *= 2 - b * x; /* here x*a==1 mod 2**16 */ 08081 x *= 2 - b * x; /* here x*a==1 mod 2**32 */ 08082 x *= 2 - b * x; /* here x*a==1 mod 2**64 */ 08083 08084 /* rho = -1/m mod b */ 08085 *rho = -x; 08086 } 08087 08088 #if !defined(SP_RSA_PRIVATE_EXP_D) && defined(WOLFSSL_HAVE_SP_RSA) 08089 /* r = 2^n mod m where n is the number of bits to reduce by. 08090 * Given m must be 3072 bits, just need to subtract. 08091 * 08092 * r A single precision number. 08093 * m A signle precision number. 08094 */ 08095 static void sp_3072_mont_norm_24(sp_digit* r, sp_digit* m) 08096 { 08097 XMEMSET(r, 0, sizeof(sp_digit) * 24); 08098 08099 /* r = 2^n mod m */ 08100 sp_3072_sub_in_place_24(r, m); 08101 } 08102 08103 /* Conditionally subtract b from a using the mask m. 08104 * m is -1 to subtract and 0 when not copying. 08105 * 08106 * r A single precision number representing condition subtract result. 08107 * a A single precision number to subtract from. 08108 * b A single precision number to subtract. 08109 * m Mask value to apply. 08110 */ 08111 static sp_digit sp_3072_cond_sub_24(sp_digit* r, sp_digit* a, sp_digit* b, 08112 sp_digit m) 08113 { 08114 sp_digit c = 0; 08115 08116 #ifdef WOLFSSL_SP_SMALL 08117 __asm__ __volatile__ ( 08118 "mov x8, #0\n\t" 08119 "1:\n\t" 08120 "subs %[c], xzr, %[c]\n\t" 08121 "ldr x4, [%[a], x8]\n\t" 08122 "ldr x5, [%[b], x8]\n\t" 08123 "and x5, x5, %[m]\n\t" 08124 "sbcs x4, x4, x5\n\t" 08125 "csetm %[c], cc\n\t" 08126 "str x4, [%[r], x8]\n\t" 08127 "add x8, x8, #8\n\t" 08128 "cmp x8, 192\n\t" 08129 "b.lt 1b\n\t" 08130 : [c] "+r" (c) 08131 : [r] "r" (r), [a] "r" (a), [b] "r" (b), [m] "r" (m) 08132 : "memory", "x4", "x6", "x5", "x7", "x8" 08133 ); 08134 #else 08135 __asm__ __volatile__ ( 08136 08137 "ldr x4, [%[a], 0]\n\t" 08138 "ldr x6, [%[a], 8]\n\t" 08139 "ldr x5, [%[b], 0]\n\t" 08140 "ldr x7, [%[b], 8]\n\t" 08141 "and x5, x5, %[m]\n\t" 08142 "and x7, x7, %[m]\n\t" 08143 "subs x4, x4, x5\n\t" 08144 "sbcs x6, x6, x7\n\t" 08145 "str x4, [%[r], 0]\n\t" 08146 "str x6, [%[r], 8]\n\t" 08147 "ldr x4, [%[a], 16]\n\t" 08148 "ldr x6, [%[a], 24]\n\t" 08149 "ldr x5, [%[b], 16]\n\t" 08150 "ldr x7, [%[b], 24]\n\t" 08151 "and x5, x5, %[m]\n\t" 08152 "and x7, x7, %[m]\n\t" 08153 "sbcs x4, x4, x5\n\t" 08154 "sbcs x6, x6, x7\n\t" 08155 "str x4, [%[r], 16]\n\t" 08156 "str x6, [%[r], 24]\n\t" 08157 "ldr x4, [%[a], 32]\n\t" 08158 "ldr x6, [%[a], 40]\n\t" 08159 "ldr x5, [%[b], 32]\n\t" 08160 "ldr x7, [%[b], 40]\n\t" 08161 "and x5, x5, %[m]\n\t" 08162 "and x7, x7, %[m]\n\t" 08163 "sbcs x4, x4, x5\n\t" 08164 "sbcs x6, x6, x7\n\t" 08165 "str x4, [%[r], 32]\n\t" 08166 "str x6, [%[r], 40]\n\t" 08167 "ldr x4, [%[a], 48]\n\t" 08168 "ldr x6, [%[a], 56]\n\t" 08169 "ldr x5, [%[b], 48]\n\t" 08170 "ldr x7, [%[b], 56]\n\t" 08171 "and x5, x5, %[m]\n\t" 08172 "and x7, x7, %[m]\n\t" 08173 "sbcs x4, x4, x5\n\t" 08174 "sbcs x6, x6, x7\n\t" 08175 "str x4, [%[r], 48]\n\t" 08176 "str x6, [%[r], 56]\n\t" 08177 "ldr x4, [%[a], 64]\n\t" 08178 "ldr x6, [%[a], 72]\n\t" 08179 "ldr x5, [%[b], 64]\n\t" 08180 "ldr x7, [%[b], 72]\n\t" 08181 "and x5, x5, %[m]\n\t" 08182 "and x7, x7, %[m]\n\t" 08183 "sbcs x4, x4, x5\n\t" 08184 "sbcs x6, x6, x7\n\t" 08185 "str x4, [%[r], 64]\n\t" 08186 "str x6, [%[r], 72]\n\t" 08187 "ldr x4, [%[a], 80]\n\t" 08188 "ldr x6, [%[a], 88]\n\t" 08189 "ldr x5, [%[b], 80]\n\t" 08190 "ldr x7, [%[b], 88]\n\t" 08191 "and x5, x5, %[m]\n\t" 08192 "and x7, x7, %[m]\n\t" 08193 "sbcs x4, x4, x5\n\t" 08194 "sbcs x6, x6, x7\n\t" 08195 "str x4, [%[r], 80]\n\t" 08196 "str x6, [%[r], 88]\n\t" 08197 "ldr x4, [%[a], 96]\n\t" 08198 "ldr x6, [%[a], 104]\n\t" 08199 "ldr x5, [%[b], 96]\n\t" 08200 "ldr x7, [%[b], 104]\n\t" 08201 "and x5, x5, %[m]\n\t" 08202 "and x7, x7, %[m]\n\t" 08203 "sbcs x4, x4, x5\n\t" 08204 "sbcs x6, x6, x7\n\t" 08205 "str x4, [%[r], 96]\n\t" 08206 "str x6, [%[r], 104]\n\t" 08207 "ldr x4, [%[a], 112]\n\t" 08208 "ldr x6, [%[a], 120]\n\t" 08209 "ldr x5, [%[b], 112]\n\t" 08210 "ldr x7, [%[b], 120]\n\t" 08211 "and x5, x5, %[m]\n\t" 08212 "and x7, x7, %[m]\n\t" 08213 "sbcs x4, x4, x5\n\t" 08214 "sbcs x6, x6, x7\n\t" 08215 "str x4, [%[r], 112]\n\t" 08216 "str x6, [%[r], 120]\n\t" 08217 "ldr x4, [%[a], 128]\n\t" 08218 "ldr x6, [%[a], 136]\n\t" 08219 "ldr x5, [%[b], 128]\n\t" 08220 "ldr x7, [%[b], 136]\n\t" 08221 "and x5, x5, %[m]\n\t" 08222 "and x7, x7, %[m]\n\t" 08223 "sbcs x4, x4, x5\n\t" 08224 "sbcs x6, x6, x7\n\t" 08225 "str x4, [%[r], 128]\n\t" 08226 "str x6, [%[r], 136]\n\t" 08227 "ldr x4, [%[a], 144]\n\t" 08228 "ldr x6, [%[a], 152]\n\t" 08229 "ldr x5, [%[b], 144]\n\t" 08230 "ldr x7, [%[b], 152]\n\t" 08231 "and x5, x5, %[m]\n\t" 08232 "and x7, x7, %[m]\n\t" 08233 "sbcs x4, x4, x5\n\t" 08234 "sbcs x6, x6, x7\n\t" 08235 "str x4, [%[r], 144]\n\t" 08236 "str x6, [%[r], 152]\n\t" 08237 "ldr x4, [%[a], 160]\n\t" 08238 "ldr x6, [%[a], 168]\n\t" 08239 "ldr x5, [%[b], 160]\n\t" 08240 "ldr x7, [%[b], 168]\n\t" 08241 "and x5, x5, %[m]\n\t" 08242 "and x7, x7, %[m]\n\t" 08243 "sbcs x4, x4, x5\n\t" 08244 "sbcs x6, x6, x7\n\t" 08245 "str x4, [%[r], 160]\n\t" 08246 "str x6, [%[r], 168]\n\t" 08247 "ldr x4, [%[a], 176]\n\t" 08248 "ldr x6, [%[a], 184]\n\t" 08249 "ldr x5, [%[b], 176]\n\t" 08250 "ldr x7, [%[b], 184]\n\t" 08251 "and x5, x5, %[m]\n\t" 08252 "and x7, x7, %[m]\n\t" 08253 "sbcs x4, x4, x5\n\t" 08254 "sbcs x6, x6, x7\n\t" 08255 "str x4, [%[r], 176]\n\t" 08256 "str x6, [%[r], 184]\n\t" 08257 "csetm %[c], cc\n\t" 08258 : [c] "+r" (c) 08259 : [r] "r" (r), [a] "r" (a), [b] "r" (b), [m] "r" (m) 08260 : "memory", "x4", "x6", "x5", "x7", "x8" 08261 ); 08262 #endif /* WOLFSSL_SP_SMALL */ 08263 08264 return c; 08265 } 08266 08267 /* Reduce the number back to 3072 bits using Montgomery reduction. 08268 * 08269 * a A single precision number to reduce in place. 08270 * m The single precision number representing the modulus. 08271 * mp The digit representing the negative inverse of m mod 2^n. 08272 */ 08273 SP_NOINLINE static void sp_3072_mont_reduce_24(sp_digit* a, sp_digit* m, 08274 sp_digit mp) 08275 { 08276 sp_digit ca = 0; 08277 08278 __asm__ __volatile__ ( 08279 "ldp x12, x13, [%[m], 0]\n\t" 08280 "ldp x14, x15, [%[m], 16]\n\t" 08281 "ldp x16, x17, [%[m], 32]\n\t" 08282 "ldp x18, x19, [%[m], 48]\n\t" 08283 "ldp x20, x21, [%[m], 64]\n\t" 08284 "ldp x22, x23, [%[m], 80]\n\t" 08285 "ldp x24, x25, [%[m], 96]\n\t" 08286 "ldp x26, x27, [%[m], 112]\n\t" 08287 "# i = 0\n\t" 08288 "mov x3, 0\n\t" 08289 "ldp x10, x11, [%[a], 0]\n\t" 08290 "\n1:\n\t" 08291 "# mu = a[i] * mp\n\t" 08292 "mul x8, %[mp], x10\n\t" 08293 "# a[i+0] += m[0] * mu\n\t" 08294 "ldr x9, [%[a], 0]\n\t" 08295 "mul x6, x12, x8\n\t" 08296 "umulh x7, x12, x8\n\t" 08297 "adds x10, x10, x6\n\t" 08298 "adc x5, x7, xzr\n\t" 08299 "# a[i+1] += m[1] * mu\n\t" 08300 "ldr x9, [%[a], 8]\n\t" 08301 "mul x6, x13, x8\n\t" 08302 "umulh x7, x13, x8\n\t" 08303 "adds x10, x11, x6\n\t" 08304 "adc x4, x7, xzr\n\t" 08305 "adds x10, x10, x5\n\t" 08306 "adc x4, x4, xzr\n\t" 08307 "# a[i+2] += m[2] * mu\n\t" 08308 "ldr x11, [%[a], 16]\n\t" 08309 "mul x6, x14, x8\n\t" 08310 "umulh x7, x14, x8\n\t" 08311 "adds x11, x11, x6\n\t" 08312 "adc x5, x7, xzr\n\t" 08313 "adds x11, x11, x4\n\t" 08314 "adc x5, x5, xzr\n\t" 08315 "# a[i+3] += m[3] * mu\n\t" 08316 "ldr x9, [%[a], 24]\n\t" 08317 "mul x6, x15, x8\n\t" 08318 "umulh x7, x15, x8\n\t" 08319 "adds x9, x9, x6\n\t" 08320 "adc x4, x7, xzr\n\t" 08321 "adds x9, x9, x5\n\t" 08322 "str x9, [%[a], 24]\n\t" 08323 "adc x4, x4, xzr\n\t" 08324 "# a[i+4] += m[4] * mu\n\t" 08325 "ldr x9, [%[a], 32]\n\t" 08326 "mul x6, x16, x8\n\t" 08327 "umulh x7, x16, x8\n\t" 08328 "adds x9, x9, x6\n\t" 08329 "adc x5, x7, xzr\n\t" 08330 "adds x9, x9, x4\n\t" 08331 "str x9, [%[a], 32]\n\t" 08332 "adc x5, x5, xzr\n\t" 08333 "# a[i+5] += m[5] * mu\n\t" 08334 "ldr x9, [%[a], 40]\n\t" 08335 "mul x6, x17, x8\n\t" 08336 "umulh x7, x17, x8\n\t" 08337 "adds x9, x9, x6\n\t" 08338 "adc x4, x7, xzr\n\t" 08339 "adds x9, x9, x5\n\t" 08340 "str x9, [%[a], 40]\n\t" 08341 "adc x4, x4, xzr\n\t" 08342 "# a[i+6] += m[6] * mu\n\t" 08343 "ldr x9, [%[a], 48]\n\t" 08344 "mul x6, x18, x8\n\t" 08345 "umulh x7, x18, x8\n\t" 08346 "adds x9, x9, x6\n\t" 08347 "adc x5, x7, xzr\n\t" 08348 "adds x9, x9, x4\n\t" 08349 "str x9, [%[a], 48]\n\t" 08350 "adc x5, x5, xzr\n\t" 08351 "# a[i+7] += m[7] * mu\n\t" 08352 "ldr x9, [%[a], 56]\n\t" 08353 "mul x6, x19, x8\n\t" 08354 "umulh x7, x19, x8\n\t" 08355 "adds x9, x9, x6\n\t" 08356 "adc x4, x7, xzr\n\t" 08357 "adds x9, x9, x5\n\t" 08358 "str x9, [%[a], 56]\n\t" 08359 "adc x4, x4, xzr\n\t" 08360 "# a[i+8] += m[8] * mu\n\t" 08361 "ldr x9, [%[a], 64]\n\t" 08362 "mul x6, x20, x8\n\t" 08363 "umulh x7, x20, x8\n\t" 08364 "adds x9, x9, x6\n\t" 08365 "adc x5, x7, xzr\n\t" 08366 "adds x9, x9, x4\n\t" 08367 "str x9, [%[a], 64]\n\t" 08368 "adc x5, x5, xzr\n\t" 08369 "# a[i+9] += m[9] * mu\n\t" 08370 "ldr x9, [%[a], 72]\n\t" 08371 "mul x6, x21, x8\n\t" 08372 "umulh x7, x21, x8\n\t" 08373 "adds x9, x9, x6\n\t" 08374 "adc x4, x7, xzr\n\t" 08375 "adds x9, x9, x5\n\t" 08376 "str x9, [%[a], 72]\n\t" 08377 "adc x4, x4, xzr\n\t" 08378 "# a[i+10] += m[10] * mu\n\t" 08379 "ldr x9, [%[a], 80]\n\t" 08380 "mul x6, x22, x8\n\t" 08381 "umulh x7, x22, x8\n\t" 08382 "adds x9, x9, x6\n\t" 08383 "adc x5, x7, xzr\n\t" 08384 "adds x9, x9, x4\n\t" 08385 "str x9, [%[a], 80]\n\t" 08386 "adc x5, x5, xzr\n\t" 08387 "# a[i+11] += m[11] * mu\n\t" 08388 "ldr x9, [%[a], 88]\n\t" 08389 "mul x6, x23, x8\n\t" 08390 "umulh x7, x23, x8\n\t" 08391 "adds x9, x9, x6\n\t" 08392 "adc x4, x7, xzr\n\t" 08393 "adds x9, x9, x5\n\t" 08394 "str x9, [%[a], 88]\n\t" 08395 "adc x4, x4, xzr\n\t" 08396 "# a[i+12] += m[12] * mu\n\t" 08397 "ldr x9, [%[a], 96]\n\t" 08398 "mul x6, x24, x8\n\t" 08399 "umulh x7, x24, x8\n\t" 08400 "adds x9, x9, x6\n\t" 08401 "adc x5, x7, xzr\n\t" 08402 "adds x9, x9, x4\n\t" 08403 "str x9, [%[a], 96]\n\t" 08404 "adc x5, x5, xzr\n\t" 08405 "# a[i+13] += m[13] * mu\n\t" 08406 "ldr x9, [%[a], 104]\n\t" 08407 "mul x6, x25, x8\n\t" 08408 "umulh x7, x25, x8\n\t" 08409 "adds x9, x9, x6\n\t" 08410 "adc x4, x7, xzr\n\t" 08411 "adds x9, x9, x5\n\t" 08412 "str x9, [%[a], 104]\n\t" 08413 "adc x4, x4, xzr\n\t" 08414 "# a[i+14] += m[14] * mu\n\t" 08415 "ldr x9, [%[a], 112]\n\t" 08416 "mul x6, x26, x8\n\t" 08417 "umulh x7, x26, x8\n\t" 08418 "adds x9, x9, x6\n\t" 08419 "adc x5, x7, xzr\n\t" 08420 "adds x9, x9, x4\n\t" 08421 "str x9, [%[a], 112]\n\t" 08422 "adc x5, x5, xzr\n\t" 08423 "# a[i+15] += m[15] * mu\n\t" 08424 "ldr x9, [%[a], 120]\n\t" 08425 "mul x6, x27, x8\n\t" 08426 "umulh x7, x27, x8\n\t" 08427 "adds x9, x9, x6\n\t" 08428 "adc x4, x7, xzr\n\t" 08429 "adds x9, x9, x5\n\t" 08430 "str x9, [%[a], 120]\n\t" 08431 "adc x4, x4, xzr\n\t" 08432 "# a[i+16] += m[16] * mu\n\t" 08433 "ldr x7, [%[m], 128]\n\t" 08434 "ldr x9, [%[a], 128]\n\t" 08435 "mul x6, x7, x8\n\t" 08436 "umulh x7, x7, x8\n\t" 08437 "adds x9, x9, x6\n\t" 08438 "adc x5, x7, xzr\n\t" 08439 "adds x9, x9, x4\n\t" 08440 "str x9, [%[a], 128]\n\t" 08441 "adc x5, x5, xzr\n\t" 08442 "# a[i+17] += m[17] * mu\n\t" 08443 "ldr x7, [%[m], 136]\n\t" 08444 "ldr x9, [%[a], 136]\n\t" 08445 "mul x6, x7, x8\n\t" 08446 "umulh x7, x7, x8\n\t" 08447 "adds x9, x9, x6\n\t" 08448 "adc x4, x7, xzr\n\t" 08449 "adds x9, x9, x5\n\t" 08450 "str x9, [%[a], 136]\n\t" 08451 "adc x4, x4, xzr\n\t" 08452 "# a[i+18] += m[18] * mu\n\t" 08453 "ldr x7, [%[m], 144]\n\t" 08454 "ldr x9, [%[a], 144]\n\t" 08455 "mul x6, x7, x8\n\t" 08456 "umulh x7, x7, x8\n\t" 08457 "adds x9, x9, x6\n\t" 08458 "adc x5, x7, xzr\n\t" 08459 "adds x9, x9, x4\n\t" 08460 "str x9, [%[a], 144]\n\t" 08461 "adc x5, x5, xzr\n\t" 08462 "# a[i+19] += m[19] * mu\n\t" 08463 "ldr x7, [%[m], 152]\n\t" 08464 "ldr x9, [%[a], 152]\n\t" 08465 "mul x6, x7, x8\n\t" 08466 "umulh x7, x7, x8\n\t" 08467 "adds x9, x9, x6\n\t" 08468 "adc x4, x7, xzr\n\t" 08469 "adds x9, x9, x5\n\t" 08470 "str x9, [%[a], 152]\n\t" 08471 "adc x4, x4, xzr\n\t" 08472 "# a[i+20] += m[20] * mu\n\t" 08473 "ldr x7, [%[m], 160]\n\t" 08474 "ldr x9, [%[a], 160]\n\t" 08475 "mul x6, x7, x8\n\t" 08476 "umulh x7, x7, x8\n\t" 08477 "adds x9, x9, x6\n\t" 08478 "adc x5, x7, xzr\n\t" 08479 "adds x9, x9, x4\n\t" 08480 "str x9, [%[a], 160]\n\t" 08481 "adc x5, x5, xzr\n\t" 08482 "# a[i+21] += m[21] * mu\n\t" 08483 "ldr x7, [%[m], 168]\n\t" 08484 "ldr x9, [%[a], 168]\n\t" 08485 "mul x6, x7, x8\n\t" 08486 "umulh x7, x7, x8\n\t" 08487 "adds x9, x9, x6\n\t" 08488 "adc x4, x7, xzr\n\t" 08489 "adds x9, x9, x5\n\t" 08490 "str x9, [%[a], 168]\n\t" 08491 "adc x4, x4, xzr\n\t" 08492 "# a[i+22] += m[22] * mu\n\t" 08493 "ldr x7, [%[m], 176]\n\t" 08494 "ldr x9, [%[a], 176]\n\t" 08495 "mul x6, x7, x8\n\t" 08496 "umulh x7, x7, x8\n\t" 08497 "adds x9, x9, x6\n\t" 08498 "adc x5, x7, xzr\n\t" 08499 "adds x9, x9, x4\n\t" 08500 "str x9, [%[a], 176]\n\t" 08501 "adc x5, x5, xzr\n\t" 08502 "# a[i+23] += m[23] * mu\n\t" 08503 "ldr x7, [%[m], 184]\n\t" 08504 "ldr x9, [%[a], 184]\n\t" 08505 "mul x6, x7, x8\n\t" 08506 "umulh x7, x7, x8\n\t" 08507 "adds x5, x5, x6\n\t" 08508 "adcs x7, x7, %[ca]\n\t" 08509 "cset %[ca], cs\n\t" 08510 "adds x9, x9, x5\n\t" 08511 "str x9, [%[a], 184]\n\t" 08512 "ldr x9, [%[a], 192]\n\t" 08513 "adcs x9, x9, x7\n\t" 08514 "str x9, [%[a], 192]\n\t" 08515 "adc %[ca], %[ca], xzr\n\t" 08516 "# i += 1\n\t" 08517 "add %[a], %[a], 8\n\t" 08518 "add x3, x3, 8\n\t" 08519 "cmp x3, 192\n\t" 08520 "blt 1b\n\t" 08521 "str x10, [%[a], 0]\n\t" 08522 "str x11, [%[a], 8]\n\t" 08523 : [ca] "+r" (ca), [a] "+r" (a) 08524 : [m] "r" (m), [mp] "r" (mp) 08525 : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21", "x22", "x23", "x24", "x25", "x26", "x27" 08526 ); 08527 08528 sp_3072_cond_sub_24(a - 24, a, m, (sp_digit)0 - ca); 08529 } 08530 08531 /* Multiply two Montogmery form numbers mod the modulus (prime). 08532 * (r = a * b mod m) 08533 * 08534 * r Result of multiplication. 08535 * a First number to multiply in Montogmery form. 08536 * b Second number to multiply in Montogmery form. 08537 * m Modulus (prime). 08538 * mp Montogmery mulitplier. 08539 */ 08540 static void sp_3072_mont_mul_24(sp_digit* r, sp_digit* a, sp_digit* b, 08541 sp_digit* m, sp_digit mp) 08542 { 08543 sp_3072_mul_24(r, a, b); 08544 sp_3072_mont_reduce_24(r, m, mp); 08545 } 08546 08547 /* Square the Montgomery form number. (r = a * a mod m) 08548 * 08549 * r Result of squaring. 08550 * a Number to square in Montogmery form. 08551 * m Modulus (prime). 08552 * mp Montogmery mulitplier. 08553 */ 08554 static void sp_3072_mont_sqr_24(sp_digit* r, sp_digit* a, sp_digit* m, 08555 sp_digit mp) 08556 { 08557 sp_3072_sqr_24(r, a); 08558 sp_3072_mont_reduce_24(r, m, mp); 08559 } 08560 08561 /* Mul a by digit b into r. (r = a * b) 08562 * 08563 * r A single precision integer. 08564 * a A single precision integer. 08565 * b A single precision digit. 08566 */ 08567 static void sp_3072_mul_d_24(sp_digit* r, const sp_digit* a, 08568 const sp_digit b) 08569 { 08570 #ifdef WOLFSSL_SP_SMALL 08571 __asm__ __volatile__ ( 08572 "# A[0] * B\n\t" 08573 "ldr x8, [%[a]]\n\t" 08574 "mul x5, %[b], x8\n\t" 08575 "umulh x3, %[b], x8\n\t" 08576 "mov x4, 0\n\t" 08577 "str x5, [%[r]]\n\t" 08578 "mov x5, 0\n\t" 08579 "mov x9, #8\n\t" 08580 "1:\n\t" 08581 "ldr x8, [%[a], x9]\n\t" 08582 "mul x6, %[b], x8\n\t" 08583 "umulh x7, %[b], x8\n\t" 08584 "adds x3, x3, x6\n\t" 08585 "adcs x4, x4, x7\n\t" 08586 "adc x5, xzr, xzr\n\t" 08587 "str x3, [%[r], x9]\n\t" 08588 "mov x3, x4\n\t" 08589 "mov x4, x5\n\t" 08590 "mov x5, #0\n\t" 08591 "add x9, x9, #8\n\t" 08592 "cmp x9, 192\n\t" 08593 "b.lt 1b\n\t" 08594 "str x3, [%[r], 192]\n\t" 08595 : 08596 : [r] "r" (r), [a] "r" (a), [b] "r" (b) 08597 : "memory", "x3", "x4", "x5", "x6", "x7", "x8" 08598 ); 08599 #else 08600 __asm__ __volatile__ ( 08601 "# A[0] * B\n\t" 08602 "ldr x8, [%[a]]\n\t" 08603 "mul x3, %[b], x8\n\t" 08604 "umulh x4, %[b], x8\n\t" 08605 "mov x5, 0\n\t" 08606 "str x3, [%[r]]\n\t" 08607 "# A[1] * B\n\t" 08608 "ldr x8, [%[a], 8]\n\t" 08609 "mov x3, 0\n\t" 08610 "mul x6, %[b], x8\n\t" 08611 "umulh x7, %[b], x8\n\t" 08612 "adds x4, x4, x6\n\t" 08613 "adcs x5, x5, x7\n\t" 08614 "adc x3, xzr, xzr\n\t" 08615 "str x4, [%[r], 8]\n\t" 08616 "# A[2] * B\n\t" 08617 "ldr x8, [%[a], 16]\n\t" 08618 "mov x4, 0\n\t" 08619 "mul x6, %[b], x8\n\t" 08620 "umulh x7, %[b], x8\n\t" 08621 "adds x5, x5, x6\n\t" 08622 "adcs x3, x3, x7\n\t" 08623 "adc x4, xzr, xzr\n\t" 08624 "str x5, [%[r], 16]\n\t" 08625 "# A[3] * B\n\t" 08626 "ldr x8, [%[a], 24]\n\t" 08627 "mov x5, 0\n\t" 08628 "mul x6, %[b], x8\n\t" 08629 "umulh x7, %[b], x8\n\t" 08630 "adds x3, x3, x6\n\t" 08631 "adcs x4, x4, x7\n\t" 08632 "adc x5, xzr, xzr\n\t" 08633 "str x3, [%[r], 24]\n\t" 08634 "# A[4] * B\n\t" 08635 "ldr x8, [%[a], 32]\n\t" 08636 "mov x3, 0\n\t" 08637 "mul x6, %[b], x8\n\t" 08638 "umulh x7, %[b], x8\n\t" 08639 "adds x4, x4, x6\n\t" 08640 "adcs x5, x5, x7\n\t" 08641 "adc x3, xzr, xzr\n\t" 08642 "str x4, [%[r], 32]\n\t" 08643 "# A[5] * B\n\t" 08644 "ldr x8, [%[a], 40]\n\t" 08645 "mov x4, 0\n\t" 08646 "mul x6, %[b], x8\n\t" 08647 "umulh x7, %[b], x8\n\t" 08648 "adds x5, x5, x6\n\t" 08649 "adcs x3, x3, x7\n\t" 08650 "adc x4, xzr, xzr\n\t" 08651 "str x5, [%[r], 40]\n\t" 08652 "# A[6] * B\n\t" 08653 "ldr x8, [%[a], 48]\n\t" 08654 "mov x5, 0\n\t" 08655 "mul x6, %[b], x8\n\t" 08656 "umulh x7, %[b], x8\n\t" 08657 "adds x3, x3, x6\n\t" 08658 "adcs x4, x4, x7\n\t" 08659 "adc x5, xzr, xzr\n\t" 08660 "str x3, [%[r], 48]\n\t" 08661 "# A[7] * B\n\t" 08662 "ldr x8, [%[a], 56]\n\t" 08663 "mov x3, 0\n\t" 08664 "mul x6, %[b], x8\n\t" 08665 "umulh x7, %[b], x8\n\t" 08666 "adds x4, x4, x6\n\t" 08667 "adcs x5, x5, x7\n\t" 08668 "adc x3, xzr, xzr\n\t" 08669 "str x4, [%[r], 56]\n\t" 08670 "# A[8] * B\n\t" 08671 "ldr x8, [%[a], 64]\n\t" 08672 "mov x4, 0\n\t" 08673 "mul x6, %[b], x8\n\t" 08674 "umulh x7, %[b], x8\n\t" 08675 "adds x5, x5, x6\n\t" 08676 "adcs x3, x3, x7\n\t" 08677 "adc x4, xzr, xzr\n\t" 08678 "str x5, [%[r], 64]\n\t" 08679 "# A[9] * B\n\t" 08680 "ldr x8, [%[a], 72]\n\t" 08681 "mov x5, 0\n\t" 08682 "mul x6, %[b], x8\n\t" 08683 "umulh x7, %[b], x8\n\t" 08684 "adds x3, x3, x6\n\t" 08685 "adcs x4, x4, x7\n\t" 08686 "adc x5, xzr, xzr\n\t" 08687 "str x3, [%[r], 72]\n\t" 08688 "# A[10] * B\n\t" 08689 "ldr x8, [%[a], 80]\n\t" 08690 "mov x3, 0\n\t" 08691 "mul x6, %[b], x8\n\t" 08692 "umulh x7, %[b], x8\n\t" 08693 "adds x4, x4, x6\n\t" 08694 "adcs x5, x5, x7\n\t" 08695 "adc x3, xzr, xzr\n\t" 08696 "str x4, [%[r], 80]\n\t" 08697 "# A[11] * B\n\t" 08698 "ldr x8, [%[a], 88]\n\t" 08699 "mov x4, 0\n\t" 08700 "mul x6, %[b], x8\n\t" 08701 "umulh x7, %[b], x8\n\t" 08702 "adds x5, x5, x6\n\t" 08703 "adcs x3, x3, x7\n\t" 08704 "adc x4, xzr, xzr\n\t" 08705 "str x5, [%[r], 88]\n\t" 08706 "# A[12] * B\n\t" 08707 "ldr x8, [%[a], 96]\n\t" 08708 "mov x5, 0\n\t" 08709 "mul x6, %[b], x8\n\t" 08710 "umulh x7, %[b], x8\n\t" 08711 "adds x3, x3, x6\n\t" 08712 "adcs x4, x4, x7\n\t" 08713 "adc x5, xzr, xzr\n\t" 08714 "str x3, [%[r], 96]\n\t" 08715 "# A[13] * B\n\t" 08716 "ldr x8, [%[a], 104]\n\t" 08717 "mov x3, 0\n\t" 08718 "mul x6, %[b], x8\n\t" 08719 "umulh x7, %[b], x8\n\t" 08720 "adds x4, x4, x6\n\t" 08721 "adcs x5, x5, x7\n\t" 08722 "adc x3, xzr, xzr\n\t" 08723 "str x4, [%[r], 104]\n\t" 08724 "# A[14] * B\n\t" 08725 "ldr x8, [%[a], 112]\n\t" 08726 "mov x4, 0\n\t" 08727 "mul x6, %[b], x8\n\t" 08728 "umulh x7, %[b], x8\n\t" 08729 "adds x5, x5, x6\n\t" 08730 "adcs x3, x3, x7\n\t" 08731 "adc x4, xzr, xzr\n\t" 08732 "str x5, [%[r], 112]\n\t" 08733 "# A[15] * B\n\t" 08734 "ldr x8, [%[a], 120]\n\t" 08735 "mov x5, 0\n\t" 08736 "mul x6, %[b], x8\n\t" 08737 "umulh x7, %[b], x8\n\t" 08738 "adds x3, x3, x6\n\t" 08739 "adcs x4, x4, x7\n\t" 08740 "adc x5, xzr, xzr\n\t" 08741 "str x3, [%[r], 120]\n\t" 08742 "# A[16] * B\n\t" 08743 "ldr x8, [%[a], 128]\n\t" 08744 "mov x3, 0\n\t" 08745 "mul x6, %[b], x8\n\t" 08746 "umulh x7, %[b], x8\n\t" 08747 "adds x4, x4, x6\n\t" 08748 "adcs x5, x5, x7\n\t" 08749 "adc x3, xzr, xzr\n\t" 08750 "str x4, [%[r], 128]\n\t" 08751 "# A[17] * B\n\t" 08752 "ldr x8, [%[a], 136]\n\t" 08753 "mov x4, 0\n\t" 08754 "mul x6, %[b], x8\n\t" 08755 "umulh x7, %[b], x8\n\t" 08756 "adds x5, x5, x6\n\t" 08757 "adcs x3, x3, x7\n\t" 08758 "adc x4, xzr, xzr\n\t" 08759 "str x5, [%[r], 136]\n\t" 08760 "# A[18] * B\n\t" 08761 "ldr x8, [%[a], 144]\n\t" 08762 "mov x5, 0\n\t" 08763 "mul x6, %[b], x8\n\t" 08764 "umulh x7, %[b], x8\n\t" 08765 "adds x3, x3, x6\n\t" 08766 "adcs x4, x4, x7\n\t" 08767 "adc x5, xzr, xzr\n\t" 08768 "str x3, [%[r], 144]\n\t" 08769 "# A[19] * B\n\t" 08770 "ldr x8, [%[a], 152]\n\t" 08771 "mov x3, 0\n\t" 08772 "mul x6, %[b], x8\n\t" 08773 "umulh x7, %[b], x8\n\t" 08774 "adds x4, x4, x6\n\t" 08775 "adcs x5, x5, x7\n\t" 08776 "adc x3, xzr, xzr\n\t" 08777 "str x4, [%[r], 152]\n\t" 08778 "# A[20] * B\n\t" 08779 "ldr x8, [%[a], 160]\n\t" 08780 "mov x4, 0\n\t" 08781 "mul x6, %[b], x8\n\t" 08782 "umulh x7, %[b], x8\n\t" 08783 "adds x5, x5, x6\n\t" 08784 "adcs x3, x3, x7\n\t" 08785 "adc x4, xzr, xzr\n\t" 08786 "str x5, [%[r], 160]\n\t" 08787 "# A[21] * B\n\t" 08788 "ldr x8, [%[a], 168]\n\t" 08789 "mov x5, 0\n\t" 08790 "mul x6, %[b], x8\n\t" 08791 "umulh x7, %[b], x8\n\t" 08792 "adds x3, x3, x6\n\t" 08793 "adcs x4, x4, x7\n\t" 08794 "adc x5, xzr, xzr\n\t" 08795 "str x3, [%[r], 168]\n\t" 08796 "# A[22] * B\n\t" 08797 "ldr x8, [%[a], 176]\n\t" 08798 "mov x3, 0\n\t" 08799 "mul x6, %[b], x8\n\t" 08800 "umulh x7, %[b], x8\n\t" 08801 "adds x4, x4, x6\n\t" 08802 "adcs x5, x5, x7\n\t" 08803 "adc x3, xzr, xzr\n\t" 08804 "str x4, [%[r], 176]\n\t" 08805 "# A[23] * B\n\t" 08806 "ldr x8, [%[a], 184]\n\t" 08807 "mul x6, %[b], x8\n\t" 08808 "umulh x7, %[b], x8\n\t" 08809 "adds x5, x5, x6\n\t" 08810 "adc x3, x3, x7\n\t" 08811 "str x5, [%[r], 184]\n\t" 08812 "str x3, [%[r], 192]\n\t" 08813 : 08814 : [r] "r" (r), [a] "r" (a), [b] "r" (b) 08815 : "memory", "x3", "x4", "x5", "x6", "x7", "x8" 08816 ); 08817 #endif 08818 } 08819 08820 /* Divide the double width number (d1|d0) by the dividend. (d1|d0 / div) 08821 * 08822 * d1 The high order half of the number to divide. 08823 * d0 The low order half of the number to divide. 08824 * div The dividend. 08825 * returns the result of the division. 08826 */ 08827 static sp_digit div_3072_word_24(sp_digit d1, sp_digit d0, sp_digit div) 08828 { 08829 sp_digit r; 08830 08831 __asm__ __volatile__ ( 08832 "lsr x5, %[div], 32\n\t" 08833 "add x5, x5, 1\n\t" 08834 08835 "udiv x3, %[d1], x5\n\t" 08836 "lsl x6, x3, 32\n\t" 08837 "mul x4, %[div], x6\n\t" 08838 "umulh x3, %[div], x6\n\t" 08839 "subs %[d0], %[d0], x4\n\t" 08840 "sbc %[d1], %[d1], x3\n\t" 08841 08842 "udiv x3, %[d1], x5\n\t" 08843 "lsl x3, x3, 32\n\t" 08844 "add x6, x6, x3\n\t" 08845 "mul x4, %[div], x3\n\t" 08846 "umulh x3, %[div], x3\n\t" 08847 "subs %[d0], %[d0], x4\n\t" 08848 "sbc %[d1], %[d1], x3\n\t" 08849 08850 "lsl x3, %[d1], 32\n\t" 08851 "orr x3, x3, %[d0], lsr 32\n\t" 08852 08853 "udiv x3, x3, x5\n\t" 08854 "add x6, x6, x3\n\t" 08855 "mul x4, %[div], x3\n\t" 08856 "umulh x3, %[div], x3\n\t" 08857 "subs %[d0], %[d0], x4\n\t" 08858 "sbc %[d1], %[d1], x3\n\t" 08859 08860 "lsl x3, %[d1], 32\n\t" 08861 "orr x3, x3, %[d0], lsr 32\n\t" 08862 08863 "udiv x3, x3, x5\n\t" 08864 "add x6, x6, x3\n\t" 08865 "mul x4, %[div], x3\n\t" 08866 "umulh x3, %[div], x3\n\t" 08867 "subs %[d0], %[d0], x4\n\t" 08868 "sbc %[d1], %[d1], x3\n\t" 08869 08870 "udiv x3, %[d0], %[div]\n\t" 08871 "add x6, x6, x3\n\t" 08872 "mul x3, %[div], x3\n\t" 08873 "sub %[d0], %[d0], x3\n\t" 08874 "mov %[r], x6\n\t" 08875 08876 : [r] "=r" (r) 08877 : [d1] "r" (d1), [d0] "r" (d0), [div] "r" (div) 08878 : "x3", "x4", "x5", "x6" 08879 ); 08880 08881 return r; 08882 } 08883 08884 /* Compare a with b in constant time. 08885 * 08886 * a A single precision integer. 08887 * b A single precision integer. 08888 * return -ve, 0 or +ve if a is less than, equal to or greater than b 08889 * respectively. 08890 */ 08891 static int64_t sp_3072_cmp_24(sp_digit* a, sp_digit* b) 08892 { 08893 sp_digit r = -1; 08894 sp_digit one = 1; 08895 08896 #ifdef WOLFSSL_SP_SMALL 08897 __asm__ __volatile__ ( 08898 "mov x3, -1\n\t" 08899 "mov x6, 184\n\t" 08900 "1:\n\t" 08901 "ldr x4, [%[a], x6]\n\t" 08902 "ldr x5, [%[b], x6]\n\t" 08903 "and x4, x4, x3\n\t" 08904 "and x5, x5, x3\n\t" 08905 "subs x4, x4, x5\n\t" 08906 "csel %[r], %[one], %[r], hi\n\t" 08907 "csel %[r], x3, %[r], lo\n\t" 08908 "csel x3, x3, xzr, eq\n\t" 08909 "sub x6, x6, #8\n\t" 08910 "b.cc 1b\n\t" 08911 "eor %[r], %[r], x3\n\t" 08912 : [r] "+r" (r) 08913 : [a] "r" (a), [b] "r" (b), [one] "r" (one) 08914 : "x2", "x3", "x4", "x5", "x6" 08915 ); 08916 #else 08917 __asm__ __volatile__ ( 08918 "mov x3, -1\n\t" 08919 "ldr x4, [%[a], 184]\n\t" 08920 "ldr x5, [%[b], 184]\n\t" 08921 "and x4, x4, x3\n\t" 08922 "and x5, x5, x3\n\t" 08923 "subs x4, x4, x5\n\t" 08924 "csel %[r], %[one], %[r], hi\n\t" 08925 "csel %[r], x3, %[r], lo\n\t" 08926 "csel x3, x3, xzr, eq\n\t" 08927 "ldr x4, [%[a], 176]\n\t" 08928 "ldr x5, [%[b], 176]\n\t" 08929 "and x4, x4, x3\n\t" 08930 "and x5, x5, x3\n\t" 08931 "subs x4, x4, x5\n\t" 08932 "csel %[r], %[one], %[r], hi\n\t" 08933 "csel %[r], x3, %[r], lo\n\t" 08934 "csel x3, x3, xzr, eq\n\t" 08935 "ldr x4, [%[a], 168]\n\t" 08936 "ldr x5, [%[b], 168]\n\t" 08937 "and x4, x4, x3\n\t" 08938 "and x5, x5, x3\n\t" 08939 "subs x4, x4, x5\n\t" 08940 "csel %[r], %[one], %[r], hi\n\t" 08941 "csel %[r], x3, %[r], lo\n\t" 08942 "csel x3, x3, xzr, eq\n\t" 08943 "ldr x4, [%[a], 160]\n\t" 08944 "ldr x5, [%[b], 160]\n\t" 08945 "and x4, x4, x3\n\t" 08946 "and x5, x5, x3\n\t" 08947 "subs x4, x4, x5\n\t" 08948 "csel %[r], %[one], %[r], hi\n\t" 08949 "csel %[r], x3, %[r], lo\n\t" 08950 "csel x3, x3, xzr, eq\n\t" 08951 "ldr x4, [%[a], 152]\n\t" 08952 "ldr x5, [%[b], 152]\n\t" 08953 "and x4, x4, x3\n\t" 08954 "and x5, x5, x3\n\t" 08955 "subs x4, x4, x5\n\t" 08956 "csel %[r], %[one], %[r], hi\n\t" 08957 "csel %[r], x3, %[r], lo\n\t" 08958 "csel x3, x3, xzr, eq\n\t" 08959 "ldr x4, [%[a], 144]\n\t" 08960 "ldr x5, [%[b], 144]\n\t" 08961 "and x4, x4, x3\n\t" 08962 "and x5, x5, x3\n\t" 08963 "subs x4, x4, x5\n\t" 08964 "csel %[r], %[one], %[r], hi\n\t" 08965 "csel %[r], x3, %[r], lo\n\t" 08966 "csel x3, x3, xzr, eq\n\t" 08967 "ldr x4, [%[a], 136]\n\t" 08968 "ldr x5, [%[b], 136]\n\t" 08969 "and x4, x4, x3\n\t" 08970 "and x5, x5, x3\n\t" 08971 "subs x4, x4, x5\n\t" 08972 "csel %[r], %[one], %[r], hi\n\t" 08973 "csel %[r], x3, %[r], lo\n\t" 08974 "csel x3, x3, xzr, eq\n\t" 08975 "ldr x4, [%[a], 128]\n\t" 08976 "ldr x5, [%[b], 128]\n\t" 08977 "and x4, x4, x3\n\t" 08978 "and x5, x5, x3\n\t" 08979 "subs x4, x4, x5\n\t" 08980 "csel %[r], %[one], %[r], hi\n\t" 08981 "csel %[r], x3, %[r], lo\n\t" 08982 "csel x3, x3, xzr, eq\n\t" 08983 "ldr x4, [%[a], 120]\n\t" 08984 "ldr x5, [%[b], 120]\n\t" 08985 "and x4, x4, x3\n\t" 08986 "and x5, x5, x3\n\t" 08987 "subs x4, x4, x5\n\t" 08988 "csel %[r], %[one], %[r], hi\n\t" 08989 "csel %[r], x3, %[r], lo\n\t" 08990 "csel x3, x3, xzr, eq\n\t" 08991 "ldr x4, [%[a], 112]\n\t" 08992 "ldr x5, [%[b], 112]\n\t" 08993 "and x4, x4, x3\n\t" 08994 "and x5, x5, x3\n\t" 08995 "subs x4, x4, x5\n\t" 08996 "csel %[r], %[one], %[r], hi\n\t" 08997 "csel %[r], x3, %[r], lo\n\t" 08998 "csel x3, x3, xzr, eq\n\t" 08999 "ldr x4, [%[a], 104]\n\t" 09000 "ldr x5, [%[b], 104]\n\t" 09001 "and x4, x4, x3\n\t" 09002 "and x5, x5, x3\n\t" 09003 "subs x4, x4, x5\n\t" 09004 "csel %[r], %[one], %[r], hi\n\t" 09005 "csel %[r], x3, %[r], lo\n\t" 09006 "csel x3, x3, xzr, eq\n\t" 09007 "ldr x4, [%[a], 96]\n\t" 09008 "ldr x5, [%[b], 96]\n\t" 09009 "and x4, x4, x3\n\t" 09010 "and x5, x5, x3\n\t" 09011 "subs x4, x4, x5\n\t" 09012 "csel %[r], %[one], %[r], hi\n\t" 09013 "csel %[r], x3, %[r], lo\n\t" 09014 "csel x3, x3, xzr, eq\n\t" 09015 "ldr x4, [%[a], 88]\n\t" 09016 "ldr x5, [%[b], 88]\n\t" 09017 "and x4, x4, x3\n\t" 09018 "and x5, x5, x3\n\t" 09019 "subs x4, x4, x5\n\t" 09020 "csel %[r], %[one], %[r], hi\n\t" 09021 "csel %[r], x3, %[r], lo\n\t" 09022 "csel x3, x3, xzr, eq\n\t" 09023 "ldr x4, [%[a], 80]\n\t" 09024 "ldr x5, [%[b], 80]\n\t" 09025 "and x4, x4, x3\n\t" 09026 "and x5, x5, x3\n\t" 09027 "subs x4, x4, x5\n\t" 09028 "csel %[r], %[one], %[r], hi\n\t" 09029 "csel %[r], x3, %[r], lo\n\t" 09030 "csel x3, x3, xzr, eq\n\t" 09031 "ldr x4, [%[a], 72]\n\t" 09032 "ldr x5, [%[b], 72]\n\t" 09033 "and x4, x4, x3\n\t" 09034 "and x5, x5, x3\n\t" 09035 "subs x4, x4, x5\n\t" 09036 "csel %[r], %[one], %[r], hi\n\t" 09037 "csel %[r], x3, %[r], lo\n\t" 09038 "csel x3, x3, xzr, eq\n\t" 09039 "ldr x4, [%[a], 64]\n\t" 09040 "ldr x5, [%[b], 64]\n\t" 09041 "and x4, x4, x3\n\t" 09042 "and x5, x5, x3\n\t" 09043 "subs x4, x4, x5\n\t" 09044 "csel %[r], %[one], %[r], hi\n\t" 09045 "csel %[r], x3, %[r], lo\n\t" 09046 "csel x3, x3, xzr, eq\n\t" 09047 "ldr x4, [%[a], 56]\n\t" 09048 "ldr x5, [%[b], 56]\n\t" 09049 "and x4, x4, x3\n\t" 09050 "and x5, x5, x3\n\t" 09051 "subs x4, x4, x5\n\t" 09052 "csel %[r], %[one], %[r], hi\n\t" 09053 "csel %[r], x3, %[r], lo\n\t" 09054 "csel x3, x3, xzr, eq\n\t" 09055 "ldr x4, [%[a], 48]\n\t" 09056 "ldr x5, [%[b], 48]\n\t" 09057 "and x4, x4, x3\n\t" 09058 "and x5, x5, x3\n\t" 09059 "subs x4, x4, x5\n\t" 09060 "csel %[r], %[one], %[r], hi\n\t" 09061 "csel %[r], x3, %[r], lo\n\t" 09062 "csel x3, x3, xzr, eq\n\t" 09063 "ldr x4, [%[a], 40]\n\t" 09064 "ldr x5, [%[b], 40]\n\t" 09065 "and x4, x4, x3\n\t" 09066 "and x5, x5, x3\n\t" 09067 "subs x4, x4, x5\n\t" 09068 "csel %[r], %[one], %[r], hi\n\t" 09069 "csel %[r], x3, %[r], lo\n\t" 09070 "csel x3, x3, xzr, eq\n\t" 09071 "ldr x4, [%[a], 32]\n\t" 09072 "ldr x5, [%[b], 32]\n\t" 09073 "and x4, x4, x3\n\t" 09074 "and x5, x5, x3\n\t" 09075 "subs x4, x4, x5\n\t" 09076 "csel %[r], %[one], %[r], hi\n\t" 09077 "csel %[r], x3, %[r], lo\n\t" 09078 "csel x3, x3, xzr, eq\n\t" 09079 "ldr x4, [%[a], 24]\n\t" 09080 "ldr x5, [%[b], 24]\n\t" 09081 "and x4, x4, x3\n\t" 09082 "and x5, x5, x3\n\t" 09083 "subs x4, x4, x5\n\t" 09084 "csel %[r], %[one], %[r], hi\n\t" 09085 "csel %[r], x3, %[r], lo\n\t" 09086 "csel x3, x3, xzr, eq\n\t" 09087 "ldr x4, [%[a], 16]\n\t" 09088 "ldr x5, [%[b], 16]\n\t" 09089 "and x4, x4, x3\n\t" 09090 "and x5, x5, x3\n\t" 09091 "subs x4, x4, x5\n\t" 09092 "csel %[r], %[one], %[r], hi\n\t" 09093 "csel %[r], x3, %[r], lo\n\t" 09094 "csel x3, x3, xzr, eq\n\t" 09095 "ldr x4, [%[a], 8]\n\t" 09096 "ldr x5, [%[b], 8]\n\t" 09097 "and x4, x4, x3\n\t" 09098 "and x5, x5, x3\n\t" 09099 "subs x4, x4, x5\n\t" 09100 "csel %[r], %[one], %[r], hi\n\t" 09101 "csel %[r], x3, %[r], lo\n\t" 09102 "csel x3, x3, xzr, eq\n\t" 09103 "ldr x4, [%[a], 0]\n\t" 09104 "ldr x5, [%[b], 0]\n\t" 09105 "and x4, x4, x3\n\t" 09106 "and x5, x5, x3\n\t" 09107 "subs x4, x4, x5\n\t" 09108 "csel %[r], %[one], %[r], hi\n\t" 09109 "csel %[r], x3, %[r], lo\n\t" 09110 "csel x3, x3, xzr, eq\n\t" 09111 "eor %[r], %[r], x3\n\t" 09112 : [r] "+r" (r) 09113 : [a] "r" (a), [b] "r" (b), [one] "r" (one) 09114 : "x2", "x3", "x4", "x5", "x6" 09115 ); 09116 #endif 09117 09118 return r; 09119 } 09120 09121 /* Divide d in a and put remainder into r (m*d + r = a) 09122 * m is not calculated as it is not needed at this time. 09123 * 09124 * a Nmber to be divided. 09125 * d Number to divide with. 09126 * m Multiplier result. 09127 * r Remainder from the division. 09128 * returns MP_OKAY indicating success. 09129 */ 09130 static WC_INLINE int sp_3072_div_24(sp_digit* a, sp_digit* d, sp_digit* m, 09131 sp_digit* r) 09132 { 09133 sp_digit t1[48], t2[25]; 09134 sp_digit div, r1; 09135 int i; 09136 09137 (void)m; 09138 09139 div = d[23]; 09140 XMEMCPY(t1, a, sizeof(*t1) * 2 * 24); 09141 for (i=23; i>=0; i--) { 09142 r1 = div_3072_word_24(t1[24 + i], t1[24 + i - 1], div); 09143 09144 sp_3072_mul_d_24(t2, d, r1); 09145 t1[24 + i] += sp_3072_sub_in_place_24(&t1[i], t2); 09146 t1[24 + i] -= t2[24]; 09147 sp_3072_mask_24(t2, d, t1[24 + i]); 09148 t1[24 + i] += sp_3072_add_24(&t1[i], &t1[i], t2); 09149 sp_3072_mask_24(t2, d, t1[24 + i]); 09150 t1[24 + i] += sp_3072_add_24(&t1[i], &t1[i], t2); 09151 } 09152 09153 r1 = sp_3072_cmp_24(t1, d) >= 0; 09154 sp_3072_cond_sub_24(r, t1, t2, (sp_digit)0 - r1); 09155 09156 return MP_OKAY; 09157 } 09158 09159 /* Reduce a modulo m into r. (r = a mod m) 09160 * 09161 * r A single precision number that is the reduced result. 09162 * a A single precision number that is to be reduced. 09163 * m A single precision number that is the modulus to reduce with. 09164 * returns MP_OKAY indicating success. 09165 */ 09166 static WC_INLINE int sp_3072_mod_24(sp_digit* r, sp_digit* a, sp_digit* m) 09167 { 09168 return sp_3072_div_24(a, m, NULL, r); 09169 } 09170 09171 #ifdef WOLFSSL_SP_SMALL 09172 /* Modular exponentiate a to the e mod m. (r = a^e mod m) 09173 * 09174 * r A single precision number that is the result of the operation. 09175 * a A single precision number being exponentiated. 09176 * e A single precision number that is the exponent. 09177 * bits The number of bits in the exponent. 09178 * m A single precision number that is the modulus. 09179 * returns 0 on success and MEMORY_E on dynamic memory allocation failure. 09180 */ 09181 static int sp_3072_mod_exp_24(sp_digit* r, sp_digit* a, sp_digit* e, 09182 int bits, sp_digit* m, int reduceA) 09183 { 09184 #ifndef WOLFSSL_SMALL_STACK 09185 sp_digit t[16][48]; 09186 #else 09187 sp_digit* t[16]; 09188 sp_digit* td; 09189 #endif 09190 sp_digit* norm; 09191 sp_digit mp = 1; 09192 sp_digit n; 09193 sp_digit mask; 09194 int i; 09195 int c, y; 09196 int err = MP_OKAY; 09197 09198 #ifdef WOLFSSL_SMALL_STACK 09199 td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 16 * 48, NULL, 09200 DYNAMIC_TYPE_TMP_BUFFER); 09201 if (td == NULL) 09202 err = MEMORY_E; 09203 09204 if (err == MP_OKAY) { 09205 for (i=0; i<16; i++) 09206 t[i] = td + i * 48; 09207 norm = t[0]; 09208 } 09209 #else 09210 norm = t[0]; 09211 #endif 09212 09213 if (err == MP_OKAY) { 09214 sp_3072_mont_setup(m, &mp); 09215 sp_3072_mont_norm_24(norm, m); 09216 09217 XMEMSET(t[1], 0, sizeof(sp_digit) * 24); 09218 if (reduceA) { 09219 err = sp_3072_mod_24(t[1] + 24, a, m); 09220 if (err == MP_OKAY) 09221 err = sp_3072_mod_24(t[1], t[1], m); 09222 } 09223 else { 09224 XMEMCPY(t[1] + 24, a, sizeof(sp_digit) * 24); 09225 err = sp_3072_mod_24(t[1], t[1], m); 09226 } 09227 } 09228 09229 if (err == MP_OKAY) { 09230 sp_3072_mont_sqr_24(t[ 2], t[ 1], m, mp); 09231 sp_3072_mont_mul_24(t[ 3], t[ 2], t[ 1], m, mp); 09232 sp_3072_mont_sqr_24(t[ 4], t[ 2], m, mp); 09233 sp_3072_mont_mul_24(t[ 5], t[ 3], t[ 2], m, mp); 09234 sp_3072_mont_sqr_24(t[ 6], t[ 3], m, mp); 09235 sp_3072_mont_mul_24(t[ 7], t[ 4], t[ 3], m, mp); 09236 sp_3072_mont_sqr_24(t[ 8], t[ 4], m, mp); 09237 sp_3072_mont_mul_24(t[ 9], t[ 5], t[ 4], m, mp); 09238 sp_3072_mont_sqr_24(t[10], t[ 5], m, mp); 09239 sp_3072_mont_mul_24(t[11], t[ 6], t[ 5], m, mp); 09240 sp_3072_mont_sqr_24(t[12], t[ 6], m, mp); 09241 sp_3072_mont_mul_24(t[13], t[ 7], t[ 6], m, mp); 09242 sp_3072_mont_sqr_24(t[14], t[ 7], m, mp); 09243 sp_3072_mont_mul_24(t[15], t[ 8], t[ 7], m, mp); 09244 09245 i = (bits - 1) / 64; 09246 n = e[i--]; 09247 y = n >> 60; 09248 n <<= 4; 09249 c = 60; 09250 XMEMCPY(r, t[y], sizeof(sp_digit) * 24); 09251 for (; i>=0 || c>=4; ) { 09252 if (c == 0) { 09253 n = e[i--]; 09254 y = n >> 60; 09255 n <<= 4; 09256 c = 60; 09257 } 09258 else if (c < 4) { 09259 y = n >> 60; 09260 n = e[i--]; 09261 c = 4 - c; 09262 y |= n >> (64 - c); 09263 n <<= c; 09264 c = 64 - c; 09265 } 09266 else { 09267 y = (n >> 60) & 0xf; 09268 n <<= 4; 09269 c -= 4; 09270 } 09271 09272 sp_3072_mont_sqr_24(r, r, m, mp); 09273 sp_3072_mont_sqr_24(r, r, m, mp); 09274 sp_3072_mont_sqr_24(r, r, m, mp); 09275 sp_3072_mont_sqr_24(r, r, m, mp); 09276 09277 sp_3072_mont_mul_24(r, r, t[y], m, mp); 09278 } 09279 09280 XMEMSET(&r[24], 0, sizeof(sp_digit) * 24); 09281 sp_3072_mont_reduce_24(r, m, mp); 09282 09283 mask = 0 - (sp_3072_cmp_24(r, m) >= 0); 09284 sp_3072_cond_sub_24(r, r, m, mask); 09285 } 09286 09287 #ifdef WOLFSSL_SMALL_STACK 09288 if (td != NULL) 09289 XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); 09290 #endif 09291 09292 return err; 09293 } 09294 #else 09295 /* Modular exponentiate a to the e mod m. (r = a^e mod m) 09296 * 09297 * r A single precision number that is the result of the operation. 09298 * a A single precision number being exponentiated. 09299 * e A single precision number that is the exponent. 09300 * bits The number of bits in the exponent. 09301 * m A single precision number that is the modulus. 09302 * returns 0 on success and MEMORY_E on dynamic memory allocation failure. 09303 */ 09304 static int sp_3072_mod_exp_24(sp_digit* r, sp_digit* a, sp_digit* e, 09305 int bits, sp_digit* m, int reduceA) 09306 { 09307 #ifndef WOLFSSL_SMALL_STACK 09308 sp_digit t[32][48]; 09309 #else 09310 sp_digit* t[32]; 09311 sp_digit* td; 09312 #endif 09313 sp_digit* norm; 09314 sp_digit mp = 1; 09315 sp_digit n; 09316 sp_digit mask; 09317 int i; 09318 int c, y; 09319 int err = MP_OKAY; 09320 09321 #ifdef WOLFSSL_SMALL_STACK 09322 td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32 * 48, NULL, 09323 DYNAMIC_TYPE_TMP_BUFFER); 09324 if (td == NULL) 09325 err = MEMORY_E; 09326 09327 if (err == MP_OKAY) { 09328 for (i=0; i<32; i++) 09329 t[i] = td + i * 48; 09330 norm = t[0]; 09331 } 09332 #else 09333 norm = t[0]; 09334 #endif 09335 09336 if (err == MP_OKAY) { 09337 sp_3072_mont_setup(m, &mp); 09338 sp_3072_mont_norm_24(norm, m); 09339 09340 XMEMSET(t[1], 0, sizeof(sp_digit) * 24); 09341 if (reduceA) { 09342 err = sp_3072_mod_24(t[1] + 24, a, m); 09343 if (err == MP_OKAY) 09344 err = sp_3072_mod_24(t[1], t[1], m); 09345 } 09346 else { 09347 XMEMCPY(t[1] + 24, a, sizeof(sp_digit) * 24); 09348 err = sp_3072_mod_24(t[1], t[1], m); 09349 } 09350 } 09351 09352 if (err == MP_OKAY) { 09353 sp_3072_mont_sqr_24(t[ 2], t[ 1], m, mp); 09354 sp_3072_mont_mul_24(t[ 3], t[ 2], t[ 1], m, mp); 09355 sp_3072_mont_sqr_24(t[ 4], t[ 2], m, mp); 09356 sp_3072_mont_mul_24(t[ 5], t[ 3], t[ 2], m, mp); 09357 sp_3072_mont_sqr_24(t[ 6], t[ 3], m, mp); 09358 sp_3072_mont_mul_24(t[ 7], t[ 4], t[ 3], m, mp); 09359 sp_3072_mont_sqr_24(t[ 8], t[ 4], m, mp); 09360 sp_3072_mont_mul_24(t[ 9], t[ 5], t[ 4], m, mp); 09361 sp_3072_mont_sqr_24(t[10], t[ 5], m, mp); 09362 sp_3072_mont_mul_24(t[11], t[ 6], t[ 5], m, mp); 09363 sp_3072_mont_sqr_24(t[12], t[ 6], m, mp); 09364 sp_3072_mont_mul_24(t[13], t[ 7], t[ 6], m, mp); 09365 sp_3072_mont_sqr_24(t[14], t[ 7], m, mp); 09366 sp_3072_mont_mul_24(t[15], t[ 8], t[ 7], m, mp); 09367 sp_3072_mont_sqr_24(t[16], t[ 8], m, mp); 09368 sp_3072_mont_mul_24(t[17], t[ 9], t[ 8], m, mp); 09369 sp_3072_mont_sqr_24(t[18], t[ 9], m, mp); 09370 sp_3072_mont_mul_24(t[19], t[10], t[ 9], m, mp); 09371 sp_3072_mont_sqr_24(t[20], t[10], m, mp); 09372 sp_3072_mont_mul_24(t[21], t[11], t[10], m, mp); 09373 sp_3072_mont_sqr_24(t[22], t[11], m, mp); 09374 sp_3072_mont_mul_24(t[23], t[12], t[11], m, mp); 09375 sp_3072_mont_sqr_24(t[24], t[12], m, mp); 09376 sp_3072_mont_mul_24(t[25], t[13], t[12], m, mp); 09377 sp_3072_mont_sqr_24(t[26], t[13], m, mp); 09378 sp_3072_mont_mul_24(t[27], t[14], t[13], m, mp); 09379 sp_3072_mont_sqr_24(t[28], t[14], m, mp); 09380 sp_3072_mont_mul_24(t[29], t[15], t[14], m, mp); 09381 sp_3072_mont_sqr_24(t[30], t[15], m, mp); 09382 sp_3072_mont_mul_24(t[31], t[16], t[15], m, mp); 09383 09384 i = (bits - 1) / 64; 09385 n = e[i--]; 09386 y = n >> 59; 09387 n <<= 5; 09388 c = 59; 09389 XMEMCPY(r, t[y], sizeof(sp_digit) * 24); 09390 for (; i>=0 || c>=5; ) { 09391 if (c == 0) { 09392 n = e[i--]; 09393 y = n >> 59; 09394 n <<= 5; 09395 c = 59; 09396 } 09397 else if (c < 5) { 09398 y = n >> 59; 09399 n = e[i--]; 09400 c = 5 - c; 09401 y |= n >> (64 - c); 09402 n <<= c; 09403 c = 64 - c; 09404 } 09405 else { 09406 y = (n >> 59) & 0x1f; 09407 n <<= 5; 09408 c -= 5; 09409 } 09410 09411 sp_3072_mont_sqr_24(r, r, m, mp); 09412 sp_3072_mont_sqr_24(r, r, m, mp); 09413 sp_3072_mont_sqr_24(r, r, m, mp); 09414 sp_3072_mont_sqr_24(r, r, m, mp); 09415 sp_3072_mont_sqr_24(r, r, m, mp); 09416 09417 sp_3072_mont_mul_24(r, r, t[y], m, mp); 09418 } 09419 y = e[0] & 0x1; 09420 sp_3072_mont_sqr_24(r, r, m, mp); 09421 sp_3072_mont_mul_24(r, r, t[y], m, mp); 09422 09423 XMEMSET(&r[24], 0, sizeof(sp_digit) * 24); 09424 sp_3072_mont_reduce_24(r, m, mp); 09425 09426 mask = 0 - (sp_3072_cmp_24(r, m) >= 0); 09427 sp_3072_cond_sub_24(r, r, m, mask); 09428 } 09429 09430 #ifdef WOLFSSL_SMALL_STACK 09431 if (td != NULL) 09432 XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); 09433 #endif 09434 09435 return err; 09436 } 09437 #endif /* WOLFSSL_SP_SMALL */ 09438 09439 #endif /* !SP_RSA_PRIVATE_EXP_D && WOLFSSL_HAVE_SP_RSA */ 09440 09441 /* r = 2^n mod m where n is the number of bits to reduce by. 09442 * Given m must be 3072 bits, just need to subtract. 09443 * 09444 * r A single precision number. 09445 * m A signle precision number. 09446 */ 09447 static void sp_3072_mont_norm_48(sp_digit* r, sp_digit* m) 09448 { 09449 XMEMSET(r, 0, sizeof(sp_digit) * 48); 09450 09451 /* r = 2^n mod m */ 09452 sp_3072_sub_in_place_48(r, m); 09453 } 09454 09455 /* Conditionally subtract b from a using the mask m. 09456 * m is -1 to subtract and 0 when not copying. 09457 * 09458 * r A single precision number representing condition subtract result. 09459 * a A single precision number to subtract from. 09460 * b A single precision number to subtract. 09461 * m Mask value to apply. 09462 */ 09463 static sp_digit sp_3072_cond_sub_48(sp_digit* r, sp_digit* a, sp_digit* b, 09464 sp_digit m) 09465 { 09466 sp_digit c = 0; 09467 09468 #ifdef WOLFSSL_SP_SMALL 09469 __asm__ __volatile__ ( 09470 "mov x8, #0\n\t" 09471 "1:\n\t" 09472 "subs %[c], xzr, %[c]\n\t" 09473 "ldr x4, [%[a], x8]\n\t" 09474 "ldr x5, [%[b], x8]\n\t" 09475 "and x5, x5, %[m]\n\t" 09476 "sbcs x4, x4, x5\n\t" 09477 "csetm %[c], cc\n\t" 09478 "str x4, [%[r], x8]\n\t" 09479 "add x8, x8, #8\n\t" 09480 "cmp x8, 384\n\t" 09481 "b.lt 1b\n\t" 09482 : [c] "+r" (c) 09483 : [r] "r" (r), [a] "r" (a), [b] "r" (b), [m] "r" (m) 09484 : "memory", "x4", "x6", "x5", "x7", "x8" 09485 ); 09486 #else 09487 __asm__ __volatile__ ( 09488 09489 "ldr x4, [%[a], 0]\n\t" 09490 "ldr x6, [%[a], 8]\n\t" 09491 "ldr x5, [%[b], 0]\n\t" 09492 "ldr x7, [%[b], 8]\n\t" 09493 "and x5, x5, %[m]\n\t" 09494 "and x7, x7, %[m]\n\t" 09495 "subs x4, x4, x5\n\t" 09496 "sbcs x6, x6, x7\n\t" 09497 "str x4, [%[r], 0]\n\t" 09498 "str x6, [%[r], 8]\n\t" 09499 "ldr x4, [%[a], 16]\n\t" 09500 "ldr x6, [%[a], 24]\n\t" 09501 "ldr x5, [%[b], 16]\n\t" 09502 "ldr x7, [%[b], 24]\n\t" 09503 "and x5, x5, %[m]\n\t" 09504 "and x7, x7, %[m]\n\t" 09505 "sbcs x4, x4, x5\n\t" 09506 "sbcs x6, x6, x7\n\t" 09507 "str x4, [%[r], 16]\n\t" 09508 "str x6, [%[r], 24]\n\t" 09509 "ldr x4, [%[a], 32]\n\t" 09510 "ldr x6, [%[a], 40]\n\t" 09511 "ldr x5, [%[b], 32]\n\t" 09512 "ldr x7, [%[b], 40]\n\t" 09513 "and x5, x5, %[m]\n\t" 09514 "and x7, x7, %[m]\n\t" 09515 "sbcs x4, x4, x5\n\t" 09516 "sbcs x6, x6, x7\n\t" 09517 "str x4, [%[r], 32]\n\t" 09518 "str x6, [%[r], 40]\n\t" 09519 "ldr x4, [%[a], 48]\n\t" 09520 "ldr x6, [%[a], 56]\n\t" 09521 "ldr x5, [%[b], 48]\n\t" 09522 "ldr x7, [%[b], 56]\n\t" 09523 "and x5, x5, %[m]\n\t" 09524 "and x7, x7, %[m]\n\t" 09525 "sbcs x4, x4, x5\n\t" 09526 "sbcs x6, x6, x7\n\t" 09527 "str x4, [%[r], 48]\n\t" 09528 "str x6, [%[r], 56]\n\t" 09529 "ldr x4, [%[a], 64]\n\t" 09530 "ldr x6, [%[a], 72]\n\t" 09531 "ldr x5, [%[b], 64]\n\t" 09532 "ldr x7, [%[b], 72]\n\t" 09533 "and x5, x5, %[m]\n\t" 09534 "and x7, x7, %[m]\n\t" 09535 "sbcs x4, x4, x5\n\t" 09536 "sbcs x6, x6, x7\n\t" 09537 "str x4, [%[r], 64]\n\t" 09538 "str x6, [%[r], 72]\n\t" 09539 "ldr x4, [%[a], 80]\n\t" 09540 "ldr x6, [%[a], 88]\n\t" 09541 "ldr x5, [%[b], 80]\n\t" 09542 "ldr x7, [%[b], 88]\n\t" 09543 "and x5, x5, %[m]\n\t" 09544 "and x7, x7, %[m]\n\t" 09545 "sbcs x4, x4, x5\n\t" 09546 "sbcs x6, x6, x7\n\t" 09547 "str x4, [%[r], 80]\n\t" 09548 "str x6, [%[r], 88]\n\t" 09549 "ldr x4, [%[a], 96]\n\t" 09550 "ldr x6, [%[a], 104]\n\t" 09551 "ldr x5, [%[b], 96]\n\t" 09552 "ldr x7, [%[b], 104]\n\t" 09553 "and x5, x5, %[m]\n\t" 09554 "and x7, x7, %[m]\n\t" 09555 "sbcs x4, x4, x5\n\t" 09556 "sbcs x6, x6, x7\n\t" 09557 "str x4, [%[r], 96]\n\t" 09558 "str x6, [%[r], 104]\n\t" 09559 "ldr x4, [%[a], 112]\n\t" 09560 "ldr x6, [%[a], 120]\n\t" 09561 "ldr x5, [%[b], 112]\n\t" 09562 "ldr x7, [%[b], 120]\n\t" 09563 "and x5, x5, %[m]\n\t" 09564 "and x7, x7, %[m]\n\t" 09565 "sbcs x4, x4, x5\n\t" 09566 "sbcs x6, x6, x7\n\t" 09567 "str x4, [%[r], 112]\n\t" 09568 "str x6, [%[r], 120]\n\t" 09569 "ldr x4, [%[a], 128]\n\t" 09570 "ldr x6, [%[a], 136]\n\t" 09571 "ldr x5, [%[b], 128]\n\t" 09572 "ldr x7, [%[b], 136]\n\t" 09573 "and x5, x5, %[m]\n\t" 09574 "and x7, x7, %[m]\n\t" 09575 "sbcs x4, x4, x5\n\t" 09576 "sbcs x6, x6, x7\n\t" 09577 "str x4, [%[r], 128]\n\t" 09578 "str x6, [%[r], 136]\n\t" 09579 "ldr x4, [%[a], 144]\n\t" 09580 "ldr x6, [%[a], 152]\n\t" 09581 "ldr x5, [%[b], 144]\n\t" 09582 "ldr x7, [%[b], 152]\n\t" 09583 "and x5, x5, %[m]\n\t" 09584 "and x7, x7, %[m]\n\t" 09585 "sbcs x4, x4, x5\n\t" 09586 "sbcs x6, x6, x7\n\t" 09587 "str x4, [%[r], 144]\n\t" 09588 "str x6, [%[r], 152]\n\t" 09589 "ldr x4, [%[a], 160]\n\t" 09590 "ldr x6, [%[a], 168]\n\t" 09591 "ldr x5, [%[b], 160]\n\t" 09592 "ldr x7, [%[b], 168]\n\t" 09593 "and x5, x5, %[m]\n\t" 09594 "and x7, x7, %[m]\n\t" 09595 "sbcs x4, x4, x5\n\t" 09596 "sbcs x6, x6, x7\n\t" 09597 "str x4, [%[r], 160]\n\t" 09598 "str x6, [%[r], 168]\n\t" 09599 "ldr x4, [%[a], 176]\n\t" 09600 "ldr x6, [%[a], 184]\n\t" 09601 "ldr x5, [%[b], 176]\n\t" 09602 "ldr x7, [%[b], 184]\n\t" 09603 "and x5, x5, %[m]\n\t" 09604 "and x7, x7, %[m]\n\t" 09605 "sbcs x4, x4, x5\n\t" 09606 "sbcs x6, x6, x7\n\t" 09607 "str x4, [%[r], 176]\n\t" 09608 "str x6, [%[r], 184]\n\t" 09609 "ldr x4, [%[a], 192]\n\t" 09610 "ldr x6, [%[a], 200]\n\t" 09611 "ldr x5, [%[b], 192]\n\t" 09612 "ldr x7, [%[b], 200]\n\t" 09613 "and x5, x5, %[m]\n\t" 09614 "and x7, x7, %[m]\n\t" 09615 "sbcs x4, x4, x5\n\t" 09616 "sbcs x6, x6, x7\n\t" 09617 "str x4, [%[r], 192]\n\t" 09618 "str x6, [%[r], 200]\n\t" 09619 "ldr x4, [%[a], 208]\n\t" 09620 "ldr x6, [%[a], 216]\n\t" 09621 "ldr x5, [%[b], 208]\n\t" 09622 "ldr x7, [%[b], 216]\n\t" 09623 "and x5, x5, %[m]\n\t" 09624 "and x7, x7, %[m]\n\t" 09625 "sbcs x4, x4, x5\n\t" 09626 "sbcs x6, x6, x7\n\t" 09627 "str x4, [%[r], 208]\n\t" 09628 "str x6, [%[r], 216]\n\t" 09629 "ldr x4, [%[a], 224]\n\t" 09630 "ldr x6, [%[a], 232]\n\t" 09631 "ldr x5, [%[b], 224]\n\t" 09632 "ldr x7, [%[b], 232]\n\t" 09633 "and x5, x5, %[m]\n\t" 09634 "and x7, x7, %[m]\n\t" 09635 "sbcs x4, x4, x5\n\t" 09636 "sbcs x6, x6, x7\n\t" 09637 "str x4, [%[r], 224]\n\t" 09638 "str x6, [%[r], 232]\n\t" 09639 "ldr x4, [%[a], 240]\n\t" 09640 "ldr x6, [%[a], 248]\n\t" 09641 "ldr x5, [%[b], 240]\n\t" 09642 "ldr x7, [%[b], 248]\n\t" 09643 "and x5, x5, %[m]\n\t" 09644 "and x7, x7, %[m]\n\t" 09645 "sbcs x4, x4, x5\n\t" 09646 "sbcs x6, x6, x7\n\t" 09647 "str x4, [%[r], 240]\n\t" 09648 "str x6, [%[r], 248]\n\t" 09649 "ldr x4, [%[a], 256]\n\t" 09650 "ldr x6, [%[a], 264]\n\t" 09651 "ldr x5, [%[b], 256]\n\t" 09652 "ldr x7, [%[b], 264]\n\t" 09653 "and x5, x5, %[m]\n\t" 09654 "and x7, x7, %[m]\n\t" 09655 "sbcs x4, x4, x5\n\t" 09656 "sbcs x6, x6, x7\n\t" 09657 "str x4, [%[r], 256]\n\t" 09658 "str x6, [%[r], 264]\n\t" 09659 "ldr x4, [%[a], 272]\n\t" 09660 "ldr x6, [%[a], 280]\n\t" 09661 "ldr x5, [%[b], 272]\n\t" 09662 "ldr x7, [%[b], 280]\n\t" 09663 "and x5, x5, %[m]\n\t" 09664 "and x7, x7, %[m]\n\t" 09665 "sbcs x4, x4, x5\n\t" 09666 "sbcs x6, x6, x7\n\t" 09667 "str x4, [%[r], 272]\n\t" 09668 "str x6, [%[r], 280]\n\t" 09669 "ldr x4, [%[a], 288]\n\t" 09670 "ldr x6, [%[a], 296]\n\t" 09671 "ldr x5, [%[b], 288]\n\t" 09672 "ldr x7, [%[b], 296]\n\t" 09673 "and x5, x5, %[m]\n\t" 09674 "and x7, x7, %[m]\n\t" 09675 "sbcs x4, x4, x5\n\t" 09676 "sbcs x6, x6, x7\n\t" 09677 "str x4, [%[r], 288]\n\t" 09678 "str x6, [%[r], 296]\n\t" 09679 "ldr x4, [%[a], 304]\n\t" 09680 "ldr x6, [%[a], 312]\n\t" 09681 "ldr x5, [%[b], 304]\n\t" 09682 "ldr x7, [%[b], 312]\n\t" 09683 "and x5, x5, %[m]\n\t" 09684 "and x7, x7, %[m]\n\t" 09685 "sbcs x4, x4, x5\n\t" 09686 "sbcs x6, x6, x7\n\t" 09687 "str x4, [%[r], 304]\n\t" 09688 "str x6, [%[r], 312]\n\t" 09689 "ldr x4, [%[a], 320]\n\t" 09690 "ldr x6, [%[a], 328]\n\t" 09691 "ldr x5, [%[b], 320]\n\t" 09692 "ldr x7, [%[b], 328]\n\t" 09693 "and x5, x5, %[m]\n\t" 09694 "and x7, x7, %[m]\n\t" 09695 "sbcs x4, x4, x5\n\t" 09696 "sbcs x6, x6, x7\n\t" 09697 "str x4, [%[r], 320]\n\t" 09698 "str x6, [%[r], 328]\n\t" 09699 "ldr x4, [%[a], 336]\n\t" 09700 "ldr x6, [%[a], 344]\n\t" 09701 "ldr x5, [%[b], 336]\n\t" 09702 "ldr x7, [%[b], 344]\n\t" 09703 "and x5, x5, %[m]\n\t" 09704 "and x7, x7, %[m]\n\t" 09705 "sbcs x4, x4, x5\n\t" 09706 "sbcs x6, x6, x7\n\t" 09707 "str x4, [%[r], 336]\n\t" 09708 "str x6, [%[r], 344]\n\t" 09709 "ldr x4, [%[a], 352]\n\t" 09710 "ldr x6, [%[a], 360]\n\t" 09711 "ldr x5, [%[b], 352]\n\t" 09712 "ldr x7, [%[b], 360]\n\t" 09713 "and x5, x5, %[m]\n\t" 09714 "and x7, x7, %[m]\n\t" 09715 "sbcs x4, x4, x5\n\t" 09716 "sbcs x6, x6, x7\n\t" 09717 "str x4, [%[r], 352]\n\t" 09718 "str x6, [%[r], 360]\n\t" 09719 "ldr x4, [%[a], 368]\n\t" 09720 "ldr x6, [%[a], 376]\n\t" 09721 "ldr x5, [%[b], 368]\n\t" 09722 "ldr x7, [%[b], 376]\n\t" 09723 "and x5, x5, %[m]\n\t" 09724 "and x7, x7, %[m]\n\t" 09725 "sbcs x4, x4, x5\n\t" 09726 "sbcs x6, x6, x7\n\t" 09727 "str x4, [%[r], 368]\n\t" 09728 "str x6, [%[r], 376]\n\t" 09729 "csetm %[c], cc\n\t" 09730 : [c] "+r" (c) 09731 : [r] "r" (r), [a] "r" (a), [b] "r" (b), [m] "r" (m) 09732 : "memory", "x4", "x6", "x5", "x7", "x8" 09733 ); 09734 #endif /* WOLFSSL_SP_SMALL */ 09735 09736 return c; 09737 } 09738 09739 /* Reduce the number back to 3072 bits using Montgomery reduction. 09740 * 09741 * a A single precision number to reduce in place. 09742 * m The single precision number representing the modulus. 09743 * mp The digit representing the negative inverse of m mod 2^n. 09744 */ 09745 SP_NOINLINE static void sp_3072_mont_reduce_48(sp_digit* a, sp_digit* m, 09746 sp_digit mp) 09747 { 09748 sp_digit ca = 0; 09749 09750 __asm__ __volatile__ ( 09751 "ldp x12, x13, [%[m], 0]\n\t" 09752 "ldp x14, x15, [%[m], 16]\n\t" 09753 "ldp x16, x17, [%[m], 32]\n\t" 09754 "ldp x18, x19, [%[m], 48]\n\t" 09755 "ldp x20, x21, [%[m], 64]\n\t" 09756 "ldp x22, x23, [%[m], 80]\n\t" 09757 "ldp x24, x25, [%[m], 96]\n\t" 09758 "ldp x26, x27, [%[m], 112]\n\t" 09759 "# i = 0\n\t" 09760 "mov x3, 0\n\t" 09761 "ldp x10, x11, [%[a], 0]\n\t" 09762 "\n1:\n\t" 09763 "# mu = a[i] * mp\n\t" 09764 "mul x8, %[mp], x10\n\t" 09765 "# a[i+0] += m[0] * mu\n\t" 09766 "ldr x9, [%[a], 0]\n\t" 09767 "mul x6, x12, x8\n\t" 09768 "umulh x7, x12, x8\n\t" 09769 "adds x10, x10, x6\n\t" 09770 "adc x5, x7, xzr\n\t" 09771 "# a[i+1] += m[1] * mu\n\t" 09772 "ldr x9, [%[a], 8]\n\t" 09773 "mul x6, x13, x8\n\t" 09774 "umulh x7, x13, x8\n\t" 09775 "adds x10, x11, x6\n\t" 09776 "adc x4, x7, xzr\n\t" 09777 "adds x10, x10, x5\n\t" 09778 "adc x4, x4, xzr\n\t" 09779 "# a[i+2] += m[2] * mu\n\t" 09780 "ldr x11, [%[a], 16]\n\t" 09781 "mul x6, x14, x8\n\t" 09782 "umulh x7, x14, x8\n\t" 09783 "adds x11, x11, x6\n\t" 09784 "adc x5, x7, xzr\n\t" 09785 "adds x11, x11, x4\n\t" 09786 "adc x5, x5, xzr\n\t" 09787 "# a[i+3] += m[3] * mu\n\t" 09788 "ldr x9, [%[a], 24]\n\t" 09789 "mul x6, x15, x8\n\t" 09790 "umulh x7, x15, x8\n\t" 09791 "adds x9, x9, x6\n\t" 09792 "adc x4, x7, xzr\n\t" 09793 "adds x9, x9, x5\n\t" 09794 "str x9, [%[a], 24]\n\t" 09795 "adc x4, x4, xzr\n\t" 09796 "# a[i+4] += m[4] * mu\n\t" 09797 "ldr x9, [%[a], 32]\n\t" 09798 "mul x6, x16, x8\n\t" 09799 "umulh x7, x16, x8\n\t" 09800 "adds x9, x9, x6\n\t" 09801 "adc x5, x7, xzr\n\t" 09802 "adds x9, x9, x4\n\t" 09803 "str x9, [%[a], 32]\n\t" 09804 "adc x5, x5, xzr\n\t" 09805 "# a[i+5] += m[5] * mu\n\t" 09806 "ldr x9, [%[a], 40]\n\t" 09807 "mul x6, x17, x8\n\t" 09808 "umulh x7, x17, x8\n\t" 09809 "adds x9, x9, x6\n\t" 09810 "adc x4, x7, xzr\n\t" 09811 "adds x9, x9, x5\n\t" 09812 "str x9, [%[a], 40]\n\t" 09813 "adc x4, x4, xzr\n\t" 09814 "# a[i+6] += m[6] * mu\n\t" 09815 "ldr x9, [%[a], 48]\n\t" 09816 "mul x6, x18, x8\n\t" 09817 "umulh x7, x18, x8\n\t" 09818 "adds x9, x9, x6\n\t" 09819 "adc x5, x7, xzr\n\t" 09820 "adds x9, x9, x4\n\t" 09821 "str x9, [%[a], 48]\n\t" 09822 "adc x5, x5, xzr\n\t" 09823 "# a[i+7] += m[7] * mu\n\t" 09824 "ldr x9, [%[a], 56]\n\t" 09825 "mul x6, x19, x8\n\t" 09826 "umulh x7, x19, x8\n\t" 09827 "adds x9, x9, x6\n\t" 09828 "adc x4, x7, xzr\n\t" 09829 "adds x9, x9, x5\n\t" 09830 "str x9, [%[a], 56]\n\t" 09831 "adc x4, x4, xzr\n\t" 09832 "# a[i+8] += m[8] * mu\n\t" 09833 "ldr x9, [%[a], 64]\n\t" 09834 "mul x6, x20, x8\n\t" 09835 "umulh x7, x20, x8\n\t" 09836 "adds x9, x9, x6\n\t" 09837 "adc x5, x7, xzr\n\t" 09838 "adds x9, x9, x4\n\t" 09839 "str x9, [%[a], 64]\n\t" 09840 "adc x5, x5, xzr\n\t" 09841 "# a[i+9] += m[9] * mu\n\t" 09842 "ldr x9, [%[a], 72]\n\t" 09843 "mul x6, x21, x8\n\t" 09844 "umulh x7, x21, x8\n\t" 09845 "adds x9, x9, x6\n\t" 09846 "adc x4, x7, xzr\n\t" 09847 "adds x9, x9, x5\n\t" 09848 "str x9, [%[a], 72]\n\t" 09849 "adc x4, x4, xzr\n\t" 09850 "# a[i+10] += m[10] * mu\n\t" 09851 "ldr x9, [%[a], 80]\n\t" 09852 "mul x6, x22, x8\n\t" 09853 "umulh x7, x22, x8\n\t" 09854 "adds x9, x9, x6\n\t" 09855 "adc x5, x7, xzr\n\t" 09856 "adds x9, x9, x4\n\t" 09857 "str x9, [%[a], 80]\n\t" 09858 "adc x5, x5, xzr\n\t" 09859 "# a[i+11] += m[11] * mu\n\t" 09860 "ldr x9, [%[a], 88]\n\t" 09861 "mul x6, x23, x8\n\t" 09862 "umulh x7, x23, x8\n\t" 09863 "adds x9, x9, x6\n\t" 09864 "adc x4, x7, xzr\n\t" 09865 "adds x9, x9, x5\n\t" 09866 "str x9, [%[a], 88]\n\t" 09867 "adc x4, x4, xzr\n\t" 09868 "# a[i+12] += m[12] * mu\n\t" 09869 "ldr x9, [%[a], 96]\n\t" 09870 "mul x6, x24, x8\n\t" 09871 "umulh x7, x24, x8\n\t" 09872 "adds x9, x9, x6\n\t" 09873 "adc x5, x7, xzr\n\t" 09874 "adds x9, x9, x4\n\t" 09875 "str x9, [%[a], 96]\n\t" 09876 "adc x5, x5, xzr\n\t" 09877 "# a[i+13] += m[13] * mu\n\t" 09878 "ldr x9, [%[a], 104]\n\t" 09879 "mul x6, x25, x8\n\t" 09880 "umulh x7, x25, x8\n\t" 09881 "adds x9, x9, x6\n\t" 09882 "adc x4, x7, xzr\n\t" 09883 "adds x9, x9, x5\n\t" 09884 "str x9, [%[a], 104]\n\t" 09885 "adc x4, x4, xzr\n\t" 09886 "# a[i+14] += m[14] * mu\n\t" 09887 "ldr x9, [%[a], 112]\n\t" 09888 "mul x6, x26, x8\n\t" 09889 "umulh x7, x26, x8\n\t" 09890 "adds x9, x9, x6\n\t" 09891 "adc x5, x7, xzr\n\t" 09892 "adds x9, x9, x4\n\t" 09893 "str x9, [%[a], 112]\n\t" 09894 "adc x5, x5, xzr\n\t" 09895 "# a[i+15] += m[15] * mu\n\t" 09896 "ldr x9, [%[a], 120]\n\t" 09897 "mul x6, x27, x8\n\t" 09898 "umulh x7, x27, x8\n\t" 09899 "adds x9, x9, x6\n\t" 09900 "adc x4, x7, xzr\n\t" 09901 "adds x9, x9, x5\n\t" 09902 "str x9, [%[a], 120]\n\t" 09903 "adc x4, x4, xzr\n\t" 09904 "# a[i+16] += m[16] * mu\n\t" 09905 "ldr x7, [%[m], 128]\n\t" 09906 "ldr x9, [%[a], 128]\n\t" 09907 "mul x6, x7, x8\n\t" 09908 "umulh x7, x7, x8\n\t" 09909 "adds x9, x9, x6\n\t" 09910 "adc x5, x7, xzr\n\t" 09911 "adds x9, x9, x4\n\t" 09912 "str x9, [%[a], 128]\n\t" 09913 "adc x5, x5, xzr\n\t" 09914 "# a[i+17] += m[17] * mu\n\t" 09915 "ldr x7, [%[m], 136]\n\t" 09916 "ldr x9, [%[a], 136]\n\t" 09917 "mul x6, x7, x8\n\t" 09918 "umulh x7, x7, x8\n\t" 09919 "adds x9, x9, x6\n\t" 09920 "adc x4, x7, xzr\n\t" 09921 "adds x9, x9, x5\n\t" 09922 "str x9, [%[a], 136]\n\t" 09923 "adc x4, x4, xzr\n\t" 09924 "# a[i+18] += m[18] * mu\n\t" 09925 "ldr x7, [%[m], 144]\n\t" 09926 "ldr x9, [%[a], 144]\n\t" 09927 "mul x6, x7, x8\n\t" 09928 "umulh x7, x7, x8\n\t" 09929 "adds x9, x9, x6\n\t" 09930 "adc x5, x7, xzr\n\t" 09931 "adds x9, x9, x4\n\t" 09932 "str x9, [%[a], 144]\n\t" 09933 "adc x5, x5, xzr\n\t" 09934 "# a[i+19] += m[19] * mu\n\t" 09935 "ldr x7, [%[m], 152]\n\t" 09936 "ldr x9, [%[a], 152]\n\t" 09937 "mul x6, x7, x8\n\t" 09938 "umulh x7, x7, x8\n\t" 09939 "adds x9, x9, x6\n\t" 09940 "adc x4, x7, xzr\n\t" 09941 "adds x9, x9, x5\n\t" 09942 "str x9, [%[a], 152]\n\t" 09943 "adc x4, x4, xzr\n\t" 09944 "# a[i+20] += m[20] * mu\n\t" 09945 "ldr x7, [%[m], 160]\n\t" 09946 "ldr x9, [%[a], 160]\n\t" 09947 "mul x6, x7, x8\n\t" 09948 "umulh x7, x7, x8\n\t" 09949 "adds x9, x9, x6\n\t" 09950 "adc x5, x7, xzr\n\t" 09951 "adds x9, x9, x4\n\t" 09952 "str x9, [%[a], 160]\n\t" 09953 "adc x5, x5, xzr\n\t" 09954 "# a[i+21] += m[21] * mu\n\t" 09955 "ldr x7, [%[m], 168]\n\t" 09956 "ldr x9, [%[a], 168]\n\t" 09957 "mul x6, x7, x8\n\t" 09958 "umulh x7, x7, x8\n\t" 09959 "adds x9, x9, x6\n\t" 09960 "adc x4, x7, xzr\n\t" 09961 "adds x9, x9, x5\n\t" 09962 "str x9, [%[a], 168]\n\t" 09963 "adc x4, x4, xzr\n\t" 09964 "# a[i+22] += m[22] * mu\n\t" 09965 "ldr x7, [%[m], 176]\n\t" 09966 "ldr x9, [%[a], 176]\n\t" 09967 "mul x6, x7, x8\n\t" 09968 "umulh x7, x7, x8\n\t" 09969 "adds x9, x9, x6\n\t" 09970 "adc x5, x7, xzr\n\t" 09971 "adds x9, x9, x4\n\t" 09972 "str x9, [%[a], 176]\n\t" 09973 "adc x5, x5, xzr\n\t" 09974 "# a[i+23] += m[23] * mu\n\t" 09975 "ldr x7, [%[m], 184]\n\t" 09976 "ldr x9, [%[a], 184]\n\t" 09977 "mul x6, x7, x8\n\t" 09978 "umulh x7, x7, x8\n\t" 09979 "adds x9, x9, x6\n\t" 09980 "adc x4, x7, xzr\n\t" 09981 "adds x9, x9, x5\n\t" 09982 "str x9, [%[a], 184]\n\t" 09983 "adc x4, x4, xzr\n\t" 09984 "# a[i+24] += m[24] * mu\n\t" 09985 "ldr x7, [%[m], 192]\n\t" 09986 "ldr x9, [%[a], 192]\n\t" 09987 "mul x6, x7, x8\n\t" 09988 "umulh x7, x7, x8\n\t" 09989 "adds x9, x9, x6\n\t" 09990 "adc x5, x7, xzr\n\t" 09991 "adds x9, x9, x4\n\t" 09992 "str x9, [%[a], 192]\n\t" 09993 "adc x5, x5, xzr\n\t" 09994 "# a[i+25] += m[25] * mu\n\t" 09995 "ldr x7, [%[m], 200]\n\t" 09996 "ldr x9, [%[a], 200]\n\t" 09997 "mul x6, x7, x8\n\t" 09998 "umulh x7, x7, x8\n\t" 09999 "adds x9, x9, x6\n\t" 10000 "adc x4, x7, xzr\n\t" 10001 "adds x9, x9, x5\n\t" 10002 "str x9, [%[a], 200]\n\t" 10003 "adc x4, x4, xzr\n\t" 10004 "# a[i+26] += m[26] * mu\n\t" 10005 "ldr x7, [%[m], 208]\n\t" 10006 "ldr x9, [%[a], 208]\n\t" 10007 "mul x6, x7, x8\n\t" 10008 "umulh x7, x7, x8\n\t" 10009 "adds x9, x9, x6\n\t" 10010 "adc x5, x7, xzr\n\t" 10011 "adds x9, x9, x4\n\t" 10012 "str x9, [%[a], 208]\n\t" 10013 "adc x5, x5, xzr\n\t" 10014 "# a[i+27] += m[27] * mu\n\t" 10015 "ldr x7, [%[m], 216]\n\t" 10016 "ldr x9, [%[a], 216]\n\t" 10017 "mul x6, x7, x8\n\t" 10018 "umulh x7, x7, x8\n\t" 10019 "adds x9, x9, x6\n\t" 10020 "adc x4, x7, xzr\n\t" 10021 "adds x9, x9, x5\n\t" 10022 "str x9, [%[a], 216]\n\t" 10023 "adc x4, x4, xzr\n\t" 10024 "# a[i+28] += m[28] * mu\n\t" 10025 "ldr x7, [%[m], 224]\n\t" 10026 "ldr x9, [%[a], 224]\n\t" 10027 "mul x6, x7, x8\n\t" 10028 "umulh x7, x7, x8\n\t" 10029 "adds x9, x9, x6\n\t" 10030 "adc x5, x7, xzr\n\t" 10031 "adds x9, x9, x4\n\t" 10032 "str x9, [%[a], 224]\n\t" 10033 "adc x5, x5, xzr\n\t" 10034 "# a[i+29] += m[29] * mu\n\t" 10035 "ldr x7, [%[m], 232]\n\t" 10036 "ldr x9, [%[a], 232]\n\t" 10037 "mul x6, x7, x8\n\t" 10038 "umulh x7, x7, x8\n\t" 10039 "adds x9, x9, x6\n\t" 10040 "adc x4, x7, xzr\n\t" 10041 "adds x9, x9, x5\n\t" 10042 "str x9, [%[a], 232]\n\t" 10043 "adc x4, x4, xzr\n\t" 10044 "# a[i+30] += m[30] * mu\n\t" 10045 "ldr x7, [%[m], 240]\n\t" 10046 "ldr x9, [%[a], 240]\n\t" 10047 "mul x6, x7, x8\n\t" 10048 "umulh x7, x7, x8\n\t" 10049 "adds x9, x9, x6\n\t" 10050 "adc x5, x7, xzr\n\t" 10051 "adds x9, x9, x4\n\t" 10052 "str x9, [%[a], 240]\n\t" 10053 "adc x5, x5, xzr\n\t" 10054 "# a[i+31] += m[31] * mu\n\t" 10055 "ldr x7, [%[m], 248]\n\t" 10056 "ldr x9, [%[a], 248]\n\t" 10057 "mul x6, x7, x8\n\t" 10058 "umulh x7, x7, x8\n\t" 10059 "adds x9, x9, x6\n\t" 10060 "adc x4, x7, xzr\n\t" 10061 "adds x9, x9, x5\n\t" 10062 "str x9, [%[a], 248]\n\t" 10063 "adc x4, x4, xzr\n\t" 10064 "# a[i+32] += m[32] * mu\n\t" 10065 "ldr x7, [%[m], 256]\n\t" 10066 "ldr x9, [%[a], 256]\n\t" 10067 "mul x6, x7, x8\n\t" 10068 "umulh x7, x7, x8\n\t" 10069 "adds x9, x9, x6\n\t" 10070 "adc x5, x7, xzr\n\t" 10071 "adds x9, x9, x4\n\t" 10072 "str x9, [%[a], 256]\n\t" 10073 "adc x5, x5, xzr\n\t" 10074 "# a[i+33] += m[33] * mu\n\t" 10075 "ldr x7, [%[m], 264]\n\t" 10076 "ldr x9, [%[a], 264]\n\t" 10077 "mul x6, x7, x8\n\t" 10078 "umulh x7, x7, x8\n\t" 10079 "adds x9, x9, x6\n\t" 10080 "adc x4, x7, xzr\n\t" 10081 "adds x9, x9, x5\n\t" 10082 "str x9, [%[a], 264]\n\t" 10083 "adc x4, x4, xzr\n\t" 10084 "# a[i+34] += m[34] * mu\n\t" 10085 "ldr x7, [%[m], 272]\n\t" 10086 "ldr x9, [%[a], 272]\n\t" 10087 "mul x6, x7, x8\n\t" 10088 "umulh x7, x7, x8\n\t" 10089 "adds x9, x9, x6\n\t" 10090 "adc x5, x7, xzr\n\t" 10091 "adds x9, x9, x4\n\t" 10092 "str x9, [%[a], 272]\n\t" 10093 "adc x5, x5, xzr\n\t" 10094 "# a[i+35] += m[35] * mu\n\t" 10095 "ldr x7, [%[m], 280]\n\t" 10096 "ldr x9, [%[a], 280]\n\t" 10097 "mul x6, x7, x8\n\t" 10098 "umulh x7, x7, x8\n\t" 10099 "adds x9, x9, x6\n\t" 10100 "adc x4, x7, xzr\n\t" 10101 "adds x9, x9, x5\n\t" 10102 "str x9, [%[a], 280]\n\t" 10103 "adc x4, x4, xzr\n\t" 10104 "# a[i+36] += m[36] * mu\n\t" 10105 "ldr x7, [%[m], 288]\n\t" 10106 "ldr x9, [%[a], 288]\n\t" 10107 "mul x6, x7, x8\n\t" 10108 "umulh x7, x7, x8\n\t" 10109 "adds x9, x9, x6\n\t" 10110 "adc x5, x7, xzr\n\t" 10111 "adds x9, x9, x4\n\t" 10112 "str x9, [%[a], 288]\n\t" 10113 "adc x5, x5, xzr\n\t" 10114 "# a[i+37] += m[37] * mu\n\t" 10115 "ldr x7, [%[m], 296]\n\t" 10116 "ldr x9, [%[a], 296]\n\t" 10117 "mul x6, x7, x8\n\t" 10118 "umulh x7, x7, x8\n\t" 10119 "adds x9, x9, x6\n\t" 10120 "adc x4, x7, xzr\n\t" 10121 "adds x9, x9, x5\n\t" 10122 "str x9, [%[a], 296]\n\t" 10123 "adc x4, x4, xzr\n\t" 10124 "# a[i+38] += m[38] * mu\n\t" 10125 "ldr x7, [%[m], 304]\n\t" 10126 "ldr x9, [%[a], 304]\n\t" 10127 "mul x6, x7, x8\n\t" 10128 "umulh x7, x7, x8\n\t" 10129 "adds x9, x9, x6\n\t" 10130 "adc x5, x7, xzr\n\t" 10131 "adds x9, x9, x4\n\t" 10132 "str x9, [%[a], 304]\n\t" 10133 "adc x5, x5, xzr\n\t" 10134 "# a[i+39] += m[39] * mu\n\t" 10135 "ldr x7, [%[m], 312]\n\t" 10136 "ldr x9, [%[a], 312]\n\t" 10137 "mul x6, x7, x8\n\t" 10138 "umulh x7, x7, x8\n\t" 10139 "adds x9, x9, x6\n\t" 10140 "adc x4, x7, xzr\n\t" 10141 "adds x9, x9, x5\n\t" 10142 "str x9, [%[a], 312]\n\t" 10143 "adc x4, x4, xzr\n\t" 10144 "# a[i+40] += m[40] * mu\n\t" 10145 "ldr x7, [%[m], 320]\n\t" 10146 "ldr x9, [%[a], 320]\n\t" 10147 "mul x6, x7, x8\n\t" 10148 "umulh x7, x7, x8\n\t" 10149 "adds x9, x9, x6\n\t" 10150 "adc x5, x7, xzr\n\t" 10151 "adds x9, x9, x4\n\t" 10152 "str x9, [%[a], 320]\n\t" 10153 "adc x5, x5, xzr\n\t" 10154 "# a[i+41] += m[41] * mu\n\t" 10155 "ldr x7, [%[m], 328]\n\t" 10156 "ldr x9, [%[a], 328]\n\t" 10157 "mul x6, x7, x8\n\t" 10158 "umulh x7, x7, x8\n\t" 10159 "adds x9, x9, x6\n\t" 10160 "adc x4, x7, xzr\n\t" 10161 "adds x9, x9, x5\n\t" 10162 "str x9, [%[a], 328]\n\t" 10163 "adc x4, x4, xzr\n\t" 10164 "# a[i+42] += m[42] * mu\n\t" 10165 "ldr x7, [%[m], 336]\n\t" 10166 "ldr x9, [%[a], 336]\n\t" 10167 "mul x6, x7, x8\n\t" 10168 "umulh x7, x7, x8\n\t" 10169 "adds x9, x9, x6\n\t" 10170 "adc x5, x7, xzr\n\t" 10171 "adds x9, x9, x4\n\t" 10172 "str x9, [%[a], 336]\n\t" 10173 "adc x5, x5, xzr\n\t" 10174 "# a[i+43] += m[43] * mu\n\t" 10175 "ldr x7, [%[m], 344]\n\t" 10176 "ldr x9, [%[a], 344]\n\t" 10177 "mul x6, x7, x8\n\t" 10178 "umulh x7, x7, x8\n\t" 10179 "adds x9, x9, x6\n\t" 10180 "adc x4, x7, xzr\n\t" 10181 "adds x9, x9, x5\n\t" 10182 "str x9, [%[a], 344]\n\t" 10183 "adc x4, x4, xzr\n\t" 10184 "# a[i+44] += m[44] * mu\n\t" 10185 "ldr x7, [%[m], 352]\n\t" 10186 "ldr x9, [%[a], 352]\n\t" 10187 "mul x6, x7, x8\n\t" 10188 "umulh x7, x7, x8\n\t" 10189 "adds x9, x9, x6\n\t" 10190 "adc x5, x7, xzr\n\t" 10191 "adds x9, x9, x4\n\t" 10192 "str x9, [%[a], 352]\n\t" 10193 "adc x5, x5, xzr\n\t" 10194 "# a[i+45] += m[45] * mu\n\t" 10195 "ldr x7, [%[m], 360]\n\t" 10196 "ldr x9, [%[a], 360]\n\t" 10197 "mul x6, x7, x8\n\t" 10198 "umulh x7, x7, x8\n\t" 10199 "adds x9, x9, x6\n\t" 10200 "adc x4, x7, xzr\n\t" 10201 "adds x9, x9, x5\n\t" 10202 "str x9, [%[a], 360]\n\t" 10203 "adc x4, x4, xzr\n\t" 10204 "# a[i+46] += m[46] * mu\n\t" 10205 "ldr x7, [%[m], 368]\n\t" 10206 "ldr x9, [%[a], 368]\n\t" 10207 "mul x6, x7, x8\n\t" 10208 "umulh x7, x7, x8\n\t" 10209 "adds x9, x9, x6\n\t" 10210 "adc x5, x7, xzr\n\t" 10211 "adds x9, x9, x4\n\t" 10212 "str x9, [%[a], 368]\n\t" 10213 "adc x5, x5, xzr\n\t" 10214 "# a[i+47] += m[47] * mu\n\t" 10215 "ldr x7, [%[m], 376]\n\t" 10216 "ldr x9, [%[a], 376]\n\t" 10217 "mul x6, x7, x8\n\t" 10218 "umulh x7, x7, x8\n\t" 10219 "adds x5, x5, x6\n\t" 10220 "adcs x7, x7, %[ca]\n\t" 10221 "cset %[ca], cs\n\t" 10222 "adds x9, x9, x5\n\t" 10223 "str x9, [%[a], 376]\n\t" 10224 "ldr x9, [%[a], 384]\n\t" 10225 "adcs x9, x9, x7\n\t" 10226 "str x9, [%[a], 384]\n\t" 10227 "adc %[ca], %[ca], xzr\n\t" 10228 "# i += 1\n\t" 10229 "add %[a], %[a], 8\n\t" 10230 "add x3, x3, 8\n\t" 10231 "cmp x3, 384\n\t" 10232 "blt 1b\n\t" 10233 "str x10, [%[a], 0]\n\t" 10234 "str x11, [%[a], 8]\n\t" 10235 : [ca] "+r" (ca), [a] "+r" (a) 10236 : [m] "r" (m), [mp] "r" (mp) 10237 : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21", "x22", "x23", "x24", "x25", "x26", "x27" 10238 ); 10239 10240 sp_3072_cond_sub_48(a - 48, a, m, (sp_digit)0 - ca); 10241 } 10242 10243 /* Multiply two Montogmery form numbers mod the modulus (prime). 10244 * (r = a * b mod m) 10245 * 10246 * r Result of multiplication. 10247 * a First number to multiply in Montogmery form. 10248 * b Second number to multiply in Montogmery form. 10249 * m Modulus (prime). 10250 * mp Montogmery mulitplier. 10251 */ 10252 static void sp_3072_mont_mul_48(sp_digit* r, sp_digit* a, sp_digit* b, 10253 sp_digit* m, sp_digit mp) 10254 { 10255 sp_3072_mul_48(r, a, b); 10256 sp_3072_mont_reduce_48(r, m, mp); 10257 } 10258 10259 /* Square the Montgomery form number. (r = a * a mod m) 10260 * 10261 * r Result of squaring. 10262 * a Number to square in Montogmery form. 10263 * m Modulus (prime). 10264 * mp Montogmery mulitplier. 10265 */ 10266 static void sp_3072_mont_sqr_48(sp_digit* r, sp_digit* a, sp_digit* m, 10267 sp_digit mp) 10268 { 10269 sp_3072_sqr_48(r, a); 10270 sp_3072_mont_reduce_48(r, m, mp); 10271 } 10272 10273 /* Mul a by digit b into r. (r = a * b) 10274 * 10275 * r A single precision integer. 10276 * a A single precision integer. 10277 * b A single precision digit. 10278 */ 10279 static void sp_3072_mul_d_48(sp_digit* r, const sp_digit* a, 10280 const sp_digit b) 10281 { 10282 #ifdef WOLFSSL_SP_SMALL 10283 __asm__ __volatile__ ( 10284 "# A[0] * B\n\t" 10285 "ldr x8, [%[a]]\n\t" 10286 "mul x5, %[b], x8\n\t" 10287 "umulh x3, %[b], x8\n\t" 10288 "mov x4, 0\n\t" 10289 "str x5, [%[r]]\n\t" 10290 "mov x5, 0\n\t" 10291 "mov x9, #8\n\t" 10292 "1:\n\t" 10293 "ldr x8, [%[a], x9]\n\t" 10294 "mul x6, %[b], x8\n\t" 10295 "umulh x7, %[b], x8\n\t" 10296 "adds x3, x3, x6\n\t" 10297 "adcs x4, x4, x7\n\t" 10298 "adc x5, xzr, xzr\n\t" 10299 "str x3, [%[r], x9]\n\t" 10300 "mov x3, x4\n\t" 10301 "mov x4, x5\n\t" 10302 "mov x5, #0\n\t" 10303 "add x9, x9, #8\n\t" 10304 "cmp x9, 384\n\t" 10305 "b.lt 1b\n\t" 10306 "str x3, [%[r], 384]\n\t" 10307 : 10308 : [r] "r" (r), [a] "r" (a), [b] "r" (b) 10309 : "memory", "x3", "x4", "x5", "x6", "x7", "x8" 10310 ); 10311 #else 10312 __asm__ __volatile__ ( 10313 "# A[0] * B\n\t" 10314 "ldr x8, [%[a]]\n\t" 10315 "mul x3, %[b], x8\n\t" 10316 "umulh x4, %[b], x8\n\t" 10317 "mov x5, 0\n\t" 10318 "str x3, [%[r]]\n\t" 10319 "# A[1] * B\n\t" 10320 "ldr x8, [%[a], 8]\n\t" 10321 "mov x3, 0\n\t" 10322 "mul x6, %[b], x8\n\t" 10323 "umulh x7, %[b], x8\n\t" 10324 "adds x4, x4, x6\n\t" 10325 "adcs x5, x5, x7\n\t" 10326 "adc x3, xzr, xzr\n\t" 10327 "str x4, [%[r], 8]\n\t" 10328 "# A[2] * B\n\t" 10329 "ldr x8, [%[a], 16]\n\t" 10330 "mov x4, 0\n\t" 10331 "mul x6, %[b], x8\n\t" 10332 "umulh x7, %[b], x8\n\t" 10333 "adds x5, x5, x6\n\t" 10334 "adcs x3, x3, x7\n\t" 10335 "adc x4, xzr, xzr\n\t" 10336 "str x5, [%[r], 16]\n\t" 10337 "# A[3] * B\n\t" 10338 "ldr x8, [%[a], 24]\n\t" 10339 "mov x5, 0\n\t" 10340 "mul x6, %[b], x8\n\t" 10341 "umulh x7, %[b], x8\n\t" 10342 "adds x3, x3, x6\n\t" 10343 "adcs x4, x4, x7\n\t" 10344 "adc x5, xzr, xzr\n\t" 10345 "str x3, [%[r], 24]\n\t" 10346 "# A[4] * B\n\t" 10347 "ldr x8, [%[a], 32]\n\t" 10348 "mov x3, 0\n\t" 10349 "mul x6, %[b], x8\n\t" 10350 "umulh x7, %[b], x8\n\t" 10351 "adds x4, x4, x6\n\t" 10352 "adcs x5, x5, x7\n\t" 10353 "adc x3, xzr, xzr\n\t" 10354 "str x4, [%[r], 32]\n\t" 10355 "# A[5] * B\n\t" 10356 "ldr x8, [%[a], 40]\n\t" 10357 "mov x4, 0\n\t" 10358 "mul x6, %[b], x8\n\t" 10359 "umulh x7, %[b], x8\n\t" 10360 "adds x5, x5, x6\n\t" 10361 "adcs x3, x3, x7\n\t" 10362 "adc x4, xzr, xzr\n\t" 10363 "str x5, [%[r], 40]\n\t" 10364 "# A[6] * B\n\t" 10365 "ldr x8, [%[a], 48]\n\t" 10366 "mov x5, 0\n\t" 10367 "mul x6, %[b], x8\n\t" 10368 "umulh x7, %[b], x8\n\t" 10369 "adds x3, x3, x6\n\t" 10370 "adcs x4, x4, x7\n\t" 10371 "adc x5, xzr, xzr\n\t" 10372 "str x3, [%[r], 48]\n\t" 10373 "# A[7] * B\n\t" 10374 "ldr x8, [%[a], 56]\n\t" 10375 "mov x3, 0\n\t" 10376 "mul x6, %[b], x8\n\t" 10377 "umulh x7, %[b], x8\n\t" 10378 "adds x4, x4, x6\n\t" 10379 "adcs x5, x5, x7\n\t" 10380 "adc x3, xzr, xzr\n\t" 10381 "str x4, [%[r], 56]\n\t" 10382 "# A[8] * B\n\t" 10383 "ldr x8, [%[a], 64]\n\t" 10384 "mov x4, 0\n\t" 10385 "mul x6, %[b], x8\n\t" 10386 "umulh x7, %[b], x8\n\t" 10387 "adds x5, x5, x6\n\t" 10388 "adcs x3, x3, x7\n\t" 10389 "adc x4, xzr, xzr\n\t" 10390 "str x5, [%[r], 64]\n\t" 10391 "# A[9] * B\n\t" 10392 "ldr x8, [%[a], 72]\n\t" 10393 "mov x5, 0\n\t" 10394 "mul x6, %[b], x8\n\t" 10395 "umulh x7, %[b], x8\n\t" 10396 "adds x3, x3, x6\n\t" 10397 "adcs x4, x4, x7\n\t" 10398 "adc x5, xzr, xzr\n\t" 10399 "str x3, [%[r], 72]\n\t" 10400 "# A[10] * B\n\t" 10401 "ldr x8, [%[a], 80]\n\t" 10402 "mov x3, 0\n\t" 10403 "mul x6, %[b], x8\n\t" 10404 "umulh x7, %[b], x8\n\t" 10405 "adds x4, x4, x6\n\t" 10406 "adcs x5, x5, x7\n\t" 10407 "adc x3, xzr, xzr\n\t" 10408 "str x4, [%[r], 80]\n\t" 10409 "# A[11] * B\n\t" 10410 "ldr x8, [%[a], 88]\n\t" 10411 "mov x4, 0\n\t" 10412 "mul x6, %[b], x8\n\t" 10413 "umulh x7, %[b], x8\n\t" 10414 "adds x5, x5, x6\n\t" 10415 "adcs x3, x3, x7\n\t" 10416 "adc x4, xzr, xzr\n\t" 10417 "str x5, [%[r], 88]\n\t" 10418 "# A[12] * B\n\t" 10419 "ldr x8, [%[a], 96]\n\t" 10420 "mov x5, 0\n\t" 10421 "mul x6, %[b], x8\n\t" 10422 "umulh x7, %[b], x8\n\t" 10423 "adds x3, x3, x6\n\t" 10424 "adcs x4, x4, x7\n\t" 10425 "adc x5, xzr, xzr\n\t" 10426 "str x3, [%[r], 96]\n\t" 10427 "# A[13] * B\n\t" 10428 "ldr x8, [%[a], 104]\n\t" 10429 "mov x3, 0\n\t" 10430 "mul x6, %[b], x8\n\t" 10431 "umulh x7, %[b], x8\n\t" 10432 "adds x4, x4, x6\n\t" 10433 "adcs x5, x5, x7\n\t" 10434 "adc x3, xzr, xzr\n\t" 10435 "str x4, [%[r], 104]\n\t" 10436 "# A[14] * B\n\t" 10437 "ldr x8, [%[a], 112]\n\t" 10438 "mov x4, 0\n\t" 10439 "mul x6, %[b], x8\n\t" 10440 "umulh x7, %[b], x8\n\t" 10441 "adds x5, x5, x6\n\t" 10442 "adcs x3, x3, x7\n\t" 10443 "adc x4, xzr, xzr\n\t" 10444 "str x5, [%[r], 112]\n\t" 10445 "# A[15] * B\n\t" 10446 "ldr x8, [%[a], 120]\n\t" 10447 "mov x5, 0\n\t" 10448 "mul x6, %[b], x8\n\t" 10449 "umulh x7, %[b], x8\n\t" 10450 "adds x3, x3, x6\n\t" 10451 "adcs x4, x4, x7\n\t" 10452 "adc x5, xzr, xzr\n\t" 10453 "str x3, [%[r], 120]\n\t" 10454 "# A[16] * B\n\t" 10455 "ldr x8, [%[a], 128]\n\t" 10456 "mov x3, 0\n\t" 10457 "mul x6, %[b], x8\n\t" 10458 "umulh x7, %[b], x8\n\t" 10459 "adds x4, x4, x6\n\t" 10460 "adcs x5, x5, x7\n\t" 10461 "adc x3, xzr, xzr\n\t" 10462 "str x4, [%[r], 128]\n\t" 10463 "# A[17] * B\n\t" 10464 "ldr x8, [%[a], 136]\n\t" 10465 "mov x4, 0\n\t" 10466 "mul x6, %[b], x8\n\t" 10467 "umulh x7, %[b], x8\n\t" 10468 "adds x5, x5, x6\n\t" 10469 "adcs x3, x3, x7\n\t" 10470 "adc x4, xzr, xzr\n\t" 10471 "str x5, [%[r], 136]\n\t" 10472 "# A[18] * B\n\t" 10473 "ldr x8, [%[a], 144]\n\t" 10474 "mov x5, 0\n\t" 10475 "mul x6, %[b], x8\n\t" 10476 "umulh x7, %[b], x8\n\t" 10477 "adds x3, x3, x6\n\t" 10478 "adcs x4, x4, x7\n\t" 10479 "adc x5, xzr, xzr\n\t" 10480 "str x3, [%[r], 144]\n\t" 10481 "# A[19] * B\n\t" 10482 "ldr x8, [%[a], 152]\n\t" 10483 "mov x3, 0\n\t" 10484 "mul x6, %[b], x8\n\t" 10485 "umulh x7, %[b], x8\n\t" 10486 "adds x4, x4, x6\n\t" 10487 "adcs x5, x5, x7\n\t" 10488 "adc x3, xzr, xzr\n\t" 10489 "str x4, [%[r], 152]\n\t" 10490 "# A[20] * B\n\t" 10491 "ldr x8, [%[a], 160]\n\t" 10492 "mov x4, 0\n\t" 10493 "mul x6, %[b], x8\n\t" 10494 "umulh x7, %[b], x8\n\t" 10495 "adds x5, x5, x6\n\t" 10496 "adcs x3, x3, x7\n\t" 10497 "adc x4, xzr, xzr\n\t" 10498 "str x5, [%[r], 160]\n\t" 10499 "# A[21] * B\n\t" 10500 "ldr x8, [%[a], 168]\n\t" 10501 "mov x5, 0\n\t" 10502 "mul x6, %[b], x8\n\t" 10503 "umulh x7, %[b], x8\n\t" 10504 "adds x3, x3, x6\n\t" 10505 "adcs x4, x4, x7\n\t" 10506 "adc x5, xzr, xzr\n\t" 10507 "str x3, [%[r], 168]\n\t" 10508 "# A[22] * B\n\t" 10509 "ldr x8, [%[a], 176]\n\t" 10510 "mov x3, 0\n\t" 10511 "mul x6, %[b], x8\n\t" 10512 "umulh x7, %[b], x8\n\t" 10513 "adds x4, x4, x6\n\t" 10514 "adcs x5, x5, x7\n\t" 10515 "adc x3, xzr, xzr\n\t" 10516 "str x4, [%[r], 176]\n\t" 10517 "# A[23] * B\n\t" 10518 "ldr x8, [%[a], 184]\n\t" 10519 "mov x4, 0\n\t" 10520 "mul x6, %[b], x8\n\t" 10521 "umulh x7, %[b], x8\n\t" 10522 "adds x5, x5, x6\n\t" 10523 "adcs x3, x3, x7\n\t" 10524 "adc x4, xzr, xzr\n\t" 10525 "str x5, [%[r], 184]\n\t" 10526 "# A[24] * B\n\t" 10527 "ldr x8, [%[a], 192]\n\t" 10528 "mov x5, 0\n\t" 10529 "mul x6, %[b], x8\n\t" 10530 "umulh x7, %[b], x8\n\t" 10531 "adds x3, x3, x6\n\t" 10532 "adcs x4, x4, x7\n\t" 10533 "adc x5, xzr, xzr\n\t" 10534 "str x3, [%[r], 192]\n\t" 10535 "# A[25] * B\n\t" 10536 "ldr x8, [%[a], 200]\n\t" 10537 "mov x3, 0\n\t" 10538 "mul x6, %[b], x8\n\t" 10539 "umulh x7, %[b], x8\n\t" 10540 "adds x4, x4, x6\n\t" 10541 "adcs x5, x5, x7\n\t" 10542 "adc x3, xzr, xzr\n\t" 10543 "str x4, [%[r], 200]\n\t" 10544 "# A[26] * B\n\t" 10545 "ldr x8, [%[a], 208]\n\t" 10546 "mov x4, 0\n\t" 10547 "mul x6, %[b], x8\n\t" 10548 "umulh x7, %[b], x8\n\t" 10549 "adds x5, x5, x6\n\t" 10550 "adcs x3, x3, x7\n\t" 10551 "adc x4, xzr, xzr\n\t" 10552 "str x5, [%[r], 208]\n\t" 10553 "# A[27] * B\n\t" 10554 "ldr x8, [%[a], 216]\n\t" 10555 "mov x5, 0\n\t" 10556 "mul x6, %[b], x8\n\t" 10557 "umulh x7, %[b], x8\n\t" 10558 "adds x3, x3, x6\n\t" 10559 "adcs x4, x4, x7\n\t" 10560 "adc x5, xzr, xzr\n\t" 10561 "str x3, [%[r], 216]\n\t" 10562 "# A[28] * B\n\t" 10563 "ldr x8, [%[a], 224]\n\t" 10564 "mov x3, 0\n\t" 10565 "mul x6, %[b], x8\n\t" 10566 "umulh x7, %[b], x8\n\t" 10567 "adds x4, x4, x6\n\t" 10568 "adcs x5, x5, x7\n\t" 10569 "adc x3, xzr, xzr\n\t" 10570 "str x4, [%[r], 224]\n\t" 10571 "# A[29] * B\n\t" 10572 "ldr x8, [%[a], 232]\n\t" 10573 "mov x4, 0\n\t" 10574 "mul x6, %[b], x8\n\t" 10575 "umulh x7, %[b], x8\n\t" 10576 "adds x5, x5, x6\n\t" 10577 "adcs x3, x3, x7\n\t" 10578 "adc x4, xzr, xzr\n\t" 10579 "str x5, [%[r], 232]\n\t" 10580 "# A[30] * B\n\t" 10581 "ldr x8, [%[a], 240]\n\t" 10582 "mov x5, 0\n\t" 10583 "mul x6, %[b], x8\n\t" 10584 "umulh x7, %[b], x8\n\t" 10585 "adds x3, x3, x6\n\t" 10586 "adcs x4, x4, x7\n\t" 10587 "adc x5, xzr, xzr\n\t" 10588 "str x3, [%[r], 240]\n\t" 10589 "# A[31] * B\n\t" 10590 "ldr x8, [%[a], 248]\n\t" 10591 "mov x3, 0\n\t" 10592 "mul x6, %[b], x8\n\t" 10593 "umulh x7, %[b], x8\n\t" 10594 "adds x4, x4, x6\n\t" 10595 "adcs x5, x5, x7\n\t" 10596 "adc x3, xzr, xzr\n\t" 10597 "str x4, [%[r], 248]\n\t" 10598 "# A[32] * B\n\t" 10599 "ldr x8, [%[a], 256]\n\t" 10600 "mov x4, 0\n\t" 10601 "mul x6, %[b], x8\n\t" 10602 "umulh x7, %[b], x8\n\t" 10603 "adds x5, x5, x6\n\t" 10604 "adcs x3, x3, x7\n\t" 10605 "adc x4, xzr, xzr\n\t" 10606 "str x5, [%[r], 256]\n\t" 10607 "# A[33] * B\n\t" 10608 "ldr x8, [%[a], 264]\n\t" 10609 "mov x5, 0\n\t" 10610 "mul x6, %[b], x8\n\t" 10611 "umulh x7, %[b], x8\n\t" 10612 "adds x3, x3, x6\n\t" 10613 "adcs x4, x4, x7\n\t" 10614 "adc x5, xzr, xzr\n\t" 10615 "str x3, [%[r], 264]\n\t" 10616 "# A[34] * B\n\t" 10617 "ldr x8, [%[a], 272]\n\t" 10618 "mov x3, 0\n\t" 10619 "mul x6, %[b], x8\n\t" 10620 "umulh x7, %[b], x8\n\t" 10621 "adds x4, x4, x6\n\t" 10622 "adcs x5, x5, x7\n\t" 10623 "adc x3, xzr, xzr\n\t" 10624 "str x4, [%[r], 272]\n\t" 10625 "# A[35] * B\n\t" 10626 "ldr x8, [%[a], 280]\n\t" 10627 "mov x4, 0\n\t" 10628 "mul x6, %[b], x8\n\t" 10629 "umulh x7, %[b], x8\n\t" 10630 "adds x5, x5, x6\n\t" 10631 "adcs x3, x3, x7\n\t" 10632 "adc x4, xzr, xzr\n\t" 10633 "str x5, [%[r], 280]\n\t" 10634 "# A[36] * B\n\t" 10635 "ldr x8, [%[a], 288]\n\t" 10636 "mov x5, 0\n\t" 10637 "mul x6, %[b], x8\n\t" 10638 "umulh x7, %[b], x8\n\t" 10639 "adds x3, x3, x6\n\t" 10640 "adcs x4, x4, x7\n\t" 10641 "adc x5, xzr, xzr\n\t" 10642 "str x3, [%[r], 288]\n\t" 10643 "# A[37] * B\n\t" 10644 "ldr x8, [%[a], 296]\n\t" 10645 "mov x3, 0\n\t" 10646 "mul x6, %[b], x8\n\t" 10647 "umulh x7, %[b], x8\n\t" 10648 "adds x4, x4, x6\n\t" 10649 "adcs x5, x5, x7\n\t" 10650 "adc x3, xzr, xzr\n\t" 10651 "str x4, [%[r], 296]\n\t" 10652 "# A[38] * B\n\t" 10653 "ldr x8, [%[a], 304]\n\t" 10654 "mov x4, 0\n\t" 10655 "mul x6, %[b], x8\n\t" 10656 "umulh x7, %[b], x8\n\t" 10657 "adds x5, x5, x6\n\t" 10658 "adcs x3, x3, x7\n\t" 10659 "adc x4, xzr, xzr\n\t" 10660 "str x5, [%[r], 304]\n\t" 10661 "# A[39] * B\n\t" 10662 "ldr x8, [%[a], 312]\n\t" 10663 "mov x5, 0\n\t" 10664 "mul x6, %[b], x8\n\t" 10665 "umulh x7, %[b], x8\n\t" 10666 "adds x3, x3, x6\n\t" 10667 "adcs x4, x4, x7\n\t" 10668 "adc x5, xzr, xzr\n\t" 10669 "str x3, [%[r], 312]\n\t" 10670 "# A[40] * B\n\t" 10671 "ldr x8, [%[a], 320]\n\t" 10672 "mov x3, 0\n\t" 10673 "mul x6, %[b], x8\n\t" 10674 "umulh x7, %[b], x8\n\t" 10675 "adds x4, x4, x6\n\t" 10676 "adcs x5, x5, x7\n\t" 10677 "adc x3, xzr, xzr\n\t" 10678 "str x4, [%[r], 320]\n\t" 10679 "# A[41] * B\n\t" 10680 "ldr x8, [%[a], 328]\n\t" 10681 "mov x4, 0\n\t" 10682 "mul x6, %[b], x8\n\t" 10683 "umulh x7, %[b], x8\n\t" 10684 "adds x5, x5, x6\n\t" 10685 "adcs x3, x3, x7\n\t" 10686 "adc x4, xzr, xzr\n\t" 10687 "str x5, [%[r], 328]\n\t" 10688 "# A[42] * B\n\t" 10689 "ldr x8, [%[a], 336]\n\t" 10690 "mov x5, 0\n\t" 10691 "mul x6, %[b], x8\n\t" 10692 "umulh x7, %[b], x8\n\t" 10693 "adds x3, x3, x6\n\t" 10694 "adcs x4, x4, x7\n\t" 10695 "adc x5, xzr, xzr\n\t" 10696 "str x3, [%[r], 336]\n\t" 10697 "# A[43] * B\n\t" 10698 "ldr x8, [%[a], 344]\n\t" 10699 "mov x3, 0\n\t" 10700 "mul x6, %[b], x8\n\t" 10701 "umulh x7, %[b], x8\n\t" 10702 "adds x4, x4, x6\n\t" 10703 "adcs x5, x5, x7\n\t" 10704 "adc x3, xzr, xzr\n\t" 10705 "str x4, [%[r], 344]\n\t" 10706 "# A[44] * B\n\t" 10707 "ldr x8, [%[a], 352]\n\t" 10708 "mov x4, 0\n\t" 10709 "mul x6, %[b], x8\n\t" 10710 "umulh x7, %[b], x8\n\t" 10711 "adds x5, x5, x6\n\t" 10712 "adcs x3, x3, x7\n\t" 10713 "adc x4, xzr, xzr\n\t" 10714 "str x5, [%[r], 352]\n\t" 10715 "# A[45] * B\n\t" 10716 "ldr x8, [%[a], 360]\n\t" 10717 "mov x5, 0\n\t" 10718 "mul x6, %[b], x8\n\t" 10719 "umulh x7, %[b], x8\n\t" 10720 "adds x3, x3, x6\n\t" 10721 "adcs x4, x4, x7\n\t" 10722 "adc x5, xzr, xzr\n\t" 10723 "str x3, [%[r], 360]\n\t" 10724 "# A[46] * B\n\t" 10725 "ldr x8, [%[a], 368]\n\t" 10726 "mov x3, 0\n\t" 10727 "mul x6, %[b], x8\n\t" 10728 "umulh x7, %[b], x8\n\t" 10729 "adds x4, x4, x6\n\t" 10730 "adcs x5, x5, x7\n\t" 10731 "adc x3, xzr, xzr\n\t" 10732 "str x4, [%[r], 368]\n\t" 10733 "# A[47] * B\n\t" 10734 "ldr x8, [%[a], 376]\n\t" 10735 "mul x6, %[b], x8\n\t" 10736 "umulh x7, %[b], x8\n\t" 10737 "adds x5, x5, x6\n\t" 10738 "adc x3, x3, x7\n\t" 10739 "str x5, [%[r], 376]\n\t" 10740 "str x3, [%[r], 384]\n\t" 10741 : 10742 : [r] "r" (r), [a] "r" (a), [b] "r" (b) 10743 : "memory", "x3", "x4", "x5", "x6", "x7", "x8" 10744 ); 10745 #endif 10746 } 10747 10748 /* Divide the double width number (d1|d0) by the dividend. (d1|d0 / div) 10749 * 10750 * d1 The high order half of the number to divide. 10751 * d0 The low order half of the number to divide. 10752 * div The dividend. 10753 * returns the result of the division. 10754 */ 10755 static sp_digit div_3072_word_48(sp_digit d1, sp_digit d0, sp_digit div) 10756 { 10757 sp_digit r; 10758 10759 __asm__ __volatile__ ( 10760 "lsr x5, %[div], 32\n\t" 10761 "add x5, x5, 1\n\t" 10762 10763 "udiv x3, %[d1], x5\n\t" 10764 "lsl x6, x3, 32\n\t" 10765 "mul x4, %[div], x6\n\t" 10766 "umulh x3, %[div], x6\n\t" 10767 "subs %[d0], %[d0], x4\n\t" 10768 "sbc %[d1], %[d1], x3\n\t" 10769 10770 "udiv x3, %[d1], x5\n\t" 10771 "lsl x3, x3, 32\n\t" 10772 "add x6, x6, x3\n\t" 10773 "mul x4, %[div], x3\n\t" 10774 "umulh x3, %[div], x3\n\t" 10775 "subs %[d0], %[d0], x4\n\t" 10776 "sbc %[d1], %[d1], x3\n\t" 10777 10778 "lsl x3, %[d1], 32\n\t" 10779 "orr x3, x3, %[d0], lsr 32\n\t" 10780 10781 "udiv x3, x3, x5\n\t" 10782 "add x6, x6, x3\n\t" 10783 "mul x4, %[div], x3\n\t" 10784 "umulh x3, %[div], x3\n\t" 10785 "subs %[d0], %[d0], x4\n\t" 10786 "sbc %[d1], %[d1], x3\n\t" 10787 10788 "lsl x3, %[d1], 32\n\t" 10789 "orr x3, x3, %[d0], lsr 32\n\t" 10790 10791 "udiv x3, x3, x5\n\t" 10792 "add x6, x6, x3\n\t" 10793 "mul x4, %[div], x3\n\t" 10794 "umulh x3, %[div], x3\n\t" 10795 "subs %[d0], %[d0], x4\n\t" 10796 "sbc %[d1], %[d1], x3\n\t" 10797 10798 "udiv x3, %[d0], %[div]\n\t" 10799 "add x6, x6, x3\n\t" 10800 "mul x3, %[div], x3\n\t" 10801 "sub %[d0], %[d0], x3\n\t" 10802 "mov %[r], x6\n\t" 10803 10804 : [r] "=r" (r) 10805 : [d1] "r" (d1), [d0] "r" (d0), [div] "r" (div) 10806 : "x3", "x4", "x5", "x6" 10807 ); 10808 10809 return r; 10810 } 10811 10812 /* AND m into each word of a and store in r. 10813 * 10814 * r A single precision integer. 10815 * a A single precision integer. 10816 * m Mask to AND against each digit. 10817 */ 10818 static void sp_3072_mask_48(sp_digit* r, sp_digit* a, sp_digit m) 10819 { 10820 #ifdef WOLFSSL_SP_SMALL 10821 int i; 10822 10823 for (i=0; i<48; i++) 10824 r[i] = a[i] & m; 10825 #else 10826 int i; 10827 10828 for (i = 0; i < 48; i += 8) { 10829 r[i+0] = a[i+0] & m; 10830 r[i+1] = a[i+1] & m; 10831 r[i+2] = a[i+2] & m; 10832 r[i+3] = a[i+3] & m; 10833 r[i+4] = a[i+4] & m; 10834 r[i+5] = a[i+5] & m; 10835 r[i+6] = a[i+6] & m; 10836 r[i+7] = a[i+7] & m; 10837 } 10838 #endif 10839 } 10840 10841 /* Compare a with b in constant time. 10842 * 10843 * a A single precision integer. 10844 * b A single precision integer. 10845 * return -ve, 0 or +ve if a is less than, equal to or greater than b 10846 * respectively. 10847 */ 10848 static int64_t sp_3072_cmp_48(sp_digit* a, sp_digit* b) 10849 { 10850 sp_digit r = -1; 10851 sp_digit one = 1; 10852 10853 #ifdef WOLFSSL_SP_SMALL 10854 __asm__ __volatile__ ( 10855 "mov x3, -1\n\t" 10856 "mov x6, 376\n\t" 10857 "1:\n\t" 10858 "ldr x4, [%[a], x6]\n\t" 10859 "ldr x5, [%[b], x6]\n\t" 10860 "and x4, x4, x3\n\t" 10861 "and x5, x5, x3\n\t" 10862 "subs x4, x4, x5\n\t" 10863 "csel %[r], %[one], %[r], hi\n\t" 10864 "csel %[r], x3, %[r], lo\n\t" 10865 "csel x3, x3, xzr, eq\n\t" 10866 "sub x6, x6, #8\n\t" 10867 "b.cc 1b\n\t" 10868 "eor %[r], %[r], x3\n\t" 10869 : [r] "+r" (r) 10870 : [a] "r" (a), [b] "r" (b), [one] "r" (one) 10871 : "x2", "x3", "x4", "x5", "x6" 10872 ); 10873 #else 10874 __asm__ __volatile__ ( 10875 "mov x3, -1\n\t" 10876 "ldr x4, [%[a], 376]\n\t" 10877 "ldr x5, [%[b], 376]\n\t" 10878 "and x4, x4, x3\n\t" 10879 "and x5, x5, x3\n\t" 10880 "subs x4, x4, x5\n\t" 10881 "csel %[r], %[one], %[r], hi\n\t" 10882 "csel %[r], x3, %[r], lo\n\t" 10883 "csel x3, x3, xzr, eq\n\t" 10884 "ldr x4, [%[a], 368]\n\t" 10885 "ldr x5, [%[b], 368]\n\t" 10886 "and x4, x4, x3\n\t" 10887 "and x5, x5, x3\n\t" 10888 "subs x4, x4, x5\n\t" 10889 "csel %[r], %[one], %[r], hi\n\t" 10890 "csel %[r], x3, %[r], lo\n\t" 10891 "csel x3, x3, xzr, eq\n\t" 10892 "ldr x4, [%[a], 360]\n\t" 10893 "ldr x5, [%[b], 360]\n\t" 10894 "and x4, x4, x3\n\t" 10895 "and x5, x5, x3\n\t" 10896 "subs x4, x4, x5\n\t" 10897 "csel %[r], %[one], %[r], hi\n\t" 10898 "csel %[r], x3, %[r], lo\n\t" 10899 "csel x3, x3, xzr, eq\n\t" 10900 "ldr x4, [%[a], 352]\n\t" 10901 "ldr x5, [%[b], 352]\n\t" 10902 "and x4, x4, x3\n\t" 10903 "and x5, x5, x3\n\t" 10904 "subs x4, x4, x5\n\t" 10905 "csel %[r], %[one], %[r], hi\n\t" 10906 "csel %[r], x3, %[r], lo\n\t" 10907 "csel x3, x3, xzr, eq\n\t" 10908 "ldr x4, [%[a], 344]\n\t" 10909 "ldr x5, [%[b], 344]\n\t" 10910 "and x4, x4, x3\n\t" 10911 "and x5, x5, x3\n\t" 10912 "subs x4, x4, x5\n\t" 10913 "csel %[r], %[one], %[r], hi\n\t" 10914 "csel %[r], x3, %[r], lo\n\t" 10915 "csel x3, x3, xzr, eq\n\t" 10916 "ldr x4, [%[a], 336]\n\t" 10917 "ldr x5, [%[b], 336]\n\t" 10918 "and x4, x4, x3\n\t" 10919 "and x5, x5, x3\n\t" 10920 "subs x4, x4, x5\n\t" 10921 "csel %[r], %[one], %[r], hi\n\t" 10922 "csel %[r], x3, %[r], lo\n\t" 10923 "csel x3, x3, xzr, eq\n\t" 10924 "ldr x4, [%[a], 328]\n\t" 10925 "ldr x5, [%[b], 328]\n\t" 10926 "and x4, x4, x3\n\t" 10927 "and x5, x5, x3\n\t" 10928 "subs x4, x4, x5\n\t" 10929 "csel %[r], %[one], %[r], hi\n\t" 10930 "csel %[r], x3, %[r], lo\n\t" 10931 "csel x3, x3, xzr, eq\n\t" 10932 "ldr x4, [%[a], 320]\n\t" 10933 "ldr x5, [%[b], 320]\n\t" 10934 "and x4, x4, x3\n\t" 10935 "and x5, x5, x3\n\t" 10936 "subs x4, x4, x5\n\t" 10937 "csel %[r], %[one], %[r], hi\n\t" 10938 "csel %[r], x3, %[r], lo\n\t" 10939 "csel x3, x3, xzr, eq\n\t" 10940 "ldr x4, [%[a], 312]\n\t" 10941 "ldr x5, [%[b], 312]\n\t" 10942 "and x4, x4, x3\n\t" 10943 "and x5, x5, x3\n\t" 10944 "subs x4, x4, x5\n\t" 10945 "csel %[r], %[one], %[r], hi\n\t" 10946 "csel %[r], x3, %[r], lo\n\t" 10947 "csel x3, x3, xzr, eq\n\t" 10948 "ldr x4, [%[a], 304]\n\t" 10949 "ldr x5, [%[b], 304]\n\t" 10950 "and x4, x4, x3\n\t" 10951 "and x5, x5, x3\n\t" 10952 "subs x4, x4, x5\n\t" 10953 "csel %[r], %[one], %[r], hi\n\t" 10954 "csel %[r], x3, %[r], lo\n\t" 10955 "csel x3, x3, xzr, eq\n\t" 10956 "ldr x4, [%[a], 296]\n\t" 10957 "ldr x5, [%[b], 296]\n\t" 10958 "and x4, x4, x3\n\t" 10959 "and x5, x5, x3\n\t" 10960 "subs x4, x4, x5\n\t" 10961 "csel %[r], %[one], %[r], hi\n\t" 10962 "csel %[r], x3, %[r], lo\n\t" 10963 "csel x3, x3, xzr, eq\n\t" 10964 "ldr x4, [%[a], 288]\n\t" 10965 "ldr x5, [%[b], 288]\n\t" 10966 "and x4, x4, x3\n\t" 10967 "and x5, x5, x3\n\t" 10968 "subs x4, x4, x5\n\t" 10969 "csel %[r], %[one], %[r], hi\n\t" 10970 "csel %[r], x3, %[r], lo\n\t" 10971 "csel x3, x3, xzr, eq\n\t" 10972 "ldr x4, [%[a], 280]\n\t" 10973 "ldr x5, [%[b], 280]\n\t" 10974 "and x4, x4, x3\n\t" 10975 "and x5, x5, x3\n\t" 10976 "subs x4, x4, x5\n\t" 10977 "csel %[r], %[one], %[r], hi\n\t" 10978 "csel %[r], x3, %[r], lo\n\t" 10979 "csel x3, x3, xzr, eq\n\t" 10980 "ldr x4, [%[a], 272]\n\t" 10981 "ldr x5, [%[b], 272]\n\t" 10982 "and x4, x4, x3\n\t" 10983 "and x5, x5, x3\n\t" 10984 "subs x4, x4, x5\n\t" 10985 "csel %[r], %[one], %[r], hi\n\t" 10986 "csel %[r], x3, %[r], lo\n\t" 10987 "csel x3, x3, xzr, eq\n\t" 10988 "ldr x4, [%[a], 264]\n\t" 10989 "ldr x5, [%[b], 264]\n\t" 10990 "and x4, x4, x3\n\t" 10991 "and x5, x5, x3\n\t" 10992 "subs x4, x4, x5\n\t" 10993 "csel %[r], %[one], %[r], hi\n\t" 10994 "csel %[r], x3, %[r], lo\n\t" 10995 "csel x3, x3, xzr, eq\n\t" 10996 "ldr x4, [%[a], 256]\n\t" 10997 "ldr x5, [%[b], 256]\n\t" 10998 "and x4, x4, x3\n\t" 10999 "and x5, x5, x3\n\t" 11000 "subs x4, x4, x5\n\t" 11001 "csel %[r], %[one], %[r], hi\n\t" 11002 "csel %[r], x3, %[r], lo\n\t" 11003 "csel x3, x3, xzr, eq\n\t" 11004 "ldr x4, [%[a], 248]\n\t" 11005 "ldr x5, [%[b], 248]\n\t" 11006 "and x4, x4, x3\n\t" 11007 "and x5, x5, x3\n\t" 11008 "subs x4, x4, x5\n\t" 11009 "csel %[r], %[one], %[r], hi\n\t" 11010 "csel %[r], x3, %[r], lo\n\t" 11011 "csel x3, x3, xzr, eq\n\t" 11012 "ldr x4, [%[a], 240]\n\t" 11013 "ldr x5, [%[b], 240]\n\t" 11014 "and x4, x4, x3\n\t" 11015 "and x5, x5, x3\n\t" 11016 "subs x4, x4, x5\n\t" 11017 "csel %[r], %[one], %[r], hi\n\t" 11018 "csel %[r], x3, %[r], lo\n\t" 11019 "csel x3, x3, xzr, eq\n\t" 11020 "ldr x4, [%[a], 232]\n\t" 11021 "ldr x5, [%[b], 232]\n\t" 11022 "and x4, x4, x3\n\t" 11023 "and x5, x5, x3\n\t" 11024 "subs x4, x4, x5\n\t" 11025 "csel %[r], %[one], %[r], hi\n\t" 11026 "csel %[r], x3, %[r], lo\n\t" 11027 "csel x3, x3, xzr, eq\n\t" 11028 "ldr x4, [%[a], 224]\n\t" 11029 "ldr x5, [%[b], 224]\n\t" 11030 "and x4, x4, x3\n\t" 11031 "and x5, x5, x3\n\t" 11032 "subs x4, x4, x5\n\t" 11033 "csel %[r], %[one], %[r], hi\n\t" 11034 "csel %[r], x3, %[r], lo\n\t" 11035 "csel x3, x3, xzr, eq\n\t" 11036 "ldr x4, [%[a], 216]\n\t" 11037 "ldr x5, [%[b], 216]\n\t" 11038 "and x4, x4, x3\n\t" 11039 "and x5, x5, x3\n\t" 11040 "subs x4, x4, x5\n\t" 11041 "csel %[r], %[one], %[r], hi\n\t" 11042 "csel %[r], x3, %[r], lo\n\t" 11043 "csel x3, x3, xzr, eq\n\t" 11044 "ldr x4, [%[a], 208]\n\t" 11045 "ldr x5, [%[b], 208]\n\t" 11046 "and x4, x4, x3\n\t" 11047 "and x5, x5, x3\n\t" 11048 "subs x4, x4, x5\n\t" 11049 "csel %[r], %[one], %[r], hi\n\t" 11050 "csel %[r], x3, %[r], lo\n\t" 11051 "csel x3, x3, xzr, eq\n\t" 11052 "ldr x4, [%[a], 200]\n\t" 11053 "ldr x5, [%[b], 200]\n\t" 11054 "and x4, x4, x3\n\t" 11055 "and x5, x5, x3\n\t" 11056 "subs x4, x4, x5\n\t" 11057 "csel %[r], %[one], %[r], hi\n\t" 11058 "csel %[r], x3, %[r], lo\n\t" 11059 "csel x3, x3, xzr, eq\n\t" 11060 "ldr x4, [%[a], 192]\n\t" 11061 "ldr x5, [%[b], 192]\n\t" 11062 "and x4, x4, x3\n\t" 11063 "and x5, x5, x3\n\t" 11064 "subs x4, x4, x5\n\t" 11065 "csel %[r], %[one], %[r], hi\n\t" 11066 "csel %[r], x3, %[r], lo\n\t" 11067 "csel x3, x3, xzr, eq\n\t" 11068 "ldr x4, [%[a], 184]\n\t" 11069 "ldr x5, [%[b], 184]\n\t" 11070 "and x4, x4, x3\n\t" 11071 "and x5, x5, x3\n\t" 11072 "subs x4, x4, x5\n\t" 11073 "csel %[r], %[one], %[r], hi\n\t" 11074 "csel %[r], x3, %[r], lo\n\t" 11075 "csel x3, x3, xzr, eq\n\t" 11076 "ldr x4, [%[a], 176]\n\t" 11077 "ldr x5, [%[b], 176]\n\t" 11078 "and x4, x4, x3\n\t" 11079 "and x5, x5, x3\n\t" 11080 "subs x4, x4, x5\n\t" 11081 "csel %[r], %[one], %[r], hi\n\t" 11082 "csel %[r], x3, %[r], lo\n\t" 11083 "csel x3, x3, xzr, eq\n\t" 11084 "ldr x4, [%[a], 168]\n\t" 11085 "ldr x5, [%[b], 168]\n\t" 11086 "and x4, x4, x3\n\t" 11087 "and x5, x5, x3\n\t" 11088 "subs x4, x4, x5\n\t" 11089 "csel %[r], %[one], %[r], hi\n\t" 11090 "csel %[r], x3, %[r], lo\n\t" 11091 "csel x3, x3, xzr, eq\n\t" 11092 "ldr x4, [%[a], 160]\n\t" 11093 "ldr x5, [%[b], 160]\n\t" 11094 "and x4, x4, x3\n\t" 11095 "and x5, x5, x3\n\t" 11096 "subs x4, x4, x5\n\t" 11097 "csel %[r], %[one], %[r], hi\n\t" 11098 "csel %[r], x3, %[r], lo\n\t" 11099 "csel x3, x3, xzr, eq\n\t" 11100 "ldr x4, [%[a], 152]\n\t" 11101 "ldr x5, [%[b], 152]\n\t" 11102 "and x4, x4, x3\n\t" 11103 "and x5, x5, x3\n\t" 11104 "subs x4, x4, x5\n\t" 11105 "csel %[r], %[one], %[r], hi\n\t" 11106 "csel %[r], x3, %[r], lo\n\t" 11107 "csel x3, x3, xzr, eq\n\t" 11108 "ldr x4, [%[a], 144]\n\t" 11109 "ldr x5, [%[b], 144]\n\t" 11110 "and x4, x4, x3\n\t" 11111 "and x5, x5, x3\n\t" 11112 "subs x4, x4, x5\n\t" 11113 "csel %[r], %[one], %[r], hi\n\t" 11114 "csel %[r], x3, %[r], lo\n\t" 11115 "csel x3, x3, xzr, eq\n\t" 11116 "ldr x4, [%[a], 136]\n\t" 11117 "ldr x5, [%[b], 136]\n\t" 11118 "and x4, x4, x3\n\t" 11119 "and x5, x5, x3\n\t" 11120 "subs x4, x4, x5\n\t" 11121 "csel %[r], %[one], %[r], hi\n\t" 11122 "csel %[r], x3, %[r], lo\n\t" 11123 "csel x3, x3, xzr, eq\n\t" 11124 "ldr x4, [%[a], 128]\n\t" 11125 "ldr x5, [%[b], 128]\n\t" 11126 "and x4, x4, x3\n\t" 11127 "and x5, x5, x3\n\t" 11128 "subs x4, x4, x5\n\t" 11129 "csel %[r], %[one], %[r], hi\n\t" 11130 "csel %[r], x3, %[r], lo\n\t" 11131 "csel x3, x3, xzr, eq\n\t" 11132 "ldr x4, [%[a], 120]\n\t" 11133 "ldr x5, [%[b], 120]\n\t" 11134 "and x4, x4, x3\n\t" 11135 "and x5, x5, x3\n\t" 11136 "subs x4, x4, x5\n\t" 11137 "csel %[r], %[one], %[r], hi\n\t" 11138 "csel %[r], x3, %[r], lo\n\t" 11139 "csel x3, x3, xzr, eq\n\t" 11140 "ldr x4, [%[a], 112]\n\t" 11141 "ldr x5, [%[b], 112]\n\t" 11142 "and x4, x4, x3\n\t" 11143 "and x5, x5, x3\n\t" 11144 "subs x4, x4, x5\n\t" 11145 "csel %[r], %[one], %[r], hi\n\t" 11146 "csel %[r], x3, %[r], lo\n\t" 11147 "csel x3, x3, xzr, eq\n\t" 11148 "ldr x4, [%[a], 104]\n\t" 11149 "ldr x5, [%[b], 104]\n\t" 11150 "and x4, x4, x3\n\t" 11151 "and x5, x5, x3\n\t" 11152 "subs x4, x4, x5\n\t" 11153 "csel %[r], %[one], %[r], hi\n\t" 11154 "csel %[r], x3, %[r], lo\n\t" 11155 "csel x3, x3, xzr, eq\n\t" 11156 "ldr x4, [%[a], 96]\n\t" 11157 "ldr x5, [%[b], 96]\n\t" 11158 "and x4, x4, x3\n\t" 11159 "and x5, x5, x3\n\t" 11160 "subs x4, x4, x5\n\t" 11161 "csel %[r], %[one], %[r], hi\n\t" 11162 "csel %[r], x3, %[r], lo\n\t" 11163 "csel x3, x3, xzr, eq\n\t" 11164 "ldr x4, [%[a], 88]\n\t" 11165 "ldr x5, [%[b], 88]\n\t" 11166 "and x4, x4, x3\n\t" 11167 "and x5, x5, x3\n\t" 11168 "subs x4, x4, x5\n\t" 11169 "csel %[r], %[one], %[r], hi\n\t" 11170 "csel %[r], x3, %[r], lo\n\t" 11171 "csel x3, x3, xzr, eq\n\t" 11172 "ldr x4, [%[a], 80]\n\t" 11173 "ldr x5, [%[b], 80]\n\t" 11174 "and x4, x4, x3\n\t" 11175 "and x5, x5, x3\n\t" 11176 "subs x4, x4, x5\n\t" 11177 "csel %[r], %[one], %[r], hi\n\t" 11178 "csel %[r], x3, %[r], lo\n\t" 11179 "csel x3, x3, xzr, eq\n\t" 11180 "ldr x4, [%[a], 72]\n\t" 11181 "ldr x5, [%[b], 72]\n\t" 11182 "and x4, x4, x3\n\t" 11183 "and x5, x5, x3\n\t" 11184 "subs x4, x4, x5\n\t" 11185 "csel %[r], %[one], %[r], hi\n\t" 11186 "csel %[r], x3, %[r], lo\n\t" 11187 "csel x3, x3, xzr, eq\n\t" 11188 "ldr x4, [%[a], 64]\n\t" 11189 "ldr x5, [%[b], 64]\n\t" 11190 "and x4, x4, x3\n\t" 11191 "and x5, x5, x3\n\t" 11192 "subs x4, x4, x5\n\t" 11193 "csel %[r], %[one], %[r], hi\n\t" 11194 "csel %[r], x3, %[r], lo\n\t" 11195 "csel x3, x3, xzr, eq\n\t" 11196 "ldr x4, [%[a], 56]\n\t" 11197 "ldr x5, [%[b], 56]\n\t" 11198 "and x4, x4, x3\n\t" 11199 "and x5, x5, x3\n\t" 11200 "subs x4, x4, x5\n\t" 11201 "csel %[r], %[one], %[r], hi\n\t" 11202 "csel %[r], x3, %[r], lo\n\t" 11203 "csel x3, x3, xzr, eq\n\t" 11204 "ldr x4, [%[a], 48]\n\t" 11205 "ldr x5, [%[b], 48]\n\t" 11206 "and x4, x4, x3\n\t" 11207 "and x5, x5, x3\n\t" 11208 "subs x4, x4, x5\n\t" 11209 "csel %[r], %[one], %[r], hi\n\t" 11210 "csel %[r], x3, %[r], lo\n\t" 11211 "csel x3, x3, xzr, eq\n\t" 11212 "ldr x4, [%[a], 40]\n\t" 11213 "ldr x5, [%[b], 40]\n\t" 11214 "and x4, x4, x3\n\t" 11215 "and x5, x5, x3\n\t" 11216 "subs x4, x4, x5\n\t" 11217 "csel %[r], %[one], %[r], hi\n\t" 11218 "csel %[r], x3, %[r], lo\n\t" 11219 "csel x3, x3, xzr, eq\n\t" 11220 "ldr x4, [%[a], 32]\n\t" 11221 "ldr x5, [%[b], 32]\n\t" 11222 "and x4, x4, x3\n\t" 11223 "and x5, x5, x3\n\t" 11224 "subs x4, x4, x5\n\t" 11225 "csel %[r], %[one], %[r], hi\n\t" 11226 "csel %[r], x3, %[r], lo\n\t" 11227 "csel x3, x3, xzr, eq\n\t" 11228 "ldr x4, [%[a], 24]\n\t" 11229 "ldr x5, [%[b], 24]\n\t" 11230 "and x4, x4, x3\n\t" 11231 "and x5, x5, x3\n\t" 11232 "subs x4, x4, x5\n\t" 11233 "csel %[r], %[one], %[r], hi\n\t" 11234 "csel %[r], x3, %[r], lo\n\t" 11235 "csel x3, x3, xzr, eq\n\t" 11236 "ldr x4, [%[a], 16]\n\t" 11237 "ldr x5, [%[b], 16]\n\t" 11238 "and x4, x4, x3\n\t" 11239 "and x5, x5, x3\n\t" 11240 "subs x4, x4, x5\n\t" 11241 "csel %[r], %[one], %[r], hi\n\t" 11242 "csel %[r], x3, %[r], lo\n\t" 11243 "csel x3, x3, xzr, eq\n\t" 11244 "ldr x4, [%[a], 8]\n\t" 11245 "ldr x5, [%[b], 8]\n\t" 11246 "and x4, x4, x3\n\t" 11247 "and x5, x5, x3\n\t" 11248 "subs x4, x4, x5\n\t" 11249 "csel %[r], %[one], %[r], hi\n\t" 11250 "csel %[r], x3, %[r], lo\n\t" 11251 "csel x3, x3, xzr, eq\n\t" 11252 "ldr x4, [%[a], 0]\n\t" 11253 "ldr x5, [%[b], 0]\n\t" 11254 "and x4, x4, x3\n\t" 11255 "and x5, x5, x3\n\t" 11256 "subs x4, x4, x5\n\t" 11257 "csel %[r], %[one], %[r], hi\n\t" 11258 "csel %[r], x3, %[r], lo\n\t" 11259 "csel x3, x3, xzr, eq\n\t" 11260 "eor %[r], %[r], x3\n\t" 11261 : [r] "+r" (r) 11262 : [a] "r" (a), [b] "r" (b), [one] "r" (one) 11263 : "x2", "x3", "x4", "x5", "x6" 11264 ); 11265 #endif 11266 11267 return r; 11268 } 11269 11270 /* Divide d in a and put remainder into r (m*d + r = a) 11271 * m is not calculated as it is not needed at this time. 11272 * 11273 * a Nmber to be divided. 11274 * d Number to divide with. 11275 * m Multiplier result. 11276 * r Remainder from the division. 11277 * returns MP_OKAY indicating success. 11278 */ 11279 static WC_INLINE int sp_3072_div_48(sp_digit* a, sp_digit* d, sp_digit* m, 11280 sp_digit* r) 11281 { 11282 sp_digit t1[96], t2[49]; 11283 sp_digit div, r1; 11284 int i; 11285 11286 (void)m; 11287 11288 div = d[47]; 11289 XMEMCPY(t1, a, sizeof(*t1) * 2 * 48); 11290 for (i=47; i>=0; i--) { 11291 r1 = div_3072_word_48(t1[48 + i], t1[48 + i - 1], div); 11292 11293 sp_3072_mul_d_48(t2, d, r1); 11294 t1[48 + i] += sp_3072_sub_in_place_48(&t1[i], t2); 11295 t1[48 + i] -= t2[48]; 11296 sp_3072_mask_48(t2, d, t1[48 + i]); 11297 t1[48 + i] += sp_3072_add_48(&t1[i], &t1[i], t2); 11298 sp_3072_mask_48(t2, d, t1[48 + i]); 11299 t1[48 + i] += sp_3072_add_48(&t1[i], &t1[i], t2); 11300 } 11301 11302 r1 = sp_3072_cmp_48(t1, d) >= 0; 11303 sp_3072_cond_sub_48(r, t1, t2, (sp_digit)0 - r1); 11304 11305 return MP_OKAY; 11306 } 11307 11308 /* Reduce a modulo m into r. (r = a mod m) 11309 * 11310 * r A single precision number that is the reduced result. 11311 * a A single precision number that is to be reduced. 11312 * m A single precision number that is the modulus to reduce with. 11313 * returns MP_OKAY indicating success. 11314 */ 11315 static WC_INLINE int sp_3072_mod_48(sp_digit* r, sp_digit* a, sp_digit* m) 11316 { 11317 return sp_3072_div_48(a, m, NULL, r); 11318 } 11319 11320 /* Divide d in a and put remainder into r (m*d + r = a) 11321 * m is not calculated as it is not needed at this time. 11322 * 11323 * a Nmber to be divided. 11324 * d Number to divide with. 11325 * m Multiplier result. 11326 * r Remainder from the division. 11327 * returns MP_OKAY indicating success. 11328 */ 11329 static WC_INLINE int sp_3072_div_48_cond(sp_digit* a, sp_digit* d, sp_digit* m, 11330 sp_digit* r) 11331 { 11332 sp_digit t1[96], t2[49]; 11333 sp_digit div, r1; 11334 int i; 11335 11336 (void)m; 11337 11338 div = d[47]; 11339 XMEMCPY(t1, a, sizeof(*t1) * 2 * 48); 11340 for (i=47; i>=0; i--) { 11341 r1 = div_3072_word_48(t1[48 + i], t1[48 + i - 1], div); 11342 11343 sp_3072_mul_d_48(t2, d, r1); 11344 t1[48 + i] += sp_3072_sub_in_place_48(&t1[i], t2); 11345 t1[48 + i] -= t2[48]; 11346 if (t1[48 + i] != 0) { 11347 t1[48 + i] += sp_3072_add_48(&t1[i], &t1[i], d); 11348 if (t1[48 + i] != 0) 11349 t1[48 + i] += sp_3072_add_48(&t1[i], &t1[i], d); 11350 } 11351 } 11352 11353 r1 = sp_3072_cmp_48(t1, d) >= 0; 11354 sp_3072_cond_sub_48(r, t1, t2, (sp_digit)0 - r1); 11355 11356 return MP_OKAY; 11357 } 11358 11359 /* Reduce a modulo m into r. (r = a mod m) 11360 * 11361 * r A single precision number that is the reduced result. 11362 * a A single precision number that is to be reduced. 11363 * m A single precision number that is the modulus to reduce with. 11364 * returns MP_OKAY indicating success. 11365 */ 11366 static WC_INLINE int sp_3072_mod_48_cond(sp_digit* r, sp_digit* a, sp_digit* m) 11367 { 11368 return sp_3072_div_48_cond(a, m, NULL, r); 11369 } 11370 11371 #if defined(SP_RSA_PRIVATE_EXP_D) || defined(WOLFSSL_HAVE_SP_DH) 11372 #ifdef WOLFSSL_SP_SMALL 11373 /* Modular exponentiate a to the e mod m. (r = a^e mod m) 11374 * 11375 * r A single precision number that is the result of the operation. 11376 * a A single precision number being exponentiated. 11377 * e A single precision number that is the exponent. 11378 * bits The number of bits in the exponent. 11379 * m A single precision number that is the modulus. 11380 * returns 0 on success and MEMORY_E on dynamic memory allocation failure. 11381 */ 11382 static int sp_3072_mod_exp_48(sp_digit* r, sp_digit* a, sp_digit* e, 11383 int bits, sp_digit* m, int reduceA) 11384 { 11385 #ifndef WOLFSSL_SMALL_STACK 11386 sp_digit t[16][96]; 11387 #else 11388 sp_digit* t[16]; 11389 sp_digit* td; 11390 #endif 11391 sp_digit* norm; 11392 sp_digit mp = 1; 11393 sp_digit n; 11394 sp_digit mask; 11395 int i; 11396 int c, y; 11397 int err = MP_OKAY; 11398 11399 #ifdef WOLFSSL_SMALL_STACK 11400 td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 16 * 96, NULL, 11401 DYNAMIC_TYPE_TMP_BUFFER); 11402 if (td == NULL) 11403 err = MEMORY_E; 11404 11405 if (err == MP_OKAY) { 11406 for (i=0; i<16; i++) 11407 t[i] = td + i * 96; 11408 norm = t[0]; 11409 } 11410 #else 11411 norm = t[0]; 11412 #endif 11413 11414 if (err == MP_OKAY) { 11415 sp_3072_mont_setup(m, &mp); 11416 sp_3072_mont_norm_48(norm, m); 11417 11418 XMEMSET(t[1], 0, sizeof(sp_digit) * 48); 11419 if (reduceA) { 11420 err = sp_3072_mod_48(t[1] + 48, a, m); 11421 if (err == MP_OKAY) 11422 err = sp_3072_mod_48(t[1], t[1], m); 11423 } 11424 else { 11425 XMEMCPY(t[1] + 48, a, sizeof(sp_digit) * 48); 11426 err = sp_3072_mod_48(t[1], t[1], m); 11427 } 11428 } 11429 11430 if (err == MP_OKAY) { 11431 sp_3072_mont_sqr_48(t[ 2], t[ 1], m, mp); 11432 sp_3072_mont_mul_48(t[ 3], t[ 2], t[ 1], m, mp); 11433 sp_3072_mont_sqr_48(t[ 4], t[ 2], m, mp); 11434 sp_3072_mont_mul_48(t[ 5], t[ 3], t[ 2], m, mp); 11435 sp_3072_mont_sqr_48(t[ 6], t[ 3], m, mp); 11436 sp_3072_mont_mul_48(t[ 7], t[ 4], t[ 3], m, mp); 11437 sp_3072_mont_sqr_48(t[ 8], t[ 4], m, mp); 11438 sp_3072_mont_mul_48(t[ 9], t[ 5], t[ 4], m, mp); 11439 sp_3072_mont_sqr_48(t[10], t[ 5], m, mp); 11440 sp_3072_mont_mul_48(t[11], t[ 6], t[ 5], m, mp); 11441 sp_3072_mont_sqr_48(t[12], t[ 6], m, mp); 11442 sp_3072_mont_mul_48(t[13], t[ 7], t[ 6], m, mp); 11443 sp_3072_mont_sqr_48(t[14], t[ 7], m, mp); 11444 sp_3072_mont_mul_48(t[15], t[ 8], t[ 7], m, mp); 11445 11446 i = (bits - 1) / 64; 11447 n = e[i--]; 11448 y = n >> 60; 11449 n <<= 4; 11450 c = 60; 11451 XMEMCPY(r, t[y], sizeof(sp_digit) * 48); 11452 for (; i>=0 || c>=4; ) { 11453 if (c == 0) { 11454 n = e[i--]; 11455 y = n >> 60; 11456 n <<= 4; 11457 c = 60; 11458 } 11459 else if (c < 4) { 11460 y = n >> 60; 11461 n = e[i--]; 11462 c = 4 - c; 11463 y |= n >> (64 - c); 11464 n <<= c; 11465 c = 64 - c; 11466 } 11467 else { 11468 y = (n >> 60) & 0xf; 11469 n <<= 4; 11470 c -= 4; 11471 } 11472 11473 sp_3072_mont_sqr_48(r, r, m, mp); 11474 sp_3072_mont_sqr_48(r, r, m, mp); 11475 sp_3072_mont_sqr_48(r, r, m, mp); 11476 sp_3072_mont_sqr_48(r, r, m, mp); 11477 11478 sp_3072_mont_mul_48(r, r, t[y], m, mp); 11479 } 11480 11481 XMEMSET(&r[48], 0, sizeof(sp_digit) * 48); 11482 sp_3072_mont_reduce_48(r, m, mp); 11483 11484 mask = 0 - (sp_3072_cmp_48(r, m) >= 0); 11485 sp_3072_cond_sub_48(r, r, m, mask); 11486 } 11487 11488 #ifdef WOLFSSL_SMALL_STACK 11489 if (td != NULL) 11490 XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); 11491 #endif 11492 11493 return err; 11494 } 11495 #else 11496 /* Modular exponentiate a to the e mod m. (r = a^e mod m) 11497 * 11498 * r A single precision number that is the result of the operation. 11499 * a A single precision number being exponentiated. 11500 * e A single precision number that is the exponent. 11501 * bits The number of bits in the exponent. 11502 * m A single precision number that is the modulus. 11503 * returns 0 on success and MEMORY_E on dynamic memory allocation failure. 11504 */ 11505 static int sp_3072_mod_exp_48(sp_digit* r, sp_digit* a, sp_digit* e, 11506 int bits, sp_digit* m, int reduceA) 11507 { 11508 #ifndef WOLFSSL_SMALL_STACK 11509 sp_digit t[32][96]; 11510 #else 11511 sp_digit* t[32]; 11512 sp_digit* td; 11513 #endif 11514 sp_digit* norm; 11515 sp_digit mp = 1; 11516 sp_digit n; 11517 sp_digit mask; 11518 int i; 11519 int c, y; 11520 int err = MP_OKAY; 11521 11522 #ifdef WOLFSSL_SMALL_STACK 11523 td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32 * 96, NULL, 11524 DYNAMIC_TYPE_TMP_BUFFER); 11525 if (td == NULL) 11526 err = MEMORY_E; 11527 11528 if (err == MP_OKAY) { 11529 for (i=0; i<32; i++) 11530 t[i] = td + i * 96; 11531 norm = t[0]; 11532 } 11533 #else 11534 norm = t[0]; 11535 #endif 11536 11537 if (err == MP_OKAY) { 11538 sp_3072_mont_setup(m, &mp); 11539 sp_3072_mont_norm_48(norm, m); 11540 11541 XMEMSET(t[1], 0, sizeof(sp_digit) * 48); 11542 if (reduceA) { 11543 err = sp_3072_mod_48(t[1] + 48, a, m); 11544 if (err == MP_OKAY) 11545 err = sp_3072_mod_48(t[1], t[1], m); 11546 } 11547 else { 11548 XMEMCPY(t[1] + 48, a, sizeof(sp_digit) * 48); 11549 err = sp_3072_mod_48(t[1], t[1], m); 11550 } 11551 } 11552 11553 if (err == MP_OKAY) { 11554 sp_3072_mont_sqr_48(t[ 2], t[ 1], m, mp); 11555 sp_3072_mont_mul_48(t[ 3], t[ 2], t[ 1], m, mp); 11556 sp_3072_mont_sqr_48(t[ 4], t[ 2], m, mp); 11557 sp_3072_mont_mul_48(t[ 5], t[ 3], t[ 2], m, mp); 11558 sp_3072_mont_sqr_48(t[ 6], t[ 3], m, mp); 11559 sp_3072_mont_mul_48(t[ 7], t[ 4], t[ 3], m, mp); 11560 sp_3072_mont_sqr_48(t[ 8], t[ 4], m, mp); 11561 sp_3072_mont_mul_48(t[ 9], t[ 5], t[ 4], m, mp); 11562 sp_3072_mont_sqr_48(t[10], t[ 5], m, mp); 11563 sp_3072_mont_mul_48(t[11], t[ 6], t[ 5], m, mp); 11564 sp_3072_mont_sqr_48(t[12], t[ 6], m, mp); 11565 sp_3072_mont_mul_48(t[13], t[ 7], t[ 6], m, mp); 11566 sp_3072_mont_sqr_48(t[14], t[ 7], m, mp); 11567 sp_3072_mont_mul_48(t[15], t[ 8], t[ 7], m, mp); 11568 sp_3072_mont_sqr_48(t[16], t[ 8], m, mp); 11569 sp_3072_mont_mul_48(t[17], t[ 9], t[ 8], m, mp); 11570 sp_3072_mont_sqr_48(t[18], t[ 9], m, mp); 11571 sp_3072_mont_mul_48(t[19], t[10], t[ 9], m, mp); 11572 sp_3072_mont_sqr_48(t[20], t[10], m, mp); 11573 sp_3072_mont_mul_48(t[21], t[11], t[10], m, mp); 11574 sp_3072_mont_sqr_48(t[22], t[11], m, mp); 11575 sp_3072_mont_mul_48(t[23], t[12], t[11], m, mp); 11576 sp_3072_mont_sqr_48(t[24], t[12], m, mp); 11577 sp_3072_mont_mul_48(t[25], t[13], t[12], m, mp); 11578 sp_3072_mont_sqr_48(t[26], t[13], m, mp); 11579 sp_3072_mont_mul_48(t[27], t[14], t[13], m, mp); 11580 sp_3072_mont_sqr_48(t[28], t[14], m, mp); 11581 sp_3072_mont_mul_48(t[29], t[15], t[14], m, mp); 11582 sp_3072_mont_sqr_48(t[30], t[15], m, mp); 11583 sp_3072_mont_mul_48(t[31], t[16], t[15], m, mp); 11584 11585 i = (bits - 1) / 64; 11586 n = e[i--]; 11587 y = n >> 59; 11588 n <<= 5; 11589 c = 59; 11590 XMEMCPY(r, t[y], sizeof(sp_digit) * 48); 11591 for (; i>=0 || c>=5; ) { 11592 if (c == 0) { 11593 n = e[i--]; 11594 y = n >> 59; 11595 n <<= 5; 11596 c = 59; 11597 } 11598 else if (c < 5) { 11599 y = n >> 59; 11600 n = e[i--]; 11601 c = 5 - c; 11602 y |= n >> (64 - c); 11603 n <<= c; 11604 c = 64 - c; 11605 } 11606 else { 11607 y = (n >> 59) & 0x1f; 11608 n <<= 5; 11609 c -= 5; 11610 } 11611 11612 sp_3072_mont_sqr_48(r, r, m, mp); 11613 sp_3072_mont_sqr_48(r, r, m, mp); 11614 sp_3072_mont_sqr_48(r, r, m, mp); 11615 sp_3072_mont_sqr_48(r, r, m, mp); 11616 sp_3072_mont_sqr_48(r, r, m, mp); 11617 11618 sp_3072_mont_mul_48(r, r, t[y], m, mp); 11619 } 11620 y = e[0] & 0x3; 11621 sp_3072_mont_sqr_48(r, r, m, mp); 11622 sp_3072_mont_sqr_48(r, r, m, mp); 11623 sp_3072_mont_mul_48(r, r, t[y], m, mp); 11624 11625 XMEMSET(&r[48], 0, sizeof(sp_digit) * 48); 11626 sp_3072_mont_reduce_48(r, m, mp); 11627 11628 mask = 0 - (sp_3072_cmp_48(r, m) >= 0); 11629 sp_3072_cond_sub_48(r, r, m, mask); 11630 } 11631 11632 #ifdef WOLFSSL_SMALL_STACK 11633 if (td != NULL) 11634 XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER); 11635 #endif 11636 11637 return err; 11638 } 11639 #endif /* WOLFSSL_SP_SMALL */ 11640 #endif /* SP_RSA_PRIVATE_EXP_D || WOLFSSL_HAVE_SP_DH */ 11641 11642 #ifdef WOLFSSL_HAVE_SP_RSA 11643 /* RSA public key operation. 11644 * 11645 * in Array of bytes representing the number to exponentiate, base. 11646 * inLen Number of bytes in base. 11647 * em Public exponent. 11648 * mm Modulus. 11649 * out Buffer to hold big-endian bytes of exponentiation result. 11650 * Must be at least 384 bytes long. 11651 * outLen Number of bytes in result. 11652 * returns 0 on success, MP_TO_E when the outLen is too small, MP_READ_E when 11653 * an array is too long and MEMORY_E when dynamic memory allocation fails. 11654 */ 11655 int sp_RsaPublic_3072(const byte* in, word32 inLen, mp_int* em, mp_int* mm, 11656 byte* out, word32* outLen) 11657 { 11658 #if !defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SMALL_STACK) 11659 sp_digit ad[96], md[48], rd[96]; 11660 #else 11661 sp_digit* d = NULL; 11662 #endif 11663 sp_digit* a; 11664 sp_digit *ah; 11665 sp_digit* m; 11666 sp_digit* r; 11667 sp_digit e[1]; 11668 int err = MP_OKAY; 11669 11670 if (*outLen < 384) 11671 err = MP_TO_E; 11672 if (err == MP_OKAY && (mp_count_bits(em) > 64 || inLen > 384 || 11673 mp_count_bits(mm) != 3072)) 11674 err = MP_READ_E; 11675 11676 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK) 11677 if (err == MP_OKAY) { 11678 d = (sp_digit*)XMALLOC(sizeof(sp_digit) * 48 * 5, NULL, 11679 DYNAMIC_TYPE_TMP_BUFFER); 11680 if (d == NULL) 11681 err = MEMORY_E; 11682 } 11683 11684 if (err == MP_OKAY) { 11685 a = d; 11686 r = a + 48 * 2; 11687 m = r + 48 * 2; 11688 ah = a + 48; 11689 } 11690 #else 11691 a = ad; 11692 m = md; 11693 r = rd; 11694 ah = a + 48; 11695 #endif 11696 11697 if (err == MP_OKAY) { 11698 sp_3072_from_bin(ah, 48, in, inLen); 11699 #if DIGIT_BIT >= 64 11700 e[0] = em->dp[0]; 11701 #else 11702 e[0] = em->dp[0]; 11703 if (em->used > 1) 11704 e[0] |= ((sp_digit)em->dp[1]) << DIGIT_BIT; 11705 #endif 11706 if (e[0] == 0) 11707 err = MP_EXPTMOD_E; 11708 } 11709 if (err == MP_OKAY) { 11710 sp_3072_from_mp(m, 48, mm); 11711 11712 if (e[0] == 0x3) { 11713 if (err == MP_OKAY) { 11714 sp_3072_sqr_48(r, ah); 11715 err = sp_3072_mod_48_cond(r, r, m); 11716 } 11717 if (err == MP_OKAY) { 11718 sp_3072_mul_48(r, ah, r); 11719 err = sp_3072_mod_48_cond(r, r, m); 11720 } 11721 } 11722 else { 11723 int i; 11724 sp_digit mp; 11725 11726 sp_3072_mont_setup(m, &mp); 11727 11728 /* Convert to Montgomery form. */ 11729 XMEMSET(a, 0, sizeof(sp_digit) * 48); 11730 err = sp_3072_mod_48_cond(a, a, m); 11731 11732 if (err == MP_OKAY) { 11733 for (i=63; i>=0; i--) 11734 if (e[0] >> i) 11735 break; 11736 11737 XMEMCPY(r, a, sizeof(sp_digit) * 48); 11738 for (i--; i>=0; i--) { 11739 sp_3072_mont_sqr_48(r, r, m, mp); 11740 if (((e[0] >> i) & 1) == 1) 11741 sp_3072_mont_mul_48(r, r, a, m, mp); 11742 } 11743 XMEMSET(&r[48], 0, sizeof(sp_digit) * 48); 11744 sp_3072_mont_reduce_48(r, m, mp); 11745 11746 for (i = 47; i > 0; i--) { 11747 if (r[i] != m[i]) 11748 break; 11749 } 11750 if (r[i] >= m[i]) 11751 sp_3072_sub_in_place_48(r, m); 11752 } 11753 } 11754 } 11755 11756 if (err == MP_OKAY) { 11757 sp_3072_to_bin(r, out); 11758 *outLen = 384; 11759 } 11760 11761 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK) 11762 if (d != NULL) 11763 XFREE(d, NULL, DYNAMIC_TYPE_TMP_BUFFER); 11764 #endif 11765 11766 return err; 11767 } 11768 11769 /* RSA private key operation. 11770 * 11771 * in Array of bytes representing the number to exponentiate, base. 11772 * inLen Number of bytes in base. 11773 * dm Private exponent. 11774 * pm First prime. 11775 * qm Second prime. 11776 * dpm First prime's CRT exponent. 11777 * dqm Second prime's CRT exponent. 11778 * qim Inverse of second prime mod p. 11779 * mm Modulus. 11780 * out Buffer to hold big-endian bytes of exponentiation result. 11781 * Must be at least 384 bytes long. 11782 * outLen Number of bytes in result. 11783 * returns 0 on success, MP_TO_E when the outLen is too small, MP_READ_E when 11784 * an array is too long and MEMORY_E when dynamic memory allocation fails. 11785 */ 11786 int sp_RsaPrivate_3072(const byte* in, word32 inLen, mp_int* dm, 11787 mp_int* pm, mp_int* qm, mp_int* dpm, mp_int* dqm, mp_int* qim, mp_int* mm, 11788 byte* out, word32* outLen) 11789 { 11790 #if !defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SMALL_STACK) 11791 sp_digit ad[48 * 2]; 11792 sp_digit pd[24], qd[24], dpd[24]; 11793 sp_digit tmpad[48], tmpbd[48]; 11794 #else 11795 sp_digit* t = NULL; 11796 #endif 11797 sp_digit* a; 11798 sp_digit* p; 11799 sp_digit* q; 11800 sp_digit* dp; 11801 sp_digit* dq; 11802 sp_digit* qi; 11803 sp_digit* tmp; 11804 sp_digit* tmpa; 11805 sp_digit* tmpb; 11806 sp_digit* r; 11807 sp_digit c; 11808 int err = MP_OKAY; 11809 11810 (void)dm; 11811 (void)mm; 11812 11813 if (*outLen < 384) 11814 err = MP_TO_E; 11815 if (err == MP_OKAY && (inLen > 384 || mp_count_bits(mm) != 3072)) 11816 err = MP_READ_E; 11817 11818 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK) 11819 if (err == MP_OKAY) { 11820 t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 24 * 11, NULL, 11821 DYNAMIC_TYPE_TMP_BUFFER); 11822 if (t == NULL) 11823 err = MEMORY_E; 11824 } 11825 if (err == MP_OKAY) { 11826 a = t; 11827 p = a + 48 * 2; 11828 q = p + 24; 11829 qi = dq = dp = q + 24; 11830 tmpa = qi + 24; 11831 tmpb = tmpa + 48; 11832 11833 tmp = t; 11834 r = tmp + 48; 11835 } 11836 #else 11837 r = a = ad; 11838 p = pd; 11839 q = qd; 11840 qi = dq = dp = dpd; 11841 tmpa = tmpad; 11842 tmpb = tmpbd; 11843 tmp = a + 48; 11844 #endif 11845 11846 if (err == MP_OKAY) { 11847 sp_3072_from_bin(a, 48, in, inLen); 11848 sp_3072_from_mp(p, 24, pm); 11849 sp_3072_from_mp(q, 24, qm); 11850 sp_3072_from_mp(dp, 24, dpm); 11851 11852 err = sp_3072_mod_exp_24(tmpa, a, dp, 1536, p, 1); 11853 } 11854 if (err == MP_OKAY) { 11855 sp_3072_from_mp(dq, 24, dqm); 11856 err = sp_3072_mod_exp_24(tmpb, a, dq, 1536, q, 1); 11857 } 11858 11859 if (err == MP_OKAY) { 11860 c = sp_3072_sub_in_place_24(tmpa, tmpb); 11861 sp_3072_mask_24(tmp, p, c); 11862 sp_3072_add_24(tmpa, tmpa, tmp); 11863 11864 sp_3072_from_mp(qi, 24, qim); 11865 sp_3072_mul_24(tmpa, tmpa, qi); 11866 err = sp_3072_mod_24(tmpa, tmpa, p); 11867 } 11868 11869 if (err == MP_OKAY) { 11870 sp_3072_mul_24(tmpa, q, tmpa); 11871 XMEMSET(&tmpb[24], 0, sizeof(sp_digit) * 24); 11872 sp_3072_add_48(r, tmpb, tmpa); 11873 11874 sp_3072_to_bin(r, out); 11875 *outLen = 384; 11876 } 11877 11878 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK) 11879 if (t != NULL) { 11880 XMEMSET(t, 0, sizeof(sp_digit) * 24 * 11); 11881 XFREE(t, NULL, DYNAMIC_TYPE_TMP_BUFFER); 11882 } 11883 #else 11884 XMEMSET(tmpad, 0, sizeof(tmpad)); 11885 XMEMSET(tmpbd, 0, sizeof(tmpbd)); 11886 XMEMSET(pd, 0, sizeof(pd)); 11887 XMEMSET(qd, 0, sizeof(qd)); 11888 XMEMSET(dpd, 0, sizeof(dpd)); 11889 #endif 11890 11891 return err; 11892 } 11893 #endif /* WOLFSSL_HAVE_SP_RSA */ 11894 #ifdef WOLFSSL_HAVE_SP_DH 11895 /* Convert an array of sp_digit to an mp_int. 11896 * 11897 * a A single precision integer. 11898 * r A multi-precision integer. 11899 */ 11900 static int sp_3072_to_mp(sp_digit* a, mp_int* r) 11901 { 11902 int err; 11903 11904 err = mp_grow(r, (3072 + DIGIT_BIT - 1) / DIGIT_BIT); 11905 if (err == MP_OKAY) { 11906 #if DIGIT_BIT == 64 11907 XMEMCPY(r->dp, a, sizeof(sp_digit) * 48); 11908 r->used = 48; 11909 mp_clamp(r); 11910 #elif DIGIT_BIT < 64 11911 int i, j = 0, s = 0; 11912 11913 r->dp[0] = 0; 11914 for (i = 0; i < 48; i++) { 11915 r->dp[j] |= a[i] << s; 11916 r->dp[j] &= (1l << DIGIT_BIT) - 1; 11917 s = DIGIT_BIT - s; 11918 r->dp[++j] = a[i] >> s; 11919 while (s + DIGIT_BIT <= 64) { 11920 s += DIGIT_BIT; 11921 r->dp[j] &= (1l << DIGIT_BIT) - 1; 11922 r->dp[++j] = a[i] >> s; 11923 } 11924 s = 64 - s; 11925 } 11926 r->used = (3072 + DIGIT_BIT - 1) / DIGIT_BIT; 11927 mp_clamp(r); 11928 #else 11929 int i, j = 0, s = 0; 11930 11931 r->dp[0] = 0; 11932 for (i = 0; i < 48; i++) { 11933 r->dp[j] |= ((mp_digit)a[i]) << s; 11934 if (s + 64 >= DIGIT_BIT) { 11935 #if DIGIT_BIT < 64 11936 r->dp[j] &= (1l << DIGIT_BIT) - 1; 11937 #endif 11938 s = DIGIT_BIT - s; 11939 r->dp[++j] = a[i] >> s; 11940 s = 64 - s; 11941 } 11942 else 11943 s += 64; 11944 } 11945 r->used = (3072 + DIGIT_BIT - 1) / DIGIT_BIT; 11946 mp_clamp(r); 11947 #endif 11948 } 11949 11950 return err; 11951 } 11952 11953 /* Perform the modular exponentiation for Diffie-Hellman. 11954 * 11955 * base Base. MP integer. 11956 * exp Exponent. MP integer. 11957 * mod Modulus. MP integer. 11958 * res Result. MP integer. 11959 * returs 0 on success, MP_READ_E if there are too many bytes in an array 11960 * and MEMORY_E if memory allocation fails. 11961 */ 11962 int sp_ModExp_3072(mp_int* base, mp_int* exp, mp_int* mod, mp_int* res) 11963 { 11964 int err = MP_OKAY; 11965 sp_digit b[96], e[48], m[48]; 11966 sp_digit* r = b; 11967 int expBits = mp_count_bits(exp); 11968 11969 if (mp_count_bits(base) > 3072 || expBits > 3072 || 11970 mp_count_bits(mod) != 3072) { 11971 err = MP_READ_E; 11972 } 11973 11974 if (err == MP_OKAY) { 11975 sp_3072_from_mp(b, 48, base); 11976 sp_3072_from_mp(e, 48, exp); 11977 sp_3072_from_mp(m, 48, mod); 11978 11979 err = sp_3072_mod_exp_48(r, b, e, expBits, m, 0); 11980 } 11981 11982 if (err == MP_OKAY) { 11983 err = sp_3072_to_mp(r, res); 11984 } 11985 11986 XMEMSET(e, 0, sizeof(e)); 11987 11988 return err; 11989 } 11990 11991 /* Perform the modular exponentiation for Diffie-Hellman. 11992 * 11993 * base Base. 11994 * exp Array of bytes that is the exponent. 11995 * expLen Length of data, in bytes, in exponent. 11996 * mod Modulus. 11997 * out Buffer to hold big-endian bytes of exponentiation result. 11998 * Must be at least 384 bytes long. 11999 * outLen Length, in bytes, of exponentiation result. 12000 * returs 0 on success, MP_READ_E if there are too many bytes in an array 12001 * and MEMORY_E if memory allocation fails. 12002 */ 12003 int sp_DhExp_3072(mp_int* base, const byte* exp, word32 expLen, 12004 mp_int* mod, byte* out, word32* outLen) 12005 { 12006 int err = MP_OKAY; 12007 sp_digit b[96], e[48], m[48]; 12008 sp_digit* r = b; 12009 word32 i; 12010 12011 if (mp_count_bits(base) > 3072 || expLen > 384 || 12012 mp_count_bits(mod) != 3072) { 12013 err = MP_READ_E; 12014 } 12015 12016 if (err == MP_OKAY) { 12017 sp_3072_from_mp(b, 48, base); 12018 sp_3072_from_bin(e, 48, exp, expLen); 12019 sp_3072_from_mp(m, 48, mod); 12020 12021 err = sp_3072_mod_exp_48(r, b, e, expLen * 8, m, 0); 12022 } 12023 12024 if (err == MP_OKAY) { 12025 sp_3072_to_bin(r, out); 12026 *outLen = 384; 12027 for (i=0; i<384 && out[i] == 0; i++) { 12028 } 12029 *outLen -= i; 12030 XMEMMOVE(out, out + i, *outLen); 12031 12032 } 12033 12034 XMEMSET(e, 0, sizeof(e)); 12035 12036 return err; 12037 } 12038 12039 #endif /* WOLFSSL_HAVE_SP_DH */ 12040 12041 #endif /* WOLFSSL_SP_NO_3072 */ 12042 12043 #endif /* WOLFSSL_HAVE_SP_RSA || WOLFSSL_HAVE_SP_DH */ 12044 #ifdef WOLFSSL_HAVE_SP_ECC 12045 #ifndef WOLFSSL_SP_NO_256 12046 12047 /* Point structure to use. */ 12048 typedef struct sp_point { 12049 sp_digit x[2 * 4]; 12050 sp_digit y[2 * 4]; 12051 sp_digit z[2 * 4]; 12052 int infinity; 12053 } sp_point; 12054 12055 /* The modulus (prime) of the curve P256. */ 12056 static sp_digit p256_mod[4] = { 12057 0xffffffffffffffffl,0x00000000ffffffffl,0x0000000000000000l, 12058 0xffffffff00000001l 12059 }; 12060 /* The Montogmery normalizer for modulus of the curve P256. */ 12061 static sp_digit p256_norm_mod[4] = { 12062 0x0000000000000001l,0xffffffff00000000l,0xffffffffffffffffl, 12063 0x00000000fffffffel 12064 }; 12065 /* The Montogmery multiplier for modulus of the curve P256. */ 12066 static sp_digit p256_mp_mod = 0x0000000000000001; 12067 #if defined(WOLFSSL_VALIDATE_ECC_KEYGEN) || defined(HAVE_ECC_SIGN) || \ 12068 defined(HAVE_ECC_VERIFY) 12069 /* The order of the curve P256. */ 12070 static sp_digit p256_order[4] = { 12071 0xf3b9cac2fc632551l,0xbce6faada7179e84l,0xffffffffffffffffl, 12072 0xffffffff00000000l 12073 }; 12074 #endif 12075 /* The order of the curve P256 minus 2. */ 12076 static sp_digit p256_order2[4] = { 12077 0xf3b9cac2fc63254fl,0xbce6faada7179e84l,0xffffffffffffffffl, 12078 0xffffffff00000000l 12079 }; 12080 #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY) 12081 /* The Montogmery normalizer for order of the curve P256. */ 12082 static sp_digit p256_norm_order[4] = { 12083 0x0c46353d039cdaafl,0x4319055258e8617bl,0x0000000000000000l, 12084 0x00000000ffffffffl 12085 }; 12086 #endif 12087 #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY) 12088 /* The Montogmery multiplier for order of the curve P256. */ 12089 static sp_digit p256_mp_order = 0xccd1c8aaee00bc4fl; 12090 #endif 12091 #ifdef WOLFSSL_SP_SMALL 12092 /* The base point of curve P256. */ 12093 static sp_point p256_base = { 12094 /* X ordinate */ 12095 { 12096 0xf4a13945d898c296l,0x77037d812deb33a0l,0xf8bce6e563a440f2l, 12097 0x6b17d1f2e12c4247l 12098 }, 12099 /* Y ordinate */ 12100 { 12101 0xcbb6406837bf51f5l,0x2bce33576b315ecel,0x8ee7eb4a7c0f9e16l, 12102 0x4fe342e2fe1a7f9bl 12103 }, 12104 /* Z ordinate */ 12105 { 12106 0x0000000000000001l,0x0000000000000000l,0x0000000000000000l, 12107 0x0000000000000000l 12108 }, 12109 /* infinity */ 12110 0 12111 }; 12112 #endif /* WOLFSSL_SP_SMALL */ 12113 #if defined(HAVE_ECC_CHECK_KEY) || defined(HAVE_COMP_KEY) 12114 static sp_digit p256_b[4] = { 12115 0x3bce3c3e27d2604bl,0x651d06b0cc53b0f6l,0xb3ebbd55769886bcl, 12116 0x5ac635d8aa3a93e7l 12117 }; 12118 #endif 12119 12120 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK) 12121 /* Allocate memory for point and return error. */ 12122 #define sp_ecc_point_new(heap, sp, p) \ 12123 ((p = XMALLOC(sizeof(sp_point), heap, DYNAMIC_TYPE_ECC)) == NULL) ? \ 12124 MEMORY_E : MP_OKAY 12125 #else 12126 /* Set pointer to data and return no error. */ 12127 #define sp_ecc_point_new(heap, sp, p) ((p = &sp) == NULL) ? MEMORY_E : MP_OKAY 12128 #endif 12129 12130 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK) 12131 /* If valid pointer then clear point data if requested and free data. */ 12132 #define sp_ecc_point_free(p, clear, heap) \ 12133 do { \ 12134 if (p != NULL) { \ 12135 if (clear) \ 12136 XMEMSET(p, 0, sizeof(*p)); \ 12137 XFREE(p, heap, DYNAMIC_TYPE_ECC); \ 12138 } \ 12139 } \ 12140 while (0) 12141 #else 12142 /* Clear point data if requested. */ 12143 #define sp_ecc_point_free(p, clear, heap) \ 12144 do { \ 12145 if (clear) \ 12146 XMEMSET(p, 0, sizeof(*p)); \ 12147 } \ 12148 while (0) 12149 #endif 12150 12151 /* Multiply a number by Montogmery normalizer mod modulus (prime). 12152 * 12153 * r The resulting Montgomery form number. 12154 * a The number to convert. 12155 * m The modulus (prime). 12156 */ 12157 static int sp_256_mod_mul_norm_4(sp_digit* r, sp_digit* a, sp_digit* m) 12158 { 12159 int64_t t[8]; 12160 int64_t a32[8]; 12161 int64_t o; 12162 12163 (void)m; 12164 12165 a32[0] = a[0] & 0xffffffff; 12166 a32[1] = a[0] >> 32; 12167 a32[2] = a[1] & 0xffffffff; 12168 a32[3] = a[1] >> 32; 12169 a32[4] = a[2] & 0xffffffff; 12170 a32[5] = a[2] >> 32; 12171 a32[6] = a[3] & 0xffffffff; 12172 a32[7] = a[3] >> 32; 12173 12174 /* 1 1 0 -1 -1 -1 -1 0 */ 12175 t[0] = 0 + a32[0] + a32[1] - a32[3] - a32[4] - a32[5] - a32[6]; 12176 /* 0 1 1 0 -1 -1 -1 -1 */ 12177 t[1] = 0 + a32[1] + a32[2] - a32[4] - a32[5] - a32[6] - a32[7]; 12178 /* 0 0 1 1 0 -1 -1 -1 */ 12179 t[2] = 0 + a32[2] + a32[3] - a32[5] - a32[6] - a32[7]; 12180 /* -1 -1 0 2 2 1 0 -1 */ 12181 t[3] = 0 - a32[0] - a32[1] + 2 * a32[3] + 2 * a32[4] + a32[5] - a32[7]; 12182 /* 0 -1 -1 0 2 2 1 0 */ 12183 t[4] = 0 - a32[1] - a32[2] + 2 * a32[4] + 2 * a32[5] + a32[6]; 12184 /* 0 0 -1 -1 0 2 2 1 */ 12185 t[5] = 0 - a32[2] - a32[3] + 2 * a32[5] + 2 * a32[6] + a32[7]; 12186 /* -1 -1 0 0 0 1 3 2 */ 12187 t[6] = 0 - a32[0] - a32[1] + a32[5] + 3 * a32[6] + 2 * a32[7]; 12188 /* 1 0 -1 -1 -1 -1 0 3 */ 12189 t[7] = 0 + a32[0] - a32[2] - a32[3] - a32[4] - a32[5] + 3 * a32[7]; 12190 12191 t[1] += t[0] >> 32; t[0] &= 0xffffffff; 12192 t[2] += t[1] >> 32; t[1] &= 0xffffffff; 12193 t[3] += t[2] >> 32; t[2] &= 0xffffffff; 12194 t[4] += t[3] >> 32; t[3] &= 0xffffffff; 12195 t[5] += t[4] >> 32; t[4] &= 0xffffffff; 12196 t[6] += t[5] >> 32; t[5] &= 0xffffffff; 12197 t[7] += t[6] >> 32; t[6] &= 0xffffffff; 12198 o = t[7] >> 32; t[7] &= 0xffffffff; 12199 t[0] += o; 12200 t[3] -= o; 12201 t[6] -= o; 12202 t[7] += o; 12203 t[1] += t[0] >> 32; t[0] &= 0xffffffff; 12204 t[2] += t[1] >> 32; t[1] &= 0xffffffff; 12205 t[3] += t[2] >> 32; t[2] &= 0xffffffff; 12206 t[4] += t[3] >> 32; t[3] &= 0xffffffff; 12207 t[5] += t[4] >> 32; t[4] &= 0xffffffff; 12208 t[6] += t[5] >> 32; t[5] &= 0xffffffff; 12209 t[7] += t[6] >> 32; t[6] &= 0xffffffff; 12210 r[0] = (t[1] << 32) | t[0]; 12211 r[1] = (t[3] << 32) | t[2]; 12212 r[2] = (t[5] << 32) | t[4]; 12213 r[3] = (t[7] << 32) | t[6]; 12214 12215 return MP_OKAY; 12216 } 12217 12218 /* Convert an mp_int to an array of sp_digit. 12219 * 12220 * r A single precision integer. 12221 * a A multi-precision integer. 12222 */ 12223 static void sp_256_from_mp(sp_digit* r, int max, mp_int* a) 12224 { 12225 #if DIGIT_BIT == 64 12226 int j; 12227 12228 XMEMCPY(r, a->dp, sizeof(sp_digit) * a->used); 12229 12230 for (j = a->used; j < max; j++) 12231 r[j] = 0; 12232 #elif DIGIT_BIT > 64 12233 int i, j = 0, s = 0; 12234 12235 r[0] = 0; 12236 for (i = 0; i < a->used && j < max; i++) { 12237 r[j] |= a->dp[i] << s; 12238 r[j] &= 0xffffffffffffffffl; 12239 s = 64 - s; 12240 if (j + 1 >= max) 12241 break; 12242 r[++j] = a->dp[i] >> s; 12243 while (s + 64 <= DIGIT_BIT) { 12244 s += 64; 12245 r[j] &= 0xffffffffffffffffl; 12246 if (j + 1 >= max) 12247 break; 12248 if (s < DIGIT_BIT) 12249 r[++j] = a->dp[i] >> s; 12250 else 12251 r[++j] = 0; 12252 } 12253 s = DIGIT_BIT - s; 12254 } 12255 12256 for (j++; j < max; j++) 12257 r[j] = 0; 12258 #else 12259 int i, j = 0, s = 0; 12260 12261 r[0] = 0; 12262 for (i = 0; i < a->used && j < max; i++) { 12263 r[j] |= ((sp_digit)a->dp[i]) << s; 12264 if (s + DIGIT_BIT >= 64) { 12265 r[j] &= 0xffffffffffffffffl; 12266 if (j + 1 >= max) 12267 break; 12268 s = 64 - s; 12269 if (s == DIGIT_BIT) { 12270 r[++j] = 0; 12271 s = 0; 12272 } 12273 else { 12274 r[++j] = a->dp[i] >> s; 12275 s = DIGIT_BIT - s; 12276 } 12277 } 12278 else 12279 s += DIGIT_BIT; 12280 } 12281 12282 for (j++; j < max; j++) 12283 r[j] = 0; 12284 #endif 12285 } 12286 12287 /* Convert a point of type ecc_point to type sp_point. 12288 * 12289 * p Point of type sp_point (result). 12290 * pm Point of type ecc_point. 12291 */ 12292 static void sp_256_point_from_ecc_point_4(sp_point* p, ecc_point* pm) 12293 { 12294 XMEMSET(p->x, 0, sizeof(p->x)); 12295 XMEMSET(p->y, 0, sizeof(p->y)); 12296 XMEMSET(p->z, 0, sizeof(p->z)); 12297 sp_256_from_mp(p->x, 4, pm->x); 12298 sp_256_from_mp(p->y, 4, pm->y); 12299 sp_256_from_mp(p->z, 4, pm->z); 12300 p->infinity = 0; 12301 } 12302 12303 /* Convert an array of sp_digit to an mp_int. 12304 * 12305 * a A single precision integer. 12306 * r A multi-precision integer. 12307 */ 12308 static int sp_256_to_mp(sp_digit* a, mp_int* r) 12309 { 12310 int err; 12311 12312 err = mp_grow(r, (256 + DIGIT_BIT - 1) / DIGIT_BIT); 12313 if (err == MP_OKAY) { 12314 #if DIGIT_BIT == 64 12315 XMEMCPY(r->dp, a, sizeof(sp_digit) * 4); 12316 r->used = 4; 12317 mp_clamp(r); 12318 #elif DIGIT_BIT < 64 12319 int i, j = 0, s = 0; 12320 12321 r->dp[0] = 0; 12322 for (i = 0; i < 4; i++) { 12323 r->dp[j] |= a[i] << s; 12324 r->dp[j] &= (1l << DIGIT_BIT) - 1; 12325 s = DIGIT_BIT - s; 12326 r->dp[++j] = a[i] >> s; 12327 while (s + DIGIT_BIT <= 64) { 12328 s += DIGIT_BIT; 12329 r->dp[j] &= (1l << DIGIT_BIT) - 1; 12330 r->dp[++j] = a[i] >> s; 12331 } 12332 s = 64 - s; 12333 } 12334 r->used = (256 + DIGIT_BIT - 1) / DIGIT_BIT; 12335 mp_clamp(r); 12336 #else 12337 int i, j = 0, s = 0; 12338 12339 r->dp[0] = 0; 12340 for (i = 0; i < 4; i++) { 12341 r->dp[j] |= ((mp_digit)a[i]) << s; 12342 if (s + 64 >= DIGIT_BIT) { 12343 #if DIGIT_BIT < 64 12344 r->dp[j] &= (1l << DIGIT_BIT) - 1; 12345 #endif 12346 s = DIGIT_BIT - s; 12347 r->dp[++j] = a[i] >> s; 12348 s = 64 - s; 12349 } 12350 else 12351 s += 64; 12352 } 12353 r->used = (256 + DIGIT_BIT - 1) / DIGIT_BIT; 12354 mp_clamp(r); 12355 #endif 12356 } 12357 12358 return err; 12359 } 12360 12361 /* Convert a point of type sp_point to type ecc_point. 12362 * 12363 * p Point of type sp_point. 12364 * pm Point of type ecc_point (result). 12365 * returns MEMORY_E when allocation of memory in ecc_point fails otherwise 12366 * MP_OKAY. 12367 */ 12368 static int sp_256_point_to_ecc_point_4(sp_point* p, ecc_point* pm) 12369 { 12370 int err; 12371 12372 err = sp_256_to_mp(p->x, pm->x); 12373 if (err == MP_OKAY) 12374 err = sp_256_to_mp(p->y, pm->y); 12375 if (err == MP_OKAY) 12376 err = sp_256_to_mp(p->z, pm->z); 12377 12378 return err; 12379 } 12380 12381 /* Conditionally copy a into r using the mask m. 12382 * m is -1 to copy and 0 when not. 12383 * 12384 * r A single precision number to copy over. 12385 * a A single precision number to copy. 12386 * m Mask value to apply. 12387 */ 12388 static void sp_256_cond_copy_4(sp_digit* r, const sp_digit* a, const sp_digit m) 12389 { 12390 __asm__ __volatile__ ( 12391 "ldp x3, x4, [%[r], 0]\n\t" 12392 "ldp x5, x6, [%[r], 16]\n\t" 12393 "ldp x7, x8, [%[a], 0]\n\t" 12394 "ldp x9, x10, [%[a], 16]\n\t" 12395 "eor x7, x7, x3\n\t" 12396 "eor x8, x8, x4\n\t" 12397 "eor x9, x9, x5\n\t" 12398 "eor x10, x10, x6\n\t" 12399 "and x7, x7, %[m]\n\t" 12400 "and x8, x8, %[m]\n\t" 12401 "and x9, x9, %[m]\n\t" 12402 "and x10, x10, %[m]\n\t" 12403 "eor x3, x3, x7\n\t" 12404 "eor x4, x4, x8\n\t" 12405 "eor x5, x5, x9\n\t" 12406 "eor x6, x6, x10\n\t" 12407 "stp x3, x4, [%[r], 0]\n\t" 12408 "stp x5, x6, [%[r], 16]\n\t" 12409 : 12410 : [r] "r" (r), [a] "r" (a), [m] "r" (m) 12411 : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10" 12412 ); 12413 } 12414 12415 /* Compare a with b in constant time. 12416 * 12417 * a A single precision integer. 12418 * b A single precision integer. 12419 * return -ve, 0 or +ve if a is less than, equal to or greater than b 12420 * respectively. 12421 */ 12422 static int64_t sp_256_cmp_4(sp_digit* a, sp_digit* b) 12423 { 12424 sp_digit r = -1; 12425 sp_digit one = 1; 12426 12427 #ifdef WOLFSSL_SP_SMALL 12428 __asm__ __volatile__ ( 12429 "mov x3, -1\n\t" 12430 "mov x6, 24\n\t" 12431 "1:\n\t" 12432 "ldr x4, [%[a], x6]\n\t" 12433 "ldr x5, [%[b], x6]\n\t" 12434 "and x4, x4, x3\n\t" 12435 "and x5, x5, x3\n\t" 12436 "subs x4, x4, x5\n\t" 12437 "csel %[r], %[one], %[r], hi\n\t" 12438 "csel %[r], x3, %[r], lo\n\t" 12439 "csel x3, x3, xzr, eq\n\t" 12440 "sub x6, x6, #8\n\t" 12441 "b.cc 1b\n\t" 12442 "eor %[r], %[r], x3\n\t" 12443 : [r] "+r" (r) 12444 : [a] "r" (a), [b] "r" (b), [one] "r" (one) 12445 : "x2", "x3", "x4", "x5", "x6" 12446 ); 12447 #else 12448 __asm__ __volatile__ ( 12449 "mov x3, -1\n\t" 12450 "ldr x4, [%[a], 24]\n\t" 12451 "ldr x5, [%[b], 24]\n\t" 12452 "and x4, x4, x3\n\t" 12453 "and x5, x5, x3\n\t" 12454 "subs x4, x4, x5\n\t" 12455 "csel %[r], %[one], %[r], hi\n\t" 12456 "csel %[r], x3, %[r], lo\n\t" 12457 "csel x3, x3, xzr, eq\n\t" 12458 "ldr x4, [%[a], 16]\n\t" 12459 "ldr x5, [%[b], 16]\n\t" 12460 "and x4, x4, x3\n\t" 12461 "and x5, x5, x3\n\t" 12462 "subs x4, x4, x5\n\t" 12463 "csel %[r], %[one], %[r], hi\n\t" 12464 "csel %[r], x3, %[r], lo\n\t" 12465 "csel x3, x3, xzr, eq\n\t" 12466 "ldr x4, [%[a], 8]\n\t" 12467 "ldr x5, [%[b], 8]\n\t" 12468 "and x4, x4, x3\n\t" 12469 "and x5, x5, x3\n\t" 12470 "subs x4, x4, x5\n\t" 12471 "csel %[r], %[one], %[r], hi\n\t" 12472 "csel %[r], x3, %[r], lo\n\t" 12473 "csel x3, x3, xzr, eq\n\t" 12474 "ldr x4, [%[a], 0]\n\t" 12475 "ldr x5, [%[b], 0]\n\t" 12476 "and x4, x4, x3\n\t" 12477 "and x5, x5, x3\n\t" 12478 "subs x4, x4, x5\n\t" 12479 "csel %[r], %[one], %[r], hi\n\t" 12480 "csel %[r], x3, %[r], lo\n\t" 12481 "csel x3, x3, xzr, eq\n\t" 12482 "eor %[r], %[r], x3\n\t" 12483 : [r] "+r" (r) 12484 : [a] "r" (a), [b] "r" (b), [one] "r" (one) 12485 : "x2", "x3", "x4", "x5", "x6" 12486 ); 12487 #endif 12488 12489 return r; 12490 } 12491 12492 /* Normalize the values in each word to 64. 12493 * 12494 * a Array of sp_digit to normalize. 12495 */ 12496 #define sp_256_norm_4(a) 12497 12498 /* Conditionally subtract b from a using the mask m. 12499 * m is -1 to subtract and 0 when not copying. 12500 * 12501 * r A single precision number representing condition subtract result. 12502 * a A single precision number to subtract from. 12503 * b A single precision number to subtract. 12504 * m Mask value to apply. 12505 */ 12506 static sp_digit sp_256_cond_sub_4(sp_digit* r, sp_digit* a, sp_digit* b, 12507 sp_digit m) 12508 { 12509 sp_digit c = 0; 12510 12511 __asm__ __volatile__ ( 12512 12513 "ldr x4, [%[a], 0]\n\t" 12514 "ldr x6, [%[a], 8]\n\t" 12515 "ldr x5, [%[b], 0]\n\t" 12516 "ldr x7, [%[b], 8]\n\t" 12517 "and x5, x5, %[m]\n\t" 12518 "and x7, x7, %[m]\n\t" 12519 "subs x4, x4, x5\n\t" 12520 "sbcs x6, x6, x7\n\t" 12521 "str x4, [%[r], 0]\n\t" 12522 "str x6, [%[r], 8]\n\t" 12523 "ldr x4, [%[a], 16]\n\t" 12524 "ldr x6, [%[a], 24]\n\t" 12525 "ldr x5, [%[b], 16]\n\t" 12526 "ldr x7, [%[b], 24]\n\t" 12527 "and x5, x5, %[m]\n\t" 12528 "and x7, x7, %[m]\n\t" 12529 "sbcs x4, x4, x5\n\t" 12530 "sbcs x6, x6, x7\n\t" 12531 "str x4, [%[r], 16]\n\t" 12532 "str x6, [%[r], 24]\n\t" 12533 "csetm %[c], cc\n\t" 12534 : [c] "+r" (c) 12535 : [r] "r" (r), [a] "r" (a), [b] "r" (b), [m] "r" (m) 12536 : "memory", "x4", "x6", "x5", "x7", "x8" 12537 ); 12538 12539 return c; 12540 } 12541 12542 /* Sub b from a into r. (r = a - b) 12543 * 12544 * r A single precision integer. 12545 * a A single precision integer. 12546 * b A single precision integer. 12547 */ 12548 static sp_digit sp_256_sub_4(sp_digit* r, const sp_digit* a, 12549 const sp_digit* b) 12550 { 12551 sp_digit c = 0; 12552 12553 __asm__ __volatile__ ( 12554 "ldp x3, x4, [%[a], 0]\n\t" 12555 "ldp x5, x6, [%[a], 16]\n\t" 12556 "ldp x7, x8, [%[b], 0]\n\t" 12557 "ldp x9, x10, [%[b], 16]\n\t" 12558 "subs x3, x3, x7\n\t" 12559 "sbcs x4, x4, x8\n\t" 12560 "sbcs x5, x5, x9\n\t" 12561 "sbcs x6, x6, x10\n\t" 12562 "stp x3, x4, [%[r], 0]\n\t" 12563 "stp x5, x6, [%[r], 16]\n\t" 12564 "csetm %[c], cc\n\t" 12565 : [c] "+r" (c) 12566 : [r] "r" (r), [a] "r" (a), [b] "r" (b) 12567 : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10" 12568 ); 12569 12570 return c; 12571 } 12572 12573 /* Reduce the number back to 256 bits using Montgomery reduction. 12574 * 12575 * a A single precision number to reduce in place. 12576 * m The single precision number representing the modulus. 12577 * mp The digit representing the negative inverse of m mod 2^n. 12578 */ 12579 SP_NOINLINE static void sp_256_mont_reduce_4(sp_digit* a, sp_digit* m, 12580 sp_digit mp) 12581 { 12582 __asm__ __volatile__ ( 12583 "# i = 0\n\t" 12584 "mov x9, xzr\n\t" 12585 "mov x8, xzr\n\t" 12586 "mov x6, %[a]\n\t" 12587 "\n1:\n\t" 12588 "# mu = a[i] * mp\n\t" 12589 "ldr x5, [x6, 0]\n\t" 12590 "mov x7, x5\n\t" 12591 "mul x5, %[mp], x5\n\t" 12592 "# a[i+0] += m[0] * mu\n\t" 12593 "ldr x4, [%[m], 0]\n\t" 12594 "ldr x11, [%[m], 8]\n\t" 12595 "mul x3, x4, x5\n\t" 12596 "umulh x10, x4, x5\n\t" 12597 "adds x7, x7, x3\n\t" 12598 "str x7, [x6, 0]\n\t" 12599 "adc x10, x10, xzr\n\t" 12600 "# a[i+1] += m[1] * mu\n\t" 12601 "mul x3, x11, x5\n\t" 12602 "umulh x12, x11, x5\n\t" 12603 "ldr x11, [%[m], 16]\n\t" 12604 "ldr x7, [x6, 8]\n\t" 12605 "adds x3, x3, x10\n\t" 12606 "adc x12, x12, xzr\n\t" 12607 "adds x7, x7, x3\n\t" 12608 "str x7, [x6, 8]\n\t" 12609 "adc x12, x12, xzr\n\t" 12610 "# a[i+2] += m[2] * mu\n\t" 12611 "mul x3, x11, x5\n\t" 12612 "umulh x10, x11, x5\n\t" 12613 "ldr x11, [%[m], 24]\n\t" 12614 "ldr x7, [x6, 16]\n\t" 12615 "adds x3, x3, x12\n\t" 12616 "adc x10, x10, xzr\n\t" 12617 "adds x7, x7, x3\n\t" 12618 "str x7, [x6, 16]\n\t" 12619 "adc x10, x10, xzr\n\t" 12620 "# a[i+3] += m[3] * mu\n\t" 12621 "mul x3, x11, x5\n\t" 12622 "umulh x4, x11, x5\n\t" 12623 "ldr x7, [x6, 24]\n\t" 12624 "ldr x12, [x6, 32]\n\t" 12625 "adds x3, x3, x10\n\t" 12626 "adcs x4, x4, x9\n\t" 12627 "cset x9, cs\n\t" 12628 "adds x7, x7, x3\n\t" 12629 "str x7, [x6, 24]\n\t" 12630 "adcs x12, x12, x4\n\t" 12631 "str x12, [x6, 32]\n\t" 12632 "adc x9, x9, xzr\n\t" 12633 "# i += 1\n\t" 12634 "add x6, x6, 8\n\t" 12635 "add x8, x8, 8\n\t" 12636 "cmp x8, 32\n\t" 12637 "b.lt 1b\n\t" 12638 "ldr x5, [%[a], 32]\n\t" 12639 "ldr x6, [%[a], 40]\n\t" 12640 "ldr x7, [%[a], 48]\n\t" 12641 "ldr x8, [%[a], 56]\n\t" 12642 "sub x3, xzr, x9\n\t" 12643 "ldr x9, [%[m], 0]\n\t" 12644 "ldr x10, [%[m], 8]\n\t" 12645 "ldr x11, [%[m], 16]\n\t" 12646 "ldr x12, [%[m], 24]\n\t" 12647 "and x9, x9, x3\n\t" 12648 "and x10, x10, x3\n\t" 12649 "and x11, x11, x3\n\t" 12650 "and x12, x12, x3\n\t" 12651 "subs x5, x5, x9\n\t" 12652 "sbcs x6, x6, x10\n\t" 12653 "sbcs x7, x7, x11\n\t" 12654 "sbc x8, x8, x12\n\t" 12655 "str x5, [%[a], 0]\n\t" 12656 "str x6, [%[a], 8]\n\t" 12657 "str x7, [%[a], 16]\n\t" 12658 "str x8, [%[a], 24]\n\t" 12659 : 12660 : [a] "r" (a), [m] "r" (m), [mp] "r" (mp) 12661 : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", 12662 "x12" 12663 ); 12664 } 12665 12666 /* Multiply two Montogmery form numbers mod the modulus (prime). 12667 * (r = a * b mod m) 12668 * 12669 * r Result of multiplication. 12670 * a First number to multiply in Montogmery form. 12671 * b Second number to multiply in Montogmery form. 12672 * m Modulus (prime). 12673 * mp Montogmery mulitplier. 12674 */ 12675 SP_NOINLINE static void sp_256_mont_mul_4(sp_digit* r, sp_digit* a, sp_digit* b, 12676 sp_digit* m, sp_digit mp) 12677 { 12678 (void)mp; 12679 12680 __asm__ __volatile__ ( 12681 "ldr x18, [%[a], 0]\n\t" 12682 "ldr x19, [%[a], 8]\n\t" 12683 "ldr x20, [%[a], 16]\n\t" 12684 "ldr x21, [%[a], 24]\n\t" 12685 "ldr x22, [%[b], 0]\n\t" 12686 "ldr x23, [%[b], 8]\n\t" 12687 "ldr x24, [%[b], 16]\n\t" 12688 "ldr x25, [%[b], 24]\n\t" 12689 "# A[0] * B[0]\n\t" 12690 "mul x10, x18, x22\n\t" 12691 "umulh x11, x18, x22\n\t" 12692 "# A[0] * B[1]\n\t" 12693 "mul x5, x18, x23\n\t" 12694 "umulh x6, x18, x23\n\t" 12695 "adds x11, x11, x5\n\t" 12696 "adc x12, xzr, x6\n\t" 12697 "# A[1] * B[0]\n\t" 12698 "mul x5, x19, x22\n\t" 12699 "umulh x6, x19, x22\n\t" 12700 "adds x11, x11, x5\n\t" 12701 "adcs x12, x12, x6\n\t" 12702 "adc x13, xzr, xzr\n\t" 12703 "# A[0] * B[2]\n\t" 12704 "mul x5, x18, x24\n\t" 12705 "umulh x6, x18, x24\n\t" 12706 "adds x12, x12, x5\n\t" 12707 "adc x13, x13, x6\n\t" 12708 "# A[1] * B[1]\n\t" 12709 "mul x5, x19, x23\n\t" 12710 "umulh x6, x19, x23\n\t" 12711 "adds x12, x12, x5\n\t" 12712 "adcs x13, x13, x6\n\t" 12713 "adc x14, xzr, xzr\n\t" 12714 "# A[2] * B[0]\n\t" 12715 "mul x5, x20, x22\n\t" 12716 "umulh x6, x20, x22\n\t" 12717 "adds x12, x12, x5\n\t" 12718 "adcs x13, x13, x6\n\t" 12719 "adc x14, x14, xzr\n\t" 12720 "# A[0] * B[3]\n\t" 12721 "mul x5, x18, x25\n\t" 12722 "umulh x6, x18, x25\n\t" 12723 "adds x13, x13, x5\n\t" 12724 "adcs x14, x14, x6\n\t" 12725 "adc x15, xzr, xzr\n\t" 12726 "# A[1] * B[2]\n\t" 12727 "mul x5, x19, x24\n\t" 12728 "umulh x6, x19, x24\n\t" 12729 "adds x13, x13, x5\n\t" 12730 "adcs x14, x14, x6\n\t" 12731 "adc x15, x15, xzr\n\t" 12732 "# A[2] * B[1]\n\t" 12733 "mul x5, x20, x23\n\t" 12734 "umulh x6, x20, x23\n\t" 12735 "adds x13, x13, x5\n\t" 12736 "adcs x14, x14, x6\n\t" 12737 "adc x15, x15, xzr\n\t" 12738 "# A[3] * B[0]\n\t" 12739 "mul x5, x21, x22\n\t" 12740 "umulh x6, x21, x22\n\t" 12741 "adds x13, x13, x5\n\t" 12742 "adcs x14, x14, x6\n\t" 12743 "adc x15, x15, xzr\n\t" 12744 "# A[1] * B[3]\n\t" 12745 "mul x5, x19, x25\n\t" 12746 "umulh x6, x19, x25\n\t" 12747 "adds x14, x14, x5\n\t" 12748 "adcs x15, x15, x6\n\t" 12749 "adc x16, xzr, xzr\n\t" 12750 "# A[2] * B[2]\n\t" 12751 "mul x5, x20, x24\n\t" 12752 "umulh x6, x20, x24\n\t" 12753 "adds x14, x14, x5\n\t" 12754 "adcs x15, x15, x6\n\t" 12755 "adc x16, x16, xzr\n\t" 12756 "# A[3] * B[1]\n\t" 12757 "mul x5, x21, x23\n\t" 12758 "umulh x6, x21, x23\n\t" 12759 "adds x14, x14, x5\n\t" 12760 "adcs x15, x15, x6\n\t" 12761 "adc x16, x16, xzr\n\t" 12762 "# A[2] * B[3]\n\t" 12763 "mul x5, x20, x25\n\t" 12764 "umulh x6, x20, x25\n\t" 12765 "adds x15, x15, x5\n\t" 12766 "adcs x16, x16, x6\n\t" 12767 "adc x17, xzr, xzr\n\t" 12768 "# A[3] * B[2]\n\t" 12769 "mul x5, x21, x24\n\t" 12770 "umulh x6, x21, x24\n\t" 12771 "adds x15, x15, x5\n\t" 12772 "adcs x16, x16, x6\n\t" 12773 "adc x17, x17, xzr\n\t" 12774 "# A[3] * B[3]\n\t" 12775 "mul x5, x21, x25\n\t" 12776 "umulh x6, x21, x25\n\t" 12777 "adds x16, x16, x5\n\t" 12778 "adc x17, x17, x6\n\t" 12779 "# Start Reduction\n\t" 12780 "mov x5, x10\n\t" 12781 "mov x6, x11\n\t" 12782 "mov x7, x12\n\t" 12783 "mov x8, x13\n\t" 12784 "# mu = a[0]-a[3] + a[0]-a[2] << 32 << 64 + (a[0] * 2) << 192\n\t" 12785 "# - a[0] << 32 << 192\n\t" 12786 "# + (a[0] * 2) << 192\n\t" 12787 "add x8, x8, x10\n\t" 12788 "add x8, x8, x10\n\t" 12789 "# a[0]-a[2] << 32\n\t" 12790 "lsl x10, x10, 32\n\t" 12791 "lsr x18, x5, 32\n\t" 12792 "lsl x11, x6, 32\n\t" 12793 "lsr x19, x6, 32\n\t" 12794 "lsl x12, x7, 32\n\t" 12795 "eor x11, x11, x18\n\t" 12796 "eor x12, x12, x19\n\t" 12797 "# - a[0] << 32 << 192\n\t" 12798 "sub x8, x8, x10\n\t" 12799 "# + a[0]-a[2] << 32 << 64\n\t" 12800 "adds x6, x6, x10\n\t" 12801 "adcs x7, x7, x11\n\t" 12802 "adc x8, x8, x12\n\t" 12803 "# a += (mu << 256) - (mu << 224) + (mu << 192) + (mu << 96) - mu\n\t" 12804 "# a += mu << 256\n\t" 12805 "adds x14, x14, x5\n\t" 12806 "adcs x15, x15, x6\n\t" 12807 "adcs x16, x16, x7\n\t" 12808 "adcs x17, x17, x8\n\t" 12809 "csetm x10, cs\n\t" 12810 "# a += mu << 192\n\t" 12811 "adds x13, x13, x5\n\t" 12812 "adcs x14, x14, x6\n\t" 12813 "adcs x15, x15, x7\n\t" 12814 "adcs x16, x16, x8\n\t" 12815 "adcs x17, x17, xzr\n\t" 12816 "csetm x20, cs\n\t" 12817 "add x10, x10, x20\n\t" 12818 "# mu <<= 32\n\t" 12819 "lsr x9, x8, 32\n\t" 12820 "lsr x18, x5, 32\n\t" 12821 "lsl x5, x5, 32\n\t" 12822 "lsr x19, x6, 32\n\t" 12823 "lsl x6, x6, 32\n\t" 12824 "lsr x20, x7, 32\n\t" 12825 "lsl x7, x7, 32\n\t" 12826 "lsl x8, x8, 32\n\t" 12827 "eor x6, x6, x18\n\t" 12828 "eor x7, x7, x19\n\t" 12829 "eor x8, x8, x20\n\t" 12830 "# a += (mu << 32) << 64\n\t" 12831 "adds x13, x13, x7\n\t" 12832 "adcs x14, x14, x8\n\t" 12833 "adcs x15, x15, x9\n\t" 12834 "adcs x16, x16, xzr\n\t" 12835 "adcs x17, x17, xzr\n\t" 12836 "csetm x20, cs\n\t" 12837 "add x10, x10, x20\n\t" 12838 "# a -= (mu << 32) << 192\n\t" 12839 "subs x13, x13, x5\n\t" 12840 "mov x18, 0xffffffff\n\t" 12841 "sbcs x14, x14, x6\n\t" 12842 "mov x19, 0xffffffff00000001\n\t" 12843 "sbcs x15, x15, x7\n\t" 12844 "sbcs x16, x16, x8\n\t" 12845 "sbcs x17, x17, x9\n\t" 12846 "cset x20, cc\n\t" 12847 "add x10, x10, x20\n\t" 12848 "# mask m and sub from result if overflow\n\t" 12849 "# m[0] = -1 & mask = mask\n\t" 12850 "and x18, x18, x10\n\t" 12851 "# m[2] = 0 & mask = 0\n\t" 12852 "and x19, x19, x10\n\t" 12853 "subs x14, x14, x10\n\t" 12854 "sbcs x15, x15, x18\n\t" 12855 "sbcs x16, x16, xzr\n\t" 12856 "sbc x17, x17, x19\n\t" 12857 "str x14, [%[r], 0]\n\t" 12858 "str x15, [%[r], 8]\n\t" 12859 "str x16, [%[r], 16]\n\t" 12860 "str x17, [%[r], 24]\n\t" 12861 : [m] "+r" (m), [a] "+r" (a), [b] "+r" (b) 12862 : [r] "r" (r) 12863 : "memory", "x5", "x6", "x7", "x8", "x9", 12864 "x18", "x19", "x20", "x21", 12865 "x22", "x23", "x24", "x25", 12866 "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17" 12867 ); 12868 } 12869 12870 /* Square the Montgomery form number mod the modulus (prime). (r = a * a mod m) 12871 * 12872 * r Result of squaring. 12873 * a Number to square in Montogmery form. 12874 * m Modulus (prime). 12875 * mp Montogmery mulitplier. 12876 */ 12877 SP_NOINLINE static void sp_256_mont_sqr_4(sp_digit* r, sp_digit* a, sp_digit* m, 12878 sp_digit mp) 12879 { 12880 __asm__ __volatile__ ( 12881 "ldr x18, [%[a], 0]\n\t" 12882 "ldr x19, [%[a], 8]\n\t" 12883 "ldr x20, [%[a], 16]\n\t" 12884 "ldr x21, [%[a], 24]\n\t" 12885 "# A[0] * A[1]\n\t" 12886 "mul x11, x18, x19\n\t" 12887 "umulh x12, x18, x19\n\t" 12888 "# A[0] * A[2]\n\t" 12889 "mul x5, x18, x20\n\t" 12890 "umulh x6, x18, x20\n\t" 12891 "adds x12, x12, x5\n\t" 12892 "adc x13, xzr, x6\n\t" 12893 "# A[0] * A[3]\n\t" 12894 "mul x5, x18, x21\n\t" 12895 "umulh x6, x18, x21\n\t" 12896 "adds x13, x13, x5\n\t" 12897 "adc x14, xzr, x6\n\t" 12898 "# A[1] * A[2]\n\t" 12899 "mul x5, x19, x20\n\t" 12900 "umulh x6, x19, x20\n\t" 12901 "adds x13, x13, x5\n\t" 12902 "adcs x14, x14, x6\n\t" 12903 "adc x15, xzr, xzr\n\t" 12904 "# A[1] * A[3]\n\t" 12905 "mul x5, x19, x21\n\t" 12906 "umulh x6, x19, x21\n\t" 12907 "adds x14, x14, x5\n\t" 12908 "adc x15, x15, x6\n\t" 12909 "# A[2] * A[3]\n\t" 12910 "mul x5, x20, x21\n\t" 12911 "umulh x6, x20, x21\n\t" 12912 "adds x15, x15, x5\n\t" 12913 "adc x16, xzr, x6\n\t" 12914 "# Double\n\t" 12915 "adds x11, x11, x11\n\t" 12916 "adcs x12, x12, x12\n\t" 12917 "adcs x13, x13, x13\n\t" 12918 "adcs x14, x14, x14\n\t" 12919 "adcs x15, x15, x15\n\t" 12920 "adcs x16, x16, x16\n\t" 12921 "cset x17, cs\n\t" 12922 "# A[0] * A[0]\n\t" 12923 "mul x10, x18, x18\n\t" 12924 "umulh x4, x18, x18\n\t" 12925 "# A[1] * A[1]\n\t" 12926 "mul x5, x19, x19\n\t" 12927 "umulh x6, x19, x19\n\t" 12928 "# A[2] * A[2]\n\t" 12929 "mul x7, x20, x20\n\t" 12930 "umulh x8, x20, x20\n\t" 12931 "# A[3] * A[3]\n\t" 12932 "mul x9, x21, x21\n\t" 12933 "umulh x18, x21, x21\n\t" 12934 "adds x11, x11, x4\n\t" 12935 "adcs x12, x12, x5\n\t" 12936 "adcs x13, x13, x6\n\t" 12937 "adcs x14, x14, x7\n\t" 12938 "adcs x15, x15, x8\n\t" 12939 "adcs x16, x16, x9\n\t" 12940 "adc x17, x17, x18\n\t" 12941 "# Start Reduction\n\t" 12942 "mov x5, x10\n\t" 12943 "mov x6, x11\n\t" 12944 "mov x7, x12\n\t" 12945 "mov x8, x13\n\t" 12946 "# mu = a[0]-a[3] + a[0]-a[2] << 32 << 64 + (a[0] * 2) << 192\n\t" 12947 "# - a[0] << 32 << 192\n\t" 12948 "# + (a[0] * 2) << 192\n\t" 12949 "add x8, x8, x10\n\t" 12950 "add x8, x8, x10\n\t" 12951 "# a[0]-a[2] << 32\n\t" 12952 "lsl x10, x10, 32\n\t" 12953 "lsr x18, x5, 32\n\t" 12954 "lsl x11, x6, 32\n\t" 12955 "lsr x19, x6, 32\n\t" 12956 "lsl x12, x7, 32\n\t" 12957 "eor x11, x11, x18\n\t" 12958 "eor x12, x12, x19\n\t" 12959 "# - a[0] << 32 << 192\n\t" 12960 "sub x8, x8, x10\n\t" 12961 "# + a[0]-a[2] << 32 << 64\n\t" 12962 "adds x6, x6, x10\n\t" 12963 "adcs x7, x7, x11\n\t" 12964 "adc x8, x8, x12\n\t" 12965 "# a += (mu << 256) - (mu << 224) + (mu << 192) + (mu << 96) - mu\n\t" 12966 "# a += mu << 256\n\t" 12967 "adds x14, x14, x5\n\t" 12968 "adcs x15, x15, x6\n\t" 12969 "adcs x16, x16, x7\n\t" 12970 "adcs x17, x17, x8\n\t" 12971 "csetm x10, cs\n\t" 12972 "# a += mu << 192\n\t" 12973 "adds x13, x13, x5\n\t" 12974 "adcs x14, x14, x6\n\t" 12975 "adcs x15, x15, x7\n\t" 12976 "adcs x16, x16, x8\n\t" 12977 "adcs x17, x17, xzr\n\t" 12978 "csetm x20, cs\n\t" 12979 "add x10, x10, x20\n\t" 12980 "# mu <<= 32\n\t" 12981 "lsr x9, x8, 32\n\t" 12982 "lsr x18, x5, 32\n\t" 12983 "lsl x5, x5, 32\n\t" 12984 "lsr x19, x6, 32\n\t" 12985 "lsl x6, x6, 32\n\t" 12986 "lsr x20, x7, 32\n\t" 12987 "lsl x7, x7, 32\n\t" 12988 "lsl x8, x8, 32\n\t" 12989 "eor x6, x6, x18\n\t" 12990 "eor x7, x7, x19\n\t" 12991 "eor x8, x8, x20\n\t" 12992 "# a += (mu << 32) << 64\n\t" 12993 "adds x13, x13, x7\n\t" 12994 "adcs x14, x14, x8\n\t" 12995 "adcs x15, x15, x9\n\t" 12996 "adcs x16, x16, xzr\n\t" 12997 "adcs x17, x17, xzr\n\t" 12998 "csetm x20, cs\n\t" 12999 "add x10, x10, x20\n\t" 13000 "# a -= (mu << 32) << 192\n\t" 13001 "subs x13, x13, x5\n\t" 13002 "mov x18, 0xffffffff\n\t" 13003 "sbcs x14, x14, x6\n\t" 13004 "mov x19, 0xffffffff00000001\n\t" 13005 "sbcs x15, x15, x7\n\t" 13006 "sbcs x16, x16, x8\n\t" 13007 "sbcs x17, x17, x9\n\t" 13008 "cset x20, cc\n\t" 13009 "add x10, x10, x20\n\t" 13010 "# mask m and sub from result if overflow\n\t" 13011 "# m[0] = -1 & mask = mask\n\t" 13012 "and x18, x18, x10\n\t" 13013 "# m[2] = 0 & mask = 0\n\t" 13014 "and x19, x19, x10\n\t" 13015 "subs x14, x14, x10\n\t" 13016 "sbcs x15, x15, x18\n\t" 13017 "sbcs x16, x16, xzr\n\t" 13018 "sbc x17, x17, x19\n\t" 13019 "str x14, [%[r], 0]\n\t" 13020 "str x15, [%[r], 8]\n\t" 13021 "str x16, [%[r], 16]\n\t" 13022 "str x17, [%[r], 24]\n\t" 13023 : [m] "+r" (m), [a] "+r" (a), [mp] "+r" (mp) 13024 : [r] "r" (r) 13025 : "memory", "x4", "x5", "x6", "x7", "x8", "x9", 13026 "x18", "x19", "x20", "x21", 13027 "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17" 13028 ); 13029 } 13030 13031 #ifndef WOLFSSL_SP_SMALL 13032 /* Square the Montgomery form number a number of times. (r = a ^ n mod m) 13033 * 13034 * r Result of squaring. 13035 * a Number to square in Montogmery form. 13036 * n Number of times to square. 13037 * m Modulus (prime). 13038 * mp Montogmery mulitplier. 13039 */ 13040 static void sp_256_mont_sqr_n_4(sp_digit* r, sp_digit* a, int n, 13041 sp_digit* m, sp_digit mp) 13042 { 13043 sp_256_mont_sqr_4(r, a, m, mp); 13044 for (; n > 1; n--) 13045 sp_256_mont_sqr_4(r, r, m, mp); 13046 } 13047 13048 #else 13049 /* Mod-2 for the P256 curve. */ 13050 static const uint64_t p256_mod_2[4] = { 13051 0xfffffffffffffffd,0x00000000ffffffff,0x0000000000000000, 13052 0xffffffff00000001 13053 }; 13054 #endif /* !WOLFSSL_SP_SMALL */ 13055 13056 /* Invert the number, in Montgomery form, modulo the modulus (prime) of the 13057 * P256 curve. (r = 1 / a mod m) 13058 * 13059 * r Inverse result. 13060 * a Number to invert. 13061 * td Temporary data. 13062 */ 13063 static void sp_256_mont_inv_4(sp_digit* r, sp_digit* a, sp_digit* td) 13064 { 13065 #ifdef WOLFSSL_SP_SMALL 13066 sp_digit* t = td; 13067 int i; 13068 13069 XMEMCPY(t, a, sizeof(sp_digit) * 4); 13070 for (i=254; i>=0; i--) { 13071 sp_256_mont_sqr_4(t, t, p256_mod, p256_mp_mod); 13072 if (p256_mod_2[i / 64] & ((sp_digit)1 << (i % 64))) 13073 sp_256_mont_mul_4(t, t, a, p256_mod, p256_mp_mod); 13074 } 13075 XMEMCPY(r, t, sizeof(sp_digit) * 4); 13076 #else 13077 sp_digit* t = td; 13078 sp_digit* t2 = td + 2 * 4; 13079 sp_digit* t3 = td + 4 * 4; 13080 13081 /* t = a^2 */ 13082 sp_256_mont_sqr_4(t, a, p256_mod, p256_mp_mod); 13083 /* t = a^3 = t * a */ 13084 sp_256_mont_mul_4(t, t, a, p256_mod, p256_mp_mod); 13085 /* t2= a^c = t ^ 2 ^ 2 */ 13086 sp_256_mont_sqr_n_4(t2, t, 2, p256_mod, p256_mp_mod); 13087 /* t3= a^d = t2 * a */ 13088 sp_256_mont_mul_4(t3, t2, a, p256_mod, p256_mp_mod); 13089 /* t = a^f = t2 * t */ 13090 sp_256_mont_mul_4(t, t2, t, p256_mod, p256_mp_mod); 13091 /* t2= a^f0 = t ^ 2 ^ 4 */ 13092 sp_256_mont_sqr_n_4(t2, t, 4, p256_mod, p256_mp_mod); 13093 /* t3= a^fd = t2 * t3 */ 13094 sp_256_mont_mul_4(t3, t2, t3, p256_mod, p256_mp_mod); 13095 /* t = a^ff = t2 * t */ 13096 sp_256_mont_mul_4(t, t2, t, p256_mod, p256_mp_mod); 13097 /* t2= a^ff00 = t ^ 2 ^ 8 */ 13098 sp_256_mont_sqr_n_4(t2, t, 8, p256_mod, p256_mp_mod); 13099 /* t3= a^fffd = t2 * t3 */ 13100 sp_256_mont_mul_4(t3, t2, t3, p256_mod, p256_mp_mod); 13101 /* t = a^ffff = t2 * t */ 13102 sp_256_mont_mul_4(t, t2, t, p256_mod, p256_mp_mod); 13103 /* t2= a^ffff0000 = t ^ 2 ^ 16 */ 13104 sp_256_mont_sqr_n_4(t2, t, 16, p256_mod, p256_mp_mod); 13105 /* t3= a^fffffffd = t2 * t3 */ 13106 sp_256_mont_mul_4(t3, t2, t3, p256_mod, p256_mp_mod); 13107 /* t = a^ffffffff = t2 * t */ 13108 sp_256_mont_mul_4(t, t2, t, p256_mod, p256_mp_mod); 13109 /* t = a^ffffffff00000000 = t ^ 2 ^ 32 */ 13110 sp_256_mont_sqr_n_4(t2, t, 32, p256_mod, p256_mp_mod); 13111 /* t2= a^ffffffffffffffff = t2 * t */ 13112 sp_256_mont_mul_4(t, t2, t, p256_mod, p256_mp_mod); 13113 /* t2= a^ffffffff00000001 = t2 * a */ 13114 sp_256_mont_mul_4(t2, t2, a, p256_mod, p256_mp_mod); 13115 /* t2= a^ffffffff000000010000000000000000000000000000000000000000 13116 * = t2 ^ 2 ^ 160 */ 13117 sp_256_mont_sqr_n_4(t2, t2, 160, p256_mod, p256_mp_mod); 13118 /* t2= a^ffffffff00000001000000000000000000000000ffffffffffffffff 13119 * = t2 * t */ 13120 sp_256_mont_mul_4(t2, t2, t, p256_mod, p256_mp_mod); 13121 /* t2= a^ffffffff00000001000000000000000000000000ffffffffffffffff00000000 13122 * = t2 ^ 2 ^ 32 */ 13123 sp_256_mont_sqr_n_4(t2, t2, 32, p256_mod, p256_mp_mod); 13124 /* r = a^ffffffff00000001000000000000000000000000fffffffffffffffffffffffd 13125 * = t2 * t3 */ 13126 sp_256_mont_mul_4(r, t2, t3, p256_mod, p256_mp_mod); 13127 #endif /* WOLFSSL_SP_SMALL */ 13128 } 13129 13130 /* Map the Montgomery form projective co-ordinate point to an affine point. 13131 * 13132 * r Resulting affine co-ordinate point. 13133 * p Montgomery form projective co-ordinate point. 13134 * t Temporary ordinate data. 13135 */ 13136 static void sp_256_map_4(sp_point* r, sp_point* p, sp_digit* t) 13137 { 13138 sp_digit* t1 = t; 13139 sp_digit* t2 = t + 2*4; 13140 int64_t n; 13141 13142 sp_256_mont_inv_4(t1, p->z, t + 2*4); 13143 13144 sp_256_mont_sqr_4(t2, t1, p256_mod, p256_mp_mod); 13145 sp_256_mont_mul_4(t1, t2, t1, p256_mod, p256_mp_mod); 13146 13147 /* x /= z^2 */ 13148 sp_256_mont_mul_4(r->x, p->x, t2, p256_mod, p256_mp_mod); 13149 XMEMSET(r->x + 4, 0, sizeof(r->x) / 2); 13150 sp_256_mont_reduce_4(r->x, p256_mod, p256_mp_mod); 13151 /* Reduce x to less than modulus */ 13152 n = sp_256_cmp_4(r->x, p256_mod); 13153 sp_256_cond_sub_4(r->x, r->x, p256_mod, 0 - (n >= 0)); 13154 sp_256_norm_4(r->x); 13155 13156 /* y /= z^3 */ 13157 sp_256_mont_mul_4(r->y, p->y, t1, p256_mod, p256_mp_mod); 13158 XMEMSET(r->y + 4, 0, sizeof(r->y) / 2); 13159 sp_256_mont_reduce_4(r->y, p256_mod, p256_mp_mod); 13160 /* Reduce y to less than modulus */ 13161 n = sp_256_cmp_4(r->y, p256_mod); 13162 sp_256_cond_sub_4(r->y, r->y, p256_mod, 0 - (n >= 0)); 13163 sp_256_norm_4(r->y); 13164 13165 XMEMSET(r->z, 0, sizeof(r->z)); 13166 r->z[0] = 1; 13167 13168 } 13169 13170 /* Add two Montgomery form numbers (r = a + b % m). 13171 * 13172 * r Result of addition. 13173 * a First number to add in Montogmery form. 13174 * b Second number to add in Montogmery form. 13175 * m Modulus (prime). 13176 */ 13177 static void sp_256_mont_add_4(sp_digit* r, sp_digit* a, sp_digit* b, 13178 sp_digit* m) 13179 { 13180 __asm__ __volatile__ ( 13181 "ldr x4, [%[a],0]\n\t" 13182 "ldr x5, [%[a],8]\n\t" 13183 "ldr x6, [%[a],16]\n\t" 13184 "ldr x7, [%[a],24]\n\t" 13185 "ldr x8, [%[b],0]\n\t" 13186 "ldr x9, [%[b],8]\n\t" 13187 "ldr x10, [%[b],16]\n\t" 13188 "ldr x11, [%[b],24]\n\t" 13189 "adds x4, x4, x8\n\t" 13190 "adcs x5, x5, x9\n\t" 13191 "mov x12, 0xffffffff\n\t" 13192 "adcs x6, x6, x10\n\t" 13193 "adcs x7, x7, x11\n\t" 13194 "mov x13, 0xffffffff00000001\n\t" 13195 "csetm x14, cs\n\t" 13196 "and x12, x12, x14\n\t" 13197 "and x13, x13, x14\n\t" 13198 "subs x4, x4, x14\n\t" 13199 "sbcs x5, x5, x12\n\t" 13200 "str x4, [%[r],0]\n\t" 13201 "sbcs x6, x6, xzr\n\t" 13202 "str x5, [%[r],8]\n\t" 13203 "sbc x7, x7, x13\n\t" 13204 "str x6, [%[r],16]\n\t" 13205 "str x7, [%[r],24]\n\t" 13206 : 13207 : [r] "r" (r), [a] "r" (a), [b] "r" (b), [m] "r" (m) 13208 : "memory", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14" 13209 ); 13210 } 13211 13212 /* Double a Montgomery form number (r = a + a % m). 13213 * 13214 * r Result of doubling. 13215 * a Number to double in Montogmery form. 13216 * m Modulus (prime). 13217 */ 13218 static void sp_256_mont_dbl_4(sp_digit* r, sp_digit* a, sp_digit* m) 13219 { 13220 __asm__ __volatile__ ( 13221 "ldr x3, [%[a]]\n\t" 13222 "ldr x4, [%[a],8]\n\t" 13223 "ldr x5, [%[a],16]\n\t" 13224 "ldr x6, [%[a],24]\n\t" 13225 "adds x3, x3, x3\n\t" 13226 "adcs x4, x4, x4\n\t" 13227 "mov x7, 0xffffffff\n\t" 13228 "adcs x5, x5, x5\n\t" 13229 "mov x8, 0xffffffff00000001\n\t" 13230 "adcs x6, x6, x6\n\t" 13231 "csetm x9, cs\n\t" 13232 "and x7, x7, x9\n\t" 13233 "and x8, x8, x9\n\t" 13234 "subs x3, x3, x9\n\t" 13235 "sbcs x4, x4, x7\n\t" 13236 "str x3, [%[r],0]\n\t" 13237 "sbcs x5, x5, xzr\n\t" 13238 "str x4, [%[r],8]\n\t" 13239 "sbc x6, x6, x8\n\t" 13240 "str x5, [%[r],16]\n\t" 13241 "str x6, [%[r],24]\n\t" 13242 : 13243 : [r] "r" (r), [a] "r" (a) 13244 : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9" 13245 ); 13246 13247 (void)m; 13248 } 13249 13250 /* Triple a Montgomery form number (r = a + a + a % m). 13251 * 13252 * r Result of Tripling. 13253 * a Number to triple in Montogmery form. 13254 * m Modulus (prime). 13255 */ 13256 static void sp_256_mont_tpl_4(sp_digit* r, sp_digit* a, sp_digit* m) 13257 { 13258 __asm__ __volatile__ ( 13259 "ldr x10, [%[a]]\n\t" 13260 "ldr x11, [%[a],8]\n\t" 13261 "ldr x12, [%[a],16]\n\t" 13262 "ldr x13, [%[a],24]\n\t" 13263 "adds x3, x10, x10\n\t" 13264 "adcs x4, x11, x11\n\t" 13265 "mov x7, 0xffffffff\n\t" 13266 "adcs x5, x12, x12\n\t" 13267 "mov x8, 0xffffffff00000001\n\t" 13268 "adcs x6, x13, x13\n\t" 13269 "csetm x9, cs\n\t" 13270 "and x7, x7, x9\n\t" 13271 "and x8, x8, x9\n\t" 13272 "subs x3, x3, x9\n\t" 13273 "sbcs x4, x4, x7\n\t" 13274 "sbcs x5, x5, xzr\n\t" 13275 "sbc x6, x6, x8\n\t" 13276 "adds x3, x3, x10\n\t" 13277 "adcs x4, x4, x11\n\t" 13278 "mov x7, 0xffffffff\n\t" 13279 "adcs x5, x5, x12\n\t" 13280 "mov x8, 0xffffffff00000001\n\t" 13281 "adcs x6, x6, x13\n\t" 13282 "csetm x9, cs\n\t" 13283 "and x7, x7, x9\n\t" 13284 "and x8, x8, x9\n\t" 13285 "subs x3, x3, x9\n\t" 13286 "sbcs x4, x4, x7\n\t" 13287 "sbcs x5, x5, xzr\n\t" 13288 "sbc x6, x6, x8\n\t" 13289 "str x3, [%[r], 0]\n\t" 13290 "str x4, [%[r], 8]\n\t" 13291 "str x5, [%[r], 16]\n\t" 13292 "str x6, [%[r], 24]\n\t" 13293 : 13294 : [r] "r" (r), [a] "r" (a) 13295 : "memory", "x10", "x11", "x12", "x13", "x3", "x4", "x5", "x6", "x7", "x8", "x9" 13296 ); 13297 13298 (void)m; 13299 } 13300 13301 /* Subtract two Montgomery form numbers (r = a - b % m). 13302 * 13303 * r Result of subtration. 13304 * a Number to subtract from in Montogmery form. 13305 * b Number to subtract with in Montogmery form. 13306 * m Modulus (prime). 13307 */ 13308 static void sp_256_mont_sub_4(sp_digit* r, sp_digit* a, sp_digit* b, 13309 sp_digit* m) 13310 { 13311 __asm__ __volatile__ ( 13312 "ldr x4, [%[a],0]\n\t" 13313 "ldr x5, [%[a],8]\n\t" 13314 "ldr x6, [%[a],16]\n\t" 13315 "ldr x7, [%[a],24]\n\t" 13316 "ldr x8, [%[b],0]\n\t" 13317 "ldr x9, [%[b],8]\n\t" 13318 "ldr x10, [%[b],16]\n\t" 13319 "ldr x11, [%[b],24]\n\t" 13320 "subs x4, x4, x8\n\t" 13321 "sbcs x5, x5, x9\n\t" 13322 "mov x12, 0xffffffff\n\t" 13323 "sbcs x6, x6, x10\n\t" 13324 "sbcs x7, x7, x11\n\t" 13325 "mov x13, 0xffffffff00000001\n\t" 13326 "csetm x14, cc\n\t" 13327 "and x12, x12, x14\n\t" 13328 "and x13, x13, x14\n\t" 13329 "adds x4, x4, x14\n\t" 13330 "adcs x5, x5, x12\n\t" 13331 "str x4, [%[r],0]\n\t" 13332 "adcs x6, x6, xzr\n\t" 13333 "str x5, [%[r],8]\n\t" 13334 "adc x7, x7, x13\n\t" 13335 "str x6, [%[r],16]\n\t" 13336 "str x7, [%[r],24]\n\t" 13337 : 13338 : [r] "r" (r), [a] "r" (a), [b] "r" (b), [m] "r" (m) 13339 : "memory", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14" 13340 ); 13341 } 13342 13343 /* Divide the number by 2 mod the modulus (prime). (r = a / 2 % m) 13344 * 13345 * r Result of division by 2. 13346 * a Number to divide. 13347 * m Modulus (prime). 13348 */ 13349 static void sp_256_div2_4(sp_digit* r, sp_digit* a, sp_digit* m) 13350 { 13351 __asm__ __volatile__ ( 13352 "ldr x3, [%[a], 0]\n\t" 13353 "ldr x4, [%[a], 8]\n\t" 13354 "ldr x5, [%[a], 16]\n\t" 13355 "ldr x6, [%[a], 24]\n\t" 13356 "and x9, x3, 1\n\t" 13357 "sub x10, xzr, x9\n\t" 13358 "and x7, x10, 0xffffffff\n\t" 13359 "and x8, x10, 0xffffffff00000001\n\t" 13360 "adds x3, x3, x10\n\t" 13361 "adcs x4, x4, x7\n\t" 13362 "adcs x5, x5, xzr\n\t" 13363 "adcs x6, x6, x8\n\t" 13364 "cset x9, cs\n\t" 13365 "lsr x3, x3, 1\n\t" 13366 "lsr x7, x4, 1\n\t" 13367 "lsr x8, x5, 1\n\t" 13368 "lsr x10, x6, 1\n\t" 13369 "orr x3, x3, x4, lsl 63\n\t" 13370 "orr x4, x7, x5, lsl 63\n\t" 13371 "orr x5, x8, x6, lsl 63\n\t" 13372 "orr x6, x10, x9, lsl 63\n\t" 13373 "str x3, [%[r], 0]\n\t" 13374 "str x4, [%[r], 8]\n\t" 13375 "str x5, [%[r], 16]\n\t" 13376 "str x6, [%[r], 24]\n\t" 13377 : 13378 : [r] "r" (r), [a] "r" (a), [m] "r" (m) 13379 : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10" 13380 ); 13381 13382 } 13383 13384 /* Double the Montgomery form projective point p. 13385 * 13386 * r Result of doubling point. 13387 * p Point to double. 13388 * t Temporary ordinate data. 13389 */ 13390 static void sp_256_proj_point_dbl_4(sp_point* r, sp_point* p, sp_digit* t) 13391 { 13392 sp_point *rp[2]; 13393 sp_point tp; 13394 sp_digit* t1 = t; 13395 sp_digit* t2 = t + 2*4; 13396 sp_digit* x; 13397 sp_digit* y; 13398 sp_digit* z; 13399 int i; 13400 13401 /* When infinity don't double point passed in - constant time. */ 13402 rp[0] = r; 13403 rp[1] = &tp; 13404 x = rp[p->infinity]->x; 13405 y = rp[p->infinity]->y; 13406 z = rp[p->infinity]->z; 13407 /* Put point to double into result - good for infinty. */ 13408 if (r != p) { 13409 for (i=0; i<4; i++) 13410 r->x[i] = p->x[i]; 13411 for (i=0; i<4; i++) 13412 r->y[i] = p->y[i]; 13413 for (i=0; i<4; i++) 13414 r->z[i] = p->z[i]; 13415 r->infinity = p->infinity; 13416 } 13417 13418 /* T1 = Z * Z */ 13419 sp_256_mont_sqr_4(t1, z, p256_mod, p256_mp_mod); 13420 /* Z = Y * Z */ 13421 sp_256_mont_mul_4(z, y, z, p256_mod, p256_mp_mod); 13422 /* Z = 2Z */ 13423 sp_256_mont_dbl_4(z, z, p256_mod); 13424 /* T2 = X - T1 */ 13425 sp_256_mont_sub_4(t2, x, t1, p256_mod); 13426 /* T1 = X + T1 */ 13427 sp_256_mont_add_4(t1, x, t1, p256_mod); 13428 /* T2 = T1 * T2 */ 13429 sp_256_mont_mul_4(t2, t1, t2, p256_mod, p256_mp_mod); 13430 /* T1 = 3T2 */ 13431 sp_256_mont_tpl_4(t1, t2, p256_mod); 13432 /* Y = 2Y */ 13433 sp_256_mont_dbl_4(y, y, p256_mod); 13434 /* Y = Y * Y */ 13435 sp_256_mont_sqr_4(y, y, p256_mod, p256_mp_mod); 13436 /* T2 = Y * Y */ 13437 sp_256_mont_sqr_4(t2, y, p256_mod, p256_mp_mod); 13438 /* T2 = T2/2 */ 13439 sp_256_div2_4(t2, t2, p256_mod); 13440 /* Y = Y * X */ 13441 sp_256_mont_mul_4(y, y, x, p256_mod, p256_mp_mod); 13442 /* X = T1 * T1 */ 13443 sp_256_mont_mul_4(x, t1, t1, p256_mod, p256_mp_mod); 13444 /* X = X - Y */ 13445 sp_256_mont_sub_4(x, x, y, p256_mod); 13446 /* X = X - Y */ 13447 sp_256_mont_sub_4(x, x, y, p256_mod); 13448 /* Y = Y - X */ 13449 sp_256_mont_sub_4(y, y, x, p256_mod); 13450 /* Y = Y * T1 */ 13451 sp_256_mont_mul_4(y, y, t1, p256_mod, p256_mp_mod); 13452 /* Y = Y - T2 */ 13453 sp_256_mont_sub_4(y, y, t2, p256_mod); 13454 13455 } 13456 13457 /* Double the Montgomery form projective point p a number of times. 13458 * 13459 * r Result of repeated doubling of point. 13460 * p Point to double. 13461 * n Number of times to double 13462 * t Temporary ordinate data. 13463 */ 13464 static void sp_256_proj_point_dbl_n_4(sp_point* r, sp_point* p, int n, 13465 sp_digit* t) 13466 { 13467 sp_point *rp[2]; 13468 sp_point tp; 13469 sp_digit* w = t; 13470 sp_digit* a = t + 2*4; 13471 sp_digit* b = t + 4*4; 13472 sp_digit* t1 = t + 6*4; 13473 sp_digit* t2 = t + 8*4; 13474 sp_digit* x; 13475 sp_digit* y; 13476 sp_digit* z; 13477 int i; 13478 13479 rp[0] = r; 13480 rp[1] = &tp; 13481 x = rp[p->infinity]->x; 13482 y = rp[p->infinity]->y; 13483 z = rp[p->infinity]->z; 13484 if (r != p) { 13485 for (i=0; i<4; i++) 13486 r->x[i] = p->x[i]; 13487 for (i=0; i<4; i++) 13488 r->y[i] = p->y[i]; 13489 for (i=0; i<4; i++) 13490 r->z[i] = p->z[i]; 13491 r->infinity = p->infinity; 13492 } 13493 13494 /* Y = 2*Y */ 13495 sp_256_mont_dbl_4(y, y, p256_mod); 13496 /* W = Z^4 */ 13497 sp_256_mont_sqr_4(w, z, p256_mod, p256_mp_mod); 13498 sp_256_mont_sqr_4(w, w, p256_mod, p256_mp_mod); 13499 while (n--) { 13500 /* A = 3*(X^2 - W) */ 13501 sp_256_mont_sqr_4(t1, x, p256_mod, p256_mp_mod); 13502 sp_256_mont_sub_4(t1, t1, w, p256_mod); 13503 sp_256_mont_tpl_4(a, t1, p256_mod); 13504 /* B = X*Y^2 */ 13505 sp_256_mont_sqr_4(t2, y, p256_mod, p256_mp_mod); 13506 sp_256_mont_mul_4(b, t2, x, p256_mod, p256_mp_mod); 13507 /* X = A^2 - 2B */ 13508 sp_256_mont_sqr_4(x, a, p256_mod, p256_mp_mod); 13509 sp_256_mont_dbl_4(t1, b, p256_mod); 13510 sp_256_mont_sub_4(x, x, t1, p256_mod); 13511 /* Z = Z*Y */ 13512 sp_256_mont_mul_4(z, z, y, p256_mod, p256_mp_mod); 13513 /* t2 = Y^4 */ 13514 sp_256_mont_sqr_4(t2, t2, p256_mod, p256_mp_mod); 13515 if (n) { 13516 /* W = W*Y^4 */ 13517 sp_256_mont_mul_4(w, w, t2, p256_mod, p256_mp_mod); 13518 } 13519 /* y = 2*A*(B - X) - Y^4 */ 13520 sp_256_mont_sub_4(y, b, x, p256_mod); 13521 sp_256_mont_mul_4(y, y, a, p256_mod, p256_mp_mod); 13522 sp_256_mont_dbl_4(y, y, p256_mod); 13523 sp_256_mont_sub_4(y, y, t2, p256_mod); 13524 } 13525 /* Y = Y/2 */ 13526 sp_256_div2_4(y, y, p256_mod); 13527 } 13528 13529 /* Compare two numbers to determine if they are equal. 13530 * Constant time implementation. 13531 * 13532 * a First number to compare. 13533 * b Second number to compare. 13534 * returns 1 when equal and 0 otherwise. 13535 */ 13536 static int sp_256_cmp_equal_4(const sp_digit* a, const sp_digit* b) 13537 { 13538 return ((a[0] ^ b[0]) | (a[1] ^ b[1]) | (a[2] ^ b[2]) | (a[3] ^ b[3])) == 0; 13539 } 13540 13541 /* Add two Montgomery form projective points. 13542 * 13543 * r Result of addition. 13544 * p Frist point to add. 13545 * q Second point to add. 13546 * t Temporary ordinate data. 13547 */ 13548 static void sp_256_proj_point_add_4(sp_point* r, sp_point* p, sp_point* q, 13549 sp_digit* t) 13550 { 13551 sp_point *ap[2]; 13552 sp_point *rp[2]; 13553 sp_point tp; 13554 sp_digit* t1 = t; 13555 sp_digit* t2 = t + 2*4; 13556 sp_digit* t3 = t + 4*4; 13557 sp_digit* t4 = t + 6*4; 13558 sp_digit* t5 = t + 8*4; 13559 sp_digit* x; 13560 sp_digit* y; 13561 sp_digit* z; 13562 int i; 13563 13564 /* Ensure only the first point is the same as the result. */ 13565 if (q == r) { 13566 sp_point* a = p; 13567 p = q; 13568 q = a; 13569 } 13570 13571 /* Check double */ 13572 sp_256_sub_4(t1, p256_mod, q->y); 13573 sp_256_norm_4(t1); 13574 if (sp_256_cmp_equal_4(p->x, q->x) & sp_256_cmp_equal_4(p->z, q->z) & 13575 (sp_256_cmp_equal_4(p->y, q->y) | sp_256_cmp_equal_4(p->y, t1))) { 13576 sp_256_proj_point_dbl_4(r, p, t); 13577 } 13578 else { 13579 rp[0] = r; 13580 rp[1] = &tp; 13581 XMEMSET(&tp, 0, sizeof(tp)); 13582 x = rp[p->infinity | q->infinity]->x; 13583 y = rp[p->infinity | q->infinity]->y; 13584 z = rp[p->infinity | q->infinity]->z; 13585 13586 ap[0] = p; 13587 ap[1] = q; 13588 for (i=0; i<4; i++) 13589 r->x[i] = ap[p->infinity]->x[i]; 13590 for (i=0; i<4; i++) 13591 r->y[i] = ap[p->infinity]->y[i]; 13592 for (i=0; i<4; i++) 13593 r->z[i] = ap[p->infinity]->z[i]; 13594 r->infinity = ap[p->infinity]->infinity; 13595 13596 /* U1 = X1*Z2^2 */ 13597 sp_256_mont_sqr_4(t1, q->z, p256_mod, p256_mp_mod); 13598 sp_256_mont_mul_4(t3, t1, q->z, p256_mod, p256_mp_mod); 13599 sp_256_mont_mul_4(t1, t1, x, p256_mod, p256_mp_mod); 13600 /* U2 = X2*Z1^2 */ 13601 sp_256_mont_sqr_4(t2, z, p256_mod, p256_mp_mod); 13602 sp_256_mont_mul_4(t4, t2, z, p256_mod, p256_mp_mod); 13603 sp_256_mont_mul_4(t2, t2, q->x, p256_mod, p256_mp_mod); 13604 /* S1 = Y1*Z2^3 */ 13605 sp_256_mont_mul_4(t3, t3, y, p256_mod, p256_mp_mod); 13606 /* S2 = Y2*Z1^3 */ 13607 sp_256_mont_mul_4(t4, t4, q->y, p256_mod, p256_mp_mod); 13608 /* H = U2 - U1 */ 13609 sp_256_mont_sub_4(t2, t2, t1, p256_mod); 13610 /* R = S2 - S1 */ 13611 sp_256_mont_sub_4(t4, t4, t3, p256_mod); 13612 /* Z3 = H*Z1*Z2 */ 13613 sp_256_mont_mul_4(z, z, q->z, p256_mod, p256_mp_mod); 13614 sp_256_mont_mul_4(z, z, t2, p256_mod, p256_mp_mod); 13615 /* X3 = R^2 - H^3 - 2*U1*H^2 */ 13616 sp_256_mont_sqr_4(x, t4, p256_mod, p256_mp_mod); 13617 sp_256_mont_sqr_4(t5, t2, p256_mod, p256_mp_mod); 13618 sp_256_mont_mul_4(y, t1, t5, p256_mod, p256_mp_mod); 13619 sp_256_mont_mul_4(t5, t5, t2, p256_mod, p256_mp_mod); 13620 sp_256_mont_sub_4(x, x, t5, p256_mod); 13621 sp_256_mont_dbl_4(t1, y, p256_mod); 13622 sp_256_mont_sub_4(x, x, t1, p256_mod); 13623 /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ 13624 sp_256_mont_sub_4(y, y, x, p256_mod); 13625 sp_256_mont_mul_4(y, y, t4, p256_mod, p256_mp_mod); 13626 sp_256_mont_mul_4(t5, t5, t3, p256_mod, p256_mp_mod); 13627 sp_256_mont_sub_4(y, y, t5, p256_mod); 13628 } 13629 } 13630 13631 /* Double the Montgomery form projective point p a number of times. 13632 * 13633 * r Result of repeated doubling of point. 13634 * p Point to double. 13635 * n Number of times to double 13636 * t Temporary ordinate data. 13637 */ 13638 static void sp_256_proj_point_dbl_n_store_4(sp_point* r, sp_point* p, 13639 int n, int m, sp_digit* t) 13640 { 13641 sp_digit* w = t; 13642 sp_digit* a = t + 2*4; 13643 sp_digit* b = t + 4*4; 13644 sp_digit* t1 = t + 6*4; 13645 sp_digit* t2 = t + 8*4; 13646 sp_digit* x = r[2*m].x; 13647 sp_digit* y = r[(1<<n)*m].y; 13648 sp_digit* z = r[2*m].z; 13649 int i; 13650 13651 for (i=0; i<4; i++) 13652 x[i] = p->x[i]; 13653 for (i=0; i<4; i++) 13654 y[i] = p->y[i]; 13655 for (i=0; i<4; i++) 13656 z[i] = p->z[i]; 13657 13658 /* Y = 2*Y */ 13659 sp_256_mont_dbl_4(y, y, p256_mod); 13660 /* W = Z^4 */ 13661 sp_256_mont_sqr_4(w, z, p256_mod, p256_mp_mod); 13662 sp_256_mont_sqr_4(w, w, p256_mod, p256_mp_mod); 13663 for (i=1; i<=n; i++) { 13664 /* A = 3*(X^2 - W) */ 13665 sp_256_mont_sqr_4(t1, x, p256_mod, p256_mp_mod); 13666 sp_256_mont_sub_4(t1, t1, w, p256_mod); 13667 sp_256_mont_tpl_4(a, t1, p256_mod); 13668 /* B = X*Y^2 */ 13669 sp_256_mont_sqr_4(t2, y, p256_mod, p256_mp_mod); 13670 sp_256_mont_mul_4(b, t2, x, p256_mod, p256_mp_mod); 13671 x = r[(1<<i)*m].x; 13672 /* X = A^2 - 2B */ 13673 sp_256_mont_sqr_4(x, a, p256_mod, p256_mp_mod); 13674 sp_256_mont_dbl_4(t1, b, p256_mod); 13675 sp_256_mont_sub_4(x, x, t1, p256_mod); 13676 /* Z = Z*Y */ 13677 sp_256_mont_mul_4(r[(1<<i)*m].z, z, y, p256_mod, p256_mp_mod); 13678 z = r[(1<<i)*m].z; 13679 /* t2 = Y^4 */ 13680 sp_256_mont_sqr_4(t2, t2, p256_mod, p256_mp_mod); 13681 if (i != n) { 13682 /* W = W*Y^4 */ 13683 sp_256_mont_mul_4(w, w, t2, p256_mod, p256_mp_mod); 13684 } 13685 /* y = 2*A*(B - X) - Y^4 */ 13686 sp_256_mont_sub_4(y, b, x, p256_mod); 13687 sp_256_mont_mul_4(y, y, a, p256_mod, p256_mp_mod); 13688 sp_256_mont_dbl_4(y, y, p256_mod); 13689 sp_256_mont_sub_4(y, y, t2, p256_mod); 13690 13691 /* Y = Y/2 */ 13692 sp_256_div2_4(r[(1<<i)*m].y, y, p256_mod); 13693 r[(1<<i)*m].infinity = 0; 13694 } 13695 } 13696 13697 /* Add two Montgomery form projective points. 13698 * 13699 * ra Result of addition. 13700 * rs Result of subtraction. 13701 * p Frist point to add. 13702 * q Second point to add. 13703 * t Temporary ordinate data. 13704 */ 13705 static void sp_256_proj_point_add_sub_4(sp_point* ra, sp_point* rs, 13706 sp_point* p, sp_point* q, sp_digit* t) 13707 { 13708 sp_digit* t1 = t; 13709 sp_digit* t2 = t + 2*4; 13710 sp_digit* t3 = t + 4*4; 13711 sp_digit* t4 = t + 6*4; 13712 sp_digit* t5 = t + 8*4; 13713 sp_digit* t6 = t + 10*4; 13714 sp_digit* x = ra->x; 13715 sp_digit* y = ra->y; 13716 sp_digit* z = ra->z; 13717 sp_digit* xs = rs->x; 13718 sp_digit* ys = rs->y; 13719 sp_digit* zs = rs->z; 13720 13721 13722 XMEMCPY(x, p->x, sizeof(p->x) / 2); 13723 XMEMCPY(y, p->y, sizeof(p->y) / 2); 13724 XMEMCPY(z, p->z, sizeof(p->z) / 2); 13725 ra->infinity = 0; 13726 rs->infinity = 0; 13727 13728 /* U1 = X1*Z2^2 */ 13729 sp_256_mont_sqr_4(t1, q->z, p256_mod, p256_mp_mod); 13730 sp_256_mont_mul_4(t3, t1, q->z, p256_mod, p256_mp_mod); 13731 sp_256_mont_mul_4(t1, t1, x, p256_mod, p256_mp_mod); 13732 /* U2 = X2*Z1^2 */ 13733 sp_256_mont_sqr_4(t2, z, p256_mod, p256_mp_mod); 13734 sp_256_mont_mul_4(t4, t2, z, p256_mod, p256_mp_mod); 13735 sp_256_mont_mul_4(t2, t2, q->x, p256_mod, p256_mp_mod); 13736 /* S1 = Y1*Z2^3 */ 13737 sp_256_mont_mul_4(t3, t3, y, p256_mod, p256_mp_mod); 13738 /* S2 = Y2*Z1^3 */ 13739 sp_256_mont_mul_4(t4, t4, q->y, p256_mod, p256_mp_mod); 13740 /* H = U2 - U1 */ 13741 sp_256_mont_sub_4(t2, t2, t1, p256_mod); 13742 /* RS = S2 + S1 */ 13743 sp_256_mont_add_4(t6, t4, t3, p256_mod); 13744 /* R = S2 - S1 */ 13745 sp_256_mont_sub_4(t4, t4, t3, p256_mod); 13746 /* Z3 = H*Z1*Z2 */ 13747 /* ZS = H*Z1*Z2 */ 13748 sp_256_mont_mul_4(z, z, q->z, p256_mod, p256_mp_mod); 13749 sp_256_mont_mul_4(z, z, t2, p256_mod, p256_mp_mod); 13750 XMEMCPY(zs, z, sizeof(p->z)/2); 13751 /* X3 = R^2 - H^3 - 2*U1*H^2 */ 13752 /* XS = RS^2 - H^3 - 2*U1*H^2 */ 13753 sp_256_mont_sqr_4(x, t4, p256_mod, p256_mp_mod); 13754 sp_256_mont_sqr_4(xs, t6, p256_mod, p256_mp_mod); 13755 sp_256_mont_sqr_4(t5, t2, p256_mod, p256_mp_mod); 13756 sp_256_mont_mul_4(y, t1, t5, p256_mod, p256_mp_mod); 13757 sp_256_mont_mul_4(t5, t5, t2, p256_mod, p256_mp_mod); 13758 sp_256_mont_sub_4(x, x, t5, p256_mod); 13759 sp_256_mont_sub_4(xs, xs, t5, p256_mod); 13760 sp_256_mont_dbl_4(t1, y, p256_mod); 13761 sp_256_mont_sub_4(x, x, t1, p256_mod); 13762 sp_256_mont_sub_4(xs, xs, t1, p256_mod); 13763 /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ 13764 /* YS = -RS*(U1*H^2 - XS) - S1*H^3 */ 13765 sp_256_mont_sub_4(ys, y, xs, p256_mod); 13766 sp_256_mont_sub_4(y, y, x, p256_mod); 13767 sp_256_mont_mul_4(y, y, t4, p256_mod, p256_mp_mod); 13768 sp_256_sub_4(t6, p256_mod, t6); 13769 sp_256_mont_mul_4(ys, ys, t6, p256_mod, p256_mp_mod); 13770 sp_256_mont_mul_4(t5, t5, t3, p256_mod, p256_mp_mod); 13771 sp_256_mont_sub_4(y, y, t5, p256_mod); 13772 sp_256_mont_sub_4(ys, ys, t5, p256_mod); 13773 } 13774 13775 /* Structure used to describe recoding of scalar multiplication. */ 13776 typedef struct ecc_recode { 13777 /* Index into pre-computation table. */ 13778 uint8_t i; 13779 /* Use the negative of the point. */ 13780 uint8_t neg; 13781 } ecc_recode; 13782 13783 /* The index into pre-computation table to use. */ 13784 static uint8_t recode_index_4_6[66] = { 13785 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 13786 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 13787 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 13788 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 13789 0, 1, 13790 }; 13791 13792 /* Whether to negate y-ordinate. */ 13793 static uint8_t recode_neg_4_6[66] = { 13794 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13795 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13796 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 13797 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 13798 0, 0, 13799 }; 13800 13801 /* Recode the scalar for multiplication using pre-computed values and 13802 * subtraction. 13803 * 13804 * k Scalar to multiply by. 13805 * v Vector of operations to peform. 13806 */ 13807 static void sp_256_ecc_recode_6_4(sp_digit* k, ecc_recode* v) 13808 { 13809 int i, j; 13810 uint8_t y; 13811 int carry = 0; 13812 int o; 13813 sp_digit n; 13814 13815 j = 0; 13816 n = k[j]; 13817 o = 0; 13818 for (i=0; i<43; i++) { 13819 y = n; 13820 if (o + 6 < 64) { 13821 y &= 0x3f; 13822 n >>= 6; 13823 o += 6; 13824 } 13825 else if (o + 6 == 64) { 13826 n >>= 6; 13827 if (++j < 4) 13828 n = k[j]; 13829 o = 0; 13830 } 13831 else if (++j < 4) { 13832 n = k[j]; 13833 y |= (n << (64 - o)) & 0x3f; 13834 o -= 58; 13835 n >>= o; 13836 } 13837 13838 y += carry; 13839 v[i].i = recode_index_4_6[y]; 13840 v[i].neg = recode_neg_4_6[y]; 13841 carry = (y >> 6) + v[i].neg; 13842 } 13843 } 13844 13845 /* Multiply the point by the scalar and return the result. 13846 * If map is true then convert result to affine co-ordinates. 13847 * 13848 * r Resulting point. 13849 * g Point to multiply. 13850 * k Scalar to multiply by. 13851 * map Indicates whether to convert result to affine. 13852 * heap Heap to use for allocation. 13853 * returns MEMORY_E when memory allocation fails and MP_OKAY on success. 13854 */ 13855 static int sp_256_ecc_mulmod_win_add_sub_4(sp_point* r, sp_point* g, 13856 sp_digit* k, int map, void* heap) 13857 { 13858 #if !defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SMALL_STACK) 13859 sp_point td[33]; 13860 sp_point rtd, pd; 13861 sp_digit tmpd[2 * 4 * 6]; 13862 #endif 13863 sp_point* t; 13864 sp_point* rt; 13865 sp_point* p = NULL; 13866 sp_digit* tmp; 13867 sp_digit* negy; 13868 int i; 13869 ecc_recode v[43]; 13870 int err; 13871 13872 (void)heap; 13873 13874 err = sp_ecc_point_new(heap, rtd, rt); 13875 if (err == MP_OKAY) 13876 err = sp_ecc_point_new(heap, pd, p); 13877 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK) 13878 t = (sp_point*)XMALLOC(sizeof(sp_point) * 33, heap, DYNAMIC_TYPE_ECC); 13879 if (t == NULL) 13880 err = MEMORY_E; 13881 tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 4 * 6, heap, 13882 DYNAMIC_TYPE_ECC); 13883 if (tmp == NULL) 13884 err = MEMORY_E; 13885 #else 13886 t = td; 13887 tmp = tmpd; 13888 #endif 13889 13890 13891 if (err == MP_OKAY) { 13892 /* t[0] = {0, 0, 1} * norm */ 13893 XMEMSET(&t[0], 0, sizeof(t[0])); 13894 t[0].infinity = 1; 13895 /* t[1] = {g->x, g->y, g->z} * norm */ 13896 err = sp_256_mod_mul_norm_4(t[1].x, g->x, p256_mod); 13897 } 13898 if (err == MP_OKAY) 13899 err = sp_256_mod_mul_norm_4(t[1].y, g->y, p256_mod); 13900 if (err == MP_OKAY) 13901 err = sp_256_mod_mul_norm_4(t[1].z, g->z, p256_mod); 13902 13903 if (err == MP_OKAY) { 13904 t[1].infinity = 0; 13905 /* t[2] ... t[32] */ 13906 sp_256_proj_point_dbl_n_store_4(t, &t[ 1], 5, 1, tmp); 13907 sp_256_proj_point_add_4(&t[ 3], &t[ 2], &t[ 1], tmp); 13908 sp_256_proj_point_dbl_4(&t[ 6], &t[ 3], tmp); 13909 sp_256_proj_point_add_sub_4(&t[ 7], &t[ 5], &t[ 6], &t[ 1], tmp); 13910 sp_256_proj_point_dbl_4(&t[10], &t[ 5], tmp); 13911 sp_256_proj_point_add_sub_4(&t[11], &t[ 9], &t[10], &t[ 1], tmp); 13912 sp_256_proj_point_dbl_4(&t[12], &t[ 6], tmp); 13913 sp_256_proj_point_dbl_4(&t[14], &t[ 7], tmp); 13914 sp_256_proj_point_add_sub_4(&t[15], &t[13], &t[14], &t[ 1], tmp); 13915 sp_256_proj_point_dbl_4(&t[18], &t[ 9], tmp); 13916 sp_256_proj_point_add_sub_4(&t[19], &t[17], &t[18], &t[ 1], tmp); 13917 sp_256_proj_point_dbl_4(&t[20], &t[10], tmp); 13918 sp_256_proj_point_dbl_4(&t[22], &t[11], tmp); 13919 sp_256_proj_point_add_sub_4(&t[23], &t[21], &t[22], &t[ 1], tmp); 13920 sp_256_proj_point_dbl_4(&t[24], &t[12], tmp); 13921 sp_256_proj_point_dbl_4(&t[26], &t[13], tmp); 13922 sp_256_proj_point_add_sub_4(&t[27], &t[25], &t[26], &t[ 1], tmp); 13923 sp_256_proj_point_dbl_4(&t[28], &t[14], tmp); 13924 sp_256_proj_point_dbl_4(&t[30], &t[15], tmp); 13925 sp_256_proj_point_add_sub_4(&t[31], &t[29], &t[30], &t[ 1], tmp); 13926 13927 negy = t[0].y; 13928 13929 sp_256_ecc_recode_6_4(k, v); 13930 13931 i = 42; 13932 XMEMCPY(rt, &t[v[i].i], sizeof(sp_point)); 13933 for (--i; i>=0; i--) { 13934 sp_256_proj_point_dbl_n_4(rt, rt, 6, tmp); 13935 13936 XMEMCPY(p, &t[v[i].i], sizeof(sp_point)); 13937 sp_256_sub_4(negy, p256_mod, p->y); 13938 sp_256_cond_copy_4(p->y, negy, (sp_digit)0 - v[i].neg); 13939 sp_256_proj_point_add_4(rt, rt, p, tmp); 13940 } 13941 13942 if (map) 13943 sp_256_map_4(r, rt, tmp); 13944 else 13945 XMEMCPY(r, rt, sizeof(sp_point)); 13946 } 13947 13948 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK) 13949 if (t != NULL) 13950 XFREE(t, heap, DYNAMIC_TYPE_ECC); 13951 if (tmp != NULL) 13952 XFREE(tmp, heap, DYNAMIC_TYPE_ECC); 13953 #endif 13954 sp_ecc_point_free(p, 0, heap); 13955 sp_ecc_point_free(rt, 0, heap); 13956 13957 return err; 13958 } 13959 13960 /* A table entry for pre-computed points. */ 13961 typedef struct sp_table_entry { 13962 sp_digit x[4]; 13963 sp_digit y[4]; 13964 byte infinity; 13965 } sp_table_entry; 13966 13967 #if defined(FP_ECC) || defined(WOLFSSL_SP_SMALL) 13968 #endif /* FP_ECC || WOLFSSL_SP_SMALL */ 13969 /* Add two Montgomery form projective points. The second point has a q value of 13970 * one. 13971 * Only the first point can be the same pointer as the result point. 13972 * 13973 * r Result of addition. 13974 * p Frist point to add. 13975 * q Second point to add. 13976 * t Temporary ordinate data. 13977 */ 13978 static void sp_256_proj_point_add_qz1_4(sp_point* r, sp_point* p, 13979 sp_point* q, sp_digit* t) 13980 { 13981 sp_point *ap[2]; 13982 sp_point *rp[2]; 13983 sp_point tp; 13984 sp_digit* t1 = t; 13985 sp_digit* t2 = t + 2*4; 13986 sp_digit* t3 = t + 4*4; 13987 sp_digit* t4 = t + 6*4; 13988 sp_digit* t5 = t + 8*4; 13989 sp_digit* x; 13990 sp_digit* y; 13991 sp_digit* z; 13992 int i; 13993 13994 /* Check double */ 13995 sp_256_sub_4(t1, p256_mod, q->y); 13996 sp_256_norm_4(t1); 13997 if (sp_256_cmp_equal_4(p->x, q->x) & sp_256_cmp_equal_4(p->z, q->z) & 13998 (sp_256_cmp_equal_4(p->y, q->y) | sp_256_cmp_equal_4(p->y, t1))) { 13999 sp_256_proj_point_dbl_4(r, p, t); 14000 } 14001 else { 14002 rp[0] = r; 14003 rp[1] = &tp; 14004 XMEMSET(&tp, 0, sizeof(tp)); 14005 x = rp[p->infinity | q->infinity]->x; 14006 y = rp[p->infinity | q->infinity]->y; 14007 z = rp[p->infinity | q->infinity]->z; 14008 14009 ap[0] = p; 14010 ap[1] = q; 14011 for (i=0; i<4; i++) 14012 r->x[i] = ap[p->infinity]->x[i]; 14013 for (i=0; i<4; i++) 14014 r->y[i] = ap[p->infinity]->y[i]; 14015 for (i=0; i<4; i++) 14016 r->z[i] = ap[p->infinity]->z[i]; 14017 r->infinity = ap[p->infinity]->infinity; 14018 14019 /* U2 = X2*Z1^2 */ 14020 sp_256_mont_sqr_4(t2, z, p256_mod, p256_mp_mod); 14021 sp_256_mont_mul_4(t4, t2, z, p256_mod, p256_mp_mod); 14022 sp_256_mont_mul_4(t2, t2, q->x, p256_mod, p256_mp_mod); 14023 /* S2 = Y2*Z1^3 */ 14024 sp_256_mont_mul_4(t4, t4, q->y, p256_mod, p256_mp_mod); 14025 /* H = U2 - X1 */ 14026 sp_256_mont_sub_4(t2, t2, x, p256_mod); 14027 /* R = S2 - Y1 */ 14028 sp_256_mont_sub_4(t4, t4, y, p256_mod); 14029 /* Z3 = H*Z1 */ 14030 sp_256_mont_mul_4(z, z, t2, p256_mod, p256_mp_mod); 14031 /* X3 = R^2 - H^3 - 2*X1*H^2 */ 14032 sp_256_mont_sqr_4(t1, t4, p256_mod, p256_mp_mod); 14033 sp_256_mont_sqr_4(t5, t2, p256_mod, p256_mp_mod); 14034 sp_256_mont_mul_4(t3, x, t5, p256_mod, p256_mp_mod); 14035 sp_256_mont_mul_4(t5, t5, t2, p256_mod, p256_mp_mod); 14036 sp_256_mont_sub_4(x, t1, t5, p256_mod); 14037 sp_256_mont_dbl_4(t1, t3, p256_mod); 14038 sp_256_mont_sub_4(x, x, t1, p256_mod); 14039 /* Y3 = R*(X1*H^2 - X3) - Y1*H^3 */ 14040 sp_256_mont_sub_4(t3, t3, x, p256_mod); 14041 sp_256_mont_mul_4(t3, t3, t4, p256_mod, p256_mp_mod); 14042 sp_256_mont_mul_4(t5, t5, y, p256_mod, p256_mp_mod); 14043 sp_256_mont_sub_4(y, t3, t5, p256_mod); 14044 } 14045 } 14046 14047 #ifdef FP_ECC 14048 /* Convert the projective point to affine. 14049 * Ordinates are in Montgomery form. 14050 * 14051 * a Point to convert. 14052 * t Temprorary data. 14053 */ 14054 static void sp_256_proj_to_affine_4(sp_point* a, sp_digit* t) 14055 { 14056 sp_digit* t1 = t; 14057 sp_digit* t2 = t + 2 * 4; 14058 sp_digit* tmp = t + 4 * 4; 14059 14060 sp_256_mont_inv_4(t1, a->z, tmp); 14061 14062 sp_256_mont_sqr_4(t2, t1, p256_mod, p256_mp_mod); 14063 sp_256_mont_mul_4(t1, t2, t1, p256_mod, p256_mp_mod); 14064 14065 sp_256_mont_mul_4(a->x, a->x, t2, p256_mod, p256_mp_mod); 14066 sp_256_mont_mul_4(a->y, a->y, t1, p256_mod, p256_mp_mod); 14067 XMEMCPY(a->z, p256_norm_mod, sizeof(p256_norm_mod)); 14068 } 14069 14070 /* Generate the pre-computed table of points for the base point. 14071 * 14072 * a The base point. 14073 * table Place to store generated point data. 14074 * tmp Temprorary data. 14075 * heap Heap to use for allocation. 14076 */ 14077 static int sp_256_gen_stripe_table_4(sp_point* a, 14078 sp_table_entry* table, sp_digit* tmp, void* heap) 14079 { 14080 #if !defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SMALL_STACK) 14081 sp_point td, s1d, s2d; 14082 #endif 14083 sp_point* t; 14084 sp_point* s1 = NULL; 14085 sp_point* s2 = NULL; 14086 int i, j; 14087 int err; 14088 14089 (void)heap; 14090 14091 err = sp_ecc_point_new(heap, td, t); 14092 if (err == MP_OKAY) 14093 err = sp_ecc_point_new(heap, s1d, s1); 14094 if (err == MP_OKAY) 14095 err = sp_ecc_point_new(heap, s2d, s2); 14096 14097 if (err == MP_OKAY) 14098 err = sp_256_mod_mul_norm_4(t->x, a->x, p256_mod); 14099 if (err == MP_OKAY) 14100 err = sp_256_mod_mul_norm_4(t->y, a->y, p256_mod); 14101 if (err == MP_OKAY) 14102 err = sp_256_mod_mul_norm_4(t->z, a->z, p256_mod); 14103 if (err == MP_OKAY) { 14104 t->infinity = 0; 14105 sp_256_proj_to_affine_4(t, tmp); 14106 14107 XMEMCPY(s1->z, p256_norm_mod, sizeof(p256_norm_mod)); 14108 s1->infinity = 0; 14109 XMEMCPY(s2->z, p256_norm_mod, sizeof(p256_norm_mod)); 14110 s2->infinity = 0; 14111 14112 /* table[0] = {0, 0, infinity} */ 14113 XMEMSET(&table[0], 0, sizeof(sp_table_entry)); 14114 table[0].infinity = 1; 14115 /* table[1] = Affine version of 'a' in Montgomery form */ 14116 XMEMCPY(table[1].x, t->x, sizeof(table->x)); 14117 XMEMCPY(table[1].y, t->y, sizeof(table->y)); 14118 table[1].infinity = 0; 14119 14120 for (i=1; i<8; i++) { 14121 sp_256_proj_point_dbl_n_4(t, t, 32, tmp); 14122 sp_256_proj_to_affine_4(t, tmp); 14123 XMEMCPY(table[1<<i].x, t->x, sizeof(table->x)); 14124 XMEMCPY(table[1<<i].y, t->y, sizeof(table->y)); 14125 table[1<<i].infinity = 0; 14126 } 14127 14128 for (i=1; i<8; i++) { 14129 XMEMCPY(s1->x, table[1<<i].x, sizeof(table->x)); 14130 XMEMCPY(s1->y, table[1<<i].y, sizeof(table->y)); 14131 for (j=(1<<i)+1; j<(1<<(i+1)); j++) { 14132 XMEMCPY(s2->x, table[j-(1<<i)].x, sizeof(table->x)); 14133 XMEMCPY(s2->y, table[j-(1<<i)].y, sizeof(table->y)); 14134 sp_256_proj_point_add_qz1_4(t, s1, s2, tmp); 14135 sp_256_proj_to_affine_4(t, tmp); 14136 XMEMCPY(table[j].x, t->x, sizeof(table->x)); 14137 XMEMCPY(table[j].y, t->y, sizeof(table->y)); 14138 table[j].infinity = 0; 14139 } 14140 } 14141 } 14142 14143 sp_ecc_point_free(s2, 0, heap); 14144 sp_ecc_point_free(s1, 0, heap); 14145 sp_ecc_point_free( t, 0, heap); 14146 14147 return err; 14148 } 14149 14150 #endif /* FP_ECC */ 14151 #if defined(FP_ECC) || defined(WOLFSSL_SP_SMALL) 14152 /* Multiply the point by the scalar and return the result. 14153 * If map is true then convert result to affine co-ordinates. 14154 * 14155 * r Resulting point. 14156 * k Scalar to multiply by. 14157 * map Indicates whether to convert result to affine. 14158 * heap Heap to use for allocation. 14159 * returns MEMORY_E when memory allocation fails and MP_OKAY on success. 14160 */ 14161 static int sp_256_ecc_mulmod_stripe_4(sp_point* r, sp_point* g, 14162 sp_table_entry* table, sp_digit* k, int map, void* heap) 14163 { 14164 #if !defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SMALL_STACK) 14165 sp_point rtd; 14166 sp_point pd; 14167 sp_digit td[2 * 4 * 5]; 14168 #endif 14169 sp_point* rt; 14170 sp_point* p = NULL; 14171 sp_digit* t; 14172 int i, j; 14173 int y, x; 14174 int err; 14175 14176 (void)g; 14177 (void)heap; 14178 14179 err = sp_ecc_point_new(heap, rtd, rt); 14180 if (err == MP_OKAY) 14181 err = sp_ecc_point_new(heap, pd, p); 14182 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK) 14183 t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 4 * 5, heap, 14184 DYNAMIC_TYPE_ECC); 14185 if (t == NULL) 14186 err = MEMORY_E; 14187 #else 14188 t = td; 14189 #endif 14190 14191 if (err == MP_OKAY) { 14192 XMEMCPY(p->z, p256_norm_mod, sizeof(p256_norm_mod)); 14193 XMEMCPY(rt->z, p256_norm_mod, sizeof(p256_norm_mod)); 14194 14195 y = 0; 14196 for (j=0,x=31; j<8; j++,x+=32) 14197 y |= ((k[x / 64] >> (x % 64)) & 1) << j; 14198 XMEMCPY(rt->x, table[y].x, sizeof(table[y].x)); 14199 XMEMCPY(rt->y, table[y].y, sizeof(table[y].y)); 14200 rt->infinity = table[y].infinity; 14201 for (i=30; i>=0; i--) { 14202 y = 0; 14203 for (j=0,x=i; j<8; j++,x+=32) 14204 y |= ((k[x / 64] >> (x % 64)) & 1) << j; 14205 14206 sp_256_proj_point_dbl_4(rt, rt, t); 14207 XMEMCPY(p->x, table[y].x, sizeof(table[y].x)); 14208 XMEMCPY(p->y, table[y].y, sizeof(table[y].y)); 14209 p->infinity = table[y].infinity; 14210 sp_256_proj_point_add_qz1_4(rt, rt, p, t); 14211 } 14212 14213 if (map) 14214 sp_256_map_4(r, rt, t); 14215 else 14216 XMEMCPY(r, rt, sizeof(sp_point)); 14217 } 14218 14219 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK) 14220 if (t != NULL) 14221 XFREE(t, heap, DYNAMIC_TYPE_ECC); 14222 #endif 14223 sp_ecc_point_free(p, 0, heap); 14224 sp_ecc_point_free(rt, 0, heap); 14225 14226 return err; 14227 } 14228 14229 #endif /* FP_ECC || WOLFSSL_SP_SMALL */ 14230 #ifdef FP_ECC 14231 #ifndef FP_ENTRIES 14232 #define FP_ENTRIES 16 14233 #endif 14234 14235 typedef struct sp_cache_t { 14236 sp_digit x[4]; 14237 sp_digit y[4]; 14238 sp_table_entry table[256]; 14239 uint32_t cnt; 14240 int set; 14241 } sp_cache_t; 14242 14243 static THREAD_LS_T sp_cache_t sp_cache[FP_ENTRIES]; 14244 static THREAD_LS_T int sp_cache_last = -1; 14245 static THREAD_LS_T int sp_cache_inited = 0; 14246 14247 #ifndef HAVE_THREAD_LS 14248 static volatile int initCacheMutex = 0; 14249 static wolfSSL_Mutex sp_cache_lock; 14250 #endif 14251 14252 static void sp_ecc_get_cache(sp_point* g, sp_cache_t** cache) 14253 { 14254 int i, j; 14255 uint32_t least; 14256 14257 if (sp_cache_inited == 0) { 14258 for (i=0; i<FP_ENTRIES; i++) { 14259 sp_cache[i].set = 0; 14260 } 14261 sp_cache_inited = 1; 14262 } 14263 14264 /* Compare point with those in cache. */ 14265 for (i=0; i<FP_ENTRIES; i++) { 14266 if (!sp_cache[i].set) 14267 continue; 14268 14269 if (sp_256_cmp_equal_4(g->x, sp_cache[i].x) & 14270 sp_256_cmp_equal_4(g->y, sp_cache[i].y)) { 14271 sp_cache[i].cnt++; 14272 break; 14273 } 14274 } 14275 14276 /* No match. */ 14277 if (i == FP_ENTRIES) { 14278 /* Find empty entry. */ 14279 i = (sp_cache_last + 1) % FP_ENTRIES; 14280 for (; i != sp_cache_last; i=(i+1)%FP_ENTRIES) { 14281 if (!sp_cache[i].set) { 14282 break; 14283 } 14284 } 14285 14286 /* Evict least used. */ 14287 if (i == sp_cache_last) { 14288 least = sp_cache[0].cnt; 14289 for (j=1; j<FP_ENTRIES; j++) { 14290 if (sp_cache[j].cnt < least) { 14291 i = j; 14292 least = sp_cache[i].cnt; 14293 } 14294 } 14295 } 14296 14297 XMEMCPY(sp_cache[i].x, g->x, sizeof(sp_cache[i].x)); 14298 XMEMCPY(sp_cache[i].y, g->y, sizeof(sp_cache[i].y)); 14299 sp_cache[i].set = 1; 14300 sp_cache[i].cnt = 1; 14301 } 14302 14303 *cache = &sp_cache[i]; 14304 sp_cache_last = i; 14305 } 14306 #endif /* FP_ECC */ 14307 14308 /* Multiply the base point of P256 by the scalar and return the result. 14309 * If map is true then convert result to affine co-ordinates. 14310 * 14311 * r Resulting point. 14312 * g Point to multiply. 14313 * k Scalar to multiply by. 14314 * map Indicates whether to convert result to affine. 14315 * heap Heap to use for allocation. 14316 * returns MEMORY_E when memory allocation fails and MP_OKAY on success. 14317 */ 14318 static int sp_256_ecc_mulmod_4(sp_point* r, sp_point* g, sp_digit* k, 14319 int map, void* heap) 14320 { 14321 #ifndef FP_ECC 14322 return sp_256_ecc_mulmod_win_add_sub_4(r, g, k, map, heap); 14323 #else 14324 sp_digit tmp[2 * 4 * 5]; 14325 sp_cache_t* cache; 14326 int err = MP_OKAY; 14327 14328 #ifndef HAVE_THREAD_LS 14329 if (initCacheMutex == 0) { 14330 wc_InitMutex(&sp_cache_lock); 14331 initCacheMutex = 1; 14332 } 14333 if (wc_LockMutex(&sp_cache_lock) != 0) 14334 err = BAD_MUTEX_E; 14335 #endif /* HAVE_THREAD_LS */ 14336 14337 if (err == MP_OKAY) { 14338 sp_ecc_get_cache(g, &cache); 14339 if (cache->cnt == 2) 14340 sp_256_gen_stripe_table_4(g, cache->table, tmp, heap); 14341 14342 #ifndef HAVE_THREAD_LS 14343 wc_UnLockMutex(&sp_cache_lock); 14344 #endif /* HAVE_THREAD_LS */ 14345 14346 if (cache->cnt < 2) { 14347 err = sp_256_ecc_mulmod_win_add_sub_4(r, g, k, map, heap); 14348 } 14349 else { 14350 err = sp_256_ecc_mulmod_stripe_4(r, g, cache->table, k, 14351 map, heap); 14352 } 14353 } 14354 14355 return err; 14356 #endif 14357 } 14358 14359 /* Multiply the point by the scalar and return the result. 14360 * If map is true then convert result to affine co-ordinates. 14361 * 14362 * km Scalar to multiply by. 14363 * p Point to multiply. 14364 * r Resulting point. 14365 * map Indicates whether to convert result to affine. 14366 * heap Heap to use for allocation. 14367 * returns MEMORY_E when memory allocation fails and MP_OKAY on success. 14368 */ 14369 int sp_ecc_mulmod_256(mp_int* km, ecc_point* gm, ecc_point* r, int map, 14370 void* heap) 14371 { 14372 #if !defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SMALL_STACK) 14373 sp_point p; 14374 sp_digit kd[4]; 14375 #endif 14376 sp_point* point; 14377 sp_digit* k = NULL; 14378 int err = MP_OKAY; 14379 #ifdef HAVE_INTEL_AVX2 14380 word32 cpuid_flags = cpuid_get_flags(); 14381 #endif 14382 14383 err = sp_ecc_point_new(heap, p, point); 14384 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK) 14385 if (err == MP_OKAY) { 14386 k = XMALLOC(sizeof(sp_digit) * 4, heap, DYNAMIC_TYPE_ECC); 14387 if (k == NULL) 14388 err = MEMORY_E; 14389 } 14390 #else 14391 k = kd; 14392 #endif 14393 if (err == MP_OKAY) { 14394 sp_256_from_mp(k, 4, km); 14395 sp_256_point_from_ecc_point_4(point, gm); 14396 14397 #ifdef HAVE_INTEL_AVX2 14398 if (IS_INTEL_BMI2(cpuid_flags) && IS_INTEL_ADX(cpuid_flags)) 14399 err = sp_256_ecc_mulmod_avx2_4(point, point, k, map, heap); 14400 else 14401 #endif 14402 err = sp_256_ecc_mulmod_4(point, point, k, map, heap); 14403 } 14404 if (err == MP_OKAY) 14405 err = sp_256_point_to_ecc_point_4(point, r); 14406 14407 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK) 14408 if (k != NULL) 14409 XFREE(k, heap, DYNAMIC_TYPE_ECC); 14410 #endif 14411 sp_ecc_point_free(point, 0, heap); 14412 14413 return err; 14414 } 14415 14416 #ifdef WOLFSSL_SP_SMALL 14417 static sp_table_entry p256_table[256] = { 14418 /* 0 */ 14419 { { 0x00, 0x00, 0x00, 0x00 }, 14420 { 0x00, 0x00, 0x00, 0x00 }, 14421 1 }, 14422 /* 1 */ 14423 { { 0x79e730d418a9143cl,0x75ba95fc5fedb601l,0x79fb732b77622510l, 14424 0x18905f76a53755c6l }, 14425 { 0xddf25357ce95560al,0x8b4ab8e4ba19e45cl,0xd2e88688dd21f325l, 14426 0x8571ff1825885d85l }, 14427 0 }, 14428 /* 2 */ 14429 { { 0x202886024147519al,0xd0981eac26b372f0l,0xa9d4a7caa785ebc8l, 14430 0xd953c50ddbdf58e9l }, 14431 { 0x9d6361ccfd590f8fl,0x72e9626b44e6c917l,0x7fd9611022eb64cfl, 14432 0x863ebb7e9eb288f3l }, 14433 0 }, 14434 /* 3 */ 14435 { { 0x7856b6235cdb6485l,0x808f0ea22f0a2f97l,0x3e68d9544f7e300bl, 14436 0x00076055b5ff80a0l }, 14437 { 0x7634eb9b838d2010l,0x54014fbb3243708al,0xe0e47d39842a6606l, 14438 0x8308776134373ee0l }, 14439 0 }, 14440 /* 4 */ 14441 { { 0x4f922fc516a0d2bbl,0x0d5cc16c1a623499l,0x9241cf3a57c62c8bl, 14442 0x2f5e6961fd1b667fl }, 14443 { 0x5c15c70bf5a01797l,0x3d20b44d60956192l,0x04911b37071fdb52l, 14444 0xf648f9168d6f0f7bl }, 14445 0 }, 14446 /* 5 */ 14447 { { 0x9e566847e137bbbcl,0xe434469e8a6a0becl,0xb1c4276179d73463l, 14448 0x5abe0285133d0015l }, 14449 { 0x92aa837cc04c7dabl,0x573d9f4c43260c07l,0x0c93156278e6cc37l, 14450 0x94bb725b6b6f7383l }, 14451 0 }, 14452 /* 6 */ 14453 { { 0xbbf9b48f720f141cl,0x6199b3cd2df5bc74l,0xdc3f6129411045c4l, 14454 0xcdd6bbcb2f7dc4efl }, 14455 { 0xcca6700beaf436fdl,0x6f647f6db99326bel,0x0c0fa792014f2522l, 14456 0xa361bebd4bdae5f6l }, 14457 0 }, 14458 /* 7 */ 14459 { { 0x28aa2558597c13c7l,0xc38d635f50b7c3e1l,0x07039aecf3c09d1dl, 14460 0xba12ca09c4b5292cl }, 14461 { 0x9e408fa459f91dfdl,0x3af43b66ceea07fbl,0x1eceb0899d780b29l, 14462 0x53ebb99d701fef4bl }, 14463 0 }, 14464 /* 8 */ 14465 { { 0x4fe7ee31b0e63d34l,0xf4600572a9e54fabl,0xc0493334d5e7b5a4l, 14466 0x8589fb9206d54831l }, 14467 { 0xaa70f5cc6583553al,0x0879094ae25649e5l,0xcc90450710044652l, 14468 0xebb0696d02541c4fl }, 14469 0 }, 14470 /* 9 */ 14471 { { 0x4616ca15ac1647c5l,0xb8127d47c4cf5799l,0xdc666aa3764dfbacl, 14472 0xeb2820cbd1b27da3l }, 14473 { 0x9406f8d86a87e008l,0xd87dfa9d922378f3l,0x56ed2e4280ccecb2l, 14474 0x1f28289b55a7da1dl }, 14475 0 }, 14476 /* 10 */ 14477 { { 0xabbaa0c03b89da99l,0xa6f2d79eb8284022l,0x27847862b81c05e8l, 14478 0x337a4b5905e54d63l }, 14479 { 0x3c67500d21f7794al,0x207005b77d6d7f61l,0x0a5a378104cfd6e8l, 14480 0x0d65e0d5f4c2fbd6l }, 14481 0 }, 14482 /* 11 */ 14483 { { 0xd9d09bbeb5275d38l,0x4268a7450be0a358l,0xf0762ff4973eb265l, 14484 0xc23da24252f4a232l }, 14485 { 0x5da1b84f0b94520cl,0x09666763b05bd78el,0x3a4dcb8694d29ea1l, 14486 0x19de3b8cc790cff1l }, 14487 0 }, 14488 /* 12 */ 14489 { { 0x183a716c26c5fe04l,0x3b28de0b3bba1bdbl,0x7432c586a4cb712cl, 14490 0xe34dcbd491fccbfdl }, 14491 { 0xb408d46baaa58403l,0x9a69748682e97a53l,0x9e39012736aaa8afl, 14492 0xe7641f447b4e0f7fl }, 14493 0 }, 14494 /* 13 */ 14495 { { 0x7d753941df64ba59l,0xd33f10ec0b0242fcl,0x4f06dfc6a1581859l, 14496 0x4a12df57052a57bfl }, 14497 { 0xbfa6338f9439dbd0l,0xd3c24bd4bde53e1fl,0xfd5e4ffa21f1b314l, 14498 0x6af5aa93bb5bea46l }, 14499 0 }, 14500 /* 14 */ 14501 { { 0xda10b69910c91999l,0x0a24b4402a580491l,0x3e0094b4b8cc2090l, 14502 0x5fe3475a66a44013l }, 14503 { 0xb0f8cabdf93e7b4bl,0x292b501a7c23f91al,0x42e889aecd1e6263l, 14504 0xb544e308ecfea916l }, 14505 0 }, 14506 /* 15 */ 14507 { { 0x6478c6e916ddfdcel,0x2c329166f89179e6l,0x4e8d6e764d4e67e1l, 14508 0xe0b6b2bda6b0c20bl }, 14509 { 0x0d312df2bb7efb57l,0x1aac0dde790c4007l,0xf90336ad679bc944l, 14510 0x71c023de25a63774l }, 14511 0 }, 14512 /* 16 */ 14513 { { 0x62a8c244bfe20925l,0x91c19ac38fdce867l,0x5a96a5d5dd387063l, 14514 0x61d587d421d324f6l }, 14515 { 0xe87673a2a37173eal,0x2384800853778b65l,0x10f8441e05bab43el, 14516 0xfa11fe124621efbel }, 14517 0 }, 14518 /* 17 */ 14519 { { 0x1c891f2b2cb19ffdl,0x01ba8d5bb1923c23l,0xb6d03d678ac5ca8el, 14520 0x586eb04c1f13bedcl }, 14521 { 0x0c35c6e527e8ed09l,0x1e81a33c1819ede2l,0x278fd6c056c652fal, 14522 0x19d5ac0870864f11l }, 14523 0 }, 14524 /* 18 */ 14525 { { 0x1e99f581309a4e1fl,0xab7de71be9270074l,0x26a5ef0befd28d20l, 14526 0xe7c0073f7f9c563fl }, 14527 { 0x1f6d663a0ef59f76l,0x669b3b5420fcb050l,0xc08c1f7a7a6602d4l, 14528 0xe08504fec65b3c0al }, 14529 0 }, 14530 /* 19 */ 14531 { { 0xf098f68da031b3cal,0x6d1cab9ee6da6d66l,0x5bfd81fa94f246e8l, 14532 0x78f018825b0996b4l }, 14533 { 0xb7eefde43a25787fl,0x8016f80d1dccac9bl,0x0cea4877b35bfc36l, 14534 0x43a773b87e94747al }, 14535 0 }, 14536 /* 20 */ 14537 { { 0x62577734d2b533d5l,0x673b8af6a1bdddc0l,0x577e7c9aa79ec293l, 14538 0xbb6de651c3b266b1l }, 14539 { 0xe7e9303ab65259b3l,0xd6a0afd3d03a7480l,0xc5ac83d19b3cfc27l, 14540 0x60b4619a5d18b99bl }, 14541 0 }, 14542 /* 21 */ 14543 { { 0xbd6a38e11ae5aa1cl,0xb8b7652b49e73658l,0x0b130014ee5f87edl, 14544 0x9d0f27b2aeebffcdl }, 14545 { 0xca9246317a730a55l,0x9c955b2fddbbc83al,0x07c1dfe0ac019a71l, 14546 0x244a566d356ec48dl }, 14547 0 }, 14548 /* 22 */ 14549 { { 0x6db0394aeacf1f96l,0x9f2122a9024c271cl,0x2626ac1b82cbd3b9l, 14550 0x45e58c873581ef69l }, 14551 { 0xd3ff479da38f9dbcl,0xa8aaf146e888a040l,0x945adfb246e0bed7l, 14552 0xc040e21cc1e4b7a4l }, 14553 0 }, 14554 /* 23 */ 14555 { { 0x847af0006f8117b6l,0x651969ff73a35433l,0x482b35761d9475ebl, 14556 0x1cdf5c97682c6ec7l }, 14557 { 0x7db775b411f04839l,0x7dbeacf448de1698l,0xb2921dd1b70b3219l, 14558 0x046755f8a92dff3dl }, 14559 0 }, 14560 /* 24 */ 14561 { { 0xcc8ac5d2bce8ffcdl,0x0d53c48b2fe61a82l,0xf6f161727202d6c7l, 14562 0x046e5e113b83a5f3l }, 14563 { 0xe7b8ff64d8007f01l,0x7fb1ef125af43183l,0x045c5ea635e1a03cl, 14564 0x6e0106c3303d005bl }, 14565 0 }, 14566 /* 25 */ 14567 { { 0x48c7358488dd73b1l,0x7670708f995ed0d9l,0x38385ea8c56a2ab7l, 14568 0x442594ede901cf1fl }, 14569 { 0xf8faa2c912d4b65bl,0x94c2343b96c90c37l,0xd326e4a15e978d1fl, 14570 0xa796fa514c2ee68el }, 14571 0 }, 14572 /* 26 */ 14573 { { 0x359fb604823addd7l,0x9e2a6183e56693b3l,0xf885b78e3cbf3c80l, 14574 0xe4ad2da9c69766e9l }, 14575 { 0x357f7f428e048a61l,0x082d198cc092d9a0l,0xfc3a1af4c03ed8efl, 14576 0xc5e94046c37b5143l }, 14577 0 }, 14578 /* 27 */ 14579 { { 0x476a538c2be75f9el,0x6fd1a9e8cb123a78l,0xd85e4df0b109c04bl, 14580 0x63283dafdb464747l }, 14581 { 0xce728cf7baf2df15l,0xe592c4550ad9a7f4l,0xfab226ade834bcc3l, 14582 0x68bd19ab1981a938l }, 14583 0 }, 14584 /* 28 */ 14585 { { 0xc08ead511887d659l,0x3374d5f4b359305al,0x96986981cfe74fe3l, 14586 0x495292f53c6fdfd6l }, 14587 { 0x4a878c9e1acec896l,0xd964b210ec5b4484l,0x6696f7e2664d60a7l, 14588 0x0ec7530d26036837l }, 14589 0 }, 14590 /* 29 */ 14591 { { 0x2da13a05ad2687bbl,0xa1f83b6af32e21fal,0x390f5ef51dd4607bl, 14592 0x0f6207a664863f0bl }, 14593 { 0xbd67e3bb0f138233l,0xdd66b96c272aa718l,0x8ed0040726ec88ael, 14594 0xff0db07208ed6dcfl }, 14595 0 }, 14596 /* 30 */ 14597 { { 0x749fa1014c95d553l,0xa44052fd5d680a8al,0x183b4317ff3b566fl, 14598 0x313b513c88740ea3l }, 14599 { 0xb402e2ac08d11549l,0x071ee10bb4dee21cl,0x26b987dd47f2320el, 14600 0x2d3abcf986f19f81l }, 14601 0 }, 14602 /* 31 */ 14603 { { 0x4c288501815581a2l,0x9a0a6d56632211afl,0x19ba7a0f0cab2e99l, 14604 0xc036fa10ded98cdfl }, 14605 { 0x29ae08bac1fbd009l,0x0b68b19006d15816l,0xc2eb32779b9e0d8fl, 14606 0xa6b2a2c4b6d40194l }, 14607 0 }, 14608 /* 32 */ 14609 { { 0xd433e50f6d3549cfl,0x6f33696ffacd665el,0x695bfdacce11fcb4l, 14610 0x810ee252af7c9860l }, 14611 { 0x65450fe17159bb2cl,0xf7dfbebe758b357bl,0x2b057e74d69fea72l, 14612 0xd485717a92731745l }, 14613 0 }, 14614 /* 33 */ 14615 { { 0x11741a8af0cb5a98l,0xd3da8f931f3110bfl,0x1994e2cbab382adfl, 14616 0x6a6045a72f9a604el }, 14617 { 0x170c0d3fa2b2411dl,0xbe0eb83e510e96e0l,0x3bcc9f738865b3ccl, 14618 0xd3e45cfaf9e15790l }, 14619 0 }, 14620 /* 34 */ 14621 { { 0xce1f69bbe83f7669l,0x09f8ae8272877d6bl,0x9548ae543244278dl, 14622 0x207755dee3c2c19cl }, 14623 { 0x87bd61d96fef1945l,0x18813cefb12d28c3l,0x9fbcd1d672df64aal, 14624 0x48dc5ee57154b00dl }, 14625 0 }, 14626 /* 35 */ 14627 { { 0x123790bff7e5a199l,0xe0efb8cf989ccbb7l,0xc27a2bfe0a519c79l, 14628 0xf2fb0aeddff6f445l }, 14629 { 0x41c09575f0b5025fl,0x550543d740fa9f22l,0x8fa3c8ad380bfbd0l, 14630 0xa13e9015db28d525l }, 14631 0 }, 14632 /* 36 */ 14633 { { 0xf9f7a350a2b65cbcl,0x0b04b9722a464226l,0x265ce241e23f07a1l, 14634 0x2bf0d6b01497526fl }, 14635 { 0xd3d4dd3f4b216fb7l,0xf7d7b867fbdda26al,0xaeb7b83f6708505cl, 14636 0x42a94a5a162fe89fl }, 14637 0 }, 14638 /* 37 */ 14639 { { 0x5846ad0beaadf191l,0x0f8a489025a268d7l,0xe8603050494dc1f6l, 14640 0x2c2dd969c65ede3dl }, 14641 { 0x6d02171d93849c17l,0x460488ba1da250ddl,0x4810c7063c3a5485l, 14642 0xf437fa1f42c56dbcl }, 14643 0 }, 14644 /* 38 */ 14645 { { 0x6aa0d7144a0f7dabl,0x0f0497931776e9acl,0x52c0a050f5f39786l, 14646 0xaaf45b3354707aa8l }, 14647 { 0x85e37c33c18d364al,0xd40b9b063e497165l,0xf417168115ec5444l, 14648 0xcdf6310df4f272bcl }, 14649 0 }, 14650 /* 39 */ 14651 { { 0x7473c6238ea8b7efl,0x08e9351885bc2287l,0x419567722bda8e34l, 14652 0xf0d008bada9e2ff2l }, 14653 { 0x2912671d2414d3b1l,0xb3754985b019ea76l,0x5c61b96d453bcbdbl, 14654 0x5bd5c2f5ca887b8bl }, 14655 0 }, 14656 /* 40 */ 14657 { { 0xef0f469ef49a3154l,0x3e85a5956e2b2e9al,0x45aaec1eaa924a9cl, 14658 0xaa12dfc8a09e4719l }, 14659 { 0x26f272274df69f1dl,0xe0e4c82ca2ff5e73l,0xb9d8ce73b7a9dd44l, 14660 0x6c036e73e48ca901l }, 14661 0 }, 14662 /* 41 */ 14663 { { 0x5cfae12a0f6e3138l,0x6966ef0025ad345al,0x8993c64b45672bc5l, 14664 0x292ff65896afbe24l }, 14665 { 0xd5250d445e213402l,0xf6580e274392c9fel,0x097b397fda1c72e8l, 14666 0x644e0c90311b7276l }, 14667 0 }, 14668 /* 42 */ 14669 { { 0xe1e421e1a47153f0l,0xb86c3b79920418c9l,0x93bdce87705d7672l, 14670 0xf25ae793cab79a77l }, 14671 { 0x1f3194a36d869d0cl,0x9d55c8824986c264l,0x49fb5ea3096e945el, 14672 0x39b8e65313db0a3el }, 14673 0 }, 14674 /* 43 */ 14675 { { 0x37754200b6fd2e59l,0x35e2c0669255c98fl,0xd9dab21a0e2a5739l, 14676 0x39122f2f0f19db06l }, 14677 { 0xcfbce1e003cad53cl,0x225b2c0fe65c17e3l,0x72baf1d29aa13877l, 14678 0x8de80af8ce80ff8dl }, 14679 0 }, 14680 /* 44 */ 14681 { { 0xafbea8d9207bbb76l,0x921c7e7c21782758l,0xdfa2b74b1c0436b1l, 14682 0x871949062e368c04l }, 14683 { 0xb5f928bba3993df5l,0x639d75b5f3b3d26al,0x011aa78a85b55050l, 14684 0xfc315e6a5b74fde1l }, 14685 0 }, 14686 /* 45 */ 14687 { { 0x561fd41ae8d6ecfal,0x5f8c44f61aec7f86l,0x98452a7b4924741dl, 14688 0xe6d4a7adee389088l }, 14689 { 0x60552ed14593c75dl,0x70a70da4dd271162l,0xd2aede937ba2c7dbl, 14690 0x35dfaf9a9be2ae57l }, 14691 0 }, 14692 /* 46 */ 14693 { { 0x6b956fcdaa736636l,0x09f51d97ae2cab7el,0xfb10bf410f349966l, 14694 0x1da5c7d71c830d2bl }, 14695 { 0x5c41e4833cce6825l,0x15ad118ff9573c3bl,0xa28552c7f23036b8l, 14696 0x7077c0fddbf4b9d6l }, 14697 0 }, 14698 /* 47 */ 14699 { { 0xbf63ff8d46b9661cl,0xa1dfd36b0d2cfd71l,0x0373e140a847f8f7l, 14700 0x53a8632ee50efe44l }, 14701 { 0x0976ff68696d8051l,0xdaec0c95c74f468al,0x62994dc35e4e26bdl, 14702 0x028ca76d34e1fcc1l }, 14703 0 }, 14704 /* 48 */ 14705 { { 0xd11d47dcfc9877eel,0xc8b36210801d0002l,0xd002c11754c260b6l, 14706 0x04c17cd86962f046l }, 14707 { 0x6d9bd094b0daddf5l,0xbea2357524ce55c0l,0x663356e672da03b5l, 14708 0xf7ba4de9fed97474l }, 14709 0 }, 14710 /* 49 */ 14711 { { 0xd0dbfa34ebe1263fl,0x5576373571ae7ce6l,0xd244055382a6f523l, 14712 0xe31f960052131c41l }, 14713 { 0xd1bb9216ea6b6ec6l,0x37a1d12e73c2fc44l,0xc10e7eac89d0a294l, 14714 0xaa3a6259ce34d47bl }, 14715 0 }, 14716 /* 50 */ 14717 { { 0xfbcf9df536f3dcd3l,0x6ceded50d2bf7360l,0x491710fadf504f5bl, 14718 0x2398dd627e79daeel }, 14719 { 0xcf4705a36d09569el,0xea0619bb5149f769l,0xff9c037735f6034cl, 14720 0x5717f5b21c046210l }, 14721 0 }, 14722 /* 51 */ 14723 { { 0x9fe229c921dd895el,0x8e51850040c28451l,0xfa13d2391d637ecdl, 14724 0x660a2c560e3c28del }, 14725 { 0x9cca88aed67fcbd0l,0xc84724780ea9f096l,0x32b2f48172e92b4dl, 14726 0x624ee54c4f522453l }, 14727 0 }, 14728 /* 52 */ 14729 { { 0x09549ce4d897ecccl,0x4d49d1d93f9880aal,0x723c2423043a7c20l, 14730 0x4f392afb92bdfbc0l }, 14731 { 0x6969f8fa7de44fd9l,0xb66cfbe457b32156l,0xdb2fa803368ebc3cl, 14732 0x8a3e7977ccdb399cl }, 14733 0 }, 14734 /* 53 */ 14735 { { 0xdde1881f06c4b125l,0xae34e300f6e3ca8cl,0xef6999de5c7a13e9l, 14736 0x3888d02370c24404l }, 14737 { 0x7628035644f91081l,0x3d9fcf615f015504l,0x1827edc8632cd36el, 14738 0xa5e62e4718102336l }, 14739 0 }, 14740 /* 54 */ 14741 { { 0x1a825ee32facd6c8l,0x699c635454bcbc66l,0x0ce3edf798df9931l, 14742 0x2c4768e6466a5adcl }, 14743 { 0xb346ff8c90a64bc9l,0x630a6020e4779f5cl,0xd949d064bc05e884l, 14744 0x7b5e6441f9e652a0l }, 14745 0 }, 14746 /* 55 */ 14747 { { 0x2169422c1d28444al,0xe996c5d8be136a39l,0x2387afe5fb0c7fcel, 14748 0xb8af73cb0c8d744al }, 14749 { 0x5fde83aa338b86fdl,0xfee3f158a58a5cffl,0xc9ee8f6f20ac9433l, 14750 0xa036395f7f3f0895l }, 14751 0 }, 14752 /* 56 */ 14753 { { 0x8c73c6bba10f7770l,0xa6f16d81a12a0e24l,0x100df68251bc2b9fl, 14754 0x4be36b01875fb533l }, 14755 { 0x9226086e9fb56dbbl,0x306fef8b07e7a4f8l,0xeeaccc0566d52f20l, 14756 0x8cbc9a871bdc00c0l }, 14757 0 }, 14758 /* 57 */ 14759 { { 0xe131895cc0dac4abl,0xa874a440712ff112l,0x6332ae7c6a1cee57l, 14760 0x44e7553e0c0835f8l }, 14761 { 0x6d503fff7734002dl,0x9d35cb8b0b34425cl,0x95f702760e8738b5l, 14762 0x470a683a5eb8fc18l }, 14763 0 }, 14764 /* 58 */ 14765 { { 0x81b761dc90513482l,0x0287202a01e9276al,0xcda441ee0ce73083l, 14766 0x16410690c63dc6efl }, 14767 { 0xf5034a066d06a2edl,0xdd4d7745189b100bl,0xd914ae72ab8218c9l, 14768 0xd73479fd7abcbb4fl }, 14769 0 }, 14770 /* 59 */ 14771 { { 0x7edefb165ad4c6e5l,0x262cf08f5b06d04dl,0x12ed5bb18575cb14l, 14772 0x816469e30771666bl }, 14773 { 0xd7ab9d79561e291el,0xeb9daf22c1de1661l,0xf49827eb135e0513l, 14774 0x0a36dd23f0dd3f9cl }, 14775 0 }, 14776 /* 60 */ 14777 { { 0x098d32c741d5533cl,0x7c5f5a9e8684628fl,0x39a228ade349bd11l, 14778 0xe331dfd6fdbab118l }, 14779 { 0x5100ab686bcc6ed8l,0x7160c3bdef7a260el,0x9063d9a7bce850d7l, 14780 0xd3b4782a492e3389l }, 14781 0 }, 14782 /* 61 */ 14783 { { 0xa149b6e8f3821f90l,0x92edd9ed66eb7aadl,0x0bb669531a013116l, 14784 0x7281275a4c86a5bdl }, 14785 { 0x503858f7d3ff47e5l,0x5e1616bc61016441l,0x62b0f11a7dfd9bb1l, 14786 0x2c062e7ece145059l }, 14787 0 }, 14788 /* 62 */ 14789 { { 0xa76f996f0159ac2el,0x281e7736cbdb2713l,0x2ad6d28808e46047l, 14790 0x282a35f92c4e7ef1l }, 14791 { 0x9c354b1ec0ce5cd2l,0xcf99efc91379c229l,0x992caf383e82c11el, 14792 0xc71cd513554d2abdl }, 14793 0 }, 14794 /* 63 */ 14795 { { 0x4885de9c09b578f4l,0x1884e258e3affa7al,0x8f76b1b759182f1fl, 14796 0xc50f6740cf47f3a3l }, 14797 { 0xa9c4adf3374b68eal,0xa406f32369965fe2l,0x2f86a22285a53050l, 14798 0xb9ecb3a7212958dcl }, 14799 0 }, 14800 /* 64 */ 14801 { { 0x56f8410ef4f8b16al,0x97241afec47b266al,0x0a406b8e6d9c87c1l, 14802 0x803f3e02cd42ab1bl }, 14803 { 0x7f0309a804dbec69l,0xa83b85f73bbad05fl,0xc6097273ad8e197fl, 14804 0xc097440e5067adc1l }, 14805 0 }, 14806 /* 65 */ 14807 { { 0x846a56f2c379ab34l,0xa8ee068b841df8d1l,0x20314459176c68efl, 14808 0xf1af32d5915f1f30l }, 14809 { 0x99c375315d75bd50l,0x837cffbaf72f67bcl,0x0613a41848d7723fl, 14810 0x23d0f130e2d41c8bl }, 14811 0 }, 14812 /* 66 */ 14813 { { 0x857ab6edf41500d9l,0x0d890ae5fcbeada8l,0x52fe864889725951l, 14814 0xb0288dd6c0a3faddl }, 14815 { 0x85320f30650bcb08l,0x71af6313695d6e16l,0x31f520a7b989aa76l, 14816 0xffd3724ff408c8d2l }, 14817 0 }, 14818 /* 67 */ 14819 { { 0x53968e64b458e6cbl,0x992dad20317a5d28l,0x3814ae0b7aa75f56l, 14820 0xf5590f4ad78c26dfl }, 14821 { 0x0fc24bd3cf0ba55al,0x0fc4724a0c778bael,0x1ce9864f683b674al, 14822 0x18d6da54f6f74a20l }, 14823 0 }, 14824 /* 68 */ 14825 { { 0xed93e225d5be5a2bl,0x6fe799835934f3c6l,0x4314092622626ffcl, 14826 0x50bbb4d97990216al }, 14827 { 0x378191c6e57ec63el,0x65422c40181dcdb2l,0x41a8099b0236e0f6l, 14828 0x2b10011801fe49c3l }, 14829 0 }, 14830 /* 69 */ 14831 { { 0xfc68b5c59b391593l,0xc385f5a2598270fcl,0x7144f3aad19adcbbl, 14832 0xdd55899983fbae0cl }, 14833 { 0x93b88b8e74b82ff4l,0xd2e03c4071e734c9l,0x9a7a9eaf43c0322al, 14834 0xe6e4c551149d6041l }, 14835 0 }, 14836 /* 70 */ 14837 { { 0x55f655bb1e9af288l,0x647e1a64f7ada931l,0x43697e4bcb2820e5l, 14838 0x51e00db107ed56ffl }, 14839 { 0x43d169b8771c327el,0x29cdb20b4a96c2adl,0xc07d51f53deb4779l, 14840 0xe22f424149829177l }, 14841 0 }, 14842 /* 71 */ 14843 { { 0xcd45e8f4635f1abbl,0x7edc0cb568538874l,0xc9472c1fb5a8034dl, 14844 0xf709373d52dc48c9l }, 14845 { 0x401966bba8af30d6l,0x95bf5f4af137b69cl,0x3966162a9361c47el, 14846 0xbd52d288e7275b11l }, 14847 0 }, 14848 /* 72 */ 14849 { { 0xab155c7a9c5fa877l,0x17dad6727d3a3d48l,0x43f43f9e73d189d8l, 14850 0xa0d0f8e4c8aa77a6l }, 14851 { 0x0bbeafd8cc94f92dl,0xd818c8be0c4ddb3al,0x22cc65f8b82eba14l, 14852 0xa56c78c7946d6a00l }, 14853 0 }, 14854 /* 73 */ 14855 { { 0x2962391b0dd09529l,0x803e0ea63daddfcfl,0x2c77351f5b5bf481l, 14856 0xd8befdf8731a367al }, 14857 { 0xab919d42fc0157f4l,0xf51caed7fec8e650l,0xcdf9cb4002d48b0al, 14858 0x854a68a5ce9f6478l }, 14859 0 }, 14860 /* 74 */ 14861 { { 0xdc35f67b63506ea5l,0x9286c489a4fe0d66l,0x3f101d3bfe95cd4dl, 14862 0x5cacea0b98846a95l }, 14863 { 0xa90df60c9ceac44dl,0x3db29af4354d1c3al,0x08dd3de8ad5dbabel, 14864 0xe4982d1235e4efa9l }, 14865 0 }, 14866 /* 75 */ 14867 { { 0x23104a22c34cd55el,0x58695bb32680d132l,0xfb345afa1fa1d943l, 14868 0x8046b7f616b20499l }, 14869 { 0xb533581e38e7d098l,0xd7f61e8df46f0b70l,0x30dea9ea44cb78c4l, 14870 0xeb17ca7b9082af55l }, 14871 0 }, 14872 /* 76 */ 14873 { { 0x1751b59876a145b9l,0xa5cf6b0fc1bc71ecl,0xd3e03565392715bbl, 14874 0x097b00bafab5e131l }, 14875 { 0xaa66c8e9565f69e1l,0x77e8f75ab5be5199l,0x6033ba11da4fd984l, 14876 0xf95c747bafdbcc9el }, 14877 0 }, 14878 /* 77 */ 14879 { { 0x558f01d3bebae45el,0xa8ebe9f0c4bc6955l,0xaeb705b1dbc64fc6l, 14880 0x3512601e566ed837l }, 14881 { 0x9336f1e1fa1161cdl,0x328ab8d54c65ef87l,0x4757eee2724f21e5l, 14882 0x0ef971236068ab6bl }, 14883 0 }, 14884 /* 78 */ 14885 { { 0x02598cf754ca4226l,0x5eede138f8642c8el,0x48963f74468e1790l, 14886 0xfc16d9333b4fbc95l }, 14887 { 0xbe96fb31e7c800cal,0x138063312678adaal,0x3d6244976ff3e8b5l, 14888 0x14ca4af1b95d7a17l }, 14889 0 }, 14890 /* 79 */ 14891 { { 0x7a4771babd2f81d5l,0x1a5f9d6901f7d196l,0xd898bef7cad9c907l, 14892 0x4057b063f59c231dl }, 14893 { 0xbffd82fe89c05c0al,0xe4911c6f1dc0df85l,0x3befccaea35a16dbl, 14894 0x1c3b5d64f1330b13l }, 14895 0 }, 14896 /* 80 */ 14897 { { 0x5fe14bfe80ec21fel,0xf6ce116ac255be82l,0x98bc5a072f4a5d67l, 14898 0xfad27148db7e63afl }, 14899 { 0x90c0b6ac29ab05b3l,0x37a9a83c4e251ae6l,0x0a7dc875c2aade7dl, 14900 0x77387de39f0e1a84l }, 14901 0 }, 14902 /* 81 */ 14903 { { 0x1e9ecc49a56c0dd7l,0xa5cffcd846086c74l,0x8f7a1408f505aecel, 14904 0xb37b85c0bef0c47el }, 14905 { 0x3596b6e4cc0e6a8fl,0xfd6d4bbf6b388f23l,0xaba453fac39cef4el, 14906 0x9c135ac8f9f628d5l }, 14907 0 }, 14908 /* 82 */ 14909 { { 0x32aa320284e35743l,0x320d6ab185a3cdefl,0xb821b1761df19819l, 14910 0x5721361fc433851fl }, 14911 { 0x1f0db36a71fc9168l,0x5f98ba735e5c403cl,0xf64ca87e37bcd8f5l, 14912 0xdcbac3c9e6bb11bdl }, 14913 0 }, 14914 /* 83 */ 14915 { { 0xf01d99684518cbe2l,0xd242fc189c9eb04el,0x727663c7e47feebfl, 14916 0xb8c1c89e2d626862l }, 14917 { 0x51a58bddc8e1d569l,0x563809c8b7d88cd0l,0x26c27fd9f11f31ebl, 14918 0x5d23bbda2f9422d4l }, 14919 0 }, 14920 /* 84 */ 14921 { { 0x0a1c729495c8f8bel,0x2961c4803bf362bfl,0x9e418403df63d4acl, 14922 0xc109f9cb91ece900l }, 14923 { 0xc2d095d058945705l,0xb9083d96ddeb85c0l,0x84692b8d7a40449bl, 14924 0x9bc3344f2eee1ee1l }, 14925 0 }, 14926 /* 85 */ 14927 { { 0x0d5ae35642913074l,0x55491b2748a542b1l,0x469ca665b310732al, 14928 0x29591d525f1a4cc1l }, 14929 { 0xe76f5b6bb84f983fl,0xbe7eef419f5f84e1l,0x1200d49680baa189l, 14930 0x6376551f18ef332cl }, 14931 0 }, 14932 /* 86 */ 14933 { { 0xbda5f14e562976ccl,0x22bca3e60ef12c38l,0xbbfa30646cca9852l, 14934 0xbdb79dc808e2987al }, 14935 { 0xfd2cb5c9cb06a772l,0x38f475aafe536dcel,0xc2a3e0227c2b5db8l, 14936 0x8ee86001add3c14al }, 14937 0 }, 14938 /* 87 */ 14939 { { 0xcbe96981a4ade873l,0x7ee9aa4dc4fba48cl,0x2cee28995a054ba5l, 14940 0x92e51d7a6f77aa4bl }, 14941 { 0x948bafa87190a34dl,0xd698f75bf6bd1ed1l,0xd00ee6e30caf1144l, 14942 0x5182f86f0a56aaaal }, 14943 0 }, 14944 /* 88 */ 14945 { { 0xfba6212c7a4cc99cl,0xff609b683e6d9ca1l,0x5dbb27cb5ac98c5al, 14946 0x91dcab5d4073a6f2l }, 14947 { 0x01b6cc3d5f575a70l,0x0cb361396f8d87fal,0x165d4e8c89981736l, 14948 0x17a0cedb97974f2bl }, 14949 0 }, 14950 /* 89 */ 14951 { { 0x38861e2a076c8d3al,0x701aad39210f924bl,0x94d0eae413a835d9l, 14952 0x2e8ce36c7f4cdf41l }, 14953 { 0x91273dab037a862bl,0x01ba9bb760e4c8fal,0xf964538833baf2ddl, 14954 0xf4ccc6cb34f668f3l }, 14955 0 }, 14956 /* 90 */ 14957 { { 0x44ef525cf1f79687l,0x7c59549592efa815l,0xe1231741a5c78d29l, 14958 0xac0db4889a0df3c9l }, 14959 { 0x86bfc711df01747fl,0x592b9358ef17df13l,0xe5880e4f5ccb6bb5l, 14960 0x95a64a6194c974a2l }, 14961 0 }, 14962 /* 91 */ 14963 { { 0x72c1efdac15a4c93l,0x40269b7382585141l,0x6a8dfb1c16cb0badl, 14964 0x231e54ba29210677l }, 14965 { 0xa70df9178ae6d2dcl,0x4d6aa63f39112918l,0xf627726b5e5b7223l, 14966 0xab0be032d8a731e1l }, 14967 0 }, 14968 /* 92 */ 14969 { { 0x097ad0e98d131f2dl,0x637f09e33b04f101l,0x1ac86196d5e9a748l, 14970 0xf1bcc8802cf6a679l }, 14971 { 0x25c69140e8daacb4l,0x3c4e405560f65009l,0x591cc8fc477937a6l, 14972 0x851694695aebb271l }, 14973 0 }, 14974 /* 93 */ 14975 { { 0xde35c143f1dcf593l,0x78202b29b018be3bl,0xe9cdadc29bdd9d3dl, 14976 0x8f67d9d2daad55d8l }, 14977 { 0x841116567481ea5fl,0xe7d2dde9e34c590cl,0xffdd43f405053fa8l, 14978 0xf84572b9c0728b5dl }, 14979 0 }, 14980 /* 94 */ 14981 { { 0x5e1a7a7197af71c9l,0xa14494447a736565l,0xa1b4ae070e1d5063l, 14982 0xedee2710616b2c19l }, 14983 { 0xb2f034f511734121l,0x1cac6e554a25e9f0l,0x8dc148f3a40c2ecfl, 14984 0x9fd27e9b44ebd7f4l }, 14985 0 }, 14986 /* 95 */ 14987 { { 0x3cc7658af6e2cb16l,0xe3eb7d2cfe5919b6l,0x5a8c5816168d5583l, 14988 0xa40c2fb6958ff387l }, 14989 { 0x8c9ec560fedcc158l,0x7ad804c655f23056l,0xd93967049a307e12l, 14990 0x99bc9bb87dc6decfl }, 14991 0 }, 14992 /* 96 */ 14993 { { 0x84a9521d927dafc6l,0x52c1fb695c09cd19l,0x9d9581a0f9366ddel, 14994 0x9abe210ba16d7e64l }, 14995 { 0x480af84a48915220l,0xfa73176a4dd816c6l,0xc7d539871681ca5al, 14996 0x7881c25787f344b0l }, 14997 0 }, 14998 /* 97 */ 14999 { { 0x93399b51e0bcf3ffl,0x0d02cbc5127f74f6l,0x8fb465a2dd01d968l, 15000 0x15e6e319a30e8940l }, 15001 { 0x646d6e0d3e0e05f4l,0xfad7bddc43588404l,0xbe61c7d1c4f850d3l, 15002 0x0e55facf191172cel }, 15003 0 }, 15004 /* 98 */ 15005 { { 0x7e9d9806f8787564l,0x1a33172131e85ce6l,0x6b0158cab819e8d6l, 15006 0xd73d09766fe96577l }, 15007 { 0x424834251eb7206el,0xa519290fc618bb42l,0x5dcbb8595e30a520l, 15008 0x9250a3748f15a50bl }, 15009 0 }, 15010 /* 99 */ 15011 { { 0xcaff08f8be577410l,0xfd408a035077a8c6l,0xf1f63289ec0a63a4l, 15012 0x77414082c1cc8c0bl }, 15013 { 0x05a40fa6eb0991cdl,0xc1ca086649fdc296l,0x3a68a3c7b324fd40l, 15014 0x8cb04f4d12eb20b9l }, 15015 0 }, 15016 /* 100 */ 15017 { { 0xb1c2d0556906171cl,0x9073e9cdb0240c3fl,0xdb8e6b4fd8906841l, 15018 0xe4e429ef47123b51l }, 15019 { 0x0b8dd53c38ec36f4l,0xf9d2dc01ff4b6a27l,0x5d066e07879a9a48l, 15020 0x37bca2ff3c6e6552l }, 15021 0 }, 15022 /* 101 */ 15023 { { 0x4cd2e3c7df562470l,0x44f272a2c0964ac9l,0x7c6d5df980c793bel, 15024 0x59913edc3002b22al }, 15025 { 0x7a139a835750592al,0x99e01d80e783de02l,0xcf8c0375ea05d64fl, 15026 0x43786e4ab013e226l }, 15027 0 }, 15028 /* 102 */ 15029 { { 0xff32b0ed9e56b5a6l,0x0750d9a6d9fc68f9l,0xec15e845597846a7l, 15030 0x8638ca98b7e79e7al }, 15031 { 0x2f5ae0960afc24b2l,0x05398eaf4dace8f2l,0x3b765dd0aecba78fl, 15032 0x1ecdd36a7b3aa6f0l }, 15033 0 }, 15034 /* 103 */ 15035 { { 0x5d3acd626c5ff2f3l,0xa2d516c02873a978l,0xad94c9fad2110d54l, 15036 0xd85d0f85d459f32dl }, 15037 { 0x9f700b8d10b11da3l,0xd2c22c30a78318c4l,0x556988f49208decdl, 15038 0xa04f19c3b4ed3c62l }, 15039 0 }, 15040 /* 104 */ 15041 { { 0x087924c8ed7f93bdl,0xcb64ac5d392f51f6l,0x7cae330a821b71afl, 15042 0x92b2eeea5c0950b0l }, 15043 { 0x85ac4c9485b6e235l,0xab2ca4a92936c0f0l,0x80faa6b3e0508891l, 15044 0x1ee782215834276cl }, 15045 0 }, 15046 /* 105 */ 15047 { { 0xa60a2e00e63e79f7l,0xf590e7b2f399d906l,0x9021054a6607c09dl, 15048 0xf3f2ced857a6e150l }, 15049 { 0x200510f3f10d9b55l,0x9d2fcfacd8642648l,0xe5631aa7e8bd0e7cl, 15050 0x0f56a4543da3e210l }, 15051 0 }, 15052 /* 106 */ 15053 { { 0x5b21bffa1043e0dfl,0x6c74b6cc9c007e6dl,0x1a656ec0d4a8517al, 15054 0xbd8f17411969e263l }, 15055 { 0x8a9bbb86beb7494al,0x1567d46f45f3b838l,0xdf7a12a7a4e5a79al, 15056 0x2d1a1c3530ccfa09l }, 15057 0 }, 15058 /* 107 */ 15059 { { 0x192e3813506508dal,0x336180c4a1d795a7l,0xcddb59497a9944b3l, 15060 0xa107a65eb91fba46l }, 15061 { 0xe6d1d1c50f94d639l,0x8b4af3758a58b7d7l,0x1a7c5584bd37ca1cl, 15062 0x183d760af87a9af2l }, 15063 0 }, 15064 /* 108 */ 15065 { { 0x29d697110dde59a4l,0xf1ad8d070e8bef87l,0x229b49634f2ebe78l, 15066 0x1d44179dc269d754l }, 15067 { 0xb32dc0cf8390d30el,0x0a3b27530de8110cl,0x31af1dc52bc0339al, 15068 0x771f9cc29606d262l }, 15069 0 }, 15070 /* 109 */ 15071 { { 0x99993e7785040739l,0x44539db98026a939l,0xcf40f6f2f5f8fc26l, 15072 0x64427a310362718el }, 15073 { 0x4f4f2d8785428aa8l,0x7b7adc3febfb49a8l,0x201b2c6df23d01acl, 15074 0x49d9b7496ae90d6dl }, 15075 0 }, 15076 /* 110 */ 15077 { { 0xcc78d8bc435d1099l,0x2adbcd4e8e8d1a08l,0x02c2e2a02cb68a41l, 15078 0x9037d81b3f605445l }, 15079 { 0x7cdbac27074c7b61l,0xfe2031ab57bfd72el,0x61ccec96596d5352l, 15080 0x08c3de6a7cc0639cl }, 15081 0 }, 15082 /* 111 */ 15083 { { 0x20fdd020f6d552abl,0x56baff9805cd81f1l,0x06fb7c3e91351291l, 15084 0xc690944245796b2fl }, 15085 { 0x17b3ae9c41231bd1l,0x1eac6e875cc58205l,0x208837abf9d6a122l, 15086 0x3fa3db02cafe3ac0l }, 15087 0 }, 15088 /* 112 */ 15089 { { 0xd75a3e6505058880l,0x7da365ef643943f2l,0x4147861cfab24925l, 15090 0xc5c4bdb0fdb808ffl }, 15091 { 0x73513e34b272b56bl,0xc8327e9511b9043al,0xfd8ce37df8844969l, 15092 0x2d56db9446c2b6b5l }, 15093 0 }, 15094 /* 113 */ 15095 { { 0x2461782fff46ac6bl,0xd19f792607a2e425l,0xfafea3c409a48de1l, 15096 0x0f56bd9de503ba42l }, 15097 { 0x137d4ed1345cda49l,0x821158fc816f299dl,0xe7c6a54aaeb43402l, 15098 0x4003bb9d1173b5f1l }, 15099 0 }, 15100 /* 114 */ 15101 { { 0x3b8e8189a0803387l,0xece115f539cbd404l,0x4297208dd2877f21l, 15102 0x53765522a07f2f9el }, 15103 { 0xa4980a21a8a4182dl,0xa2bbd07a3219df79l,0x674d0a2e1a19a2d4l, 15104 0x7a056f586c5d4549l }, 15105 0 }, 15106 /* 115 */ 15107 { { 0x646b25589d8a2a47l,0x5b582948c3df2773l,0x51ec000eabf0d539l, 15108 0x77d482f17a1a2675l }, 15109 { 0xb8a1bd9587853948l,0xa6f817bd6cfbffeel,0xab6ec05780681e47l, 15110 0x4115012b2b38b0e4l }, 15111 0 }, 15112 /* 116 */ 15113 { { 0x3c73f0f46de28cedl,0x1d5da7609b13ec47l,0x61b8ce9e6e5c6392l, 15114 0xcdf04572fbea0946l }, 15115 { 0x1cb3c58b6c53c3b0l,0x97fe3c10447b843cl,0xfb2b8ae12cb9780el, 15116 0xee703dda97383109l }, 15117 0 }, 15118 /* 117 */ 15119 { { 0x34515140ff57e43al,0xd44660d3b1b811b8l,0x2b3b5dff8f42b986l, 15120 0x2a0ad89da162ce21l }, 15121 { 0x64e4a6946bc277bal,0xc788c954c141c276l,0x141aa64ccabf6274l, 15122 0xd62d0b67ac2b4659l }, 15123 0 }, 15124 /* 118 */ 15125 { { 0x39c5d87b2c054ac4l,0x57005859f27df788l,0xedf7cbf3b18128d6l, 15126 0xb39a23f2991c2426l }, 15127 { 0x95284a15f0b16ae5l,0x0c6a05b1a136f51bl,0x1d63c137f2700783l, 15128 0x04ed0092c0674cc5l }, 15129 0 }, 15130 /* 119 */ 15131 { { 0x1f4185d19ae90393l,0x3047b4294a3d64e6l,0xae0001a69854fc14l, 15132 0xa0a91fc10177c387l }, 15133 { 0xff0a3f01ae2c831el,0xbb76ae822b727e16l,0x8f12c8a15a3075b4l, 15134 0x084cf9889ed20c41l }, 15135 0 }, 15136 /* 120 */ 15137 { { 0xd98509defca6becfl,0x2fceae807dffb328l,0x5d8a15c44778e8b9l, 15138 0xd57955b273abf77el }, 15139 { 0x210da79e31b5d4f1l,0xaa52f04b3cfa7a1cl,0xd4d12089dc27c20bl, 15140 0x8e14ea4202d141f1l }, 15141 0 }, 15142 /* 121 */ 15143 { { 0xeed50345f2897042l,0x8d05331f43402c4al,0xc8d9c194c8bdfb21l, 15144 0x597e1a372aa4d158l }, 15145 { 0x0327ec1acf0bd68cl,0x6d4be0dcab024945l,0x5b9c8d7ac9fe3e84l, 15146 0xca3f0236199b4deal }, 15147 0 }, 15148 /* 122 */ 15149 { { 0x592a10b56170bd20l,0x0ea897f16d3f5de7l,0xa3363ff144b2ade2l, 15150 0xbde7fd7e309c07e4l }, 15151 { 0x516bb6d2b8f5432cl,0x210dc1cbe043444bl,0x3db01e6ff8f95b5al, 15152 0xb623ad0e0a7dd198l }, 15153 0 }, 15154 /* 123 */ 15155 { { 0xa75bd67560c7b65bl,0xab8c559023a4a289l,0xf8220fd0d7b26795l, 15156 0xd6aa2e4658ec137bl }, 15157 { 0x10abc00b5138bb85l,0x8c31d121d833a95cl,0xb24ff00b1702a32el, 15158 0x111662e02dcc513al }, 15159 0 }, 15160 /* 124 */ 15161 { { 0x78114015efb42b87l,0xbd9f5d701b6c4dffl,0x66ecccd7a7d7c129l, 15162 0xdb3ee1cb94b750f8l }, 15163 { 0xb26f3db0f34837cfl,0xe7eed18bb9578d4fl,0x5d2cdf937c56657dl, 15164 0x886a644252206a59l }, 15165 0 }, 15166 /* 125 */ 15167 { { 0x3c234cfb65b569eal,0x20011141f72119c1l,0x8badc85da15a619el, 15168 0xa70cf4eb018a17bcl }, 15169 { 0x224f97ae8c4a6a65l,0x36e5cf270134378fl,0xbe3a609e4f7e0960l, 15170 0xaa4772abd1747b77l }, 15171 0 }, 15172 /* 126 */ 15173 { { 0x676761317aa60cc0l,0xc79163610368115fl,0xded98bb4bbc1bb5al, 15174 0x611a6ddc30faf974l }, 15175 { 0x30e78cbcc15ee47al,0x2e8962824e0d96a5l,0x36f35adf3dd9ed88l, 15176 0x5cfffaf816429c88l }, 15177 0 }, 15178 /* 127 */ 15179 { { 0xc0d54cff9b7a99cdl,0x7bf3b99d843c45a1l,0x038a908f62c739e1l, 15180 0x6e5a6b237dc1994cl }, 15181 { 0xef8b454e0ba5db77l,0xb7b8807facf60d63l,0xe591c0c676608378l, 15182 0x481a238d242dabccl }, 15183 0 }, 15184 /* 128 */ 15185 { { 0xe3417bc035d0b34al,0x440b386b8327c0a7l,0x8fb7262dac0362d1l, 15186 0x2c41114ce0cdf943l }, 15187 { 0x2ba5cef1ad95a0b1l,0xc09b37a867d54362l,0x26d6cdd201e486c9l, 15188 0x20477abf42ff9297l }, 15189 0 }, 15190 /* 129 */ 15191 { { 0x2f75173c18d65dbfl,0x77bf940e339edad8l,0x7022d26bdcf1001cl, 15192 0xac66409ac77396b6l }, 15193 { 0x8b0bb36fc6261cc3l,0x213f7bc9190e7e90l,0x6541cebaa45e6c10l, 15194 0xce8e6975cc122f85l }, 15195 0 }, 15196 /* 130 */ 15197 { { 0x0f121b41bc0a67d2l,0x62d4760a444d248al,0x0e044f1d659b4737l, 15198 0x08fde365250bb4a8l }, 15199 { 0xaceec3da848bf287l,0xc2a62182d3369d6el,0x3582dfdc92449482l, 15200 0x2f7e2fd2565d6cd7l }, 15201 0 }, 15202 /* 131 */ 15203 { { 0xae4b92dbc3770fa7l,0x095e8d5c379043f9l,0x54f34e9d17761171l, 15204 0xc65be92e907702ael }, 15205 { 0x2758a303f6fd0a40l,0xe7d822e3bcce784bl,0x7ae4f5854f9767bfl, 15206 0x4bff8e47d1193b3al }, 15207 0 }, 15208 /* 132 */ 15209 { { 0xcd41d21f00ff1480l,0x2ab8fb7d0754db16l,0xac81d2efbbe0f3eal, 15210 0x3e4e4ae65772967dl }, 15211 { 0x7e18f36d3c5303e6l,0x3bd9994b92262397l,0x9ed70e261324c3c0l, 15212 0x5388aefd58ec6028l }, 15213 0 }, 15214 /* 133 */ 15215 { { 0xad1317eb5e5d7713l,0x09b985ee75de49dal,0x32f5bc4fc74fb261l, 15216 0x5cf908d14f75be0el }, 15217 { 0x760435108e657b12l,0xbfd421a5b96ed9e6l,0x0e29f51f8970ccc2l, 15218 0xa698ba4060f00ce2l }, 15219 0 }, 15220 /* 134 */ 15221 { { 0x73db1686ef748fecl,0xe6e755a27e9d2cf9l,0x630b6544ce265effl, 15222 0xb142ef8a7aebad8dl }, 15223 { 0xad31af9f17d5770al,0x66af3b672cb3412fl,0x6bd60d1bdf3359del, 15224 0xd1896a9658515075l }, 15225 0 }, 15226 /* 135 */ 15227 { { 0xec5957ab33c41c08l,0x87de94ac5468e2e1l,0x18816b73ac472f6cl, 15228 0x267b0e0b7981da39l }, 15229 { 0x6e554e5d8e62b988l,0xd8ddc755116d21e7l,0x4610faf03d2a6f99l, 15230 0xb54e287aa1119393l }, 15231 0 }, 15232 /* 136 */ 15233 { { 0x0a0122b5178a876bl,0x51ff96ff085104b4l,0x050b31ab14f29f76l, 15234 0x84abb28b5f87d4e6l }, 15235 { 0xd5ed439f8270790al,0x2d6cb59d85e3f46bl,0x75f55c1b6c1e2212l, 15236 0xe5436f6717655640l }, 15237 0 }, 15238 /* 137 */ 15239 { { 0x53f9025e2286e8d5l,0x353c95b4864453bel,0xd832f5bde408e3a0l, 15240 0x0404f68b5b9ce99el }, 15241 { 0xcad33bdea781e8e5l,0x3cdf5018163c2f5bl,0x575769600119caa3l, 15242 0x3a4263df0ac1c701l }, 15243 0 }, 15244 /* 138 */ 15245 { { 0xc2965ecc9aeb596dl,0x01ea03e7023c92b4l,0x4704b4b62e013961l, 15246 0x0ca8fd3f905ea367l }, 15247 { 0x92523a42551b2b61l,0x1eb7a89c390fcd06l,0xe7f1d2be0392a63el, 15248 0x96dca2644ddb0c33l }, 15249 0 }, 15250 /* 139 */ 15251 { { 0x203bb43a387510afl,0x846feaa8a9a36a01l,0xd23a57702f950378l, 15252 0x4363e2123aad59dcl }, 15253 { 0xca43a1c740246a47l,0xb362b8d2e55dd24dl,0xf9b086045d8faf96l, 15254 0x840e115cd8bb98c4l }, 15255 0 }, 15256 /* 140 */ 15257 { { 0xf12205e21023e8a7l,0xc808a8cdd8dc7a0bl,0xe292a272163a5ddfl, 15258 0x5e0d6abd30ded6d4l }, 15259 { 0x07a721c27cfc0f64l,0x42eec01d0e55ed88l,0x26a7bef91d1f9db2l, 15260 0x7dea48f42945a25al }, 15261 0 }, 15262 /* 141 */ 15263 { { 0xabdf6f1ce5060a81l,0xe79f9c72f8f95615l,0xcfd36c5406ac268bl, 15264 0xabc2a2beebfd16d1l }, 15265 { 0x8ac66f91d3e2eac7l,0x6f10ba63d2dd0466l,0x6790e3770282d31bl, 15266 0x4ea353946c7eefc1l }, 15267 0 }, 15268 /* 142 */ 15269 { { 0xed8a2f8d5266309dl,0x0a51c6c081945a3el,0xcecaf45a578c5dc1l, 15270 0x3a76e6891c94ffc3l }, 15271 { 0x9aace8a47d7b0d0fl,0x963ace968f584a5fl,0x51a30c724e697fbel, 15272 0x8212a10a465e6464l }, 15273 0 }, 15274 /* 143 */ 15275 { { 0xef7c61c3cfab8caal,0x18eb8e840e142390l,0xcd1dff677e9733cal, 15276 0xaa7cab71599cb164l }, 15277 { 0x02fc9273bc837bd1l,0xc06407d0c36af5d7l,0x17621292f423da49l, 15278 0x40e38073fe0617c3l }, 15279 0 }, 15280 /* 144 */ 15281 { { 0xf4f80824a7bf9b7cl,0x365d23203fbe30d0l,0xbfbe532097cf9ce3l, 15282 0xe3604700b3055526l }, 15283 { 0x4dcb99116cc6c2c7l,0x72683708ba4cbee6l,0xdcded434637ad9ecl, 15284 0x6542d677a3dee15fl }, 15285 0 }, 15286 /* 145 */ 15287 { { 0x3f32b6d07b6c377al,0x6cb03847903448bel,0xd6fdd3a820da8af7l, 15288 0xa6534aee09bb6f21l }, 15289 { 0x30a1780d1035facfl,0x35e55a339dcb47e6l,0x6ea50fe1c447f393l, 15290 0xf3cb672fdc9aef22l }, 15291 0 }, 15292 /* 146 */ 15293 { { 0xeb3719fe3b55fd83l,0xe0d7a46c875ddd10l,0x33ac9fa905cea784l, 15294 0x7cafaa2eaae870e7l }, 15295 { 0x9b814d041d53b338l,0xe0acc0a0ef87e6c6l,0xfb93d10811672b0fl, 15296 0x0aab13c1b9bd522el }, 15297 0 }, 15298 /* 147 */ 15299 { { 0xddcce278d2681297l,0xcb350eb1b509546al,0x2dc431737661aaf2l, 15300 0x4b91a602847012e9l }, 15301 { 0xdcff109572f8ddcfl,0x08ebf61e9a911af4l,0x48f4360ac372430el, 15302 0x49534c5372321cabl }, 15303 0 }, 15304 /* 148 */ 15305 { { 0x83df7d71f07b7e9dl,0xa478efa313cd516fl,0x78ef264b6c047ee3l, 15306 0xcaf46c4fd65ac5eel }, 15307 { 0xa04d0c7792aa8266l,0xedf45466913684bbl,0x56e65168ae4b16b0l, 15308 0x14ce9e5704c6770fl }, 15309 0 }, 15310 /* 149 */ 15311 { { 0x99445e3e965e8f91l,0xd3aca1bacb0f2492l,0xd31cc70f90c8a0a0l, 15312 0x1bb708a53e4c9a71l }, 15313 { 0xd5ca9e69558bdd7al,0x734a0508018a26b1l,0xb093aa714c9cf1ecl, 15314 0xf9d126f2da300102l }, 15315 0 }, 15316 /* 150 */ 15317 { { 0x749bca7aaff9563el,0xdd077afeb49914a0l,0xe27a0311bf5f1671l, 15318 0x807afcb9729ecc69l }, 15319 { 0x7f8a9337c9b08b77l,0x86c3a785443c7e38l,0x85fafa59476fd8bal, 15320 0x751adcd16568cd8cl }, 15321 0 }, 15322 /* 151 */ 15323 { { 0x8aea38b410715c0dl,0xd113ea718f7697f7l,0x665eab1493fbf06dl, 15324 0x29ec44682537743fl }, 15325 { 0x3d94719cb50bebbcl,0x399ee5bfe4505422l,0x90cd5b3a8d2dedb1l, 15326 0xff9370e392a4077dl }, 15327 0 }, 15328 /* 152 */ 15329 { { 0x59a2d69bc6b75b65l,0x4188f8d5266651c5l,0x28a9f33e3de9d7d2l, 15330 0x9776478ba2a9d01al }, 15331 { 0x8852622d929af2c7l,0x334f5d6d4e690923l,0xce6cc7e5a89a51e9l, 15332 0x74a6313fac2f82fal }, 15333 0 }, 15334 /* 153 */ 15335 { { 0xb2f4dfddb75f079cl,0x85b07c9518e36fbbl,0x1b6cfcf0e7cd36ddl, 15336 0xab75be150ff4863dl }, 15337 { 0x81b367c0173fc9b7l,0xb90a7420d2594fd0l,0x15fdbf03c4091236l, 15338 0x4ebeac2e0b4459f6l }, 15339 0 }, 15340 /* 154 */ 15341 { { 0xeb6c5fe75c9f2c53l,0xd25220118eae9411l,0xc8887633f95ac5d8l, 15342 0xdf99887b2c1baffcl }, 15343 { 0xbb78eed2850aaecbl,0x9d49181b01d6a272l,0x978dd511b1cdbcacl, 15344 0x27b040a7779f4058l }, 15345 0 }, 15346 /* 155 */ 15347 { { 0x90405db7f73b2eb2l,0xe0df85088e1b2118l,0x501b71525962327el, 15348 0xb393dd37e4cfa3f5l }, 15349 { 0xa1230e7b3fd75165l,0xd66344c2bcd33554l,0x6c36f1be0f7b5022l, 15350 0x09588c12d0463419l }, 15351 0 }, 15352 /* 156 */ 15353 { { 0xe086093f02601c3bl,0xfb0252f8cf5c335fl,0x955cf280894aff28l, 15354 0x81c879a9db9f648bl }, 15355 { 0x040e687cc6f56c51l,0xfed471693f17618cl,0x44f88a419059353bl, 15356 0xfa0d48f55fc11bc4l }, 15357 0 }, 15358 /* 157 */ 15359 { { 0xbc6e1c9de1608e4dl,0x010dda113582822cl,0xf6b7ddc1157ec2d7l, 15360 0x8ea0e156b6a367d6l }, 15361 { 0xa354e02f2383b3b4l,0x69966b943f01f53cl,0x4ff6632b2de03ca5l, 15362 0x3f5ab924fa00b5acl }, 15363 0 }, 15364 /* 158 */ 15365 { { 0x337bb0d959739efbl,0xc751b0f4e7ebec0dl,0x2da52dd6411a67d1l, 15366 0x8bc768872b74256el }, 15367 { 0xa5be3b7282d3d253l,0xa9f679a1f58d779fl,0xa1cac168e16767bbl, 15368 0xb386f19060fcf34fl }, 15369 0 }, 15370 /* 159 */ 15371 { { 0x31f3c1352fedcfc2l,0x5396bf6262f8af0dl,0x9a02b4eae57288c2l, 15372 0x4cb460f71b069c4dl }, 15373 { 0xae67b4d35b8095eal,0x92bbf8596fc07603l,0xe1475f66b614a165l, 15374 0x52c0d50895ef5223l }, 15375 0 }, 15376 /* 160 */ 15377 { { 0x231c210e15339848l,0xe87a28e870778c8dl,0x9d1de6616956e170l, 15378 0x4ac3c9382bb09c0bl }, 15379 { 0x19be05516998987dl,0x8b2376c4ae09f4d6l,0x1de0b7651a3f933dl, 15380 0x380d94c7e39705f4l }, 15381 0 }, 15382 /* 161 */ 15383 { { 0x01a355aa81542e75l,0x96c724a1ee01b9b7l,0x6b3a2977624d7087l, 15384 0x2ce3e171de2637afl }, 15385 { 0xcfefeb49f5d5bc1al,0xa655607e2777e2b5l,0x4feaac2f9513756cl, 15386 0x2e6cd8520b624e4dl }, 15387 0 }, 15388 /* 162 */ 15389 { { 0x3685954b8c31c31dl,0x68533d005bf21a0cl,0x0bd7626e75c79ec9l, 15390 0xca17754742c69d54l }, 15391 { 0xcc6edafff6d2dbb2l,0xfd0d8cbd174a9d18l,0x875e8793aa4578e8l, 15392 0xa976a7139cab2ce6l }, 15393 0 }, 15394 /* 163 */ 15395 { { 0x0a651f1b93fb353dl,0xd75cab8b57fcfa72l,0xaa88cfa731b15281l, 15396 0x8720a7170a1f4999l }, 15397 { 0x8c3e8d37693e1b90l,0xd345dc0b16f6dfc3l,0x8ea8d00ab52a8742l, 15398 0x9719ef29c769893cl }, 15399 0 }, 15400 /* 164 */ 15401 { { 0x820eed8d58e35909l,0x9366d8dc33ddc116l,0xd7f999d06e205026l, 15402 0xa5072976e15704c1l }, 15403 { 0x002a37eac4e70b2el,0x84dcf6576890aa8al,0xcd71bf18645b2a5cl, 15404 0x99389c9df7b77725l }, 15405 0 }, 15406 /* 165 */ 15407 { { 0x238c08f27ada7a4bl,0x3abe9d03fd389366l,0x6b672e89766f512cl, 15408 0xa88806aa202c82e4l }, 15409 { 0x6602044ad380184el,0xa8cb78c4126a8b85l,0x79d670c0ad844f17l, 15410 0x0043bffb4738dcfel }, 15411 0 }, 15412 /* 166 */ 15413 { { 0x8d59b5dc36d5192el,0xacf885d34590b2afl,0x83566d0a11601781l, 15414 0x52f3ef01ba6c4866l }, 15415 { 0x3986732a0edcb64dl,0x0a482c238068379fl,0x16cbe5fa7040f309l, 15416 0x3296bd899ef27e75l }, 15417 0 }, 15418 /* 167 */ 15419 { { 0x476aba89454d81d7l,0x9eade7ef51eb9b3cl,0x619a21cd81c57986l, 15420 0x3b90febfaee571e9l }, 15421 { 0x9393023e5496f7cbl,0x55be41d87fb51bc4l,0x03f1dd4899beb5cel, 15422 0x6e88069d9f810b18l }, 15423 0 }, 15424 /* 168 */ 15425 { { 0xce37ab11b43ea1dbl,0x0a7ff1a95259d292l,0x851b02218f84f186l, 15426 0xa7222beadefaad13l }, 15427 { 0xa2ac78ec2b0a9144l,0x5a024051f2fa59c5l,0x91d1eca56147ce38l, 15428 0xbe94d523bc2ac690l }, 15429 0 }, 15430 /* 169 */ 15431 { { 0x72f4945e0b226ce7l,0xb8afd747967e8b70l,0xedea46f185a6c63el, 15432 0x7782defe9be8c766l }, 15433 { 0x760d2aa43db38626l,0x460ae78776f67ad1l,0x341b86fc54499cdbl, 15434 0x03838567a2892e4bl }, 15435 0 }, 15436 /* 170 */ 15437 { { 0x2d8daefd79ec1a0fl,0x3bbcd6fdceb39c97l,0xf5575ffc58f61a95l, 15438 0xdbd986c4adf7b420l }, 15439 { 0x81aa881415f39eb7l,0x6ee2fcf5b98d976cl,0x5465475dcf2f717dl, 15440 0x8e24d3c46860bbd0l }, 15441 0 }, 15442 /* 171 */ 15443 { { 0x749d8e549a587390l,0x12bb194f0cbec588l,0x46e07da4b25983c6l, 15444 0x541a99c4407bafc8l }, 15445 { 0xdb241692624c8842l,0x6044c12ad86c05ffl,0xc59d14b44f7fcf62l, 15446 0xc0092c49f57d35d1l }, 15447 0 }, 15448 /* 172 */ 15449 { { 0xd3cc75c3df2e61efl,0x7e8841c82e1b35cal,0xc62d30d1909f29f4l, 15450 0x75e406347286944dl }, 15451 { 0xe7d41fc5bbc237d0l,0xc9537bf0ec4f01c9l,0x91c51a16282bd534l, 15452 0x5b7cb658c7848586l }, 15453 0 }, 15454 /* 173 */ 15455 { { 0x964a70848a28ead1l,0x802dc508fd3b47f6l,0x9ae4bfd1767e5b39l, 15456 0x7ae13eba8df097a1l }, 15457 { 0xfd216ef8eadd384el,0x0361a2d9b6b2ff06l,0x204b98784bcdb5f3l, 15458 0x787d8074e2a8e3fdl }, 15459 0 }, 15460 /* 174 */ 15461 { { 0xc5e25d6b757fbb1cl,0xe47bddb2ca201debl,0x4a55e9a36d2233ffl, 15462 0x5c2228199ef28484l }, 15463 { 0x773d4a8588315250l,0x21b21a2b827097c1l,0xab7c4ea1def5d33fl, 15464 0xe45d37abbaf0f2b0l }, 15465 0 }, 15466 /* 175 */ 15467 { { 0xd2df1e3428511c8al,0xebb229c8bdca6cd3l,0x578a71a7627c39a7l, 15468 0xed7bc12284dfb9d3l }, 15469 { 0xcf22a6df93dea561l,0x5443f18dd48f0ed1l,0xd8b861405bad23e8l, 15470 0xaac97cc945ca6d27l }, 15471 0 }, 15472 /* 176 */ 15473 { { 0xeb54ea74a16bd00al,0xd839e9adf5c0bcc1l,0x092bb7f11f9bfc06l, 15474 0x318f97b31163dc4el }, 15475 { 0xecc0c5bec30d7138l,0x44e8df23abc30220l,0x2bb7972fb0223606l, 15476 0xfa41faa19a84ff4dl }, 15477 0 }, 15478 /* 177 */ 15479 { { 0x4402d974a6642269l,0xc81814ce9bb783bdl,0x398d38e47941e60bl, 15480 0x38bb6b2c1d26e9e2l }, 15481 { 0xc64e4a256a577f87l,0x8b52d253dc11fe1cl,0xff336abf62280728l, 15482 0x94dd0905ce7601a5l }, 15483 0 }, 15484 /* 178 */ 15485 { { 0x156cf7dcde93f92al,0xa01333cb89b5f315l,0x02404df9c995e750l, 15486 0x92077867d25c2ae9l }, 15487 { 0xe2471e010bf39d44l,0x5f2c902096bb53d7l,0x4c44b7b35c9c3d8fl, 15488 0x81e8428bd29beb51l }, 15489 0 }, 15490 /* 179 */ 15491 { { 0x6dd9c2bac477199fl,0x8cb8eeee6b5ecdd9l,0x8af7db3fee40fd0el, 15492 0x1b94ab62dbbfa4b1l }, 15493 { 0x44f0d8b3ce47f143l,0x51e623fc63f46163l,0xf18f270fcc599383l, 15494 0x06a38e28055590eel }, 15495 0 }, 15496 /* 180 */ 15497 { { 0x2e5b0139b3355b49l,0x20e26560b4ebf99bl,0xc08ffa6bd269f3dcl, 15498 0xa7b36c2083d9d4f8l }, 15499 { 0x64d15c3a1b3e8830l,0xd5fceae1a89f9c0bl,0xcfeee4a2e2d16930l, 15500 0xbe54c6b4a2822a20l }, 15501 0 }, 15502 /* 181 */ 15503 { { 0xd6cdb3df8d91167cl,0x517c3f79e7a6625el,0x7105648f346ac7f4l, 15504 0xbf30a5abeae022bbl }, 15505 { 0x8e7785be93828a68l,0x5161c3327f3ef036l,0xe11b5feb592146b2l, 15506 0xd1c820de2732d13al }, 15507 0 }, 15508 /* 182 */ 15509 { { 0x043e13479038b363l,0x58c11f546b05e519l,0x4fe57abe6026cad1l, 15510 0xb7d17bed68a18da3l }, 15511 { 0x44ca5891e29c2559l,0x4f7a03765bfffd84l,0x498de4af74e46948l, 15512 0x3997fd5e6412cc64l }, 15513 0 }, 15514 /* 183 */ 15515 { { 0xf20746828bd61507l,0x29e132d534a64d2al,0xffeddfb08a8a15e3l, 15516 0x0eeb89293c6c13e8l }, 15517 { 0xe9b69a3ea7e259f8l,0xce1db7e6d13e7e67l,0x277318f6ad1fa685l, 15518 0x228916f8c922b6efl }, 15519 0 }, 15520 /* 184 */ 15521 { { 0x959ae25b0a12ab5bl,0xcc11171f957bc136l,0x8058429ed16e2b0cl, 15522 0xec05ad1d6e93097el }, 15523 { 0x157ba5beac3f3708l,0x31baf93530b59d77l,0x47b55237118234e5l, 15524 0x7d3141567ff11b37l }, 15525 0 }, 15526 /* 185 */ 15527 { { 0x7bd9c05cf6dfefabl,0xbe2f2268dcb37707l,0xe53ead973a38bb95l, 15528 0xe9ce66fc9bc1d7a3l }, 15529 { 0x75aa15766f6a02a1l,0x38c087df60e600edl,0xf8947f3468cdc1b9l, 15530 0xd9650b0172280651l }, 15531 0 }, 15532 /* 186 */ 15533 { { 0x504b4c4a5a057e60l,0xcbccc3be8def25e4l,0xa635320817c1ccbdl, 15534 0x14d6699a804eb7a2l }, 15535 { 0x2c8a8415db1f411al,0x09fbaf0bf80d769cl,0xb4deef901c2f77adl, 15536 0x6f4c68410d43598al }, 15537 0 }, 15538 /* 187 */ 15539 { { 0x8726df4e96c24a96l,0x534dbc85fcbd99a3l,0x3c466ef28b2ae30al, 15540 0x4c4350fd61189abbl }, 15541 { 0x2967f716f855b8dal,0x41a42394463c38a1l,0xc37e1413eae93343l, 15542 0xa726d2425a3118b5l }, 15543 0 }, 15544 /* 188 */ 15545 { { 0xdae6b3ee948c1086l,0xf1de503dcbd3a2e1l,0x3f35ed3f03d022f3l, 15546 0x13639e82cc6cf392l }, 15547 { 0x9ac938fbcdafaa86l,0xf45bc5fb2654a258l,0x1963b26e45051329l, 15548 0xca9365e1c1a335a3l }, 15549 0 }, 15550 /* 189 */ 15551 { { 0x3615ac754c3b2d20l,0x742a5417904e241bl,0xb08521c4cc9d071dl, 15552 0x9ce29c34970b72a5l }, 15553 { 0x8cc81f736d3e0ad6l,0x8060da9ef2f8434cl,0x35ed1d1a6ce862d9l, 15554 0x48c4abd7ab42af98l }, 15555 0 }, 15556 /* 190 */ 15557 { { 0xd221b0cc40c7485al,0xead455bbe5274dbfl,0x493c76989263d2e8l, 15558 0x78017c32f67b33cbl }, 15559 { 0xb9d35769930cb5eel,0xc0d14e940c408ed2l,0xf8b7bf55272f1a4dl, 15560 0x53cd0454de5c1c04l }, 15561 0 }, 15562 /* 191 */ 15563 { { 0xbcd585fa5d28ccacl,0x5f823e56005b746el,0x7c79f0a1cd0123aal, 15564 0xeea465c1d3d7fa8fl }, 15565 { 0x7810659f0551803bl,0x6c0b599f7ce6af70l,0x4195a77029288e70l, 15566 0x1b6e42a47ae69193l }, 15567 0 }, 15568 /* 192 */ 15569 { { 0x2e80937cf67d04c3l,0x1e312be289eeb811l,0x56b5d88792594d60l, 15570 0x0224da14187fbd3dl }, 15571 { 0x87abb8630c5fe36fl,0x580f3c604ef51f5fl,0x964fb1bfb3b429ecl, 15572 0x60838ef042bfff33l }, 15573 0 }, 15574 /* 193 */ 15575 { { 0x432cb2f27e0bbe99l,0x7bda44f304aa39eel,0x5f497c7a9fa93903l, 15576 0x636eb2022d331643l }, 15577 { 0xfcfd0e6193ae00aal,0x875a00fe31ae6d2fl,0xf43658a29f93901cl, 15578 0x8844eeb639218bacl }, 15579 0 }, 15580 /* 194 */ 15581 { { 0x114171d26b3bae58l,0x7db3df7117e39f3el,0xcd37bc7f81a8eadal, 15582 0x27ba83dc51fb789el }, 15583 { 0xa7df439ffbf54de5l,0x7277030bb5fe1a71l,0x42ee8e35db297a48l, 15584 0xadb62d3487f3a4abl }, 15585 0 }, 15586 /* 195 */ 15587 { { 0x9b1168a2a175df2al,0x082aa04f618c32e9l,0xc9e4f2e7146b0916l, 15588 0xb990fd7675e7c8b2l }, 15589 { 0x0829d96b4df37313l,0x1c205579d0b40789l,0x66c9ae4a78087711l, 15590 0x81707ef94d10d18dl }, 15591 0 }, 15592 /* 196 */ 15593 { { 0x97d7cab203d6ff96l,0x5b851bfc0d843360l,0x268823c4d042db4bl, 15594 0x3792daead5a8aa5cl }, 15595 { 0x52818865941afa0bl,0xf3e9e74142d83671l,0x17c825275be4e0a7l, 15596 0x5abd635e94b001bal }, 15597 0 }, 15598 /* 197 */ 15599 { { 0x727fa84e0ac4927cl,0xe3886035a7c8cf23l,0xa4bcd5ea4adca0dfl, 15600 0x5995bf21846ab610l }, 15601 { 0xe90f860b829dfa33l,0xcaafe2ae958fc18bl,0x9b3baf4478630366l, 15602 0x44c32ca2d483411el }, 15603 0 }, 15604 /* 198 */ 15605 { { 0xa74a97f1e40ed80cl,0x5f938cb131d2ca82l,0x53f2124b7c2d6ad9l, 15606 0x1f2162fb8082a54cl }, 15607 { 0x7e467cc5720b173el,0x40e8a666085f12f9l,0x8cebc20e4c9d65dcl, 15608 0x8f1d402bc3e907c9l }, 15609 0 }, 15610 /* 199 */ 15611 { { 0x4f592f9cfbc4058al,0xb15e14b6292f5670l,0xc55cfe37bc1d8c57l, 15612 0xb1980f43926edbf9l }, 15613 { 0x98c33e0932c76b09l,0x1df5279d33b07f78l,0x6f08ead4863bb461l, 15614 0x2828ad9b37448e45l }, 15615 0 }, 15616 /* 200 */ 15617 { { 0x696722c4c4cf4ac5l,0xf5ac1a3fdde64afbl,0x0551baa2e0890832l, 15618 0x4973f1275a14b390l }, 15619 { 0xe59d8335322eac5dl,0x5e07eef50bd9b568l,0xab36720fa2588393l, 15620 0x6dac8ed0db168ac7l }, 15621 0 }, 15622 /* 201 */ 15623 { { 0xf7b545aeeda835efl,0x4aa113d21d10ed51l,0x035a65e013741b09l, 15624 0x4b23ef5920b9de4cl }, 15625 { 0xe82bb6803c4c7341l,0xd457706d3f58bc37l,0x73527863a51e3ee8l, 15626 0x4dd71534ddf49a4el }, 15627 0 }, 15628 /* 202 */ 15629 { { 0xbf94467295476cd9l,0x648d072fe31a725bl,0x1441c8b8fc4b67e0l, 15630 0xfd3170002f4a4dbbl }, 15631 { 0x1cb43ff48995d0e1l,0x76e695d10ef729aal,0xe0d5f97641798982l, 15632 0x14fac58c9569f365l }, 15633 0 }, 15634 /* 203 */ 15635 { { 0xad9a0065f312ae18l,0x51958dc0fcc93fc9l,0xd9a142408a7d2846l, 15636 0xed7c765136abda50l }, 15637 { 0x46270f1a25d4abbcl,0x9b5dd8f3f1a113eal,0xc609b0755b51952fl, 15638 0xfefcb7f74d2e9f53l }, 15639 0 }, 15640 /* 204 */ 15641 { { 0xbd09497aba119185l,0xd54e8c30aac45ba4l,0x492479deaa521179l, 15642 0x1801a57e87e0d80bl }, 15643 { 0x073d3f8dfcafffb0l,0x6cf33c0bae255240l,0x781d763b5b5fdfbcl, 15644 0x9f8fc11e1ead1064l }, 15645 0 }, 15646 /* 205 */ 15647 { { 0x1583a1715e69544cl,0x0eaf8567f04b7813l,0x1e22a8fd278a4c32l, 15648 0xa9d3809d3d3a69a9l }, 15649 { 0x936c2c2c59a2da3bl,0x38ccbcf61895c847l,0x5e65244e63d50869l, 15650 0x3006b9aee1178ef7l }, 15651 0 }, 15652 /* 206 */ 15653 { { 0x0bb1f2b0c9eead28l,0x7eef635d89f4dfbcl,0x074757fdb2ce8939l, 15654 0x0ab85fd745f8f761l }, 15655 { 0xecda7c933e5b4549l,0x4be2bb5c97922f21l,0x261a1274b43b8040l, 15656 0xb122d67511e942c2l }, 15657 0 }, 15658 /* 207 */ 15659 { { 0x3be607be66a5ae7al,0x01e703fa76adcbe3l,0xaf9043014eb6e5c5l, 15660 0x9f599dc1097dbaecl }, 15661 { 0x6d75b7180ff250edl,0x8eb91574349a20dcl,0x425605a410b227a3l, 15662 0x7d5528e08a294b78l }, 15663 0 }, 15664 /* 208 */ 15665 { { 0xf0f58f6620c26defl,0x025585ea582b2d1el,0xfbe7d79b01ce3881l, 15666 0x28ccea01303f1730l }, 15667 { 0xd1dabcd179644ba5l,0x1fc643e806fff0b8l,0xa60a76fc66b3e17bl, 15668 0xc18baf48a1d013bfl }, 15669 0 }, 15670 /* 209 */ 15671 { { 0x34e638c85dc4216dl,0x00c01067206142acl,0xd453a17195f5064al, 15672 0x9def809db7a9596bl }, 15673 { 0x41e8642e67ab8d2cl,0xb42404336237a2b6l,0x7d506a6d64c4218bl, 15674 0x0357f8b068808ce5l }, 15675 0 }, 15676 /* 210 */ 15677 { { 0x8e9dbe644cd2cc88l,0xcc61c28df0b8f39dl,0x4a309874cd30a0c8l, 15678 0xe4a01add1b489887l }, 15679 { 0x2ed1eeacf57cd8f9l,0x1b767d3ebd594c48l,0xa7295c717bd2f787l, 15680 0x466d7d79ce10cc30l }, 15681 0 }, 15682 /* 211 */ 15683 { { 0x47d318929dada2c7l,0x4fa0a6c38f9aa27dl,0x90e4fd28820a59e1l, 15684 0xc672a522451ead1al }, 15685 { 0x30607cc85d86b655l,0xf0235d3bf9ad4af1l,0x99a08680571172a6l, 15686 0x5e3d64faf2a67513l }, 15687 0 }, 15688 /* 212 */ 15689 { { 0xaa6410c79b3b4416l,0xcd8fcf85eab26d99l,0x5ebff74adb656a74l, 15690 0x6c8a7a95eb8e42fcl }, 15691 { 0x10c60ba7b02a63bdl,0x6b2f23038b8f0047l,0x8c6c3738312d90b0l, 15692 0x348ae422ad82ca91l }, 15693 0 }, 15694 /* 213 */ 15695 { { 0x7f4746635ccda2fbl,0x22accaa18e0726d2l,0x85adf782492b1f20l, 15696 0xc1074de0d9ef2d2el }, 15697 { 0xfcf3ce44ae9a65b3l,0xfd71e4ac05d7151bl,0xd4711f50ce6a9788l, 15698 0xfbadfbdbc9e54ffcl }, 15699 0 }, 15700 /* 214 */ 15701 { { 0x1713f1cd20a99363l,0xb915658f6cf22775l,0x968175cd24d359b2l, 15702 0xb7f976b483716fcdl }, 15703 { 0x5758e24d5d6dbf74l,0x8d23bafd71c3af36l,0x48f477600243dfe3l, 15704 0xf4d41b2ecafcc805l }, 15705 0 }, 15706 /* 215 */ 15707 { { 0x51f1cf28fdabd48dl,0xce81be3632c078a4l,0x6ace2974117146e9l, 15708 0x180824eae0160f10l }, 15709 { 0x0387698b66e58358l,0x63568752ce6ca358l,0x82380e345e41e6c5l, 15710 0x67e5f63983cf6d25l }, 15711 0 }, 15712 /* 216 */ 15713 { { 0xf89ccb8dcf4899efl,0x949015f09ebb44c0l,0x546f9276b2598ec9l, 15714 0x9fef789a04c11fc6l }, 15715 { 0x6d367ecf53d2a071l,0xb10e1a7fa4519b09l,0xca6b3fb0611e2eefl, 15716 0xbc80c181a99c4e20l }, 15717 0 }, 15718 /* 217 */ 15719 { { 0x972536f8e5eb82e6l,0x1a484fc7f56cb920l,0xc78e217150b5da5el, 15720 0x49270e629f8cdf10l }, 15721 { 0x1a39b7bbea6b50adl,0x9a0284c1a2388ffcl,0x5403eb178107197bl, 15722 0xd2ee52f961372f7fl }, 15723 0 }, 15724 /* 218 */ 15725 { { 0xd37cd28588e0362al,0x442fa8a78fa5d94dl,0xaff836e5a434a526l, 15726 0xdfb478bee5abb733l }, 15727 { 0xa91f1ce7673eede6l,0xa5390ad42b5b2f04l,0x5e66f7bf5530da2fl, 15728 0xd9a140b408df473al }, 15729 0 }, 15730 /* 219 */ 15731 { { 0x0e0221b56e8ea498l,0x623478293563ee09l,0xe06b8391335d2adel, 15732 0x760c058d623f4b1al }, 15733 { 0x0b89b58cc198aa79l,0xf74890d2f07aba7fl,0x4e204110fde2556al, 15734 0x7141982d8f190409l }, 15735 0 }, 15736 /* 220 */ 15737 { { 0x6f0a0e334d4b0f45l,0xd9280b38392a94e1l,0x3af324c6b3c61d5el, 15738 0x3af9d1ce89d54e47l }, 15739 { 0xfd8f798120930371l,0xeda2664c21c17097l,0x0e9545dcdc42309bl, 15740 0xb1f815c373957dd6l }, 15741 0 }, 15742 /* 221 */ 15743 { { 0x84faa78e89fec44al,0xc8c2ae473caa4cafl,0x691c807dc1b6a624l, 15744 0xa41aed141543f052l }, 15745 { 0x424353997d5ffe04l,0x8bacb2df625b6e20l,0x85d660be87817775l, 15746 0xd6e9c1dd86fb60efl }, 15747 0 }, 15748 /* 222 */ 15749 { { 0x3aa2e97ec6853264l,0x771533b7e2304a0bl,0x1b912bb7b8eae9bel, 15750 0x9c9c6e10ae9bf8c2l }, 15751 { 0xa2309a59e030b74cl,0x4ed7494d6a631e90l,0x89f44b23a49b79f2l, 15752 0x566bd59640fa61b6l }, 15753 0 }, 15754 /* 223 */ 15755 { { 0x066c0118c18061f3l,0x190b25d37c83fc70l,0xf05fc8e027273245l, 15756 0xcf2c7390f525345el }, 15757 { 0xa09bceb410eb30cfl,0xcfd2ebba0d77703al,0xe842c43a150ff255l, 15758 0x02f517558aa20979l }, 15759 0 }, 15760 /* 224 */ 15761 { { 0x396ef794addb7d07l,0x0b4fc74224455500l,0xfaff8eacc78aa3cel, 15762 0x14e9ada5e8d4d97dl }, 15763 { 0xdaa480a12f7079e2l,0x45baa3cde4b0800el,0x01765e2d7838157dl, 15764 0xa0ad4fab8e9d9ae8l }, 15765 0 }, 15766 /* 225 */ 15767 { { 0x0bfb76214a653618l,0x1872813c31eaaa5fl,0x1553e73744949d5el, 15768 0xbcd530b86e56ed1el }, 15769 { 0x169be85332e9c47bl,0xdc2776feb50059abl,0xcdba9761192bfbb4l, 15770 0x909283cf6979341dl }, 15771 0 }, 15772 /* 226 */ 15773 { { 0x67b0032476e81a13l,0x9bee1a9962171239l,0x08ed361bd32e19d6l, 15774 0x35eeb7c9ace1549al }, 15775 { 0x1280ae5a7e4e5bdcl,0x2dcd2cd3b6ceec6el,0x52e4224c6e266bc1l, 15776 0x9a8b2cf4448ae864l }, 15777 0 }, 15778 /* 227 */ 15779 { { 0xf6471bf209d03b59l,0xc90e62a3b65af2abl,0xff7ff168ebd5eec9l, 15780 0x6bdb60f4d4491379l }, 15781 { 0xdadafebc8a55bc30l,0xc79ead1610097fe0l,0x42e197414c1e3bddl, 15782 0x01ec3cfd94ba08a9l }, 15783 0 }, 15784 /* 228 */ 15785 { { 0xba6277ebdc9485c2l,0x48cc9a7922fb10c7l,0x4f61d60f70a28d8al, 15786 0xd1acb1c0475464f6l }, 15787 { 0xd26902b126f36612l,0x59c3a44ee0618d8bl,0x4df8a813308357eel, 15788 0x7dcd079d405626c2l }, 15789 0 }, 15790 /* 229 */ 15791 { { 0x5ce7d4d3f05a4b48l,0xadcd295237230772l,0xd18f7971812a915al, 15792 0x0bf53589377d19b8l }, 15793 { 0x35ecd95a6c68ea73l,0xc7f3bbca823a584dl,0x9fb674c6f473a723l, 15794 0xd28be4d9e16686fcl }, 15795 0 }, 15796 /* 230 */ 15797 { { 0x5d2b990638fa8e4bl,0x559f186e893fd8fcl,0x3a6de2aa436fb6fcl, 15798 0xd76007aa510f88cel }, 15799 { 0x2d10aab6523a4988l,0xb455cf4474dd0273l,0x7f467082a3407278l, 15800 0xf2b52f68b303bb01l }, 15801 0 }, 15802 /* 231 */ 15803 { { 0x0d57eafa9835b4cal,0x2d2232fcbb669cbcl,0x8eeeb680c6643198l, 15804 0xd8dbe98ecc5aed3al }, 15805 { 0xcba9be3fc5a02709l,0x30be68e5f5ba1fa8l,0xfebd43cdf10ea852l, 15806 0xe01593a3ee559705l }, 15807 0 }, 15808 /* 232 */ 15809 { { 0xd3e5af50ea75a0a6l,0x512226ac57858033l,0x6fe6d50fd0176406l, 15810 0xafec07b1aeb8ef06l }, 15811 { 0x7fb9956780bb0a31l,0x6f1af3cc37309aael,0x9153a15a01abf389l, 15812 0xa71b93546e2dbfddl }, 15813 0 }, 15814 /* 233 */ 15815 { { 0xbf8e12e018f593d2l,0xd1a90428a078122bl,0x150505db0ba4f2adl, 15816 0x53a2005c628523d9l }, 15817 { 0x07c8b639e7f2b935l,0x2bff975ac182961al,0x86bceea77518ca2cl, 15818 0xbf47d19b3d588e3dl }, 15819 0 }, 15820 /* 234 */ 15821 { { 0x672967a7dd7665d5l,0x4e3030572f2f4de5l,0x144005ae80d4903fl, 15822 0x001c2c7f39c9a1b6l }, 15823 { 0x143a801469efc6d6l,0xc810bdaa7bc7a724l,0x5f65670ba78150a4l, 15824 0xfdadf8e786ffb99bl }, 15825 0 }, 15826 /* 235 */ 15827 { { 0xfd38cb88ffc00785l,0x77fa75913b48eb67l,0x0454d055bf368fbcl, 15828 0x3a838e4d5aa43c94l }, 15829 { 0x561663293e97bb9al,0x9eb93363441d94d9l,0x515591a60adb2a83l, 15830 0x3cdb8257873e1da3l }, 15831 0 }, 15832 /* 236 */ 15833 { { 0x137140a97de77eabl,0xf7e1c50d41648109l,0x762dcad2ceb1d0dfl, 15834 0x5a60cc89f1f57fbal }, 15835 { 0x80b3638240d45673l,0x1b82be195913c655l,0x057284b8dd64b741l, 15836 0x922ff56fdbfd8fc0l }, 15837 0 }, 15838 /* 237 */ 15839 { { 0x1b265deec9a129a1l,0xa5b1ce57cc284e04l,0x04380c46cebfbe3cl, 15840 0x72919a7df6c5cd62l }, 15841 { 0x298f453a8fb90f9al,0xd719c00b88e4031bl,0xe32c0e77796f1856l, 15842 0x5e7917803624089al }, 15843 0 }, 15844 /* 238 */ 15845 { { 0x5c16ec557f63cdfbl,0x8e6a3571f1cae4fdl,0xfce26bea560597cal, 15846 0x4e0a5371e24c2fabl }, 15847 { 0x276a40d3a5765357l,0x3c89af440d73a2b4l,0xb8f370ae41d11a32l, 15848 0xf5ff7818d56604eel }, 15849 0 }, 15850 /* 239 */ 15851 { { 0xfbf3e3fe1a09df21l,0x26d5d28ee66e8e47l,0x2096bd0a29c89015l, 15852 0xe41df0e9533f5e64l }, 15853 { 0x305fda40b3ba9e3fl,0xf2340ceb2604d895l,0x0866e1927f0367c7l, 15854 0x8edd7d6eac4f155fl }, 15855 0 }, 15856 /* 240 */ 15857 { { 0xc9a1dc0e0bfc8ff3l,0x14efd82be936f42fl,0x67016f7ccca381efl, 15858 0x1432c1caed8aee96l }, 15859 { 0xec68482970b23c26l,0xa64fe8730735b273l,0xe389f6e5eaef0f5al, 15860 0xcaef480b5ac8d2c6l }, 15861 0 }, 15862 /* 241 */ 15863 { { 0x5245c97875315922l,0xd82951713063cca5l,0xf3ce60d0b64ef2cbl, 15864 0xd0ba177e8efae236l }, 15865 { 0x53a9ae8fb1b3af60l,0x1a796ae53d2da20el,0x01d63605df9eef28l, 15866 0xf31c957c1c54ae16l }, 15867 0 }, 15868 /* 242 */ 15869 { { 0xc0f58d5249cc4597l,0xdc5015b0bae0a028l,0xefc5fc55734a814al, 15870 0x013404cb96e17c3al }, 15871 { 0xb29e2585c9a824bfl,0xd593185e001eaed7l,0x8d6ee68261ef68acl, 15872 0x6f377c4b91933e6cl }, 15873 0 }, 15874 /* 243 */ 15875 { { 0x9f93bad1a8333fd2l,0xa89302025a2a95b8l,0x211e5037eaf75acel, 15876 0x6dba3e4ed2d09506l }, 15877 { 0xa48ef98cd04399cdl,0x1811c66ee6b73adel,0x72f60752c17ecaf3l, 15878 0xf13cf3423becf4a7l }, 15879 0 }, 15880 /* 244 */ 15881 { { 0xceeb9ec0a919e2ebl,0x83a9a195f62c0f68l,0xcfba3bb67aba2299l, 15882 0xc83fa9a9274bbad3l }, 15883 { 0x0d7d1b0b62fa1ce0l,0xe58b60f53418efbfl,0xbfa8ef9e52706f04l, 15884 0xb49d70f45d702683l }, 15885 0 }, 15886 /* 245 */ 15887 { { 0x914c7510fad5513bl,0x05f32eecb1751e2dl,0x6d850418d9fb9d59l, 15888 0x59cfadbb0c30f1cfl }, 15889 { 0xe167ac2355cb7fd6l,0x249367b8820426a3l,0xeaeec58c90a78864l, 15890 0x5babf362354a4b67l }, 15891 0 }, 15892 /* 246 */ 15893 { { 0x37c981d1ee424865l,0x8b002878f2e5577fl,0x702970f1b9e0c058l, 15894 0x6188c6a79026c8f0l }, 15895 { 0x06f9a19bd0f244dal,0x1ecced5cfb080873l,0x35470f9b9f213637l, 15896 0x993fe475df50b9d9l }, 15897 0 }, 15898 /* 247 */ 15899 { { 0x68e31cdf9b2c3609l,0x84eb19c02c46d4eal,0x7ac9ec1a9a775101l, 15900 0x81f764664c80616bl }, 15901 { 0x1d7c2a5a75fbe978l,0x6743fed3f183b356l,0x838d1f04501dd2bfl, 15902 0x564a812a5fe9060dl }, 15903 0 }, 15904 /* 248 */ 15905 { { 0x7a5a64f4fa817d1dl,0x55f96844bea82e0fl,0xb5ff5a0fcd57f9aal, 15906 0x226bf3cf00e51d6cl }, 15907 { 0xd6d1a9f92f2833cfl,0x20a0a35a4f4f89a8l,0x11536c498f3f7f77l, 15908 0x68779f47ff257836l }, 15909 0 }, 15910 /* 249 */ 15911 { { 0x79b0c1c173043d08l,0xa54467741fc020fal,0xd3767e289a6d26d0l, 15912 0x97bcb0d1eb092e0bl }, 15913 { 0x2ab6eaa8f32ed3c3l,0xc8a4f151b281bc48l,0x4d1bf4f3bfa178f3l, 15914 0xa872ffe80a784655l }, 15915 0 }, 15916 /* 250 */ 15917 { { 0xb1ab7935a32b2086l,0xe1eb710e8160f486l,0x9bd0cd913b6ae6bel, 15918 0x02812bfcb732a36al }, 15919 { 0xa63fd7cacf605318l,0x646e5d50fdfd6d1dl,0xa1d683982102d619l, 15920 0x07391cc9fe5396afl }, 15921 0 }, 15922 /* 251 */ 15923 { { 0xc50157f08b80d02bl,0x6b8333d162877f7fl,0x7aca1af878d542ael, 15924 0x355d2adc7e6d2a08l }, 15925 { 0xb41f335a287386e1l,0xfd272a94f8e43275l,0x286ca2cde79989eal, 15926 0x3dc2b1e37c2a3a79l }, 15927 0 }, 15928 /* 252 */ 15929 { { 0xd689d21c04581352l,0x0a00c825376782bel,0x203bd5909fed701fl, 15930 0xc47869103ccd846bl }, 15931 { 0x5dba770824c768edl,0x72feea026841f657l,0x73313ed56accce0el, 15932 0xccc42968d5bb4d32l }, 15933 0 }, 15934 /* 253 */ 15935 { { 0x94e50de13d7620b9l,0xd89a5c8a5992a56al,0xdc007640675487c9l, 15936 0xe147eb42aa4871cfl }, 15937 { 0x274ab4eeacf3ae46l,0xfd4936fb50350fbel,0xdf2afe4748c840eal, 15938 0x239ac047080e96e3l }, 15939 0 }, 15940 /* 254 */ 15941 { { 0x481d1f352bfee8d4l,0xce80b5cffa7b0fecl,0x105c4c9e2ce9af3cl, 15942 0xc55fa1a3f5f7e59dl }, 15943 { 0x3186f14e8257c227l,0xc5b1653f342be00bl,0x09afc998aa904fb2l, 15944 0x094cd99cd4f4b699l }, 15945 0 }, 15946 /* 255 */ 15947 { { 0x8a981c84d703bebal,0x8631d15032ceb291l,0xa445f2c9e3bd49ecl, 15948 0xb90a30b642abad33l }, 15949 { 0xb465404fb4a5abf9l,0x004750c375db7603l,0x6f9a42ccca35d89fl, 15950 0x019f8b9a1b7924f7l }, 15951 0 }, 15952 }; 15953 15954 /* Multiply the base point of P256 by the scalar and return the result. 15955 * If map is true then convert result to affine co-ordinates. 15956 * 15957 * r Resulting point. 15958 * k Scalar to multiply by. 15959 * map Indicates whether to convert result to affine. 15960 * heap Heap to use for allocation. 15961 * returns MEMORY_E when memory allocation fails and MP_OKAY on success. 15962 */ 15963 static int sp_256_ecc_mulmod_base_4(sp_point* r, sp_digit* k, 15964 int map, void* heap) 15965 { 15966 return sp_256_ecc_mulmod_stripe_4(r, &p256_base, p256_table, 15967 k, map, heap); 15968 } 15969 15970 #else 15971 /* A table entry for pre-computed points. */ 15972 typedef struct sp_table_entry_sum { 15973 sp_digit x[4]; 15974 sp_digit y[4]; 15975 byte infinity; 15976 } sp_table_entry_sum; 15977 15978 /* Table of pre-computed values for P256 with 3 multiples and width of 8 bits. 15979 */ 15980 static sp_table_entry_sum p256_table[33][58] = { 15981 { 15982 /* 0 << 0 */ 15983 { { 0x00, 0x00, 0x00, 0x00 }, 15984 { 0x00, 0x00, 0x00, 0x00 }, 15985 1 }, 15986 /* 1 << 0 */ 15987 { { 0x79e730d418a9143cl,0x75ba95fc5fedb601l,0x79fb732b77622510l, 15988 0x18905f76a53755c6l }, 15989 { 0xddf25357ce95560al,0x8b4ab8e4ba19e45cl,0xd2e88688dd21f325l, 15990 0x8571ff1825885d85l }, 15991 0 }, 15992 /* 3 << 0 */ 15993 { { 0xffac3f904eebc127l,0xb027f84a087d81fbl,0x66ad77dd87cbbc98l, 15994 0x26936a3fb6ff747el }, 15995 { 0xb04c5c1fc983a7ebl,0x583e47ad0861fe1al,0x788208311a2ee98el, 15996 0xd5f06a29e587cc07l }, 15997 0 }, 15998 /* 4 << 0 */ 15999 { { 0x74b0b50d46918dccl,0x4650a6edc623c173l,0x0cdaacace8100af2l, 16000 0x577362f541b0176bl }, 16001 { 0x2d96f24ce4cbaba6l,0x17628471fad6f447l,0x6b6c36dee5ddd22el, 16002 0x84b14c394c5ab863l }, 16003 0 }, 16004 /* 5 << 0 */ 16005 { { 0xbe1b8aaec45c61f5l,0x90ec649a94b9537dl,0x941cb5aad076c20cl, 16006 0xc9079605890523c8l }, 16007 { 0xeb309b4ae7ba4f10l,0x73c568efe5eb882bl,0x3540a9877e7a1f68l, 16008 0x73a076bb2dd1e916l }, 16009 0 }, 16010 /* 7 << 0 */ 16011 { { 0x0746354ea0173b4fl,0x2bd20213d23c00f7l,0xf43eaab50c23bb08l, 16012 0x13ba5119c3123e03l }, 16013 { 0x2847d0303f5b9d4dl,0x6742f2f25da67bddl,0xef933bdc77c94195l, 16014 0xeaedd9156e240867l }, 16015 0 }, 16016 /* 9 << 0 */ 16017 { { 0x75c96e8f264e20e8l,0xabe6bfed59a7a841l,0x2cc09c0444c8eb00l, 16018 0xe05b3080f0c4e16bl }, 16019 { 0x1eb7777aa45f3314l,0x56af7bedce5d45e3l,0x2b6e019a88b12f1al, 16020 0x086659cdfd835f9bl }, 16021 0 }, 16022 /* 10 << 0 */ 16023 { { 0x2c18dbd19dc21ec8l,0x98f9868a0fcf8139l,0x737d2cd648250b49l, 16024 0xcc61c94724b3428fl }, 16025 { 0x0c2b407880dd9e76l,0xc43a8991383fbe08l,0x5f7d2d65779be5d2l, 16026 0x78719a54eb3b4ab5l }, 16027 0 }, 16028 /* 11 << 0 */ 16029 { { 0xea7d260a6245e404l,0x9de407956e7fdfe0l,0x1ff3a4158dac1ab5l, 16030 0x3e7090f1649c9073l }, 16031 { 0x1a7685612b944e88l,0x250f939ee57f61c8l,0x0c0daa891ead643dl, 16032 0x68930023e125b88el }, 16033 0 }, 16034 /* 13 << 0 */ 16035 { { 0xccc425634b2ed709l,0x0e356769856fd30dl,0xbcbcd43f559e9811l, 16036 0x738477ac5395b759l }, 16037 { 0x35752b90c00ee17fl,0x68748390742ed2e3l,0x7cd06422bd1f5bc1l, 16038 0xfbc08769c9e7b797l }, 16039 0 }, 16040 /* 15 << 0 */ 16041 { { 0x72bcd8b7bc60055bl,0x03cc23ee56e27e4bl,0xee337424e4819370l, 16042 0xe2aa0e430ad3da09l }, 16043 { 0x40b8524f6383c45dl,0xd766355442a41b25l,0x64efa6de778a4797l, 16044 0x2042170a7079adf4l }, 16045 0 }, 16046 /* 16 << 0 */ 16047 { { 0x808b0b650bc6fb80l,0x5882e0753ffe2e6bl,0xd5ef2f7c2c83f549l, 16048 0x54d63c809103b723l }, 16049 { 0xf2f11bd652a23f9bl,0x3670c3194b0b6587l,0x55c4623bb1580e9el, 16050 0x64edf7b201efe220l }, 16051 0 }, 16052 /* 17 << 0 */ 16053 { { 0x97091dcbd53c5c9dl,0xf17624b6ac0a177bl,0xb0f139752cfe2dffl, 16054 0xc1a35c0a6c7a574el }, 16055 { 0x227d314693e79987l,0x0575bf30e89cb80el,0x2f4e247f0d1883bbl, 16056 0xebd512263274c3d0l }, 16057 0 }, 16058 /* 19 << 0 */ 16059 { { 0xfea912baa5659ae8l,0x68363aba25e1a16el,0xb8842277752c41acl, 16060 0xfe545c282897c3fcl }, 16061 { 0x2d36e9e7dc4c696bl,0x5806244afba977c5l,0x85665e9be39508c1l, 16062 0xf720ee256d12597bl }, 16063 0 }, 16064 /* 21 << 0 */ 16065 { { 0x562e4cecc135b208l,0x74e1b2654783f47dl,0x6d2a506c5a3f3b30l, 16066 0xecead9f4c16762fcl }, 16067 { 0xf29dd4b2e286e5b9l,0x1b0fadc083bb3c61l,0x7a75023e7fac29a4l, 16068 0xc086d5f1c9477fa3l }, 16069 0 }, 16070 /* 23 << 0 */ 16071 { { 0xf4f876532de45068l,0x37c7a7e89e2e1f6el,0xd0825fa2a3584069l, 16072 0xaf2cea7c1727bf42l }, 16073 { 0x0360a4fb9e4785a9l,0xe5fda49c27299f4al,0x48068e1371ac2f71l, 16074 0x83d0687b9077666fl }, 16075 0 }, 16076 /* 25 << 0 */ 16077 { { 0xa4a319acd837879fl,0x6fc1b49eed6b67b0l,0xe395993332f1f3afl, 16078 0x966742eb65432a2el }, 16079 { 0x4b8dc9feb4966228l,0x96cc631243f43950l,0x12068859c9b731eel, 16080 0x7b948dc356f79968l }, 16081 0 }, 16082 /* 27 << 0 */ 16083 { { 0x042c2af497e2feb4l,0xd36a42d7aebf7313l,0x49d2c9eb084ffdd7l, 16084 0x9f8aa54b2ef7c76al }, 16085 { 0x9200b7ba09895e70l,0x3bd0c66fddb7fb58l,0x2d97d10878eb4cbbl, 16086 0x2d431068d84bde31l }, 16087 0 }, 16088 /* 28 << 0 */ 16089 { { 0x4b523eb7172ccd1fl,0x7323cb2830a6a892l,0x97082ec0cfe153ebl, 16090 0xe97f6b6af2aadb97l }, 16091 { 0x1d3d393ed1a83da1l,0xa6a7f9c7804b2a68l,0x4a688b482d0cb71el, 16092 0xa9b4cc5f40585278l }, 16093 0 }, 16094 /* 29 << 0 */ 16095 { { 0x5e5db46acb66e132l,0xf1be963a0d925880l,0x944a70270317b9e2l, 16096 0xe266f95948603d48l }, 16097 { 0x98db66735c208899l,0x90472447a2fb18a3l,0x8a966939777c619fl, 16098 0x3798142a2a3be21bl }, 16099 0 }, 16100 /* 31 << 0 */ 16101 { { 0xe2f73c696755ff89l,0xdd3cf7e7473017e6l,0x8ef5689d3cf7600dl, 16102 0x948dc4f8b1fc87b4l }, 16103 { 0xd9e9fe814ea53299l,0x2d921ca298eb6028l,0xfaecedfd0c9803fcl, 16104 0xf38ae8914d7b4745l }, 16105 0 }, 16106 /* 33 << 0 */ 16107 { { 0x871514560f664534l,0x85ceae7c4b68f103l,0xac09c4ae65578ab9l, 16108 0x33ec6868f044b10cl }, 16109 { 0x6ac4832b3a8ec1f1l,0x5509d1285847d5efl,0xf909604f763f1574l, 16110 0xb16c4303c32f63c4l }, 16111 0 }, 16112 /* 34 << 0 */ 16113 { { 0xb6ab20147ca23cd3l,0xcaa7a5c6a391849dl,0x5b0673a375678d94l, 16114 0xc982ddd4dd303e64l }, 16115 { 0xfd7b000b5db6f971l,0xbba2cb1f6f876f92l,0xc77332a33c569426l, 16116 0xa159100c570d74f8l }, 16117 0 }, 16118 /* 35 << 0 */ 16119 { { 0xfd16847fdec67ef5l,0x742ee464233e76b7l,0x0b8e4134efc2b4c8l, 16120 0xca640b8642a3e521l }, 16121 { 0x653a01908ceb6aa9l,0x313c300c547852d5l,0x24e4ab126b237af7l, 16122 0x2ba901628bb47af8l }, 16123 0 }, 16124 /* 36 << 0 */ 16125 { { 0x3d5e58d6a8219bb7l,0xc691d0bd1b06c57fl,0x0ae4cb10d257576el, 16126 0x3569656cd54a3dc3l }, 16127 { 0xe5ebaebd94cda03al,0x934e82d3162bfe13l,0x450ac0bae251a0c6l, 16128 0x480b9e11dd6da526l }, 16129 0 }, 16130 /* 37 << 0 */ 16131 { { 0x00467bc58cce08b5l,0xb636458c7f178d55l,0xc5748baea677d806l, 16132 0x2763a387dfa394ebl }, 16133 { 0xa12b448a7d3cebb6l,0xe7adda3e6f20d850l,0xf63ebce51558462cl, 16134 0x58b36143620088a8l }, 16135 0 }, 16136 /* 39 << 0 */ 16137 { { 0xa9d89488a059c142l,0x6f5ae714ff0b9346l,0x068f237d16fb3664l, 16138 0x5853e4c4363186acl }, 16139 { 0xe2d87d2363c52f98l,0x2ec4a76681828876l,0x47b864fae14e7b1cl, 16140 0x0c0bc0e569192408l }, 16141 0 }, 16142 /* 40 << 0 */ 16143 { { 0xe4d7681db82e9f3el,0x83200f0bdf25e13cl,0x8909984c66f27280l, 16144 0x462d7b0075f73227l }, 16145 { 0xd90ba188f2651798l,0x74c6e18c36ab1c34l,0xab256ea35ef54359l, 16146 0x03466612d1aa702fl }, 16147 0 }, 16148 /* 41 << 0 */ 16149 { { 0x624d60492ed22e91l,0x6fdfe0b56f072822l,0xeeca111539ce2271l, 16150 0x98100a4fdb01614fl }, 16151 { 0xb6b0daa2a35c628fl,0xb6f94d2ec87e9a47l,0xc67732591d57d9cel, 16152 0xf70bfeec03884a7bl }, 16153 0 }, 16154 /* 43 << 0 */ 16155 { { 0x4ff23ffd248a7d06l,0x80c5bfb4878873fal,0xb7d9ad9005745981l, 16156 0x179c85db3db01994l }, 16157 { 0xba41b06261a6966cl,0x4d82d052eadce5a8l,0x9e91cd3ba5e6a318l, 16158 0x47795f4f95b2dda0l }, 16159 0 }, 16160 /* 44 << 0 */ 16161 { { 0xecfd7c1fd55a897cl,0x009194abb29110fbl,0x5f0e2046e381d3b0l, 16162 0x5f3425f6a98dd291l }, 16163 { 0xbfa06687730d50dal,0x0423446c4b083b7fl,0x397a247dd69d3417l, 16164 0xeb629f90387ba42al }, 16165 0 }, 16166 /* 45 << 0 */ 16167 { { 0x1ee426ccd5cd79bfl,0x0032940b946c6e18l,0x1b1e8ae057477f58l, 16168 0xe94f7d346d823278l }, 16169 { 0xc747cb96782ba21al,0xc5254469f72b33a5l,0x772ef6dec7f80c81l, 16170 0xd73acbfe2cd9e6b5l }, 16171 0 }, 16172 /* 46 << 0 */ 16173 { { 0x4075b5b149ee90d9l,0x785c339aa06e9ebal,0xa1030d5babf825e0l, 16174 0xcec684c3a42931dcl }, 16175 { 0x42ab62c9c1586e63l,0x45431d665ab43f2bl,0x57c8b2c055f7835dl, 16176 0x033da338c1b7f865l }, 16177 0 }, 16178 /* 47 << 0 */ 16179 { { 0x283c7513caa76097l,0x0a624fa936c83906l,0x6b20afec715af2c7l, 16180 0x4b969974eba78bfdl }, 16181 { 0x220755ccd921d60el,0x9b944e107baeca13l,0x04819d515ded93d4l, 16182 0x9bbff86e6dddfd27l }, 16183 0 }, 16184 /* 48 << 0 */ 16185 { { 0x6b34413077adc612l,0xa7496529bbd803a0l,0x1a1baaa76d8805bdl, 16186 0xc8403902470343adl }, 16187 { 0x39f59f66175adff1l,0x0b26d7fbb7d8c5b7l,0xa875f5ce529d75e3l, 16188 0x85efc7e941325cc2l }, 16189 0 }, 16190 /* 49 << 0 */ 16191 { { 0x21950b421ff6acd3l,0xffe7048453dc6909l,0xff4cd0b228766127l, 16192 0xabdbe6084fb7db2bl }, 16193 { 0x837c92285e1109e8l,0x26147d27f4645b5al,0x4d78f592f7818ed8l, 16194 0xd394077ef247fa36l }, 16195 0 }, 16196 /* 51 << 0 */ 16197 { { 0x508cec1c3b3f64c9l,0xe20bc0ba1e5edf3fl,0xda1deb852f4318d4l, 16198 0xd20ebe0d5c3fa443l }, 16199 { 0x370b4ea773241ea3l,0x61f1511c5e1a5f65l,0x99a5e23d82681c62l, 16200 0xd731e383a2f54c2dl }, 16201 0 }, 16202 /* 52 << 0 */ 16203 { { 0x2692f36e83445904l,0x2e0ec469af45f9c0l,0x905a3201c67528b7l, 16204 0x88f77f34d0e5e542l }, 16205 { 0xf67a8d295864687cl,0x23b92eae22df3562l,0x5c27014b9bbec39el, 16206 0x7ef2f2269c0f0f8dl }, 16207 0 }, 16208 /* 53 << 0 */ 16209 { { 0x97359638546c4d8dl,0x5f9c3fc492f24679l,0x912e8beda8c8acd9l, 16210 0xec3a318d306634b0l }, 16211 { 0x80167f41c31cb264l,0x3db82f6f522113f2l,0xb155bcd2dcafe197l, 16212 0xfba1da5943465283l }, 16213 0 }, 16214 /* 55 << 0 */ 16215 { { 0x258bbbf9e7305683l,0x31eea5bf07ef5be6l,0x0deb0e4a46c814c1l, 16216 0x5cee8449a7b730ddl }, 16217 { 0xeab495c5a0182bdel,0xee759f879e27a6b4l,0xc2cf6a6880e518cal, 16218 0x25e8013ff14cf3f4l }, 16219 0 }, 16220 /* 57 << 0 */ 16221 { { 0x3ec832e77acaca28l,0x1bfeea57c7385b29l,0x068212e3fd1eaf38l, 16222 0xc13298306acf8cccl }, 16223 { 0xb909f2db2aac9e59l,0x5748060db661782al,0xc5ab2632c79b7a01l, 16224 0xda44c6c600017626l }, 16225 0 }, 16226 /* 59 << 0 */ 16227 { { 0x69d44ed65c46aa8el,0x2100d5d3a8d063d1l,0xcb9727eaa2d17c36l, 16228 0x4c2bab1b8add53b7l }, 16229 { 0xa084e90c15426704l,0x778afcd3a837ebeal,0x6651f7017ce477f8l, 16230 0xa062499846fb7a8bl }, 16231 0 }, 16232 /* 60 << 0 */ 16233 { { 0xdc1e6828ed8a6e19l,0x33fc23364189d9c7l,0x026f8fe2671c39bcl, 16234 0xd40c4ccdbc6f9915l }, 16235 { 0xafa135bbf80e75cal,0x12c651a022adff2cl,0xc40a04bd4f51ad96l, 16236 0x04820109bbe4e832l }, 16237 0 }, 16238 /* 61 << 0 */ 16239 { { 0x3667eb1a7f4c04ccl,0x59556621a9404f84l,0x71cdf6537eceb50al, 16240 0x994a44a69b8335fal }, 16241 { 0xd7faf819dbeb9b69l,0x473c5680eed4350dl,0xb6658466da44bba2l, 16242 0x0d1bc780872bdbf3l }, 16243 0 }, 16244 /* 63 << 0 */ 16245 { { 0xb8d3d9319ff91fe5l,0x039c4800f0518eedl,0x95c376329182cb26l, 16246 0x0763a43482fc568dl }, 16247 { 0x707c04d5383e76bal,0xac98b930824e8197l,0x92bf7c8f91230de0l, 16248 0x90876a0140959b70l }, 16249 0 }, 16250 /* 64 << 0 */ 16251 { { 0xdb6d96f305968b80l,0x380a0913089f73b9l,0x7da70b83c2c61e01l, 16252 0x95fb8394569b38c7l }, 16253 { 0x9a3c651280edfe2fl,0x8f726bb98faeaf82l,0x8010a4a078424bf8l, 16254 0x296720440e844970l }, 16255 0 }, 16256 /* 65 << 0 */ 16257 { { 0xdc2306ebfcdbb2b2l,0x79527db7ba66f4b9l,0xbf639ed67765765el, 16258 0x01628c4706b6090al }, 16259 { 0x66eb62f1b957b4a1l,0x33cb7691ba659f46l,0x2c90d98cf3e055d6l, 16260 0x7d096ac42f174750l }, 16261 0 }, 16262 /* 71 << 0 */ 16263 { { 0xf19f382e92aa7864l,0x49c7cb94fc05804bl,0xf94aa89b40750d01l, 16264 0xdd421b5d4a210364l }, 16265 { 0x56cd001e39df3672l,0x030a119fdd4af1ecl,0x11f947e696cd0572l, 16266 0x574cc7b293786791l }, 16267 0 }, 16268 /* 77 << 0 */ 16269 { { 0x0a2193bfc266f85cl,0x719a87be5a0ec9cel,0x9c30c6422b2f9c49l, 16270 0xdb15e4963d5baeb1l }, 16271 { 0x83c3139be0d37321l,0x4788522b2e9fdbb2l,0x2b4f0c7877eb94eal, 16272 0x854dc9d595105f9el }, 16273 0 }, 16274 /* 83 << 0 */ 16275 { { 0x2c9ee62dc3363a22l,0x125d4714ec67199al,0xf87abebf2ab80485l, 16276 0xcf3086e87a243ca4l }, 16277 { 0x5c52b051c64e09ddl,0x5e9b16125625aad7l,0x0536a39db19c6126l, 16278 0x97f0013247b64be5l }, 16279 0 }, 16280 /* 89 << 0 */ 16281 { { 0xc1ee6264a7eabe67l,0x62d51e29fd54487dl,0x3ea123446310eb5al, 16282 0xbd88aca74765b805l }, 16283 { 0xb7b284be14fb691al,0x640388f83b9fffefl,0x7ab49dd209f98f9al, 16284 0x7150f87e7211e445l }, 16285 0 }, 16286 /* 95 << 0 */ 16287 { { 0x263e039bb308cc40l,0x6684ad762b346fd2l,0x9a127f2bcaa12d0dl, 16288 0x76a8f9fea974291fl }, 16289 { 0xc802049b68aa19e4l,0x65499c990c5dbba0l,0xee1b1cb5344455a1l, 16290 0x3f293fda2cd6f439l }, 16291 0 }, 16292 /* 101 << 0 */ 16293 { { 0xb7a96e0a4ea6fdf7l,0xbbe914d3b99cd026l,0x6a610374c569a602l, 16294 0xe9b1c23914da499el }, 16295 { 0xb5f6f0feadc19a99l,0x731251826f21687cl,0x5a8a14644be77793l, 16296 0x94ce9e0adba8bfc7l }, 16297 0 }, 16298 /* 107 << 0 */ 16299 { { 0x2ca0ba9c3796f4c7l,0x3571e4d1592ce334l,0x28f9cdebe9f6e877l, 16300 0xee206023efce1a70l }, 16301 { 0xb2159e08b76369dcl,0x2754e4260a7f687cl,0xe008039e02de2ff1l, 16302 0xccd7e9418ea700c1l }, 16303 0 }, 16304 /* 113 << 0 */ 16305 { { 0xa125e6c1b7ebcb88l,0x3289e86e10ec0d40l,0xcc3a5ecb98353869l, 16306 0x734e0d078a2b0d3al }, 16307 { 0xe0d92e9a51933360l,0xfa6bcdb1786076b9l,0xd13cca90747f19ecl, 16308 0x61d8209d49f3a53dl }, 16309 0 }, 16310 /* 116 << 0 */ 16311 { { 0x87f9793bc9826344l,0x4b3de89bb2f5f79cl,0xc9f08a5659cb1b6el, 16312 0xd8f1fc5f6a92b9aal }, 16313 { 0x86357f9eb412595el,0x53c30bbe65b80f16l,0xf06c2c8c70549a57l, 16314 0xa9c8a4b42b9157dal }, 16315 0 }, 16316 /* 119 << 0 */ 16317 { { 0x87af199e6cc47305l,0x062afb7c1e314ddel,0x2be22ba0f3a49fb4l, 16318 0x6ed0b988157b7f56l }, 16319 { 0x8162cf502d653fd9l,0x17d29c64877b7497l,0xd7e814380f67b514l, 16320 0xfedf1014fe6ee703l }, 16321 0 }, 16322 /* 125 << 0 */ 16323 { { 0xaab54cfc93740130l,0xf72dab6d225733fal,0x04b76d2d1ed32559l, 16324 0xa9fe2396bb85b9cbl }, 16325 { 0x128b0d24bf2219f0l,0x2292393b579f3ce2l,0x51dc5fac145ff0d5l, 16326 0xb16d6af8c3febbc1l }, 16327 0 }, 16328 }, 16329 { 16330 /* 0 << 8 */ 16331 { { 0x00, 0x00, 0x00, 0x00 }, 16332 { 0x00, 0x00, 0x00, 0x00 }, 16333 1 }, 16334 /* 1 << 8 */ 16335 { { 0x486d8ffa696946fcl,0x50fbc6d8b9cba56dl,0x7e3d423e90f35a15l, 16336 0x7c3da195c0dd962cl }, 16337 { 0xe673fdb03cfd5d8bl,0x0704b7c2889dfca5l,0xf6ce581ff52305aal, 16338 0x399d49eb914d5e53l }, 16339 0 }, 16340 /* 3 << 8 */ 16341 { { 0x35d6a53eed4c3717l,0x9f8240cf3d0ed2a3l,0x8c0d4d05e5543aa5l, 16342 0x45d5bbfbdd33b4b4l }, 16343 { 0xfa04cc73137fd28el,0x862ac6efc73b3ffdl,0x403ff9f531f51ef2l, 16344 0x34d5e0fcbc73f5a2l }, 16345 0 }, 16346 /* 4 << 8 */ 16347 { { 0x4f7081e144cc3addl,0xd5ffa1d687be82cfl,0x89890b6c0edd6472l, 16348 0xada26e1a3ed17863l }, 16349 { 0x276f271563483caal,0xe6924cd92f6077fdl,0x05a7fe980a466e3cl, 16350 0xf1c794b0b1902d1fl }, 16351 0 }, 16352 /* 5 << 8 */ 16353 { { 0x33b2385c08369a90l,0x2990c59b190eb4f8l,0x819a6145c68eac80l, 16354 0x7a786d622ec4a014l }, 16355 { 0x33faadbe20ac3a8dl,0x31a217815aba2d30l,0x209d2742dba4f565l, 16356 0xdb2ce9e355aa0fbbl }, 16357 0 }, 16358 /* 7 << 8 */ 16359 { { 0x0c4a58d474a86108l,0xf8048a8fee4c5d90l,0xe3c7c924e86d4c80l, 16360 0x28c889de056a1e60l }, 16361 { 0x57e2662eb214a040l,0xe8c48e9837e10347l,0x8774286280ac748al, 16362 0xf1c24022186b06f2l }, 16363 0 }, 16364 /* 9 << 8 */ 16365 { { 0xe8cbf1e5d5923359l,0xdb0cea9d539b9fb0l,0x0c5b34cf49859b98l, 16366 0x5e583c56a4403cc6l }, 16367 { 0x11fc1a2dd48185b7l,0xc93fbc7e6e521787l,0x47e7a05805105b8bl, 16368 0x7b4d4d58db8260c8l }, 16369 0 }, 16370 /* 10 << 8 */ 16371 { { 0xb31bd6136339c083l,0x39ff8155dfb64701l,0x7c3388d2e29604abl, 16372 0x1e19084ba6b10442l }, 16373 { 0x17cf54c0eccd47efl,0x896933854a5dfb30l,0x69d023fb47daf9f6l, 16374 0x9222840b7d91d959l }, 16375 0 }, 16376 /* 11 << 8 */ 16377 { { 0xc510610939842194l,0xb7e2353e49d05295l,0xfc8c1d5cefb42ee0l, 16378 0xe04884eb08ce811cl }, 16379 { 0xf1f75d817419f40el,0x5b0ac162a995c241l,0x120921bbc4c55646l, 16380 0x713520c28d33cf97l }, 16381 0 }, 16382 /* 13 << 8 */ 16383 { { 0x41d04ee21726931al,0x0bbbb2c83660ecfdl,0xa6ef6de524818e18l, 16384 0xe421cc51e7d57887l }, 16385 { 0xf127d208bea87be6l,0x16a475d3b1cdd682l,0x9db1b684439b63f7l, 16386 0x5359b3dbf0f113b6l }, 16387 0 }, 16388 /* 15 << 8 */ 16389 { { 0x3a5c752edcc18770l,0x4baf1f2f8825c3a5l,0xebd63f7421b153edl, 16390 0xa2383e47b2f64723l }, 16391 { 0xe7bf620a2646d19al,0x56cb44ec03c83ffdl,0xaf7267c94f6be9f1l, 16392 0x8b2dfd7bc06bb5e9l }, 16393 0 }, 16394 /* 16 << 8 */ 16395 { { 0x6772b0e5ab4b35a2l,0x1d8b6001f5eeaacfl,0x728f7ce4795b9580l, 16396 0x4a20ed2a41fb81dal }, 16397 { 0x9f685cd44fec01e6l,0x3ed7ddcca7ff50adl,0x460fd2640c2d97fdl, 16398 0x3a241426eb82f4f9l }, 16399 0 }, 16400 /* 17 << 8 */ 16401 { { 0xc503cd33bccd9617l,0x365dede4ba7730a3l,0x798c63555ddb0786l, 16402 0xa6c3200efc9cd3bcl }, 16403 { 0x060ffb2ce5e35efdl,0x99a4e25b5555a1c1l,0x11d95375f70b3751l, 16404 0x0a57354a160e1bf6l }, 16405 0 }, 16406 /* 19 << 8 */ 16407 { { 0xc033bdc719803511l,0xa9f97b3b8888c3bel,0x3d68aebc85c6d05el, 16408 0xc3b88a9d193919ebl }, 16409 { 0x2d300748c48b0ee3l,0x7506bc7c07a746c1l,0xfc48437c6e6d57f3l, 16410 0x5bd71587cfeaa91al }, 16411 0 }, 16412 /* 21 << 8 */ 16413 { { 0xe40736d3df61bc76l,0x13a619c03f778cdbl,0x6dd921a4c56ea28fl, 16414 0x76a524332fa647b4l }, 16415 { 0x23591891ac5bdc5dl,0xff4a1a72bac7dc01l,0x9905e26162df8453l, 16416 0x3ac045dfe63b265fl }, 16417 0 }, 16418 /* 23 << 8 */ 16419 { { 0x8435bd6994b03ed1l,0xd9ad1de3634cc546l,0x2cf423fc00e420cal, 16420 0xeed26d80a03096ddl }, 16421 { 0xd7f60be7a4db09d2l,0xf47f569d960622f7l,0xe5925fd77296c729l, 16422 0xeff2db2626ca2715l }, 16423 0 }, 16424 /* 25 << 8 */ 16425 { { 0x5dfee80f83774bddl,0x6313160285734485l,0xa1b524ae914a69a9l, 16426 0xebc2ffafd4e300d7l }, 16427 { 0x52c93db77cfa46a5l,0x71e6161f21653b50l,0x3574fc57a4bc580al, 16428 0xc09015dde1bc1253l }, 16429 0 }, 16430 /* 27 << 8 */ 16431 { { 0x9c38ddcceb5b76c1l,0x746f528526fc0ab4l,0x52a63a50d62c269fl, 16432 0x60049c5599458621l }, 16433 { 0xe7f48f823c2f7c9el,0x6bd99043917d5cf3l,0xeb1317a88701f469l, 16434 0xbd3fe2ed9a449fe0l }, 16435 0 }, 16436 /* 28 << 8 */ 16437 { { 0xe652533b3cef0d7dl,0xd94f7b182bbb4381l,0x838752be0e80f500l, 16438 0x8e6e24889e9c9bfbl }, 16439 { 0xc975169716caca6al,0x866c49d838531ad9l,0xc917e2397151ade1l, 16440 0x2d016ec16037c407l }, 16441 0 }, 16442 /* 29 << 8 */ 16443 { { 0x202f6a9c31c71f7bl,0x01f95aa3296ffe5cl,0x5fc0601453cec3a3l, 16444 0xeb9912375f498a45l }, 16445 { 0xae9a935e5d91ba87l,0xc6ac62810b564a19l,0x8a8fe81c3bd44e69l, 16446 0x7c8b467f9dd11d45l }, 16447 0 }, 16448 /* 31 << 8 */ 16449 { { 0x21d3634d39eedbbal,0x35cd2e680455a46dl,0xc8cafe65f9d7eb0cl, 16450 0xbda3ce9e00cefb3el }, 16451 { 0xddc17a602c9cf7a4l,0x01572ee47bcb8773l,0xa92b2b018c7548dfl, 16452 0x732fd309a84600e3l }, 16453 0 }, 16454 /* 33 << 8 */ 16455 { { 0x65cf89a2e0600afal,0xcf51482f753c5ceal,0x4f2b2d25a5c2bfc5l, 16456 0x9381f57187098256l }, 16457 { 0x89210f676e976e4bl,0xe2cf12f489f47a7bl,0xc21a1658e8484050l, 16458 0xa224dbf82f0fff01l }, 16459 0 }, 16460 /* 34 << 8 */ 16461 { { 0xc28961087282513dl,0x9a78c4296a3f8fb8l,0xddfa56f9a31e24b7l, 16462 0xb1e14f84fb72611fl }, 16463 { 0x1d0f70ab45078d65l,0xb247aef3819924d8l,0x8d519f9dbb9877c1l, 16464 0x495c2ece8368c7c9l }, 16465 0 }, 16466 /* 35 << 8 */ 16467 { { 0xca9129a0bdb69d12l,0xbe3e319978f39adfl,0xa88506df5fe49438l, 16468 0x17ddb7a7aafe894cl }, 16469 { 0x28d1456f6d1d742fl,0xeec09651917d1268l,0xdecb1c700fd5b4c0l, 16470 0x32d14f6acf2861dbl }, 16471 0 }, 16472 /* 36 << 8 */ 16473 { { 0x903f6e3960e913afl,0xb2b58bee98bf140dl,0x9deff025354890b8l, 16474 0x155810068d2e924el }, 16475 { 0xb5755db493c95e5bl,0x3fac42f0dae20eb8l,0x9377c8c109b6d8e0l, 16476 0xa43e2b46ab47ceffl }, 16477 0 }, 16478 /* 37 << 8 */ 16479 { { 0x6c3f5a51cb61e7e7l,0x264aebc80d9c73b2l,0xc404b2114a0d9288l, 16480 0x5178d3cf8b3a79e9l }, 16481 { 0x4080be5372a420d7l,0xa39396adef026429l,0x22fbb92e8dde4728l, 16482 0x19e42d8874d949fcl }, 16483 0 }, 16484 /* 39 << 8 */ 16485 { { 0xde352d78387f5557l,0x6770149969367413l,0x255bb8c00b0cc102l, 16486 0x63cad1be1f4d262el }, 16487 { 0xf34f9a8a3f8f4fb6l,0x32bc13aae03a969fl,0xb29d4336218371cdl, 16488 0x799d76ab285bd210l }, 16489 0 }, 16490 /* 40 << 8 */ 16491 { { 0x5f57b2fbfacfa459l,0x874b1498c1b5aa6bl,0xb9e89acac4db2092l, 16492 0x1362bf8ddf4381dal }, 16493 { 0x25d76830b76328a0l,0x38188b7098572ae4l,0xb43e941429132f7dl, 16494 0x7895a29f22dd42c9l }, 16495 0 }, 16496 /* 41 << 8 */ 16497 { { 0x85bded619e808c05l,0x6e0fc2bcc7ef83bbl,0xed70e0b499bedf77l, 16498 0x300e777dc1aaffc0l }, 16499 { 0xe2da2359c43e6d2cl,0xacf6d60a275226e0l,0x18ca38f7f82558bdl, 16500 0xd7b017d475ae2591l }, 16501 0 }, 16502 /* 43 << 8 */ 16503 { { 0xed299e2d7cd92ee2l,0x2c08eb37ad847153l,0x7b372aa712acfd81l, 16504 0x574d27f5fabda29cl }, 16505 { 0xbd8247f0f2ee6ebcl,0x8bf76710d06be261l,0x26e95b4bcb186d4cl, 16506 0x4fa3ac1d1ebb4a46l }, 16507 0 }, 16508 /* 44 << 8 */ 16509 { { 0xcbde78dd5e22cbb2l,0xf449c85b76bb4391l,0x4289f357b6a4273bl, 16510 0x9fce23fd48e84a19l }, 16511 { 0xcfc32730939eb3b4l,0x8b3d982c16c32280l,0x5ac234bad5f1346cl, 16512 0x781954b470769fc9l }, 16513 0 }, 16514 /* 45 << 8 */ 16515 { { 0xff0d4d30062c7dbdl,0x2c483081e6f9fcf0l,0x22f96316d67e070fl, 16516 0xdd9be459c0e68c44l }, 16517 { 0xb9c1edffce2edd4dl,0x1a54782021fc538cl,0x93849be49979aee1l, 16518 0x3f313629a590949el }, 16519 0 }, 16520 /* 46 << 8 */ 16521 { { 0x160b836b266be332l,0x49de38215f340575l,0x782e8f6701edce66l, 16522 0x83ae008b5df1a93el }, 16523 { 0x85d33a263ed9ffebl,0xae2f9f961e79db97l,0xf64f209b95ae9e34l, 16524 0x2b6b03455e957d49l }, 16525 0 }, 16526 /* 47 << 8 */ 16527 { { 0x7a24a21a331d6bdal,0xfdba302f6328f742l,0x37a36dd47744dca4l, 16528 0xda2832ce6fef500fl }, 16529 { 0x23da304a7b49d73al,0xeede2cebc6ad834fl,0xf21a81248dec3c78l, 16530 0x4bc9469b19b721e3l }, 16531 0 }, 16532 /* 48 << 8 */ 16533 { { 0x6faf68feaae6ee70l,0x78f4cc155602b0c9l,0x7e3321a86e94052al, 16534 0x2fb3a0d6734d5d80l }, 16535 { 0xf3b98f3bb25a43bal,0x30bf803119ee2951l,0x7ffee43321b0612al, 16536 0x12f775e42eb821d0l }, 16537 0 }, 16538 /* 49 << 8 */ 16539 { { 0x31cc342913e5c1d6l,0x05deaa3cee54e334l,0x21ea2b61cd5087d8l, 16540 0x73a1841e70d1b8bcl }, 16541 { 0xd44e2b41b078bf14l,0xc295732fcea2a30el,0x30cdab42954939f7l, 16542 0xc1b4e43a2dba0b7cl }, 16543 0 }, 16544 /* 51 << 8 */ 16545 { { 0x5f33f618b6a20132l,0xc8d73e3cfbbf3022l,0xf3b9844d47ed4320l, 16546 0xab5868aa927f00cal }, 16547 { 0x06cb1113077f6e1cl,0x1417b43a5c94faaal,0x7666cb90cf4cd1e9l, 16548 0x99e009f210900566l }, 16549 0 }, 16550 /* 52 << 8 */ 16551 { { 0x4fdff805f57209b5l,0x9bd65ac3f952ac8dl,0x02a3abd3c7969a6fl, 16552 0x1359927ef523775fl }, 16553 { 0xe09b463f88d2e861l,0x661d2199623287c3l,0x821e64495a70eb7al, 16554 0x0afbbb1dd67dc684l }, 16555 0 }, 16556 /* 53 << 8 */ 16557 { { 0x2c5a2b2d55750eb2l,0x54d756c29dc28d9fl,0x798c8d113af97f71l, 16558 0x54e21ee21f6d1853l }, 16559 { 0x34e0c8bceffc3f8al,0xed3cc4dda96f193fl,0x86436a84fad97110l, 16560 0x8530ca522c97205el }, 16561 0 }, 16562 /* 55 << 8 */ 16563 { { 0x9b6c8452f7236867l,0x21cf260c777b44fdl,0x659fc99dceb00c52l, 16564 0xda97098e2439e8dbl }, 16565 { 0x647efe510ed6e14fl,0x37c8ca122a6600f3l,0x53e89b0badf6f4a7l, 16566 0xd9fc8c716645618al }, 16567 0 }, 16568 /* 57 << 8 */ 16569 { { 0x9cecfb8eee6ebd31l,0x4603994b1ff25529l,0x707bc80af4b141c4l, 16570 0x3a83d56c07524d3al }, 16571 { 0x7035c746613a3020l,0x7aa766b286626a1cl,0x3af656095ac76c78l, 16572 0x4039c655171e47d6l }, 16573 0 }, 16574 /* 59 << 8 */ 16575 { { 0x79cb147f0ce33b63l,0xa1328a622d160c61l,0xf99538f3cf7eb87el, 16576 0x0334d4958e2241d5l }, 16577 { 0x3ad97e02f3e49e48l,0xdcfcc754037c3679l,0x76078ba61a8ff67cl, 16578 0x8054aa55c2a64964l }, 16579 0 }, 16580 /* 60 << 8 */ 16581 { { 0x5852104b87453b28l,0x073e8128b387344dl,0x300e78e4817cfc08l, 16582 0x3a82ed4799362088l }, 16583 { 0xe222304c88de46a4l,0x666c94fd57fadf4al,0x40b2d08ea0c8e108l, 16584 0x4b2955b909e050fal }, 16585 0 }, 16586 /* 61 << 8 */ 16587 { { 0x656078565f814881l,0x0fc3d1ce58466117l,0x0ae377d3c6c1e68al, 16588 0xe3dd8d5cba566c48l }, 16589 { 0x9404849ec4b63be6l,0x1e22b03ba5be9c92l,0x08145122a8b03e63l, 16590 0x71248243771fe153l }, 16591 0 }, 16592 /* 63 << 8 */ 16593 { { 0xa80a0e83b41ac541l,0xa77570ea533e5f9bl,0x416a14c0216dc452l, 16594 0x2a8d728a19f7ee59l }, 16595 { 0x58494c8cd6552eaal,0x4d635acd60145722l,0xa8e9b127327b1cbcl, 16596 0xb429a62e9f8235f0l }, 16597 0 }, 16598 /* 64 << 8 */ 16599 { { 0xf8d112e76e6485b3l,0x4d3e24db771c52f8l,0x48e3ee41684a2f6dl, 16600 0x7161957d21d95551l }, 16601 { 0x19631283cdb12a6cl,0xbf3fa8822e50e164l,0xf6254b633166cc73l, 16602 0x3aefa7aeaee8cc38l }, 16603 0 }, 16604 /* 65 << 8 */ 16605 { { 0xd52d2cb746ef1c7el,0xebd4f7c4d8fb6e07l,0x16f77a48cf6dd2b4l, 16606 0x6e8f0431e77e4d51l }, 16607 { 0x59d94cc4e9177bf2l,0xb58a578f7a7181a1l,0xeefbc4cde8f6d330l, 16608 0xa66c85560fe05490l }, 16609 0 }, 16610 /* 71 << 8 */ 16611 { { 0x0e6db7a35d9649dal,0x4d2f25193be3d362l,0xcd891fd5a6b137b5l, 16612 0xa4b7e4ddacd377a9l }, 16613 { 0x20ccd6f24355f258l,0x842c08673aafb413l,0xdd55db99d6873b88l, 16614 0x04d15f4fea5a2a55l }, 16615 0 }, 16616 /* 77 << 8 */ 16617 { { 0x679cd93dfae289c2l,0x84cadd61ff92ba1bl,0x548b5a6f2cd734aal, 16618 0x1827507db8267082l }, 16619 { 0xa903a6010c6d5b4cl,0xde0d96befdfb952bl,0x2fc9419c6a2e24f9l, 16620 0x27333e3936bb3203l }, 16621 0 }, 16622 /* 83 << 8 */ 16623 { { 0x3eb7f062dde4aa6al,0x40effae07f354cc0l,0xe9a14bc2a066c05el, 16624 0x7817b11356afc543l }, 16625 { 0x5f0ed1f28bdda262l,0x001e23d2e007ec13l,0x435878a59c57de6al, 16626 0x84d0e20895ac263cl }, 16627 0 }, 16628 /* 89 << 8 */ 16629 { { 0xedf24aec97a66678l,0xd1f93cf8ccf55671l,0x4ed2ce8a9379a49dl, 16630 0x64991862c39b0ac9l }, 16631 { 0xc15b24e31ff67e04l,0x4ee8fc76c3c084fel,0x262012b4f64bcd46l, 16632 0x3b5086732425c622l }, 16633 0 }, 16634 /* 95 << 8 */ 16635 { { 0xaa3e451fe65002f7l,0xf5ff2617eb46d253l,0x918d146e572afca2l, 16636 0x0a9333b7e56a8553l }, 16637 { 0x9b7e232d94127dc0l,0xcd0687d6831014e6l,0x725ce5baf08e1c71l, 16638 0x56e26f48cde0e4edl }, 16639 0 }, 16640 /* 101 << 8 */ 16641 { { 0xae78dde8db833460l,0xaf1736fe762cb78al,0x5cd85742eae5ac60l, 16642 0x7b6c52fe955e981al }, 16643 { 0x9f823e8555599f97l,0xb9ce70d21a4b46b3l,0xb6076175d7d09829l, 16644 0x21e77d22abf390a4l }, 16645 0 }, 16646 /* 107 << 8 */ 16647 { { 0xf704f09da142ad7el,0xb60ec2e1bab9f5d2l,0x4180314681e54d0dl, 16648 0x0de50506309335e6l }, 16649 { 0x4135374e05aec64fl,0xb5d31041b556808al,0x0092eb86049033a8l, 16650 0x5b7a2fa0bde0d737l }, 16651 0 }, 16652 /* 113 << 8 */ 16653 { { 0xc0dfa6bbefb40cfal,0x86a6fe279c5037f3l,0xf153cd37f71155f4l, 16654 0xf16d6029767664f9l }, 16655 { 0x7441aa54c635aa57l,0x547f82e9e8186b2el,0x330b464bfbf7c7fel, 16656 0xb5556770a1f6fddel }, 16657 0 }, 16658 /* 116 << 8 */ 16659 { { 0xa0a9c5d1e8f9edf1l,0x9814c26b6946cea3l,0xcbb47a37d8e6a08dl, 16660 0x517a3d9b2cba11b1l }, 16661 { 0x94edc73dab43c540l,0x4fd0b82a753e552cl,0x419aab8bd14ae853l, 16662 0x94955f9ca68abad8l }, 16663 0 }, 16664 /* 119 << 8 */ 16665 { { 0x3a162e06ed169150l,0x8c9683a6ba1194a8l,0x53fead66ccc28d04l, 16666 0xdbb2a85bef09809al }, 16667 { 0x58e677439d3ab018l,0xff9a2046b6e56bd0l,0xf4b8215eb28061e9l, 16668 0xcf16d9f7b10e358fl }, 16669 0 }, 16670 /* 125 << 8 */ 16671 { { 0x265ceae9a55abe39l,0x9e3783f796a98f84l,0xb799628af0757d99l, 16672 0xebb5f12665472fb3l }, 16673 { 0xd83619f52ba517d8l,0x5672105f50382bdfl,0x32c5681c4a12ee9fl, 16674 0x31e6f60d834a9fedl }, 16675 0 }, 16676 }, 16677 { 16678 /* 0 << 16 */ 16679 { { 0x00, 0x00, 0x00, 0x00 }, 16680 { 0x00, 0x00, 0x00, 0x00 }, 16681 1 }, 16682 /* 1 << 16 */ 16683 { { 0x0f0165fce3779ee3l,0xe00e7f9dbd495d9el,0x1fa4efa220284e7al, 16684 0x4564bade47ac6219l }, 16685 { 0x90e6312ac4708e8el,0x4f5725fba71e9adfl,0xe95f55ae3d684b9fl, 16686 0x47f7ccb11e94b415l }, 16687 0 }, 16688 /* 3 << 16 */ 16689 { { 0xbd9b8b1dbe7a2af3l,0xec51caa94fb74a72l,0xb9937a4b63879697l, 16690 0x7c9a9d20ec2687d5l }, 16691 { 0x1773e44f6ef5f014l,0x8abcf412e90c6900l,0x387bd0228142161el, 16692 0x50393755fcb6ff2al }, 16693 0 }, 16694 /* 4 << 16 */ 16695 { { 0xfabf770977f7195al,0x8ec86167adeb838fl,0xea1285a8bb4f012dl, 16696 0xd68835039a3eab3fl }, 16697 { 0xee5d24f8309004c2l,0xa96e4b7613ffe95el,0x0cdffe12bd223ea4l, 16698 0x8f5c2ee5b6739a53l }, 16699 0 }, 16700 /* 5 << 16 */ 16701 { { 0x3d61333959145a65l,0xcd9bc368fa406337l,0x82d11be32d8a52a0l, 16702 0xf6877b2797a1c590l }, 16703 { 0x837a819bf5cbdb25l,0x2a4fd1d8de090249l,0x622a7de774990e5fl, 16704 0x840fa5a07945511bl }, 16705 0 }, 16706 /* 7 << 16 */ 16707 { { 0x26e08c07e3533d77l,0xd7222e6a2e341c99l,0x9d60ec3d8d2dc4edl, 16708 0xbdfe0d8f7c476cf8l }, 16709 { 0x1fe59ab61d056605l,0xa9ea9df686a8551fl,0x8489941e47fb8d8cl, 16710 0xfeb874eb4a7f1b10l }, 16711 0 }, 16712 /* 9 << 16 */ 16713 { { 0x9164088d977eab40l,0x51f4c5b62760b390l,0xd238238f340dd553l, 16714 0x358566c3db1d31c9l }, 16715 { 0x3a5ad69e5068f5ffl,0xf31435fcdaff6b06l,0xae549a5bd6debff0l, 16716 0x59e5f0b775e01331l }, 16717 0 }, 16718 /* 10 << 16 */ 16719 { { 0x2cc5226138634818l,0x501814f4b44c2e0bl,0xf7e181aa54dfdba3l, 16720 0xcfd58ff0e759718cl }, 16721 { 0xf90cdb14d3b507a8l,0x57bd478ec50bdad8l,0x29c197e250e5f9aal, 16722 0x4db6eef8e40bc855l }, 16723 0 }, 16724 /* 11 << 16 */ 16725 { { 0xd5d5cdd35958cd79l,0x3580a1b51d373114l,0xa36e4c91fa935726l, 16726 0xa38c534def20d760l }, 16727 { 0x7088e40a2ff5845bl,0xe5bb40bdbd78177fl,0x4f06a7a8857f9920l, 16728 0xe3cc3e50e968f05dl }, 16729 0 }, 16730 /* 13 << 16 */ 16731 { { 0x10595b5696a71cbal,0x944938b2fdcadeb7l,0xa282da4cfccd8471l, 16732 0x98ec05f30d37bfe1l }, 16733 { 0xe171ce1b0698304al,0x2d69144421bdf79bl,0xd0cd3b741b21dec1l, 16734 0x712ecd8b16a15f71l }, 16735 0 }, 16736 /* 15 << 16 */ 16737 { { 0xe89f48c85963a46el,0x658ab875a99e61c7l,0x6e296f874b8517b4l, 16738 0x36c4fcdcfc1bc656l }, 16739 { 0xde5227a1a3906defl,0x9fe95f5762418945l,0x20c91e81fdd96cdel, 16740 0x5adbe47eda4480del }, 16741 0 }, 16742 /* 16 << 16 */ 16743 { { 0xa7a8746a584c5e20l,0x267e4ea1b9dc7035l,0x593a15cfb9548c9bl, 16744 0x5e6e21354bd012f3l }, 16745 { 0xdf31cc6a8c8f936el,0x8af84d04b5c241dcl,0x63990a6f345efb86l, 16746 0x6fef4e61b9b962cbl }, 16747 0 }, 16748 /* 17 << 16 */ 16749 { { 0xaa35809ddfe6e2a0l,0xebb4d7d4356a2222l,0x7d500a6a319f33b7l, 16750 0x4895a47d4ac99011l }, 16751 { 0x300ab40bdf3812b2l,0xd0764ec88aec8b9fl,0x86b61d95e591b2a7l, 16752 0xc1b2a0b72ed74603l }, 16753 0 }, 16754 /* 19 << 16 */ 16755 { { 0x6001bf5d3849c680l,0xd7a1a4e4c1d3faccl,0xa0f2776418c5e351l, 16756 0x0849c0736c29c623l }, 16757 { 0x3317e143ac751c0cl,0x9bcb1f3eda06200bl,0x40a63a75541419b5l, 16758 0x8fad9c983f62c513l }, 16759 0 }, 16760 /* 21 << 16 */ 16761 { { 0xacff0828d03b2242l,0x5a9375c43abb7389l,0x41b1a318d0192baal, 16762 0x105bd3100458e97bl }, 16763 { 0x71582dc7ed496315l,0x8ab2884a4d4bda18l,0xb8b638b494bc5bb8l, 16764 0xb42ed1309500bb04l }, 16765 0 }, 16766 /* 23 << 16 */ 16767 { { 0x73e04f02ad1ed952l,0x680051cadfa5bdb7l,0xbe0bef3c0c7437b9l, 16768 0x45d6f3a40e65e627l }, 16769 { 0x5295e060c9436a75l,0xbe84ba78d289ba9el,0x350887fd69c09364l, 16770 0xf27bfd17671c64a7l }, 16771 0 }, 16772 /* 25 << 16 */ 16773 { { 0xc8afbdc3adf6ffc5l,0x4a4fb35876385891l,0xc7fa86424d41453fl, 16774 0x19490b7672eedd06l }, 16775 { 0xc883e45337d22d6al,0x8e6e38e4a9009f96l,0x44e2811eb1c560c6l, 16776 0x8a0021bf4439cfcfl }, 16777 0 }, 16778 /* 27 << 16 */ 16779 { { 0xba768f8b7615a327l,0x6c8b320d7b15bbe7l,0x5d8d5bcbaaa9ca64l, 16780 0x19a2b99f3d13cdfdl }, 16781 { 0x858288a26f172e10l,0x2412a4da37a00f94l,0xfc67fd2edaa7f6c6l, 16782 0x4aea0eadafa2a5c5l }, 16783 0 }, 16784 /* 28 << 16 */ 16785 { { 0x5c80ccef6cd77b30l,0x49978299ec99b6d0l,0x6bf4485eb939d335l, 16786 0xc53e61ab86d7c147l }, 16787 { 0xdd948052fb601dddl,0x34c5eb393511dd48l,0x91f5c67600e6f61cl, 16788 0x33f1b525b1e71f34l }, 16789 0 }, 16790 /* 29 << 16 */ 16791 { { 0xb4cb4a151d2dad36l,0x709a61631e60b60dl,0x2f18f3bd932ece4fl, 16792 0x70f495a8e92368bel }, 16793 { 0x6e88be2bb7aeaa6fl,0x4efebd9ae1bf1d6el,0x49925e6e44e94993l, 16794 0x33b7aba0ef0517dcl }, 16795 0 }, 16796 /* 31 << 16 */ 16797 { { 0x69ce1f207afe6c37l,0xe1148ba984f68db5l,0x32668bdc2c594a8al, 16798 0x2cb60d3063ac4fb3l }, 16799 { 0x5e6efe1dd9e036f8l,0x917cb2a27db4739fl,0x70ea601ded4e0b5el, 16800 0x5928f068ae7ac8a6l }, 16801 0 }, 16802 /* 33 << 16 */ 16803 { { 0x9e4ad0073f2d96abl,0x51a9697f2d058c03l,0xcd5c0a7522d1e795l, 16804 0xaa1a121c2ac4f019l }, 16805 { 0xa837c14c3e3631f4l,0x6a997381236a5576l,0xb305e7db2753782bl, 16806 0xae561b0237243afbl }, 16807 0 }, 16808 /* 34 << 16 */ 16809 { { 0x20176baca787897bl,0x057b8b979a9f67d9l,0xe7d5c4f761e14e09l, 16810 0x8e4856901e6cd6d0l }, 16811 { 0x3eeffbba9b925d52l,0xe651a5383046927bl,0x02326d1fe92d4352l, 16812 0xad2d6493d697369fl }, 16813 0 }, 16814 /* 35 << 16 */ 16815 { { 0xe9de299c548c4ca5l,0x66f64ef54be3bde3l,0xcf6d39ebf2d5ebc9l, 16816 0x665ca727898953e1l }, 16817 { 0x521ec435e33ac1b4l,0x8418fa7534ab2b82l,0x94d6c0c4771a3a87l, 16818 0x21feb6054859ee22l }, 16819 0 }, 16820 /* 36 << 16 */ 16821 { { 0xde7153f8eed9dd1dl,0xba09ad1152ebcb2el,0xaa41b015e1843fb6l, 16822 0xf933a2abdd4ce6f0l }, 16823 { 0x777f834313f6b83fl,0x28df7da4db113a75l,0x6d7d1b3c72a5d143l, 16824 0x6f789698966c6ddfl }, 16825 0 }, 16826 /* 37 << 16 */ 16827 { { 0x57d11ed7a95e704el,0x7d5ac6dc380ad582l,0xb175421d5ab6e377l, 16828 0x4e383b0ba760dd4dl }, 16829 { 0xde07b81a352b6cb3l,0x342abe825c2e1704l,0x90988de20dd48537l, 16830 0x4a7fec0544821591l }, 16831 0 }, 16832 /* 39 << 16 */ 16833 { { 0xb0e4d17c90a94eb7l,0x27555067aceb0176l,0x587576e15c38c4e2l, 16834 0xe647d9dd445f2880l }, 16835 { 0x00beb2f5ca502f83l,0x4e89e638c44767c7l,0xbef361da154a5757l, 16836 0x2dc632a2dc0675f2l }, 16837 0 }, 16838 /* 40 << 16 */ 16839 { { 0xed439a33a72ba054l,0xa3170a15ead265bal,0xcf7eb903fe99a58el, 16840 0xcf6db0c633d80c26l }, 16841 { 0xd031255ef613e71al,0x12ccbe5718ca255cl,0xdd21d0537808c40dl, 16842 0xf5488ebc3af2be6bl }, 16843 0 }, 16844 /* 41 << 16 */ 16845 { { 0x589a125ac10f8157l,0x3c8a15bde1353e49l,0x7d9bbd0c22ce2dd0l, 16846 0xdfcd019211ac7bb1l }, 16847 { 0x0e1d67151193c5b1l,0xd4de115ab0e8c285l,0x0b3e94c2272c29fel, 16848 0xea640843c8213581l }, 16849 0 }, 16850 /* 43 << 16 */ 16851 { { 0x7a01aeed6aca2231l,0x8135cf2ace80abbel,0xdc1a41b2ae5fdec9l, 16852 0xde34ea4da0174364l }, 16853 { 0xa5104e453cf8b845l,0x4b6fd986675ba557l,0x4bc750af29c8cb4al, 16854 0x8bebb266583f9391l }, 16855 0 }, 16856 /* 44 << 16 */ 16857 { { 0x47110d7c1be3f9c5l,0x12b9e4485eadb4ddl,0x6e8c09870b713d41l, 16858 0xe1e20356733d56ael }, 16859 { 0xe68d6bab445ea727l,0x9ef4f6eac934a1a4l,0xe0155547f8cef1c3l, 16860 0xdb5c3909159bdcbfl }, 16861 0 }, 16862 /* 45 << 16 */ 16863 { { 0xef0449cb32fa8a37l,0x95071f5dcd246405l,0x1c56ad776c598891l, 16864 0x981781de0fa9cd42l }, 16865 { 0x0f93d456d29c0500l,0x43aa7bc1483f52c4l,0xd7c8736666c8abadl, 16866 0x47552530ea5050efl }, 16867 0 }, 16868 /* 46 << 16 */ 16869 { { 0x40dd9ca9fa9b8d3dl,0xf27b7bc056da41d9l,0x87967f4b66db8845l, 16870 0xf6918c9444de6bc7l }, 16871 { 0x4d76d51135568d4dl,0x7ab18f9a40e7fa5al,0x069a44bba5bbbdc6l, 16872 0x19e6c04bb4c8f808l }, 16873 0 }, 16874 /* 47 << 16 */ 16875 { { 0x5fd2501108b2b6c7l,0xcce85a3ec41cad21l,0x90857daffdd70387l, 16876 0x7a679062c63789f4l }, 16877 { 0x9c462134ef8666e2l,0xcb7dba108c8505bdl,0x7c4a7e2fc610f2e7l, 16878 0x22906f65d68315f9l }, 16879 0 }, 16880 /* 48 << 16 */ 16881 { { 0xf2efe23d442a8ad1l,0xc3816a7d06b9c164l,0xa9df2d8bdc0aa5e5l, 16882 0x191ae46f120a8e65l }, 16883 { 0x83667f8700611c5bl,0x83171ed7ff109948l,0x33a2ecf8ca695952l, 16884 0xfa4a73eef48d1a13l }, 16885 0 }, 16886 /* 49 << 16 */ 16887 { { 0x41dd38c1118de9a0l,0x3485cb3be2d8f6f5l,0xd4bac751b1dcc577l, 16888 0x2148d93fed12ea6bl }, 16889 { 0xde3504729da8cb18l,0x6046daf89eb85925l,0xddbc357b942b1044l, 16890 0x248e7afe815b8b7cl }, 16891 0 }, 16892 /* 51 << 16 */ 16893 { { 0xd4bb77b3acb21004l,0xe9f236cf83392035l,0xa9894c5c52133743l, 16894 0x4d6112749a7b054al }, 16895 { 0xa61675ea4ba2a553l,0x59c199681da6aa78l,0x3988c36590f474del, 16896 0x73e751bbd001be43l }, 16897 0 }, 16898 /* 52 << 16 */ 16899 { { 0x97cacf846604007dl,0x1e92b4b22d47a9f1l,0x858ae0d6374ed165l, 16900 0x4c973e6f307aefb8l }, 16901 { 0x6f524a238a10eb72l,0x7b4a92a9eb2849d6l,0x3678bda42fe91eddl, 16902 0x56092acd7c0fc35cl }, 16903 0 }, 16904 /* 53 << 16 */ 16905 { { 0x93bea99b1b9b43c4l,0x2f6af6f3e145fda2l,0x862f0607278adf0dl, 16906 0x647be08398456ccal }, 16907 { 0xce79ba1487250c28l,0x1c1c4fc8efedab42l,0x966f612af90caa8dl, 16908 0xb1a2cf6e72c440f8l }, 16909 0 }, 16910 /* 55 << 16 */ 16911 { { 0x2fca1be45b3b7dd5l,0x453c19853c211bcal,0x313cb21969a46484l, 16912 0x66082837414bd5dfl }, 16913 { 0xab7a97bf2ac1cdf7l,0x45cd1792676d778fl,0x42fb6c4f6a5b560al, 16914 0x45747fe30b8f17e9l }, 16915 0 }, 16916 /* 57 << 16 */ 16917 { { 0x38b6db6235db6218l,0xa10cdfe1bb54bacal,0x56fd4a1d610f7f6bl, 16918 0xc4bea78b76d183d7l }, 16919 { 0xc0e6ca9fbf730d26l,0x1b1e271aed6cf535l,0x6fef275faadbe375l, 16920 0xfa2e8da903e489bal }, 16921 0 }, 16922 /* 59 << 16 */ 16923 { { 0x6f79d25c7c4626ecl,0xfe27690232d55d6cl,0x3f5c5768afa19ce3l, 16924 0xa1373777f8834739l }, 16925 { 0x761d67a8a4ce960al,0xb34de1ea459e656al,0x8725b0f09db6f269l, 16926 0x75316f250dbfe22el }, 16927 0 }, 16928 /* 60 << 16 */ 16929 { { 0x091d5b631a093b40l,0xb85c1c075862f24al,0xc5d74eb53e8f85bfl, 16930 0xf51c7746cab22456l }, 16931 { 0xc25cb8d9e761da89l,0x2670ec2fc0f028b5l,0x873fd30d2db9af5cl, 16932 0x3d0f1ea18262565el }, 16933 0 }, 16934 /* 61 << 16 */ 16935 { { 0x8f9492c261c23b3cl,0xd366baeb631688a4l,0x55e759e78093bb07l, 16936 0xf6d0eaf47218f765l }, 16937 { 0xb8a174ff54ca583bl,0x790f10e0b23d14cel,0xfebe7333be83cbbal, 16938 0xfeb6dcc5eed67536l }, 16939 0 }, 16940 /* 63 << 16 */ 16941 { { 0x175b3bacce027e5bl,0xe0728a99c48252c4l,0x0be25d4507a39c7cl, 16942 0xcb9c2d3aba8e8c72l }, 16943 { 0x6185a48d1abd459al,0x27207feadff9a27bl,0xfd92e8231d34393fl, 16944 0x738511534351d965l }, 16945 0 }, 16946 /* 64 << 16 */ 16947 { { 0xfcde7cc8f43a730fl,0xe89b6f3c33ab590el,0xc823f529ad03240bl, 16948 0x82b79afe98bea5dbl }, 16949 { 0x568f2856962fe5del,0x0c590adb60c591f3l,0x1fc74a144a28a858l, 16950 0x3b662498b3203f4cl }, 16951 0 }, 16952 /* 65 << 16 */ 16953 { { 0x8ede0fcdc11682eel,0x41e3faa1b2ab5664l,0x58b2a7dc26a35ff5l, 16954 0x939bcd6b701b89e9l }, 16955 { 0x55f66fd188e0838fl,0x99d1a77b4ff1f975l,0x103abbf72e060cc5l, 16956 0x91c77beb6bc4bdbbl }, 16957 0 }, 16958 /* 71 << 16 */ 16959 { { 0xcd048abca380cc72l,0x91cab1bbd0e13662l,0x68115b18686de4cel, 16960 0x484724e63deccbf5l }, 16961 { 0xf164ba54f176137el,0x5189793662ab2728l,0x6afdecf9b60a5458l, 16962 0xca40472d0aabafd2l }, 16963 0 }, 16964 /* 77 << 16 */ 16965 { { 0x7a9439183b98d725l,0x1c1763e8ece1ea3cl,0x45c44ef639840476l, 16966 0x689271e69c009133l }, 16967 { 0xa017405f56a51fe1l,0xd54cc7253e0d0970l,0x212ad075cfe09e8bl, 16968 0x999f21c37af7bf30l }, 16969 0 }, 16970 /* 83 << 16 */ 16971 { { 0xdc2a2af12bf95f73l,0xb88b4ca76de82cbel,0xa31a21aaecb8e84el, 16972 0x86d19a601b74f5bel }, 16973 { 0xc68bf64406008019l,0xe52ab50e9431c694l,0x6375463d627ab11cl, 16974 0xdd3eeaa03c0ef241l }, 16975 0 }, 16976 /* 89 << 16 */ 16977 { { 0x608d9cb323f1caf8l,0x95069450b1700741l,0xe3132bd2bc2fa7aal, 16978 0xc4f363e7f64e4f06l }, 16979 { 0xb059c4191ca888c2l,0x1004cb1f8d17bf5dl,0x6b6ba6f934ea5711l, 16980 0x071d94abd79b2c8al }, 16981 0 }, 16982 /* 95 << 16 */ 16983 { { 0xc7ef9b42d147a39dl,0x36dd5d770a10cd5bl,0x3bf6cc77d0eea34bl, 16984 0x60c84591197479c7l }, 16985 { 0xf95860ac50ba50edl,0xe1c94a8dc4cdc8fal,0x780818d685e24a23l, 16986 0x1950e3c0c8abbd27l }, 16987 0 }, 16988 /* 101 << 16 */ 16989 { { 0x9908c694ae04778el,0x2e37a6790a0d36ffl,0x212a340f52b067bdl, 16990 0xec89c9fad080b914l }, 16991 { 0x920dc2f005ab8a23l,0xecff5c78655e8984l,0x80eedd34f66211acl, 16992 0xa7a56366ef58d4d8l }, 16993 0 }, 16994 /* 107 << 16 */ 16995 { { 0x4f95debe2bca42f0l,0xf0346307844334d2l,0x7003a60521d600aal, 16996 0x1eb98c6365c5248al }, 16997 { 0x6757b3822fa202cal,0x32765d399fb12f36l,0xe851b476d7b44c9al, 16998 0x27cd7d1b4e0bab4cl }, 16999 0 }, 17000 /* 113 << 16 */ 17001 { { 0xd0c1f7c9c43ea1a3l,0x73d944f49f42907dl,0xd113f34619352c92l, 17002 0x86a1ad53b149cdc1l }, 17003 { 0x32c34e8f848d1be4l,0xba8afda7c3d9360bl,0x17e8bc32eea8bf96l, 17004 0x3174cae499c87febl }, 17005 0 }, 17006 /* 116 << 16 */ 17007 { { 0x4b215f016671b47el,0xb67633ca4a8dae2al,0x2915120f79fd3cdbl, 17008 0xc1f8a06fb064e6del }, 17009 { 0xf4d5368cc1d57420l,0x6ada51a8e18de475l,0xa0f0d47cc749d4b0l, 17010 0xabfa2c0074526aa5l }, 17011 0 }, 17012 /* 119 << 16 */ 17013 { { 0xf752f6659e5ce44fl,0x7b97ebfa189d35ecl,0x9540cbb90fc609abl, 17014 0x19c1dc6999632cc8l }, 17015 { 0x0a957700e08ca9a8l,0xb0cd0ab7a3246a4el,0xca687cfcc8d6a544l, 17016 0xb6281f0035f82a77l }, 17017 0 }, 17018 /* 125 << 16 */ 17019 { { 0x547027012b818036l,0xf72315f729c8f14cl,0x95f1bc15230e74bel, 17020 0x2e7c492f1abe20d4l }, 17021 { 0xe1ea8b1cd7e78ab1l,0xc3f6ba59043585adl,0xac404ea9477ac053l, 17022 0xaa6872914ec6d0e3l }, 17023 0 }, 17024 }, 17025 { 17026 /* 0 << 24 */ 17027 { { 0x00, 0x00, 0x00, 0x00 }, 17028 { 0x00, 0x00, 0x00, 0x00 }, 17029 1 }, 17030 /* 1 << 24 */ 17031 { { 0xd9d0c8c4868af75dl,0xd7325cff45c8c7eal,0xab471996cc81ecb0l, 17032 0xff5d55f3611824edl }, 17033 { 0xbe3145411977a0eel,0x5085c4c5722038c6l,0x2d5335bff94bb495l, 17034 0x894ad8a6c8e2a082l }, 17035 0 }, 17036 /* 3 << 24 */ 17037 { { 0xd1e059b21994ef20l,0x2a653b69638ae318l,0x70d5eb582f699010l, 17038 0x279739f709f5f84al }, 17039 { 0x5da4663c8b799336l,0xfdfdf14d203c37ebl,0x32d8a9dca1dbfb2dl, 17040 0xab40cff077d48f9bl }, 17041 0 }, 17042 /* 4 << 24 */ 17043 { { 0xf2369f0b879fbbedl,0x0ff0ae86da9d1869l,0x5251d75956766f45l, 17044 0x4984d8c02be8d0fcl }, 17045 { 0x7ecc95a6d21008f0l,0x29bd54a03a1a1c49l,0xab9828c5d26c50f3l, 17046 0x32c0087c51d0d251l }, 17047 0 }, 17048 /* 5 << 24 */ 17049 { { 0xf61790abfbaf50a5l,0xdf55e76b684e0750l,0xec516da7f176b005l, 17050 0x575553bb7a2dddc7l }, 17051 { 0x37c87ca3553afa73l,0x315f3ffc4d55c251l,0xe846442aaf3e5d35l, 17052 0x61b911496495ff28l }, 17053 0 }, 17054 /* 7 << 24 */ 17055 { { 0x4bdf3a4956f90823l,0xba0f5080741d777bl,0x091d71c3f38bf760l, 17056 0x9633d50f9b625b02l }, 17057 { 0x03ecb743b8c9de61l,0xb47512545de74720l,0x9f9defc974ce1cb2l, 17058 0x774a4f6a00bd32efl }, 17059 0 }, 17060 /* 9 << 24 */ 17061 { { 0x327bc002b0131e5bl,0x1739e6d5cb2514d9l,0xc8cbdafe55a81543l, 17062 0x5bb1a36ce1137243l }, 17063 { 0x205da3c517325327l,0xc35c1a36515a057el,0xf00f64c942925f9bl, 17064 0xbd14633cb7d59f7al }, 17065 0 }, 17066 /* 10 << 24 */ 17067 { { 0xae2ad171656e8c3al,0xc0e2a4631acd0705l,0x006f6a8aa0b6055cl, 17068 0xaf4513d72b65a26el }, 17069 { 0x3f549e14d616d5bcl,0x64ee395571253b1fl,0xe8b10bc1b8ce243al, 17070 0xbcbeace5913a4e77l }, 17071 0 }, 17072 /* 11 << 24 */ 17073 { { 0x47c1004341f37dbdl,0x96eccae36168ecf6l,0x65bde59d1ca46aa3l, 17074 0x38a7027ab8698ffal }, 17075 { 0xa2b89dc86dc34437l,0x5a0a118d43a4153fl,0x9e330a861ce22fd8l, 17076 0x28382af6b3bbd3bcl }, 17077 0 }, 17078 /* 13 << 24 */ 17079 { { 0x0b2e27c0d81e0271l,0xa67a7596117a317cl,0x17f08928a6723d99l, 17080 0x71a75681485310a3l }, 17081 { 0x90465462afb66ca9l,0x185e97ccfbbe229dl,0x6a1a606addad8fc2l, 17082 0x2431f316b3c797cfl }, 17083 0 }, 17084 /* 15 << 24 */ 17085 { { 0x4703401193529432l,0x1f106bdd30743462l,0xabfb9964cd66d8cal, 17086 0x934d9d5ae9bdadd5l }, 17087 { 0x5976d815908e3d22l,0x344a362f28e057bdl,0xf92cdadc5443dfb3l, 17088 0x001297adf089603bl }, 17089 0 }, 17090 /* 16 << 24 */ 17091 { { 0x7f99824f20151427l,0x206828b692430206l,0xaa9097d7e1112357l, 17092 0xacf9a2f209e414ecl }, 17093 { 0xdbdac9da27915356l,0x7e0734b7001efee3l,0x54fab5bbd2b288e2l, 17094 0x4c630fc4f62dd09cl }, 17095 0 }, 17096 /* 17 << 24 */ 17097 { { 0x4a2fce605044066bl,0x904a019cfa3a47f4l,0xba81ea9c0c5c0a60l, 17098 0xd7e4ea0d96c098bdl }, 17099 { 0xefe700419cd50a02l,0xc0c839d42d7f048cl,0xe2daf264e09b561fl, 17100 0x0cbc13185034b18bl }, 17101 0 }, 17102 /* 19 << 24 */ 17103 { { 0x11e5f2e388323f7al,0xe07a74c2927584cdl,0x1e774b3495613d2dl, 17104 0x9c9b52c52c787488l }, 17105 { 0x3cdd3c3ebe421f08l,0x5ff7819e223e3d5fl,0xba8739b2c1da09b9l, 17106 0x6b7263164e8b491bl }, 17107 0 }, 17108 /* 21 << 24 */ 17109 { { 0xb5afd13ca0943befl,0xd651772957abb1ccl,0x9d5a52dc9b61b5bcl, 17110 0x85cefaa6806e31cdl }, 17111 { 0xab84257a720a1deal,0x6a60261bced70d35l,0xc023f94db9d6da61l, 17112 0x947f7eec54a0ae0el }, 17113 0 }, 17114 /* 23 << 24 */ 17115 { { 0xc3b787569f83b787l,0xd6d249263694ddd7l,0x58d248945d70a02el, 17116 0xac16670e8c278c6al }, 17117 { 0x71a94d58e370b6e6l,0xe4d763840253db05l,0x99b1c98814b32cfel, 17118 0x4e6bd870cc78cc95l }, 17119 0 }, 17120 /* 25 << 24 */ 17121 { { 0xf5f7ca79c8b63614l,0xf3bfb2158af4903cl,0x2bdb9f5496d47bd3l, 17122 0xd6e715300e8a63bal }, 17123 { 0x67e90a497a93bec4l,0x8613478b8c1e63eel,0xe36bd9c8f2dde561l, 17124 0x681486518a768689l }, 17125 0 }, 17126 /* 27 << 24 */ 17127 { { 0xef617a9494aa531cl,0x9ac35e2fd6f4ad87l,0xbcd2a047122468fbl, 17128 0xbd7a423fef7c5ca6l }, 17129 { 0xab58cb52064c8040l,0x93ef4ed54a644716l,0xf7d17097c32cd48dl, 17130 0xb249a173d17fcf42l }, 17131 0 }, 17132 /* 28 << 24 */ 17133 { { 0x66fe0fffe298cdf5l,0x3f61bea47b2e51b6l,0x7d372117bad3afa4l, 17134 0x6521a09cef656e2fl }, 17135 { 0xb3b8c966e8a58fe7l,0x25203a115a47ebc7l,0xfe81588d5c4be573l, 17136 0x6132e2f31f49a03cl }, 17137 0 }, 17138 /* 29 << 24 */ 17139 { { 0xbbe5c108b7a7ecc4l,0x62a5a78ebfd22e4cl,0xb7974033df188bd2l, 17140 0xcf11deea4df7d1ael }, 17141 { 0x99cc774a53ace3eal,0xe0373a71105cc1f6l,0xd751987f133d7a20l, 17142 0xab86ee04ae215871l }, 17143 0 }, 17144 /* 31 << 24 */ 17145 { { 0x2094f9a280cd10e6l,0x045232aa7b8a0da7l,0x969a81b69c03244el, 17146 0x1293b4ca7e98d955l }, 17147 { 0x1631421dd68f3ab0l,0xa0106422c3738c82l,0xc5f43845f82c4ff9l, 17148 0xb479acbe1aa0f58fl }, 17149 0 }, 17150 /* 33 << 24 */ 17151 { { 0xf1db0267f67683cfl,0xa6b13c9e44ce009dl,0x04b4eed505884a69l, 17152 0xf2ff9c16d9087a0bl }, 17153 { 0x2c53699b3e35b4a6l,0x5020c0142369afb8l,0xf83bfe0095be37f1l, 17154 0xd300d8c553b29d80l }, 17155 0 }, 17156 /* 34 << 24 */ 17157 { { 0x16893055811cf4bbl,0x580dd1e55aeb5027l,0xcaf47fba5ae3c71cl, 17158 0xde79698129ebbb07l }, 17159 { 0xbed1db33d262cdd3l,0x78315e3748c7313bl,0xfc9561f02fe1368dl, 17160 0xe0209698ccacacc7l }, 17161 0 }, 17162 /* 35 << 24 */ 17163 { { 0xd61af89a781ece24l,0xf3b90626008f41e9l,0xd715dbf7c5693191l, 17164 0x8d6c05de6f299edel }, 17165 { 0xf18d62637ca50aacl,0x7987bf5cb0dd5fdcl,0x424136bd2cfa702bl, 17166 0xaa7e237ded859db2l }, 17167 0 }, 17168 /* 36 << 24 */ 17169 { { 0xde7169e4e5d41796l,0x6700333e33c0a380l,0xe20b95780343a994l, 17170 0xa745455e1fb3a1c3l }, 17171 { 0x97e0ff88ce029a7fl,0x3b3481c976e384bcl,0x028b339dddad5951l, 17172 0xa1fdcdbae4b95cfcl }, 17173 0 }, 17174 /* 37 << 24 */ 17175 { { 0xcc9221baed20c6adl,0xf2619a51fa9c73aal,0xfc2cff847d7f55a5l, 17176 0xd56c23d65f01d4dal }, 17177 { 0x6d20f88cb3d84d5fl,0x048825f75dcc615dl,0x73634d3f85631a6el, 17178 0xa57a02e3ad7b2e2dl }, 17179 0 }, 17180 /* 39 << 24 */ 17181 { { 0x067a8dcf08aa81ffl,0x62948258c23f3d16l,0xb61bd04316f2fe7bl, 17182 0xf250f769b6a766b1l }, 17183 { 0x32df97246d0b241el,0xb736e4bb714e5f88l,0x50da15022c1d40d7l, 17184 0x013e0edebdd285a4l }, 17185 0 }, 17186 /* 40 << 24 */ 17187 { { 0x1b92c3a0181a5d8fl,0x6429531d9adb77c7l,0x629152b53af710eel, 17188 0x4e3f27370bd5647el }, 17189 { 0xfb7c392b77553c7dl,0xa930abacefe78c87l,0xf80c8cd6a05a6991l, 17190 0x751469b71be5f6f5l }, 17191 0 }, 17192 /* 41 << 24 */ 17193 { { 0xf89f2b0b3e2f2af0l,0x52f634099eefc39al,0x505005c679906cb6l, 17194 0x820c2216b2de0b1el }, 17195 { 0x96f0f2831f20ad7al,0xcd33125c718ffcb0l,0xf6130ef278f0c578l, 17196 0x4cda2471d0b76b95l }, 17197 0 }, 17198 /* 43 << 24 */ 17199 { { 0x611dd83f39485581l,0x96c47051803e1b20l,0xefacc736830f44c7l, 17200 0x5588d8ce688b12bal }, 17201 { 0x44f4edf3eee70fadl,0x1026dfd8869539f7l,0xa4c146ee8ddb0e00l, 17202 0x9f4f55816efb41c8l }, 17203 0 }, 17204 /* 44 << 24 */ 17205 { { 0x6036ed0236cbace7l,0x5a70e4abada837ddl,0xf06918aff10b2fefl, 17206 0x08a8a9f69fd31590l }, 17207 { 0x6c4a1ba6916af88dl,0x4868bc1466016037l,0x06d345af164228a9l, 17208 0x2c1961d19b550dd9l }, 17209 0 }, 17210 /* 45 << 24 */ 17211 { { 0x8b72775c6851f0acl,0x7827242bd70f5975l,0x2de91f1e34db4a6fl, 17212 0x586bf3d58538f5eel }, 17213 { 0xf0a15aed25d9a09bl,0x43018e56f74deb46l,0xc2af1ad0f50e0e67l, 17214 0x49cc9528b10cff6fl }, 17215 0 }, 17216 /* 46 << 24 */ 17217 { { 0x05eb146c9d55c425l,0xe2b557ccbc62261fl,0x2a716301bd077089l, 17218 0x83a63c81e0527d02l }, 17219 { 0x055ff7f8a0d9203bl,0x05d09f0525bf5a04l,0x2e44545fb3eb0b30l, 17220 0xed7c57c4d279a1adl }, 17221 0 }, 17222 /* 47 << 24 */ 17223 { { 0x6928f6e45e0ebdd5l,0xd7e44ddf092d233bl,0xe7148066d1b7026fl, 17224 0xf645a2e53d5f25c3l }, 17225 { 0x6eeb25ee58ff9eb4l,0x60f1fcf737f87ebfl,0x9eaaf1e5c4679c70l, 17226 0x4609fb13b7b7dc7el }, 17227 0 }, 17228 /* 48 << 24 */ 17229 { { 0xae915f5d5fa067d1l,0x4134b57f9668960cl,0xbd3656d6a48edaacl, 17230 0xdac1e3e4fc1d7436l }, 17231 { 0x674ff869d81fbb26l,0x449ed3ecb26c33d4l,0x85138705d94203e8l, 17232 0xccde538bbeeb6f4al }, 17233 0 }, 17234 /* 49 << 24 */ 17235 { { 0x27f317af2b33987fl,0xd2d3cf5d51e59588l,0x333999bd031f27c9l, 17236 0x6ddfa3f22e0a3306l }, 17237 { 0x23e0e651990041b0l,0xf028aba1585837acl,0x1c6ad72b25226f53l, 17238 0xf243c991d1fca64al }, 17239 0 }, 17240 /* 51 << 24 */ 17241 { { 0x72b8a13272cbae1fl,0xfe0b1c4fbfdbd64al,0x98bc7876c5e76921l, 17242 0x51c726bfdb1f5af7l }, 17243 { 0x97e88a842c186e8bl,0x9ed99516ed8eb7b4l,0x3e54a17dafc818ebl, 17244 0xfcfbf25a1e8f77d8l }, 17245 0 }, 17246 /* 52 << 24 */ 17247 { { 0x7780d7d68f7d5c6el,0x6725b49a454101e6l,0xceddc26586b0770cl, 17248 0xc26624615666f504l }, 17249 { 0x16b77477ce040f75l,0x13f9113c293f8b45l,0xff0cfa07e2dcc91el, 17250 0x1948d8bd41c202f5l }, 17251 0 }, 17252 /* 53 << 24 */ 17253 { { 0x4c6ae39a1dfbe13al,0xafb1e5c46be9c200l,0x39e728d168bb08c3l, 17254 0xc794b905acc9166fl }, 17255 { 0x1cb0dec2d9c7c3e4l,0xc4c3053289f14d65l,0x4af80801a6a9d609l, 17256 0x79d7e82de0d6ab24l }, 17257 0 }, 17258 /* 55 << 24 */ 17259 { { 0xb905c6af8ad4cf6el,0x785590b0f6d1be13l,0x78f402c2a0ef76bel, 17260 0x739b22ea5c19a40bl }, 17261 { 0xd4d3262553d596b6l,0x01598eb4d571666bl,0xf8dc150b8173486al, 17262 0xd8aa43af15e94f09l }, 17263 0 }, 17264 /* 57 << 24 */ 17265 { { 0xcfa387cd984393b5l,0x1645659e21a1bf92l,0xb4ab3966dd46c7eel, 17266 0xcf8c296d89482623l }, 17267 { 0x72e4d01cf976b4c0l,0x44ad07e8fa0fa5ebl,0xd6c82681b486fdd2l, 17268 0x2d9074f89b8845b4l }, 17269 0 }, 17270 /* 59 << 24 */ 17271 { { 0x96e4fc08d96862dbl,0xf9e29bb6c50c14b2l,0xfedaad64f8f9be75l, 17272 0xab6b2d79ae9e1274l }, 17273 { 0x033e3eb58d84dec0l,0xc136904ccbd113e7l,0xb82b0aed6061f289l, 17274 0x3476d9247b699e25l }, 17275 0 }, 17276 /* 60 << 24 */ 17277 { { 0x8fb5ceeb969231dcl,0xaed13be1686ff6cdl,0x71d7c67bdd69db87l, 17278 0x49613e08fb53f33al }, 17279 { 0x2899729ead8e802fl,0x83bfde49d1982a1dl,0x675c45ea878239d2l, 17280 0xb7bf59cd0d8240d3l }, 17281 0 }, 17282 /* 61 << 24 */ 17283 { { 0x853d8cd1baf53b8bl,0x9c73d04cff95fc18l,0xae8a94412d1d6aacl, 17284 0xd8a15ce901500b70l }, 17285 { 0xaef813499aacba59l,0x2cd2ba0ac493cd8dl,0x01c37ee1f398f034l, 17286 0xed72d51d0f7299fcl }, 17287 0 }, 17288 /* 63 << 24 */ 17289 { { 0x2c204940e7592fb1l,0xcc1bb19b49366f08l,0x31855e8a7c927935l, 17290 0x16f7e9a2c590b81dl }, 17291 { 0xa5fbb7c1ed8df240l,0x7b5204122de2d7f5l,0x7eb1eb989a637588l, 17292 0x5ef4eca89540d2e8l }, 17293 0 }, 17294 /* 64 << 24 */ 17295 { { 0x55d5c68da61a76fal,0x598b441dca1554dcl,0xd39923b9773b279cl, 17296 0x33331d3c36bf9efcl }, 17297 { 0x2d4c848e298de399l,0xcfdb8e77a1a27f56l,0x94c855ea57b8ab70l, 17298 0xdcdb9dae6f7879bal }, 17299 0 }, 17300 /* 65 << 24 */ 17301 { { 0x811e14dd9594afb8l,0xaf6c1b10d349124al,0x8488021b6528a642l, 17302 0xecf6834341cf1447l }, 17303 { 0x7a40acb756924446l,0xd9c11bbed98ec4cfl,0x0cef00bfb2bff163l, 17304 0xfaaad8015432803bl }, 17305 0 }, 17306 /* 71 << 24 */ 17307 { { 0x5a217d5e6b075cbel,0x7ef88d1dc89b513bl,0xb6d015da0531c93bl, 17308 0x477b502a6333834al }, 17309 { 0x4655e48b2fb458d5l,0x93f21a7cb7674ca8l,0xa0616786502d1f3al, 17310 0x82d16d17f26bb6ccl }, 17311 0 }, 17312 /* 77 << 24 */ 17313 { { 0x3d995aa9183c1688l,0xa125906c3766d2e8l,0x23ed7871c5f10d5bl, 17314 0xdfe1e1cc6df80368l }, 17315 { 0x8bfcb54271eaae2cl,0xe94e6f910945a7bbl,0xd543ef90862f650al, 17316 0x0dc043b803eed66bl }, 17317 0 }, 17318 /* 83 << 24 */ 17319 { { 0x0c6a5620060d2ccdl,0xcd8200e37a8a03a4l,0x6018d304793867e6l, 17320 0xad23dd61a74d054dl }, 17321 { 0x5a856faeebc21eb4l,0x66be16714b5cd7dbl,0xe0d0441ec75f8c9dl, 17322 0xb80ca9ecf90dbc6dl }, 17323 0 }, 17324 /* 89 << 24 */ 17325 { { 0xbd6902ccd24692cbl,0xbcce6bbc21920408l,0x40f120ca55dec4c5l, 17326 0xd9f1f5ef5361c8b3l }, 17327 { 0x535d368226935dffl,0x9635447b01a9998al,0x8c4ec40d99e36d12l, 17328 0xbaeef8912b793369l }, 17329 0 }, 17330 /* 95 << 24 */ 17331 { { 0xded3a51c1cd887ebl,0xd43225568376515cl,0xdaf3a2271ca7c097l, 17332 0x089156fdecd4d90cl }, 17333 { 0x2b354810ca0727c9l,0xb7257c1966c19d8cl,0x5e68a379432d5072l, 17334 0x75c04c2443e585c7l }, 17335 0 }, 17336 /* 101 << 24 */ 17337 { { 0xb5ba2a8fe5e0952fl,0x2c2d086811040b4el,0x27448bd5f818e253l, 17338 0x720f677987a92c85l }, 17339 { 0x2c9b2367b9d035fal,0xf18ad8ce16c15ab9l,0xd65a360841bd57eel, 17340 0xeb4b07c9ff6ae897l }, 17341 0 }, 17342 /* 107 << 24 */ 17343 { { 0xcffb6d71d38589acl,0x812372920fa509d3l,0x94db5ba6e54725e8l, 17344 0x1ad2b4206cfbb825l }, 17345 { 0x8592c1f238cfb9f2l,0xbe8e917e0eec6a27l,0x53921bfe9d93d42fl, 17346 0x1aa95e6269454a35l }, 17347 0 }, 17348 /* 113 << 24 */ 17349 { { 0xc25e8934d898049dl,0xeeaf4e6d3bb3d459l,0xc3ac44447d29ad10l, 17350 0xccdf9fcbcef8fa04l }, 17351 { 0x1d995a3fb9679cb9l,0x3d6c5eab46fabc14l,0xd3849ff066385d4dl, 17352 0xc0eb21bacff08be2l }, 17353 0 }, 17354 /* 116 << 24 */ 17355 { { 0x8213c71e90d13fd6l,0x114321149bb6b733l,0xaaf8037880ac4902l, 17356 0xb24e046b555f7557l }, 17357 { 0x5f6ed2881db79832l,0xd493a758ac760e5dl,0xbc30a2a7a1c0f570l, 17358 0xa5009807161174e3l }, 17359 0 }, 17360 /* 119 << 24 */ 17361 { { 0x9e9b864a6889e952l,0xee908932f352f31al,0xe421f2423166b932l, 17362 0x6dd4aa3b7ddbdb35l }, 17363 { 0x553cc5639e8b88a4l,0x05457f171f04704dl,0x1dcc3004c9554e6bl, 17364 0x3a4a3a253f1b61e7l }, 17365 0 }, 17366 /* 125 << 24 */ 17367 { { 0x7ac0a5e7c56e303al,0x7c7bab64037b0a19l,0x11f103fcc8d29a2bl, 17368 0x7d99dc46cf0b1340l }, 17369 { 0x0481588ceffba92el,0x8a817356b04e77bcl,0x19edf4dbce1b708dl, 17370 0xa2a1f7a6e6f9d52cl }, 17371 0 }, 17372 }, 17373 { 17374 /* 0 << 32 */ 17375 { { 0x00, 0x00, 0x00, 0x00 }, 17376 { 0x00, 0x00, 0x00, 0x00 }, 17377 1 }, 17378 /* 1 << 32 */ 17379 { { 0x202886024147519al,0xd0981eac26b372f0l,0xa9d4a7caa785ebc8l, 17380 0xd953c50ddbdf58e9l }, 17381 { 0x9d6361ccfd590f8fl,0x72e9626b44e6c917l,0x7fd9611022eb64cfl, 17382 0x863ebb7e9eb288f3l }, 17383 0 }, 17384 /* 3 << 32 */ 17385 { { 0xa18f07e0e90fb21el,0x00fd2b80bba7fca1l,0x20387f2795cd67b5l, 17386 0x5b89a4e7d39707f7l }, 17387 { 0x8f83ad3f894407cel,0xa0025b946c226132l,0xc79563c7f906c13bl, 17388 0x5f548f314e7bb025l }, 17389 0 }, 17390 /* 4 << 32 */ 17391 { { 0x0ee6d3a7c35d8794l,0x042e65580356bae5l,0x9f59698d643322fdl, 17392 0x9379ae1550a61967l }, 17393 { 0x64b9ae62fcc9981el,0xaed3d6316d2934c6l,0x2454b3025e4e65ebl, 17394 0xab09f647f9950428l }, 17395 0 }, 17396 /* 5 << 32 */ 17397 { { 0xc1b3d3d331b85f09l,0x0f45354aa88ae64al,0xa8b626d32fec50fdl, 17398 0x1bdcfbd4e828834fl }, 17399 { 0xe45a2866cd522539l,0xfa9d4732810f7ab3l,0xd8c1d6b4c905f293l, 17400 0x10ac80473461b597l }, 17401 0 }, 17402 /* 7 << 32 */ 17403 { { 0xbbb175146fc627e2l,0xa0569bc591573a51l,0xa7016d9e358243d5l, 17404 0x0dac0c56ac1d6692l }, 17405 { 0x993833b5da590d5fl,0xa8067803de817491l,0x65b4f2124dbf75d0l, 17406 0xcc960232ccf80cfbl }, 17407 0 }, 17408 /* 9 << 32 */ 17409 { { 0x35d742806cf3d65bl,0x4b7c790678b28dd9l,0xc4fcdd2f95e1f85fl, 17410 0xcf6fb7ba591350b6l }, 17411 { 0x9f8e3287edfc26afl,0xe2dd9e73c2d0ed9al,0xeab5d67f24cbb703l, 17412 0x60c293999a759a5al }, 17413 0 }, 17414 /* 10 << 32 */ 17415 { { 0xcf8625d7708f97cdl,0xfb6c5119ea419de4l,0xe8cb234dc03f9b06l, 17416 0x5a7822c335e23972l }, 17417 { 0x9b876319a284ff10l,0xefcc49977093fdcel,0xdddfd62a878fe39al, 17418 0x44bfbe53910aa059l }, 17419 0 }, 17420 /* 11 << 32 */ 17421 { { 0xfb93ca3d7ca53d5fl,0x432649f004379cbfl,0xf506113acba2ff75l, 17422 0x4594ae2103718b35l }, 17423 { 0x1aa6cee50d044627l,0xc0e0d2b7f5c94aa2l,0x0bf33d3dee4dd3f5l, 17424 0xaca96e288477c97al }, 17425 0 }, 17426 /* 13 << 32 */ 17427 { { 0x995c068e6861a713l,0xa9ba339463de88dcl,0xab954344689a964fl, 17428 0x58195aec0f5a0d6cl }, 17429 { 0xc5f207d5c98f8b50l,0x6600cd280c98ccf6l,0x1a680fe339c3e6c2l, 17430 0xa23f3931660e87c0l }, 17431 0 }, 17432 /* 15 << 32 */ 17433 { { 0x43bc1b42c78440a1l,0x9a07e22632ac6c3fl,0xaf3d7ba10f4bcd15l, 17434 0x3ad43c9da36814c6l }, 17435 { 0xca11f742a0c9c162l,0xd3e06fc6c90b96ecl,0xeace6e766bf2d03fl, 17436 0x8bcd98e8f8032795l }, 17437 0 }, 17438 /* 16 << 32 */ 17439 { { 0xe27a6dbe305406ddl,0x8eb7dc7fdd5d1957l,0xf54a6876387d4d8fl, 17440 0x9c479409c7762de4l }, 17441 { 0xbe4d5b5d99b30778l,0x25380c566e793682l,0x602d37f3dac740e3l, 17442 0x140deabe1566e4ael }, 17443 0 }, 17444 /* 17 << 32 */ 17445 { { 0x7be3ddb77099ae96l,0x83d6157306e0da6al,0x31bcac5f74bf9870l, 17446 0x7f7aa3b422b256f1l }, 17447 { 0xff84d63caa212e20l,0x7d636556decdc8b5l,0x8fed824dbf909d62l, 17448 0x62d70186e5fb1445l }, 17449 0 }, 17450 /* 19 << 32 */ 17451 { { 0x8796989f67d8ab8al,0xa46282253700b772l,0xa353cadf05f799abl, 17452 0x7a8be2741eeb06bbl }, 17453 { 0xf74a367e4653b134l,0x4e43449660c70340l,0xc99b6d6b72e10b18l, 17454 0xcf1adf0f1ba636e1l }, 17455 0 }, 17456 /* 21 << 32 */ 17457 { { 0xb0260fb57c6a0958l,0xae791b9c2fc2731el,0xb339f2bf8ce6e575l, 17458 0x769214a816e2639fl }, 17459 { 0xbaf422e1346da10el,0xc7805fdf7a56f463l,0xf47b6b766f845428l, 17460 0x8f21369e38492948l }, 17461 0 }, 17462 /* 23 << 32 */ 17463 { { 0x2bac716a17931a90l,0x42a5e27cc8267236l,0xfd4b367c0bafeb78l, 17464 0x5856e69c6173db02l }, 17465 { 0xfaac7358973d73c4l,0xbfbffcc36768d285l,0x05444ff2be3eb243l, 17466 0x9f8d3692f3c323fel }, 17467 0 }, 17468 /* 25 << 32 */ 17469 { { 0xac296863221c31a9l,0x46f3a24ef1ca99a9l,0xd927648a7535a864l, 17470 0xd7e3c47d5848e497l }, 17471 { 0xc19595b782a98ac7l,0x9a9bf627273ff554l,0xe29aa48fb62298a1l, 17472 0xed3f068ee797e9e3l }, 17473 0 }, 17474 /* 27 << 32 */ 17475 { { 0x8d16a1660eb9227bl,0xe04c6bc58c37c74bl,0xd1be9585cc1ef78cl, 17476 0xa5cfe1962e929d9bl }, 17477 { 0xc9b0ea21417c1cc6l,0x316352d345b79599l,0xc1502c4dc2d54af7l, 17478 0xe7f4412990f83445l }, 17479 0 }, 17480 /* 28 << 32 */ 17481 { { 0x0f6704abd95917e8l,0x168dafaeaec6e899l,0xd2833e8cde710027l, 17482 0x34ea277e68ee3c59l }, 17483 { 0x3689e2350054d4e5l,0x6f3a568d11013943l,0xb5ce1ff69bc2b144l, 17484 0x705bfe7e72b33a59l }, 17485 0 }, 17486 /* 29 << 32 */ 17487 { { 0x1baa4f02c8e93284l,0xec6b93ea3c97d3e8l,0xb656c149034f8b32l, 17488 0x3cab9063cd4cc69fl }, 17489 { 0xd8de5989d61031ccl,0xcf85329fc1b1de1dl,0xf18b78b323d8cb9al, 17490 0x6dc04bc61a6b69eal }, 17491 0 }, 17492 /* 31 << 32 */ 17493 { { 0x79cf86314a1d4f8fl,0xda5ba331aa47394el,0x36f9c0be8ff20527l, 17494 0xccdc719bbc7097f6l }, 17495 { 0x2304a3ba5cb052bbl,0xab80cdea392f0ab5l,0x0ac1858bf38de03bl, 17496 0xd6e2119878a8f55dl }, 17497 0 }, 17498 /* 33 << 32 */ 17499 { { 0x6bdebc26584bc618l,0x499f0f1894591499l,0xd35ed50bf4a573dal, 17500 0x5a622e73ff2792d0l }, 17501 { 0x8510cbce68d41a3bl,0x6610f43c94e919afl,0x4527373dc163c8a1l, 17502 0x50afb46f280a8a7dl }, 17503 0 }, 17504 /* 34 << 32 */ 17505 { { 0x33e779cd8de7707al,0xf94bbd94438f535bl,0x61159864be144878l, 17506 0xb6623235f098ce4al }, 17507 { 0x6813b71ba65568d8l,0x6603dd4c2f796451l,0x9a97d88c8b9ee5b2l, 17508 0xaaa4593549d5926cl }, 17509 0 }, 17510 /* 35 << 32 */ 17511 { { 0x2e01fc75ebe75bf2l,0x8270318d6cbdd09cl,0x534e4f21d3f1a196l, 17512 0x6c9eaeca9459173el }, 17513 { 0xda454fe0b642a1d4l,0xe45b69bfc4664c4al,0x4724bd423e078dc8l, 17514 0x39ac8fe603336b81l }, 17515 0 }, 17516 /* 36 << 32 */ 17517 { { 0x0a2e53dd302e9485l,0x75882a19deaa9ff4l,0xe283242eac8de4ddl, 17518 0x2742105cc678dba7l }, 17519 { 0x9f6f0a88cdb3a8a2l,0x5c9d3338f722e894l,0xf1fa3143c38c31c1l, 17520 0x22137e2db18c77acl }, 17521 0 }, 17522 /* 37 << 32 */ 17523 { { 0xd821665e368d7835l,0x3300c012b596c6ecl,0xb60da7353557b2ddl, 17524 0x6c3d9db6fb8cf9ael }, 17525 { 0x092d8b0b8b4b0d34l,0x900a0bf4b3d4107dl,0x75371a245e813ec3l, 17526 0x91125a17f2ad56d5l }, 17527 0 }, 17528 /* 39 << 32 */ 17529 { { 0x5e6594e2fe0073e6l,0x908a93778be13cb7l,0xa2c3d5c8ac26617cl, 17530 0xa0bab085c317c6b9l }, 17531 { 0x0bdc183b83664109l,0x6bbba2b468f9dcd9l,0x697a50785814be41l, 17532 0x12a59b183a5e5f98l }, 17533 0 }, 17534 /* 40 << 32 */ 17535 { { 0xbd9802e6c30fa92bl,0x5a70d96d9a552784l,0x9085c4ea3f83169bl, 17536 0xfa9423bb06908228l }, 17537 { 0x2ffebe12fe97a5b9l,0x85da604971b99118l,0x9cbc2f7f63178846l, 17538 0xfd96bc709153218el }, 17539 0 }, 17540 /* 41 << 32 */ 17541 { { 0xb5a85c61bfa70ca6l,0x4edc7f2d4c1f745fl,0x05aea9aa3ded1eb5l, 17542 0x750385efb82e5918l }, 17543 { 0xdcbc53221fdc5164l,0x32a5721f6794184el,0x5c5b2269ff09c90bl, 17544 0x96d009115323ca42l }, 17545 0 }, 17546 /* 43 << 32 */ 17547 { { 0x12c73403f43f1440l,0xc94813eb66cc1f50l,0x04d5957b9b035151l, 17548 0x76011bca4bfaafa8l }, 17549 { 0x56806c13574f1f0al,0x98f63a4697652a62l,0x17c63ef4a3178de9l, 17550 0xf7ce961a65009a52l }, 17551 0 }, 17552 /* 44 << 32 */ 17553 { { 0x58f92aebe4173516l,0xdc37d99275e42d44l,0x76dcec5b4d48e1bal, 17554 0x07e0608e25676448l }, 17555 { 0xa1877bcd1d4af36al,0x38b62b3c5a8ccf0cl,0x60522e88aeab7f75l, 17556 0xbef213ed5e03547al }, 17557 0 }, 17558 /* 45 << 32 */ 17559 { { 0x8acd5ba4e6ed0282l,0x792328f06a04531dl,0xe95de8aa80297e50l, 17560 0x79d33ce07d60e05cl }, 17561 { 0xcb84646dd827d602l,0xd3421521302a608cl,0x867970a4524f9751l, 17562 0x05e2f7e347a75734l }, 17563 0 }, 17564 /* 46 << 32 */ 17565 { { 0x64e4de4a01c66263l,0xbcfe16a4d0033d4cl,0x359e23d4817de1dcl, 17566 0xb01e812ec259449cl }, 17567 { 0x90c9ade2df53499fl,0xabbeaa27288c6862l,0x5a655db4cd1b896fl, 17568 0x416f10a5a022a3d6l }, 17569 0 }, 17570 /* 47 << 32 */ 17571 { { 0x0d17e1ef98601fd5l,0x9a3f85e0eab76a6fl,0x0b9eaed1510b80a1l, 17572 0x3282fd747ec30422l }, 17573 { 0xaca5815a70a4a402l,0xfad3121cf2439cb2l,0xba251af81fccabd6l, 17574 0xb382843fa5c127d5l }, 17575 0 }, 17576 /* 48 << 32 */ 17577 { { 0x958381db1782269bl,0xae34bf792597e550l,0xbb5c60645f385153l, 17578 0x6f0e96afe3088048l }, 17579 { 0xbf6a021577884456l,0xb3b5688c69310ea7l,0x17c9429504fad2del, 17580 0xe020f0e517896d4dl }, 17581 0 }, 17582 /* 49 << 32 */ 17583 { { 0x442fdfe920cd1ebel,0xa8317dfa6a250d62l,0x5214576d082d5a2dl, 17584 0xc1a5d31930803c33l }, 17585 { 0x33eee5b25e4a2cd0l,0x7df181b3b4db8011l,0x249285145b5c6b0bl, 17586 0x464c1c5828bf8837l }, 17587 0 }, 17588 /* 51 << 32 */ 17589 { { 0x5464da65d55babd1l,0x50eaad2a0048d80fl,0x782ca3dd2b9bce90l, 17590 0x41107164ab526844l }, 17591 { 0xad3f0602d56e0a5fl,0xc1f0248018455114l,0xe05d8dcab1527931l, 17592 0x87818cf5bb1295d7l }, 17593 0 }, 17594 /* 52 << 32 */ 17595 { { 0x95aeb5bd483e333al,0x003af31effeaededl,0xfc5532e87efb1e4fl, 17596 0xb37e0fb52dfa24a5l }, 17597 { 0x485d4cecdc140b08l,0xb81a0d23983bd787l,0xd19928dae8d489fdl, 17598 0x3fa0312c177b9dbdl }, 17599 0 }, 17600 /* 53 << 32 */ 17601 { { 0xade391470c6d7e88l,0x4fd1e8cd47072c45l,0x145760fed5a65c56l, 17602 0x198960c7be4887del }, 17603 { 0xfe7974a82640257al,0xf838a19b774febefl,0xb2aecad11b6e988el, 17604 0x643f44fa448e4a8fl }, 17605 0 }, 17606 /* 55 << 32 */ 17607 { { 0xc35ceffdee756e71l,0x2c1364d88ea932c4l,0xbd594d8d837d2d9fl, 17608 0x5b334bdac9d74d48l }, 17609 { 0x72dc3e03b8fac08bl,0x38f01de006fdf70fl,0x4bde74b31d298ba4l, 17610 0x2598d183ad5f42a9l }, 17611 0 }, 17612 /* 57 << 32 */ 17613 { { 0x02c6ba15f62befa2l,0x6399ceb55c8ccee9l,0x3638bd6e08d3473el, 17614 0xb8f1f13d2f8f4a9cl }, 17615 { 0x50d7560655827a74l,0x8d6e65f33fb4f32cl,0x40a5d21189ee621al, 17616 0x6d3f9e11c4474716l }, 17617 0 }, 17618 /* 59 << 32 */ 17619 { { 0xcb633a4ce9b2bb8fl,0x0475703f8c529253l,0x61e007b5a8878873l, 17620 0x342d77ba14504159l }, 17621 { 0x2925175c313578dfl,0x4e631897b6b097f1l,0xe64d138929350e41l, 17622 0x2fb20608ec7adccdl }, 17623 0 }, 17624 /* 60 << 32 */ 17625 { { 0xa560c234d5c0f5d1l,0x74f84bf62bdef0efl,0x61ed00005cbd3d0bl, 17626 0xc74262d087fb408bl }, 17627 { 0xad30a6496cc64128l,0x708e3a31a4a8b154l,0xaf21ce2637f82074l, 17628 0x31d33b38204c9a74l }, 17629 0 }, 17630 /* 61 << 32 */ 17631 { { 0x8f609fe04cc2f575l,0xe44f9784b35488c4l,0x0d464bb6180fa375l, 17632 0x4f44d5d2de2247b8l }, 17633 { 0xf538eb38141ef077l,0x781f8f6e8fa456a4l,0x67e9a46429b4f39dl, 17634 0x245d21e8b704c3e9l }, 17635 0 }, 17636 /* 63 << 32 */ 17637 { { 0x45a94ee858ffa7cdl,0x4d38bc6818053549l,0x0b4bc65a499d79f3l, 17638 0xa81e3ab09159cab7l }, 17639 { 0xf13716efb47898cel,0xb7ee597c2e2d9044l,0x09396b90e6158276l, 17640 0x5c644dc36a533fcel }, 17641 0 }, 17642 /* 64 << 32 */ 17643 { { 0xcca4428dbbe5a1a9l,0x8187fd5f3126bd67l,0x0036973a48105826l, 17644 0xa39b6663b8bd61a0l }, 17645 { 0x6d42deef2d65a808l,0x4969044f94636b19l,0xf611ee47dd5d564cl, 17646 0x7b2f3a49d2873077l }, 17647 0 }, 17648 /* 65 << 32 */ 17649 { { 0xbe4c16c3bf429668l,0xd32f56f0ef35db3bl,0xae8355de9ea4e3f1l, 17650 0x8f66c4a2a450944el }, 17651 { 0xafab94c8b798fbe2l,0x18c57baff7f3d5cfl,0x692d191c5cfa5c7dl, 17652 0xc0c25f69a689daebl }, 17653 0 }, 17654 /* 71 << 32 */ 17655 { { 0x15fb3ae398340d4cl,0xa8b9233a7de82134l,0x44971a545fc0dbc6l, 17656 0xb2b4f0f3a1d3f094l }, 17657 { 0x8d9eaba1b6242bd4l,0xd8aad777787cc557l,0xb1ab8b7870d1a2bbl, 17658 0x5d20f48cead3bfe3l }, 17659 0 }, 17660 /* 77 << 32 */ 17661 { { 0x4dacbf09a2bf9772l,0x969a4c4357aa8457l,0xadbe673b273ebfc5l, 17662 0xb85582bb927778c9l }, 17663 { 0x748371855c03752cl,0xc337bc6bc2f60d11l,0x2c3838e4ad456a09l, 17664 0xaf479c897e381842l }, 17665 0 }, 17666 /* 83 << 32 */ 17667 { { 0x8530ae751b1aea77l,0xf43b923ba8310cb9l,0x9c1a60c6bf4dd6c5l, 17668 0x11885b863e3aaaa5l }, 17669 { 0x594a8fa90f69821el,0x1eece3d66bc37998l,0x1fd718f518df32bfl, 17670 0x1c00c7d461d84082l }, 17671 0 }, 17672 /* 89 << 32 */ 17673 { { 0xd67ee3a4c763c3cfl,0x760b128305969234l,0x1a5ff331ec17f2d1l, 17674 0x25f0392a84fecfefl }, 17675 { 0xb1bc004a3a80d47el,0xf450bf08182fee3bl,0xf11117681e19751el, 17676 0x5b4127dae28ed23fl }, 17677 0 }, 17678 /* 95 << 32 */ 17679 { { 0x91e00defdaf08f09l,0x7ef41724f4738a07l,0x990fbbceaf1263fcl, 17680 0x779121e3e6eeb5aal }, 17681 { 0x3e162c7a5a3ecf52l,0x73ae568a51be5faal,0x8bea1bfa451be8a9l, 17682 0x3e8cd5db90e11097l }, 17683 0 }, 17684 /* 101 << 32 */ 17685 { { 0x90390f7224d27159l,0x685c139efd07e5d4l,0x4e21e44a3bc234a8l, 17686 0x61b50f34eeb14dacl }, 17687 { 0x7beb0aa087555d58l,0x781326bcc806f0d2l,0xc289537a1eb7199fl, 17688 0x44a31a037b42766el }, 17689 0 }, 17690 /* 107 << 32 */ 17691 { { 0x7d778206edde4b40l,0x34539fa18eb92fcdl,0x5a0bdd79bf52a552l, 17692 0x066d3672fdcca75el }, 17693 { 0xd73fa893e28b5a5bl,0xb495135876c38698l,0x44469b0114ae16cfl, 17694 0xb428c763691d6618l }, 17695 0 }, 17696 /* 113 << 32 */ 17697 { { 0x9022db8b69196353l,0x152ebb7dd7a4afd0l,0xea36fae57fcf1765l, 17698 0xa8fc00ba0decea8al }, 17699 { 0x1047206a0c0b0414l,0x6607d8ade076df28l,0xf343e19966b8aba1l, 17700 0x7f03c1ad311e208dl }, 17701 0 }, 17702 /* 116 << 32 */ 17703 { { 0xe6b4c96e888f3870l,0xa21bb618fe544042l,0x7122ee88bd817699l, 17704 0xcb38ecebfa66e173l }, 17705 { 0x6ed5b3482c9cc05fl,0x591affc84ae0fd9el,0x7cf325ac6e7aaac0l, 17706 0x2397c053d05e5be0l }, 17707 0 }, 17708 /* 119 << 32 */ 17709 { { 0x95363f61eaa96552l,0xe03bc6b38fb15b73l,0xa5c5808f2c389053l, 17710 0xcd021e6c11b2030cl }, 17711 { 0x349ca9bdc038e30al,0x0a3368d4165afa2cl,0x043630debbfa1cc6l, 17712 0xb8c4456ba7cdbf69l }, 17713 0 }, 17714 /* 125 << 32 */ 17715 { { 0x63aa3315fd7d2983l,0xaf4c96afa6a04bedl,0x3a5c0b5410814a74l, 17716 0x9906f5e30f9b0770l }, 17717 { 0x622be6523676986fl,0x09ac5bc0173e7cb5l,0x1c40e56a502c8b3cl, 17718 0xabb9a0f7253ce8f6l }, 17719 0 }, 17720 }, 17721 { 17722 /* 0 << 40 */ 17723 { { 0x00, 0x00, 0x00, 0x00 }, 17724 { 0x00, 0x00, 0x00, 0x00 }, 17725 1 }, 17726 /* 1 << 40 */ 17727 { { 0x889f6d65533ef217l,0x7158c7e4c3ca2e87l,0xfb670dfbdc2b4167l, 17728 0x75910a01844c257fl }, 17729 { 0xf336bf07cf88577dl,0x22245250e45e2acel,0x2ed92e8d7ca23d85l, 17730 0x29f8be4c2b812f58l }, 17731 0 }, 17732 /* 3 << 40 */ 17733 { { 0xc51e414351facc61l,0xbaf2647de68a25bcl,0x8f5271a00ff872edl, 17734 0x8f32ef993d2d9659l }, 17735 { 0xca12488c7593cbd4l,0xed266c5d02b82fabl,0x0a2f78ad14eb3f16l, 17736 0xc34049484d47afe3l }, 17737 0 }, 17738 /* 4 << 40 */ 17739 { { 0xa6f3d574c005979dl,0xc2072b426a40e350l,0xfca5c1568de2ecf9l, 17740 0xa8c8bf5ba515344el }, 17741 { 0x97aee555114df14al,0xd4374a4dfdc5ec6bl,0x754cc28f2ca85418l, 17742 0x71cb9e27d3c41f78l }, 17743 0 }, 17744 /* 5 << 40 */ 17745 { { 0x09c1670209470496l,0xa489a5edebd23815l,0xc4dde4648edd4398l, 17746 0x3ca7b94a80111696l }, 17747 { 0x3c385d682ad636a4l,0x6702702508dc5f1el,0x0c1965deafa21943l, 17748 0x18666e16610be69el }, 17749 0 }, 17750 /* 7 << 40 */ 17751 { { 0x45beb4ca2a604b3bl,0x56f651843a616762l,0xf52f5a70978b806el, 17752 0x7aa3978711dc4480l }, 17753 { 0xe13fac2a0e01fabcl,0x7c6ee8a5237d99f9l,0x251384ee05211ffel, 17754 0x4ff6976d1bc9d3ebl }, 17755 0 }, 17756 /* 9 << 40 */ 17757 { { 0xdde0492316e043a2l,0x98a452611dd3d209l,0xeaf9f61bd431ebe8l, 17758 0x00919f4dbaf56abdl }, 17759 { 0xe42417db6d8774b1l,0x5fc5279c58e0e309l,0x64aa40613adf81eal, 17760 0xef419edabc627c7fl }, 17761 0 }, 17762 /* 10 << 40 */ 17763 { { 0x3919759239ef620fl,0x9d47284074fa29c4l,0x4e428fa39d416d83l, 17764 0xd1a7c25129f30269l }, 17765 { 0x46076e1cd746218fl,0xf3ad6ee8110d967el,0xfbb5f434a00ae61fl, 17766 0x3cd2c01980d4c929l }, 17767 0 }, 17768 /* 11 << 40 */ 17769 { { 0xfa24d0537a4af00fl,0x3f938926ca294614l,0x0d700c183982182el, 17770 0x801334434cc59947l }, 17771 { 0xf0397106ec87c925l,0x62bd59fc0ed6665cl,0xe8414348c7cca8b5l, 17772 0x574c76209f9f0a30l }, 17773 0 }, 17774 /* 13 << 40 */ 17775 { { 0x95be42e2bb8b6a07l,0x64be74eeca23f86al,0xa73d74fd154ce470l, 17776 0x1c2d2857d8dc076al }, 17777 { 0xb1fa1c575a887868l,0x38df8e0b3de64818l,0xd88e52f9c34e8967l, 17778 0x274b4f018b4cc76cl }, 17779 0 }, 17780 /* 15 << 40 */ 17781 { { 0x3f5c05b4f8b7559dl,0x0be4c7acfae29200l,0xdd6d3ef756532accl, 17782 0xf6c3ed87eea7a285l }, 17783 { 0xe463b0a8f46ec59bl,0x531d9b14ecea6c83l,0x3d6bdbafc2dc836bl, 17784 0x3ee501e92ab27f0bl }, 17785 0 }, 17786 /* 16 << 40 */ 17787 { { 0x8df275455922ac1cl,0xa7b3ef5ca52b3f63l,0x8e77b21471de57c4l, 17788 0x31682c10834c008bl }, 17789 { 0xc76824f04bd55d31l,0xb6d1c08617b61c71l,0x31db0903c2a5089dl, 17790 0x9c092172184e5d3fl }, 17791 0 }, 17792 /* 17 << 40 */ 17793 { { 0x7b1a921ea6b3340bl,0x6d7c4d7d7438a53el,0x2b9ef73c5bf71d8fl, 17794 0xb5f6e0182b167a7cl }, 17795 { 0x5ada98ab0ce536a3l,0xee0f16f9e1fea850l,0xf6424e9d74f1c0c5l, 17796 0x4d00de0cd3d10b41l }, 17797 0 }, 17798 /* 19 << 40 */ 17799 { { 0xd542f522a6533610l,0xfdde15a734ec439al,0x696560fedc87dd0dl, 17800 0x69eab421e01fd05fl }, 17801 { 0xca4febdc95cc5988l,0x839be396c44d92fbl,0x7bedff6daffe543bl, 17802 0xd2bb97296f6da43al }, 17803 0 }, 17804 /* 21 << 40 */ 17805 { { 0x5bc6dea80b8d0077l,0xb2adf5d1ea9c49efl,0x7104c20eaafe8659l, 17806 0x1e3604f37866ee7el }, 17807 { 0x0cfc7e7b3075c8c5l,0x5281d9bb639c5a2bl,0xcbdf42494bc44ee3l, 17808 0x835ab066655e9209l }, 17809 0 }, 17810 /* 23 << 40 */ 17811 { { 0x78fbda4b90b94ffal,0x447e52eb7beb993cl,0x920011bc92620d15l, 17812 0x7bad6ecf481fd396l }, 17813 { 0xad3bd28ba989a09el,0x20491784a3e62b78l,0xcdcd7096b07bd9efl, 17814 0x9bf5bb7337d780adl }, 17815 0 }, 17816 /* 25 << 40 */ 17817 { { 0xbe911a71a976c8d4l,0xba0346743fdd778el,0x2359e7434cf87ea1l, 17818 0x8dccf65f07ebb691l }, 17819 { 0x6c2c18eb09746d87l,0x6a19945fd2ecc8fal,0xc67121ff2ffa0339l, 17820 0x408c95ba9bd9fc31l }, 17821 0 }, 17822 /* 27 << 40 */ 17823 { { 0xa317204bcaa5da39l,0xd390df7468bf53d7l,0x56de18b2dbd71c0dl, 17824 0xcb4d3bee75184779l }, 17825 { 0x815a219499d920a5l,0x9e10fb4ecf3d3a64l,0x7fd4901dfe92e1eel, 17826 0x5d86d10d3ab87b2el }, 17827 0 }, 17828 /* 28 << 40 */ 17829 { { 0x24f2a692840bb336l,0x7c353bdca669fa7bl,0xda20d6fcdec9c300l, 17830 0x625fbe2fa13a4f17l }, 17831 { 0xa2b1b61adbc17328l,0x008965bfa9515621l,0x49690939c620ff46l, 17832 0x182dd27d8717e91cl }, 17833 0 }, 17834 /* 29 << 40 */ 17835 { { 0x98e9136c878303e4l,0x2769e74fd1e65efdl,0x6154c545809da56el, 17836 0x8c5d50a04301638cl }, 17837 { 0x10f3d2068214b763l,0x2da9a2fc44df0644l,0xca912bab588a6fcdl, 17838 0xe9e82d9b227e1932l }, 17839 0 }, 17840 /* 31 << 40 */ 17841 { { 0xcbdc4d66d080e55bl,0xad3f11e5b8f98d6bl,0x31bea68e18a32480l, 17842 0xdf1c6fd52c1bcf6el }, 17843 { 0xadcda7ee118a3f39l,0xbd02f857ac060d5fl,0xd2d0265d86631997l, 17844 0xb866a7d33818f2d4l }, 17845 0 }, 17846 /* 33 << 40 */ 17847 { { 0xfbcce2d31892d98dl,0x2e34bc9507de73dcl,0x3a48d1a94891eec1l, 17848 0xe64499c24d31060bl }, 17849 { 0xe9674b7149745520l,0xf126ccaca6594a2cl,0x33e5c1a079945342l, 17850 0x02aa0629066e061fl }, 17851 0 }, 17852 /* 34 << 40 */ 17853 { { 0xdfd7c0ae7af3191el,0x923ec111d68c70d9l,0xb6f1380bb675f013l, 17854 0x9192a224f23d45bal }, 17855 { 0xbe7890f9524891e3l,0x45b24c47eba996bbl,0x59331e48320447e9l, 17856 0x0e4d8753ac9afad4l }, 17857 0 }, 17858 /* 35 << 40 */ 17859 { { 0x49e49c38c9f5a6c3l,0x3f5eea44d8ee2a65l,0x02bf3e761c74bbb4l, 17860 0x50d291cdef565571l }, 17861 { 0xf4edc290a36dd5fal,0x3015df9556dd6b85l,0x4494926aa5549a16l, 17862 0x5de6c59390399e4al }, 17863 0 }, 17864 /* 36 << 40 */ 17865 { { 0x29be11c6ce800998l,0x72bb1752b90360d9l,0x2c1931975a4ad590l, 17866 0x2ba2f5489fc1dbc0l }, 17867 { 0x7fe4eebbe490ebe0l,0x12a0a4cd7fae11c0l,0x7197cf81e903ba37l, 17868 0xcf7d4aa8de1c6dd8l }, 17869 0 }, 17870 /* 37 << 40 */ 17871 { { 0x961fa6317e249e7bl,0x5c4f707796caed50l,0x6b176e62d7e50885l, 17872 0x4dd5de72f390cbecl }, 17873 { 0x91fa29954b2bd762l,0x80427e6395b8dadel,0xd565bf1de2c34743l, 17874 0x911da39d16e6c841l }, 17875 0 }, 17876 /* 39 << 40 */ 17877 { { 0x48365465802ff016l,0x6d2a561f71beece6l,0xdd299ce6f9707052l, 17878 0x62a32698a23407bbl }, 17879 { 0x1d55bdb147004afbl,0xfadec124369b1084l,0x1ce78adf291c89f7l, 17880 0x9f2eaf03278bc529l }, 17881 0 }, 17882 /* 40 << 40 */ 17883 { { 0x92af6bf43fd5684cl,0x2b26eecf80360aa1l,0xbd960f3000546a82l, 17884 0x407b3c43f59ad8fel }, 17885 { 0x86cae5fe249c82bal,0x9e0faec72463744cl,0x87f551e894916272l, 17886 0x033f93446ceb0615l }, 17887 0 }, 17888 /* 41 << 40 */ 17889 { { 0x04658ad212dba0cel,0x9e600624068822f0l,0x84661f11b26d368bl, 17890 0xbca867d894ebb87al }, 17891 { 0x79506dc42f1bad89l,0x1a8322d3ebcbe7a1l,0xb4f1e102ac197178l, 17892 0x29a950b779f7198cl }, 17893 0 }, 17894 /* 43 << 40 */ 17895 { { 0x19a6fb0984a3d1d5l,0x6c75c3a2ba5f5307l,0x7983485bf9698447l, 17896 0x689f41b88b1cdc1el }, 17897 { 0x18f6fbd74c1979d0l,0x3e6be9a27a0b6708l,0x06acb615f63d5a8al, 17898 0x8a817c098d0f64b1l }, 17899 0 }, 17900 /* 44 << 40 */ 17901 { { 0x1e5eb0d18be82e84l,0x89967f0e7a582fefl,0xbcf687d5a6e921fal, 17902 0xdfee4cf3d37a09bal }, 17903 { 0x94f06965b493c465l,0x638b9a1c7635c030l,0x7666786466f05e9fl, 17904 0xccaf6808c04da725l }, 17905 0 }, 17906 /* 45 << 40 */ 17907 { { 0xa9b3479b1b53a173l,0xc041eda3392eddc0l,0xdb8f804755edd7eel, 17908 0xaf1f7a37ab60683cl }, 17909 { 0x9318603a72c0accbl,0xab1bb9fe401cbf3cl,0xc40e991e88afe245l, 17910 0x9298a4580d06ac35l }, 17911 0 }, 17912 /* 46 << 40 */ 17913 { { 0x58e127d5036c2fe7l,0x5fe5020555b93361l,0xc1373d850f74a045l, 17914 0x28cd79dbe8228e4bl }, 17915 { 0x0ae82320c2018d9al,0xf6d0049c78f8016al,0x381b6fe2149b31fbl, 17916 0x33a0e8adec3cfbcfl }, 17917 0 }, 17918 /* 47 << 40 */ 17919 { { 0x23a6612e9eab5da7l,0xb645fe29d94d6431l,0xe3d74594ca1210c4l, 17920 0xdc1376bceeca0674l }, 17921 { 0xfd40dfef657f0154l,0x7952a548d52cbac5l,0x0ee189583685ad28l, 17922 0xd13639409ba9ca46l }, 17923 0 }, 17924 /* 48 << 40 */ 17925 { { 0xca2eb690768fccfcl,0xf402d37db835b362l,0x0efac0d0e2fdfccel, 17926 0xefc9cdefb638d990l }, 17927 { 0x2af12b72d1669a8bl,0x33c536bc5774ccbdl,0x30b21909fb34870el, 17928 0xc38fa2f77df25acal }, 17929 0 }, 17930 /* 49 << 40 */ 17931 { { 0x1337902f1c982cd6l,0x222e08fe14ec53eal,0x6c8abd0d330ef3e5l, 17932 0xeb59e01531f6fd9dl }, 17933 { 0xd74ae554a8532df4l,0xbc010db1ab44c83el,0xe98016561b8f9285l, 17934 0x65a9612783acc546l }, 17935 0 }, 17936 /* 51 << 40 */ 17937 { { 0x36a8b0a76770cfb1l,0x3338d52f9bb578fcl,0x5136c785f5ed12a4l, 17938 0x652d47ed87bf129el }, 17939 { 0x9c6c827e6067c2d0l,0x61fc2f410345533al,0x2d7fb182130cea19l, 17940 0x71a0186330b3ef85l }, 17941 0 }, 17942 /* 52 << 40 */ 17943 { { 0x74c5f02bbf81f3f5l,0x0525a5aeaf7e4581l,0x88d2aaba433c54ael, 17944 0xed9775db806a56c5l }, 17945 { 0xd320738ac0edb37dl,0x25fdb6ee66cc1f51l,0xac661d1710600d76l, 17946 0x931ec1f3bdd1ed76l }, 17947 0 }, 17948 /* 53 << 40 */ 17949 { { 0xb81e239161faa569l,0xb379f759bb40eebfl,0x9f2fd1b2a2c54549l, 17950 0x0a968f4b0d6ba0ael }, 17951 { 0xaa869e6eedfe8c75l,0x0e36b298645ab173l,0x5a76282b0bcdefd7l, 17952 0x9e949331d05293f2l }, 17953 0 }, 17954 /* 55 << 40 */ 17955 { { 0xc1cfa9a1c59fac6el,0x2648bffcb72747cel,0x5f8a39805f2e2637l, 17956 0x8bd3a8eb73e65758l }, 17957 { 0xd9c43f1df14381a7l,0xecc1c3b0d6a86c10l,0xffcf4fa8a4a6dc74l, 17958 0x7304fa834cea0a46l }, 17959 0 }, 17960 /* 57 << 40 */ 17961 { { 0x4460760c34dca952l,0xeac9cf2444c70444l,0xb879297b8493c87el, 17962 0x295941a54b2dccb7l }, 17963 { 0x1e5cecede58721cdl,0xc8b58db74ca0d12bl,0x1927965c6da1d034l, 17964 0x7220b02839ed1369l }, 17965 0 }, 17966 /* 59 << 40 */ 17967 { { 0xc38746c83c2e34b6l,0x9f27362e38a51042l,0x26febec02067afebl, 17968 0xd9c4e15544e7371fl }, 17969 { 0x6035f469f92930d1l,0xe6ed7c08b4431b8bl,0xa25bf5903e16410dl, 17970 0x147d83368adf4c18l }, 17971 0 }, 17972 /* 60 << 40 */ 17973 { { 0x7f01c9ecaa80ba59l,0x3083411a68538e51l,0x970370f1e88128afl, 17974 0x625cc3db91dec14bl }, 17975 { 0xfef9666c01ac3107l,0xb2a8d577d5057ac3l,0xb0f2629992be5df7l, 17976 0xf579c8e500353924l }, 17977 0 }, 17978 /* 61 << 40 */ 17979 { { 0xbd9398d6ca02669fl,0x896e053bf9ad11a1l,0xe024b699a3556f9fl, 17980 0x23b4b96ad53cbca3l }, 17981 { 0x549d2d6c89733dd6l,0x3dae193f394f3179l,0x8bf7ec1cdfeda825l, 17982 0xf6a1db7a8a4844b4l }, 17983 0 }, 17984 /* 63 << 40 */ 17985 { { 0x3b5403d56437a027l,0xda32bbd233ed30aal,0xd2ad3baa906de0cal, 17986 0x3b6df514533f736el }, 17987 { 0x986f1cab5df9b9c4l,0x41cd2088970d330el,0xaae7c2238c20a923l, 17988 0x52760a6e1e951dc0l }, 17989 0 }, 17990 /* 64 << 40 */ 17991 { { 0xb8fa3d931341ed7al,0x4223272ca7b59d49l,0x3dcb194783b8c4a4l, 17992 0x4e413c01ed1302e4l }, 17993 { 0x6d999127e17e44cel,0xee86bf7533b3adfbl,0xf6902fe625aa96cal, 17994 0xb73540e4e5aae47dl }, 17995 0 }, 17996 /* 65 << 40 */ 17997 { { 0x55318a525e34036cl,0xc3acafaaf9884e3fl,0xe5ba15cea042ba04l, 17998 0x56a1d8960ada550el }, 17999 { 0xa5198cae87b76764l,0xd079d1f0b6fd84fbl,0xb22b637bcbe363edl, 18000 0xbe8ab7d64499deaal }, 18001 0 }, 18002 /* 71 << 40 */ 18003 { { 0xbe8eba5eb4925f25l,0x00f8bf582e3159d6l,0xb1aa24fa18856070l, 18004 0x22ea8b74e4c30b22l }, 18005 { 0x512f633e55bbe4e8l,0x82ba62318678aee9l,0xea05da90fdf72b7el, 18006 0x616b9bc7a4fc65eel }, 18007 0 }, 18008 /* 77 << 40 */ 18009 { { 0xe31ee3b3b7c221e7l,0x10353824e353fa43l,0x9d2f3df69dd2a86fl, 18010 0x8a12ab9322ccffecl }, 18011 { 0x25c8e326d666f9e5l,0x33ea98a0598da7fbl,0x2fc1de0917f74e17l, 18012 0x0d0b6c7a35efb211l }, 18013 0 }, 18014 /* 83 << 40 */ 18015 { { 0x22a82c6c804e6ecel,0x824a170b1d8fce9el,0x621802becee65ed0l, 18016 0x4a4e9e7895ec4285l }, 18017 { 0x8da0988fa8940b7al,0xaff89c5b86445aa5l,0x386fdbdad689cde9l, 18018 0x3aeaae7d9f5caaccl }, 18019 0 }, 18020 /* 89 << 40 */ 18021 { { 0xe9cb9e68a7b62f4cl,0x515cae0ec3b7092el,0xb8abec354b491f52l, 18022 0x672673fd01eeabc1l }, 18023 { 0x65e5739f7ad6e8a1l,0xc2da8e003d91b2f9l,0xcc43229cced84319l, 18024 0x0f8cbf9574ccf2d1l }, 18025 0 }, 18026 /* 95 << 40 */ 18027 { { 0xb03d1cfb1b2f872al,0x88aef4670872b6f7l,0xaafe55e48ea9170cl, 18028 0xd5cc4875f24aa689l }, 18029 { 0x7e5732908458ce84l,0xef4e143d58bfc16dl,0xc58626efaa222836l, 18030 0x01c60ec0ca5e0cb8l }, 18031 0 }, 18032 /* 101 << 40 */ 18033 { { 0x123901aa36337c09l,0x1697acadd2f5e675l,0xc0a1ddd022fe2bael, 18034 0xf68ea88cff0210ddl }, 18035 { 0x665d11e014168709l,0x912a575f45f25321l,0x7e7ed38070c78934l, 18036 0x663d692cb0a46322l }, 18037 0 }, 18038 /* 107 << 40 */ 18039 { { 0x912ab8bd8642cba4l,0x97fab1a3b6b50b73l,0x76666b3cb86ef354l, 18040 0x16d41330fa5ecce9l }, 18041 { 0x77c7c138c7da404bl,0xc6508cb78c983fb0l,0xe5881733f9004984l, 18042 0x76dea7794182c7abl }, 18043 0 }, 18044 /* 113 << 40 */ 18045 { { 0x16db18583556b765l,0x39c18c200263755al,0x7b6691f591c15201l, 18046 0x4e4c17b168514ea9l }, 18047 { 0xacbe449e06f5f20al,0xeb9119d2541ddfb6l,0x2f6e687bf2eac86fl, 18048 0xb161471ec14ac508l }, 18049 0 }, 18050 /* 116 << 40 */ 18051 { { 0x58846d32c4744733l,0x40517c71379f9e34l,0x2f65655f130ef6cal, 18052 0x526e4488f1f3503fl }, 18053 { 0x8467bd177ee4a976l,0x1d9dc913921363d1l,0xd8d24c33b069e041l, 18054 0x5eb5da0a2cdf7f51l }, 18055 0 }, 18056 /* 119 << 40 */ 18057 { { 0x81c2cc32951ab3e7l,0xc86d9a109b0c7e87l,0x0b7a18bd606ef408l, 18058 0x099b5bbfe6c2251el }, 18059 { 0x46d627d0bfce880fl,0xbfaddcbbe1c6865al,0xa9ab6183d2bb9a00l, 18060 0x23cb9a2720ad9789l }, 18061 0 }, 18062 /* 125 << 40 */ 18063 { { 0x1592d0630c25fbebl,0x13869ec24995a3fal,0x6413f494861d0a73l, 18064 0xa3b782342f9f1b89l }, 18065 { 0x113689e2b6cad351l,0x53be2014a873dcc1l,0xccf405e0c6bb1be7l, 18066 0x4fff7b4ca9061ca9l }, 18067 0 }, 18068 }, 18069 { 18070 /* 0 << 48 */ 18071 { { 0x00, 0x00, 0x00, 0x00 }, 18072 { 0x00, 0x00, 0x00, 0x00 }, 18073 1 }, 18074 /* 1 << 48 */ 18075 { { 0xcc7a64880a750c0fl,0x39bacfe34e548e83l,0x3d418c760c110f05l, 18076 0x3e4daa4cb1f11588l }, 18077 { 0x2733e7b55ffc69ffl,0x46f147bc92053127l,0x885b2434d722df94l, 18078 0x6a444f65e6fc6b7cl }, 18079 0 }, 18080 /* 3 << 48 */ 18081 { { 0x6d0b16f4bdaedfbdl,0x23fd326086746cedl,0x8bfb1d2fff4b3e17l, 18082 0xc7f2ec2d019c14c8l }, 18083 { 0x3e0832f245104b0dl,0x5f00dafbadea2b7el,0x29e5cf6699fbfb0fl, 18084 0x264f972361827cdal }, 18085 0 }, 18086 /* 4 << 48 */ 18087 { { 0x97b14f7ea90567e6l,0x513257b7b6ae5cb7l,0x85454a3c9f10903dl, 18088 0xd8d2c9ad69bc3724l }, 18089 { 0x38da93246b29cb44l,0xb540a21d77c8cbacl,0x9bbfe43501918e42l, 18090 0xfffa707a56c3614el }, 18091 0 }, 18092 /* 5 << 48 */ 18093 { { 0x6eb1a2f3e30bc27fl,0xe5f0c05ab0836511l,0x4d741bbf4965ab0el, 18094 0xfeec41ca83464bbdl }, 18095 { 0x1aca705f99d0b09fl,0xc5d6cc56f42da5fal,0x49964eddcc52b931l, 18096 0x8ae59615c884d8d8l }, 18097 0 }, 18098 /* 7 << 48 */ 18099 { { 0xf634b57b39f8868al,0xe27f4fd475cc69afl,0xa47e58cbd0d5496el, 18100 0x8a26793fd323e07fl }, 18101 { 0xc61a9b72fa30f349l,0x94c9d9c9b696d134l,0x792beca85880a6d1l, 18102 0xbdcc4645af039995l }, 18103 0 }, 18104 /* 9 << 48 */ 18105 { { 0xce7ef8e58c796c3cl,0x9adaae84dd66e57al,0x784ae13e45227f33l, 18106 0xb046c5b82a85e757l }, 18107 { 0xb7aa50aeec37631fl,0xbedc4fca3b300758l,0x0f82567e0ac9700bl, 18108 0x1071d9d44ff5f8d2l }, 18109 0 }, 18110 /* 10 << 48 */ 18111 { { 0x61360ee99e240d18l,0x057cdcacb4b94466l,0xe7667cd12fe5325cl, 18112 0x1fa297b521974e3bl }, 18113 { 0xfa4081e7db083d76l,0x31993be6f206bd15l,0x8949269b14c19f8cl, 18114 0x21468d72a9d92357l }, 18115 0 }, 18116 /* 11 << 48 */ 18117 { { 0xd09ef6c4e51a2811l,0x39f6862bb8fb66b9l,0x64e77f8d22dfaa99l, 18118 0x7b10504461b08aacl }, 18119 { 0x71704e4c4a7df332l,0xd09734342ffe015bl,0xab0eaf4408d3020el, 18120 0x28b1909eed63b97al }, 18121 0 }, 18122 /* 13 << 48 */ 18123 { { 0x2f3fa882cdadcd4fl,0xa4ef68595f631995l,0xe52ca2f9e531766fl, 18124 0x20af5c3057e2c1d3l }, 18125 { 0x1e4828f6e51e94b8l,0xf900a1751a2f5d4fl,0xe831adb3392c58a0l, 18126 0x4c5a90ca1b6e5866l }, 18127 0 }, 18128 /* 15 << 48 */ 18129 { { 0x5f3dcba86182827cl,0xd1a448ddbd7e7252l,0x2d8f96fcf493b815l, 18130 0xba0a4c263b0aa95fl }, 18131 { 0x88a1514063a0007fl,0x9564c25e6a9c5846l,0x5a4d7b0fdc0fcbcal, 18132 0x2275daa33f8a740el }, 18133 0 }, 18134 /* 16 << 48 */ 18135 { { 0x83f49167ceca9754l,0x426d2cf64b7939a0l,0x2555e355723fd0bfl, 18136 0xa96e6d06c4f144e2l }, 18137 { 0x4768a8dd87880e61l,0x15543815e508e4d5l,0x09d7e772b1b65e15l, 18138 0x63439dd6ac302fa0l }, 18139 0 }, 18140 /* 17 << 48 */ 18141 { { 0x159591cc0461086bl,0xb695aa9495e66e51l,0x2d4c946779ded531l, 18142 0xbd2482ba89c2be79l }, 18143 { 0x8ee2658aa20bbf19l,0xc000528a32247917l,0xd924be4affeae845l, 18144 0x51312bebed992c8bl }, 18145 0 }, 18146 /* 19 << 48 */ 18147 { { 0x3a01b958dc752bd9l,0x2babdbc20c215d45l,0xe689d79a131641c1l, 18148 0x48e8f0da80e05ed4l }, 18149 { 0x4b505feb77bb70c4l,0xefbd3e2bb6057ef7l,0x7583e22dce603ca5l, 18150 0xfbe3b1f22c5c70c7l }, 18151 0 }, 18152 /* 21 << 48 */ 18153 { { 0x8ec1ecf029e5e35al,0x2f3168e58645c2b3l,0xe9297362c7f94cb2l, 18154 0x4fbf1466d1c90b39l }, 18155 { 0x3e4f7656920bae2al,0x805d04b9f1beb172l,0x729a7208dbdbd4b4l, 18156 0x1aade45687aeca53l }, 18157 0 }, 18158 /* 23 << 48 */ 18159 { { 0xb0ff1f541934a508l,0x19e1397604bbf31al,0xb2a8e6033717a6b4l, 18160 0xd601e45d0ef12cb9l }, 18161 { 0x563f0af5b515e98el,0x9b129db633984f9bl,0xe34aba2fa47e4a65l, 18162 0xb56f82d19e3f9d82l }, 18163 0 }, 18164 /* 25 << 48 */ 18165 { { 0x0203effdb1209b86l,0x21f063edb19d6cbfl,0x59f53476980f275bl, 18166 0x202456d7b7ac5e80l }, 18167 { 0xe5a8c05f4900edc9l,0x04c08eb470f01e86l,0xf74ac2241dcd98cel, 18168 0x7e77cc0ce2e830dbl }, 18169 0 }, 18170 /* 27 << 48 */ 18171 { { 0x74e37234a9747edel,0x4fc9fbb1361b1013l,0xe7b533733cf357efl, 18172 0x6aa2dd2c991c4193l }, 18173 { 0x7887e4d2a770917al,0xdd1809b4c20d24cbl,0x004cd7c38e9c2d3el, 18174 0xc77c5baba9970abel }, 18175 0 }, 18176 /* 28 << 48 */ 18177 { { 0x20ac0351d598d710l,0x272c4166cb3a4da4l,0xdb82fe1aca71de1fl, 18178 0x746e79f2d8f54b0fl }, 18179 { 0x6e7fc7364b573e9bl,0x75d03f46fd4b5040l,0x5c1cc36d0b98d87bl, 18180 0x513ba3f11f472da1l }, 18181 0 }, 18182 /* 29 << 48 */ 18183 { { 0x52927eaac3af237fl,0xfaa06065d7398767l,0x042e72b497c6ce0bl, 18184 0xdaed0cc40a9f2361l }, 18185 { 0xddc2e11c2fc1bb4al,0x631da5770c1a9ef8l,0x8a4cfe44680272bfl, 18186 0xc76b9f7262fb5cc3l }, 18187 0 }, 18188 /* 31 << 48 */ 18189 { { 0x248f814538b3aae3l,0xb5345864bc204334l,0x66d6b5bc1d127524l, 18190 0xe312080d14f572d3l }, 18191 { 0x13ed15a716abafebl,0x6f18ce27dba967bel,0x96c9e826ef08552dl, 18192 0x2c191b06be2b63e0l }, 18193 0 }, 18194 /* 33 << 48 */ 18195 { { 0xde4be45dc115ca51l,0xa028cafe934dabd6l,0x7e875663d1c0f8c5l, 18196 0xa8e32ab063d17473l }, 18197 { 0x33f55bd5543199aal,0x79d2c937a2071d6el,0xa6a6758ceff16f28l, 18198 0x9c5f93ef87d85201l }, 18199 0 }, 18200 /* 34 << 48 */ 18201 { { 0x7f2e440381e9ede3l,0x243c3894caf6df0al,0x7c605bb11c073b11l, 18202 0xcd06a541ba6a4a62l }, 18203 { 0x2916894949d4e2e5l,0x33649d074af66880l,0xbfc0c885e9a85035l, 18204 0xb4e52113fc410f4bl }, 18205 0 }, 18206 /* 35 << 48 */ 18207 { { 0xe86f21bc3ad4c81el,0x53b408403a37dcebl,0xaa606087383402cdl, 18208 0xc248caf185452b1dl }, 18209 { 0x38853772576b57cdl,0xe2798e5441b7a6edl,0x7c2f1eed95ef4a33l, 18210 0xccd7e776adb1873cl }, 18211 0 }, 18212 /* 36 << 48 */ 18213 { { 0xdca3b70678a6513bl,0x92ea4a2a9edb1943l,0x02642216db6e2dd8l, 18214 0x9b45d0b49fd57894l }, 18215 { 0x114e70dbc69d11ael,0x1477dd194c57595fl,0xbc2208b4ec77c272l, 18216 0x95c5b4d7db68f59cl }, 18217 0 }, 18218 /* 37 << 48 */ 18219 { { 0xd978bb791c61030al,0xa47325d2218222f3l,0x65ad4d4832e67d97l, 18220 0x31e4ed632e0d162al }, 18221 { 0x7308ea317f76da37l,0xcfdffe87d93f35d8l,0xf4b2d60ee6f96cc4l, 18222 0x8028f3bd0117c421l }, 18223 0 }, 18224 /* 39 << 48 */ 18225 { { 0x7df80cbb9543edb6l,0xa07a54df40b0b3bcl,0xacbd067cc1888488l, 18226 0x61ad61318a00c721l }, 18227 { 0x67e7599ebe2e6fe6l,0x8349d568f7270e06l,0x5630aabc307bc0c7l, 18228 0x97210b3f71af442fl }, 18229 0 }, 18230 /* 40 << 48 */ 18231 { { 0xfe541fa47ea67c77l,0x952bd2afe3ea810cl,0x791fef568d01d374l, 18232 0xa3a1c6210f11336el }, 18233 { 0x5ad0d5a9c7ec6d79l,0xff7038af3225c342l,0x003c6689bc69601bl, 18234 0x25059bc745e8747dl }, 18235 0 }, 18236 /* 41 << 48 */ 18237 { { 0x58bdabb7ef701b5fl,0x64f987aee00c3a96l,0x533b391e2d585679l, 18238 0x30ad79d97a862e03l }, 18239 { 0xd941471e8177b261l,0x33f65cb856a9018el,0x985ce9f607759fc4l, 18240 0x9b085f33aefdbd9el }, 18241 0 }, 18242 /* 43 << 48 */ 18243 { { 0xab2fa51a9c43ee15l,0x457f338263f30575l,0xce8dcd863e75a6e0l, 18244 0x67a03ab86e70421al }, 18245 { 0xe72c37893e174230l,0x45ffff6c066f4816l,0x3a3dd84879a2d4a7l, 18246 0xefa4b7e68b76c24cl }, 18247 0 }, 18248 /* 44 << 48 */ 18249 { { 0x9a75c80676cb2566l,0x8f76acb1b24892d9l,0x7ae7b9cc1f08fe45l, 18250 0x19ef73296a4907d8l }, 18251 { 0x2db4ab715f228bf0l,0xf3cdea39817032d7l,0x0b1f482edcabe3c0l, 18252 0x3baf76b4bb86325cl }, 18253 0 }, 18254 /* 45 << 48 */ 18255 { { 0xd6be8f00e39e056al,0xb58f87a6232fa3bcl,0xd5cb09dc6b18c772l, 18256 0x3177256da8e7e17bl }, 18257 { 0x1877fd34230bf92cl,0x6f9031175a36f632l,0x526a288728e2c9d9l, 18258 0xc373fc94415ec45cl }, 18259 0 }, 18260 /* 46 << 48 */ 18261 { { 0xd49065e010089465l,0x3bab5d298e77c596l,0x7636c3a6193dbd95l, 18262 0xdef5d294b246e499l }, 18263 { 0xb22c58b9286b2475l,0xa0b93939cd80862bl,0x3002c83af0992388l, 18264 0x6de01f9beacbe14cl }, 18265 0 }, 18266 /* 47 << 48 */ 18267 { { 0x70fa6e2a2bf5e373l,0x501691739271694cl,0xd6ebb98c5d2ed9f1l, 18268 0x11fd0b3f225bf92dl }, 18269 { 0x51ffbcea1e3d5520l,0xa7c549875513ad47l,0xe9689750b431d46dl, 18270 0x6e69fecbb620cb9al }, 18271 0 }, 18272 /* 48 << 48 */ 18273 { { 0x6aac688eadd70482l,0x708de92a7b4a4e8al,0x75b6dd73758a6eefl, 18274 0xea4bf352725b3c43l }, 18275 { 0x10041f2c87912868l,0xb1b1be95ef09297al,0x19ae23c5a9f3860al, 18276 0xc4f0f839515dcf4bl }, 18277 0 }, 18278 /* 49 << 48 */ 18279 { { 0xf3c22398e04b5734l,0x4fba59b275f2579dl,0xbf95182d691901b3l, 18280 0x4c139534eb599496l }, 18281 { 0xf3f821de33b77e8bl,0x66e580743785d42fl,0xe3ba3d5abdc89c2dl, 18282 0x7ee988bdd19f37b9l }, 18283 0 }, 18284 /* 51 << 48 */ 18285 { { 0xe9ba62ca2ee53eb0l,0x64295ae23401d7dal,0x70ed8be24e493580l, 18286 0x702caa624502732fl }, 18287 { 0xb1f4e21278d0cedfl,0x130b114bdc97057bl,0x9c5d0bd3c38c77b5l, 18288 0xd9d641e18bad68e7l }, 18289 0 }, 18290 /* 52 << 48 */ 18291 { { 0xc71e27bf8538a5c6l,0x195c63dd89abff17l,0xfd3152851b71e3dal, 18292 0x9cbdfda7fa680fa0l }, 18293 { 0x9db876ca849d7eabl,0xebe2764b3c273271l,0x663357e3f208dceal, 18294 0x8c5bd833565b1b70l }, 18295 0 }, 18296 /* 53 << 48 */ 18297 { { 0x7c2dea1d122aebd4l,0x090bee4a138c1e4dl,0x94a9ffe59e4aca6cl, 18298 0x8f3212ba5d405c7fl }, 18299 { 0x6618185f180b5e85l,0x76298d46f455ab9fl,0x0c804076476b2d88l, 18300 0x45ea9d03d5a40b39l }, 18301 0 }, 18302 /* 55 << 48 */ 18303 { { 0xdf325ac76a2ed772l,0x35da47ccb0da2765l,0x94ce6f460bc9b166l, 18304 0xe0fc82fb5f7f3628l }, 18305 { 0x2b26d588c055f576l,0xb9d37c97ec2bae98l,0xffbbead856908806l, 18306 0xa8c2df87437f4c84l }, 18307 0 }, 18308 /* 57 << 48 */ 18309 { { 0x47d11c3528430994l,0x0183df71cf13d9d3l,0x98604c89aa138fe5l, 18310 0xb1432e1c32c09aa1l }, 18311 { 0xf19bc45d99bd5e34l,0xb198be72108e9b89l,0xee500ae9dacde648l, 18312 0x5936cf98746870a9l }, 18313 0 }, 18314 /* 59 << 48 */ 18315 { { 0x6d8efb98ed1d5a9bl,0x2e0b08e697f778fal,0xda728454dc5e0835l, 18316 0x2c28a45f8e3651c4l }, 18317 { 0x667fab6f7ee77088l,0xd94429c8f29a94b4l,0xd83d594d9deea5b2l, 18318 0x2dc08ccbbea58080l }, 18319 0 }, 18320 /* 60 << 48 */ 18321 { { 0xba5514df3fd165e8l,0x499fd6a9061f8811l,0x72cd1fe0bfef9f00l, 18322 0x120a4bb979ad7e8al }, 18323 { 0xf2ffd0955f4a5ac5l,0xcfd174f195a7a2f0l,0xd42301ba9d17baf1l, 18324 0xd2fa487a77f22089l }, 18325 0 }, 18326 /* 61 << 48 */ 18327 { { 0xfb5f53ba20a9a01el,0x3adb174fd20d6a9cl,0x6db8bb6d80e0f64fl, 18328 0x596e428df6a26f76l }, 18329 { 0xbab1f846e6a4e362l,0x8bdb22af9b1becbdl,0x62b48335f31352adl, 18330 0xd72c26409634f727l }, 18331 0 }, 18332 /* 63 << 48 */ 18333 { { 0xaaa61cb22b1ec1c3l,0x3b5156722cb6f00el,0x67d1be0a8bf83f60l, 18334 0x88f1627aa4b804bcl }, 18335 { 0xc52b11a7cdade2abl,0xa6a8b71a606a4e9dl,0x04e0e6697b900551l, 18336 0x35cfa33c8d5ad0d2l }, 18337 0 }, 18338 /* 64 << 48 */ 18339 { { 0xb93452381d531696l,0x57201c0088cdde69l,0xdde922519a86afc7l, 18340 0xe3043895bd35cea8l }, 18341 { 0x7608c1e18555970dl,0x8267dfa92535935el,0xd4c60a57322ea38bl, 18342 0xe0bf7977804ef8b5l }, 18343 0 }, 18344 /* 65 << 48 */ 18345 { { 0x375ca189b60f0d5al,0xc9458cf949a78362l,0x61c1c5024262c03al, 18346 0x299353db4363d5bel }, 18347 { 0xe3565124dac407fel,0x16ea66cd5b93c532l,0xe5c6aec2749df8e3l, 18348 0x59181317ce3ee4bfl }, 18349 0 }, 18350 /* 71 << 48 */ 18351 { { 0xd46ea34af41c2a3cl,0x9936184916545c98l,0xd7cb800ccf2498b4l, 18352 0xe71d088d9353fe87l }, 18353 { 0x43443cbeae2e172cl,0x77131656ca905cb3l,0x76471fd1dce63594l, 18354 0x346b1d1738f5e264l }, 18355 0 }, 18356 /* 77 << 48 */ 18357 { { 0x22b1e639f6d0a419l,0x8bbb1fad7cea278cl,0xf07f6c01370cc86al, 18358 0x661bd027d39b837fl }, 18359 { 0x042c7a69de606098l,0x93433b154e44eb12l,0x20f44ada88d8bfe8l, 18360 0xb44f66e64ccbfab6l }, 18361 0 }, 18362 /* 83 << 48 */ 18363 { { 0x1cc32158583d9745l,0x9306223cad1c2201l,0x76aa8d0995748039l, 18364 0x29425391707e9b59l }, 18365 { 0x8501c0d4487cdf9el,0xbe08e89c205c5611l,0xa950400b04ccc48bl, 18366 0xb614b69b637e966bl }, 18367 0 }, 18368 /* 89 << 48 */ 18369 { { 0xd9c3c1238ffa5c4bl,0xc65765f7f3593988l,0x9a7e5d2728242119l, 18370 0x0ad27b5097ad7620l }, 18371 { 0x154cc5eb413a8b23l,0xae93d8de7afa8254l,0x9ce5116cab9907b5l, 18372 0x9a163d78063103b9l }, 18373 0 }, 18374 /* 95 << 48 */ 18375 { { 0x5c4c299291086d2al,0x42c6ca9de8e2d951l,0xe67ecf93dd353f30l, 18376 0xba54557fe7167c2el }, 18377 { 0x04a7eb2db734c779l,0x8f345605e300711al,0x4811c1ad67b27de6l, 18378 0xb7ac8e842731d5f0l }, 18379 0 }, 18380 /* 101 << 48 */ 18381 { { 0xee33a1d8e449ac46l,0x2500ba0aaaebfa2dl,0x8fb914ebc424eff4l, 18382 0x3a36545d3989255el }, 18383 { 0xd24f2484761235e6l,0x2fc5d5ddd9b2c04bl,0x73660f86070ab0dbl, 18384 0x2e266d0479d20c7bl }, 18385 0 }, 18386 /* 107 << 48 */ 18387 { { 0x143752d5316d19a3l,0x56a55e01915497b8l,0x44ba4b2609a5fd15l, 18388 0xe4fc3e7fd9bee4eel }, 18389 { 0x6f9d8609878a9f26l,0xdf36b5bd2ede7a20l,0x8e03e712a9a3e435l, 18390 0x4ced555b56546d33l }, 18391 0 }, 18392 /* 113 << 48 */ 18393 { { 0x89a6aaab0882717el,0x56a9736b43fa5153l,0xdb07dcc9d0e1fb1al, 18394 0xe7c986d34145e227l }, 18395 { 0x57be66abb10dad51l,0xa47b964e4aa01ea7l,0xd851d9f36bb837cbl, 18396 0x9851ab3d652e13f7l }, 18397 0 }, 18398 /* 116 << 48 */ 18399 { { 0x22b88a805616ee30l,0xfb09548fe7ab1083l,0x8ad6ab0d511270cdl, 18400 0x61f6c57a6924d9abl }, 18401 { 0xa0f7bf7290aecb08l,0x849f87c90df784a4l,0x27c79c15cfaf1d03l, 18402 0xbbf9f675c463facel }, 18403 0 }, 18404 /* 119 << 48 */ 18405 { { 0x65512fb716dd6ce1l,0xfa76ebc960d53b35l,0x31e5322e19ada3bel, 18406 0x7e259b75d0ccc3cdl }, 18407 { 0xd36d03f0e025fd69l,0xbefab782eea9e5f3l,0x1569969dd09ce6a7l, 18408 0x2df5396178c385b0l }, 18409 0 }, 18410 /* 125 << 48 */ 18411 { { 0x4201652fce0ccac7l,0x12f8e93df1d29d2dl,0x6c2ac9b2220f00c1l, 18412 0x4ee6a685a850baa9l }, 18413 { 0x2c2371f163ee8829l,0xddff16488f464433l,0xeab6cd8869a2c413l, 18414 0xcae34beb85e4c2a8l }, 18415 0 }, 18416 }, 18417 { 18418 /* 0 << 56 */ 18419 { { 0x00, 0x00, 0x00, 0x00 }, 18420 { 0x00, 0x00, 0x00, 0x00 }, 18421 1 }, 18422 /* 1 << 56 */ 18423 { { 0xc7913e91991724f3l,0x5eda799c39cbd686l,0xddb595c763d4fc1el, 18424 0x6b63b80bac4fed54l }, 18425 { 0x6ea0fc697e5fb516l,0x737708bad0f1c964l,0x9628745f11a92ca5l, 18426 0x61f379589a86967al }, 18427 0 }, 18428 /* 3 << 56 */ 18429 { { 0x46a8c4180d738dedl,0x6f1a5bb0e0de5729l,0xf10230b98ba81675l, 18430 0x32c6f30c112b33d4l }, 18431 { 0x7559129dd8fffb62l,0x6a281b47b459bf05l,0x77c1bd3afa3b6776l, 18432 0x0709b3807829973al }, 18433 0 }, 18434 /* 4 << 56 */ 18435 { { 0x8c26b232a3326505l,0x38d69272ee1d41bfl,0x0459453effe32afal, 18436 0xce8143ad7cb3ea87l }, 18437 { 0x932ec1fa7e6ab666l,0x6cd2d23022286264l,0x459a46fe6736f8edl, 18438 0x50bf0d009eca85bbl }, 18439 0 }, 18440 /* 5 << 56 */ 18441 { { 0x0b825852877a21ecl,0x300414a70f537a94l,0x3f1cba4021a9a6a2l, 18442 0x50824eee76943c00l }, 18443 { 0xa0dbfcecf83cba5dl,0xf953814893b4f3c0l,0x6174416248f24dd7l, 18444 0x5322d64de4fb09ddl }, 18445 0 }, 18446 /* 7 << 56 */ 18447 { { 0xa337c447f1f0ced1l,0x800cc7939492dd2bl,0x4b93151dbea08efal, 18448 0x820cf3f8de0a741el }, 18449 { 0xff1982dc1c0f7d13l,0xef92196084dde6cal,0x1ad7d97245f96ee3l, 18450 0x319c8dbe29dea0c7l }, 18451 0 }, 18452 /* 9 << 56 */ 18453 { { 0x0ae1d63b0eb919b0l,0xd74ee51da74b9620l,0x395458d0a674290cl, 18454 0x324c930f4620a510l }, 18455 { 0x2d1f4d19fbac27d4l,0x4086e8ca9bedeeacl,0x0cdd211b9b679ab8l, 18456 0x5970167d7090fec4l }, 18457 0 }, 18458 /* 10 << 56 */ 18459 { { 0x3420f2c9faf1fc63l,0x616d333a328c8bb4l,0x7d65364c57f1fe4al, 18460 0x9343e87755e5c73al }, 18461 { 0x5795176be970e78cl,0xa36ccebf60533627l,0xfc7c738009cdfc1bl, 18462 0xb39a2afeb3fec326l }, 18463 0 }, 18464 /* 11 << 56 */ 18465 { { 0xb7ff1ba16224408al,0xcc856e92247cfc5el,0x01f102e7c18bc493l, 18466 0x4613ab742091c727l }, 18467 { 0xaa25e89cc420bf2bl,0x00a5317690337ec2l,0xd2be9f437d025fc7l, 18468 0x3316fb856e6fe3dcl }, 18469 0 }, 18470 /* 13 << 56 */ 18471 { { 0x67332cfc2064cfd1l,0x339c31deb0651934l,0x719b28d52a3bcbeal, 18472 0xee74c82b9d6ae5c6l }, 18473 { 0x0927d05ebaf28ee6l,0x82cecf2c9d719028l,0x0b0d353eddb30289l, 18474 0xfe4bb977fddb2e29l }, 18475 0 }, 18476 /* 15 << 56 */ 18477 { { 0xe10b2ab817a91cael,0xb89aab6508e27f63l,0x7b3074a7dba3ddf9l, 18478 0x1c20ce09330c2972l }, 18479 { 0x6b9917b45fcf7e33l,0xe6793743945ceb42l,0x18fc22155c633d19l, 18480 0xad1adb3cc7485474l }, 18481 0 }, 18482 /* 16 << 56 */ 18483 { { 0x646f96796424c49bl,0xf888dfe867c241c9l,0xe12d4b9324f68b49l, 18484 0x9a6b62d8a571df20l }, 18485 { 0x81b4b26d179483cbl,0x666f96329511fae2l,0xd281b3e4d53aa51fl, 18486 0x7f96a7657f3dbd16l }, 18487 0 }, 18488 /* 17 << 56 */ 18489 { { 0xa7f8b5bf074a30cel,0xd7f52107005a32e6l,0x6f9e090750237ed4l, 18490 0x2f21da478096fa2bl }, 18491 { 0xf3e19cb4eec863a0l,0xd18f77fd9527620al,0x9505c81c407c1cf8l, 18492 0x9998db4e1b6ec284l }, 18493 0 }, 18494 /* 19 << 56 */ 18495 { { 0x794e2d5984ac066cl,0xf5954a92e68c69a0l,0x28c524584fd99dccl, 18496 0x60e639fcb1012517l }, 18497 { 0xc2e601257de79248l,0xe9ef6404f12fc6d7l,0x4c4f28082a3b5d32l, 18498 0x865ad32ec768eb8al }, 18499 0 }, 18500 /* 21 << 56 */ 18501 { { 0x4f4ddf91b2f1ac7al,0xf99eaabb760fee27l,0x57f4008a49c228e5l, 18502 0x090be4401cf713bbl }, 18503 { 0xac91fbe45004f022l,0xd838c2c2569e1af6l,0xd6c7d20b0f1daaa5l, 18504 0xaa063ac11bbb02c0l }, 18505 0 }, 18506 /* 23 << 56 */ 18507 { { 0x54935fcb81d73c9el,0x6d07e9790a5e97abl,0x4dc7b30acf3a6babl, 18508 0x147ab1f3170bee11l }, 18509 { 0x0aaf8e3d9fafdee4l,0xfab3dbcb538a8b95l,0x405df4b36ef13871l, 18510 0xf1f4e9cb088d5a49l }, 18511 0 }, 18512 /* 25 << 56 */ 18513 { { 0x43c01b87459afccdl,0x6bd45143b7432652l,0x8473453055b5d78el, 18514 0x81088fdb1554ba7dl }, 18515 { 0xada0a52c1e269375l,0xf9f037c42dc5ec10l,0xc066060794bfbc11l, 18516 0xc0a630bbc9c40d2fl }, 18517 0 }, 18518 /* 27 << 56 */ 18519 { { 0x9a730ed44763eb50l,0x24a0e221c1ab0d66l,0x643b6393648748f3l, 18520 0x1982daa16d3c6291l }, 18521 { 0x6f00a9f78bbc5549l,0x7a1783e17f36384el,0xe8346323de977f50l, 18522 0x91ab688db245502al }, 18523 0 }, 18524 /* 28 << 56 */ 18525 { { 0x331ab6b56d0bdd66l,0x0a6ef32e64b71229l,0x1028150efe7c352fl, 18526 0x27e04350ce7b39d3l }, 18527 { 0x2a3c8acdc1070c82l,0xfb2034d380c9feefl,0x2d729621709f3729l, 18528 0x8df290bf62cb4549l }, 18529 0 }, 18530 /* 29 << 56 */ 18531 { { 0x02f99f33fc2e4326l,0x3b30076d5eddf032l,0xbb21f8cf0c652fb5l, 18532 0x314fb49eed91cf7bl }, 18533 { 0xa013eca52f700750l,0x2b9e3c23712a4575l,0xe5355557af30fbb0l, 18534 0x1ada35167c77e771l }, 18535 0 }, 18536 /* 31 << 56 */ 18537 { { 0xdc9f46fc609e4a74l,0x2a44a143ba667f91l,0xbc3d8b95b4d83436l, 18538 0xa01e4bd0c7bd2958l }, 18539 { 0x7b18293273483c90l,0xa79c6aa1a7c7b598l,0xbf3983c6eaaac07el, 18540 0x8f18181e96e0d4e6l }, 18541 0 }, 18542 /* 33 << 56 */ 18543 { { 0x0bfc27eeacee5043l,0xae419e732eb10f02l,0x19c028d18943fb05l, 18544 0x71f01cf7ff13aa2al }, 18545 { 0x7790737e8887a132l,0x6751330966318410l,0x9819e8a37ddb795el, 18546 0xfecb8ef5dad100b2l }, 18547 0 }, 18548 /* 34 << 56 */ 18549 { { 0x59f74a223021926al,0xb7c28a496f9b4c1cl,0xed1a733f912ad0abl, 18550 0x42a910af01a5659cl }, 18551 { 0x3842c6e07bd68cabl,0x2b57fa3876d70ac8l,0x8a6707a83c53aaebl, 18552 0x62c1c51065b4db18l }, 18553 0 }, 18554 /* 35 << 56 */ 18555 { { 0x8de2c1fbb2d09dc7l,0xc3dfed12266bd23bl,0x927d039bd5b27db6l, 18556 0x2fb2f0f1103243dal }, 18557 { 0xf855a07b80be7399l,0xed9327ce1f9f27a8l,0xa0bd99c7729bdef7l, 18558 0x2b67125e28250d88l }, 18559 0 }, 18560 /* 36 << 56 */ 18561 { { 0x784b26e88670ced7l,0xe3dfe41fc31bd3b4l,0x9e353a06bcc85cbcl, 18562 0x302e290960178a9dl }, 18563 { 0x860abf11a6eac16el,0x76447000aa2b3aacl,0x46ff9d19850afdabl, 18564 0x35bdd6a5fdb2d4c1l }, 18565 0 }, 18566 /* 37 << 56 */ 18567 { { 0xe82594b07e5c9ce9l,0x0f379e5320af346el,0x608b31e3bc65ad4al, 18568 0x710c6b12267c4826l }, 18569 { 0x51c966f971954cf1l,0xb1cec7930d0aa215l,0x1f15598986bd23a8l, 18570 0xae2ff99cf9452e86l }, 18571 0 }, 18572 /* 39 << 56 */ 18573 { { 0xb5a741a76b2515cfl,0x71c416019585c749l,0x78350d4fe683de97l, 18574 0x31d6152463d0b5f5l }, 18575 { 0x7a0cc5e1fbce090bl,0xaac927edfbcb2a5bl,0xe920de4920d84c35l, 18576 0x8c06a0b622b4de26l }, 18577 0 }, 18578 /* 40 << 56 */ 18579 { { 0xd34dd58bafe7ddf3l,0x55851fedc1e6e55bl,0xd1395616960696e7l, 18580 0x940304b25f22705fl }, 18581 { 0x6f43f861b0a2a860l,0xcf1212820e7cc981l,0x121862120ab64a96l, 18582 0x09215b9ab789383cl }, 18583 0 }, 18584 /* 41 << 56 */ 18585 { { 0x311eb30537387c09l,0xc5832fcef03ee760l,0x30358f5832f7ea19l, 18586 0xe01d3c3491d53551l }, 18587 { 0x1ca5ee41da48ea80l,0x34e71e8ecf4fa4c1l,0x312abd257af1e1c7l, 18588 0xe3afcdeb2153f4a5l }, 18589 0 }, 18590 /* 43 << 56 */ 18591 { { 0x2a17747fa6d74081l,0x60ea4c0555a26214l,0x53514bb41f88c5fel, 18592 0xedd645677e83426cl }, 18593 { 0xd5d6cbec96460b25l,0xa12fd0ce68dc115el,0xc5bc3ed2697840eal, 18594 0x969876a8a6331e31l }, 18595 0 }, 18596 /* 44 << 56 */ 18597 { { 0x60c36217472ff580l,0xf42297054ad41393l,0x4bd99ef0a03b8b92l, 18598 0x501c7317c144f4f6l }, 18599 { 0x159009b318464945l,0x6d5e594c74c5c6bel,0x2d587011321a3660l, 18600 0xd1e184b13898d022l }, 18601 0 }, 18602 /* 45 << 56 */ 18603 { { 0x5ba047524c6a7e04l,0x47fa1e2b45550b65l,0x9419daf048c0a9a5l, 18604 0x663629537c243236l }, 18605 { 0xcd0744b15cb12a88l,0x561b6f9a2b646188l,0x599415a566c2c0c0l, 18606 0xbe3f08590f83f09al }, 18607 0 }, 18608 /* 46 << 56 */ 18609 { { 0x9141c5beb92041b8l,0x01ae38c726477d0dl,0xca8b71f3d12c7a94l, 18610 0xfab5b31f765c70dbl }, 18611 { 0x76ae7492487443e9l,0x8595a310990d1349l,0xf8dbeda87d460a37l, 18612 0x7f7ad0821e45a38fl }, 18613 0 }, 18614 /* 47 << 56 */ 18615 { { 0xed1d4db61059705al,0xa3dd492ae6b9c697l,0x4b92ee3a6eb38bd5l, 18616 0xbab2609d67cc0bb7l }, 18617 { 0x7fc4fe896e70ee82l,0xeff2c56e13e6b7e3l,0x9b18959e34d26fcal, 18618 0x2517ab66889d6b45l }, 18619 0 }, 18620 /* 48 << 56 */ 18621 { { 0xf167b4e0bdefdd4fl,0x69958465f366e401l,0x5aa368aba73bbec0l, 18622 0x121487097b240c21l }, 18623 { 0x378c323318969006l,0xcb4d73cee1fe53d1l,0x5f50a80e130c4361l, 18624 0xd67f59517ef5212bl }, 18625 0 }, 18626 /* 49 << 56 */ 18627 { { 0xf145e21e9e70c72el,0xb2e52e295566d2fbl,0x44eaba4a032397f5l, 18628 0x5e56937b7e31a7del }, 18629 { 0x68dcf517456c61e1l,0xbc2e954aa8b0a388l,0xe3552fa760a8b755l, 18630 0x03442dae73ad0cdel }, 18631 0 }, 18632 /* 51 << 56 */ 18633 { { 0x3fcbdbce478e2135l,0x7547b5cfbda35342l,0xa97e81f18a677af6l, 18634 0xc8c2bf8328817987l }, 18635 { 0xdf07eaaf45580985l,0xc68d1f05c93b45cbl,0x106aa2fec77b4cacl, 18636 0x4c1d8afc04a7ae86l }, 18637 0 }, 18638 /* 52 << 56 */ 18639 { { 0xdb41c3fd9eb45ab2l,0x5b234b5bd4b22e74l,0xda253decf215958al, 18640 0x67e0606ea04edfa0l }, 18641 { 0xabbbf070ef751b11l,0xf352f175f6f06dcel,0xdfc4b6af6839f6b4l, 18642 0x53ddf9a89959848el }, 18643 0 }, 18644 /* 53 << 56 */ 18645 { { 0xda49c379c21520b0l,0x90864ff0dbd5d1b6l,0x2f055d235f49c7f7l, 18646 0xe51e4e6aa796b2d8l }, 18647 { 0xc361a67f5c9dc340l,0x5ad53c37bca7c620l,0xda1d658832c756d0l, 18648 0xad60d9118bb67e13l }, 18649 0 }, 18650 /* 55 << 56 */ 18651 { { 0xd1183316fd6f7140l,0xf9fadb5bbd8e81f7l,0x701d5e0c5a02d962l, 18652 0xfdee4dbf1b601324l }, 18653 { 0xbed1740735d7620el,0x04e3c2c3f48c0012l,0x9ee29da73455449al, 18654 0x562cdef491a836c4l }, 18655 0 }, 18656 /* 57 << 56 */ 18657 { { 0x147ebf01fad097a5l,0x49883ea8610e815dl,0xe44d60ba8a11de56l, 18658 0xa970de6e827a7a6dl }, 18659 { 0x2be414245e17fc19l,0xd833c65701214057l,0x1375813b363e723fl, 18660 0x6820bb88e6a52e9bl }, 18661 0 }, 18662 /* 59 << 56 */ 18663 { { 0xe1b6f60c08191224l,0xc4126ebbde4ec091l,0xe1dff4dc4ae38d84l, 18664 0xde3f57db4f2ef985l }, 18665 { 0x34964337d446a1ddl,0x7bf217a0859e77f6l,0x8ff105278e1d13f5l, 18666 0xa304ef0374eeae27l }, 18667 0 }, 18668 /* 60 << 56 */ 18669 { { 0xfc6f5e47d19dfa5al,0xdb007de37fad982bl,0x28205ad1613715f5l, 18670 0x251e67297889529el }, 18671 { 0x727051841ae98e78l,0xf818537d271cac32l,0xc8a15b7eb7f410f5l, 18672 0xc474356f81f62393l }, 18673 0 }, 18674 /* 61 << 56 */ 18675 { { 0x92dbdc5ac242316bl,0xabe060acdbf4aff5l,0x6e8c38fe909a8ec6l, 18676 0x43e514e56116cb94l }, 18677 { 0x2078fa3807d784f9l,0x1161a880f4b5b357l,0x5283ce7913adea3dl, 18678 0x0756c3e6cc6a910bl }, 18679 0 }, 18680 /* 63 << 56 */ 18681 { { 0xa573a4966d17fbc7l,0x0cd1a70a73d2b24el,0x34e2c5cab2676937l, 18682 0xe7050b06bf669f21l }, 18683 { 0xfbe948b61ede9046l,0xa053005197662659l,0x58cbd4edf10124c5l, 18684 0xde2646e4dd6c06c8l }, 18685 0 }, 18686 /* 64 << 56 */ 18687 { { 0x332f81088cad38c0l,0x471b7e906bd68ae2l,0x56ac3fb20d8e27a3l, 18688 0xb54660db136b4b0dl }, 18689 { 0x123a1e11a6fd8de4l,0x44dbffeaa37799efl,0x4540b977ce6ac17cl, 18690 0x495173a8af60acefl }, 18691 0 }, 18692 /* 65 << 56 */ 18693 { { 0xc48b1478db447d0bl,0xe1b85f5d46104fbbl,0x4ab31e7d991c60b9l, 18694 0xaa674a9258a0cfd0l }, 18695 { 0x179fc2cd316f4297l,0x90c18642dcccbc82l,0x65d4309e56a4c163l, 18696 0xf211a9c7145a33ecl }, 18697 0 }, 18698 /* 71 << 56 */ 18699 { { 0x9669170cdc32717fl,0x52d69b5138133e34l,0xaed24e5fb079c3b2l, 18700 0xaba44a91a21ea3d2l }, 18701 { 0xd6814f1938d40105l,0x38289fe463462e7al,0x1793eefa3a80cbf5l, 18702 0x05816a0795f29bacl }, 18703 0 }, 18704 /* 77 << 56 */ 18705 { { 0xdca88ad98f850641l,0x8c1152c447999b0dl,0x509f654e654aff33l, 18706 0x2228550f08a12f14l }, 18707 { 0x60fe99dbb6a0ccdbl,0x80d6829bfc2cddccl,0x190f454dd5617aa4l, 18708 0x0aea05fe36295d2dl }, 18709 0 }, 18710 /* 83 << 56 */ 18711 { { 0x1de06c8af9bef9a5l,0xe24d85d3fb2d3164l,0x3dbe455e8d203d3el, 18712 0x439bee4735ea47a9l }, 18713 { 0xcc143432784893d7l,0x9b71073bd9bebd00l,0x6c106b343aa2fe88l, 18714 0x9df2a42734746f7al }, 18715 0 }, 18716 /* 89 << 56 */ 18717 { { 0x1ad0b3725a8c2168l,0x64e52d6d143f0402l,0xd933c783e320f31fl, 18718 0x1ccf90a80ff14f52l }, 18719 { 0xd3a3133ee1e6d0c0l,0xfd75a2d5b4acc8cal,0x62659b8e5559d171l, 18720 0x5087d6e9f13ad52al }, 18721 0 }, 18722 /* 95 << 56 */ 18723 { { 0xb4d647a5deef31a4l,0x95bf4ab180975ea9l,0x2f92d15adf57b03el, 18724 0x5ee808ab746b26d6l }, 18725 { 0x4341597c1082f261l,0x027795eb40c45e95l,0xcb77744b3b690c30l, 18726 0xdd87c084af3f88d1l }, 18727 0 }, 18728 /* 101 << 56 */ 18729 { { 0x469f177572109785l,0xf365e55123f84d6cl,0x8006a9c28a046dbbl, 18730 0x1b9fbe892fa09f52l }, 18731 { 0xac18a88016075e9el,0x4a3069bc1e3fd628l,0x20c61eaa60c61c14l, 18732 0x315b59daf61f004bl }, 18733 0 }, 18734 /* 107 << 56 */ 18735 { { 0x0a94387f26d04857l,0x952a4ebc43d6de95l,0xb422e15cf14abdfal, 18736 0x5b7a0153324ef90cl }, 18737 { 0x6aefa20e9826ec5bl,0x0e529886ad2fe161l,0xb710a74ec0d416e8l, 18738 0x6cf4b0a5fb6c90bcl }, 18739 0 }, 18740 /* 113 << 56 */ 18741 { { 0x822aea4031979d3bl,0xb504eafde215a109l,0xa8761ead84bf2377l, 18742 0xb55c1e55efb3d942l }, 18743 { 0xd01f9b0212b7f17bl,0x41b62c2a891bfbbfl,0x50800e6b08938149l, 18744 0x527b50a9b0a55d82l }, 18745 0 }, 18746 /* 116 << 56 */ 18747 { { 0x6bc84d8d1d9ce3c4l,0x53b465072a308df0l,0x6c3da9bfca79c88al, 18748 0x9636ad9c36372acfl }, 18749 { 0x8840e92c425ef14cl,0x863191f96af3225bl,0xd56d82d0d369b857l, 18750 0x2053a2527a4c41f9l }, 18751 0 }, 18752 /* 119 << 56 */ 18753 { { 0x20aecd6609ca8805l,0x945d9b31dc818ee6l,0x1424647c2119b44bl, 18754 0xbe934d7e5a6641f9l }, 18755 { 0xe91d53184559e55el,0xc2fb8e0b4dfbc3d4l,0x9e92e20676cb937fl, 18756 0x0f5582e4f2932429l }, 18757 0 }, 18758 /* 125 << 56 */ 18759 { { 0xb5fc22a42d31809fl,0x6d582d2b0e35b7b4l,0x5fac415158c5f576l, 18760 0xdff239371e4cd7c9l }, 18761 { 0x0f62b329ed4d1925l,0x00994a2e6010fb16l,0xb4b91076bd754837l, 18762 0xfde219463345103al }, 18763 0 }, 18764 }, 18765 { 18766 /* 0 << 64 */ 18767 { { 0x00, 0x00, 0x00, 0x00 }, 18768 { 0x00, 0x00, 0x00, 0x00 }, 18769 1 }, 18770 /* 1 << 64 */ 18771 { { 0x4f922fc516a0d2bbl,0x0d5cc16c1a623499l,0x9241cf3a57c62c8bl, 18772 0x2f5e6961fd1b667fl }, 18773 { 0x5c15c70bf5a01797l,0x3d20b44d60956192l,0x04911b37071fdb52l, 18774 0xf648f9168d6f0f7bl }, 18775 0 }, 18776 /* 3 << 64 */ 18777 { { 0x4090914bb5def996l,0x1cb69c83233dd1e7l,0xc1e9c1d39b3d5e76l, 18778 0x1f3338edfccf6012l }, 18779 { 0xb1e95d0d2f5378a8l,0xacf4c2c72f00cd21l,0x6e984240eb5fe290l, 18780 0xd66c038d248088ael }, 18781 0 }, 18782 /* 4 << 64 */ 18783 { { 0x9ad5462bb4d8bc50l,0x181c0b16a9195770l,0xebd4fe1c78412a68l, 18784 0xae0341bcc0dff48cl }, 18785 { 0xb6bc45cf7003e866l,0xf11a6dea8a24a41bl,0x5407151ad04c24c2l, 18786 0x62c9d27dda5b7b68l }, 18787 0 }, 18788 /* 5 << 64 */ 18789 { { 0xd4992b30614c0900l,0xda98d121bd00c24bl,0x7f534dc87ec4bfa1l, 18790 0x4a5ff67437dc34bcl }, 18791 { 0x68c196b81d7ea1d7l,0x38cf289380a6d208l,0xfd56cd09e3cbbd6el, 18792 0xec72e27e4205a5b6l }, 18793 0 }, 18794 /* 7 << 64 */ 18795 { { 0xe8b97932b88756ddl,0xed4e8652f17e3e61l,0xc2dd14993ee1c4a4l, 18796 0xc0aaee17597f8c0el }, 18797 { 0x15c4edb96c168af3l,0x6563c7bfb39ae875l,0xadfadb6f20adb436l, 18798 0xad55e8c99a042ac0l }, 18799 0 }, 18800 /* 9 << 64 */ 18801 { { 0x65c29219909523c8l,0xa62f648fa3a1c741l,0x88598d4f60c9e55al, 18802 0xbce9141b0e4f347al }, 18803 { 0x9af97d8435f9b988l,0x0210da62320475b6l,0x3c076e229191476cl, 18804 0x7520dbd944fc7834l }, 18805 0 }, 18806 /* 10 << 64 */ 18807 { { 0x87a7ebd1e0a1b12al,0x1e4ef88d770ba95fl,0x8c33345cdc2ae9cbl, 18808 0xcecf127601cc8403l }, 18809 { 0x687c012e1b39b80fl,0xfd90d0ad35c33ba4l,0xa3ef5a675c9661c2l, 18810 0x368fc88ee017429el }, 18811 0 }, 18812 /* 11 << 64 */ 18813 { { 0x664300b07850ec06l,0xac5a38b97d3a10cfl,0x9233188de34ab39dl, 18814 0xe77057e45072cbb9l }, 18815 { 0xbcf0c042b59e78dfl,0x4cfc91e81d97de52l,0x4661a26c3ee0ca4al, 18816 0x5620a4c1fb8507bcl }, 18817 0 }, 18818 /* 13 << 64 */ 18819 { { 0x84b9ca1504b6c5a0l,0x35216f3918f0e3a3l,0x3ec2d2bcbd986c00l, 18820 0x8bf546d9d19228fel }, 18821 { 0xd1c655a44cd623c3l,0x366ce718502b8e5al,0x2cfc84b4eea0bfe7l, 18822 0xe01d5ceecf443e8el }, 18823 0 }, 18824 /* 15 << 64 */ 18825 { { 0xa75feacabe063f64l,0x9b392f43bce47a09l,0xd42415091ad07acal, 18826 0x4b0c591b8d26cd0fl }, 18827 { 0x2d42ddfd92f1169al,0x63aeb1ac4cbf2392l,0x1de9e8770691a2afl, 18828 0xebe79af7d98021dal }, 18829 0 }, 18830 /* 16 << 64 */ 18831 { { 0x58af2010f5b343bcl,0x0f2e400af2f142fel,0x3483bfdea85f4bdfl, 18832 0xf0b1d09303bfeaa9l }, 18833 { 0x2ea01b95c7081603l,0xe943e4c93dba1097l,0x47be92adb438f3a6l, 18834 0x00bb7742e5bf6636l }, 18835 0 }, 18836 /* 17 << 64 */ 18837 { { 0x66917ce63b5f1cc4l,0x37ae52eace872e62l,0xbb087b722905f244l, 18838 0x120770861e6af74fl }, 18839 { 0x4b644e491058edeal,0x827510e3b638ca1dl,0x8cf2b7046038591cl, 18840 0xffc8b47afe635063l }, 18841 0 }, 18842 /* 19 << 64 */ 18843 { { 0x7677408d6dfafed3l,0x33a0165339661588l,0x3c9c15ec0b726fa0l, 18844 0x090cfd936c9b56dal }, 18845 { 0xe34f4baea3c40af5l,0x3469eadbd21129f1l,0xcc51674a1e207ce8l, 18846 0x1e293b24c83b1ef9l }, 18847 0 }, 18848 /* 21 << 64 */ 18849 { { 0x796d3a85825808bdl,0x51dc3cb73fd6e902l,0x643c768a916219d1l, 18850 0x36cd7685a2ad7d32l }, 18851 { 0xe3db9d05b22922a4l,0x6494c87edba29660l,0xf0ac91dfbcd2ebc7l, 18852 0x4deb57a045107f8dl }, 18853 0 }, 18854 /* 23 << 64 */ 18855 { { 0xb6c69ac82094cec3l,0x9976fb88403b770cl,0x1dea026c4859590dl, 18856 0xb6acbb468562d1fdl }, 18857 { 0x7cd6c46144569d85l,0xc3190a3697f0891dl,0xc6f5319548d5a17dl, 18858 0x7d919966d749abc8l }, 18859 0 }, 18860 /* 25 << 64 */ 18861 { { 0xb53b7de561906373l,0x858dbadeeb999595l,0x8cbb47b2a59e5c36l, 18862 0x660318b3dcf4e842l }, 18863 { 0xbd161ccd12ba4b7al,0xf399daabf8c8282al,0x1587633aeeb2130dl, 18864 0xa465311ada38dd7dl }, 18865 0 }, 18866 /* 27 << 64 */ 18867 { { 0x2dae9082be7cf3a6l,0xcc86ba92bc967274l,0xf28a2ce8aea0a8a9l, 18868 0x404ca6d96ee988b3l }, 18869 { 0xfd7e9c5d005921b8l,0xf56297f144e79bf9l,0xa163b4600d75ddc2l, 18870 0x30b23616a1f2be87l }, 18871 0 }, 18872 /* 28 << 64 */ 18873 { { 0x19e6125dec3f1decl,0x07b1f040911178dal,0xd93ededa904a6738l, 18874 0x55187a5a0bebedcdl }, 18875 { 0xf7d04722eb329d41l,0xf449099ef170b391l,0xfd317a69ca99f828l, 18876 0x50c3db2b34a4976dl }, 18877 0 }, 18878 /* 29 << 64 */ 18879 { { 0x0064d8585499fb32l,0x7b67bad977a8aeb7l,0x1d3eb9772d08eec5l, 18880 0x5fc047a6cbabae1dl }, 18881 { 0x0577d159e54a64bbl,0x8862201bc43497e4l,0xad6b4e282ce0608dl, 18882 0x8b687b7d0b167aacl }, 18883 0 }, 18884 /* 31 << 64 */ 18885 { { 0xe9f9669cda94951el,0x4b6af58d66b8d418l,0xfa32107417d426a4l, 18886 0xc78e66a99dde6027l }, 18887 { 0x0516c0834a53b964l,0xfc659d38ff602330l,0x0ab55e5c58c5c897l, 18888 0x985099b2838bc5dfl }, 18889 0 }, 18890 /* 33 << 64 */ 18891 { { 0xe7a935fa1684cb3bl,0x571650b5a7d7e69dl,0x6ba9ffa40328c168l, 18892 0xac43f6bc7e46f358l }, 18893 { 0x54f75e567cb6a779l,0x4e4e2cc8c61320del,0xb94258bc2b8903d0l, 18894 0xc7f32d57ceecabe0l }, 18895 0 }, 18896 /* 34 << 64 */ 18897 { { 0x34739f16cd7d9d89l,0x6daab4267ca080b5l,0x772086ff40e19f45l, 18898 0x43caa56118c61b42l }, 18899 { 0x0ba3d4a8dbf365f1l,0xa0db435ee760ad97l,0xfd6f30d56916c59bl, 18900 0xab34cb5dafe12f5dl }, 18901 0 }, 18902 /* 35 << 64 */ 18903 { { 0x445b86ea02a3260al,0x8c51d6428d689babl,0x183334d65588904cl, 18904 0xf8a3b84d479d6422l }, 18905 { 0x581acfa0f0833d00l,0xc50827bc3b567d2dl,0x2c935e6daddcf73el, 18906 0x2a645f7704dd19f2l }, 18907 0 }, 18908 /* 36 << 64 */ 18909 { { 0x78d2e8dfcb564473l,0x4349a97357d5621al,0x9d835d89218f8b24l, 18910 0x01fe7bc5079b6ee2l }, 18911 { 0xe57f2a2b5b3b5dcel,0x5a8637b75fe55565l,0x83ff34aea41dbae7l, 18912 0xfce1199c950a7a8fl }, 18913 0 }, 18914 /* 37 << 64 */ 18915 { { 0x0ca5d25bf8e71ce2l,0x204edc4a062685dal,0x06fe407d87678ec2l, 18916 0xd16936a07defa39al }, 18917 { 0x3b108d84af3d16d0l,0xf2e9616d0305cad0l,0xbc9537e6f27bed97l, 18918 0x71c2d699ebc9f45cl }, 18919 0 }, 18920 /* 39 << 64 */ 18921 { { 0x203bdd84cdcd3a85l,0x1107b901ade3ccfal,0xa7da89e95533159dl, 18922 0x8d834005860e8c64l }, 18923 { 0x914bc0eb2a7638f7l,0xc66ce0a6620e8606l,0x11ef98c2e6c12dc0l, 18924 0x25666b1d7780fc0el }, 18925 0 }, 18926 /* 40 << 64 */ 18927 { { 0x374f541f3e707706l,0x9a4d3638a831d0cfl,0x4ab4f4831518ca04l, 18928 0x54e3ee5dfe38c318l }, 18929 { 0x383ae36403c8819bl,0xa9d1daa12e17864cl,0x245a97b350eeaa5bl, 18930 0x5362d00999bf4e83l }, 18931 0 }, 18932 /* 41 << 64 */ 18933 { { 0x6667e89f4ded8a4fl,0xa59161abc36a7795l,0x1c96f6f9331ccf94l, 18934 0xf2727e879a686d49l }, 18935 { 0x0f94894bb841295fl,0xb0fe8f744a0503d1l,0x60c581c7ef407926l, 18936 0x1980c8e13edb7e1cl }, 18937 0 }, 18938 /* 43 << 64 */ 18939 { { 0x47948c84c5de1a41l,0xd595d14a48959688l,0x3bfca4be86ff21c9l, 18940 0xb5ff59b86a4191cal }, 18941 { 0xced1dd1d65094c86l,0xd57b86559dc9d001l,0xbcac6fa3486e51d7l, 18942 0x8e97e2637b774c1bl }, 18943 0 }, 18944 /* 44 << 64 */ 18945 { { 0xfc0313c29bd43980l,0x9c954b70f172db29l,0x679bdcb7f954a21al, 18946 0x6b48170954e2e4fcl }, 18947 { 0x318af5f530baf1d0l,0x26ea8a3ccbf92060l,0xc3c69d7ccd5ae258l, 18948 0xa73ba0470ead07c9l }, 18949 0 }, 18950 /* 45 << 64 */ 18951 { { 0xe82eb003e35dca85l,0xfd0000fa31e39180l,0xbca90f746735f378l, 18952 0xe6aa783158c943edl }, 18953 { 0x0e94ecd5b6a438d7l,0xc02b60faf9a5f114l,0x4063568b8b1611ebl, 18954 0x1398bdc1272509ecl }, 18955 0 }, 18956 /* 46 << 64 */ 18957 { { 0xc2ef6a01be3e92d1l,0x1bce9c27282bd5ddl,0xf7e488f3adda0568l, 18958 0xd4f15fdb1af9bb8bl }, 18959 { 0x8c490ade4da846efl,0x76229da17f0b825el,0xc8b812082a6711c6l, 18960 0x511f5e23b4c523aal }, 18961 0 }, 18962 /* 47 << 64 */ 18963 { { 0xbdf4e7049970f46el,0x70e220288dadbd1al,0x2b86c97fb1223d26l, 18964 0x042ad22ecf62f51al }, 18965 { 0x72944339ba2ed2e9l,0x0ba0d10ef94fa61dl,0x3f86164194e68f15l, 18966 0x1312a74acb86c545l }, 18967 0 }, 18968 /* 48 << 64 */ 18969 { { 0x3a63c39731815e69l,0x6df9cbd6dcdd2802l,0x4c47ed4a15b4f6afl, 18970 0x62009d826ac0f978l }, 18971 { 0x664d80d28b898fc7l,0x72f1eeda2c17c91fl,0x9e84d3bc7aae6609l, 18972 0x58c7c19528376895l }, 18973 0 }, 18974 /* 49 << 64 */ 18975 { { 0x640ebf5d5b8d354al,0xa5f3a8fdb396ff64l,0xd53f041d8378ed81l, 18976 0x1969d61bc1234ad2l }, 18977 { 0x16d7acffeb68bde2l,0x63767a68f23e9368l,0x937a533c38928d95l, 18978 0xee2190bbbeb0f1f2l }, 18979 0 }, 18980 /* 51 << 64 */ 18981 { { 0xb6860c9a73a4aafbl,0xb2f996290488870dl,0x16ef6232572d9e25l, 18982 0x5b9eb1bad1383389l }, 18983 { 0xabf713a7ed8d77f8l,0xd2b4a2e9e2b69e64l,0xa1a22cfd6d6f17c2l, 18984 0x4bfd6f992d604511l }, 18985 0 }, 18986 /* 52 << 64 */ 18987 { { 0xdcff7630d9294f07l,0x89b765d68dba8fd0l,0x553e55de8dbcaccdl, 18988 0x9b4a009eed702bf8l }, 18989 { 0xf6e534dd27b8ca0dl,0xc4496b346177fd52l,0x378ce6f6c87bb7b7l, 18990 0x68633d4844cc19f0l }, 18991 0 }, 18992 /* 53 << 64 */ 18993 { { 0xfe550021bc84c625l,0x8d7169986d45e4a3l,0xa09c6ded4c0c66b7l, 18994 0xe32313aeb9e1d547l }, 18995 { 0x8ce775b4d1e8e0b9l,0xa899f9102654dd15l,0x7c38aa066cc8b2a9l, 18996 0xe6ebb291d6ce6cc0l }, 18997 0 }, 18998 /* 55 << 64 */ 18999 { { 0x5963df62a6991216l,0x4c17f72246996010l,0x131dc2b840477722l, 19000 0x78bf50b0d1765a75l }, 19001 { 0x360afd587ceaca12l,0xebc55dbb139cd470l,0x9083e27e4c05541cl, 19002 0xc10057a3b873d757l }, 19003 0 }, 19004 /* 57 << 64 */ 19005 { { 0x440009c3deed7769l,0xde2fa58a14fd8a44l,0x509e7df35b627596l, 19006 0x3d76a87cc3bb07a7l }, 19007 { 0x8018fee5b8ef000al,0x71ce33e9823fd4b6l,0x3a1cac37469c0bb1l, 19008 0x92fe7aeaf3eec8eel }, 19009 0 }, 19010 /* 59 << 64 */ 19011 { { 0x37ad0eb8de64e568l,0x4ac669bca1e3e20el,0x240d0ac22ce944edl, 19012 0xd532039a3c1b28fbl }, 19013 { 0xa2bb899a23acba6cl,0xd472af671af937e1l,0x04478f7b8851e753l, 19014 0x74030eef5ea05307l }, 19015 0 }, 19016 /* 60 << 64 */ 19017 { { 0x3559e7b67dc17874l,0xd0caf0ef8195cc2al,0x07c067880cd24dd9l, 19018 0x01a99ea002857c41l }, 19019 { 0xd86579e490f82f63l,0xb1e0658ae41c9237l,0x075ffafd93fd1e79l, 19020 0x6e70403547f60b8fl }, 19021 0 }, 19022 /* 61 << 64 */ 19023 { { 0x2246ad76c1d68c31l,0x9126202b0d5c4677l,0x5f40de81638882dcl, 19024 0xb131988ca3253a7fl }, 19025 { 0x766f1897ba9ae0a8l,0xf0e01dd41d8b5fefl,0x03e28ce3ed7b12c8l, 19026 0x44b3a2be1fd20e1el }, 19027 0 }, 19028 /* 63 << 64 */ 19029 { { 0xd4c8e8e5f2a5f247l,0x42ffd816c2c7c979l,0x89e1485211093d1al, 19030 0x98f44a4613871ebbl }, 19031 { 0x374849964b032e2dl,0x28a430f445995a61l,0xf2f9acbad5be16b6l, 19032 0xac98a5402d8e02aal }, 19033 0 }, 19034 /* 64 << 64 */ 19035 { { 0x0d53f5c7a3e6fcedl,0xe8cbbdd5f45fbdebl,0xf85c01df13339a70l, 19036 0x0ff71880142ceb81l }, 19037 { 0x4c4e8774bd70437al,0x5fb32891ba0bda6al,0x1cdbebd2f18bd26el, 19038 0x2f9526f103a9d522l }, 19039 0 }, 19040 /* 65 << 64 */ 19041 { { 0x48334fdcc20b8d30l,0x25f887d749414fddl,0x9ccd513311a2cf0dl, 19042 0x7e7799e4d08975a4l }, 19043 { 0xb5993a53729b951cl,0x0cf14a5a62dbc6a8l,0xb39ed36efe4d16eel, 19044 0xb75f3fb681bda63al }, 19045 0 }, 19046 /* 71 << 64 */ 19047 { { 0xac7db8706d4f68b5l,0x819a13c7be49b3a4l,0x646ae2b1418bf1e9l, 19048 0x25b53a5f69b3a5ccl }, 19049 { 0xd23d94d37de26578l,0x8bb581caecdd138al,0x9e053f67f857b0dal, 19050 0xe679cc7a255ff474l }, 19051 0 }, 19052 /* 77 << 64 */ 19053 { { 0x4a4b8d990df097f9l,0x0ae1227a0b4173cal,0x0d401778adb72178l, 19054 0xd29848b43f421e0cl }, 19055 { 0xc5eec6096eb0722dl,0x527d72877e12c028l,0xed12a9e71b5dcc0cl, 19056 0x26b27344dcf4b4dal }, 19057 0 }, 19058 /* 83 << 64 */ 19059 { { 0x695c502565e4408al,0x2d23768fcbce94e6l,0x1505fa1e5080b88dl, 19060 0x5c8fbab6855f7cc1l }, 19061 { 0x70d876f275fb125dl,0x456421330a252007l,0xfe99249a8ee05be1l, 19062 0x0893b620f4bf5490l }, 19063 0 }, 19064 /* 89 << 64 */ 19065 { { 0x2a59df1ed9fe6bdfl,0x96a9c791785e057fl,0x4b0d795f86a1d751l, 19066 0x196c8e0aec642886l }, 19067 { 0x6df67899bc0e055cl,0x4173204a63007433l,0xb5ee4efec21c9245l, 19068 0x2f7d4c75c1451bael }, 19069 0 }, 19070 /* 95 << 64 */ 19071 { { 0x2ad7f836b1047b7fl,0x368d431a71f6bfe1l,0xfcd933b103db4667l, 19072 0xfff77ed3ecb81330l }, 19073 { 0x3677935b44958bd4l,0xa6cfcda8a1d5a9e7l,0xb2b73bc699ff9fael, 19074 0x1c2cd628f866d3c4l }, 19075 0 }, 19076 /* 101 << 64 */ 19077 { { 0x2756873495031ceel,0xebed373d51091c1bl,0x398fef0819aa2f27l, 19078 0x2f26174e2c0a9feal }, 19079 { 0xedca72b6b219be3fl,0x001a8fdc80503df8l,0x9a2fadbb6b93f643l, 19080 0xd48e552cd44cebc3l }, 19081 0 }, 19082 /* 107 << 64 */ 19083 { { 0x6c0dbb68667a7ab6l,0x00490ce757630e91l,0x04976cd57eb2f382l, 19084 0x9ee486b655dda4a3l }, 19085 { 0x4ea5c9c9cca0d01cl,0xa6e054b639f69c6dl,0xb3b7ac992ecab239l, 19086 0x80c9f6d17597512el }, 19087 0 }, 19088 /* 113 << 64 */ 19089 { { 0x64dfdd68b942fad9l,0xe7d8e88da5eb3d14l,0xb7281dc2382f6301l, 19090 0xcfa2ee6dbfe00a7fl }, 19091 { 0x6e617657dc7be39fl,0x22d58dd6591c6e3al,0xd3a4003918318c13l, 19092 0xcac6c830981b6b72l }, 19093 0 }, 19094 /* 116 << 64 */ 19095 { { 0x009690ffb4fbfaa0l,0x8bbbdab73619c6dbl,0xc6d44273728356e8l, 19096 0xfd76f0d8e453ec35l }, 19097 { 0x775c2554aac28a29l,0x28f7af9d5c55e4f0l,0xbacf54a688e8ad4dl, 19098 0x85b018e80aa76ddfl }, 19099 0 }, 19100 /* 119 << 64 */ 19101 { { 0x27893f7983ce88e4l,0x9556c9977785f13dl,0x83d3c38d3a35831el, 19102 0x3856c829d12f0a1dl }, 19103 { 0xb308d84c93259c1al,0x4ef87ab4691ffd28l,0x76a18d5321a88c58l, 19104 0xf13cd5d53503cb4dl }, 19105 0 }, 19106 /* 125 << 64 */ 19107 { { 0x669d93dba8cc0db3l,0x403cb9200dfcfcf4l,0x5def4a03e77c3979l, 19108 0x2a05c9423e2e2522l }, 19109 { 0xd86dca52b5f48bf0l,0x174766de5828a135l,0x116290b40d3a96d0l, 19110 0xe1999457aeea1193l }, 19111 0 }, 19112 }, 19113 { 19114 /* 0 << 72 */ 19115 { { 0x00, 0x00, 0x00, 0x00 }, 19116 { 0x00, 0x00, 0x00, 0x00 }, 19117 1 }, 19118 /* 1 << 72 */ 19119 { { 0x0db2fb5ed005832al,0x5f5efd3b91042e4fl,0x8c4ffdc6ed70f8cal, 19120 0xe4645d0bb52da9ccl }, 19121 { 0x9596f58bc9001d1fl,0x52c8f0bc4e117205l,0xfd4aa0d2e398a084l, 19122 0x815bfe3a104f49del }, 19123 0 }, 19124 /* 3 << 72 */ 19125 { { 0x524d226ad7ab9a2dl,0x9c00090d7dfae958l,0x0ba5f5398751d8c2l, 19126 0x8afcbcdd3ab8262dl }, 19127 { 0x57392729e99d043bl,0xef51263baebc943al,0x9feace9320862935l, 19128 0x639efc03b06c817bl }, 19129 0 }, 19130 /* 4 << 72 */ 19131 { { 0xe839be7d341d81dcl,0xcddb688932148379l,0xda6211a1f7026eadl, 19132 0xf3b2575ff4d1cc5el }, 19133 { 0x40cfc8f6a7a73ae6l,0x83879a5e61d5b483l,0xc5acb1ed41a50ebcl, 19134 0x59a60cc83c07d8fal }, 19135 0 }, 19136 /* 5 << 72 */ 19137 { { 0xdec98d4ac3b81990l,0x1cb837229e0cc8fel,0xfe0b0491d2b427b9l, 19138 0x0f2386ace983a66cl }, 19139 { 0x930c4d1eb3291213l,0xa2f82b2e59a62ae4l,0x77233853f93e89e3l, 19140 0x7f8063ac11777c7fl }, 19141 0 }, 19142 /* 7 << 72 */ 19143 { { 0x36e607cf02ff6072l,0xa47d2ca98ad98cdcl,0xbf471d1ef5f56609l, 19144 0xbcf86623f264ada0l }, 19145 { 0xb70c0687aa9e5cb6l,0xc98124f217401c6cl,0x8189635fd4a61435l, 19146 0xd28fb8afa9d98ea6l }, 19147 0 }, 19148 /* 9 << 72 */ 19149 { { 0x3d4da8c3017025f3l,0xefcf628cfb9579b4l,0x5c4d00161f3716ecl, 19150 0x9c27ebc46801116el }, 19151 { 0x5eba0ea11da1767el,0xfe15145247004c57l,0x3ace6df68c2373b7l, 19152 0x75c3dffe5dbc37acl }, 19153 0 }, 19154 /* 10 << 72 */ 19155 { { 0xa2a147dba28a0749l,0x246c20d6ee519165l,0x5068d1b1d3810715l, 19156 0xb1e7018c748160b9l }, 19157 { 0x03f5b1faf380ff62l,0xef7fb1ddf3cb2c1el,0xeab539a8fc91a7dal, 19158 0x83ddb707f3f9b561l }, 19159 0 }, 19160 /* 11 << 72 */ 19161 { { 0xb57276d980101b98l,0x760883fdb82f0f66l,0x89d7de754bc3eff3l, 19162 0x03b606435dc2ab40l }, 19163 { 0xcd6e53dfe05beeacl,0xf2f1e862bc3325cdl,0xdd0f7921774f03c3l, 19164 0x97ca72214552cc1bl }, 19165 0 }, 19166 /* 13 << 72 */ 19167 { { 0x760cb3b5e224c5d7l,0xfa3baf8c68616919l,0x9fbca1138d142552l, 19168 0x1ab18bf17669ebf5l }, 19169 { 0x55e6f53e9bdf25ddl,0x04cc0bf3cb6cd154l,0x595bef4995e89080l, 19170 0xfe9459a8104a9ac1l }, 19171 0 }, 19172 /* 15 << 72 */ 19173 { { 0x694b64c5abb020e8l,0x3d18c18419c4eec7l,0x9c4673ef1c4793e5l, 19174 0xc7b8aeb5056092e6l }, 19175 { 0x3aa1ca43f0f8c16bl,0x224ed5ecd679b2f6l,0x0d56eeaf55a205c9l, 19176 0xbfe115ba4b8e028bl }, 19177 0 }, 19178 /* 16 << 72 */ 19179 { { 0x3e22a7b397acf4ecl,0x0426c4005ea8b640l,0x5e3295a64e969285l, 19180 0x22aabc59a6a45670l }, 19181 { 0xb929714c5f5942bcl,0x9a6168bdfa3182edl,0x2216a665104152bal, 19182 0x46908d03b6926368l }, 19183 0 }, 19184 /* 17 << 72 */ 19185 { { 0x9b8be0247fcba850l,0x81eb5797820a181el,0xa0f2812230a01211l, 19186 0x7e9cdc3cae7b8821l }, 19187 { 0x202332cc72ce15e7l,0xcd3cb2bbcb8238d7l,0xe4ab63dfc6e82c43l, 19188 0x58bd00283183d717l }, 19189 0 }, 19190 /* 19 << 72 */ 19191 { { 0x02d57b7e717ed7b5l,0xd22e5b244dbce1a2l,0x174bd7712a4cdcf5l, 19192 0xa6fdb801408205bbl }, 19193 { 0x67b4b0695e1387e9l,0x332b19a10591a442l,0x24edd916ccacf366l, 19194 0xbe34cc4534958a50l }, 19195 0 }, 19196 /* 21 << 72 */ 19197 { { 0xa3f46e1e3e66d391l,0xb4a732cd7d6369b2l,0x99c3b85d402c1022l, 19198 0x7dccfcbe2b54932el }, 19199 { 0xa6ddaa7b56b1dfe2l,0x31dc78a5e34a82c9l,0x8abeb3da704f3941l, 19200 0xdf11a36cca55fa98l }, 19201 0 }, 19202 /* 23 << 72 */ 19203 { { 0x6c01f77a16e00c1bl,0x82515490839eaaacl,0x62f3a4ef3470d334l, 19204 0x5a29a6491c1dcd6cl }, 19205 { 0x46b6782ece997a25l,0x9978fb35d3579953l,0x98f5a9df0960e0cel, 19206 0x547dc8391f527a4cl }, 19207 0 }, 19208 /* 25 << 72 */ 19209 { { 0x395b15835d9dc24fl,0xa4256932c73ae680l,0x0542960efaa2c8e9l, 19210 0x2bb3adee71068c6al }, 19211 { 0xa706099b570b4554l,0x85d12bb5f4e278d6l,0xd78af6f664296843l, 19212 0xc7d3b3888428c633l }, 19213 0 }, 19214 /* 27 << 72 */ 19215 { { 0x34d44f9343b7e597l,0xdde440a7c2530f42l,0x7270a0817856bdb9l, 19216 0x86a945eb5353032fl }, 19217 { 0x6c2f8e9966d39810l,0x0642a31b9b8b4b6bl,0x51679e62d1509d82l, 19218 0x0120001c90f8ff16l }, 19219 0 }, 19220 /* 28 << 72 */ 19221 { { 0x50a1c1062e36e34al,0x74e8f58ce024ed1al,0x3f0f1dfa1300d726l, 19222 0x6680df267b4a2d18l }, 19223 { 0x12b5979d8235b3b7l,0x1d2fafcb8a611493l,0x73ebda968848ece5l, 19224 0xe996c275a413e399l }, 19225 0 }, 19226 /* 29 << 72 */ 19227 { { 0x46b7d7c7495ff000l,0xe60ed097baed95d1l,0xaa8804ac6e38f9c0l, 19228 0x92990c0645c6f9bbl }, 19229 { 0xcae6a439c0919851l,0x713dff151bf5e1f2l,0x5d262c302eb38cdbl, 19230 0xb73d505190df31dfl }, 19231 0 }, 19232 /* 31 << 72 */ 19233 { { 0x921e7b1c32d9268cl,0x34db2b964276fad4l,0x0ec56d34cc44e730l, 19234 0x59be3a46096545b7l }, 19235 { 0xe9fdbc9766cf3a6al,0x7b2f83edd04e9b53l,0x6d99b3cc8fbae3e7l, 19236 0x8eb5646c7ada3a40l }, 19237 0 }, 19238 /* 33 << 72 */ 19239 { { 0xa69ab906fc3302bfl,0x49ae6ba7d0872e90l,0xc9e2d6d1f3a1bfc3l, 19240 0x11dfe85f1a033500l }, 19241 { 0x45189c2998666dbdl,0xba6aab88bbfd13cel,0xcf9c8b43dbd38cd4l, 19242 0xa0cb581b68009236l }, 19243 0 }, 19244 /* 34 << 72 */ 19245 { { 0xff18c42a16288a7al,0x6363ace430699163l,0x8546d6332a2ce353l, 19246 0x5e0379ef7b6b3418l }, 19247 { 0x2df2bb463e941bb2l,0xae7c091888e1aacel,0x6bc0982d83f5a37al, 19248 0x8521bd02676d09e0l }, 19249 0 }, 19250 /* 35 << 72 */ 19251 { { 0x6531dff33d361aacl,0x59b954477c8cac2el,0xcc104df6c5cb7363l, 19252 0x68b571c519364acdl }, 19253 { 0x7521e962979c3bc0l,0xbe0544c9c4aa1f92l,0x59127fe92a31eabbl, 19254 0x760ac28593d8b55bl }, 19255 0 }, 19256 /* 36 << 72 */ 19257 { { 0x62ed534c6115164bl,0xaebe9e4cdce84ceal,0xd81c91a1c83f64c3l, 19258 0x325a8ca8ecacd09al }, 19259 { 0x7ea57ad968b45df1l,0xa555636fd530c5d2l,0x23aff510591cfe32l, 19260 0x46ff147637bedab9l }, 19261 0 }, 19262 /* 37 << 72 */ 19263 { { 0xa5a7e81ecb2edb3bl,0x9b0dc5f4f8fbe238l,0xc6f258087c66dd34l, 19264 0xb4a57503a3f8f38al }, 19265 { 0x195b433513571b5bl,0xa32840763ccbc30bl,0x64ae1ffccf99ddd5l, 19266 0x0dfc8772aa844e76l }, 19267 0 }, 19268 /* 39 << 72 */ 19269 { { 0x8b471afbfb22341dl,0xbf448b43397afdd2l,0x4cb08409682c37edl, 19270 0xc3acfae6a948f1f6l }, 19271 { 0xf58462549e634707l,0x50161a78bd949f52l,0xf0529e752fe73566l, 19272 0xe7e3fdef6fda53e0l }, 19273 0 }, 19274 /* 40 << 72 */ 19275 { { 0x56dab1c8321a518cl,0xfd4439a68bce226fl,0xe0b30d194facb9fal, 19276 0xb5052f307583571bl }, 19277 { 0x1442641012afd476l,0xd02e417203fe624al,0xfc394f65531c92e6l, 19278 0x16d4bf5ad4bc0b52l }, 19279 0 }, 19280 /* 41 << 72 */ 19281 { { 0xa38ac25eb4ec4f0fl,0x5399c024de72b27dl,0x08318aafd81a3d65l, 19282 0x1af227a70c20e5d9l }, 19283 { 0x6389cc9a26c54e25l,0x438298bba47dc27fl,0x75386cca1a63fa0el, 19284 0xc941e84cdf7bc1b0l }, 19285 0 }, 19286 /* 43 << 72 */ 19287 { { 0x81cad748fdfe3faal,0x752107b453ff1988l,0x8d8bb7001a8fd829l, 19288 0x69838e15ca821d8el }, 19289 { 0x24371ede3b9f6b34l,0x19b4bb24d91e1495l,0x90899ca1e598ded1l, 19290 0xbbb78b167c14e9e3l }, 19291 0 }, 19292 /* 44 << 72 */ 19293 { { 0xa577e84cbef239aal,0x656d2b6f8904b4d4l,0x2f6defe6ca4007edl, 19294 0xca6e517737770796l }, 19295 { 0x4c62fcba298b6448l,0x046849660f62e00dl,0x806c2f0390b07d82l, 19296 0x730855795e8d1e60l }, 19297 0 }, 19298 /* 45 << 72 */ 19299 { { 0x24488802f4703b78l,0x6c9323bee9eaa1e0l,0x242990e2aa94c170l, 19300 0x3292bc42a15b5886l }, 19301 { 0x60ccb5bc908af203l,0x8fd63583713b09bdl,0x40791ecad693fa28l, 19302 0xea80abf2941af8a1l }, 19303 0 }, 19304 /* 46 << 72 */ 19305 { { 0xf9c0315071145fe3l,0x80a71b55d7873a7dl,0xd134244b5e10bac7l, 19306 0x303f7e12ded3a4b4l }, 19307 { 0x58e6f17e803b7a3bl,0xcd6f64130b1ca6b4l,0x25e744ce2ce65aa2l, 19308 0xf2bbc66b952efa51l }, 19309 0 }, 19310 /* 47 << 72 */ 19311 { { 0xc8b212e75913e1f3l,0xf018ab208d416886l,0x28249e15b617cac4l, 19312 0x837fcba1693ed09al }, 19313 { 0x9c457e511c15a1bcl,0x9354758756c7f3f1l,0x1afd80348be18306l, 19314 0xa43d56982256ab14l }, 19315 0 }, 19316 /* 48 << 72 */ 19317 { { 0xce06b88210395755l,0x117ce6345ec1df80l,0xfefae513eff55e96l, 19318 0xcf36cba6fd7fed1el }, 19319 { 0x7340eca9a40ebf88l,0xe6ec1bcfb3d37e12l,0xca51b64e86bbf9ffl, 19320 0x4e0dbb588b40e05el }, 19321 0 }, 19322 /* 49 << 72 */ 19323 { { 0xf9c063f62f2be34bl,0x9ca32fa99c20f16bl,0xe02e350d0125a01al, 19324 0x62d66c54e6516c25l }, 19325 { 0x21b154ad5120bedbl,0xb1077f4e8d6ff9d8l,0xd01a46c300bb4941l, 19326 0x9d381847d1460588l }, 19327 0 }, 19328 /* 51 << 72 */ 19329 { { 0xf3a9b311581cb57bl,0x65fb3fb649727d13l,0xb8496e3d35131142l, 19330 0xf7642f554d0cdab9l }, 19331 { 0xe2f66f0e9f6d7e45l,0xbae14cedaa22fcd4l,0x1f769f0e49b2e05al, 19332 0x08c4d7784ac5191el }, 19333 0 }, 19334 /* 52 << 72 */ 19335 { { 0x86f9108ece4aa825l,0xbe5b2f317e5a5fbfl,0x2772c1b49254bb78l, 19336 0xae6cdf5f4ff8ac5cl }, 19337 { 0x106cd94bf6b7a12el,0xbe0915d6d1c7a1a5l,0x8bf6bc8d3b40ac5el, 19338 0xbb89180423ee3acal }, 19339 0 }, 19340 /* 53 << 72 */ 19341 { { 0x76f15eaa618b5ea1l,0xec1ea62e6d4ad0c8l,0x301b60c8168d57fal, 19342 0x454d5f771edbfb05l }, 19343 { 0xea888e29a936031al,0x01303d3f0174dd17l,0x8b5e06b4244254e7l, 19344 0x00ebf03509724acfl }, 19345 0 }, 19346 /* 55 << 72 */ 19347 { { 0x66ce3ded8e66d509l,0x368e38d05a488586l,0x7b9ae220c7eedf5el, 19348 0x67e9ea52bfbf9d62l }, 19349 { 0xe9cbf53d99b7ecb3l,0xfde3e8c0908bf072l,0x288400ab1107e21fl, 19350 0x24c8856256532667l }, 19351 0 }, 19352 /* 57 << 72 */ 19353 { { 0x0d5f9955ca9d3ad1l,0x545feba13a1daec0l,0xd22972016cb30f23l, 19354 0x9660175ccef6cf6el }, 19355 { 0xbf3e341a395738dcl,0x74a5efbc80f7cca4l,0xc4f9a07bbebc6a60l, 19356 0x2f1e3dad4b1f915al }, 19357 0 }, 19358 /* 59 << 72 */ 19359 { { 0xada4423f0d5e2e34l,0x2d31f4920b372358l,0xd7f469370e2d6a8cl, 19360 0xf5e7ccfe0028e4ael }, 19361 { 0x20fcb1f3928854b2l,0x2a8973c507271bf6l,0xe87de33e5fa88fe1l, 19362 0xe9af2dce7bd3c2a6l }, 19363 0 }, 19364 /* 60 << 72 */ 19365 { { 0x185a19d959d097b2l,0xb1c72a3a0dea2875l,0x3b371628f9021f08l, 19366 0x45f1255bfa9d6ac1l }, 19367 { 0x9ff36a90cfd72c0dl,0x8c7315db24fe2376l,0x9aebcde04b34d42cl, 19368 0x2129ab16923025f3l }, 19369 0 }, 19370 /* 61 << 72 */ 19371 { { 0x341b9dd714b4cf50l,0x7c6e4634d619d00el,0x571d6e2fdf2165ael, 19372 0xdedf9cd18dbe9db5l }, 19373 { 0x52a152777c5f3dc3l,0x7d27c97ef2901cf7l,0x5e098b54d02a85dfl, 19374 0x6fce3e13088e3640l }, 19375 0 }, 19376 /* 63 << 72 */ 19377 { { 0xfa95be147a939904l,0xdfcf5b9bb56365ccl,0xdbb546bdd2d66922l, 19378 0xf26a8b9cda03ca7fl }, 19379 { 0x96a8042d16821c0cl,0xe6729970e88ede60l,0xd028130d1285e303l, 19380 0x1678b01688b7de75l }, 19381 0 }, 19382 /* 64 << 72 */ 19383 { { 0x96649933aed1d1f7l,0x566eaff350563090l,0x345057f0ad2e39cfl, 19384 0x148ff65b1f832124l }, 19385 { 0x042e89d4cf94cf0dl,0x319bec84520c58b3l,0x2a2676265361aa0dl, 19386 0xc86fa3028fbc87adl }, 19387 0 }, 19388 /* 65 << 72 */ 19389 { { 0x5db4884124627d04l,0xf92740766f7e3febl,0xd09eb11773496240l, 19390 0xd48e51419a6b9ec9l }, 19391 { 0xcbb2ac97b7336e27l,0xe794fb760640bf6cl,0xc0b7f78dc7c7fa3fl, 19392 0x1355d071fd2edbb9l }, 19393 0 }, 19394 /* 71 << 72 */ 19395 { { 0x575d9724e84e25a3l,0x068690a13d4d8708l,0x8a7b1c6c54dd62d0l, 19396 0x8c45e1b37f88e231l }, 19397 { 0x38c665466d85afe2l,0x65231642e1d69f1bl,0xb71c53a090687ec1l, 19398 0xdf8469d777fb5981l }, 19399 0 }, 19400 /* 77 << 72 */ 19401 { { 0xb920b503144fe6bcl,0x54b0f0593914c130l,0x63188d5a8269b650l, 19402 0x8d7780962fc7064dl }, 19403 { 0xbf7b0eec5e50839al,0xaf8a7ddbe242cd06l,0x93df850809cecdb9l, 19404 0x4db58a72410659e9l }, 19405 0 }, 19406 /* 83 << 72 */ 19407 { { 0x460d9b383baba3cdl,0x52386e4d2cf860b8l,0xd224fe5da3924b9al, 19408 0xe4a4be7bcf14d813l }, 19409 { 0xb0759e82ed3774fdl,0x57c064b38d9b6c59l,0x301ab902aee183d0l, 19410 0xf1c873495ba207c3l }, 19411 0 }, 19412 /* 89 << 72 */ 19413 { { 0xe8245b0a6dd58696l,0x0714eedb61091043l,0x7d9874459101129bl, 19414 0x4a7f1f03a0b27a21l }, 19415 { 0x282e5cff71ee2045l,0x25c694a3da5c6b41l,0xb3d8e21f5542ca55l, 19416 0x57d64170e3601af0l }, 19417 0 }, 19418 /* 95 << 72 */ 19419 { { 0x9c8e86c6c6c4fee6l,0x70194db5a596119bl,0xfc6271d30e06050cl, 19420 0x17d94c89b15f18d2l }, 19421 { 0x76c9e9bd49817224l,0x42621638b989c5bcl,0x1e9c4cbeb769d70cl, 19422 0x85e227c3b87f2783l }, 19423 0 }, 19424 /* 101 << 72 */ 19425 { { 0x146185d2117e73c5l,0xbf6214696dc38116l,0x9af9d9b5459e72cbl, 19426 0x7512882fb3930b85l }, 19427 { 0xfe935379d36583b8l,0xb83ad35e7c7fdcdel,0x093ca0ab2658ae4bl, 19428 0xc9b16d60a756681bl }, 19429 0 }, 19430 /* 107 << 72 */ 19431 { { 0x12c24d9195d3519bl,0x1fc6db1bdb43fd06l,0x1ae49fed25bbde51l, 19432 0x27072e0b76d2827bl }, 19433 { 0xdcb92e05aeb8c47fl,0x601d414056145f67l,0xcb7002652a39e8f7l, 19434 0x6ce9facc35620d8cl }, 19435 0 }, 19436 /* 113 << 72 */ 19437 { { 0x5c428a5ebd702c22l,0xcb6863291616129dl,0xe6278994eabcb9a1l, 19438 0xb409a10b9327e540l }, 19439 { 0x6899f7cb66cf96aal,0xa9225f051c64b545l,0x00c5522ee3feec21l, 19440 0x35503728e083315cl }, 19441 0 }, 19442 /* 116 << 72 */ 19443 { { 0x1916d88cf1600077l,0x1ac9c238e3a58b2bl,0x3080df8535f3508dl, 19444 0x86cc18712744912bl }, 19445 { 0x56aec9d5ccd15044l,0x8dd9061a5db0ab17l,0x84d6bc4e2c84171dl, 19446 0xd569c7d70989a5bdl }, 19447 0 }, 19448 /* 119 << 72 */ 19449 { { 0x24446b2702af35abl,0x071710478eea4565l,0xba4989db728306e6l, 19450 0x2cd692a85954a558l }, 19451 { 0x644e02763576b32el,0x7efdb65c1f9fe65dl,0x04b2828e8796c048l, 19452 0xcfd22481187b979bl }, 19453 0 }, 19454 /* 125 << 72 */ 19455 { { 0xa10d104084ea9701l,0x27dd0dcb415e187dl,0xf667c5e939bfe45cl, 19456 0x3995e4ae55b67506l }, 19457 { 0xb25117d9b5a14801l,0xeee58525fe142e92l,0x100b856a6dbae9f1l, 19458 0xada7057629586658l }, 19459 0 }, 19460 }, 19461 { 19462 /* 0 << 80 */ 19463 { { 0x00, 0x00, 0x00, 0x00 }, 19464 { 0x00, 0x00, 0x00, 0x00 }, 19465 1 }, 19466 /* 1 << 80 */ 19467 { { 0xe4050f1cf1c367cal,0x9bc85a9bc90fbc7dl,0xa373c4a2e1a11032l, 19468 0xb64232b7ad0393a9l }, 19469 { 0xf5577eb0167dad29l,0x1604f30194b78ab2l,0x0baa94afe829348bl, 19470 0x77fbd8dd41654342l }, 19471 0 }, 19472 /* 3 << 80 */ 19473 { { 0xa2f7932c68af43eel,0x5502468e703d00bdl,0xe5dc978f2fb061f5l, 19474 0xc9a1904a28c815adl }, 19475 { 0xd3af538d470c56a4l,0x159abc5f193d8cedl,0x2a37245f20108ef3l, 19476 0xfa17081e223f7178l }, 19477 0 }, 19478 /* 4 << 80 */ 19479 { { 0x1fe2a9b2b4b4b67cl,0xc1d10df0e8020604l,0x9d64abfcbc8058d8l, 19480 0x8943b9b2712a0fbbl }, 19481 { 0x90eed9143b3def04l,0x85ab3aa24ce775ffl,0x605fd4ca7bbc9040l, 19482 0x8b34a564e2c75dfbl }, 19483 0 }, 19484 /* 5 << 80 */ 19485 { { 0x5c18acf88e2f7d90l,0xfdbf33d777be32cdl,0x0a085cd7d2eb5ee9l, 19486 0x2d702cfbb3201115l }, 19487 { 0xb6e0ebdb85c88ce8l,0x23a3ce3c1e01d617l,0x3041618e567333acl, 19488 0x9dd0fd8f157edb6bl }, 19489 0 }, 19490 /* 7 << 80 */ 19491 { { 0x516ff3a36fa6110cl,0x74fb1eb1fb93561fl,0x6c0c90478457522bl, 19492 0xcfd321046bb8bdc6l }, 19493 { 0x2d6884a2cc80ad57l,0x7c27fc3586a9b637l,0x3461baedadf4e8cdl, 19494 0x1d56251a617242f0l }, 19495 0 }, 19496 /* 9 << 80 */ 19497 { { 0x892c81a321175ec1l,0x9159a505ee018109l,0xc70130532d8be316l, 19498 0x76060c21426fa2e5l }, 19499 { 0x074d2dfc6b6f0f22l,0x9725fc64ca01a671l,0x3f6679b92770bd8el, 19500 0x8fe6604fd7c9b3fel }, 19501 0 }, 19502 /* 10 << 80 */ 19503 { { 0xce711154b6e00a84l,0xd9fe7e4224890e60l,0xd10bc6c34560988fl, 19504 0xbdc2ef526859b004l }, 19505 { 0xdcf0d868d5c890eel,0x893115e6119c47dcl,0xe97966fbee714567l, 19506 0x117813355c85aa53l }, 19507 0 }, 19508 /* 11 << 80 */ 19509 { { 0x71d530cc73204349l,0xc9df473d94a0679cl,0xc572f0014261e031l, 19510 0x9786b71f22f135fel }, 19511 { 0xed6505fa6b64e56fl,0xe2fb48e905219c46l,0x0dbec45bedf53d71l, 19512 0xd7d782f2c589f406l }, 19513 0 }, 19514 /* 13 << 80 */ 19515 { { 0x06513c8a446cd7f4l,0x158c423b906d52a6l,0x71503261c423866cl, 19516 0x4b96f57093c148eel }, 19517 { 0x5daf9cc7239a8523l,0x611b597695ac4b8bl,0xde3981db724bf7f6l, 19518 0x7e7d0f7867afc443l }, 19519 0 }, 19520 /* 15 << 80 */ 19521 { { 0x3d1ab80c8ce59954l,0x742c5a9478222ac0l,0x3ddacbf894f878ddl, 19522 0xfc085117e7d54a99l }, 19523 { 0xfb0f1dfa21e38ec2l,0x1c7b59cb16f4ff7fl,0x988752397ea888fel, 19524 0x705d270cb10dc889l }, 19525 0 }, 19526 /* 16 << 80 */ 19527 { { 0xe5aa692a87dec0e1l,0x010ded8df7b39d00l,0x7b1b80c854cfa0b5l, 19528 0x66beb876a0f8ea28l }, 19529 { 0x50d7f5313476cd0el,0xa63d0e65b08d3949l,0x1a09eea953479fc6l, 19530 0x82ae9891f499e742l }, 19531 0 }, 19532 /* 17 << 80 */ 19533 { { 0xd7c89ba1e7d1cefdl,0xcb33553a9a91e03dl,0xa01caaff59f01e54l, 19534 0x4a71c141de07def7l }, 19535 { 0xe1616a4034d467d1l,0x6f395ab2e8ba8817l,0xf781ea64e45869abl, 19536 0x8b9513bb7134f484l }, 19537 0 }, 19538 /* 19 << 80 */ 19539 { { 0x0b0ec9035948c135l,0xaee219539a990127l,0x9d15ba0eb185dda1l, 19540 0xd87bc2fb2c7d6802l }, 19541 { 0x05a480307a82d7f8l,0x7b591ce4e7e11ec3l,0x14d4cc22a0e15fdbl, 19542 0xf2d4213576def955l }, 19543 0 }, 19544 /* 21 << 80 */ 19545 { { 0xd56d69e4117a5f59l,0xcae6008a01286e97l,0x716a0a282dab13b0l, 19546 0xc821da99b3a8d2d0l }, 19547 { 0x6898b66239c305e6l,0xe42d3394c8b61142l,0x54c1d2b253b16712l, 19548 0x3cec3953a01f4be6l }, 19549 0 }, 19550 /* 23 << 80 */ 19551 { { 0x5bd1e3036951b85el,0x1a73f1fb164d79a4l,0x6e77abd39fb22bc3l, 19552 0x8ae4c181b3d18dfdl }, 19553 { 0xdd4226f5a6a14ed1l,0x620e111feb4e1d92l,0xffce6e59edca4fe8l, 19554 0x39f5fc053d0a717dl }, 19555 0 }, 19556 /* 25 << 80 */ 19557 { { 0xef8fa78cd91aff44l,0x6f3f9749bdc03be7l,0x171545f8b8596075l, 19558 0xbe31a73e2af132cel }, 19559 { 0x5b4e174123884e1dl,0x4373357ea9fa75f0l,0x8dba2731bc06f49el, 19560 0xa09aebc877fa6de8l }, 19561 0 }, 19562 /* 27 << 80 */ 19563 { { 0xd4974e518293e18cl,0x1e4cfc5331ec0e8fl,0x80b4258325d40b1el, 19564 0x5cfb73a2a85f7588l }, 19565 { 0xe553efd204c0e00bl,0xdaa6750e9a48ac39l,0xf20936b00abda06al, 19566 0xbfd3c7e4bf85771cl }, 19567 0 }, 19568 /* 28 << 80 */ 19569 { { 0x72669c3c7292495cl,0xa627e2dd82786572l,0xbdbfce5cd39c3e3dl, 19570 0xba6164927feed3d6l }, 19571 { 0x4eb5f513e77b7318l,0x133f2e834337c2e0l,0xdea20f07f408bec6l, 19572 0x848a8396e3c87655l }, 19573 0 }, 19574 /* 29 << 80 */ 19575 { { 0x3086643551138f2bl,0x1176d8e6108a36bal,0xd78b3b400d4d4b66l, 19576 0x99ddd9bd956dbff1l }, 19577 { 0x91dfe72822f08e5fl,0x7fd8cfe6a081ac4el,0x8ebb278ed75285c2l, 19578 0x2335fe00ef457ac0l }, 19579 0 }, 19580 /* 31 << 80 */ 19581 { { 0xe9d79c50f058191al,0x6749c3b05d3183f8l,0x5edc2708dbfeb1ecl, 19582 0x2c18f93621275986l }, 19583 { 0x3a093e1f0703389fl,0xdf065e4a3ef60f44l,0x6860e4df87e7c458l, 19584 0xdb22d96e8bfe4c7dl }, 19585 0 }, 19586 /* 33 << 80 */ 19587 { { 0xb7193811b48dad42l,0x23b9dca320ad0f0cl,0x55511ffb54efb61bl, 19588 0xac8ed94626f9ce42l }, 19589 { 0xa42b4bc73fc4cbd9l,0x2a4670905c6f8e39l,0xb50040f87eb592del, 19590 0x6633f81bdc2541f3l }, 19591 0 }, 19592 /* 34 << 80 */ 19593 { { 0xc104e02ed2d6d9c2l,0xa4876e870302517al,0x0263c9b2912f5005l, 19594 0x902f364a3d89d268l }, 19595 { 0x76070565bb20a5a8l,0xa3a8977452109e98l,0x51fbffec463aa476l, 19596 0xfa8519625daa1503l }, 19597 0 }, 19598 /* 35 << 80 */ 19599 { { 0xe449dd8f82a9a4f3l,0xa1a2f405797e6b36l,0x76913537787785e8l, 19600 0x0315a3cfe064481el }, 19601 { 0xc02291ee83df11e2l,0x5b59a0e9bcd178f0l,0xd5e8d10ce6b4c63al, 19602 0x9eee599f3fc60a82l }, 19603 0 }, 19604 /* 36 << 80 */ 19605 { { 0x051e589759621468l,0xb92c06327293621el,0xee17ea647762e4f2l, 19606 0x412107a771abd28cl }, 19607 { 0xa083d87bf02d65ebl,0xbd4a3f165594395el,0x1d5694337c8882f3l, 19608 0xc5eb10c55f9c63cfl }, 19609 0 }, 19610 /* 37 << 80 */ 19611 { { 0x4b196728c8e62c4el,0x03dbd04cb74a757cl,0xe960a65b8520f044l, 19612 0x9eda0f33f7937337l }, 19613 { 0x06ff0b86b6dc7dfbl,0x3bd276c11fc1ac35l,0x0e67055b1b255c27l, 19614 0xe43ae552eff899f8l }, 19615 0 }, 19616 /* 39 << 80 */ 19617 { { 0xc64c914d3b156d76l,0x784c1f61d794345dl,0xcda0c77c365d7a50l, 19618 0xcc5a1e205b32dbd0l }, 19619 { 0x2f4e78bff90b6ac0l,0xbead62f9a2d4862dl,0xa8f67e7dcc346b53l, 19620 0xa38d7ae947e59dbdl }, 19621 0 }, 19622 /* 40 << 80 */ 19623 { { 0x7dc1605d480aca4dl,0x08c37750ef263aabl,0xd5c6b7c93f166725l, 19624 0xf99982f30ff2853bl }, 19625 { 0xc61b9583a8ecb64al,0x041211a91b771741l,0x50ba64154e156f97l, 19626 0xb6595ea871b8954el }, 19627 0 }, 19628 /* 41 << 80 */ 19629 { { 0x4ae760845eb3b4eel,0xcafefdc6c62ed274l,0x4eabeacf113f790bl, 19630 0x10c2cc88a5ff64c9l }, 19631 { 0xe7b59f8a49965d80l,0xd04884b50df07712l,0x6316ac5ba5f7bab1l, 19632 0x388111d99e78a075l }, 19633 0 }, 19634 /* 43 << 80 */ 19635 { { 0x8d437128f24804efl,0x12a687dd7b71dd53l,0x8b8f71d96139a60el, 19636 0xb047fed42a095ec7l }, 19637 { 0xef238041fba59ee8l,0x61b17fac64045514l,0x45b1cf4857afa184l, 19638 0x8592c50a4bff5fc5l }, 19639 0 }, 19640 /* 44 << 80 */ 19641 { { 0x2830592394b745dcl,0x53e9ec16b09cb993l,0x59d0b57f9a134ed1l, 19642 0x89d7b439c56ee0ebl }, 19643 { 0xc3656539991e22a2l,0xd27a89372a345043l,0x55dd5341064038eel, 19644 0xc9ee3f0348cb42efl }, 19645 0 }, 19646 /* 45 << 80 */ 19647 { { 0x08518c631d56c1cbl,0x5650f79f31235521l,0x33fc08d648911017l, 19648 0xbb8b58538a0a33c8l }, 19649 { 0xb54554f2f869a62al,0x67f8cf48222457e5l,0x46e13911f276cc0dl, 19650 0x4b3a2ad6943b389el }, 19651 0 }, 19652 /* 46 << 80 */ 19653 { { 0x0e72b816b11a4c9dl,0x919b2738e9028fa4l,0xab80e1117698a5d6l, 19654 0xcd7950f56cd49adal }, 19655 { 0x0db75c908dfb13a5l,0x2178578770f12cebl,0xfab72d5243486ff6l, 19656 0x66d55d726a0673ebl }, 19657 0 }, 19658 /* 47 << 80 */ 19659 { { 0xe98014b922667519l,0x7fcab2b3a95da9c0l,0x9bdbccd8438d5060l, 19660 0xa72fff5455a726b6l }, 19661 { 0x7ae032943a5e769bl,0xf7291e9b559a0734l,0x18ae4f182ce18eeel, 19662 0x88e49f7328b7b4f0l }, 19663 0 }, 19664 /* 48 << 80 */ 19665 { { 0x90fe7a1d214aeb18l,0x1506af3c741432f7l,0xbb5565f9e591a0c4l, 19666 0x10d41a77b44f1bc3l }, 19667 { 0xa09d65e4a84bde96l,0x42f060d8f20a6a1cl,0x652a3bfdf27f9ce7l, 19668 0xb6bdb65c3b3d739fl }, 19669 0 }, 19670 /* 49 << 80 */ 19671 { { 0xc6a2923e60ef9d87l,0xac66cdd8c3a64f1cl,0x069292d26e0bb0ccl, 19672 0x9e491414451e52a0l }, 19673 { 0x2e76cedf0e0d35b3l,0x311b7ae9af682b84l,0xaa1017a02f90b176l, 19674 0xac0b43a794feb6e8l }, 19675 0 }, 19676 /* 51 << 80 */ 19677 { { 0x7ddb42f9214e82f5l,0x91c88566f67269d7l,0x1763ed8cdd0ff422l, 19678 0x045dd690ad284ddfl }, 19679 { 0x5713bbb141e48fe7l,0xdc5bef28f8eb580fl,0x4bd0b288ed2992c2l, 19680 0x436587faaf5ef2b3l }, 19681 0 }, 19682 /* 52 << 80 */ 19683 { { 0xbbc1a48d6e5822c4l,0x16c3135daacebd02l,0xd0c6c543b56157dfl, 19684 0xae249a0ef49f44a1l }, 19685 { 0x1f2c23ce72c47341l,0x8f52dc2a25974313l,0x2c99bc0a958e0e6bl, 19686 0xe57eab6b950cd492l }, 19687 0 }, 19688 /* 53 << 80 */ 19689 { { 0xea66db638934efc0l,0x7bfe479193c6f7c7l,0x78438d535ef90d99l, 19690 0xe63b87c9c665736dl }, 19691 { 0x6de32d82db49e1bbl,0xbfa877dcd0ad1648l,0xdb2e85de1197806dl, 19692 0x74e9dbd3cfee7854l }, 19693 0 }, 19694 /* 55 << 80 */ 19695 { { 0xd2c26e2edb6d7e0al,0x9103119a531009cdl,0xb5dc49869a8b9d54l, 19696 0x4781b83bb408b427l }, 19697 { 0x70d98b2ccb4ba2f7l,0x112ed5d7fa8a36b8l,0x97257bc6fdde1675l, 19698 0xd2a9c711db211cb7l }, 19699 0 }, 19700 /* 57 << 80 */ 19701 { { 0xe4aa6a06ee79fe8cl,0x06e210233dff8a54l,0x63e11ac5bf50731al, 19702 0xb8b9944f544125b8l }, 19703 { 0xcba92c41d359aeb0l,0xd201c893249bca36l,0xfe79bd77cb501216l, 19704 0x694b21488d525ba4l }, 19705 0 }, 19706 /* 59 << 80 */ 19707 { { 0x60c90e11ee3dde2al,0x7df08e17bb36c4a2l,0xb6c3210dcc5b3c17l, 19708 0xa814180955cec91cl }, 19709 { 0xf4ecbc05a8193dffl,0xf43cdef8da5744fal,0x4895a6c6f12f8a2el, 19710 0x44282692eb7b910al }, 19711 0 }, 19712 /* 60 << 80 */ 19713 { { 0x1a405e1886d6e13al,0x6a18c91827a7c67cl,0xc34877ebe127bfd7l, 19714 0x3c9fab08c098e692l }, 19715 { 0xfe2dc65bc2066586l,0xb107603a8f68a0a9l,0x74ef0ef8127cd340l, 19716 0xfe577b5b86788d87l }, 19717 0 }, 19718 /* 61 << 80 */ 19719 { { 0xdc7ff83c71234c81l,0xee48d9c6d868c82fl,0xb80bac5e37e4f365l, 19720 0x2bfbe94efcb951c2l }, 19721 { 0x55829049a374d0b0l,0x2a502cada87a5fb4l,0x0742ac9d9ee840bal, 19722 0x7689bf53eecd05b1l }, 19723 0 }, 19724 /* 63 << 80 */ 19725 { { 0x0e7f459320059c22l,0x47c273e0e49368a2l,0x5ccb960ac6946ee2l, 19726 0xd8209ec48b3271b6l }, 19727 { 0x7fd5142cdfb9e947l,0x46a89c83ff737ab1l,0xa45f6b0282d875ecl, 19728 0x19a16e0e34c296d6l }, 19729 0 }, 19730 /* 64 << 80 */ 19731 { { 0xeb5ddcb6ec7fae9fl,0x995f2714efb66e5al,0xdee95d8e69445d52l, 19732 0x1b6c2d4609e27620l }, 19733 { 0x32621c318129d716l,0xb03909f10958c1aal,0x8c468ef91af4af63l, 19734 0x162c429ffba5cdf6l }, 19735 0 }, 19736 /* 65 << 80 */ 19737 { { 0x65c93be33607927bl,0x86feaaecdae5411dl,0x4a1686c6dd2e2c3dl, 19738 0xf78200068acdf51dl }, 19739 { 0xf82c4d0239ed3e50l,0x5ac04047b4c3a4a4l,0xbdd14d7ec34b07a7l, 19740 0x9911d7027cc12db5l }, 19741 0 }, 19742 /* 71 << 80 */ 19743 { { 0x4ed5dbbd1751abc9l,0xaf374229a23cc54al,0x9b5fa66ea4ed3f9al, 19744 0xc56dd9613d380643l }, 19745 { 0x7d77897144b38021l,0xdf4712d0d3584508l,0x0018e2eecd7ab168l, 19746 0xc8a3a166293d29a7l }, 19747 0 }, 19748 /* 77 << 80 */ 19749 { { 0x34681bdb3a5a0214l,0xe188d6f1f718797el,0xaa751de7db761c5fl, 19750 0x347c50324959a5cel }, 19751 { 0x108705fc338be49cl,0x1dc5eada95abf7a8l,0xb863808f0fc3f0b7l, 19752 0x529c27c1a05c4d43l }, 19753 0 }, 19754 /* 83 << 80 */ 19755 { { 0xa75f90677f699f79l,0xd01cf9c866356f99l,0xf90f9b73fdfbaae7l, 19756 0xe0b5f4412c304d2fl }, 19757 { 0x17cbfb11807f3f57l,0xe902d542af8a9eb4l,0x3335285461f89b4al, 19758 0x3a51c54d3628c0ael }, 19759 0 }, 19760 /* 89 << 80 */ 19761 { { 0xae5fd487c704212dl,0x82dd07a565e2e32cl,0x46d4c9646c19c199l, 19762 0xe7f428593778eedcl }, 19763 { 0x084a4e9b6dcc5ec9l,0x757e04ba2d0538b7l,0x4ec0a573a3fba4cdl, 19764 0x2432a4e5c627c2fcl }, 19765 0 }, 19766 /* 95 << 80 */ 19767 { { 0xfde00b3094c8a424l,0x20a57d8cd224c232l,0xd6ace1a170019992l, 19768 0x1a648d40697e67a3l }, 19769 { 0xed1fb10691338d84l,0x828004a08372bfc8l,0xb93030fefad3bfedl, 19770 0x883dea23f27369ecl }, 19771 0 }, 19772 /* 101 << 80 */ 19773 { { 0xfbbf36a62a710d73l,0x8db834024b3cc6bbl,0xa60c47cf16d7b1fcl, 19774 0xf9778fa6cd16ce8fl }, 19775 { 0xd77023086d14a1a6l,0x01f139cb06e8247cl,0xd89af2979770b9c1l, 19776 0x94bf1ca97d9fb550l }, 19777 0 }, 19778 /* 107 << 80 */ 19779 { { 0xe17e2e6dc2d45f34l,0x5969d8ee26efc6cbl,0x6f175231b9219cfbl, 19780 0x027f333c189f1175l }, 19781 { 0x5bc60fad54f6da49l,0xc52e09af8ae5c3f3l,0x6c0e3927ed07f46dl, 19782 0xbfd9e598f39cf16bl }, 19783 0 }, 19784 /* 113 << 80 */ 19785 { { 0x9dffd95b090aefb9l,0x26db7b73637224fel,0xb78a679e92e2aa0cl, 19786 0xfc7c824ffc8f895dl }, 19787 { 0xdc8287e8e636b3a8l,0x6b3ccc0f28b7a639l,0x38e6e2cc653de56al, 19788 0x998cf6985392c3cal }, 19789 0 }, 19790 /* 116 << 80 */ 19791 { { 0xe68de79e57f0d6fal,0xe707b252ff9c06f7l,0x5613698a4a061697l, 19792 0xd83d6453b5390352l }, 19793 { 0x59b007599867c708l,0xcfe24fd7b41ea7adl,0x4692abf3da5b7de6l, 19794 0xd99a6f3bf0c54e8fl }, 19795 0 }, 19796 /* 119 << 80 */ 19797 { { 0xe8ee870dea4addc3l,0x0d1fb29559841f3el,0xdc05b5581dba2f14l, 19798 0xb8bf38324e3f4600l }, 19799 { 0x1a909e66fd57c48al,0xb65ca4c24e2d76dfl,0x0b27755ae7c60d89l, 19800 0x9fcfa75acb9003f6l }, 19801 0 }, 19802 /* 125 << 80 */ 19803 { { 0xbbbdf4c49e5325aal,0x6879fe11d0d1f281l,0x7a400f890633002el, 19804 0xc3633c779bb79ac9l }, 19805 { 0x15a4cfae93ab9bc3l,0x379bbdea42594603l,0x7c61dfa257d2af3fl, 19806 0x20190537b51bfb62l }, 19807 0 }, 19808 }, 19809 { 19810 /* 0 << 88 */ 19811 { { 0x00, 0x00, 0x00, 0x00 }, 19812 { 0x00, 0x00, 0x00, 0x00 }, 19813 1 }, 19814 /* 1 << 88 */ 19815 { { 0xa80d1db6f79588c0l,0xfa52fc69b55768ccl,0x0b4df1ae7f54438al, 19816 0x0cadd1a7f9b46a4fl }, 19817 { 0xb40ea6b31803dd6fl,0x488e4fa555eaae35l,0x9f047d55382e4e16l, 19818 0xc9b5b7e02f6e0c98l }, 19819 0 }, 19820 /* 3 << 88 */ 19821 { { 0x4b7d0e0683a7337bl,0x1e3416d4ffecf249l,0x24840eff66a2b71fl, 19822 0xd0d9a50ab37cc26dl }, 19823 { 0xe21981506fe28ef7l,0x3cc5ef1623324c7fl,0x220f3455769b5263l, 19824 0xe2ade2f1a10bf475l }, 19825 0 }, 19826 /* 4 << 88 */ 19827 { { 0x9894344f3a29467al,0xde81e949c51eba6dl,0xdaea066ba5e5c2f2l, 19828 0x3fc8a61408c8c7b3l }, 19829 { 0x7adff88f06d0de9fl,0xbbc11cf53b75ce0al,0x9fbb7accfbbc87d5l, 19830 0xa1458e267badfde2l }, 19831 0 }, 19832 /* 5 << 88 */ 19833 { { 0x03b6c8c7dacddb7dl,0x92ed50047e1edcadl,0xa0e46c2f54080633l, 19834 0xcd37663d46dec1cel }, 19835 { 0x396984c5f365b7ccl,0x294e3a2ae79bb95dl,0x9aa17d7727b1d3c1l, 19836 0x3ffd3cfae49440f5l }, 19837 0 }, 19838 /* 7 << 88 */ 19839 { { 0x26679d11399f9cf3l,0x78e7a48e1e3c4394l,0x08722dea0d98daf1l, 19840 0x37e7ed5880030ea3l }, 19841 { 0xf3731ad43c8aae72l,0x7878be95ac729695l,0x6a643affbbc28352l, 19842 0xef8b801b78759b61l }, 19843 0 }, 19844 /* 9 << 88 */ 19845 { { 0xdcdd3709b63afe75l,0xad9d7f0b3f1af8ffl,0xdd6a8045194f4beel, 19846 0x867724cc2f7d998cl }, 19847 { 0xd51d0aa5837751bel,0x21d6754a959a0658l,0xd2212611695f7e58l, 19848 0xec4b93c2297363efl }, 19849 0 }, 19850 /* 10 << 88 */ 19851 { { 0x0ac1c5fab6ef26cfl,0xcd8ba0c5a39de8eel,0x11ba7537dd7796e0l, 19852 0x1215933476d58d6dl }, 19853 { 0xf51eb76f529fda4cl,0x2fd9209ddedaa8a3l,0x555a675615efac65l, 19854 0xb784c9ca7fd42fe9l }, 19855 0 }, 19856 /* 11 << 88 */ 19857 { { 0x8165ec11b9d1a70fl,0x01347efc384f6cael,0xe95c01a0ab7aeca9l, 19858 0x459ba1c5c6c99530l }, 19859 { 0x38967a635cf3416bl,0x5c3761fd1e5457e2l,0x43e6077af03e9df6l, 19860 0xb15d34628bd1c7f6l }, 19861 0 }, 19862 /* 13 << 88 */ 19863 { { 0xad87d3db35a75c49l,0xc69d800961af03c5l,0x31aef61a3a6a6c4cl, 19864 0xb3292640aa10a993l }, 19865 { 0x959aae80aaee340fl,0xf900528e7f381a3bl,0x44ecf76e853691a3l, 19866 0xa081663ce749e68el }, 19867 0 }, 19868 /* 15 << 88 */ 19869 { { 0x4f2782136283e34al,0x6f9fcf60fbfa315fl,0x224a2ab99b701364l, 19870 0xb4b1b418f9fecadcl }, 19871 { 0xbf7280fe50ba1b9al,0x7e68259c33f36db9l,0x8ccb754e154c9fb0l, 19872 0xf281adb1db2328f1l }, 19873 0 }, 19874 /* 16 << 88 */ 19875 { { 0xf92dda31be24319al,0x03f7d28be095a8e7l,0xa52fe84098782185l, 19876 0x276ddafe29c24dbcl }, 19877 { 0x80cd54961d7a64ebl,0xe43608897f1dbe42l,0x2f81a8778438d2d5l, 19878 0x7e4d52a885169036l }, 19879 0 }, 19880 /* 17 << 88 */ 19881 { { 0xc2a950ad2d6608bel,0xab415e2a51c3c2b6l,0xffbd2a65f5c803e7l, 19882 0x3f81dc3eca908532l }, 19883 { 0x0ec47397c28c04f4l,0xf6c632e8153f58e8l,0xccac35f8efb4a6d8l, 19884 0x22a1b677ee6d7407l }, 19885 0 }, 19886 /* 19 << 88 */ 19887 { { 0x276662435243c119l,0x79cb8580e707363el,0x5bf5ebf4d01682d6l, 19888 0x8a980173762811e0l }, 19889 { 0xe2f2be1fc7547d77l,0x21a50fffb925fec6l,0x5e6cf2ef40115509l, 19890 0xb69beae18faa0fc0l }, 19891 0 }, 19892 /* 21 << 88 */ 19893 { { 0xfa147da8cec36e75l,0xba184e5a42860484l,0xe8ec25df222fb1e6l, 19894 0xce91dcb18ff8403cl }, 19895 { 0xf1b0e27ead7faa32l,0x097d881d42a3a205l,0xa8865dd43f8f56d4l, 19896 0x624d7a451aef929dl }, 19897 0 }, 19898 /* 23 << 88 */ 19899 { { 0x3db0238ad01698e8l,0xbb7186dc00306082l,0x542f4377250f830el, 19900 0x34b8a67dae438c50l }, 19901 { 0xada528a0858d8048l,0x561aa3336b57afc1l,0x8d9188e0fda35f7al, 19902 0x5838d1211dcad0c5l }, 19903 0 }, 19904 /* 25 << 88 */ 19905 { { 0x4f97d1529f17511dl,0x8b9f012776fdb9ebl,0x53a0a72d4056e6a7l, 19906 0x5ff937d64e262eeel }, 19907 { 0xaa64a8dc489fbe6dl,0xc19947dfea02bc69l,0x76f0bbb91492c9bel, 19908 0xe53881098d89cd01l }, 19909 0 }, 19910 /* 27 << 88 */ 19911 { { 0x16083309456057b7l,0x2810c08040a331f6l,0x0561656c3c166929l, 19912 0x16f0d8d6ed1c3999l }, 19913 { 0x37b6da7294697927l,0xd821c2cc23ca6c9cl,0x42ef1bdb8ca4351cl, 19914 0x7ca32bad5edfa682l }, 19915 0 }, 19916 /* 28 << 88 */ 19917 { { 0xdc1de17d98119f10l,0x74353c5d488c36a6l,0x14aaf33a3d8e23dfl, 19918 0x31e075c078baf593l }, 19919 { 0x0f7ca03a46d1ca3cl,0x99c5e3ac47b660c7l,0x70d0241388fe2e59l, 19920 0x2e9a6be12a7ec005l }, 19921 0 }, 19922 /* 29 << 88 */ 19923 { { 0x4d1f087f184252b1l,0xfd3ace273f5b49c6l,0x6e874447bbb04da2l, 19924 0x2347e3a1b3767ff0l }, 19925 { 0x990d4010f868966al,0x35320090dd658b5el,0x1105bfb974fe972al, 19926 0x3961f7dc8e7ad2c6l }, 19927 0 }, 19928 /* 31 << 88 */ 19929 { { 0x100d8b54741e3286l,0x65d9108ef3abc7afl,0x172b450620ef8fbcl, 19930 0x11bd7db2d81b8a2el }, 19931 { 0xf89210e1e8e41de5l,0x910613f3d98a868bl,0xbfc85241849aa909l, 19932 0x68a43e21c7d3a7cal }, 19933 0 }, 19934 /* 33 << 88 */ 19935 { { 0x68f891479a4f8293l,0x48262328a5eb9101l,0x7eca2a178fe218b5l, 19936 0xde6c22dbc733f768l }, 19937 { 0xde7171d108d6084dl,0xd153827a0f0f8092l,0xc7b52d8f85a9252fl, 19938 0xfa29ca3a5708b31fl }, 19939 0 }, 19940 /* 34 << 88 */ 19941 { { 0x20518ddf9e0ad7e7l,0x33d5d079e8d28b9bl,0x1149b393d13058b0l, 19942 0x708cc65586d4651dl }, 19943 { 0xd7fefaa694207435l,0xce882c0d96312f8fl,0x2fd5cb2059d091a7l, 19944 0x4533a88a0e1ece94l }, 19945 0 }, 19946 /* 35 << 88 */ 19947 { { 0xceddd9b5a59c28bcl,0xaa4808f9572e2a5dl,0x38bc191999014a1el, 19948 0x1aacefdaa6d85686l }, 19949 { 0xa59283d42a573fddl,0x84359db29c387594l,0x79994773dca3acc8l, 19950 0xe4323e7654cf7653l }, 19951 0 }, 19952 /* 36 << 88 */ 19953 { { 0xac449695241fbd6fl,0x67c9b170081c1223l,0x16868f21b56aac6fl, 19954 0x34bd8fa3f8bcb721l }, 19955 { 0x06b6bd33b6691c76l,0x6c924766381a7973l,0x6a12444ca54078dbl, 19956 0xd02e91a96d1051ccl }, 19957 0 }, 19958 /* 37 << 88 */ 19959 { { 0x512f5fb35f30b344l,0xb13ade169d516885l,0x18812e9b2b468802l, 19960 0xf15d730e6b28979al }, 19961 { 0x5015616f6889348bl,0xe0b02a0a96af0401l,0x3b02007b61204c89l, 19962 0x9ece2aa7432742a4l }, 19963 0 }, 19964 /* 39 << 88 */ 19965 { { 0xd5f7e09c7c1cc4a1l,0x313ac04218b2d854l,0xbc4fe2a04c253b10l, 19966 0x25a696a3c7080b5cl }, 19967 { 0x6de3cb6aef811877l,0x4d242fecd15f9644l,0xb9bfa2480ee6a136l, 19968 0x8122679e9c8d181el }, 19969 0 }, 19970 /* 40 << 88 */ 19971 { { 0x37e5684744ddfa35l,0x9ccfc5c5dab3f747l,0x9ac1df3f1ee96cf4l, 19972 0x0c0571a13b480b8fl }, 19973 { 0x2fbeb3d54b3a7b3cl,0x35c036695dcdbb99l,0x52a0f5dcb2415b3al, 19974 0xd57759b44413ed9al }, 19975 0 }, 19976 /* 41 << 88 */ 19977 { { 0xc2c7daec96a8d727l,0x8a11631a17f3abf9l,0x06aba65c0ae8940al, 19978 0xfca280c7873d3635l }, 19979 { 0x57496889ddb72b87l,0xaa9a3359320793d4l,0x11b6864d43120741l, 19980 0x1877cd4e51527639l }, 19981 0 }, 19982 /* 43 << 88 */ 19983 { { 0x8b35ce4e6f43dfc6l,0x4114b2fe9a19f3bfl,0x8c4af8024ffa45cal, 19984 0xa3ab5f869328b847l }, 19985 { 0x0986de3e555f30f0l,0xaae6e3eac8cb84c4l,0x2a7dcdbaa4ba01f7l, 19986 0xfa32efa729f5dc6cl }, 19987 0 }, 19988 /* 44 << 88 */ 19989 { { 0x077379c00b33d3f8l,0x421883c67064e409l,0x2d0873d76c29c8f6l, 19990 0xbfa433a3d274c0c8l }, 19991 { 0x56dc778f23a5891el,0xd663bf6535e2de04l,0x488fdb485db517cel, 19992 0x00bba55e19b226c2l }, 19993 0 }, 19994 /* 45 << 88 */ 19995 { { 0x879b30ead7260d78l,0x04954ba2eac5201fl,0x3210c0e3ff2529d1l, 19996 0x0743823488b470b3l }, 19997 { 0x8b618de48854cc0dl,0x98270d5e35b795eel,0x0e47d651aa33ca37l, 19998 0x77d75fda1e87d0cfl }, 19999 0 }, 20000 /* 46 << 88 */ 20001 { { 0x789dbe987803fbf9l,0x940589aa17ede316l,0x032902bd85a1988cl, 20002 0x43cbc0031c47f7f0l }, 20003 { 0xc6ff73714709148fl,0x769957122d9b8a5el,0xb4520e462597b70el, 20004 0x00d19f39f67ff3b8l }, 20005 0 }, 20006 /* 47 << 88 */ 20007 { { 0xe2dfcef9b159f403l,0xe8e9e8d8855644afl,0x2796247163fa1068l, 20008 0x400e992a968a5400l }, 20009 { 0xe2b9d29f56e563c1l,0xed66759c2885fabfl,0x788b6263750abdffl, 20010 0x30adb00d6cbbdcacl }, 20011 0 }, 20012 /* 48 << 88 */ 20013 { { 0x1fe647d83d30a2c5l,0x0857f77ef78a81dcl,0x11d5a334131a4a9bl, 20014 0xc0a94af929d393f5l }, 20015 { 0xbc3a5c0bdaa6ec1al,0xba9fe49388d2d7edl,0xbb4335b4bb614797l, 20016 0x991c4d6872f83533l }, 20017 0 }, 20018 /* 49 << 88 */ 20019 { { 0x5548d3423fa17b28l,0x38587952823ee731l,0x8ee9b90a0a28bcd1l, 20020 0xcfc029bf6676917el }, 20021 { 0x7e08306d2a212358l,0x66a9488dc88a66bcl,0x7a09db327d7c9e65l, 20022 0x20eaf4e72cbc1790l }, 20023 0 }, 20024 /* 51 << 88 */ 20025 { { 0xb3095b491f2a9605l,0x7cfc4205f72691c7l,0x1544bf964d889b90l, 20026 0xdc44d20ba0bbae7al }, 20027 { 0xee369b670b1f0b23l,0xf3ec25e818a7bdcbl,0xf614ab5df47ecf65l, 20028 0x4869762f80a4a09dl }, 20029 0 }, 20030 /* 52 << 88 */ 20031 { { 0xedbbeee78a058fb6l,0xb9d19ddcfb09121al,0xa41bb45bd34dddcel, 20032 0x2dbc80b900964bc4l }, 20033 { 0x4ed9137d1d6cb654l,0x1b9016db483d01c5l,0x5fc501bc6528e22el, 20034 0xb2d2f8816cad646bl }, 20035 0 }, 20036 /* 53 << 88 */ 20037 { { 0xb57aa72a89043e56l,0x8fbca2435c5319fdl,0xe66aef43b13ce900l, 20038 0x2c7c3927c3382934l }, 20039 { 0x434d9104a835fdf5l,0x419470b81b3b85bel,0xeaec374abeb4d448l, 20040 0x26a53b51f33cda51l }, 20041 0 }, 20042 /* 55 << 88 */ 20043 { { 0x421f1725bb1db793l,0x20214d4f558c94a9l,0x3371233b7696092cl, 20044 0x774d3fcb1902ab0el }, 20045 { 0x4ce223ded149aecel,0x174b260e33057bc7l,0xdf70cfa3f6effee4l, 20046 0x3d8cd01f80880678l }, 20047 0 }, 20048 /* 57 << 88 */ 20049 { { 0x32db21862e59985cl,0x448865abaa1b39e1l,0x250ce79cd89fe98dl, 20050 0x962710e763e3fb10l }, 20051 { 0xa8fc70561ac10e3el,0x9eed208fa3b132fbl,0xf499d638937051f5l, 20052 0x27acf7ec21a9f78fl }, 20053 0 }, 20054 /* 59 << 88 */ 20055 { { 0x148e572a4c7b445el,0xdc10a0214dc95a4fl,0xe60e9c2e02237869l, 20056 0xbfdfcb3aa393c3a4l }, 20057 { 0x8b799db211a64cf0l,0x1ca865ea2e16f59fl,0x865441fbd3a17e46l, 20058 0x23315b9753409692l }, 20059 0 }, 20060 /* 60 << 88 */ 20061 { { 0x5e76fb2f286bad39l,0xbad9efe39dcad1e2l,0x60e75190edc7e904l, 20062 0x6a6f063e0fecb5a5l }, 20063 { 0x5150ed85aed8acc3l,0xb56ccfbc6d20af6cl,0x7e0d1e982c69dbfal, 20064 0xabf5628a7c7e10a9l }, 20065 0 }, 20066 /* 61 << 88 */ 20067 { { 0xb84af2c00df6d61fl,0x02c651c52acbaf4bl,0xfb605754afaaa0bfl, 20068 0xa03f5257dff61017l }, 20069 { 0x9e3ffb1672762093l,0x4f9a5da0c4f40bd3l,0x37dce5220d26f8e1l, 20070 0x260f736fc06a1a07l }, 20071 0 }, 20072 /* 63 << 88 */ 20073 { { 0xb92aba79b1077d55l,0xc52f81081a42f5f5l,0x9913f04f86e5aa99l, 20074 0x6814b0b1f3c7f504l }, 20075 { 0xb7d61fd34d354bdal,0xf27926e39581d25el,0x97724001c2dc21adl, 20076 0x835778231d5c4788l }, 20077 0 }, 20078 /* 64 << 88 */ 20079 { { 0x77b868cee978a1d3l,0xe3a68b337ab92d04l,0x5102979487a5b862l, 20080 0x5f0606c33a61d41dl }, 20081 { 0x2814be276f9326f1l,0x2f521c14c6fe3c2el,0x17464d7dacdf7351l, 20082 0x10f5f9d3777f7e44l }, 20083 0 }, 20084 /* 65 << 88 */ 20085 { { 0x53857462ff9727a2l,0xe6870e7dc68488e7l,0x276da72808c79656l, 20086 0x1308eb61d86c24ebl }, 20087 { 0x34c43a84db0a3e56l,0x03961b5525335a59l,0xf9bc2d5805689d86l, 20088 0xfa4d3c01eb29d6d6l }, 20089 0 }, 20090 /* 71 << 88 */ 20091 { { 0xd07dac3037d10ffal,0xb2b0a0fd8bef0a79l,0xa2e804510ec02505l, 20092 0xf256c18962f55f5fl }, 20093 { 0x0ca3f9b10b39f4f0l,0x7bf4e1cf3bb7c8e9l,0x7a8a43f8ee11f227l, 20094 0x2ad8431a3e4056ebl }, 20095 0 }, 20096 /* 77 << 88 */ 20097 { { 0xb8cf71ed031c1871l,0x702431806f703102l,0x9a87e1c24ec6f1b0l, 20098 0xf7e6e5b4664f275dl }, 20099 { 0xc70a8b4e8c76b505l,0x6ba69bf2a002e9cfl,0x33ed74f7a0d8c9bfl, 20100 0x17f5f4b18d9989del }, 20101 0 }, 20102 /* 83 << 88 */ 20103 { { 0xcd116dcb1b13a4a1l,0x591adb831c369877l,0x697be1aca6b8e80bl, 20104 0xb2d4baa1b975d781l }, 20105 { 0xd4a9a496b16b48e7l,0x64de2d7af293997dl,0x039ae039af09a492l, 20106 0x66e31a2665f3a485l }, 20107 0 }, 20108 /* 89 << 88 */ 20109 { { 0x110a8a42fec01a53l,0x1f5fcc1b38affab8l,0x757310ca9941a19el, 20110 0x11ef95f76c29d6cbl }, 20111 { 0x0756bdb22dd427bal,0x8de8d44af3e16c33l,0xf9d28355e25aec52l, 20112 0xeb761efc02f36465l }, 20113 0 }, 20114 /* 95 << 88 */ 20115 { { 0xfc83bf7454bfcd7al,0x51d861794837b6bel,0x8165b3f9801a324dl, 20116 0x3a5972bc634cfd61l }, 20117 { 0xeecfe6d825258ed6l,0x51d968df1451ced0l,0x3010cdb8316aa0ael, 20118 0xc295b8522900eaf2l }, 20119 0 }, 20120 /* 101 << 88 */ 20121 { { 0x5ad434a3890cc798l,0x4c17ff5e1531bce4l,0x825b5b5a5ea8e26fl, 20122 0xacca9d5dd66fd7b3l }, 20123 { 0xb647dbde37ae6f92l,0xa5594868f3600416l,0x7b90ac53ab0c5d63l, 20124 0x4b66ad7ceb43e1d0l }, 20125 0 }, 20126 /* 107 << 88 */ 20127 { { 0x04a211fac09ccbffl,0x9c96ad9ee873d898l,0x9eb1deb69c481f86l, 20128 0xb3616ce8b2d70298l }, 20129 { 0x67a6fe9b9073726dl,0x5b8aa37d4c9bf744l,0xf558603ebb6aa0efl, 20130 0x72767f5103d304fbl }, 20131 0 }, 20132 /* 113 << 88 */ 20133 { { 0x787cb8b8d6e9b7e3l,0x8bb30222e079fc68l,0x651a2ea6e3145a0bl, 20134 0x0254c5da9ab18fa8l }, 20135 { 0x83722ffc12e1611fl,0xb0ddf1ffa7cc61bel,0x7c9c7e10ac0ac8d7l, 20136 0x8241a8191da12218l }, 20137 0 }, 20138 /* 116 << 88 */ 20139 { { 0x70bb7719bc407e6el,0x231328efd84ceb41l,0x8bca6a1fc104bb20l, 20140 0xd6f4e425280b9071l }, 20141 { 0xb41b95a292896a82l,0x735cf435fa34df67l,0xbc331a08d9d6d769l, 20142 0x579786052682747el }, 20143 0 }, 20144 /* 119 << 88 */ 20145 { { 0x048ba499eb3af9a9l,0x43a8c367d50b82cel,0xedf9e2b21e0724d9l, 20146 0x3098aab3d607140bl }, 20147 { 0xd1f18f1e5ed49eb9l,0xf9c6bb6ae0bb02a2l,0x204f96aa0cd245ddl, 20148 0xdaadaf4afb011ed5l }, 20149 0 }, 20150 /* 125 << 88 */ 20151 { { 0xb298ce2de50404b1l,0x04dd38c45bf9b581l,0x229deabdfada51e8l, 20152 0x74bd233f8788a132l }, 20153 { 0x951ba5ecf03e6c30l,0x9da2f5aa45bf1a41l,0x6bec7fea7e52b860l, 20154 0x76e3778964b0a9ddl }, 20155 0 }, 20156 }, 20157 { 20158 /* 0 << 96 */ 20159 { { 0x00, 0x00, 0x00, 0x00 }, 20160 { 0x00, 0x00, 0x00, 0x00 }, 20161 1 }, 20162 /* 1 << 96 */ 20163 { { 0x4fe7ee31b0e63d34l,0xf4600572a9e54fabl,0xc0493334d5e7b5a4l, 20164 0x8589fb9206d54831l }, 20165 { 0xaa70f5cc6583553al,0x0879094ae25649e5l,0xcc90450710044652l, 20166 0xebb0696d02541c4fl }, 20167 0 }, 20168 /* 3 << 96 */ 20169 { { 0xb99f0e0399375235l,0x7614c847b9917970l,0xfec93ce9524ec067l, 20170 0xe40e7bf89b122520l }, 20171 { 0xb5670631ee4c4774l,0x6f03847a3b04914cl,0xc96e9429dc9dd226l, 20172 0x43489b6c8c57c1f8l }, 20173 0 }, 20174 /* 4 << 96 */ 20175 { { 0x0e299d23fe67ba66l,0x9145076093cf2f34l,0xf45b5ea997fcf913l, 20176 0x5be008438bd7dddal }, 20177 { 0x358c3e05d53ff04dl,0xbf7ccdc35de91ef7l,0xad684dbfb69ec1a0l, 20178 0x367e7cf2801fd997l }, 20179 0 }, 20180 /* 5 << 96 */ 20181 { { 0x46ffd227cc2338fbl,0x89ff6fa990e26153l,0xbe570779331a0076l, 20182 0x43d241c506e1f3afl }, 20183 { 0xfdcdb97dde9b62a3l,0x6a06e984a0ae30eal,0xc9bf16804fbddf7dl, 20184 0x170471a2d36163c4l }, 20185 0 }, 20186 /* 7 << 96 */ 20187 { { 0x361619e455950cc3l,0xc71d665c56b66bb8l,0xea034b34afac6d84l, 20188 0xa987f832e5e4c7e3l }, 20189 { 0xa07427727a79a6a7l,0x56e5d017e26d6c23l,0x7e50b97638167e10l, 20190 0xaa6c81efe88aa84el }, 20191 0 }, 20192 /* 9 << 96 */ 20193 { { 0x473959d74d325bbfl,0x2a61beec8d6114b9l,0x25672a94924be2eel, 20194 0xa48595dbf2c23d0cl }, 20195 { 0xe476848b6a221838l,0xe743e69a35c1b673l,0x2ab42499d8468503l, 20196 0x62aa0054e9e90ba7l }, 20197 0 }, 20198 /* 10 << 96 */ 20199 { { 0x358d13f1bc482911l,0x685d1971b7fa7f26l,0x3e67a51d2be1aee4l, 20200 0xe041850998d114a9l }, 20201 { 0x59639f604e052561l,0x32075c49155d0818l,0x2aa2343b67b64b1cl, 20202 0x1b445e2967f53e6al }, 20203 0 }, 20204 /* 11 << 96 */ 20205 { { 0xbdfb271773a904e0l,0x7ce1e40b28888d73l,0x2e7e35f6eaa97d1bl, 20206 0xd061772aa9afa097l }, 20207 { 0x434ac7c47a1f7c59l,0x6e21124ae79b7b9al,0x055acff3bb22ecc7l, 20208 0x8bfd7ac984c858d3l }, 20209 0 }, 20210 /* 13 << 96 */ 20211 { { 0x2fd57df59f1f68adl,0x5ddcc6dbb06470c8l,0x801b6451a9b47307l, 20212 0x6b51c8e376551bf4l }, 20213 { 0xef0bd1f7d44e1da9l,0x714bcb1d4d4e600cl,0xc57bb9e40c6540c7l, 20214 0x71bd1ec2327cc644l }, 20215 0 }, 20216 /* 15 << 96 */ 20217 { { 0x9a52cf7e7f4dd81fl,0xa0132be15e69c05el,0x90dab7472a0f4d72l, 20218 0xc142f911312d6706l }, 20219 { 0xe8d3631f8261998bl,0xf0f42fae615c1c94l,0x2f4e948caec3fa5dl, 20220 0x242ae7a8a374101el }, 20221 0 }, 20222 /* 16 << 96 */ 20223 { { 0x0f893a5dc8de610bl,0xe8c515fb67e223cel,0x7774bfa64ead6dc5l, 20224 0x89d20f95925c728fl }, 20225 { 0x7a1e0966098583cel,0xa2eedb9493f2a7d7l,0x1b2820974c304d4al, 20226 0x0842e3dac077282dl }, 20227 0 }, 20228 /* 17 << 96 */ 20229 { { 0x1fa878cad088be52l,0x89c2cb07a9e1e656l,0x385bc5c3219d62dbl, 20230 0xd82b676b5fda2752l }, 20231 { 0x2449dc9ee304eafcl,0x1e9e7991632f4ea2l,0x3036e061cdd5e0b9l, 20232 0x75a6f6ff830825bcl }, 20233 0 }, 20234 /* 19 << 96 */ 20235 { { 0xb10fcddc449dedb4l,0x2c890042d1244acfl,0x9b3072cac7fc7017l, 20236 0x1acda6859ce8063fl }, 20237 { 0xd243313c7f51e2f5l,0x52a3f1a4d73d9578l,0xda785b7a64f0ce6el, 20238 0x2e766315442a4c2dl }, 20239 0 }, 20240 /* 21 << 96 */ 20241 { { 0x94f9b004151f111al,0xc7a5035b07dbc5fal,0x53958ea7609e49d7l, 20242 0x0526b4d79013f4c0l }, 20243 { 0x66de5ebb593e2fbdl,0x6e7cf8b44c2e0c37l,0x6f72fc8b8c983e78l, 20244 0x6fab9b632348f9d7l }, 20245 0 }, 20246 /* 23 << 96 */ 20247 { { 0xc748a3526a3d8468l,0x3fab479927e38032l,0x91ad3629fa430ce7l, 20248 0xc5af0b2c71614c44l }, 20249 { 0xcede3fa50c211611l,0x6e6889ba02338083l,0xee0a195977f0fe32l, 20250 0x01ea905d0f4bbc5al }, 20251 0 }, 20252 /* 25 << 96 */ 20253 { { 0x12cfb25e8193db48l,0xddb4ae633bea708cl,0xdaae102ef181f821l, 20254 0x9d9d923024a089d9l }, 20255 { 0x71c4122da0876aeal,0x1a63ea3bbbe19c09l,0x3b898076016f8d0cl, 20256 0xa5cccc5daea6b713l }, 20257 0 }, 20258 /* 27 << 96 */ 20259 { { 0xc3f22baf4a8e2f61l,0x77d29ede176da6a6l,0x40a55f211607da63l, 20260 0x858b38561452e391l }, 20261 { 0x0dd3c267fe1b3c56l,0x66c04bdd7d55227al,0xfbd2fe55e6404e09l, 20262 0x5981cf49ea9cfcbcl }, 20263 0 }, 20264 /* 28 << 96 */ 20265 { { 0xe549237f78890732l,0xc443bef953fcb4d9l,0x9884d8a6eb3480d6l, 20266 0x8a35b6a13048b186l }, 20267 { 0xb4e4471665e9a90al,0x45bf380d653006c0l,0x8f3f820d4fe9ae3bl, 20268 0x244a35a0979a3b71l }, 20269 0 }, 20270 /* 29 << 96 */ 20271 { { 0xae46a902aea870afl,0xa9b9fcf57cbedc99l,0x74f2ca3f79b7e793l, 20272 0xadb8f2231dbeeb28l }, 20273 { 0x6302060e6764df85l,0x363320d257ebd554l,0xd9fd573e798d22e1l, 20274 0x285f85f5ebb67dedl }, 20275 0 }, 20276 /* 31 << 96 */ 20277 { { 0xd86b329211caa2b5l,0x2a26258e39337bd1l,0x4dc5a9b579c8c291l, 20278 0x16443d87741942e6l }, 20279 { 0x6bc9a2f8f811400cl,0x819c69359eeb4e0el,0xe1be7273ce0c214bl, 20280 0x429afb8184b61581l }, 20281 0 }, 20282 /* 33 << 96 */ 20283 { { 0xb37e188756af5812l,0xd662bdb485aff83el,0xc89742d07bc63de7l, 20284 0xea103f9d0279f487l }, 20285 { 0x4d26916a3a6cc639l,0x4eea3a3c7c743b94l,0x6a3e0dc7007376d9l, 20286 0xdb6ef3cf573f904el }, 20287 0 }, 20288 /* 34 << 96 */ 20289 { { 0x9b1058ecb0b0fb53l,0x8955f5f75f8a9a9fl,0xf5f92e7f9f6f9e6dl, 20290 0x03f5df6c50ec198bl }, 20291 { 0x6c8741f2b8aedbcel,0x8f4e60cfed8018f7l,0x6ca5297c9fa01f89l, 20292 0x8591cf7a864995dbl }, 20293 0 }, 20294 /* 35 << 96 */ 20295 { { 0xa126147eb0a11b9bl,0xeedcc9e198900232l,0x15d94f8c2bead119l, 20296 0x042423cfefc38691l }, 20297 { 0x6ce86fbe77165d91l,0xa07732126b3fd565l,0x8cdc409150b1f9c7l, 20298 0x7f5ad1af064595acl }, 20299 0 }, 20300 /* 36 << 96 */ 20301 { { 0xed374a6658926dddl,0x138b2d49908015b8l,0x886c6579de1f7ab8l, 20302 0x888b9aa0c3020b7al }, 20303 { 0xd3ec034e3a96e355l,0xba65b0b8f30fbe9al,0x064c8e50ff21367al, 20304 0x1f508ea40b04b46el }, 20305 0 }, 20306 /* 37 << 96 */ 20307 { { 0x73644c158f8402a0l,0x0d9b5354f4730eb9l,0x78542af4e94cc278l, 20308 0xf4dbede3e395f33al }, 20309 { 0x8fe8cbc590c70b00l,0x9c35bb2d7db197f6l,0x229b4973e6599746l, 20310 0x0817d04e1a84b986l }, 20311 0 }, 20312 /* 39 << 96 */ 20313 { { 0x8ffe34e95ecd09b3l,0x6a7c3de4153b7cael,0xf02713e4a81044b7l, 20314 0x85ca6158c70545c8l }, 20315 { 0xd3ff392845d88bffl,0x3a251a07f0bafe89l,0x61290e1287cea7f4l, 20316 0xa360a17efa4808adl }, 20317 0 }, 20318 /* 40 << 96 */ 20319 { { 0x98561a49747c866cl,0xbbb1e5fe0518a062l,0x20ff4e8becdc3608l, 20320 0x7f55cded20184027l }, 20321 { 0x8d73ec95f38c85f0l,0x5b589fdf8bc3b8c3l,0xbe95dd980f12b66fl, 20322 0xf5bd1a090e338e01l }, 20323 0 }, 20324 /* 41 << 96 */ 20325 { { 0x2d1751083edf4e2bl,0x30e6e90fa29c10d0l,0xfee1eb14c9c6ccd2l, 20326 0x244670c756a81453l }, 20327 { 0x90b33eefc5185c22l,0xd77ae4b63db82d28l,0xce5ee034f228f940l, 20328 0x5d7660847bb47be5l }, 20329 0 }, 20330 /* 43 << 96 */ 20331 { { 0x88b7eec499b9a8c6l,0x56048d9e14e8ef0cl,0xa18f93215c89cf78l, 20332 0xbd2087616d327e66l }, 20333 { 0x5b187225d9e53e27l,0xa57ca6c7bf4d0317l,0x187731d2e9557736l, 20334 0xd4ce2f78a874982el }, 20335 0 }, 20336 /* 44 << 96 */ 20337 { { 0x65163ae55e915918l,0x6158d6d986f8a46bl,0x8466b538eeebf99cl, 20338 0xca8761f6bca477efl }, 20339 { 0xaf3449c29ebbc601l,0xef3b0f41e0c3ae2fl,0xaa6c577d5de63752l, 20340 0xe916660164682a51l }, 20341 0 }, 20342 /* 45 << 96 */ 20343 { { 0xf5b602bb29f47deal,0x42853c9659ddd679l,0x5c25be4041d7c001l, 20344 0x8e069399d4a3b307l }, 20345 { 0x1782152e736ce467l,0x2e264109c9cb4f08l,0xf900cb11ab124698l, 20346 0x1bbed1d02d6e05b1l }, 20347 0 }, 20348 /* 46 << 96 */ 20349 { { 0x9cc3fedc7da08b1fl,0x0f44949361d5ed38l,0xc8cbc4209b991b6bl, 20350 0xee62a342891c42e1l }, 20351 { 0x11c496bb1a179139l,0x94ece2892eac4d8el,0x35f303a5a98d5570l, 20352 0x69d4340514a31552l }, 20353 0 }, 20354 /* 47 << 96 */ 20355 { { 0x29d45e50892dfcbal,0x653e613e5c30cee3l,0x7b8c1ae61868a348l, 20356 0x40ab51654f2c612al }, 20357 { 0x56e977f9891cdc8cl,0xee1ca12a34ca7cd1l,0xa4e283ee17b5ddf8l, 20358 0x4e36f2fb6f536205l }, 20359 0 }, 20360 /* 48 << 96 */ 20361 { { 0x5a3097befc15aa1el,0x40d12548b54b0745l,0x5bad4706519a5f12l, 20362 0xed03f717a439dee6l }, 20363 { 0x0794bb6c4a02c499l,0xf725083dcffe71d2l,0x2cad75190f3adcafl, 20364 0x7f68ea1c43729310l }, 20365 0 }, 20366 /* 49 << 96 */ 20367 { { 0xa3834d85e89ea13fl,0x2ca00f942db803bbl,0x0f378681400ed3dal, 20368 0x1028af6b54854da3l }, 20369 { 0x3928c2da06400c7fl,0x21119785d82aac92l,0x06618c17724e4af0l, 20370 0x22b42b161470736bl }, 20371 0 }, 20372 /* 51 << 96 */ 20373 { { 0x7d0cfd48f7f2ac65l,0x46e1ac705f641b60l,0x0ab9566a0fcf0137l, 20374 0xbd4380e0db460fb8l }, 20375 { 0x4550efbf6db99b55l,0x33846e669764b744l,0xacffa0cae34ca007l, 20376 0xce642d6a077e646cl }, 20377 0 }, 20378 /* 52 << 96 */ 20379 { { 0xe747c8c7b7ffd977l,0xec104c3580761a22l,0x8395ebaf5a3ffb83l, 20380 0xfb3261f4e4b63db7l }, 20381 { 0x53544960d883e544l,0x13520d708cc2eeb8l,0x08f6337bd3d65f99l, 20382 0x83997db2781cf95bl }, 20383 0 }, 20384 /* 53 << 96 */ 20385 { { 0xd89112c47d8037a3l,0xcba48ad3464c2025l,0x3afea8399814a09dl, 20386 0x69e52260269030b5l }, 20387 { 0x5b7067365c674805l,0x8c3fd33d87343f56l,0xc572c858b1c61edfl, 20388 0x43d8f4ded06749cbl }, 20389 0 }, 20390 /* 55 << 96 */ 20391 { { 0x04da1f06b4066003l,0xf7d4e52f372749e8l,0x56cd667114b38747l, 20392 0x1943a22a22eb6d9el }, 20393 { 0xc2c5391990714b0al,0xb6e3abb7d13cf3ael,0xfcd8d671676115cbl, 20394 0x178ce1a0c06a0d3al }, 20395 0 }, 20396 /* 57 << 96 */ 20397 { { 0x94485b36913508f8l,0x92f87fe36de83b42l,0xedd476f0ed77e666l, 20398 0xee90fbc68da2cf53l }, 20399 { 0x6f4afc53fc6cf3d9l,0x231bceb9f21f6ecfl,0x6504a11d494c6e9cl, 20400 0xd3728f032c211461l }, 20401 0 }, 20402 /* 59 << 96 */ 20403 { { 0x09a9b93799562ca2l,0xb7d5c5cf6a5a5aa8l,0x52f5d7b9987b219dl, 20404 0x33849f9ec38014d4l }, 20405 { 0x299adaf628f23880l,0x738ecc8874875588l,0x39d707adca2af665l, 20406 0xc8c11f688f4c5f73l }, 20407 0 }, 20408 /* 60 << 96 */ 20409 { { 0x68e4f15e9afdfb3cl,0x49a561435bdfb6dfl,0xa9bc1bd45f823d97l, 20410 0xbceb5970ea111c2al }, 20411 { 0x366b455fb269bbc4l,0x7cd85e1ee9bc5d62l,0xc743c41c4f18b086l, 20412 0xa4b4099095294fb9l }, 20413 0 }, 20414 /* 61 << 96 */ 20415 { { 0x2ae046d66aa34757l,0x34db1addaa6d7e9dl,0x2b4b7e017ccf432bl, 20416 0xfbe0bfa590d319c6l }, 20417 { 0xfb2981687ec7a7f2l,0x346cc46004f5132el,0x782b2e53b40aceddl, 20418 0x402e1d64e3f0b8b9l }, 20419 0 }, 20420 /* 63 << 96 */ 20421 { { 0x2aa3b21d25a56088l,0xae6ee57543d08962l,0x669e42bff1e22297l, 20422 0x7b4c635732e3a47al }, 20423 { 0x22b16260ea464a25l,0xad8ca59072d5cd7al,0x7c244266104eb96al, 20424 0x1def95e28e7c11d2l }, 20425 0 }, 20426 /* 64 << 96 */ 20427 { { 0x9c7c581d26ee8382l,0xcf17dcc5359d638el,0xee8273abb728ae3dl, 20428 0x1d112926f821f047l }, 20429 { 0x1149847750491a74l,0x687fa761fde0dfb9l,0x2c2580227ea435abl, 20430 0x6b8bdb9491ce7e3fl }, 20431 0 }, 20432 /* 65 << 96 */ 20433 { { 0x1f04524cdc27e1f7l,0xa0c74f61572eab14l,0xdd5d0cfced272074l, 20434 0x95533c1d5bfe4f65l }, 20435 { 0x3039d57ecce817cal,0x029967d73b822082l,0x9fca43866c4a10d3l, 20436 0xf8b2a7f0bb4968ebl }, 20437 0 }, 20438 /* 71 << 96 */ 20439 { { 0x933cd6dcbfbf6407l,0xd08f21504be673f8l,0x0e1c4d0db1140a2el, 20440 0x0502a092431b270al }, 20441 { 0x5d99f9508768c00al,0xda3ce5079b3ff3c7l,0x1c648b75031c11abl, 20442 0x5e3de47bf2776305l }, 20443 0 }, 20444 /* 77 << 96 */ 20445 { { 0xe22af9274d2b9de4l,0xf3690f55a69609ecl,0x20260a6e453fbe18l, 20446 0x8edcb46b42d0b085l }, 20447 { 0xd4ef250b7d9c7f58l,0x5e8578dfc83c3433l,0x9751d9b9e46e320al, 20448 0xb02bd03cf3c58af6l }, 20449 0 }, 20450 /* 83 << 96 */ 20451 { { 0x0ab299ede1b4d1ccl,0x22e7301cec4d18d2l,0xf2380f2a7b86d4ffl, 20452 0xca19ef9e40753713l }, 20453 { 0x52bb0d24678c38a1l,0xcc9d6fd499001c02l,0xa2dd6b00bc5876e4l, 20454 0xfe04b402409fe2b3l }, 20455 0 }, 20456 /* 89 << 96 */ 20457 { { 0x7db986b1ff69f8d3l,0x648865e59d6266b9l,0x7ccfe96183f7dae5l, 20458 0x0f59a8bd6828379bl }, 20459 { 0xad97e5ef0ac7c4e8l,0xa75914be784e9c18l,0x053e015bb18c1bb8l, 20460 0x18f6cefcb347043el }, 20461 0 }, 20462 /* 95 << 96 */ 20463 { { 0xb4d641bdf257c38al,0xadcea4d0c1372574l,0x7f8d20be71c8f0d0l, 20464 0x14a1d24c41dc6344l }, 20465 { 0xe446054e41f35526l,0x4664213823c952ddl,0xfbde483401f6b0acl, 20466 0xc89eee66d75b6318l }, 20467 0 }, 20468 /* 101 << 96 */ 20469 { { 0x700242937a087392l,0xd42bd3aad5da04del,0xee64cb5b1f803414l, 20470 0xd6341ecbbab52988l }, 20471 { 0x7ad522f343170a74l,0x5fba22536d61d9del,0x230304c1e845a6e5l, 20472 0xd69feabfbc9e326bl }, 20473 0 }, 20474 /* 107 << 96 */ 20475 { { 0xef7e49412e8a11d7l,0x4cb8963662c8bae1l,0xecc741198aad5816l, 20476 0x13490782c7af5175l }, 20477 { 0x10c701f73e91a604l,0xcb8c6c7124cc30c1l,0xce0d479c071eb382l, 20478 0xa3dc71fb058087d4l }, 20479 0 }, 20480 /* 113 << 96 */ 20481 { { 0xec368492541eb6d1l,0x567735d6e09a94abl,0xb8039ec172350329l, 20482 0x3bd83a8f4894ddafl }, 20483 { 0x740ef2a39c07063dl,0xba25e72277da7b59l,0xb09e248e3bf42e82l, 20484 0x7ff36da0b017d037l }, 20485 0 }, 20486 /* 116 << 96 */ 20487 { { 0xca80416651b8d9a3l,0x42531bc90ffb0db1l,0x72ce4718aa82e7cel, 20488 0x6e199913df574741l }, 20489 { 0xd5f1b13dd5d36946l,0x8255dc65f68f0194l,0xdc9df4cd8710d230l, 20490 0x3453c20f138c1988l }, 20491 0 }, 20492 /* 119 << 96 */ 20493 { { 0x913f23b9ed08ac04l,0x18e336643590d098l,0xd3f72934e67536dcl, 20494 0xf949a757ec7ecde9l }, 20495 { 0x37fc6583cf9cbd37l,0xcbe62cc043b1228el,0x777124948a743274l, 20496 0x3ea3668c716ce6f1l }, 20497 0 }, 20498 /* 125 << 96 */ 20499 { { 0xc89ce010a90d375bl,0x39ac669340503fe3l,0x9036f782d33ecb0el, 20500 0x5190656841fdc7d1l }, 20501 { 0xbefd136e917d94cdl,0x05fea2f22a511b24l,0x80e62d76f9076e0cl, 20502 0x8c57635e418ba653l }, 20503 0 }, 20504 }, 20505 { 20506 /* 0 << 104 */ 20507 { { 0x00, 0x00, 0x00, 0x00 }, 20508 { 0x00, 0x00, 0x00, 0x00 }, 20509 1 }, 20510 /* 1 << 104 */ 20511 { { 0x20d3c982cf7d62d2l,0x1f36e29d23ba8150l,0x48ae0bf092763f9el, 20512 0x7a527e6b1d3a7007l }, 20513 { 0xb4a89097581a85e3l,0x1f1a520fdc158be5l,0xf98db37d167d726el, 20514 0x8802786e1113e862l }, 20515 0 }, 20516 /* 3 << 104 */ 20517 { { 0xf6e894d1f4c6b6ecl,0x526b082718b3cd9bl,0x73f952a812117fbfl, 20518 0x2be864b011945bf5l }, 20519 { 0x86f18ea542099b64l,0x2770b28a07548ce2l,0x97390f28295c1c9cl, 20520 0x672e6a43cb5206c3l }, 20521 0 }, 20522 /* 4 << 104 */ 20523 { { 0xc37c7dd0c55c4496l,0xa6a9635725bbabd2l,0x5b7e63f2add7f363l, 20524 0x9dce37822e73f1dfl }, 20525 { 0xe1e5a16ab2b91f71l,0xe44898235ba0163cl,0xf2759c32f6e515adl, 20526 0xa5e2f1f88615eecfl }, 20527 0 }, 20528 /* 5 << 104 */ 20529 { { 0xcacce2c847c64367l,0x6a496b9f45af4ec0l,0x2a0836f36034042cl, 20530 0x14a1f3900b6c62eal }, 20531 { 0xe7fa93633ef1f540l,0xd323b30a72a76d93l,0xffeec8b50feae451l, 20532 0x4eafc172bd04ef87l }, 20533 0 }, 20534 /* 7 << 104 */ 20535 { { 0xe4435a51b3e59b89l,0x136139554133a1c9l,0x87f46973440bee59l, 20536 0x714710f800c401e4l }, 20537 { 0xc0cf4bced6c446c9l,0xe0aa7fd66c4d5368l,0xde5d811afc68fc37l, 20538 0x61febd72b7c2a057l }, 20539 0 }, 20540 /* 9 << 104 */ 20541 { { 0x27375fe665f837e2l,0x93f8c68bd882179fl,0x584feadc59b16187l, 20542 0xe5b50be9483bc162l }, 20543 { 0x7ad9d6f1a2776625l,0xe9d1008004ff457bl,0x5b56d322677618a6l, 20544 0x036694eae3e68673l }, 20545 0 }, 20546 /* 10 << 104 */ 20547 { { 0x6ca4f87e822e37bel,0x73f237b4253bda4el,0xf747f3a241190aebl, 20548 0xf06fa36f804cf284l }, 20549 { 0x0a6bbb6efc621c12l,0x5d624b6440b80ec6l,0x4b0724257ba556f3l, 20550 0x7fa0c3543e2d20a8l }, 20551 0 }, 20552 /* 11 << 104 */ 20553 { { 0x6feaffc51d8a4fd1l,0x59663b205f1ad208l,0xefc93cef24acb46al, 20554 0x54929de05967118cl }, 20555 { 0x885708009acffb1cl,0x492bbf2b145639ecl,0x71f495a638f0018el, 20556 0xe24365dbc2792847l }, 20557 0 }, 20558 /* 13 << 104 */ 20559 { { 0x4bedae86a6f29002l,0x7abedb56e034457al,0x8bf3eec6179bff2al, 20560 0x9d626d57390f4e6bl }, 20561 { 0x653fe0e914dd6ea3l,0x7483715989bd6d08l,0x85fb05b4ebd9b03dl, 20562 0x7dc3f2214a768bbcl }, 20563 0 }, 20564 /* 15 << 104 */ 20565 { { 0xaacc63f132b0ed8fl,0x041237242bafefd2l,0x0df9a7987e2d2a13l, 20566 0x09bd13cf9c27591fl }, 20567 { 0xaa5f5e476e1afb50l,0xcd146a42b66eb646l,0x3f07561d1442ec3cl, 20568 0x7e5471738ae8ec47l }, 20569 0 }, 20570 /* 16 << 104 */ 20571 { { 0x8de2b7bc453cadd6l,0x203900a7bc0bc1f8l,0xbcd86e47a6abd3afl, 20572 0x911cac128502effbl }, 20573 { 0x2d550242ec965469l,0x0e9f769229e0017el,0x633f078f65979885l, 20574 0xfb87d4494cf751efl }, 20575 0 }, 20576 /* 17 << 104 */ 20577 { { 0x2c3e61196c0c6cd5l,0x5e01a49a99f4aac8l,0xfa518fc92ef1565el, 20578 0xf64ff8714f772366l }, 20579 { 0x52fcbc2b726420d0l,0x30fbf6eb76cfa9eel,0x0bd17139fa618268l, 20580 0x23ed6e122087535dl }, 20581 0 }, 20582 /* 19 << 104 */ 20583 { { 0x76098e38bb4ccb2cl,0x44e88aeeafbad6d1l,0x5c4d286771928778l, 20584 0xb1df868138534c94l }, 20585 { 0x67eb8f4d77ce9debl,0x2a86d0461a77c55dl,0xc327181e46a6a3e7l, 20586 0x68fd611b8710e206l }, 20587 0 }, 20588 /* 21 << 104 */ 20589 { { 0xc093f3fc0c82bdf1l,0x21db25894f76c4a6l,0xf3dcb22ee410a7ael, 20590 0x1db37114f3c22ffel }, 20591 { 0x9bd0a1fb58f6801dl,0x2cab103bd1b55cc8l,0x2ae1a7f5077ba4b2l, 20592 0x82b46642ce5ab2b3l }, 20593 0 }, 20594 /* 23 << 104 */ 20595 { { 0xc8477ec52546684cl,0xe3f9387702ff02b5l,0xefb72133ae5d04cdl, 20596 0x644905c339f10d02l }, 20597 { 0x1750c87c13d8d356l,0x0e9b8063b41e7640l,0xc7ece04f5647b05bl, 20598 0x89a43da7ca9df9c4l }, 20599 0 }, 20600 /* 25 << 104 */ 20601 { { 0x02610ef1920eb7d9l,0x34bd2fc2e1ea1dc0l,0xcb89da255170b890l, 20602 0xaaa2796461cff827l }, 20603 { 0xc308c9d37103ed6al,0xe82d63d5a467564al,0x94c897c4a0fa7732l, 20604 0x75eb52fa64c7aa5fl }, 20605 0 }, 20606 /* 27 << 104 */ 20607 { { 0x52582f9cb985fcb6l,0xaaef8d9f8508a691l,0x494c2c346e505131l, 20608 0x6d062362d55f30f6l }, 20609 { 0x70059e9122e1e32fl,0x1507c3fe9e51abb0l,0xd8aba31b2b7bda72l, 20610 0x5acbc5f77b753f13l }, 20611 0 }, 20612 /* 28 << 104 */ 20613 { { 0x15bfb8bf5116f937l,0x7c64a586c1268943l,0x71e25cc38419a2c8l, 20614 0x9fd6b0c48335f463l }, 20615 { 0x4bf0ba3ce8ee0e0el,0x6f6fba60298c21fal,0x57d57b39ae66bee0l, 20616 0x292d513022672544l }, 20617 0 }, 20618 /* 29 << 104 */ 20619 { { 0x075dc81953952ff6l,0xd4d9eeda20b7384dl,0x8a81c1bfd2d6c6a5l, 20620 0x319368a0db050f3bl }, 20621 { 0x91f476de31f1cee2l,0x1b38604500d0e17fl,0xed2081889a820384l, 20622 0x8d00c411a0f1a637l }, 20623 0 }, 20624 /* 31 << 104 */ 20625 { { 0xb029b687a47fd8f0l,0xa531360696371a05l,0x7b84e88c5ab09140l, 20626 0x87dad7c85eeb1d14l }, 20627 { 0xef0749b9d0edf6f3l,0x29fc7310e2ef198bl,0x01e05df5069ed399l, 20628 0x121db4ecdf4e2fcal }, 20629 0 }, 20630 /* 33 << 104 */ 20631 { { 0xe730f3f62826bee0l,0xb9bdbe3fce332a8fl,0x1ecad11766ec00aal, 20632 0x7503d835617a62d1l }, 20633 { 0x9f34e161b862b139l,0xde42194cf30f6a67l,0x5037a953c1e879fel, 20634 0x62f321f89bda45dbl }, 20635 0 }, 20636 /* 34 << 104 */ 20637 { { 0xe87771d8033f2876l,0xb0186ec67d5cc3dbl,0x58e8bb803bc9bc1dl, 20638 0x4d1395cc6f6ef60el }, 20639 { 0xa73c62d6186244a0l,0x918e5f23110a5b53l,0xed4878ca741b7eabl, 20640 0x3038d71adbe03e51l }, 20641 0 }, 20642 /* 35 << 104 */ 20643 { { 0xcbdba27c40234d55l,0x24352b6cb3eb56c9l,0xae681b85a8e9295al, 20644 0x2a6cfba1f1171664l }, 20645 { 0x49f045838ca40c3cl,0xe56da25c6eb0f8eal,0x8e62f86fc4341a4el, 20646 0x7f68bdc64c3f947fl }, 20647 0 }, 20648 /* 36 << 104 */ 20649 { { 0x840204b7a93c3246l,0x21ab6069a0b9b4cdl,0xf5fa6e2bb1d64218l, 20650 0x1de6ad0ef3d56191l }, 20651 { 0x570aaa88ff1929c7l,0xc6df4c6b640e87b5l,0xde8a74f2c65f0cccl, 20652 0x8b972fd5e6f6cc01l }, 20653 0 }, 20654 /* 37 << 104 */ 20655 { { 0x862013c00bf22173l,0xfd004c834acd8e23l,0x50e422ca310b1649l, 20656 0xe6d04de65bbe1854l }, 20657 { 0x651f646385761ef3l,0x3b17d38652cf85c9l,0xbdce284a5f54ecc7l, 20658 0x72efcd3ec7c2106cl }, 20659 0 }, 20660 /* 39 << 104 */ 20661 { { 0x34324b182ff07e3el,0x29938f38f50bcb71l,0xd0e3d7b977e2bcc3l, 20662 0x8e78f007c0a3292bl }, 20663 { 0xfa28c530005c2c00l,0x6f9c21d51faa0c5al,0x3df01abd7b9c78f3l, 20664 0x0e5618c1ccaaeb7el }, 20665 0 }, 20666 /* 40 << 104 */ 20667 { { 0xaa6778fce7560b90l,0xb4073e61a7e824cel,0xff0d693cd642eba8l, 20668 0x7ce2e57a5dccef38l }, 20669 { 0x89c2c7891df1ad46l,0x83a06922098346fdl,0x2d715d72da2fc177l, 20670 0x7b6dd71d85b6cf1dl }, 20671 0 }, 20672 /* 41 << 104 */ 20673 { { 0x4601a6a492ad3889l,0xdc8e3364d9a0709fl,0x0c687f2b2c260327l, 20674 0xe882af62e1a79573l }, 20675 { 0x0cfd00ab945d9017l,0xe6df7505d0e3c188l,0xb389a66dbde825a2l, 20676 0x126d77b6bcd8e14fl }, 20677 0 }, 20678 /* 43 << 104 */ 20679 { { 0xc800acc7db18ec73l,0x0ebecc78d86e99efl,0x675796cdbd05bc5fl, 20680 0x254498126afd7c7fl }, 20681 { 0x96293b695969b165l,0xd8514d83c162c8dal,0xe174f8b674a15a5cl, 20682 0x880d687389a2f73cl }, 20683 0 }, 20684 /* 44 << 104 */ 20685 { { 0x53703a328300129fl,0x1f63766268c43bfdl,0xbcbd191300e54051l, 20686 0x812fcc627bf5a8c5l }, 20687 { 0x3f969d5f29fb85dal,0x72f4e00a694759e8l,0x426b6e52790726b7l, 20688 0x617bbc873bdbb209l }, 20689 0 }, 20690 /* 45 << 104 */ 20691 { { 0xf536f07cad1deb2el,0x2a13a11ea87a710el,0x0ce2ccab64f4dc96l, 20692 0x16178694f5a55464l }, 20693 { 0x1496168da2cb3986l,0xb079a5b9d56a93a9l,0x97005e99092893d3l, 20694 0x55df5ed6e8fcc6c3l }, 20695 0 }, 20696 /* 46 << 104 */ 20697 { { 0x511f8bb997aee317l,0x812a4096e81536a8l,0x137dfe593ac09b9bl, 20698 0x0682238fba8c9a7al }, 20699 { 0x7072ead6aeccb4bdl,0x6a34e9aa692ba633l,0xc82eaec26fff9d33l, 20700 0xfb7535121d4d2b62l }, 20701 0 }, 20702 /* 47 << 104 */ 20703 { { 0x821dca8bbf328b1cl,0x24596ddd5a3d6830l,0x061c4c15635b5b4cl, 20704 0x0e2b3bef4fa3560al }, 20705 { 0xffced37498906c43l,0x10ebd174e26b3784l,0x7cd068c470039bb5l, 20706 0xc47dda0f88404e59l }, 20707 0 }, 20708 /* 48 << 104 */ 20709 { { 0x1a0445ff1d7aadabl,0x65d38260d5f6a67cl,0x6e62fb0891cfb26fl, 20710 0xef1e0fa55c7d91d6l }, 20711 { 0x47e7c7ba33db72cdl,0x017cbc09fa7c74b2l,0x3c931590f50a503cl, 20712 0xcac54f60616baa42l }, 20713 0 }, 20714 /* 49 << 104 */ 20715 { { 0x7ad7d13569185235l,0x19771949fb69e030l,0xd4de9717bc45fb4fl, 20716 0x5657b076167e5739l }, 20717 { 0x9503a71fdd27449el,0xfa2fabf73cc01347l,0xf8ecef24c83fb301l, 20718 0x527012bd5a8d5078l }, 20719 0 }, 20720 /* 51 << 104 */ 20721 { { 0x70a550d7e6fc3a32l,0x8e5875841951fe57l,0x5e6d43eaaab9788bl, 20722 0x1e406fed80599794l }, 20723 { 0xd8164ace9ed2557cl,0xf9648f30ff593e10l,0x53af2fd80c2ff879l, 20724 0x6705993cc9409bf4l }, 20725 0 }, 20726 /* 52 << 104 */ 20727 { { 0x04b005b6c6458293l,0x36bb5276e8d10af7l,0xacf2dc138ee617b8l, 20728 0x470d2d35b004b3d4l }, 20729 { 0x06790832feeb1b77l,0x2bb75c3985657f9cl,0xd70bd4edc0f60004l, 20730 0xfe797ecc219b018bl }, 20731 0 }, 20732 /* 53 << 104 */ 20733 { { 0xeca02ebf0ef19ceel,0xac691fbe2de090a4l,0x1f3866641b374547l, 20734 0xbd8018c6a12ee85fl }, 20735 { 0x3e851318ee63e0f1l,0x45b0c37a161987d3l,0x67fe36056eb567c4l, 20736 0x07c291b563200c5bl }, 20737 0 }, 20738 /* 55 << 104 */ 20739 { { 0xc85535ac1a956a8al,0x7bf4d70bc0ade321l,0xaf2efc48237bc56fl, 20740 0xf9bfe13e31ba97e7l }, 20741 { 0x2ca5fac4cf7c6c65l,0xc23b14ff03ec3e35l,0xc5109923217bcfd2l, 20742 0xf02f96a1c58f32f3l }, 20743 0 }, 20744 /* 57 << 104 */ 20745 { { 0x3b1f715b0d0aeff4l,0xbe406d62f0d44536l,0xe413843d567bcb38l, 20746 0x75b7fb43791e705al }, 20747 { 0x5b831d4b224f85e5l,0x3fea6659d9a35eael,0xd6f8bd097c85480bl, 20748 0x2a9561a34a959267l }, 20749 0 }, 20750 /* 59 << 104 */ 20751 { { 0x4a96a3535a303c10l,0x9aa3ad71c37c8d7el,0x4e2d077fde52014fl, 20752 0x4d8bec5df8e3964dl }, 20753 { 0xda88ab94e865e142l,0x52df506d10a88091l,0x9aebff0092fc38a2l, 20754 0xdfc034395608b0a2l }, 20755 0 }, 20756 /* 60 << 104 */ 20757 { { 0xee23fa819966e7eel,0x64ec4aa805b7920dl,0x2d44462d2d90aad4l, 20758 0xf44dd195df277ad5l }, 20759 { 0x8d6471f1bb46b6a1l,0x1e65d313fd885090l,0x33a800f513a977b4l, 20760 0xaca9d7210797e1efl }, 20761 0 }, 20762 /* 61 << 104 */ 20763 { { 0xb1557be2a4ea787el,0x59324973019f667fl,0x262ceced5595367cl, 20764 0x8a676897ec598640l }, 20765 { 0x2df6cebfc7f06f4fl,0xb255723138078f9al,0xad553c46524a0dd1l, 20766 0xe20bb20a5a68d62al }, 20767 0 }, 20768 /* 63 << 104 */ 20769 { { 0x6f47e3779589e263l,0x7cb83e3d35106bb8l,0x2642d87bcc632fc2l, 20770 0x4d18f34d8b77eb36l }, 20771 { 0x7de6bf6d19ca4d1cl,0x438e8f02f7e926aal,0xb539021250ac930al, 20772 0xe34ddfc15b219a9fl }, 20773 0 }, 20774 /* 64 << 104 */ 20775 { { 0x98857ceb1bf4581cl,0xe635e186aca7b166l,0x278ddd22659722acl, 20776 0xa0903c4c1db68007l }, 20777 { 0x366e458948f21402l,0x31b49c14b96abda2l,0x329c4b09e0403190l, 20778 0x97197ca3d29f43fel }, 20779 0 }, 20780 /* 65 << 104 */ 20781 { { 0xfe4de13781479db4l,0x307331f012f08ea5l,0x7f59a64758c04c13l, 20782 0x6b41189abdc9b3c9l }, 20783 { 0xb10f11e5a6f8c5edl,0x757fb7a3f5b0579el,0x456d0a873c90d027l, 20784 0x7e8bb6bf32361796l }, 20785 0 }, 20786 /* 71 << 104 */ 20787 { { 0x6aa1dc6c9e689d8dl,0xaa5fa015479cdd09l,0x7eb4dbb582fc000al, 20788 0x4a57b689eff4e701l }, 20789 { 0x7bfe8d2a8e15cd8cl,0xab109b1cc9074e1al,0x5716715fee1619a5l, 20790 0xf29a51eccdcb40bcl }, 20791 0 }, 20792 /* 77 << 104 */ 20793 { { 0x14c76234ddf03c6el,0xdfb5d388baeb2eddl,0x4bd85da26d413d2dl, 20794 0x5b0dd9be3ae38469l }, 20795 { 0xe4d8a9d89ab3ae61l,0xb9e37b880ee63951l,0x17f08e9b21a7f30fl, 20796 0x173db1e8119af788l }, 20797 0 }, 20798 /* 83 << 104 */ 20799 { { 0x2352ad4a170d43f6l,0x098d74f65a0ae4b0l,0x290f5236c3a46c2al, 20800 0xea9266102dd87e7fl }, 20801 { 0xd7ee90f6848e6911l,0xebe8f4cce0d8886fl,0xa2038320558ff6a0l, 20802 0x1f716534f37c38cfl }, 20803 0 }, 20804 /* 89 << 104 */ 20805 { { 0x9754209439a4a159l,0xe6135412fed24278l,0xbba62254d70e2cabl, 20806 0x4ac6a8ac85895130l }, 20807 { 0xc01614fee1a45363l,0x720ad3f8b67294f2l,0x724ea95cb420ea51l, 20808 0x1f40ab2d712b856cl }, 20809 0 }, 20810 /* 95 << 104 */ 20811 { { 0x708e1c7975f3d30cl,0x423f1535e2172da3l,0x7a29be342a06a0b1l, 20812 0x9de5c9eb32c68ba2l }, 20813 { 0x70217b0232d48793l,0x3cf3855bac1471cfl,0x6762d03f8321e179l, 20814 0x06ee12ea236fa7cfl }, 20815 0 }, 20816 /* 101 << 104 */ 20817 { { 0x1718e7428779109bl,0x6188008d0aca350bl,0xbbe227e00594bc15l, 20818 0x4a7b6423ddbdea35l }, 20819 { 0x06ad632dfa44e1bfl,0xaf9c163d1e97b409l,0x64dafec3c61f2b2fl, 20820 0xc6759d905525c0c9l }, 20821 0 }, 20822 /* 107 << 104 */ 20823 { { 0x76d6294787517149l,0x2bda339baa77d325l,0x04b1bec067ad1fd1l, 20824 0x49f63fcc0aec7c73l }, 20825 { 0x005cb459ec1bf494l,0x8fa99c1b1ec6f8bbl,0x70a4e6d78b59dd43l, 20826 0xfd70bcb313d6594dl }, 20827 0 }, 20828 /* 113 << 104 */ 20829 { { 0x2987a7cb13966c11l,0x74ad0a26a783f283l,0xf011200ae54d27f0l, 20830 0xbd8632963fb38396l }, 20831 { 0x7ec7fe8c9b86d059l,0xfa94ca76d0cd33a7l,0xf6ad741cdc646993l, 20832 0x83054a427ebc34e9l }, 20833 0 }, 20834 /* 116 << 104 */ 20835 { { 0xadef8c5a192ef710l,0x88afbd4b3b7431f9l,0x7e1f740764250c9el, 20836 0x6e31318db58bec07l }, 20837 { 0xfd4fc4b824f89b4el,0x65a5dd8848c36a2al,0x4f1eccfff024baa7l, 20838 0x22a21cf2cba94650l }, 20839 0 }, 20840 /* 119 << 104 */ 20841 { { 0x7b45865478f39754l,0xcbb8b96c4564e003l,0xb492d2bf69b35752l, 20842 0x4e6287e065ee5ad3l }, 20843 { 0x07906c14eb1ffe62l,0xf350390c681fcdf8l,0xc351386f6be3eec3l, 20844 0x8480d00ee5df919dl }, 20845 0 }, 20846 /* 125 << 104 */ 20847 { { 0x399861ecf8a2d5aal,0xb179adeb046f78cbl,0x056a6cd88792f647l, 20848 0xd3dfc91c3d411820l }, 20849 { 0x4ccf92d179693be1l,0x12ecd9a3f65cb250l,0x58e5d2102538b9e7l, 20850 0x4e655882ff977ccal }, 20851 0 }, 20852 }, 20853 { 20854 /* 0 << 112 */ 20855 { { 0x00, 0x00, 0x00, 0x00 }, 20856 { 0x00, 0x00, 0x00, 0x00 }, 20857 1 }, 20858 /* 1 << 112 */ 20859 { { 0x8ce9b6bfc360e25al,0xe6425195075a1a78l,0x9dc756a8481732f4l, 20860 0x83c0440f5432b57al }, 20861 { 0xc670b3f1d720281fl,0x2205910ed135e051l,0xded14b0edb052be7l, 20862 0x697b3d27c568ea39l }, 20863 0 }, 20864 /* 3 << 112 */ 20865 { { 0x0b89de9314092ebbl,0xf17256bd428e240cl,0xcf89a7f393d2f064l, 20866 0x4f57841ee1ed3b14l }, 20867 { 0x4ee14405e708d855l,0x856aae7203f1c3d0l,0xc8e5424fbdd7eed5l, 20868 0x3333e4ef73ab4270l }, 20869 0 }, 20870 /* 4 << 112 */ 20871 { { 0x3bc77adedda492f8l,0xc11a3aea78297205l,0x5e89a3e734931b4cl, 20872 0x17512e2e9f5694bbl }, 20873 { 0x5dc349f3177bf8b6l,0x232ea4ba08c7ff3el,0x9c4f9d16f511145dl, 20874 0xccf109a333b379c3l }, 20875 0 }, 20876 /* 5 << 112 */ 20877 { { 0xe75e7a88a1f25897l,0x7ac6961fa1b5d4d8l,0xe3e1077308f3ed5cl, 20878 0x208a54ec0a892dfbl }, 20879 { 0xbe826e1978660710l,0x0cf70a97237df2c8l,0x418a7340ed704da5l, 20880 0xa3eeb9a908ca33fdl }, 20881 0 }, 20882 /* 7 << 112 */ 20883 { { 0xb4323d588434a920l,0xc0af8e93622103c5l,0x667518ef938dbf9al, 20884 0xa184307383a9cdf2l }, 20885 { 0x350a94aa5447ab80l,0xe5e5a325c75a3d61l,0x74ba507f68411a9el, 20886 0x10581fc1594f70c5l }, 20887 0 }, 20888 /* 9 << 112 */ 20889 { { 0x5aaa98a7cb0c9c8cl,0x75105f3081c4375cl,0xceee50575ef1c90fl, 20890 0xb31e065fc23a17bfl }, 20891 { 0x5364d275d4b6d45al,0xd363f3ad62ec8996l,0xb5d212394391c65bl, 20892 0x84564765ebb41b47l }, 20893 0 }, 20894 /* 10 << 112 */ 20895 { { 0x20d18ecc37107c78l,0xacff3b6b570c2a66l,0x22f975d99bd0d845l, 20896 0xef0a0c46ba178fa0l }, 20897 { 0x1a41965176b6028el,0xc49ec674248612d4l,0x5b6ac4f27338af55l, 20898 0x06145e627bee5a36l }, 20899 0 }, 20900 /* 11 << 112 */ 20901 { { 0x33e95d07e75746b5l,0x1c1e1f6dc40c78bel,0x967833ef222ff8e2l, 20902 0x4bedcf6ab49180adl }, 20903 { 0x6b37e9c13d7a4c8al,0x2748887c6ddfe760l,0xf7055123aa3a5bbcl, 20904 0x954ff2257bbb8e74l }, 20905 0 }, 20906 /* 13 << 112 */ 20907 { { 0x4e23ca446d3fea55l,0xb4ae9c86f4810568l,0x47bfb91b2a62f27dl, 20908 0x60deb4c9d9bac28cl }, 20909 { 0xa892d8947de6c34cl,0x4ee682594494587dl,0x914ee14e1a3f8a5bl, 20910 0xbb113eaa28700385l }, 20911 0 }, 20912 /* 15 << 112 */ 20913 { { 0xef9dc899a7b56eafl,0x00c0e52c34ef7316l,0x5b1e4e24fe818a86l, 20914 0x9d31e20dc538be47l }, 20915 { 0x22eb932d3ed68974l,0xe44bbc087c4e87c4l,0x4121086e0dde9aefl, 20916 0x8e6b9cff134f4345l }, 20917 0 }, 20918 /* 16 << 112 */ 20919 { { 0x96892c1f711b0eb9l,0xb905f2c8780ab954l,0xace26309a20792dbl, 20920 0xec8ac9b30684e126l }, 20921 { 0x486ad8b6b40a2447l,0x60121fc19fe3fb24l,0x5626fccf1a8e3b3fl, 20922 0x4e5686226ad1f394l }, 20923 0 }, 20924 /* 17 << 112 */ 20925 { { 0xda7aae0d196aa5a1l,0xe0df8c771041b5fbl,0x451465d926b318b7l, 20926 0xc29b6e557ab136e9l }, 20927 { 0x2c2ab48b71148463l,0xb5738de364454a76l,0x54ccf9a05a03abe4l, 20928 0x377c02960427d58el }, 20929 0 }, 20930 /* 19 << 112 */ 20931 { { 0x90e4f7c92d7d1413l,0x67e2d6b59834f597l,0x4fd4f4f9a808c3e8l, 20932 0xaf8237e0d5281ec1l }, 20933 { 0x25ab5fdc84687ceel,0xc5ded6b1a5b26c09l,0x8e4a5aecc8ea7650l, 20934 0x23b73e5c14cc417fl }, 20935 0 }, 20936 /* 21 << 112 */ 20937 { { 0xb4293fdcf50225f9l,0xc52e175cb0e12b03l,0xf649c3bad0a8bf64l, 20938 0x745a8fefeb8ae3c6l }, 20939 { 0x30d7e5a358321bc3l,0xb1732be70bc4df48l,0x1f217993e9ea5058l, 20940 0xf7a71cde3e4fd745l }, 20941 0 }, 20942 /* 23 << 112 */ 20943 { { 0xa188b2502d0f39aal,0x622118bb15a85947l,0x2ebf520ffde0f4fal, 20944 0xa40e9f294860e539l }, 20945 { 0x7b6a51eb22b57f0fl,0x849a33b97e80644al,0x50e5d16f1cf095fel, 20946 0xd754b54eec55f002l }, 20947 0 }, 20948 /* 25 << 112 */ 20949 { { 0xcd821dfb988baf01l,0xe6331a7ddbb16647l,0x1eb8ad33094cb960l, 20950 0x593cca38c91bbca5l }, 20951 { 0x384aac8d26567456l,0x40fa0309c04b6490l,0x97834cd6dab6c8f6l, 20952 0x68a7318d3f91e55fl }, 20953 0 }, 20954 /* 27 << 112 */ 20955 { { 0xc7bfd486605daaa6l,0x46fd72b7bb9a6c9el,0xe4847fb1a124fb89l, 20956 0x75959cbda2d8ffbcl }, 20957 { 0x42579f65c8a588eel,0x368c92e6b80b499dl,0xea4ef6cd999a5df1l, 20958 0xaa73bb7f936fe604l }, 20959 0 }, 20960 /* 28 << 112 */ 20961 { { 0xf347a70d6457d188l,0x86eda86b8b7a388bl,0xb7cdff060ccd6013l, 20962 0xbeb1b6c7d0053fb2l }, 20963 { 0x0b02238799240a9fl,0x1bbb384f776189b2l,0x8695e71e9066193al, 20964 0x2eb5009706ffac7el }, 20965 0 }, 20966 /* 29 << 112 */ 20967 { { 0x0654a9c04a7d2caal,0x6f3fb3d1a5aaa290l,0x835db041ff476e8fl, 20968 0x540b8b0bc42295e4l }, 20969 { 0xa5c73ac905e214f5l,0x9a74075a56a0b638l,0x2e4b1090ce9e680bl, 20970 0x57a5b4796b8d9afal }, 20971 0 }, 20972 /* 31 << 112 */ 20973 { { 0x2a2bfa7f650006f0l,0xdfd7dad350c0fbb2l,0x92452495ccf9ad96l, 20974 0x183bf494d95635f9l }, 20975 { 0x02d5df434a7bd989l,0x505385cca5431095l,0xdd98e67dfd43f53el, 20976 0xd61e1a6c500c34a9l }, 20977 0 }, 20978 /* 33 << 112 */ 20979 { { 0x41d85ea1ef74c45bl,0x2cfbfa66ae328506l,0x98b078f53ada7da9l, 20980 0xd985fe37ec752fbbl }, 20981 { 0xeece68fe5a0148b4l,0x6f9a55c72d78136dl,0x232dccc4d2b729cel, 20982 0xa27e0dfd90aafbc4l }, 20983 0 }, 20984 /* 34 << 112 */ 20985 { { 0x9647445212b4603el,0xa876c5516b706d14l,0xdf145fcf69a9d412l, 20986 0xe2ab75b72d479c34l }, 20987 { 0x12df9a761a23ff97l,0xc61389925d359d10l,0x6e51c7aefa835f22l, 20988 0x69a79cb1c0fcc4d9l }, 20989 0 }, 20990 /* 35 << 112 */ 20991 { { 0xf57f350d594cc7e1l,0x3079ca633350ab79l,0x226fb6149aff594al, 20992 0x35afec026d59a62bl }, 20993 { 0x9bee46f406ed2c6el,0x58da17357d939a57l,0x44c504028fd1797el, 20994 0xd8853e7c5ccea6cal }, 20995 0 }, 20996 /* 36 << 112 */ 20997 { { 0x4065508da35fcd5fl,0x8965df8c495ccaebl,0x0f2da85012e1a962l, 20998 0xee471b94c1cf1cc4l }, 20999 { 0xcef19bc80a08fb75l,0x704958f581de3591l,0x2867f8b23aef4f88l, 21000 0x8d749384ea9f9a5fl }, 21001 0 }, 21002 /* 37 << 112 */ 21003 { { 0x1b3855378c9049f4l,0x5be948f37b92d8b6l,0xd96f725db6e2bd6bl, 21004 0x37a222bc958c454dl }, 21005 { 0xe7c61abb8809bf61l,0x46f07fbc1346f18dl,0xfb567a7ae87c0d1cl, 21006 0x84a461c87ef3d07al }, 21007 0 }, 21008 /* 39 << 112 */ 21009 { { 0x3ab3d5afbd76e195l,0x478dd1ad6938a810l,0x6ffab3936ee3d5cbl, 21010 0xdfb693db22b361e4l }, 21011 { 0xf969449651dbf1a7l,0xcab4b4ef08a2e762l,0xe8c92f25d39bba9al, 21012 0x850e61bcf1464d96l }, 21013 0 }, 21014 /* 40 << 112 */ 21015 { { 0xb7e830e3dc09508bl,0xfaf6d2cf74317655l,0x72606cebdf690355l, 21016 0x48bb92b3d0c3ded6l }, 21017 { 0x65b754845c7cf892l,0xf6cd7ac9d5d5f01fl,0xc2c30a5996401d69l, 21018 0x91268650ed921878l }, 21019 0 }, 21020 /* 41 << 112 */ 21021 { { 0x380bf913b78c558fl,0x43c0baebc8afdaa9l,0x377f61d554f169d3l, 21022 0xf8da07e3ae5ff20bl }, 21023 { 0xb676c49da8a90ea8l,0x81c1ff2b83a29b21l,0x383297ac2ad8d276l, 21024 0x3001122fba89f982l }, 21025 0 }, 21026 /* 43 << 112 */ 21027 { { 0xbbe1e6a6c93f72d6l,0xd5f75d12cad800eal,0xfa40a09fe7acf117l, 21028 0x32c8cdd57581a355l }, 21029 { 0x742219927023c499l,0xa8afe5d738ec3901l,0x5691afcba90e83f0l, 21030 0x41bcaa030b8f8eacl }, 21031 0 }, 21032 /* 44 << 112 */ 21033 { { 0xe38b5ff98d2668d5l,0x0715281a7ad81965l,0x1bc8fc7c03c6ce11l, 21034 0xcbbee6e28b650436l }, 21035 { 0x06b00fe80cdb9808l,0x17d6e066fe3ed315l,0x2e9d38c64d0b5018l, 21036 0xab8bfd56844dcaefl }, 21037 0 }, 21038 /* 45 << 112 */ 21039 { { 0x42894a59513aed8bl,0xf77f3b6d314bd07al,0xbbdecb8f8e42b582l, 21040 0xf10e2fa8d2390fe6l }, 21041 { 0xefb9502262a2f201l,0x4d59ea5050ee32b0l,0xd87f77286da789a8l, 21042 0xcf98a2cff79492c4l }, 21043 0 }, 21044 /* 46 << 112 */ 21045 { { 0xf9577239720943c2l,0xba044cf53990b9d0l,0x5aa8e82395f2884al, 21046 0x834de6ed0278a0afl }, 21047 { 0xc8e1ee9a5f25bd12l,0x9259ceaa6f7ab271l,0x7e6d97a277d00b76l, 21048 0x5c0c6eeaa437832al }, 21049 0 }, 21050 /* 47 << 112 */ 21051 { { 0x5232c20f5606b81dl,0xabd7b3750d991ee5l,0x4d2bfe358632d951l, 21052 0x78f8514698ed9364l }, 21053 { 0x951873f0f30c3282l,0x0da8ac80a789230bl,0x3ac7789c5398967fl, 21054 0xa69b8f7fbdda0fb5l }, 21055 0 }, 21056 /* 48 << 112 */ 21057 { { 0xe5db77176add8545l,0x1b71cb6672c49b66l,0xd856073968421d77l, 21058 0x03840fe883e3afeal }, 21059 { 0xb391dad51ec69977l,0xae243fb9307f6726l,0xc88ac87be8ca160cl, 21060 0x5174cced4ce355f4l }, 21061 0 }, 21062 /* 49 << 112 */ 21063 { { 0x98a35966e58ba37dl,0xfdcc8da27817335dl,0x5b75283083fbc7bfl, 21064 0x68e419d4d9c96984l }, 21065 { 0x409a39f402a40380l,0x88940faf1fe977bcl,0xc640a94b8f8edea6l, 21066 0x1e22cd17ed11547dl }, 21067 0 }, 21068 /* 51 << 112 */ 21069 { { 0x17ba93b1a20ef103l,0xad8591306ba6577bl,0x65c91cf66fa214a0l, 21070 0xd7d49c6c27990da5l }, 21071 { 0xecd9ec8d20bb569dl,0xbd4b2502eeffbc33l,0x2056ca5a6bed0467l, 21072 0x7916a1f75b63728cl }, 21073 0 }, 21074 /* 52 << 112 */ 21075 { { 0xd4f9497d53a4f566l,0x8973466497b56810l,0xf8e1da740494a621l, 21076 0x82546a938d011c68l }, 21077 { 0x1f3acb19c61ac162l,0x52f8fa9cabad0d3el,0x15356523b4b7ea43l, 21078 0x5a16ad61ae608125l }, 21079 0 }, 21080 /* 53 << 112 */ 21081 { { 0xb0bcb87f4faed184l,0x5f236b1d5029f45fl,0xd42c76070bc6b1fcl, 21082 0xc644324e68aefce3l }, 21083 { 0x8e191d595c5d8446l,0xc020807713ae1979l,0xadcaee553ba59cc7l, 21084 0x20ed6d6ba2cb81bal }, 21085 0 }, 21086 /* 55 << 112 */ 21087 { { 0x7392b41a530ccbbdl,0x87c82146ea823525l,0xa52f984c05d98d0cl, 21088 0x2ae57d735ef6974cl }, 21089 { 0x9377f7bf3042a6ddl,0xb1a007c019647a64l,0xfaa9079a0cca9767l, 21090 0x3d81a25bf68f72d5l }, 21091 0 }, 21092 /* 57 << 112 */ 21093 { { 0xc110d830b0f2ac95l,0x48d0995aab20e64el,0x0f3e00e17729cd9al, 21094 0x2a570c20dd556946l }, 21095 { 0x912dbcfd4e86214dl,0x2d014ee2cf615498l,0x55e2b1e63530d76el, 21096 0xc5135ae4fd0fd6d1l }, 21097 0 }, 21098 /* 59 << 112 */ 21099 { { 0x1854daa5061f1658l,0xc0016df1df0cd2b3l,0xc2a3f23e833d50del, 21100 0x73b681d2bbbd3017l }, 21101 { 0x2f046dc43ac343c0l,0x9c847e7d85716421l,0xe1e13c910917eed4l, 21102 0x3fc9eebd63a1b9c6l }, 21103 0 }, 21104 /* 60 << 112 */ 21105 { { 0x0f816a727fe02299l,0x6335ccc2294f3319l,0x3820179f4745c5bel, 21106 0xe647b782922f066el }, 21107 { 0xc22e49de02cafb8al,0x299bc2fffcc2ecccl,0x9a8feea26e0e8282l, 21108 0xa627278bfe893205l }, 21109 0 }, 21110 /* 61 << 112 */ 21111 { { 0xa7e197337933e47bl,0xf4ff6b132e766402l,0xa4d8be0a98440d9fl, 21112 0x658f5c2f38938808l }, 21113 { 0x90b75677c95b3b3el,0xfa0442693137b6ffl,0x077b039b43c47c29l, 21114 0xcca95dd38a6445b2l }, 21115 0 }, 21116 /* 63 << 112 */ 21117 { { 0x583f3703f9374ab6l,0x864f91956e564145l,0x33bc3f4822526d50l, 21118 0x9f323c801262a496l }, 21119 { 0xaa97a7ae3f046a9al,0x70da183edf8a039al,0x5b68f71c52aa0ba6l, 21120 0x9be0fe5121459c2dl }, 21121 0 }, 21122 /* 64 << 112 */ 21123 { { 0xc1e17eb6cbc613e5l,0x33131d55497ea61cl,0x2f69d39eaf7eded5l, 21124 0x73c2f434de6af11bl }, 21125 { 0x4ca52493a4a375fal,0x5f06787cb833c5c2l,0x814e091f3e6e71cfl, 21126 0x76451f578b746666l }, 21127 0 }, 21128 /* 65 << 112 */ 21129 { { 0xa700767eabd0cc76l,0xa14ae98015889273l,0x5acf2cc466ea6380l, 21130 0xb942cc40d08d18b9l }, 21131 { 0x9b5daa763ae45782l,0x61a25e0fb72f0ce0l,0xf94c0e80435fefe3l, 21132 0x73d552cf1620e1c9l }, 21133 0 }, 21134 /* 71 << 112 */ 21135 { { 0x57130582727185c1l,0x8f2b8ebc163897ecl,0x4a059cc7a04e4a6bl, 21136 0x4b1de9fe0908a366l }, 21137 { 0xa4f7738688d0fef0l,0x55e3bb1d9ebfc138l,0x9022bbef005ae362l, 21138 0xf5669edc8741d349l }, 21139 0 }, 21140 /* 77 << 112 */ 21141 { { 0xf192c0f7ede937a4l,0xd2e91d62810c1b1el,0xf2b40b64dcc39c69l, 21142 0xe125fbd028f03b0el }, 21143 { 0x52966dd78da708f9l,0x92d400a3cc0e7f32l,0x4e35aae36b0842b8l, 21144 0x0b4fe66ded3ad3cfl }, 21145 0 }, 21146 /* 83 << 112 */ 21147 { { 0x14b81d951f1ff6b5l,0x1d82f132ed9b03b8l,0x52f6f029b4fa4047l, 21148 0xea653682601e5913l }, 21149 { 0x4e900375edeee046l,0xd22ed267f9428714l,0xb004fb3b1753e873l, 21150 0xfef061ba245b2c09l }, 21151 0 }, 21152 /* 89 << 112 */ 21153 { { 0x5e2376eaf9deba2bl,0x1ed1e9e5269a18cfl,0x8dffd66dcb1cada8l, 21154 0xb13239f068369c77l }, 21155 { 0x2fede3a67f25426fl,0xc885cf0c6f90a2a6l,0xd950162d4eeac543l, 21156 0x53011aa09abc201bl }, 21157 0 }, 21158 /* 95 << 112 */ 21159 { { 0x7a63925d432b798al,0x92e762cfc9bd6da9l,0xf22fb9706a190382l, 21160 0x19919b847b18a9b3l }, 21161 { 0x16793b803adfde86l,0xf9ce15ace8b1d44cl,0x4bf74144c0a140b8l, 21162 0x680468616f853f6cl }, 21163 0 }, 21164 /* 101 << 112 */ 21165 { { 0xd4e0d8460db84ba2l,0x9a162a3a360b68bbl,0x7297f3939233146cl, 21166 0xbc93c2f4ec77412dl }, 21167 { 0x13ddf0a7e07e1065l,0x000a8d45fb5e5131l,0xb4373078cf61d467l, 21168 0xa4a1fd67bf3bb6f9l }, 21169 0 }, 21170 /* 107 << 112 */ 21171 { { 0x6f2473f9d7585098l,0x45a29448d4f23c1al,0x47fe40f1c22bdc25l, 21172 0x4e46ed1f31347673l }, 21173 { 0x5e43a8624148898cl,0x4a02ededa993954el,0x83d830b52f8a1847l, 21174 0x007e3156a7f6a378l }, 21175 0 }, 21176 /* 113 << 112 */ 21177 { { 0x01a39fe7e847ca18l,0xaf2722418fed2772l,0x3104ef891fbb1748l, 21178 0x5b55331b2b9dd5ffl }, 21179 { 0xe7806e31cec6a787l,0x9f49ed881e9c0af2l,0xf5a66373a3905b36l, 21180 0x77b5bca9efab75f3l }, 21181 0 }, 21182 /* 116 << 112 */ 21183 { { 0xd4d75f4bf0831932l,0x5e770ac477fe8cc9l,0x52b5e748862e72a2l, 21184 0xe9a45482501d35fel }, 21185 { 0x8a93e7424a9ab187l,0x5a72506de88ca017l,0xe680dcb201eb2defl, 21186 0xdc5aa4e6ba68209dl }, 21187 0 }, 21188 /* 119 << 112 */ 21189 { { 0x2defa3dc3d01a344l,0x11fd939b162e459al,0x928453b97313d720l, 21190 0x08696dc053184a65l }, 21191 { 0xd9f8a69c721f7415l,0x304eb0e079539019l,0xc9b0ca6dbb0c6313l, 21192 0xa10133eba93dc74el }, 21193 0 }, 21194 /* 125 << 112 */ 21195 { { 0xee0b164004393f1el,0x511547dfe1301979l,0xc00dfc3516d26d87l, 21196 0x06227c8aab847494l }, 21197 { 0x178ca86748b2fdc7l,0xb51296f01a8ba1dcl,0xf252787731e1dd14l, 21198 0x7ecb5456c0ba2a1fl }, 21199 0 }, 21200 }, 21201 { 21202 /* 0 << 120 */ 21203 { { 0x00, 0x00, 0x00, 0x00 }, 21204 { 0x00, 0x00, 0x00, 0x00 }, 21205 1 }, 21206 /* 1 << 120 */ 21207 { { 0x3e0e5c9dd111f8ecl,0xbcc33f8db7c4e760l,0x702f9a91bd392a51l, 21208 0x7da4a795c132e92dl }, 21209 { 0x1a0b0ae30bb1151bl,0x54febac802e32251l,0xea3a5082694e9e78l, 21210 0xe58ffec1e4fe40b8l }, 21211 0 }, 21212 /* 3 << 120 */ 21213 { { 0x7b23c513516e19e4l,0x56e2e847c5c4d593l,0x9f727d735ce71ef6l, 21214 0x5b6304a6f79a44c5l }, 21215 { 0x6638a7363ab7e433l,0x1adea470fe742f83l,0xe054b8545b7fc19fl, 21216 0xf935381aba1d0698l }, 21217 0 }, 21218 /* 4 << 120 */ 21219 { { 0xb5504f9d918e4936l,0x65035ef6b2513982l,0x0553a0c26f4d9cb9l, 21220 0x6cb10d56bea85509l }, 21221 { 0x48d957b7a242da11l,0x16a4d3dd672b7268l,0x3d7e637c8502a96bl, 21222 0x27c7032b730d463bl }, 21223 0 }, 21224 /* 5 << 120 */ 21225 { { 0x55366b7d5846426fl,0xe7d09e89247d441dl,0x510b404d736fbf48l, 21226 0x7fa003d0e784bd7dl }, 21227 { 0x25f7614f17fd9596l,0x49e0e0a135cb98dbl,0x2c65957b2e83a76al, 21228 0x5d40da8dcddbe0f8l }, 21229 0 }, 21230 /* 7 << 120 */ 21231 { { 0x9fb3bba354530bb2l,0xbde3ef77cb0869eal,0x89bc90460b431163l, 21232 0x4d03d7d2e4819a35l }, 21233 { 0x33ae4f9e43b6a782l,0x216db3079c88a686l,0x91dd88e000ffedd9l, 21234 0xb280da9f12bd4840l }, 21235 0 }, 21236 /* 9 << 120 */ 21237 { { 0xa37f3573f37f5937l,0xeb0f6c7dd1e4fca5l,0x2965a554ac8ab0fcl, 21238 0x17fbf56c274676acl }, 21239 { 0x2e2f6bd9acf7d720l,0x41fc8f8810224766l,0x517a14b385d53befl, 21240 0xdae327a57d76a7d1l }, 21241 0 }, 21242 /* 10 << 120 */ 21243 { { 0x515d5c891f5f82dcl,0x9a7f67d76361079el,0xa8da81e311a35330l, 21244 0xe44990c44b18be1bl }, 21245 { 0xc7d5ed95af103e59l,0xece8aba78dac9261l,0xbe82b0999394b8d3l, 21246 0x6830f09a16adfe83l }, 21247 0 }, 21248 /* 11 << 120 */ 21249 { { 0x43c41ac194d7d9b1l,0x5bafdd82c82e7f17l,0xdf0614c15fda0fcal, 21250 0x74b043a7a8ae37adl }, 21251 { 0x3ba6afa19e71734cl,0x15d5437e9c450f2el,0x4a5883fe67e242b1l, 21252 0x5143bdc22c1953c2l }, 21253 0 }, 21254 /* 13 << 120 */ 21255 { { 0xc676d7f2b1f3390bl,0x9f7a1b8ca5b61272l,0x4ebebfc9c2e127a9l, 21256 0x4602500c5dd997bfl }, 21257 { 0x7f09771c4711230fl,0x058eb37c020f09c1l,0xab693d4bfee5e38bl, 21258 0x9289eb1f4653cbc0l }, 21259 0 }, 21260 /* 15 << 120 */ 21261 { { 0x54da9dc7ab952578l,0xb5423df226e84d0bl,0xa8b64eeb9b872042l, 21262 0xac2057825990f6dfl }, 21263 { 0x4ff696eb21f4c77al,0x1a79c3e4aab273afl,0x29bc922e9436b3f1l, 21264 0xff807ef8d6d9a27al }, 21265 0 }, 21266 /* 16 << 120 */ 21267 { { 0xc7f3a8f833f6746cl,0x21e46f65fea990cal,0x915fd5c5caddb0a9l, 21268 0xbd41f01678614555l }, 21269 { 0x346f4434426ffb58l,0x8055943614dbc204l,0xf3dd20fe5a969b7fl, 21270 0x9d59e956e899a39al }, 21271 0 }, 21272 /* 17 << 120 */ 21273 { { 0xe4ca688fd06f56c0l,0xa48af70ddf027972l,0x691f0f045e9a609dl, 21274 0xa9dd82cdee61270el }, 21275 { 0x8903ca63a0ef18d3l,0x9fb7ee353d6ca3bdl,0xa7b4a09cabf47d03l, 21276 0x4cdada011c67de8el }, 21277 0 }, 21278 /* 19 << 120 */ 21279 { { 0xac127dc1e038a675l,0x729deff38c5c6320l,0xb7df8fd4a90d2c53l, 21280 0x9b74b0ec681e7cd3l }, 21281 { 0x5cb5a623dab407e5l,0xcdbd361576b340c6l,0xa184415a7d28392cl, 21282 0xc184c1d8e96f7830l }, 21283 0 }, 21284 /* 21 << 120 */ 21285 { { 0x86a9303b2f7e85c3l,0x5fce462171988f9bl,0x5b935bf6c138acb5l, 21286 0x30ea7d6725661212l }, 21287 { 0xef1eb5f4e51ab9a2l,0x0587c98aae067c78l,0xb3ce1b3c77ca9ca6l, 21288 0x2a553d4d54b5f057l }, 21289 0 }, 21290 /* 23 << 120 */ 21291 { { 0x2c7156e10b1894a0l,0x92034001d81c68c0l,0xed225d00c8b115b5l, 21292 0x237f9c2283b907f2l }, 21293 { 0x0ea2f32f4470e2c0l,0xb725f7c158be4e95l,0x0f1dcafab1ae5463l, 21294 0x59ed51871ba2fc04l }, 21295 0 }, 21296 /* 25 << 120 */ 21297 { { 0xd1b0ccdec9520711l,0x55a9e4ed3c8b84bfl,0x9426bd39a1fef314l, 21298 0x4f5f638e6eb93f2bl }, 21299 { 0xba2a1ed32bf9341bl,0xd63c13214d42d5a9l,0xd2964a89316dc7c5l, 21300 0xd1759606ca511851l }, 21301 0 }, 21302 /* 27 << 120 */ 21303 { { 0xedf69feaf8c51187l,0x05bb67ec741e4da7l,0x47df0f3208114345l, 21304 0x56facb07bb9792b1l }, 21305 { 0xf3e007e98f6229e4l,0x62d103f4526fba0fl,0x4f33bef7b0339d79l, 21306 0x9841357bb59bfec1l }, 21307 0 }, 21308 /* 28 << 120 */ 21309 { { 0xae1e0b67e28ef5bal,0x2c9a4699cb18e169l,0x0ecd0e331e6bbd20l, 21310 0x571b360eaf5e81d2l }, 21311 { 0xcd9fea58101c1d45l,0x6651788e18880452l,0xa99726351f8dd446l, 21312 0x44bed022e37281d0l }, 21313 0 }, 21314 /* 29 << 120 */ 21315 { { 0x830e6eea60dbac1fl,0x23d8c484da06a2f7l,0x896714b050ca535bl, 21316 0xdc8d3644ebd97a9bl }, 21317 { 0x106ef9fab12177b4l,0xf79bf464534d5d9cl,0x2537a349a6ab360bl, 21318 0xc7c54253a00c744fl }, 21319 0 }, 21320 /* 31 << 120 */ 21321 { { 0x24d661d168754ab0l,0x801fce1d6f429a76l,0xc068a85fa58ce769l, 21322 0xedc35c545d5eca2bl }, 21323 { 0xea31276fa3f660d1l,0xa0184ebeb8fc7167l,0x0f20f21a1d8db0ael, 21324 0xd96d095f56c35e12l }, 21325 0 }, 21326 /* 33 << 120 */ 21327 { { 0x57d2046b59da06ebl,0x3c076d5fa49f6d74l,0x6b4c96e616f82ea0l, 21328 0xaf7b0f1f90536c0bl }, 21329 { 0x7999f86d204a9b2dl,0x7e420264126c9f87l,0x4c967a1f262ac4e5l, 21330 0xe8174a09900e79adl }, 21331 0 }, 21332 /* 34 << 120 */ 21333 { { 0xd51687f2cb82516bl,0x8a440cfc040e4670l,0xeafd2bcfe7738d32l, 21334 0x7071e9162a1e911al }, 21335 { 0xbd3abd44cfea57bbl,0x9c3add16085b19e2l,0xb194c01d6baa5aa6l, 21336 0x6f3d3faf92f85c64l }, 21337 0 }, 21338 /* 35 << 120 */ 21339 { { 0xe23e0769488a280el,0x8e55a728e63a5904l,0x01690716ab84cccfl, 21340 0xfe796130b78b3c98l }, 21341 { 0x15cc475b9117f211l,0xbdc178761d1b9d56l,0x8df5594a3e37b9b9l, 21342 0x97747e341e37e494l }, 21343 0 }, 21344 /* 36 << 120 */ 21345 { { 0xf2a6370ed2f896e1l,0x27100e63802987afl,0xb4db1cff4678ebc7l, 21346 0x6e5f28d937b4b263l }, 21347 { 0xd29030009711ebc4l,0xf14dcb9ff8712484l,0x7a46ec3eea449146l, 21348 0x200155e9c1c51179l }, 21349 0 }, 21350 /* 37 << 120 */ 21351 { { 0x8130f007f1968d55l,0x18823e7097ed9803l,0xdc9fec559402762dl, 21352 0x9e0bd57e278f5abbl }, 21353 { 0xaa41b913c9ebf303l,0x1105ec43a76b9353l,0xf8e4ee4cf4e6c6b5l, 21354 0x3a630972bd7be696l }, 21355 0 }, 21356 /* 39 << 120 */ 21357 { { 0x5c7da7e16356b3eel,0x951bfe458ccf9b48l,0x6f2c6e91d0555d0cl, 21358 0x47d7f7b58efd38eel }, 21359 { 0x957256c8af6fd630l,0xa690c65bdc01774cl,0xad52b27c7c8dafdal, 21360 0x81fbc16af44a145fl }, 21361 0 }, 21362 /* 40 << 120 */ 21363 { { 0x497c3a3481b0493al,0x2b3ab20d71bc8408l,0x0c60226aa03769d1l, 21364 0x4ac89c7ad10708b0l }, 21365 { 0x62398ea5092f7e6al,0x7f408f54de96d526l,0x025bde6f85bf102cl, 21366 0xcc2f85120a4aa72el }, 21367 0 }, 21368 /* 41 << 120 */ 21369 { { 0x8a65e0386884a9c3l,0xd2e6ac047bf8c794l,0xc9c5d3d3f7bcdfb9l, 21370 0x0000ce42a33f2c12l }, 21371 { 0xea1c0a9a7dd13b2bl,0xbfd97d7f0c35c3b1l,0x0ba75cf3347fcefel, 21372 0xc3c5f28f1333460dl }, 21373 0 }, 21374 /* 43 << 120 */ 21375 { { 0x7810ebf575baa708l,0xe7fa7a0dd7440549l,0x25b813baf0667e4al, 21376 0x30a46740d15838a8l }, 21377 { 0x13207b1ad04b22f7l,0x09e601ffd1419699l,0xb1038fc77f687b27l, 21378 0xa4547dc9a127f95bl }, 21379 0 }, 21380 /* 44 << 120 */ 21381 { { 0x83b2e3b3056ecd2cl,0xd17dcdaaf03dfd36l,0xee24a5f81dcef956l, 21382 0xb6746cd0b7239f16l }, 21383 { 0xed6cb311c8458c48l,0xe8c0fc9805d27da4l,0x4610e9a0a1bf0970l, 21384 0x1947f01d9906c19el }, 21385 0 }, 21386 /* 45 << 120 */ 21387 { { 0x8b979126217c7cd7l,0x65c57a378050067el,0x6a50c6383f34838cl, 21388 0x3de617c29b7bc81fl }, 21389 { 0x58488d24253a0ac7l,0x3fe53ec75520ba0bl,0x9156dca763f0607el, 21390 0xdd08c5705d1fe134l }, 21391 0 }, 21392 /* 46 << 120 */ 21393 { { 0xbfb1d9e1e33ba77fl,0x0985311ccaef6c01l,0xc8b59e9accca8948l, 21394 0x1256280945416f25l }, 21395 { 0xc90edbc257f53218l,0xcaa08c05125d8fb5l,0x33ea3fd49a1aad3bl, 21396 0x2aa8bd83d005e8bel }, 21397 0 }, 21398 /* 47 << 120 */ 21399 { { 0xcbd2f1a3c2b22963l,0x0f7bd29c0c8ac2b3l,0xddb932432d405bfdl, 21400 0xeabd4805328413b5l }, 21401 { 0xcc79d31748ebb6b9l,0x09604f831f521aael,0xd3487fdf4c7d188cl, 21402 0xd219c318d1552ea9l }, 21403 0 }, 21404 /* 48 << 120 */ 21405 { { 0xef4f115c775d6ecel,0x69d2e3bbe8c0e78dl,0xb0264ef1145cfc81l, 21406 0x0a41e9fa1b69788bl }, 21407 { 0x0d9233be909a1f0bl,0x150a84520ae76b30l,0xea3375370632bb69l, 21408 0x15f7b3cfaa25584al }, 21409 0 }, 21410 /* 49 << 120 */ 21411 { { 0xfc4c623e321f7b11l,0xd36c1066f9cbc693l,0x8165235835dc0c0al, 21412 0xa3ce2e18c824e97el }, 21413 { 0x59ea7cbcc6ff405el,0xced5a94a1e56a1e2l,0x88d744c53ab64b39l, 21414 0x8963d029073a36e7l }, 21415 0 }, 21416 /* 51 << 120 */ 21417 { { 0x97aa902cb19f3edbl,0x8e605ff9bbf2975bl,0x0536fa8ba6eb299bl, 21418 0xfd96da4f7cd03ac0l }, 21419 { 0x29c5b5b578f9a265l,0x1f025a6d5fd0bc1bl,0x440486ee58e0f8e1l, 21420 0x8f191f7d593e49e9l }, 21421 0 }, 21422 /* 52 << 120 */ 21423 { { 0xbddf656baea9c13fl,0x083c5d514c678b37l,0x975431b630878ed4l, 21424 0x6de13d4608d9cf1cl }, 21425 { 0xfbb639cc02427c45l,0x6190ca0c5a6cd989l,0x35a6aa26c53f11b7l, 21426 0x73f9e17dddfd86f6l }, 21427 0 }, 21428 /* 53 << 120 */ 21429 { { 0xd30478a317be7689l,0x6fc3f634e358f7a7l,0x4057ece515688d9fl, 21430 0xb5397495d3d91eefl }, 21431 { 0x62fac49e2f49bde4l,0xeb4a3e1860125c73l,0x15f38be8dabdac55l, 21432 0x18bf29f7d334d52al }, 21433 0 }, 21434 /* 55 << 120 */ 21435 { { 0xf684162b68777538l,0x3e2a770bbb3381f4l,0x1b7562c1b374577cl, 21436 0x9eec22dc5cf21688l }, 21437 { 0xc35014b1d472be2cl,0xafe2317035f086fbl,0xb9c9c4c9a1491ce1l, 21438 0x2df1e669b56792ddl }, 21439 0 }, 21440 /* 57 << 120 */ 21441 { { 0xcf7d36fe1830f624l,0x176c3c12ed0474bdl,0x25b802c8f82b493dl, 21442 0x683c2a744c78147el }, 21443 { 0x0db99444f8f3e446l,0x437bcac6800a56c7l,0xb4e592264d08b25fl, 21444 0xcaf1b4142e691ca7l }, 21445 0 }, 21446 /* 59 << 120 */ 21447 { { 0x378bd47b9d231cafl,0xde3aa2f01f4db832l,0xf609d16ab29bd7d5l, 21448 0x13feab54bdfb54dfl }, 21449 { 0x274abbbc22fc1a12l,0x267febb47d30ef1bl,0xeffa996d80717cd8l, 21450 0x065a86d1118d0812l }, 21451 0 }, 21452 /* 60 << 120 */ 21453 { { 0xc681a8656a3cb3afl,0x528f25a981751414l,0x6669f07cc7eac946l, 21454 0x9fb3a53f3cc6cc6bl }, 21455 { 0x2919d92a11ae224al,0xa59141110b170a19l,0xdc16c611e2042f16l, 21456 0x58ace12decd4180bl }, 21457 0 }, 21458 /* 61 << 120 */ 21459 { { 0x689bb1ec107bb59fl,0x8129702adad2b385l,0x10bd3baeb1630603l, 21460 0xaadec5d15f23e7cfl }, 21461 { 0x572f234f4586f7fbl,0x13abdec95ec11b32l,0xa462a7ec6191c26al, 21462 0x4a7d92a06685c8d3l }, 21463 0 }, 21464 /* 63 << 120 */ 21465 { { 0xdd4e2b63b16628eal,0xdf0c8fc8eefa5e86l,0xb0ec710205662720l, 21466 0x3f4c6956fe81e9dal }, 21467 { 0x5732ad8f52e356f7l,0x045a103968a658f0l,0x9c40b0b6506ba33al, 21468 0x0a426010cb54258dl }, 21469 0 }, 21470 /* 64 << 120 */ 21471 { { 0x09891641d4c5105fl,0x1ae80f8e6d7fbd65l,0x9d67225fbee6bdb0l, 21472 0x3b433b597fc4d860l }, 21473 { 0x44e66db693e85638l,0xf7b59252e3e9862fl,0xdb785157665c32ecl, 21474 0x702fefd7ae362f50l }, 21475 0 }, 21476 /* 65 << 120 */ 21477 { { 0x3902ab14c3254641l,0xa63cfd9fd8c001c8l,0x597d155c52d0af3cl, 21478 0xc5a2cbc4a0dbe688l }, 21479 { 0xac8a841b249195aal,0xc98f01aaed14426fl,0xeb4a8ce8353905f1l, 21480 0x4d6668171ecee1b7l }, 21481 0 }, 21482 /* 71 << 120 */ 21483 { { 0xbd66e7d9a94da8cdl,0x7bc04735801ef314l,0x90f3eba1c5cc2904l, 21484 0x3c7dfed6f71bb36dl }, 21485 { 0x89a50c8da75e3086l,0x88b8b4746f8e3418l,0x26fe17f4a44a5dbdl, 21486 0x98bf74c16a1e24fel }, 21487 0 }, 21488 /* 77 << 120 */ 21489 { { 0xca7b470679e0db85l,0x7f46c7716fc897fdl,0x9537e7918edfc0f3l, 21490 0xa46d4b4405e91ddfl }, 21491 { 0x97d21061ee5575e7l,0x1f4f32da59650429l,0x2d1d6af878995129l, 21492 0x41d6fc228a0e4260l }, 21493 0 }, 21494 /* 83 << 120 */ 21495 { { 0xb30a1a89107d2282l,0x5433d7673a5e1323l,0xb9eeab822abdfeafl, 21496 0x9579cb46df3e0dbfl }, 21497 { 0x6fc3ff2c7e088e79l,0x94b32360d7314326l,0xd2e82b59e5ad82e4l, 21498 0x7372dc4a55bc24e3l }, 21499 0 }, 21500 /* 89 << 120 */ 21501 { { 0x355697215f3c03cbl,0x4150adf2a146edcdl,0x16ec1a421a252e1cl, 21502 0xdf4d0f94424984eal }, 21503 { 0x15142b5f5fabe961l,0xe6a73c29567ec13al,0xe6d370795d12070al, 21504 0x437743d0206fd7c6l }, 21505 0 }, 21506 /* 95 << 120 */ 21507 { { 0x483b7a95d66bc594l,0xf6a7064e8a6113bbl,0x373ce20f4ed34f72l, 21508 0x6aa876ab24f429b2l }, 21509 { 0x378d5c25412c3102l,0xe4219a97b493199cl,0x01c7cafaa0b37332l, 21510 0x9305cc85f7633f7dl }, 21511 0 }, 21512 /* 101 << 120 */ 21513 { { 0x0259b43aaadf2273l,0x869c5bd3cf9dc1c2l,0x4f18a6e4068d6628l, 21514 0xd110637fec2d4547l }, 21515 { 0x1ae88a791e94aaddl,0xe8b4be39de64f5f9l,0x85cbd9b24dc6b2bbl, 21516 0xb65091fa1bc352b2l }, 21517 0 }, 21518 /* 107 << 120 */ 21519 { { 0x7c5cea5d20f6a354l,0xe936ff1582f3ed39l,0x54e7a775b779368el, 21520 0x8ca8a46e3cb17c9el }, 21521 { 0x753ca1fa0138974dl,0x9ce311eba72902ffl,0xcb727e56973f72b6l, 21522 0xde72538d91685710l }, 21523 0 }, 21524 /* 113 << 120 */ 21525 { { 0xf423569f1bec8f85l,0x23376da5ca844ac4l,0xce7b407a111523f4l, 21526 0x736fb92dde7aa46dl }, 21527 { 0xd9139edcc7662640l,0x520fbf0656a85e24l,0x14e3b5857e5284b5l, 21528 0xcbae4e8321d56ef3l }, 21529 0 }, 21530 /* 116 << 120 */ 21531 { { 0x69830a05564470a1l,0x1a1e26cf5b702e8el,0xe5fdf7d9d8fae645l, 21532 0xe4774f74a9950c66l }, 21533 { 0x18bdda7cd1466825l,0xe6ab4ce6d115218al,0xfcb8c50064528629l, 21534 0xd705f429e70deed9l }, 21535 0 }, 21536 /* 119 << 120 */ 21537 { { 0x3f992d7ba99df096l,0x08993b4125e78725l,0x79eaad13117c4cafl, 21538 0x7230594c9fa87285l }, 21539 { 0xac23d7edf2673e27l,0xc9d76fb53b9eb111l,0x7a0a036a9e9db78al, 21540 0x7c6ec39df9565cffl }, 21541 0 }, 21542 /* 125 << 120 */ 21543 { { 0x956ad1441fd4f7a1l,0x6c511ffecb7546cal,0x11becdaef5ae6ddbl, 21544 0x67587741946168b2l }, 21545 { 0x99cd45edf54379a7l,0x687f8462e2748decl,0x2b2be1e1837bd066l, 21546 0x3862659c0c45a5a9l }, 21547 0 }, 21548 }, 21549 { 21550 /* 0 << 128 */ 21551 { { 0x00, 0x00, 0x00, 0x00 }, 21552 { 0x00, 0x00, 0x00, 0x00 }, 21553 1 }, 21554 /* 1 << 128 */ 21555 { { 0x62a8c244bfe20925l,0x91c19ac38fdce867l,0x5a96a5d5dd387063l, 21556 0x61d587d421d324f6l }, 21557 { 0xe87673a2a37173eal,0x2384800853778b65l,0x10f8441e05bab43el, 21558 0xfa11fe124621efbel }, 21559 0 }, 21560 /* 3 << 128 */ 21561 { { 0xc0f734a3b2335834l,0x9526205a90ef6860l,0xcb8be71704e2bb0dl, 21562 0x2418871e02f383fal }, 21563 { 0xd71776814082c157l,0xcc914ad029c20073l,0xf186c1ebe587e728l, 21564 0x6fdb3c2261bcd5fdl }, 21565 0 }, 21566 /* 4 << 128 */ 21567 { { 0xb4480f0441c23fa3l,0xb4712eb0c1989a2el,0x3ccbba0f93a29ca7l, 21568 0x6e205c14d619428cl }, 21569 { 0x90db7957b3641686l,0x0432691d45ac8b4el,0x07a759acf64e0350l, 21570 0x0514d89c9c972517l }, 21571 0 }, 21572 /* 5 << 128 */ 21573 { { 0xcc7c4c1c2cf9d7c1l,0x1320886aee95e5abl,0xbb7b9056beae170cl, 21574 0xc8a5b250dbc0d662l }, 21575 { 0x4ed81432c11d2303l,0x7da669121f03769fl,0x3ac7a5fd84539828l, 21576 0x14dada943bccdd02l }, 21577 0 }, 21578 /* 7 << 128 */ 21579 { { 0x51b90651cbae2f70l,0xefc4bc0593aaa8ebl,0x8ecd8689dd1df499l, 21580 0x1aee99a822f367a5l }, 21581 { 0x95d485b9ae8274c5l,0x6c14d4457d30b39cl,0xbafea90bbcc1ef81l, 21582 0x7c5f317aa459a2edl }, 21583 0 }, 21584 /* 9 << 128 */ 21585 { { 0x410dc6a90deeaf52l,0xb003fb024c641c15l,0x1384978c5bc504c4l, 21586 0x37640487864a6a77l }, 21587 { 0x05991bc6222a77dal,0x62260a575e47eb11l,0xc7af6613f21b432cl, 21588 0x22f3acc9ab4953e9l }, 21589 0 }, 21590 /* 10 << 128 */ 21591 { { 0x27c8919240be34e8l,0xc7162b3791907f35l,0x90188ec1a956702bl, 21592 0xca132f7ddf93769cl }, 21593 { 0x3ece44f90e2025b4l,0x67aaec690c62f14cl,0xad74141822e3cc11l, 21594 0xcf9b75c37ff9a50el }, 21595 0 }, 21596 /* 11 << 128 */ 21597 { { 0x0d0942770c24efc8l,0x0349fd04bef737a4l,0x6d1c9dd2514cdd28l, 21598 0x29c135ff30da9521l }, 21599 { 0xea6e4508f78b0b6fl,0x176f5dd2678c143cl,0x081484184be21e65l, 21600 0x27f7525ce7df38c4l }, 21601 0 }, 21602 /* 13 << 128 */ 21603 { { 0x9faaccf5e4652f1dl,0xbd6fdd2ad56157b2l,0xa4f4fb1f6261ec50l, 21604 0x244e55ad476bcd52l }, 21605 { 0x881c9305047d320bl,0x1ca983d56181263fl,0x354e9a44278fb8eel, 21606 0xad2dbc0f396e4964l }, 21607 0 }, 21608 /* 15 << 128 */ 21609 { { 0xfce0176788a2ffe4l,0xdc506a3528e169a5l,0x0ea108617af9c93al, 21610 0x1ed2436103fa0e08l }, 21611 { 0x96eaaa92a3d694e7l,0xc0f43b4def50bc74l,0xce6aa58c64114db4l, 21612 0x8218e8ea7c000fd4l }, 21613 0 }, 21614 /* 16 << 128 */ 21615 { { 0x6a7091c2e48fb889l,0x26882c137b8a9d06l,0xa24986631b82a0e2l, 21616 0x844ed7363518152dl }, 21617 { 0x282f476fd86e27c7l,0xa04edaca04afefdcl,0x8b256ebc6119e34dl, 21618 0x56a413e90787d78bl }, 21619 0 }, 21620 /* 17 << 128 */ 21621 { { 0xd1ffd160deb58b9bl,0x78492428c007273cl,0x47c908048ef06073l, 21622 0x746cd0dfe48c659el }, 21623 { 0xbd7e8e109d47055bl,0xe070967e39711c04l,0x3d8869c99c9444f6l, 21624 0x6c67ccc834ac85fcl }, 21625 0 }, 21626 /* 19 << 128 */ 21627 { { 0x8a42d8b087b05be1l,0xef00df8d3e4e1456l,0x148cc8e8fbfc8cd2l, 21628 0x0288ae4c4878804fl }, 21629 { 0x44e669a73b4f6872l,0xa4a8dbd4aab53c5bl,0x843fa963c9660052l, 21630 0x128e2d2571c05dd2l }, 21631 0 }, 21632 /* 21 << 128 */ 21633 { { 0x3ea86174a9f1b59bl,0xc747ea076a9a8845l,0x733710b5ab242123l, 21634 0x6381b546d386a60cl }, 21635 { 0xba0e286366a44904l,0x770f618de9db556cl,0x39e567f828fb198dl, 21636 0xb5f1bef040147ee8l }, 21637 0 }, 21638 /* 23 << 128 */ 21639 { { 0x1adee1d516391617l,0x962d9184a3315fd9l,0x91c229750c805d59l, 21640 0x4575eaf2cd9a1877l }, 21641 { 0x83fef163451831b9l,0x829d6bdd6f09e30fl,0x9379272dcc6b4e6al, 21642 0xd7a049bd95fbee4al }, 21643 0 }, 21644 /* 25 << 128 */ 21645 { { 0x695f70da44ae09c6l,0x79793892bb99de1dl,0xde269352f696b429l, 21646 0xe37ea97f8104c825l }, 21647 { 0x3166cac6b0e72e63l,0xa82e633ca03ba670l,0x1106e3843e505667l, 21648 0xc2994f3dffb788b6l }, 21649 0 }, 21650 /* 27 << 128 */ 21651 { { 0xd36a5ab37c53073bl,0xc44a9940ebdc7e35l,0x7dd86c8bf3ded136l, 21652 0x9fe9879fd5a0eb14l }, 21653 { 0xa210726c9b99bf9cl,0x3faf4456861036afl,0x1661f1c9615d091al, 21654 0x2c63f630911551bcl }, 21655 0 }, 21656 /* 28 << 128 */ 21657 { { 0x1554d46da670ff1dl,0x24833d88cb97a1ccl,0x8fa6ab3cded97493l, 21658 0x215e037189926498l }, 21659 { 0x549bd592e56d74ffl,0x58a8caf543b5e1ecl,0x3c6087a323e93cb9l, 21660 0x8b0549875648b83cl }, 21661 0 }, 21662 /* 29 << 128 */ 21663 { { 0x232974230554f94fl,0x4f445a380f3a7618l,0xb9fb40bee4abefd6l, 21664 0xfbf3eaf9c15eb07cl }, 21665 { 0xed469c23aca0c8b3l,0xc5209f68846e3f8fl,0x33d51d13d75da468l, 21666 0x9406e10a3d5c6e29l }, 21667 0 }, 21668 /* 31 << 128 */ 21669 { { 0xb9a44b1f5c6cad21l,0xaa9947751ee60a83l,0xc89af3858c390401l, 21670 0xef1e450b8dd51056l }, 21671 { 0x5f5f069879ac84d1l,0x68d82982ef57b1afl,0x31f1d90f50849555l, 21672 0xff9577e57d9fc8f6l }, 21673 0 }, 21674 /* 33 << 128 */ 21675 { { 0xaeebc5c0b430d6a1l,0x39b87a13dc3a9c04l,0xf0c445252db4a631l, 21676 0xe32d95482c66fcf6l }, 21677 { 0x16f11bafb17849c4l,0xdd1c76615eca71f7l,0x4389ad2e32e6c944l, 21678 0x727c11a5889a06bbl }, 21679 0 }, 21680 /* 34 << 128 */ 21681 { { 0x38dd1ac021e5781al,0x578318dbfd019ee2l,0x096b677d5f88e574l, 21682 0xdbec82b216ad9f4fl }, 21683 { 0x348debe23260e8d9l,0x9334126064dfcda1l,0xdc5fb34cefc8faael, 21684 0x5fa048beb4a6fc25l }, 21685 0 }, 21686 /* 35 << 128 */ 21687 { { 0xe18806fd60b3258cl,0xb7d2926b1364df47l,0xe208300fa107ce99l, 21688 0x8d2f29fe7918df0el }, 21689 { 0x0b012d77a1244f4cl,0xf01076f4213a11cfl,0x8e623223181c559dl, 21690 0x9df196ee995a281dl }, 21691 0 }, 21692 /* 36 << 128 */ 21693 { { 0xc431a238013ff83bl,0x7c0018b2fad69d08l,0x99aeb52a4c9589eal, 21694 0x121f41ab9b1cf19fl }, 21695 { 0x0cfbbcbaef0f5958l,0x8deb3aeb7be8fbdcl,0x12b954081f15aa31l, 21696 0x5acc09b34c0c06fdl }, 21697 0 }, 21698 /* 37 << 128 */ 21699 { { 0xfaa821383a721940l,0xdd70f54dd0008b83l,0x00decb507d32a52dl, 21700 0x04563529cdd87deal }, 21701 { 0xb0e7e2a2db81643dl,0x445f4c383a6fef50l,0x5c0ef211df694ae1l, 21702 0xa5a8fead923d0f1cl }, 21703 0 }, 21704 /* 39 << 128 */ 21705 { { 0xbc0e08b0325b2601l,0xae9e4c6105815b7al,0x07f664faf944a4a1l, 21706 0x0ad19d29288f83b3l }, 21707 { 0x8615cd677232c458l,0x98edff6e9038e7d1l,0x082e0c4395a4dfccl, 21708 0x336267afeceee00el }, 21709 0 }, 21710 /* 40 << 128 */ 21711 { { 0x775cbfa86d518ffbl,0xdecee1f6930f124bl,0x9a402804f5e81d0fl, 21712 0x0e8225c52a0eeb2fl }, 21713 { 0x884a5d39fee9e867l,0x9540428ffb505454l,0xb2bf2e20107a70d1l, 21714 0xd9917c3ba010b2aal }, 21715 0 }, 21716 /* 41 << 128 */ 21717 { { 0xc88ad4452a29bfdel,0x3072ebfa998368b7l,0xa754cbf7f5384692l, 21718 0x85f7e16906b13146l }, 21719 { 0x42a7095f6a549fbel,0xef44edf91f7f1f42l,0xbea2989737b0c863l, 21720 0x13b096d87a1e7fc3l }, 21721 0 }, 21722 /* 43 << 128 */ 21723 { { 0x51add77ce2a3a251l,0x840ca1384d8476adl,0x08d01d26f6096478l, 21724 0x10d501a532f1662bl }, 21725 { 0xc8d63f811165a955l,0x587aa2e34095046al,0x759506c617af9000l, 21726 0xd6201fe4a32ab8d2l }, 21727 0 }, 21728 /* 44 << 128 */ 21729 { { 0xa98f42fa3d843d53l,0x33777cc613ef927al,0xc440cdbecb84ca74l, 21730 0x8c22f9631dc7c5ddl }, 21731 { 0x4bc82b70c8d94708l,0x7e0b43fcc814364fl,0x286d4e2486f59b7el, 21732 0x1abc895e4d6bf4c4l }, 21733 0 }, 21734 /* 45 << 128 */ 21735 { { 0x7c52500cfc8c9bbdl,0x635563381534d9f7l,0xf55f38cbfd52c990l, 21736 0xc585ae85058f52e7l }, 21737 { 0xb710a28bf9f19a01l,0x891861bdf0273ca4l,0x38a7aa2b034b0b7cl, 21738 0xa2ecead52a809fb1l }, 21739 0 }, 21740 /* 46 << 128 */ 21741 { { 0x3df614f1ec3ca8eal,0x6bb24e9f9505bc08l,0x23ba1afbf37ace22l, 21742 0x2e51b03b3463c261l }, 21743 { 0x59a0fca9c39e6558l,0x819f271ca342ccd9l,0x0c913d54df7ac033l, 21744 0xba0f83de573257d3l }, 21745 0 }, 21746 /* 47 << 128 */ 21747 { { 0xdf62817ab3b32fbcl,0x616d74b0964670d4l,0xa37bc6270e26020bl, 21748 0xda46d655b7d40bdal }, 21749 { 0x2840f155b5773f84l,0xbb633777897774b6l,0x59ff1df79a1ed3fal, 21750 0xf7011ee2bac571f9l }, 21751 0 }, 21752 /* 48 << 128 */ 21753 { { 0x38151e274d559d96l,0x4f18c0d3b8db6c01l,0x49a3aa836f9921afl, 21754 0xdbeab27b8c046029l }, 21755 { 0x242b9eaa7040bf3bl,0x39c479e51614b091l,0x338ede2b0e4baf5dl, 21756 0x5bb192b7f0a53945l }, 21757 0 }, 21758 /* 49 << 128 */ 21759 { { 0xd612951861535bb0l,0xbf14364016f6a954l,0x3e0931eedde18024l, 21760 0x79d791c8139441c0l }, 21761 { 0xba4fe7ecb67b8269l,0x7f30d848224b96c1l,0xa7e0a6abf0341068l, 21762 0x78db42c37198ea2dl }, 21763 0 }, 21764 /* 51 << 128 */ 21765 { { 0x13354044185ce776l,0x109a6e059ff0100cl,0xafa3b61b03144cb1l, 21766 0x4e4c814585265586l }, 21767 { 0xa8dafd33edb35364l,0x6691781bfd2606bel,0x2e06a9786182f5ccl, 21768 0x588784ebe77faeecl }, 21769 0 }, 21770 /* 52 << 128 */ 21771 { { 0x896d572337e440d7l,0x685c5fd9ade23f68l,0xb5b1a26dc2c64918l, 21772 0xb9390e30dad6580cl }, 21773 { 0x87911c4e7dee5b9bl,0xb90c5053deb04f6el,0x37b942a18f065aa6l, 21774 0x34acdf2a1ca0928dl }, 21775 0 }, 21776 /* 53 << 128 */ 21777 { { 0xc773f525606f8f04l,0x75ae4a4b41b0a5bbl,0xb2aa058eaf7df93cl, 21778 0xf15bea4feafed676l }, 21779 { 0xd2967b236a3c4fd7l,0xa698628090e30e7fl,0xf1b5166d316418bdl, 21780 0x5748682e1c13cb29l }, 21781 0 }, 21782 /* 55 << 128 */ 21783 { { 0xe7b11babfff3605bl,0xdbce1b74cbac080fl,0xa0be39bd6535f082l, 21784 0x2b6501805f826684l }, 21785 { 0xf90cea2400f5244fl,0xe279f2fadd244a1cl,0xd3fca77c9421c3ael, 21786 0xe66bc7ee81a5210al }, 21787 0 }, 21788 /* 57 << 128 */ 21789 { { 0x114085dac40c6461l,0xaf78cb47f47d41b8l,0x7a9ae851755b0adbl, 21790 0x8d2e8c66a0600b6dl }, 21791 { 0x5fb19045389758c0l,0xfa6e2cdabe7c91b2l,0x6472a432663983a2l, 21792 0xc9370829e0e19363l }, 21793 0 }, 21794 /* 59 << 128 */ 21795 { { 0xd335856ec50bf2ffl,0x89b42295dfa708c2l,0x5dfb42241b201b4el, 21796 0x6c94d6b94eecbf9cl }, 21797 { 0xabe5a47a7a634097l,0xf3d53b1643febecfl,0xff18619faca9846el, 21798 0x80ad8629a4066177l }, 21799 0 }, 21800 /* 60 << 128 */ 21801 { { 0x7872e34b3390ff23l,0x968ce4abde7d18efl,0x9b4a745e627fe7b1l, 21802 0x9607b0a0caff3e2al }, 21803 { 0x1b05818eeb40e3a5l,0x6ac62204c0fa8d7al,0xb5b9058571ed4809l, 21804 0xb2432ef0f7cb65f2l }, 21805 0 }, 21806 /* 61 << 128 */ 21807 { { 0xc1203418f8a144b7l,0xb3413f808378f901l,0xf6badea161857095l, 21808 0xcd2816c2b2e93efel }, 21809 { 0x6a8303ea174a0ee6l,0x98b62f29150b28b6l,0x68071bbc9c2a05b6l, 21810 0xcfcf41a39f00e36el }, 21811 0 }, 21812 /* 63 << 128 */ 21813 { { 0xcaf564f234d6bc29l,0x9e9a6507f3c8edb0l,0x2fb889edd4e5502el, 21814 0xb70d4ceb6cc9d8edl }, 21815 { 0x0de25356b020f740l,0xa68d9263d11fe5e6l,0xe86400679d85dd77l, 21816 0xa95dfa7dec2c8c8dl }, 21817 0 }, 21818 /* 64 << 128 */ 21819 { { 0x715c9f973112795fl,0xe8244437984e6ee1l,0x55cb4858ecb66bcdl, 21820 0x7c136735abaffbeel }, 21821 { 0x546615955dbec38el,0x51c0782c388ad153l,0x9ba4c53ac6e0952fl, 21822 0x27e6782a1b21dfa8l }, 21823 0 }, 21824 /* 65 << 128 */ 21825 { { 0x3f9bc63ece59397dl,0x3f0f98a93eaa6104l,0x2f82c37c002d9271l, 21826 0x6ac0495d4985353cl }, 21827 { 0xbde52f629191527bl,0xa3a13fce475aa640l,0x1d71ae17ce673f89l, 21828 0x2b5cc61529120ec1l }, 21829 0 }, 21830 /* 71 << 128 */ 21831 { { 0xa0ab0f9924318c1cl,0x0cc5ca7da80ca60bl,0x24e27598abb965bal, 21832 0xc4863198b44d1351l }, 21833 { 0x4d913783a28f04bel,0x404e78088cce8960l,0x2973b4e46286873el, 21834 0x7b6e0f3219f42b50l }, 21835 0 }, 21836 /* 77 << 128 */ 21837 { { 0x0091a786306a6349l,0x4640ceab2098622dl,0x9928022be8182233l, 21838 0xf261bee4514d0bedl }, 21839 { 0x70cdcc44c5f64fedl,0x4e19fec4f9eb2dfel,0xd05bdc09058b0b69l, 21840 0x16f3007ed3bc6190l }, 21841 0 }, 21842 /* 83 << 128 */ 21843 { { 0x8f7f16957f136df1l,0x6d7547019b4f4215l,0xfb22d55eb4cc46a6l, 21844 0x0b53ef53a8563034l }, 21845 { 0x8b105acc42bc9353l,0xe44c0a396079d59dl,0x78441fee35ee38ddl, 21846 0x87ad93e43dcc0119l }, 21847 0 }, 21848 /* 89 << 128 */ 21849 { { 0x98a1c55358d9f73al,0xaa0843f0540e2b91l,0x701f8831d0647459l, 21850 0xc4ae9d0484673005l }, 21851 { 0x9c37bc9f30b3ea20l,0x24cb4e2dbcbfb2b2l,0x8513e6f313cbf070l, 21852 0x0c4db4334e76c79el }, 21853 0 }, 21854 /* 95 << 128 */ 21855 { { 0x882a2b9cbc8320b8l,0x16e9c11e3ad9e222l,0x24399ac19b23cb1dl, 21856 0x334c5496799a89c7l }, 21857 { 0x72b6f9b8df3d774cl,0x42955bcbb11b6704l,0x3c4d6021ad2d4eafl, 21858 0x5416b309afe2b671l }, 21859 0 }, 21860 /* 101 << 128 */ 21861 { { 0x1bbe9e662bf7c2a6l,0x22a3a10ca4acfddbl,0x2424eaab46bae581l, 21862 0xebec1bbf40d6bdadl }, 21863 { 0xd7e3fa1a5b012aedl,0xc0f82c23f1dc6204l,0x42787c82e319477dl, 21864 0xca1ae7a14cf57573l }, 21865 0 }, 21866 /* 107 << 128 */ 21867 { { 0x44b7d589d51bbde9l,0x15de755fd6a4cc98l,0x9b6ea8e582fb8e2el, 21868 0x9d9294f04332bc22l }, 21869 { 0x53c6b2b7d1fa239al,0x286bf536693ca4f1l,0xc3fa754603c00f65l, 21870 0xc046713af49cdb48l }, 21871 0 }, 21872 /* 113 << 128 */ 21873 { { 0xe356f5f11d82d5d6l,0xa0346a73d035ca0cl,0x14c76adee1884448l, 21874 0xd8369bdd1c23dde9l }, 21875 { 0x13017862fe025eafl,0x6b5ac5e9a76be1d7l,0x52d621a94933bb6el, 21876 0xb045b53baa8c1d3fl }, 21877 0 }, 21878 /* 116 << 128 */ 21879 { { 0x242da39e4e40466al,0xc03cb184ac322b07l,0x776b744f9aaa10bfl, 21880 0xb80d9f14fe7d4beal }, 21881 { 0x75cd14308f9c4908l,0xa4e59ce9087b3d7al,0x3bbdce598cdca614l, 21882 0x58c57113bc1a5df1l }, 21883 0 }, 21884 /* 119 << 128 */ 21885 { { 0x2a70af1abd79d467l,0x68dc4f23f63e2b73l,0x4345572f1f67b23dl, 21886 0xc012b08f3a340718l }, 21887 { 0x9458585cc963dbe2l,0x21d84032223a495cl,0x0d54a4ea0dc28159l, 21888 0xd9549e2c9b927dafl }, 21889 0 }, 21890 /* 125 << 128 */ 21891 { { 0xcd54ebd2d43c8cd2l,0x5ff4ded6a817b9f9l,0x6f59bc31245386d3l, 21892 0x65b67cb0a2077821l }, 21893 { 0x36407956405ffa07l,0x723e0252d589f27al,0x052004b888e1239el, 21894 0x8e6d188d69fdf94dl }, 21895 0 }, 21896 }, 21897 { 21898 /* 0 << 136 */ 21899 { { 0x00, 0x00, 0x00, 0x00 }, 21900 { 0x00, 0x00, 0x00, 0x00 }, 21901 1 }, 21902 /* 1 << 136 */ 21903 { { 0xc16c236e846e364fl,0x7f33527cdea50ca0l,0xc48107750926b86dl, 21904 0x6c2a36090598e70cl }, 21905 { 0xa6755e52f024e924l,0xe0fa07a49db4afcal,0x15c3ce7d66831790l, 21906 0x5b4ef350a6cbb0d6l }, 21907 0 }, 21908 /* 3 << 136 */ 21909 { { 0xe2a37598a9d82abfl,0x5f188ccbe6c170f5l,0x816822005066b087l, 21910 0xda22c212c7155adal }, 21911 { 0x151e5d3afbddb479l,0x4b606b846d715b99l,0x4a73b54bf997cb2el, 21912 0x9a1bfe433ecd8b66l }, 21913 0 }, 21914 /* 4 << 136 */ 21915 { { 0xe13122f3dbfb894el,0xbe9b79f6ce274b18l,0x85a49de5ca58aadfl, 21916 0x2495775811487351l }, 21917 { 0x111def61bb939099l,0x1d6a974a26d13694l,0x4474b4ced3fc253bl, 21918 0x3a1485e64c5db15el }, 21919 0 }, 21920 /* 5 << 136 */ 21921 { { 0x5afddab61430c9abl,0x0bdd41d32238e997l,0xf0947430418042ael, 21922 0x71f9addacdddc4cbl }, 21923 { 0x7090c016c52dd907l,0xd9bdf44d29e2047fl,0xe6f1fe801b1011a6l, 21924 0xb63accbcd9acdc78l }, 21925 0 }, 21926 /* 7 << 136 */ 21927 { { 0x0ad7337ac0b7eff3l,0x8552225ec5e48b3cl,0xe6f78b0c73f13a5fl, 21928 0x5e70062e82349cbel }, 21929 { 0x6b8d5048e7073969l,0x392d2a29c33cb3d2l,0xee4f727c4ecaa20fl, 21930 0xa068c99e2ccde707l }, 21931 0 }, 21932 /* 9 << 136 */ 21933 { { 0x5b826fcb1b3ec67bl,0xece1b4b041356616l,0x7d5ce77e56a3ab4fl, 21934 0xf6087f13aa212da0l }, 21935 { 0xe63015054db92129l,0xb8ae4c9940407d11l,0x2b6de222dfab8385l, 21936 0x9b323022b7d6c3b4l }, 21937 0 }, 21938 /* 10 << 136 */ 21939 { { 0x057ef17a5ae6ad84l,0x9feae00b293a6ae0l,0xd18bb6c154266408l, 21940 0xd3d3e1209c8e8e48l }, 21941 { 0xba8d4ca80e94fc8fl,0x80262ffc8a8ea0fel,0xac5b2855f71655fdl, 21942 0xa348f8fae9aced89l }, 21943 0 }, 21944 /* 11 << 136 */ 21945 { { 0x60684b69a5660af3l,0x69aad23b9066d14bl,0x4d9f9b49fa4d020al, 21946 0xafb54ec1b5cd6a4al }, 21947 { 0x2b25fe1832fd864dl,0xee6945062b6b64d0l,0x954a2a515001d8aal, 21948 0x5e1008557082b5b3l }, 21949 0 }, 21950 /* 13 << 136 */ 21951 { { 0x20ecf71cbc90eb1bl,0x4234facf651c1df4l,0xc720fce9e681f678l, 21952 0x680becdda7c007f4l }, 21953 { 0x7c08dc063181afeal,0x75c1b050a34eca91l,0x7d3479d54b9e2333l, 21954 0xed16640af3951aa3l }, 21955 0 }, 21956 /* 15 << 136 */ 21957 { { 0x911b596264723e54l,0x34384f8c004b327cl,0x06ca5c61b85435f2l, 21958 0x12e0cd25e2c1075cl }, 21959 { 0xa4b84cb8ac727394l,0x50bd720492b352c1l,0xe85524a49cbd0fb4l, 21960 0x10b9274be7876024l }, 21961 0 }, 21962 /* 16 << 136 */ 21963 { { 0xef0a3fecfa181e69l,0x9ea02f8130d69a98l,0xb2e9cf8e66eab95dl, 21964 0x520f2beb24720021l }, 21965 { 0x621c540a1df84361l,0x1203772171fa6d5dl,0x6e3c7b510ff5f6ffl, 21966 0x817a069babb2bef3l }, 21967 0 }, 21968 /* 17 << 136 */ 21969 { { 0xb7cf93c3aace2c6al,0x017a96e658ff1bbfl,0x3b401301624a8250l, 21970 0xf5ef158529266518l }, 21971 { 0x3c968bef7585838dl,0x8e97d023853191abl,0x175022e4f6823389l, 21972 0xb6a3bfc2f6a9b4c1l }, 21973 0 }, 21974 /* 19 << 136 */ 21975 { { 0x515acf174591d77el,0xb393c89e3c3b25b6l,0x291e068e9c95abd7l, 21976 0x256b72c046c02544l }, 21977 { 0x8172af03915ea92fl,0xc1b324ae4fcd0f03l,0x8abc779215108993l, 21978 0xe05fe6867ab815ael }, 21979 0 }, 21980 /* 21 << 136 */ 21981 { { 0xca08d4095bc42740l,0xdd2c19d3e26e2e60l,0x27afdeded7c091fal, 21982 0x3b943b0faf25cb22l }, 21983 { 0x400af8be026047e9l,0x3149b35f772b8ff9l,0x3ddb2c06f17229d9l, 21984 0xcd604aeadac152fcl }, 21985 0 }, 21986 /* 23 << 136 */ 21987 { { 0xea2275311c0f6803l,0x9ae82d5ea394cc08l,0xc107a2cfbe32080cl, 21988 0x550f35a76429f6d7l }, 21989 { 0x483c94dacfb70c0cl,0xf26f8e5d90190c94l,0x8574b3cf86bf2620l, 21990 0xe7258e45df9f482fl }, 21991 0 }, 21992 /* 25 << 136 */ 21993 { { 0x8f8dc582da46f1cfl,0x61d76cf91e1e7427l,0x8aceb48b306c84aal, 21994 0xecaa142f28ebff98l }, 21995 { 0xac5bd940401d80fel,0x0caacb8fe800cf9el,0x99068da9b3359af5l, 21996 0x92fdd5795225b8c0l }, 21997 0 }, 21998 /* 27 << 136 */ 21999 { { 0x5a29d1c5ab56a3fbl,0x4e46ffc0a9aab4afl,0xa210472624d83080l, 22000 0xb5820998007f08b6l }, 22001 { 0x9ce1188e4bc07b3el,0xbf6d0dbe32a19898l,0x5d5c68ea5b2350bal, 22002 0xd6c794eb3aa20b45l }, 22003 0 }, 22004 /* 28 << 136 */ 22005 { { 0x3de605ba9ec598cfl,0x1933d3ae4d3029ael,0x6bf2fabd9b140516l, 22006 0x712dfc5559a7d01cl }, 22007 { 0xff3eaae0d2576366l,0x36e407f948701cf8l,0xede21d89b41f4bd4l, 22008 0xc5292f5c666eefa9l }, 22009 0 }, 22010 /* 29 << 136 */ 22011 { { 0x30045782c3ebcd77l,0xaa0cf3c73fdbe72el,0x719ec58ef8f43b39l, 22012 0x9716fb9972574d3al }, 22013 { 0x300afc2b0d03ccd6l,0xb60016a34f3fac41l,0x8898910ea3a439f6l, 22014 0xdc00a99707ca11f5l }, 22015 0 }, 22016 /* 31 << 136 */ 22017 { { 0x291b15ee8ed34662l,0xb780d54b2ee422a7l,0x5b9e3788fcfe4ccbl, 22018 0x4554cb8cbe8b7c3al }, 22019 { 0xfdaccc2209a85a7fl,0x51f4a8ec555497edl,0x07dc69037da33505l, 22020 0xa3bc8bfcbc1fc1dbl }, 22021 0 }, 22022 /* 33 << 136 */ 22023 { { 0x661638c151e25257l,0x0a6fd99c53304974l,0x29d8ae165078eec6l, 22024 0xed7512ad447b73del }, 22025 { 0x0e21de607a4d0e9bl,0x842abd422462be01l,0x3be82afa5cddc709l, 22026 0x25bb9da99b52797dl }, 22027 0 }, 22028 /* 34 << 136 */ 22029 { { 0x80613af28adc986al,0x4602284935776a41l,0x17d33e0f4665d03cl, 22030 0xeb12eb6c0df12b50l }, 22031 { 0x0f0effa0ee41527fl,0x8ca2edb680531563l,0x4c354679f28c52c3l, 22032 0x67f1ba5c2f6df66dl }, 22033 0 }, 22034 /* 35 << 136 */ 22035 { { 0x9c27207a2479fb3fl,0xef6e0f13515fb902l,0x3f7ad9e9d0d9436el, 22036 0x36eb4ea5893bbcf5l }, 22037 { 0x5c53a2ac02b316b7l,0x10c75ee1f54f7585l,0x29e5879c3c7a4c1bl, 22038 0x77da3c82f29c67d6l }, 22039 0 }, 22040 /* 36 << 136 */ 22041 { { 0xf2b75d21ef78a852l,0xba38cd34dd31a900l,0x72b3a68658ffe18al, 22042 0x7464190cbfd95745l }, 22043 { 0x406e532177ed6e81l,0x1af0975bde535eabl,0x66ba22c760c54c82l, 22044 0x88e3b1ceb00a2fe0l }, 22045 0 }, 22046 /* 37 << 136 */ 22047 { { 0xb6099b7df7e5c69bl,0x84aa1e26ba34ee2fl,0x5952600405c338bbl, 22048 0xe9a134374951a539l }, 22049 { 0xb12276526ec196bdl,0x26a7be264b6dce36l,0x052e10a4e2a68458l, 22050 0x475fc74c1f38898bl }, 22051 0 }, 22052 /* 39 << 136 */ 22053 { { 0x120167fc0a3eb4e1l,0xaa94bc70c0c21204l,0x313cd835e1243b75l, 22054 0x3bb63fb20bfd6a4al }, 22055 { 0xa615dcae21ef05cfl,0x63774c2ec23c3ee5l,0x39365b1fed0dfd65l, 22056 0xb610e6ff5d2a2d7dl }, 22057 0 }, 22058 /* 40 << 136 */ 22059 { { 0x55b7f977f0337b15l,0x3bc872a30e94973al,0x624ad983770deea0l, 22060 0xcaab336413a5efdbl }, 22061 { 0x391dd0027a0d4247l,0x39590d5df312aed5l,0x532802c9351365acl, 22062 0xdd2e824578a2e22al }, 22063 0 }, 22064 /* 41 << 136 */ 22065 { { 0x81b0d7be7f774fb8l,0x62f32bb3aa412425l,0xbe7afe26bbcd2162l, 22066 0xa6ce167c53c7fa7dl }, 22067 { 0x8deca64fc5c4fc5bl,0x70e546aba6efd2fel,0xf2d8495987ff672al, 22068 0x2ca551f249c3059el }, 22069 0 }, 22070 /* 43 << 136 */ 22071 { { 0x40b62d528eb99155l,0xe6b048947420a7e0l,0x9ebecb2bc685e58al, 22072 0x3ea642d8d3c8d2cbl }, 22073 { 0x5340ac6ed489d0dfl,0xf3846d08c2b7588el,0x4cecd8a0611c289bl, 22074 0xdddc39c50dd71421l }, 22075 0 }, 22076 /* 44 << 136 */ 22077 { { 0x98c6a6a52ebee687l,0xcdf65bfa56c1c731l,0x48e8132772def210l, 22078 0x4ea119418083b5a5l }, 22079 { 0x3fdcea4fffebb525l,0x55aaea19fb50bf72l,0x5fbedc0a2a85b40cl, 22080 0x0d6fd954bf44f29fl }, 22081 0 }, 22082 /* 45 << 136 */ 22083 { { 0x83a8302a9db4071el,0x52f104436f8ae934l,0x96de829d175b800al, 22084 0x20ff5035373e97cel }, 22085 { 0xf58660185f65356al,0x992c15054c8cd782l,0x0b962c8eb57d727fl, 22086 0xe8a9abc92bba8bc7l }, 22087 0 }, 22088 /* 46 << 136 */ 22089 { { 0x81a85ddd7cf2b565l,0x5e51e6afc34a0305l,0xa8d94ccefbc89faal, 22090 0x2bfd97c1e68cd288l }, 22091 { 0x16d79c21af2958b8l,0x5e5d989defda7df8l,0x6d2f0ca6ff734c8al, 22092 0xfa5b8dd32cc9bafel }, 22093 0 }, 22094 /* 47 << 136 */ 22095 { { 0x5787a9934e6ed688l,0x6815f3b5aab42f46l,0x7960f45b093c6c66l, 22096 0xb2b9829728be10cfl }, 22097 { 0x1d4c7790296568cdl,0xa279a877f048e194l,0xcf7c20f4c6a58b4el, 22098 0xf0c717afa1f9c00fl }, 22099 0 }, 22100 /* 48 << 136 */ 22101 { { 0x8a10b53189e800cal,0x50fe0c17145208fdl,0x9e43c0d3b714ba37l, 22102 0x427d200e34189accl }, 22103 { 0x05dee24fe616e2c0l,0x9c25f4c8ee1854c1l,0x4d3222a58f342a73l, 22104 0x0807804fa027c952l }, 22105 0 }, 22106 /* 49 << 136 */ 22107 { { 0x79730084ba196afcl,0x17d38e98054bd539l,0xc5cfff3918583239l, 22108 0x4b0db5a2d9adbee6l }, 22109 { 0x9bc9f1e3c2a304e8l,0xbaa61de7de406fa8l,0x8e921ca9e4bec498l, 22110 0xd9f4e5ae6604ab02l }, 22111 0 }, 22112 /* 51 << 136 */ 22113 { { 0xdf6b97b5b37f2097l,0x7576c3f9b4a5d2b9l,0x6eb697ed3588cabbl, 22114 0x4d75b38622598d8fl }, 22115 { 0x4e6d93b522ff55e8l,0x4620ec635b8f7edal,0xd5006209f97b7749l, 22116 0x9e22e3a84da8b464l }, 22117 0 }, 22118 /* 52 << 136 */ 22119 { { 0xbabfb7f82e8f326fl,0xed9cac225625a519l,0xf1109c1a0edae0a9l, 22120 0x45f80a9858521259l }, 22121 { 0x37a44b075ab71f44l,0x21699eb64a21161bl,0xb523fddf56fe67eel, 22122 0x9f5c3a2120b9f72el }, 22123 0 }, 22124 /* 53 << 136 */ 22125 { { 0x12c1131508b75673l,0xfa20121823b096d6l,0x839f01aeeacd6537l, 22126 0x0e592be787df32cal }, 22127 { 0xfe3f65ff8b7dd0fcl,0xed09b4875c1d9a80l,0x8c09dd97b79786d8l, 22128 0x74eba2806c5bc983l }, 22129 0 }, 22130 /* 55 << 136 */ 22131 { { 0xf917704862987b50l,0xcc84cdc6bc4ac456l,0x8bd2c922ae08fe12l, 22132 0x09d5f661fc2d06c7l }, 22133 { 0xd10ac6dd9457d47fl,0x65aa30a23668060cl,0x33cddac6745161fcl, 22134 0xf4c18b5ea51e540fl }, 22135 0 }, 22136 /* 57 << 136 */ 22137 { { 0x591c064ede723c1fl,0x92e5d4e601a4adael,0x3d7ee8a3145716ecl, 22138 0x0ef4c62061727816l }, 22139 { 0x0e17c576f1bf6d6el,0x173104015ae18045l,0xdad620aae9589b75l, 22140 0xb10c7e2d0eda4905l }, 22141 0 }, 22142 /* 59 << 136 */ 22143 { { 0xb8020f16aa08df6fl,0x03cf58ffd67054e9l,0x302e003c11fe3d1al, 22144 0x9c194bc1c638a3ecl }, 22145 { 0x8ed3cb3adefd3f1el,0xc4115e079bf39de4l,0x8dece48bdf46fdf6l, 22146 0xebd1dbcf30eafeafl }, 22147 0 }, 22148 /* 60 << 136 */ 22149 { { 0x058eb276fba319c5l,0xd33a91127f7fa54al,0xf060c1b4932a2dabl, 22150 0xce3a224e79c7d9bfl }, 22151 { 0x6fb0388c0ba92823l,0x8d31738a69787881l,0x2d86eb0203cd00b7l, 22152 0x4e6e44512b69911bl }, 22153 0 }, 22154 /* 61 << 136 */ 22155 { { 0xff2efe1cfdcca1cfl,0x08f22c69b5bb71e3l,0xc63f4a9f7023076el, 22156 0x88fb2aa0ce0c490el }, 22157 { 0xcc7c97f91f77783cl,0x360026d942ab36b7l,0x547c34ecefd68f70l, 22158 0xebe7f99efbabfdabl }, 22159 0 }, 22160 /* 63 << 136 */ 22161 { { 0xe7c1c1788613e87al,0xb035d65e60b82654l,0x055a82d03583a254l, 22162 0x27ce1ffc9b3b22fal }, 22163 { 0x0cf904917ec83cd5l,0xfc6c21805604aa40l,0x1330604099357428l, 22164 0x9b0982f9ad4818b7l }, 22165 0 }, 22166 /* 64 << 136 */ 22167 { { 0xc222653a4f0d56f3l,0x961e4047ca28b805l,0x2c03f8b04a73434bl, 22168 0x4c966787ab712a19l }, 22169 { 0xcc196c42864fee42l,0xc1be93da5b0ece5cl,0xa87d9f22c131c159l, 22170 0x2bb6d593dce45655l }, 22171 0 }, 22172 /* 65 << 136 */ 22173 { { 0x3a6080d9fb56bc3al,0xf1552dcad6212d7el,0x977ac5b59420f4f6l, 22174 0xef914d370e3cd97fl }, 22175 { 0x807bd6e69c04f768l,0x743a7b552bb803f6l,0x7f5c20804215f4b0l, 22176 0x41e331288fc6ce42l }, 22177 0 }, 22178 /* 71 << 136 */ 22179 { { 0x5a31c9ac61e6a460l,0x55102e4093e7eeddl,0x969fe0612da6adcel, 22180 0xe8cddc2f3ffea1d9l }, 22181 { 0xaa26c6b1f0f327c5l,0x9e5b63743544f5e1l,0x5159fa1ddbaa685bl, 22182 0x9892d03aa7f44b99l }, 22183 0 }, 22184 /* 77 << 136 */ 22185 { { 0x4dfcbf12e2c6fc1fl,0x703f2f5b7535ac29l,0x78f8617e82f7dc0fl, 22186 0x54b835ff853e792dl }, 22187 { 0x3cc7f000df9f7353l,0x0d7ffd68db5a157al,0x2c1c33691672b21cl, 22188 0x694b4904ac970ef8l }, 22189 0 }, 22190 /* 83 << 136 */ 22191 { { 0xd655bc42c1d2c45cl,0x572f603cbd22b05fl,0xa7fbf09388e4531al, 22192 0x8d38bbd91fdde98dl }, 22193 { 0x16cc2aaa73b0fa01l,0x515019a25e8ffb04l,0xb075990611e792ccl, 22194 0x89df06f399112c90l }, 22195 0 }, 22196 /* 89 << 136 */ 22197 { { 0x26d435c2481b46dal,0x73ab7e96266e9b3al,0x22d5b1db3c613c40l, 22198 0x9de4021c6727e399l }, 22199 { 0x451ebba56051f8c9l,0xa37f6ec52c281a58l,0x3d7a28fe0e9f4cc5l, 22200 0x0f45bcd655b64df7l }, 22201 0 }, 22202 /* 95 << 136 */ 22203 { { 0xba2a718c66616fbel,0x4b27810b3369a9acl,0x50b8391a2b426d5fl, 22204 0x420c88efa626fa05l }, 22205 { 0xe39cef97b9c39a30l,0xcae7cde85e67e5d0l,0x3821f8319a58e521l, 22206 0xbf474d1941479509l }, 22207 0 }, 22208 /* 101 << 136 */ 22209 { { 0x401bbab58fb15118l,0xb0376892dbf38b39l,0x10e4b9dd3a3ca42al, 22210 0xa69c2693f8063ffel }, 22211 { 0xe10facdde07cb761l,0x96f4dde831d7759al,0xd702fdecc2cc7f9fl, 22212 0x9e87e46e1ac0162cl }, 22213 0 }, 22214 /* 107 << 136 */ 22215 { { 0xb6cd60518479ca8fl,0xcca345e60968f6c7l,0x7b57248a64a9afe7l, 22216 0x5552e3511d0d4db9l }, 22217 { 0x8f749b199dc68aabl,0x0fb86f06db1f7819l,0x23b300963143ac09l, 22218 0x61c166d8abfbcb9bl }, 22219 0 }, 22220 /* 113 << 136 */ 22221 { { 0x4c96e85a43101165l,0x393a882fcf39bd19l,0xef9e1d42c2df6f33l, 22222 0xe1775c990278f088l }, 22223 { 0xb1581929a9250d4al,0x582b0608c4168873l,0x0b3ffba3a1e68cd8l, 22224 0x3f78147ef9490897l }, 22225 0 }, 22226 /* 116 << 136 */ 22227 { { 0x277b5177eb18ff20l,0x48002e9828f06d62l,0xece8d6c30e506d8dl, 22228 0x5cde0a58cd9ff963l }, 22229 { 0x3b97cdb74e3baa0el,0x50560c0b631238f9l,0xe1c31b35cf79793dl, 22230 0x95d12f14355e2178l }, 22231 0 }, 22232 /* 119 << 136 */ 22233 { { 0x0143f695bcc31b77l,0x3627aed14c49b65al,0x6e4f7a9ce441c183l, 22234 0xb708c79de1bfa0a3l }, 22235 { 0xdbf0fc313a0726b8l,0xe04d82a8852d78bbl,0xb859001e3be5d398l, 22236 0x92dcc20c8e89bd11l }, 22237 0 }, 22238 /* 125 << 136 */ 22239 { { 0x5f2416a3df9026b4l,0xffc01f3afcb29a1bl,0x18d02c9f1d94b20fl, 22240 0xd93b0f2f81cfdef3l }, 22241 { 0xe6b0fd4713adf5f2l,0xcc9067b7ba06dff3l,0xb48c0cbb2256f842l, 22242 0xc2ae741dfd34df2fl }, 22243 0 }, 22244 }, 22245 { 22246 /* 0 << 144 */ 22247 { { 0x00, 0x00, 0x00, 0x00 }, 22248 { 0x00, 0x00, 0x00, 0x00 }, 22249 1 }, 22250 /* 1 << 144 */ 22251 { { 0x80531fe1c63c4962l,0x50541e89981fdb25l,0xdc1291a1fd4c2b6bl, 22252 0xc0693a17a6df4fcal }, 22253 { 0xb2c4604e0117f203l,0x245f19630a99b8d0l,0xaedc20aac6212c44l, 22254 0xb1ed4e56520f52a8l }, 22255 0 }, 22256 /* 3 << 144 */ 22257 { { 0x18f37a9c6bdf22dal,0xefbc432f90dc82dfl,0xc52cef8e5d703651l, 22258 0x82887ba0d99881a5l }, 22259 { 0x7cec9ddab920ec1dl,0xd0d7e8c3ec3e8d3bl,0x445bc3954ca88747l, 22260 0xedeaa2e09fd53535l }, 22261 0 }, 22262 /* 4 << 144 */ 22263 { { 0xa12b384ece53c2d0l,0x779d897d5e4606dal,0xa53e47b073ec12b0l, 22264 0x462dbbba5756f1adl }, 22265 { 0x69fe09f2cafe37b6l,0x273d1ebfecce2e17l,0x8ac1d5383cf607fdl, 22266 0x8035f7ff12e10c25l }, 22267 0 }, 22268 /* 5 << 144 */ 22269 { { 0xb7d4cc0f296c9005l,0x4b9094fa7b0aebdbl,0xe1bf10f1c00ec8d4l, 22270 0xd807b1c4d667c101l }, 22271 { 0xa9412cdfbe713383l,0x435e063e81142ba1l,0x984c15ecaf0a6bdcl, 22272 0x592c246092a3dab9l }, 22273 0 }, 22274 /* 7 << 144 */ 22275 { { 0x9365690016e23e9dl,0xcb220c6ba7cc41e1l,0xb36b20c369d6245cl, 22276 0x2d63c348b62e9a6al }, 22277 { 0xa3473e19cdc0bcb5l,0x70f18b3f8f601b98l,0x8ad7a2c7cde346e4l, 22278 0xae9f6ec3bd3aaa64l }, 22279 0 }, 22280 /* 9 << 144 */ 22281 { { 0x030223503274c7e1l,0x61ee8c934c4b6c26l,0x3c4397e3199389cel, 22282 0xe0082600488757cel }, 22283 { 0xaac3a2df06b4dafbl,0x45af0700ddff5b6al,0x0a5974248c1d9fa0l, 22284 0x1640087d391fc68bl }, 22285 0 }, 22286 /* 10 << 144 */ 22287 { { 0x26a43e41d07fa53dl,0x3154a78a74e35bc5l,0x7b768924e0da2f8cl, 22288 0xba964a2b23613f9al }, 22289 { 0x5a548d35ba1d16c4l,0x2e1bfed1fb54d057l,0xff992136bc640205l, 22290 0xf39cb9148156df29l }, 22291 0 }, 22292 /* 11 << 144 */ 22293 { { 0xf4873fcf4e5548bdl,0x8725da3f03ce57f0l,0xd82f5c95ca953258l, 22294 0xac647f127cf0747el }, 22295 { 0xff2038b02d570bd5l,0xb0c2a767a13ae03fl,0xebaa27cde9932d16l, 22296 0xa686e3fc1234e901l }, 22297 0 }, 22298 /* 13 << 144 */ 22299 { { 0x9f80435e63261eccl,0x6302a62e4337d6c9l,0x91916a49ca4958a0l, 22300 0x554958993149d5d3l }, 22301 { 0x378d020b9f91de3cl,0x47b839a34dd25170l,0x2825854138b7f258l, 22302 0xea5b14f7437e7decl }, 22303 0 }, 22304 /* 15 << 144 */ 22305 { { 0x74f08736b0018f44l,0xf4a03417b446d0f5l,0x66a4aa2fa40ca6b2l, 22306 0x215679f0badb60edl }, 22307 { 0x3871195a323e4eefl,0x8f0940c320952b16l,0xfe8dac62879d5f7dl, 22308 0x649cb623c1a6e875l }, 22309 0 }, 22310 /* 16 << 144 */ 22311 { { 0xecaff541338d6e43l,0x56f7dd734541d5ccl,0xb5d426de96bc88cal, 22312 0x48d94f6b9ed3a2c3l }, 22313 { 0x6354a3bb2ef8279cl,0xd575465b0b1867f2l,0xef99b0ff95225151l, 22314 0xf3e19d88f94500d8l }, 22315 0 }, 22316 /* 17 << 144 */ 22317 { { 0xa26a9087133ec108l,0x5dc5699f2712bdc0l,0x96903f4dd14224a9l, 22318 0x3da5992429e47b80l }, 22319 { 0xb717712ff9dbba5al,0x9e52004b756391c9l,0xe669a11dcc9d219cl, 22320 0x3b6e6b84d1d6c07dl }, 22321 0 }, 22322 /* 19 << 144 */ 22323 { { 0x5feec06a676feadbl,0xfc449bc59d69f322l,0x1d8d7b5e7cda8895l, 22324 0x5ed54dc11a3314a7l }, 22325 { 0x1a11d2ae6de889c0l,0xb2a979724ced2bd9l,0x6ecf6989306a5ef6l, 22326 0x1611d57b8cc8a249l }, 22327 0 }, 22328 /* 21 << 144 */ 22329 { { 0x2d9942ba007cbf87l,0x4e62bce6df3fc926l,0xe7eee5b0e4560affl, 22330 0xe51963bb7cb009b7l }, 22331 { 0xaa5118cee29b37ddl,0x5cd84a4747263903l,0x3050caa6620055d8l, 22332 0x7ef576a76c4b1e3dl }, 22333 0 }, 22334 /* 23 << 144 */ 22335 { { 0x9026a4dde6008ff1l,0x49e995ad1c8cd96cl,0x80722e73503e589bl, 22336 0x05bcbce184c2bc26l }, 22337 { 0x255f9abbd4682c2cl,0xc42bcfc2f084d456l,0xa0eae9b0641c0767l, 22338 0x1b45632d864c9a2dl }, 22339 0 }, 22340 /* 25 << 144 */ 22341 { { 0xcf25793b6ae024e0l,0x1b6607b484b5c4b0l,0x9579fa903f1624c8l, 22342 0x37fb65be68bd57e8l }, 22343 { 0xd693a55efc39c203l,0x4e267ac4c87252e9l,0xb8d78bb09f899413l, 22344 0xe4c014070b3b8508l }, 22345 0 }, 22346 /* 27 << 144 */ 22347 { { 0x662906e5bc3f3553l,0xde38d53531459684l,0x8f46a8c634f7280dl, 22348 0xaaf91b873d24198el }, 22349 { 0xecd5ee115f9b117el,0xce00ffbe50ae8ddal,0x263a3d4e7710a9ael, 22350 0x0ff3f721f26ba74fl }, 22351 0 }, 22352 /* 28 << 144 */ 22353 { { 0x4a8a4f47f0cefa69l,0xdc8e4cbaa4546866l,0x359ba69b23f603c1l, 22354 0xdab4d601187b7ac5l }, 22355 { 0xa6ca4337c1ebc8d9l,0x9fa6585452b4074bl,0x1a4b4f81902fb733l, 22356 0xd2bb5d7aa525deaal }, 22357 0 }, 22358 /* 29 << 144 */ 22359 { { 0xcc287ac2e6b3577al,0xd7528ca7f612003bl,0x8afdb6f12c1400b8l, 22360 0x103a2ed346a2dd8dl }, 22361 { 0xc8f8c54d2ee21339l,0x8f011b92355a2d20l,0x81c6fc9f1346f2acl, 22362 0xdb6042f005a6d24bl }, 22363 0 }, 22364 /* 31 << 144 */ 22365 { { 0xfc90e3630da4f996l,0x8ceca49daa6d6fe4l,0x1084affdbdfc619bl, 22366 0x2029f672c1140b04l }, 22367 { 0x606ec25f136f3e5el,0x6d24149b02224c4al,0xabb0f142cfdfcf4cl, 22368 0xe40d0419fab1a0edl }, 22369 0 }, 22370 /* 33 << 144 */ 22371 { { 0xcfdd08265cbccb84l,0x2258a16e88ad93c4l,0xb3ac365e728c5ad3l, 22372 0x0bbf97808560df1fl }, 22373 { 0x42d08a39bad8c7b8l,0x1e3960106d3e8b91l,0xc332b39910274f58l, 22374 0xe0a84dacce2ea778l }, 22375 0 }, 22376 /* 34 << 144 */ 22377 { { 0x113e1189ff432945l,0x4a0d2c3d04e1106cl,0xcde487744f3597b1l, 22378 0x853b029174fa26eal }, 22379 { 0x2149e0ff02662e26l,0xb3181eaa5e6a030fl,0x086fc2159b006340l, 22380 0xa1df84a694a4e0bbl }, 22381 0 }, 22382 /* 35 << 144 */ 22383 { { 0xc2cbd80ac99f8d3dl,0xe24b9d8f50ecf4f4l,0xf18d34728ecb126al, 22384 0x83966662e1670aael }, 22385 { 0x1cece80fda5f594el,0x545e94ae65f391e0l,0xf3286dff93f98bb7l, 22386 0xf945e6cdf5abf176l }, 22387 0 }, 22388 /* 36 << 144 */ 22389 { { 0x00ba5995dd95ac33l,0xa4957a40738f3bf4l,0x073539f599438a85l, 22390 0xcc9c43acc2eb1411l }, 22391 { 0xe27501b5be2ec3d2l,0xa88d4ed057a85458l,0x870ae236755c8777l, 22392 0x0933c5af89216cbal }, 22393 0 }, 22394 /* 37 << 144 */ 22395 { { 0xb5feea219e40e37fl,0x8c5ccb159e20fd60l,0xaeddc502ce8209a1l, 22396 0xbdf873cc11e793b3l }, 22397 { 0xbc938103f0de8db5l,0x619fb72fb0e9d3d5l,0x800147cb588ed2adl, 22398 0x260f92bb7901ced8l }, 22399 0 }, 22400 /* 39 << 144 */ 22401 { { 0x72dd9b089848c699l,0xc6086381185dacc1l,0x9489f11ff7d5a4c8l, 22402 0xedb41d5628dee90fl }, 22403 { 0x1091db6b09af693cl,0xc7587551ae4b6413l,0x806aefb0768227adl, 22404 0x4214b83eafb3c88el }, 22405 0 }, 22406 /* 40 << 144 */ 22407 { { 0xddfb02c4c753c45fl,0x18ca81b6f9c840fel,0x846fd09ab0f8a3e6l, 22408 0xb1162adde7733dbcl }, 22409 { 0x7070ad20236e3ab6l,0xf88cdaf5b2a56326l,0x05fc8719997cbc7al, 22410 0x442cd4524b665272l }, 22411 0 }, 22412 /* 41 << 144 */ 22413 { { 0x748819f9aa9c0ef5l,0xd7227d8ba458ad48l,0x8d67399f27aef626l, 22414 0xc6241a1859bf0a4cl }, 22415 { 0xed9b0bfcc31cb9bbl,0x591254f896142555l,0x80e4bab461134151l, 22416 0x7c5e680243efbd83l }, 22417 0 }, 22418 /* 43 << 144 */ 22419 { { 0x7f3f5a1706b9b7ddl,0x392132e75faeb417l,0x508ac4788fae38a2l, 22420 0x2b854ead0d3499c3l }, 22421 { 0x26a687d8ef18bf0fl,0x62ff0c4a8ae00b61l,0x84111011f48578f2l, 22422 0xa879f383cd0fcd3al }, 22423 0 }, 22424 /* 44 << 144 */ 22425 { { 0xeb7615aa202992f0l,0xde0562b38361d0b3l,0x789a302862027ee0l, 22426 0xe3e3e9921048f899l }, 22427 { 0x07945c246deadab4l,0xeb06a15ec77d894el,0xb825af36bab1416bl, 22428 0x99083c4df4b4e04fl }, 22429 0 }, 22430 /* 45 << 144 */ 22431 { { 0x4684a8f27b3ad6c3l,0x58238dbd928d9b6bl,0x31865b998da2c495l, 22432 0xc1ca784fb8e7cda1l }, 22433 { 0xc9605dc71e081572l,0x8f560bcdef8ed104l,0x51f73981bd3feaedl, 22434 0xc778aa4e4251c88dl }, 22435 0 }, 22436 /* 46 << 144 */ 22437 { { 0x9c0daa63aa502800l,0x73c7959a1e15b9bdl,0xd0447bcb7ab10f6cl, 22438 0x05b8fbc8b8311bdel }, 22439 { 0xa8a74be1915d5c4el,0x38d41c1e0b7c0351l,0x5bb2d49ff52d6568l, 22440 0x6c48d8eed5e43593l }, 22441 0 }, 22442 /* 47 << 144 */ 22443 { { 0x387b26d554159498l,0x92e92fad1ec34eb4l,0x0f88705e7a51b635l, 22444 0x66bcbf4dedca735fl }, 22445 { 0x0a4c6112dcb896ccl,0x148e1dfe6fc72ad9l,0x3de977fd2b4c9585l, 22446 0x0cd6e65f741e62cal }, 22447 0 }, 22448 /* 48 << 144 */ 22449 { { 0x7807f364b71698f5l,0x6ba418d29f7b605el,0xfd20b00fa03b2cbbl, 22450 0x883eca37da54386fl }, 22451 { 0xff0be43ff3437f24l,0xe910b432a48bb33cl,0x4963a128329df765l, 22452 0xac1dd556be2fe6f7l }, 22453 0 }, 22454 /* 49 << 144 */ 22455 { { 0x98ae40d53ce533bal,0x10342e1931fdd9c2l,0x54a255c8abf8b2bfl, 22456 0x8facc41b15f6fef7l }, 22457 { 0x2e195565bc65b38bl,0xb9f3abaaeaea63cbl,0xede2ab9bf2b7518bl, 22458 0x5e84102ce9ea3d81l }, 22459 0 }, 22460 /* 51 << 144 */ 22461 { { 0x162abc35113bc262l,0x8012f06829eb3fd4l,0x0e2727eb2c1ccf9cl, 22462 0x89561ff44b455b20l }, 22463 { 0xc48db835ee3b1fd4l,0x4075ca86095bbfa7l,0x0c498d7d98745182l, 22464 0x828fb93c5dfb5205l }, 22465 0 }, 22466 /* 52 << 144 */ 22467 { { 0xf95c7a5f0a76333bl,0x07603929cd607927l,0xabde328591028d3el, 22468 0x55765e8fa032a400l }, 22469 { 0x3041f2cabed17cd7l,0x018a5b7b9a9e5923l,0xca4867975bb9bae3l, 22470 0x741c802ecc382cb5l }, 22471 0 }, 22472 /* 53 << 144 */ 22473 { { 0x182a10311e5a3d8el,0xc352b8c8986c4d10l,0x7c50a172434c02ebl, 22474 0x121d728c4420c41cl }, 22475 { 0x0f8eca2a8a51812fl,0xdb6c4a4ea5158430l,0x67944e0b8d8f4144l, 22476 0x387cc2052405c77al }, 22477 0 }, 22478 /* 55 << 144 */ 22479 { { 0x98b36eb47e95ad76l,0x1973fa7d5f7e5ff7l,0xc4827abc6cc8a25cl, 22480 0x4263a0d3ec822ae4l }, 22481 { 0x49f113f35217a6f4l,0xf27cc9bb81748aa6l,0x9cb81d97d822e08el, 22482 0x698d2826b5c360bcl }, 22483 0 }, 22484 /* 57 << 144 */ 22485 { { 0x895f81514eb6d0b8l,0x32ef71df9f786536l,0x032a449430379a79l, 22486 0xa8c1076218bdb83fl }, 22487 { 0x7a3b0b8fe53a4064l,0x0e724a54e2ce89b7l,0x565baeba7a31f6bcl, 22488 0x12b9fa6387d18a7bl }, 22489 0 }, 22490 /* 59 << 144 */ 22491 { { 0x027231a3585bcfbdl,0x8690e977dca24269l,0x229c021afc6f1422l, 22492 0xd98050d044084cabl }, 22493 { 0x6add95d79d4fd09al,0x12484c68c15b24ddl,0xa79a8f4facf4f551l, 22494 0xf53204e27a83cbecl }, 22495 0 }, 22496 /* 60 << 144 */ 22497 { { 0xbc006413a906f7aal,0x9c8cd648bbeaf464l,0xaf5c7c64fb78cdf2l, 22498 0xe45839eafabc2375l }, 22499 { 0x1eb89bd150012172l,0x9d0d76194488518cl,0xd55a7238bd534d32l, 22500 0x48f35d5e95b4fe55l }, 22501 0 }, 22502 /* 61 << 144 */ 22503 { { 0xa6c5574f3e70a35al,0x35c11b5a8df97d97l,0x8f629f6cda85dd27l, 22504 0x94dab294c218452el }, 22505 { 0xa2e1882e8916c731l,0xc02ce77c8929e350l,0xa7ed351fe4eff8afl, 22506 0xeb76ef0654c3e1c1l }, 22507 0 }, 22508 /* 63 << 144 */ 22509 { { 0xc31d7cf87e3f5be5l,0x1472af0d3ce7f3a0l,0x226414f8f962e1afl, 22510 0xd318e3df16f54295l }, 22511 { 0x9a3f6aaf41477cd3l,0x7034172f66ec6b2el,0xbea54eb537413a62l, 22512 0x79f81262dc515e73l }, 22513 0 }, 22514 /* 64 << 144 */ 22515 { { 0x994f523a626332d5l,0x7bc388335561bb44l,0x005ed4b03d845ea2l, 22516 0xd39d3ee1c2a1f08al }, 22517 { 0x6561fdd3e7676b0dl,0x620e35fffb706017l,0x36ce424ff264f9a8l, 22518 0xc4c3419fda2681f7l }, 22519 0 }, 22520 /* 65 << 144 */ 22521 { { 0xb71a52b8b6bf8719l,0x0c7701f73196db36l,0xff1b936f53141cf4l, 22522 0x684d8a3c1b94a31cl }, 22523 { 0xe555633ab52386e1l,0x9353a2af91450578l,0xc53db6fab99b14bcl, 22524 0x1f2d42adcf619d36l }, 22525 0 }, 22526 /* 71 << 144 */ 22527 { { 0xbeb535ef3851c573l,0x3105fff585589843l,0xbe9f62a1d47aaf06l, 22528 0x6bb2ee5d107e1131l }, 22529 { 0x82530247a4a7699fl,0x3fb475e144872afbl,0x8ad43fd73c4c49f2l, 22530 0x3f7632882e045fc4l }, 22531 0 }, 22532 /* 77 << 144 */ 22533 { { 0x48440beb2924d7b2l,0x234163809c88fc57l,0xdc1d23d54ab08c2bl, 22534 0x576400b6e70feab0l }, 22535 { 0x3b8afb8ba66da779l,0x7a7e3bf445468f16l,0x1976ddf3231f79dfl, 22536 0xbe61c170b8531a9el }, 22537 0 }, 22538 /* 83 << 144 */ 22539 { { 0xf8d2dc768bf191b2l,0x3269e68813a39eb9l,0x104bb84be755eccfl, 22540 0xb8d1330f2868f807l }, 22541 { 0x2b29c74cb06c6059l,0x3648baa1a6440a26l,0x5dfae323f1e6b2c9l, 22542 0x9d0319b79330ac0al }, 22543 0 }, 22544 /* 89 << 144 */ 22545 { { 0x526ba3770e708bb2l,0x95c21ba327565dd9l,0x7071f46d48a0a873l, 22546 0xe4b9959efed6cc74l }, 22547 { 0x1b16bfd1e08a5afal,0xc87fec98d1789782l,0x200186e946cfd068l, 22548 0x88ea35a7280bf3ebl }, 22549 0 }, 22550 /* 95 << 144 */ 22551 { { 0x9e31943d42ac0e6cl,0xe61374cf1db8e40fl,0xbe27ea35a27db609l, 22552 0x7c5b91d67bf192e9l }, 22553 { 0xc2af846defd0a24bl,0x1b2efc37669b647al,0xbfc3c38e5e58ef8al, 22554 0xb6afb167e13ab5a2l }, 22555 0 }, 22556 /* 101 << 144 */ 22557 { { 0x08612d29b9f2aad4l,0x43c41330ad09dd17l,0xa45cb84a9f740519l, 22558 0x0a9ea9a7512ec031l }, 22559 { 0x6e90dccaee747f35l,0xe4388bd1f0a1479bl,0x966140c4e20a9029l, 22560 0x1bb1f65d7dd956abl }, 22561 0 }, 22562 /* 107 << 144 */ 22563 { { 0x066d206ea8f12bb3l,0xc9023b1b4325ec13l,0x1f56c72c96ead8ddl, 22564 0x454050fd8003e4c2l }, 22565 { 0x9ca258a58917aa9dl,0xfe24b282d94593cfl,0xea66c203752741cfl, 22566 0x5714268c295a895el }, 22567 0 }, 22568 /* 113 << 144 */ 22569 { { 0x72a9fbecc177d694l,0x38bb9387d68454d3l,0xa3d347bf590bc7d2l, 22570 0xcb6e292605ccc234l }, 22571 { 0x588abfcf0d393c01l,0xf053dadf539e5568l,0xad7480fef2a8b157l, 22572 0xff28c8bb018cac8fl }, 22573 0 }, 22574 /* 116 << 144 */ 22575 { { 0x12f1a00e7f5b8821l,0x0afa44e489b4b0cel,0x2dcaad8f6006338el, 22576 0x79c022cdba41242bl }, 22577 { 0x7f6ef7e17871d350l,0x946c2a91674253adl,0xf686d137a9cbbdd9l, 22578 0xa47ce2eaf7d4f9f2l }, 22579 0 }, 22580 /* 119 << 144 */ 22581 { { 0x1824991b205d40d6l,0x49cca1c085046a90l,0x7e23c1acd005e3c2l, 22582 0x093a9ae6d102c8ffl }, 22583 { 0xf4791082d2f40843l,0xe456021811645483l,0x8a59c3b0fd3a6b39l, 22584 0x39130e7f820de158l }, 22585 0 }, 22586 /* 125 << 144 */ 22587 { { 0xf7eef88d83b90783l,0xff60762af336d581l,0xf64f2d5dd801f5a0l, 22588 0x672b6ee7d6b3b8b9l }, 22589 { 0xa2a2dceb08034d69l,0x3eca27f635638218l,0xe7065986fa17fefdl, 22590 0xf1b74445f5803af1l }, 22591 0 }, 22592 }, 22593 { 22594 /* 0 << 152 */ 22595 { { 0x00, 0x00, 0x00, 0x00 }, 22596 { 0x00, 0x00, 0x00, 0x00 }, 22597 1 }, 22598 /* 1 << 152 */ 22599 { { 0x32670d2f7189e71fl,0xc64387485ecf91e7l,0x15758e57db757a21l, 22600 0x427d09f8290a9ce5l }, 22601 { 0x846a308f38384a7al,0xaac3acb4b0732b99l,0x9e94100917845819l, 22602 0x95cba111a7ce5e03l }, 22603 0 }, 22604 /* 3 << 152 */ 22605 { { 0x37a01e48a105fc8el,0x769d754a289ba48cl,0xc08c6fe1d51c2180l, 22606 0xb032dd33b7bd1387l }, 22607 { 0x953826db020b0aa6l,0x05137e800664c73cl,0xc66302c4660cf95dl, 22608 0x99004e11b2cef28al }, 22609 0 }, 22610 /* 4 << 152 */ 22611 { { 0x214bc9a7d298c241l,0xe3b697ba56807cfdl,0xef1c78024564eadbl, 22612 0xdde8cdcfb48149c5l }, 22613 { 0x946bf0a75a4d2604l,0x27154d7f6c1538afl,0x95cc9230de5b1fccl, 22614 0xd88519e966864f82l }, 22615 0 }, 22616 /* 5 << 152 */ 22617 { { 0x1013e4f796ea6ca1l,0x567cdc2a1f792871l,0xadb728705c658d45l, 22618 0xf7c1ff4ace600e98l }, 22619 { 0xa1ba86574b6cad39l,0x3d58d634ba20b428l,0xc0011cdea2e6fdfbl, 22620 0xa832367a7b18960dl }, 22621 0 }, 22622 /* 7 << 152 */ 22623 { { 0x1ecc032af416448dl,0x4a7e8c10ec76d971l,0x854f9805b90b6eael, 22624 0xfd0b15324bed0594l }, 22625 { 0x89f71848d98b5ca3l,0xd01fe5fcf039b3efl,0x4481332e627bda2el, 22626 0xe67cecd7a5073e41l }, 22627 0 }, 22628 /* 9 << 152 */ 22629 { { 0x2ab0bce94595a859l,0x4d8c2da082084ee7l,0x21ff8be5acca3d3cl, 22630 0xd8b805337827f633l }, 22631 { 0xf74e8c026becabbfl,0x9fae4dbefede4828l,0xd3885a5b3cc46bcfl, 22632 0x2d535e2b6e6ad144l }, 22633 0 }, 22634 /* 10 << 152 */ 22635 { { 0x63d3444507d9e240l,0x6fbadf4338cff7e6l,0x8717624a959c9461l, 22636 0xd7d951c411fb775bl }, 22637 { 0x4049161af6fc3a2bl,0x0dfa2547a1a8e98dl,0xeca780d439c2139cl, 22638 0xd8c2d8cbd73ea8efl }, 22639 0 }, 22640 /* 11 << 152 */ 22641 { { 0x3aa1974f07605b28l,0x4f3d82a71e296255l,0xbbe5ea03b4e23f16l, 22642 0x8f5c6c6b4e654193l }, 22643 { 0x27181182d3e8ab01l,0xc68bb231f3ba6bc2l,0x90a244d820af1fd7l, 22644 0x605abc055b713f4fl }, 22645 0 }, 22646 /* 13 << 152 */ 22647 { { 0xca5fe19bd221991al,0x271ff066f05f400el,0x9d46ec4c9cf09896l, 22648 0xdcaa8dfdec4febc3l }, 22649 { 0xaa3995a0adf19d04l,0xc98634239da573a6l,0x378058b2f2465b2bl, 22650 0x20d389f9b4c31612l }, 22651 0 }, 22652 /* 15 << 152 */ 22653 { { 0xd7d199c7b7631c9dl,0x1322c2b8bb123942l,0xe662b68fbe8b6848l, 22654 0xc970faf2cde99b14l }, 22655 { 0x61b27134b06655e5l,0xadcef8f781365d89l,0x917b5ab521b851aal, 22656 0x4f4472121cf694a7l }, 22657 0 }, 22658 /* 16 << 152 */ 22659 { { 0x488f1185ca8d9d1al,0xadf2c77dd987ded2l,0x5f3039f060c46124l, 22660 0xe5d70b7571e095f4l }, 22661 { 0x82d586506260e70fl,0x39d75ea7f750d105l,0x8cf3d0b175bac364l, 22662 0xf3a7564d21d01329l }, 22663 0 }, 22664 /* 17 << 152 */ 22665 { { 0x241e3907fe44e547l,0x42d464c36b992187l,0xeaa8fa989ba72f28l, 22666 0x965a8b8f6afbb81fl }, 22667 { 0x69356a7a8b375ea5l,0x22501ec741bdcc83l,0xf80f4e1445fb180cl, 22668 0xc0b12e95f5e1b822l }, 22669 0 }, 22670 /* 19 << 152 */ 22671 { { 0x977234e05483dc02l,0x0167430c13d8dcb2l,0xa9971278049912edl, 22672 0xab044b18ca40fa39l }, 22673 { 0xac9587449ff3896cl,0x75bb32eb860d1240l,0xf807071f6b958654l, 22674 0x67d2d3dc7121b4b6l }, 22675 0 }, 22676 /* 21 << 152 */ 22677 { { 0x3b61e67722f9f017l,0x9c593eb1a8541696l,0xbeba950050eda653l, 22678 0x07b5a48f5e673f6al }, 22679 { 0x748dca0013257aa3l,0x6bbddf9a7372e942l,0xc012f4badde83977l, 22680 0x6e59b327392ddb53l }, 22681 0 }, 22682 /* 23 << 152 */ 22683 { { 0xb2f3fff641356603l,0x50e63537545f042bl,0x55e5149770eb530dl, 22684 0x5a7383c310860c3bl }, 22685 { 0x7be30382ea669a09l,0xfdf735d289cc1c7fl,0x6e51ed844e0607cfl, 22686 0xdab566df4893795el }, 22687 0 }, 22688 /* 25 << 152 */ 22689 { { 0x20e3be0f8920690dl,0x98db80eaac279c05l,0x4cd5c60a44b8a4f8l, 22690 0xeda7e91c7b0335f4l }, 22691 { 0x45c1302a41ee5713l,0x1f6455fe588508d0l,0x82cb7311163d2fc3l, 22692 0xe866b90322f10b71l }, 22693 0 }, 22694 /* 27 << 152 */ 22695 { { 0xc217a2e259b4041el,0x85b96ce274526cbfl,0xcbfc4f5473f12687l, 22696 0x097caa5fd40225e7l }, 22697 { 0x0871ad406e91293fl,0x5f2ea207033b98ecl,0x0b3b8fac1f27d37al, 22698 0x7d72dd4c7f03876cl }, 22699 0 }, 22700 /* 28 << 152 */ 22701 { { 0xb51a40a51e6a75c1l,0x24327c760ea7d817l,0x0663018207774597l, 22702 0xd6fdbec397fa7164l }, 22703 { 0x20c99dfb13c90f48l,0xd6ac5273686ef263l,0xc6a50bdcfef64eebl, 22704 0xcd87b28186fdfc32l }, 22705 0 }, 22706 /* 29 << 152 */ 22707 { { 0x2f0c49ac95861439l,0xcdcb051b2e36e38al,0x459474080ae20c0cl, 22708 0x374baad2dddf0aabl }, 22709 { 0x291abc85d5d104a4l,0x0758001958a0657cl,0xd0f428e1a905ea13l, 22710 0x12599ddcf7241dbfl }, 22711 0 }, 22712 /* 31 << 152 */ 22713 { { 0x16222ce81bc3c403l,0xbacc1508fc13ca02l,0xfa98db4d920ee8e9l, 22714 0xe5fc39c4df12a359l }, 22715 { 0x4e8c9b90188733e8l,0x04283dd81394936cl,0x93b3db51cd130432l, 22716 0x33bfe3163c93ce31l }, 22717 0 }, 22718 /* 33 << 152 */ 22719 { { 0xb48591e9840b1724l,0x1009559f5885ec6fl,0x45ee51121b077620l, 22720 0x848f9800f1f4cc8al }, 22721 { 0x6ec1e0f74e97bceal,0x953bc23a98e80642l,0x9f0d1e8194ce7181l, 22722 0xeb3e6b9700eec596l }, 22723 0 }, 22724 /* 34 << 152 */ 22725 { { 0x6d34b39bff7514dal,0x29ffe49825be3634l,0x63e56598f28c8b82l, 22726 0x78b99133aab41bcel }, 22727 { 0x11febd5a52563180l,0xa3be94c5c356a8c0l,0x5e9b422e0d61f864l, 22728 0x2bf4ca1278fd259el }, 22729 0 }, 22730 /* 35 << 152 */ 22731 { { 0x8f60e40266914514l,0x6d9e280fef178167l,0x2ff7aec9e2949a48l, 22732 0x422389ce72d37511l }, 22733 { 0xe9b156f3307ac1d2l,0x1cb581a78518e79fl,0x56d43f302185cf82l, 22734 0x8d46c5aade59562cl }, 22735 0 }, 22736 /* 36 << 152 */ 22737 { { 0x50fc0711745edc11l,0x9dd9ad7d3dc87558l,0xce6931fbb49d1e64l, 22738 0x6c77a0a2c98bd0f9l }, 22739 { 0x62b9a6296baf7cb1l,0xcf065f91ccf72d22l,0x7203cce979639071l, 22740 0x09ae4885f9cb732fl }, 22741 0 }, 22742 /* 37 << 152 */ 22743 { { 0xd007d682e4b35428l,0x80c162315bcdc0d6l,0xe55a86bd36fce9b2l, 22744 0x16772edb969a87cfl }, 22745 { 0xff323a2d3f370c94l,0x8d3c8028bf3c1afcl,0x4e1591e73b0c3fafl, 22746 0xfbd6475cb981ce83l }, 22747 0 }, 22748 /* 39 << 152 */ 22749 { { 0xcf414ae3315b2471l,0xf54abf8033168de6l,0x6883efc5df5cdb24l, 22750 0x3eca788c8efe81acl }, 22751 { 0xdb58c6c778eeccadl,0x3c77939082fecfb7l,0x5736cdd9c9b513f3l, 22752 0xab7e6ea57b02aaf2l }, 22753 0 }, 22754 /* 40 << 152 */ 22755 { { 0x5e7c3becee8314f3l,0x1c068aeddbea298fl,0x08d381f17c80acecl, 22756 0x03b56be8e330495bl }, 22757 { 0xaeffb8f29222882dl,0x95ff38f6c4af8bf7l,0x50e32d351fc57d8cl, 22758 0x6635be5217b444f0l }, 22759 0 }, 22760 /* 41 << 152 */ 22761 { { 0x2cec7ba64805d895l,0x4c8399870ac78e7cl,0x031ad6c7f79416c5l, 22762 0x1b2f2621f1838d2fl }, 22763 { 0x60835eac91447f90l,0x59147af1f9bab5d9l,0x7a3005d6f393f175l, 22764 0x8cf3c468c4120ba2l }, 22765 0 }, 22766 /* 43 << 152 */ 22767 { { 0xeccffc7d8a2c1f08l,0x308916d37e384bd4l,0x6b8c2ff55e366384l, 22768 0xf4b2850d03e4747cl }, 22769 { 0xe839c569e96c1488l,0xa46ff7f956c9cb10l,0xd968c74c362fd172l, 22770 0x2aa7fe4cad6bb601l }, 22771 0 }, 22772 /* 44 << 152 */ 22773 { { 0x04d15276a5177900l,0x4e1dbb47f6858752l,0x5b475622c615796cl, 22774 0xa6fa0387691867bfl }, 22775 { 0xed7f5d562844c6d0l,0xc633cf9b03a2477dl,0xf6be5c402d3721d6l, 22776 0xaf312eb7e9fd68e6l }, 22777 0 }, 22778 /* 45 << 152 */ 22779 { { 0xf3b8164eec04c847l,0xa305ca93fe65816cl,0xa65f9963c7e2ce52l, 22780 0xc448005198882cfcl }, 22781 { 0x46a998df05c165bbl,0xc38f4edf9dfe1e98l,0xb96ec43f8739f77al, 22782 0x10a23af9313b40bfl }, 22783 0 }, 22784 /* 46 << 152 */ 22785 { { 0xe476c3e3ee668e0cl,0xcec6a984478197c2l,0xc9fa1d68897147c1l, 22786 0x4e6aec0ea6465793l }, 22787 { 0xedca9db76b219c3bl,0xa2cd57942e508d3bl,0x38b384663936e02al, 22788 0x0b8d3b4ca54ce90fl }, 22789 0 }, 22790 /* 47 << 152 */ 22791 { { 0x66e06537af08e0fcl,0x70fe0f2a907f1a93l,0x8c25245285ec1647l, 22792 0x0b8b2964d5560eddl }, 22793 { 0xda45a326f3ef8e14l,0xf3adf9a6abc3494bl,0xbbdd93c11eda0d92l, 22794 0x1b5e12c609912773l }, 22795 0 }, 22796 /* 48 << 152 */ 22797 { { 0x242792d2e7417ce1l,0xff42bc71970ee7f5l,0x1ff4dc6d5c67a41el, 22798 0x77709b7b20882a58l }, 22799 { 0x3554731dbe217f2cl,0x2af2a8cd5bb72177l,0x58eee769591dd059l, 22800 0xbb2930c94bba6477l }, 22801 0 }, 22802 /* 49 << 152 */ 22803 { { 0x5d9d507551d01848l,0x53dadb405b600d1el,0x7ba5b4dc5cb0a9a3l, 22804 0xdb85b04c6795e547l }, 22805 { 0x480e7443f0354843l,0xc7efe6e813012322l,0x479b674a2aeee1e6l, 22806 0xf5481f19704f4ea3l }, 22807 0 }, 22808 /* 51 << 152 */ 22809 { { 0x76a38d6978c7816el,0xe020c87df84ec554l,0x99af2f78f9818010l, 22810 0x31cf103d988136eal }, 22811 { 0x6b095a114816a5aal,0x5a4cd2a4eff0a4afl,0x543041a5892e5e04l, 22812 0x460f94c30aab9ee1l }, 22813 0 }, 22814 /* 52 << 152 */ 22815 { { 0x863ee0477d930cfcl,0x4c262ad1396fd1f4l,0xf4765bc8039af7e1l, 22816 0x2519834b5ba104f6l }, 22817 { 0x7cd61b4cd105f961l,0xa5415da5d63bca54l,0x778280a088a1f17cl, 22818 0xc49689492329512cl }, 22819 0 }, 22820 /* 53 << 152 */ 22821 { { 0x282d92b48cd3948al,0x95d219dfe168205bl,0xf6111a6f87bf3abcl, 22822 0x910f8ce655fee9f2l }, 22823 { 0xb6c806f74f71ac89l,0xd0cc300fb7235f73l,0xfe37ccb47d0d45bbl, 22824 0x5b2445f6952f0eaal }, 22825 0 }, 22826 /* 55 << 152 */ 22827 { { 0x03870be447141962l,0x8b79033f4a2b3f7fl,0xb6983b5ed2e5e274l, 22828 0x2a2f8018501ed99cl }, 22829 { 0x07a92eb9feb49656l,0x063f0a9e482e2972l,0x413be27a57435832l, 22830 0x56363c5f6f9d3de1l }, 22831 0 }, 22832 /* 57 << 152 */ 22833 { { 0xd247153163b50214l,0x32b435eeb2b897del,0xc49f0b01b05df4del, 22834 0x97b6aa40b7df9b91l }, 22835 { 0x58ff34ec8ec39d78l,0xab0889005e0114a3l,0x6872b4de4822b7b8l, 22836 0x7614c0d0ab239073l }, 22837 0 }, 22838 /* 59 << 152 */ 22839 { { 0x81891d378aa5d80al,0xf48ca24292e45f2cl,0xba711b6c0d04904cl, 22840 0x5992cda349f16ed6l }, 22841 { 0x18b9a739790593eel,0x8b98e84dc4ba16d1l,0xac55701cb7b81615l, 22842 0xadb4533b15822291l }, 22843 0 }, 22844 /* 60 << 152 */ 22845 { { 0x6210db7181236c97l,0x74f7685b3ee0781fl,0x4df7da7ba3e41372l, 22846 0x2aae38b1b1a1553el }, 22847 { 0x1688e222f6dd9d1bl,0x576954485b8b6487l,0x478d21274b2edeaal, 22848 0xb2818fa51e85956al }, 22849 0 }, 22850 /* 61 << 152 */ 22851 { { 0xc0677533f255ba8el,0x2bdae2a1efa2aabel,0xf7aebbd4b086c8a6l, 22852 0x148455d992cb1147l }, 22853 { 0xa084e8d715402565l,0x33f111a8fa41bf23l,0x4bc990d627ac189bl, 22854 0x48dbe6569d505f76l }, 22855 0 }, 22856 /* 63 << 152 */ 22857 { { 0x59df7fab596766f3l,0x4cadcbfe604f26e4l,0x0cf199338a6af592l, 22858 0x3af1ace287b826c1l }, 22859 { 0xf09a5b38ee60684el,0xa04cbeda4ed7c711l,0xdb28c42eb1731040l, 22860 0x75fcc0ec2e6e6523l }, 22861 0 }, 22862 /* 64 << 152 */ 22863 { { 0x1e6adddaf176f2c0l,0x01ca4604e2572658l,0x0a404ded85342ffbl, 22864 0x8cf60f96441838d6l }, 22865 { 0x9bbc691cc9071c4al,0xfd58874434442803l,0x97101c85809c0d81l, 22866 0xa7fb754c8c456f7fl }, 22867 0 }, 22868 /* 65 << 152 */ 22869 { { 0x4374020072196f30l,0x59ed0dc0dcd6c935l,0x17d4ed8e5034161bl, 22870 0x8abe3e13009e7170l }, 22871 { 0xe51c41c96c791456l,0xc671807704d72bb6l,0xd4309cf56bba424al, 22872 0x6122b951d0ca4ceal }, 22873 0 }, 22874 /* 71 << 152 */ 22875 { { 0xdfdb2e9c4278982bl,0xf3a282b32d6a2a61l,0x5611650cd2f2b03cl, 22876 0xa62c177f43f7f83al }, 22877 { 0x372310ab4c593d32l,0x2bb6903a2b570f9cl,0x2930da3df43af904l, 22878 0x2bbd04aa2c8a5a7dl }, 22879 0 }, 22880 /* 77 << 152 */ 22881 { { 0x10c324c007e536del,0xc456836d377be1b4l,0x9a627d75d785af3fl, 22882 0xde74559118b58b31l }, 22883 { 0xeac83ea60c47239al,0x35da24abbc02f670l,0x2d4abde0c3af6e63l, 22884 0xac53acba5a7ebf1bl }, 22885 0 }, 22886 /* 83 << 152 */ 22887 { { 0x2b03ec2efd9a9f3el,0xc967cd2b9d898a09l,0xb24bcba8039dc4f6l, 22888 0x0ea1d297061ada1el }, 22889 { 0x3a7a25fbc134b8bcl,0x846282d6f61cd312l,0xfa1de0d2e0d778d9l, 22890 0xf75fad4ef09be264l }, 22891 0 }, 22892 /* 89 << 152 */ 22893 { { 0x7d35695bcf74afb3l,0x34d43d9f15bb36fbl,0x15f0b43960b45fbel, 22894 0xb15db8d84f38ec06l }, 22895 { 0x93ce7d50f7da1406l,0x2db97edd9f076aaal,0x27ebb9aa354429dcl, 22896 0xf97eb5c446ace469l }, 22897 0 }, 22898 /* 95 << 152 */ 22899 { { 0x758fa2312dcf498fl,0xaa8c14d15cf3853al,0x416f5dab097d786al, 22900 0xceec00ef38f242a0l }, 22901 { 0x2f8b10b9d8b75ef2l,0xee64912b2281be6al,0xa883481aa382a51el, 22902 0x9442300f61b16b8al }, 22903 0 }, 22904 /* 101 << 152 */ 22905 { { 0x80e7fbc4f4b171e1l,0xdd2246f5661564a4l,0xcf08d73cd00d4e54l, 22906 0xf725f5389fca9a30l }, 22907 { 0xd9607358af20debel,0xa97c81e16f7d1cf2l,0x72794ae70dedfb2al, 22908 0xc328cb93159ff29dl }, 22909 0 }, 22910 /* 107 << 152 */ 22911 { { 0xaf9491d6252f6d59l,0x6744d7518feda60dl,0xa485f8aa34c5c048l, 22912 0x2ed794b4b50ea53bl }, 22913 { 0x0da82650db26c289l,0xed3ab4c50904af55l,0x425eda1176544463l, 22914 0x917be5f48939b29bl }, 22915 0 }, 22916 /* 113 << 152 */ 22917 { { 0xa2e72d0f8e208e5dl,0x5a5e4344234a5fedl,0x6dcc56535005bee8l, 22918 0x09d0c254854e2e04l }, 22919 { 0xade4bcdba82f0789l,0x5a3e3cd4ec460a91l,0x6b1a867be76695b2l, 22920 0xd1eb9df0a28b9331l }, 22921 0 }, 22922 /* 116 << 152 */ 22923 { { 0x3f5cf5f678e62ddcl,0x2267c45407fd752bl,0x5e361b6b5e437bbel, 22924 0x95c595018354e075l }, 22925 { 0xec725f85f2b254d9l,0x844b617d2cb52b4el,0xed8554f5cf425fb5l, 22926 0xab67703e2af9f312l }, 22927 0 }, 22928 /* 119 << 152 */ 22929 { { 0x8dcc920005fb96bbl,0x29d2442470f84705l,0x540bb6e63f09628fl, 22930 0x07f8b4de2a9c2359l }, 22931 { 0xb8e002d1957e41dcl,0x9a0fe82b9e683a3fl,0x996b1a5250e633fdl, 22932 0x748a11e500c669cal }, 22933 0 }, 22934 /* 125 << 152 */ 22935 { { 0x0593a788581dfd6el,0x99f1164f64e1b329l,0x1142c44b1defddbbl, 22936 0xbc95c9c7660b9036l }, 22937 { 0xf24b5a47079179ccl,0x6175b52c21f7033bl,0x8b5d84183bc2eec0l, 22938 0xc1332c8272d12670l }, 22939 0 }, 22940 }, 22941 { 22942 /* 0 << 160 */ 22943 { { 0x00, 0x00, 0x00, 0x00 }, 22944 { 0x00, 0x00, 0x00, 0x00 }, 22945 1 }, 22946 /* 1 << 160 */ 22947 { { 0xd433e50f6d3549cfl,0x6f33696ffacd665el,0x695bfdacce11fcb4l, 22948 0x810ee252af7c9860l }, 22949 { 0x65450fe17159bb2cl,0xf7dfbebe758b357bl,0x2b057e74d69fea72l, 22950 0xd485717a92731745l }, 22951 0 }, 22952 /* 3 << 160 */ 22953 { { 0x6c8d0aa9b898fd52l,0x2fb38a57be9af1a7l,0xe1f2b9a93b4f03f8l, 22954 0x2b1aad44c3f0cc6fl }, 22955 { 0x58b5332e7cf2c084l,0x1c57d96f0367d26dl,0x2297eabdfa6e4a8dl, 22956 0x65a947ee4a0e2b6al }, 22957 0 }, 22958 /* 4 << 160 */ 22959 { { 0xaaafafb0285b9491l,0x01a0be881e4c705el,0xff1d4f5d2ad9caabl, 22960 0x6e349a4ac37a233fl }, 22961 { 0xcf1c12464a1c6a16l,0xd99e6b6629383260l,0xea3d43665f6d5471l, 22962 0x36974d04ff8cc89bl }, 22963 0 }, 22964 /* 5 << 160 */ 22965 { { 0xf535b616fdd5b854l,0x592549c85728719fl,0xe231468606921cadl, 22966 0x98c8ce34311b1ef8l }, 22967 { 0x28b937e7e9090b36l,0x67fc3ab90bf7bbb7l,0x12337097a9d87974l, 22968 0x3e5adca1f970e3fel }, 22969 0 }, 22970 /* 7 << 160 */ 22971 { { 0xcdcc68a7b3f85ff0l,0xacd21cdd1a888044l,0xb6719b2e05dbe894l, 22972 0xfae1d3d88b8260d4l }, 22973 { 0xedfedece8a1c5d92l,0xbca01a94dc52077el,0xc085549c16dd13edl, 22974 0xdc5c3bae495ebaadl }, 22975 0 }, 22976 /* 9 << 160 */ 22977 { { 0xcc17063fbe7b643al,0x7872e1c846085760l,0x86b0fffbb4214c9el, 22978 0xb18bbc0e72bf3638l }, 22979 { 0x8b17de0c722591c9l,0x1edeab1948c29e0cl,0x9fbfd98ef4304f20l, 22980 0x2d1dbb6b9c77ffb6l }, 22981 0 }, 22982 /* 10 << 160 */ 22983 { { 0xf53f2c658ead09f7l,0x1335e1d59780d14dl,0x69cc20e0cd1b66bcl, 22984 0x9b670a37bbe0bfc8l }, 22985 { 0xce53dc8128efbeedl,0x0c74e77c8326a6e5l,0x3604e0d2b88e9a63l, 22986 0xbab38fca13dc2248l }, 22987 0 }, 22988 /* 11 << 160 */ 22989 { { 0x255616d3c7141771l,0xa86691ab2f226b66l,0xda19fea4b3ca63a9l, 22990 0xfc05dc42ae672f2bl }, 22991 { 0xa9c6e786718ba28fl,0x07b7995b9c66b984l,0x0f434f551b3702f2l, 22992 0xd6f6212fda84eeffl }, 22993 0 }, 22994 /* 13 << 160 */ 22995 { { 0x4b0e7987b5b41d78l,0xea7df9074bf0c4f8l,0xb4d03560fab80ecdl, 22996 0x6cf306f6fb1db7e5l }, 22997 { 0x0d59fb5689fd4773l,0xab254f4000f9be33l,0x18a09a9277352da4l, 22998 0xf81862f5641ea3efl }, 22999 0 }, 23000 /* 15 << 160 */ 23001 { { 0xb59b01579f759d01l,0xa2923d2f7eae4fdel,0x18327757690ba8c0l, 23002 0x4bf7e38b44f51443l }, 23003 { 0xb6812563b413fc26l,0xedb7d36379e53b36l,0x4fa585c4c389f66dl, 23004 0x8e1adc3154bd3416l }, 23005 0 }, 23006 /* 16 << 160 */ 23007 { { 0xd3b3a13f1402b9d0l,0x573441c32c7bc863l,0x4b301ec4578c3e6el, 23008 0xc26fc9c40adaf57el }, 23009 { 0x96e71bfd7493cea3l,0xd05d4b3f1af81456l,0xdaca2a8a6a8c608fl, 23010 0x53ef07f60725b276l }, 23011 0 }, 23012 /* 17 << 160 */ 23013 { { 0x971e9eedd5098497l,0x97692be63077d8a7l,0xb57e02ad79625a8al, 23014 0x5e3d20f6a688ecd5l }, 23015 { 0xa4431a28188f964dl,0xd4eb23bd5a11c1dbl,0xfcda853eadc7446fl, 23016 0x9e2e98b593c94046l }, 23017 0 }, 23018 /* 19 << 160 */ 23019 { { 0x4a649b66eddaa4f1l,0x35a04f185e690c50l,0x1639bdcff908bc53l, 23020 0xce6d525c121726e8l }, 23021 { 0x70f34948902b402cl,0x3a40c6950e290579l,0x7b0ed90f469a0085l, 23022 0xecb979c60189c501l }, 23023 0 }, 23024 /* 21 << 160 */ 23025 { { 0x847e2bde5cee8d07l,0x1bed198cd3340037l,0x439ffb3ce41586e3l, 23026 0x594980f1856f15b0l }, 23027 { 0x22c3b86c6e9307c6l,0xf8b3ee08876382dbl,0x850c628e628f3f30l, 23028 0x22ec0acb51ee3659l }, 23029 0 }, 23030 /* 23 << 160 */ 23031 { { 0xa4052591efcef5a0l,0x82692a47106d55afl,0xdac3ea88e6ead453l, 23032 0xaa1368fcf3dfd875l }, 23033 { 0x87bc688aa0c539eal,0x905e206040b1de3el,0x072240b8f1d52452l, 23034 0x3ebf0644d57b6580l }, 23035 0 }, 23036 /* 25 << 160 */ 23037 { { 0x12109bcc07a0b2f8l,0x336f87d2ca23f14cl,0xb39ae282452a2ea2l, 23038 0x8e085f5bab59a500l }, 23039 { 0xf7daeb69b63f015cl,0x44c555bcacb47b38l,0x96190454b623910al, 23040 0x4b666e2255b41b70l }, 23041 0 }, 23042 /* 27 << 160 */ 23043 { { 0xf146914eb53419fdl,0xd2109b07493e88bfl,0x30bf9cbccc54bcd5l, 23044 0xcf9ea59750e34a1fl }, 23045 { 0x70ade8a59588591dl,0xf668be676b41c269l,0x3497c58f78df2e6bl, 23046 0x0fad05cc71042b56l }, 23047 0 }, 23048 /* 28 << 160 */ 23049 { { 0x27f536e049ce89e7l,0x18908539cc890cb5l,0x308909abd83c2aa1l, 23050 0xecd3142b1ab73bd3l }, 23051 { 0x6a85bf59b3f5ab84l,0x3c320a68f2bea4c6l,0xad8dc5386da4541fl, 23052 0xeaf34eb0b7c41186l }, 23053 0 }, 23054 /* 29 << 160 */ 23055 { { 0x709da836093aa5f6l,0x567a9becb4644edel,0xae02a46044466b0cl, 23056 0xc80b237a407f1b3bl }, 23057 { 0x451df45ab4168a98l,0xdc9b40ef24a3f7c9l,0x23593ef32671341dl, 23058 0x40f4533190b90faal }, 23059 0 }, 23060 /* 31 << 160 */ 23061 { { 0x7f97768e922f36e3l,0x936943f8491034a2l,0x72f6c17f21483753l, 23062 0x5489fa0cb2918619l }, 23063 { 0x55b31aa59cc21a46l,0xde4cc71a8e54ab14l,0x942cb8be9eaff8b0l, 23064 0xe38f6116d1755231l }, 23065 0 }, 23066 /* 33 << 160 */ 23067 { { 0xf0c0606a395b39abl,0x0efcbc699b5166a5l,0x85995e6895453d85l, 23068 0xadc9a2920806ee5cl }, 23069 { 0xc3662e804928fe09l,0x2a2ddcc6969c87e7l,0xa02d7947111d319dl, 23070 0xde23bcf12d20f66dl }, 23071 0 }, 23072 /* 34 << 160 */ 23073 { { 0xc47cb3395f6d4a09l,0x6b4f355cee52b826l,0x3d100f5df51b930al, 23074 0xf4512fac9f668f69l }, 23075 { 0x546781d5206c4c74l,0xd021d4d4cb4d2e48l,0x494a54c2ca085c2dl, 23076 0xf1dbaca4520850a8l }, 23077 0 }, 23078 /* 35 << 160 */ 23079 { { 0xb2d15b14a911cc2bl,0xab2dfaf7643e28eal,0xfccc9ed1f52c4c2dl, 23080 0xfb4b1d4a09d8faa3l }, 23081 { 0x6fd72a9b7f5ce767l,0x0233c856a287e2b5l,0xd42135e05775ebb9l, 23082 0xb3c9dada7376568bl }, 23083 0 }, 23084 /* 36 << 160 */ 23085 { { 0x63c79326490a1acal,0xcb64dd9c41526b02l,0xbb772591a2979258l, 23086 0x3f58297048d97846l }, 23087 { 0xd66b70d17c213ba7l,0xc28febb5e8a0ced4l,0x6b911831c10338c1l, 23088 0x0d54e389bf0126f3l }, 23089 0 }, 23090 /* 37 << 160 */ 23091 { { 0x5952996b5306af1bl,0x99f444f4354b67bel,0x6f670181633a2928l, 23092 0x289023f0e9bdc4a6l }, 23093 { 0xcbed12148f7455a2l,0x501ace2f659a4858l,0x83ee678d5f8e1784l, 23094 0x95c984587335c5bdl }, 23095 0 }, 23096 /* 39 << 160 */ 23097 { { 0x2e25a1f3e0233000l,0xed0028cd44fe8ba9l,0x447501a6021d43b3l, 23098 0x4ec203906b4dffccl }, 23099 { 0x50642f9ad0169740l,0x9360003373cc58adl,0x825f1a82fe9cf9acl, 23100 0x456194c653242bd6l }, 23101 0 }, 23102 /* 40 << 160 */ 23103 { { 0x40242efeb483689bl,0x2575d3f6513ac262l,0xf30037c80ca6db72l, 23104 0xc9fcce8298864be2l }, 23105 { 0x84a112ff0149362dl,0x95e575821c4ae971l,0x1fa4b1a8945cf86cl, 23106 0x4525a7340b024a2fl }, 23107 0 }, 23108 /* 41 << 160 */ 23109 { { 0x83205e8f5db5e2b1l,0x94e7a2621e311c12l,0xe1cac7333e37068fl, 23110 0xe3f43f6d39965acfl }, 23111 { 0xd28db9e854d905bal,0x686f372a101f2162l,0x409cfe5d3d1b46d4l, 23112 0x17648f1cbd0bb63al }, 23113 0 }, 23114 /* 43 << 160 */ 23115 { { 0xef83315b821f4ee4l,0xb90766998ba78b4dl,0xee6a15880fce5260l, 23116 0x828f4a72d754affbl }, 23117 { 0x4650ec7daaae54d2l,0x3174301f1057efe9l,0x174e0683eb7704cel, 23118 0xb7e6aeb357eb0b14l }, 23119 0 }, 23120 /* 44 << 160 */ 23121 { { 0xcaead1c2c905d85fl,0xe9d7f7900733ae57l,0x24c9a65cf07cdd94l, 23122 0x7389359ca4b55931l }, 23123 { 0xf58709b7367e45f7l,0x1f203067cb7e7adcl,0x82444bffc7b72818l, 23124 0x07303b35baac8033l }, 23125 0 }, 23126 /* 45 << 160 */ 23127 { { 0xd59528fb38a0dc96l,0x8179dc9088d0e857l,0x55e9ba039ed4b1afl, 23128 0x8a2c0dc787b74cacl }, 23129 { 0xe8ca91aeef1c0006l,0x67f59ab2de0e15d4l,0xba0cddf86e6634d2l, 23130 0x352803657b7ba591l }, 23131 0 }, 23132 /* 46 << 160 */ 23133 { { 0x1e1ee4e4d13b7ea1l,0xe6489b24e0e74180l,0xa5f2c6107e70ef70l, 23134 0xa1655412bdd10894l }, 23135 { 0x555ebefb7af4194el,0x533c1c3c8e89bd9cl,0x735b9b5789895856l, 23136 0x15fb3cd2567f5c15l }, 23137 0 }, 23138 /* 47 << 160 */ 23139 { { 0xef07bfedfb0986c7l,0xde138afe47c1659al,0x8b79c159a555e907l, 23140 0x21d572f1125518bbl }, 23141 { 0x2005999ad320410cl,0x4167dc469484414bl,0x0cd965c34c6aaefdl, 23142 0x2a1abc9a0e1d5e9dl }, 23143 0 }, 23144 /* 48 << 160 */ 23145 { { 0x057fed45526f09fdl,0xe8a4f10c8128240al,0x9332efc4ff2bfd8dl, 23146 0x214e77a0bd35aa31l }, 23147 { 0x32896d7314faa40el,0x767867ec01e5f186l,0xc9adf8f117a1813el, 23148 0xcb6cda7854741795l }, 23149 0 }, 23150 /* 49 << 160 */ 23151 { { 0xadfaf39b888dedf1l,0x4f8b178aab1750b9l,0x26418617ffe6b0eal, 23152 0x01d1be82af04a59fl }, 23153 { 0x41584147e652db64l,0xf7775ac5727f9ea7l,0x58052a20e72ad8bbl, 23154 0x5badf0dc6021160el }, 23155 0 }, 23156 /* 51 << 160 */ 23157 { { 0x8490ea99183de59dl,0xc95f72146f5c6f8cl,0x89b55d15df00c334l, 23158 0x84386ad8a0ec36f7l }, 23159 { 0x24dadaefe4dc1ed1l,0xc606ba4c1e717227l,0x7e4756c0bbfa62eal, 23160 0x3916cf14afc29cf3l }, 23161 0 }, 23162 /* 52 << 160 */ 23163 { { 0xb7b4d00101dae185l,0x45434e0b9b7a94bcl,0xf54339affbd8cb0bl, 23164 0xdcc4569ee98ef49el }, 23165 { 0x7789318a09a51299l,0x81b4d206b2b025d8l,0xf64aa418fae85792l, 23166 0x3e50258facd7baf7l }, 23167 0 }, 23168 /* 53 << 160 */ 23169 { { 0x4152c508492d91f3l,0x59d6cf9c678f9db4l,0xb0a8c966404608d1l, 23170 0xdced55d0e3fed558l }, 23171 { 0x0914a3cb33a76188l,0x79df212423d35d46l,0x2322507fca13b364l, 23172 0x0aed41d60078ab93l }, 23173 0 }, 23174 /* 55 << 160 */ 23175 { { 0x7acdaa7f6b2ebfc2l,0xb5ab1a9a80d9f67fl,0x53ba8173ff8aa8b0l, 23176 0x9cd85cf874ca56a6l }, 23177 { 0xabac57f49c4fad81l,0x2325bb8521078995l,0xbac5e3a1b928a054l, 23178 0x7219047a2394cc2al }, 23179 0 }, 23180 /* 57 << 160 */ 23181 { { 0xa33410d2aa75fd37l,0x821093affc0f1192l,0xe45e85ed155e39a9l, 23182 0xd0e87cd12de67188l }, 23183 { 0xdeca97d965d43d87l,0x8c73826f9d2c99ecl,0x1bfe111e33237ddbl, 23184 0xda32e865587bfb28l }, 23185 0 }, 23186 /* 59 << 160 */ 23187 { { 0xde456d92c89e9e4el,0xe45688a98e47f3cdl,0x3deacfca3bacbde0l, 23188 0xdf9b32efc9683a70l }, 23189 { 0x749bc007e1691106l,0x788a05342a5154d7l,0x1a06baecf7c7b70dl, 23190 0xb5b608eeae6ffc4cl }, 23191 0 }, 23192 /* 60 << 160 */ 23193 { { 0x4cd296df5579bea4l,0x10e35ac85ceedaf1l,0x04c4c5fde3bcc5b1l, 23194 0x95f9ee8a89412cf9l }, 23195 { 0x2c9459ee82b6eb0fl,0x2e84576595c2aaddl,0x774a84aed327fcfel, 23196 0xd8c937220368d476l }, 23197 0 }, 23198 /* 61 << 160 */ 23199 { { 0x39ebf947ccd25abbl,0x74e7a868cb49ebael,0x576ea108332e6147l, 23200 0xcf3ba166150c1e5dl }, 23201 { 0xb5411fc3515c0e93l,0x51b15761f15c8a34l,0x362a4a3a0d213f38l, 23202 0xf6f63c2e24e93aeal }, 23203 0 }, 23204 /* 63 << 160 */ 23205 { { 0x0cb3a2dcb78528d5l,0xa1888c18d585bb41l,0x210cca40de402a6el, 23206 0x10c6339d9ed7c381l }, 23207 { 0xcd3558d561fe2a0cl,0xc97db05dad5140b1l,0x3366b028b21f8d11l, 23208 0x878b09033e38be13l }, 23209 0 }, 23210 /* 64 << 160 */ 23211 { { 0x211cde10296c36efl,0x7ee8967282c4da77l,0xb617d270a57836dal, 23212 0xf0cd9c319cb7560bl }, 23213 { 0x01fdcbf7e455fe90l,0x3fb53cbb7e7334f3l,0x781e2ea44e7de4ecl, 23214 0x8adab3ad0b384fd0l }, 23215 0 }, 23216 /* 65 << 160 */ 23217 { { 0x081e505aa353ba05l,0x244ab34a288b86b1l,0x1155f06214e3a829l, 23218 0x383300daf2118a6bl }, 23219 { 0xe8fc17cef27032b9l,0xed7f05c9c7bd2389l,0x78f70d14202f8a88l, 23220 0x8a8310c0647b3f20l }, 23221 0 }, 23222 /* 71 << 160 */ 23223 { { 0xc80786e1a3633369l,0x496d55de9073f5b9l,0x10deeb6a89ae93cel, 23224 0x6a2dd5c8b12e00c6l }, 23225 { 0xc25cd2f90c68e26dl,0x29d7ad8b53f0bb64l,0x2dd0d027d7fc9b00l, 23226 0xad21e1f7ca9c4d5dl }, 23227 0 }, 23228 /* 77 << 160 */ 23229 { { 0xd45cb932d83465f3l,0x95830c0faf22fdbdl,0x41d830e007cd2a0al, 23230 0x4a08500e3616e716l }, 23231 { 0x5931fc9f277755a5l,0x7d11680731006764l,0xa409a0ad1b3999aal, 23232 0xec70368c9939d566l }, 23233 0 }, 23234 /* 83 << 160 */ 23235 { { 0x3905cb59f2030370l,0x7e9bdee56dcc8fd7l,0xb1b7b04e9806e06fl, 23236 0xfbdadce22c73eb57l }, 23237 { 0xfb1ab2e98d5b2eb3l,0x58fbf2df7699338bl,0x81b1c54a63b5a032l, 23238 0xefd1a1896a5d7ff4l }, 23239 0 }, 23240 /* 89 << 160 */ 23241 { { 0x0265189da1f769eal,0x22fa0bbbfdb5a502l,0xf69f0d1b21027534l, 23242 0x64302b81f6066b99l }, 23243 { 0xdef85fc98a717e80l,0xe066166386879a3bl,0xe5489b347f95b22cl, 23244 0x106dca9aa054a563l }, 23245 0 }, 23246 /* 95 << 160 */ 23247 { { 0xd624b4f4b4be9a77l,0x21a11ed77d50acb1l,0x707181f43d406e11l, 23248 0x3f324d203ef158bcl }, 23249 { 0xb29a2a34aa8cc8del,0x482f4a15315db969l,0x42ce4fc7d9af272el, 23250 0x784665b1f8f4cdc4l }, 23251 0 }, 23252 /* 101 << 160 */ 23253 { { 0x66ff7f73ab43a863l,0xa90be2cba77fd07el,0x84843997f76e5288l, 23254 0x288c197f3cee129bl }, 23255 { 0x39acc080c0a060a6l,0x4c8e574bd24e27cal,0x1dd6170ffcd3d5e9l, 23256 0x9736bb51f75e5150l }, 23257 0 }, 23258 /* 107 << 160 */ 23259 { { 0x2133810e6ba75716l,0x4debf728712886a8l,0x351e46a1f527d1f3l, 23260 0x29709ae8e9591564l }, 23261 { 0x696163d3a3dc1780l,0xd5b7825ae02aadf3l,0x23579d7cd565ae68l, 23262 0x105380124fa42cecl }, 23263 0 }, 23264 /* 113 << 160 */ 23265 { { 0x04eb554d13ffa704l,0x7441a62f2ed33d20l,0xaa926fa0b5b81324l, 23266 0xb981bcb829836f61l }, 23267 { 0x313a78d4cc9a7a15l,0xff1242d11b3921d2l,0xc0053fd36a209d4dl, 23268 0x95ac85caf7e92ca9l }, 23269 0 }, 23270 /* 116 << 160 */ 23271 { { 0x6d2a483d6f73c51el,0xa4cb2412ea0dc2ddl,0x50663c411eb917ffl, 23272 0x3d3a74cfeade299el }, 23273 { 0x29b3990f4a7a9202l,0xa9bccf59a7b15c3dl,0x66a3ccdca5df9208l, 23274 0x48027c1443f2f929l }, 23275 0 }, 23276 /* 119 << 160 */ 23277 { { 0xdf8a6f9673c3f6fbl,0xe4b1f0d98cc03220l,0x5ddacd618350480cl, 23278 0x485c4fababdfb016l }, 23279 { 0xdc840628b4d424b7l,0x07d3a99c215b2359l,0xad3dc5af56dff52el, 23280 0x5a3a6754973b6825l }, 23281 0 }, 23282 /* 125 << 160 */ 23283 { { 0xcfe231b83539a06dl,0xb36d1f72f46770ddl,0x126049747bb900d6l, 23284 0x8d0990973fc31661l }, 23285 { 0x03b2749c920bc39el,0xf933d510b0486e23l,0x09cc958f0e9b0bb5l, 23286 0x0b254dd1aa1e23abl }, 23287 0 }, 23288 }, 23289 { 23290 /* 0 << 168 */ 23291 { { 0x00, 0x00, 0x00, 0x00 }, 23292 { 0x00, 0x00, 0x00, 0x00 }, 23293 1 }, 23294 /* 1 << 168 */ 23295 { { 0x263a2cfb9db3b381l,0x9c3a2deed4df0a4bl,0x728d06e97d04e61fl, 23296 0x8b1adfbc42449325l }, 23297 { 0x6ec1d9397e053a1bl,0xee2be5c766daf707l,0x80ba1e14810ac7abl, 23298 0xdd2ae778f530f174l }, 23299 0 }, 23300 /* 3 << 168 */ 23301 { { 0xadbaeb79b6828f36l,0x9d7a025801bd5b9el,0xeda01e0d1e844b0cl, 23302 0x4b625175887edfc9l }, 23303 { 0x14109fdd9669b621l,0x88a2ca56f6f87b98l,0xfe2eb788170df6bcl, 23304 0x0cea06f4ffa473f9l }, 23305 0 }, 23306 /* 4 << 168 */ 23307 { { 0x43ed81b5c4e83d33l,0xd9f358795efd488bl,0x164a620f9deb4d0fl, 23308 0xc6927bdbac6a7394l }, 23309 { 0x45c28df79f9e0f03l,0x2868661efcd7e1a9l,0x7cf4e8d0ffa348f1l, 23310 0x6bd4c284398538e0l }, 23311 0 }, 23312 /* 5 << 168 */ 23313 { { 0x2618a091289a8619l,0xef796e606671b173l,0x664e46e59090c632l, 23314 0xa38062d41e66f8fbl }, 23315 { 0x6c744a200573274el,0xd07b67e4a9271394l,0x391223b26bdc0e20l, 23316 0xbe2d93f1eb0a05a7l }, 23317 0 }, 23318 /* 7 << 168 */ 23319 { { 0x7efa14b84444896bl,0x64974d2ff94027fbl,0xefdcd0e8de84487dl, 23320 0x8c45b2602b48989bl }, 23321 { 0xa8fcbbc2d8463487l,0xd1b2b3f73fbc476cl,0x21d005b7c8f443c0l, 23322 0x518f2e6740c0139cl }, 23323 0 }, 23324 /* 9 << 168 */ 23325 { { 0xae51dca2a91f6791l,0x2abe41909baa9efcl,0xd9d2e2f4559c7ac1l, 23326 0xe82f4b51fc9f773al }, 23327 { 0xa77130274073e81cl,0xc0276facfbb596fcl,0x1d819fc9a684f70cl, 23328 0x29b47fddc9f7b1e0l }, 23329 0 }, 23330 /* 10 << 168 */ 23331 { { 0x358de103459b1940l,0xec881c595b013e93l,0x51574c9349532ad3l, 23332 0x2db1d445b37b46del }, 23333 { 0xc6445b87df239fd8l,0xc718af75151d24eel,0xaea1c4a4f43c6259l, 23334 0x40c0e5d770be02f7l }, 23335 0 }, 23336 /* 11 << 168 */ 23337 { { 0x6a4590f4721b33f2l,0x2124f1fbfedf04eal,0xf8e53cde9745efe7l, 23338 0xe7e1043265f046d9l }, 23339 { 0xc3fca28ee4d0c7e6l,0x847e339a87253b1bl,0x9b5953483743e643l, 23340 0xcb6a0a0b4fd12fc5l }, 23341 0 }, 23342 /* 13 << 168 */ 23343 { { 0xec1214eda714181dl,0x609ac13b6067b341l,0xff4b4c97a545df1fl, 23344 0xa124050134d2076bl }, 23345 { 0x6efa0c231409ca97l,0x254cc1a820638c43l,0xd4e363afdcfb46cdl, 23346 0x62c2adc303942a27l }, 23347 0 }, 23348 /* 15 << 168 */ 23349 { { 0x27b6a8ab3fd40e09l,0xe455842e77313ea9l,0x8b51d1e21f55988bl, 23350 0x5716dd73062bbbfcl }, 23351 { 0x633c11e54e8bf3del,0x9a0e77b61b85be3bl,0x565107290911cca6l, 23352 0x27e76495efa6590fl }, 23353 0 }, 23354 /* 16 << 168 */ 23355 { { 0xe4ac8b33070d3aabl,0x2643672b9a2cd5e5l,0x52eff79b1cfc9173l, 23356 0x665ca49b90a7c13fl }, 23357 { 0x5a8dda59b3efb998l,0x8a5b922d052f1341l,0xae9ebbab3cf9a530l, 23358 0x35986e7bf56da4d7l }, 23359 0 }, 23360 /* 17 << 168 */ 23361 { { 0x3a636b5cff3513ccl,0xbb0cf8ba3198f7ddl,0xb8d4052241f16f86l, 23362 0x760575d8de13a7bfl }, 23363 { 0x36f74e169f7aa181l,0x163a3ecff509ed1cl,0x6aead61f3c40a491l, 23364 0x158c95fcdfe8fcaal }, 23365 0 }, 23366 /* 19 << 168 */ 23367 { { 0x6b47accdd9eee96cl,0x0ca277fbe58cec37l,0x113fe413e702c42al, 23368 0xdd1764eec47cbe51l }, 23369 { 0x041e7cde7b3ed739l,0x50cb74595ce9e1c0l,0x355685132925b212l, 23370 0x7cff95c4001b081cl }, 23371 0 }, 23372 /* 21 << 168 */ 23373 { { 0x726f0973da50c991l,0x48afcd5b822d6ee2l,0xe5fc718b20fd7771l, 23374 0xb9e8e77dfd0807a1l }, 23375 { 0x7f5e0f4499a7703dl,0x6972930e618e36f3l,0x2b7c77b823807bbel, 23376 0xe5b82405cb27ff50l }, 23377 0 }, 23378 /* 23 << 168 */ 23379 { { 0x98cb1ae9255c0980l,0x4bd863812b4a739fl,0x5a5c31e11e4a45a1l, 23380 0x1e5d55fe9cb0db2fl }, 23381 { 0x74661b068ff5cc29l,0x026b389f0eb8a4f4l,0x536b21a458848c24l, 23382 0x2e5bf8ec81dc72b0l }, 23383 0 }, 23384 /* 25 << 168 */ 23385 { { 0x9f0af483d309cbe6l,0x5b020d8ae0bced4fl,0x606e986db38023e3l, 23386 0xad8f2c9d1abc6933l }, 23387 { 0x19292e1de7400e93l,0xfe3e18a952be5e4dl,0xe8e9771d2e0680bfl, 23388 0x8c5bec98c54db063l }, 23389 0 }, 23390 /* 27 << 168 */ 23391 { { 0x4c23f62a2c160dcdl,0x34e6c5e38f90eaefl,0x35865519a9a65d5al, 23392 0x07c48aae8fd38a3dl }, 23393 { 0xb7e7aeda50068527l,0x2c09ef231c90936al,0x31ecfeb6e879324cl, 23394 0xa0871f6bfb0ec938l }, 23395 0 }, 23396 /* 28 << 168 */ 23397 { { 0xb1f0fb68d84d835dl,0xc90caf39861dc1e6l,0x12e5b0467594f8d7l, 23398 0x26897ae265012b92l }, 23399 { 0xbcf68a08a4d6755dl,0x403ee41c0991fbdal,0x733e343e3bbf17e8l, 23400 0xd2c7980d679b3d65l }, 23401 0 }, 23402 /* 29 << 168 */ 23403 { { 0x33056232d2e11305l,0x966be492f3c07a6fl,0x6a8878ffbb15509dl, 23404 0xff2211010a9b59a4l }, 23405 { 0x6c9f564aabe30129l,0xc6f2c940336e64cfl,0x0fe752628b0c8022l, 23406 0xbe0267e96ae8db87l }, 23407 0 }, 23408 /* 31 << 168 */ 23409 { { 0x9d031369a5e829e5l,0xcbb4c6fc1607aa41l,0x75ac59a6241d84c1l, 23410 0xc043f2bf8829e0eel }, 23411 { 0x82a38f758ea5e185l,0x8bda40b9d87cbd9fl,0x9e65e75e2d8fc601l, 23412 0x3d515f74a35690b3l }, 23413 0 }, 23414 /* 33 << 168 */ 23415 { { 0xf6b5b2d0bc8fa5bcl,0x8a5ead67500c277bl,0x214625e6dfa08a5dl, 23416 0x51fdfedc959cf047l }, 23417 { 0x6bc9430b289fca32l,0xe36ff0cf9d9bdc3fl,0x2fe187cb58ea0edel, 23418 0xed66af205a900b3fl }, 23419 0 }, 23420 /* 34 << 168 */ 23421 { { 0x00e0968b5fa9f4d6l,0x2d4066ce37a362e7l,0xa99a9748bd07e772l, 23422 0x710989c006a4f1d0l }, 23423 { 0xd5dedf35ce40cbd8l,0xab55c5f01743293dl,0x766f11448aa24e2cl, 23424 0x94d874f8605fbcb4l }, 23425 0 }, 23426 /* 35 << 168 */ 23427 { { 0xa365f0e8a518001bl,0xee605eb69d04ef0fl,0x5a3915cdba8d4d25l, 23428 0x44c0e1b8b5113472l }, 23429 { 0xcbb024e88b6740dcl,0x89087a53ee1d4f0cl,0xa88fa05c1fc4e372l, 23430 0x8bf395cbaf8b3af2l }, 23431 0 }, 23432 /* 36 << 168 */ 23433 { { 0x1e71c9a1deb8568bl,0xa35daea080fb3d32l,0xe8b6f2662cf8fb81l, 23434 0x6d51afe89490696al }, 23435 { 0x81beac6e51803a19l,0xe3d24b7f86219080l,0x727cfd9ddf6f463cl, 23436 0x8c6865ca72284ee8l }, 23437 0 }, 23438 /* 37 << 168 */ 23439 { { 0x32c88b7db743f4efl,0x3793909be7d11dcel,0xd398f9222ff2ebe8l, 23440 0x2c70ca44e5e49796l }, 23441 { 0xdf4d9929cb1131b1l,0x7826f29825888e79l,0x4d3a112cf1d8740al, 23442 0x00384cb6270afa8bl }, 23443 0 }, 23444 /* 39 << 168 */ 23445 { { 0xbe7e990ff0d796a0l,0x5fc62478df0e8b02l,0x8aae8bf4030c00adl, 23446 0x3d2db93b9004ba0fl }, 23447 { 0xe48c8a79d85d5ddcl,0xe907caa76bb07f34l,0x58db343aa39eaed5l, 23448 0x0ea6e007adaf5724l }, 23449 0 }, 23450 /* 40 << 168 */ 23451 { { 0xe00df169d23233f3l,0x3e32279677cb637fl,0x1f897c0e1da0cf6cl, 23452 0xa651f5d831d6bbddl }, 23453 { 0xdd61af191a230c76l,0xbd527272cdaa5e4al,0xca753636d0abcd7el, 23454 0x78bdd37c370bd8dcl }, 23455 0 }, 23456 /* 41 << 168 */ 23457 { { 0xc23916c217cd93fel,0x65b97a4ddadce6e2l,0xe04ed4eb174e42f8l, 23458 0x1491ccaabb21480al }, 23459 { 0x145a828023196332l,0x3c3862d7587b479al,0x9f4a88a301dcd0edl, 23460 0x4da2b7ef3ea12f1fl }, 23461 0 }, 23462 /* 43 << 168 */ 23463 { { 0x71965cbfc3dd9b4dl,0xce23edbffc068a87l,0xb78d4725745b029bl, 23464 0x74610713cefdd9bdl }, 23465 { 0x7116f75f1266bf52l,0x0204672218e49bb6l,0xdf43df9f3d6f19e3l, 23466 0xef1bc7d0e685cb2fl }, 23467 0 }, 23468 /* 44 << 168 */ 23469 { { 0xcddb27c17078c432l,0xe1961b9cb77fedb7l,0x1edc2f5cc2290570l, 23470 0x2c3fefca19cbd886l }, 23471 { 0xcf880a36c2af389al,0x96c610fdbda71ceal,0xf03977a932aa8463l, 23472 0x8eb7763f8586d90al }, 23473 0 }, 23474 /* 45 << 168 */ 23475 { { 0x3f3424542a296e77l,0xc871868342837a35l,0x7dc710906a09c731l, 23476 0x54778ffb51b816dbl }, 23477 { 0x6b33bfecaf06defdl,0xfe3c105f8592b70bl,0xf937fda461da6114l, 23478 0x3c13e6514c266ad7l }, 23479 0 }, 23480 /* 46 << 168 */ 23481 { { 0xe363a829855938e8l,0x2eeb5d9e9de54b72l,0xbeb93b0e20ccfab9l, 23482 0x3dffbb5f25e61a25l }, 23483 { 0x7f655e431acc093dl,0x0cb6cc3d3964ce61l,0x6ab283a1e5e9b460l, 23484 0x55d787c5a1c7e72dl }, 23485 0 }, 23486 /* 47 << 168 */ 23487 { { 0x4d2efd47deadbf02l,0x11e80219ac459068l,0x810c762671f311f0l, 23488 0xfa17ef8d4ab6ef53l }, 23489 { 0xaf47fd2593e43bffl,0x5cb5ff3f0be40632l,0x546871068ee61da3l, 23490 0x7764196eb08afd0fl }, 23491 0 }, 23492 /* 48 << 168 */ 23493 { { 0x831ab3edf0290a8fl,0xcae81966cb47c387l,0xaad7dece184efb4fl, 23494 0xdcfc53b34749110el }, 23495 { 0x6698f23c4cb632f9l,0xc42a1ad6b91f8067l,0xb116a81d6284180al, 23496 0xebedf5f8e901326fl }, 23497 0 }, 23498 /* 49 << 168 */ 23499 { { 0xf2274c9f97e3e044l,0x4201852011d09fc9l,0x56a65f17d18e6e23l, 23500 0x2ea61e2a352b683cl }, 23501 { 0x27d291bc575eaa94l,0x9e7bc721b8ff522dl,0x5f7268bfa7f04d6fl, 23502 0x5868c73faba41748l }, 23503 0 }, 23504 /* 51 << 168 */ 23505 { { 0x1c52e63596e78cc4l,0x5385c8b20c06b4a8l,0xd84ddfdbb0e87d03l, 23506 0xc49dfb66934bafadl }, 23507 { 0x7071e17059f70772l,0x3a073a843a1db56bl,0x034949033b8af190l, 23508 0x7d882de3d32920f0l }, 23509 0 }, 23510 /* 52 << 168 */ 23511 { { 0x91633f0ab2cf8940l,0x72b0b1786f948f51l,0x2d28dc30782653c8l, 23512 0x88829849db903a05l }, 23513 { 0xb8095d0c6a19d2bbl,0x4b9e7f0c86f782cbl,0x7af739882d907064l, 23514 0xd12be0fe8b32643cl }, 23515 0 }, 23516 /* 53 << 168 */ 23517 { { 0x358ed23d0e165dc3l,0x3d47ce624e2378cel,0x7e2bb0b9feb8a087l, 23518 0x3246e8aee29e10b9l }, 23519 { 0x459f4ec703ce2b4dl,0xe9b4ca1bbbc077cfl,0x2613b4f20e9940c1l, 23520 0xfc598bb9047d1eb1l }, 23521 0 }, 23522 /* 55 << 168 */ 23523 { { 0x52fb0c9d7fc63668l,0x6886c9dd0c039cdel,0x602bd59955b22351l, 23524 0xb00cab02360c7c13l }, 23525 { 0x8cb616bc81b69442l,0x41486700b55c3ceel,0x71093281f49ba278l, 23526 0xad956d9c64a50710l }, 23527 0 }, 23528 /* 57 << 168 */ 23529 { { 0xbaca6591d4b66947l,0xb452ce9804460a8cl,0x6830d24643768f55l, 23530 0xf4197ed87dff12dfl }, 23531 { 0x6521b472400dd0f7l,0x59f5ca8f4b1e7093l,0x6feff11b080338ael, 23532 0x0ada31f6a29ca3c6l }, 23533 0 }, 23534 /* 59 << 168 */ 23535 { { 0x04e5dfe0d809c7bdl,0xd7b2580c8f1050abl,0x6d91ad78d8a4176fl, 23536 0x0af556ee4e2e897cl }, 23537 { 0x162a8b73921de0acl,0x52ac9c227ea78400l,0xee2a4eeaefce2174l, 23538 0xbe61844e6d637f79l }, 23539 0 }, 23540 /* 60 << 168 */ 23541 { { 0x0491f1bc789a283bl,0x72d3ac3d880836f4l,0xaa1c5ea388e5402dl, 23542 0x1b192421d5cc473dl }, 23543 { 0x5c0b99989dc84cacl,0xb0a8482d9c6e75b8l,0x639961d03a191ce2l, 23544 0xda3bc8656d837930l }, 23545 0 }, 23546 /* 61 << 168 */ 23547 { { 0xca990653056e6f8fl,0x84861c4164d133a7l,0x8b403276746abe40l, 23548 0xb7b4d51aebf8e303l }, 23549 { 0x05b43211220a255dl,0xc997152c02419e6el,0x76ff47b6630c2feal, 23550 0x50518677281fdadel }, 23551 0 }, 23552 /* 63 << 168 */ 23553 { { 0x6d2d99b7ea7b979bl,0xcd78cd74e6fb3bcdl,0x11e45a9e86cffbfel, 23554 0x78a61cf4637024f6l }, 23555 { 0xd06bc8723d502295l,0xf1376854458cb288l,0xb9db26a1342f8586l, 23556 0xf33effcf4beee09el }, 23557 0 }, 23558 /* 64 << 168 */ 23559 { { 0xd7e0c4cdb30cfb3al,0x6d09b8c16c9db4c8l,0x40ba1a4207c8d9dfl, 23560 0x6fd495f71c52c66dl }, 23561 { 0xfb0e169f275264dal,0x80c2b746e57d8362l,0xedd987f749ad7222l, 23562 0xfdc229af4398ec7bl }, 23563 0 }, 23564 /* 65 << 168 */ 23565 { { 0xfe81af4609418a51l,0xdbb60b836f18e3a5l,0x5e7a86ea4566ec9cl, 23566 0xb76ff40f25093925l }, 23567 { 0x5fe6662c429c5554l,0xfc9ec35384e478cfl,0x73dbb5f3e8cfa761l, 23568 0x031e506592f82709l }, 23569 0 }, 23570 /* 71 << 168 */ 23571 { { 0x108c736abd49f2e0l,0xe230f2417487dcc8l,0x073fc4f8f74d939cl, 23572 0x98532487e9745bbel }, 23573 { 0x5208eb981714b10bl,0xec35d0510458725dl,0x35dbb60bf203f4b6l, 23574 0x064299b27781ab38l }, 23575 0 }, 23576 /* 77 << 168 */ 23577 { { 0x43cc7bbc02d26929l,0xeb00a683162d9607l,0x2af152b8ed9fa224l, 23578 0xf24e8bee12257f0cl }, 23579 { 0xdf065dd5d004b1cbl,0x6aa20bcf9f9908c6l,0x8e5e86b6941c593dl, 23580 0x0e0034b398969717l }, 23581 0 }, 23582 /* 83 << 168 */ 23583 { { 0x5be62e155c43b8fcl,0xd9e0adfc3c445636l,0xc5141df0e0d78f48l, 23584 0xd134bbed2c277716l }, 23585 { 0x79033a84598fe069l,0x6c704367b081614cl,0x55c45d66bf5bf772l, 23586 0xf08744c57a444730l }, 23587 0 }, 23588 /* 89 << 168 */ 23589 { { 0x866752091422b528l,0xdb297411c3e028eel,0x1f5575b040e1c3ccl, 23590 0x85367b84d333b04fl }, 23591 { 0x57864c86e9804aa9l,0xf13fa8e3439156dfl,0xa3b337e0464e0aecl, 23592 0x0018dfd7f2ae382bl }, 23593 0 }, 23594 /* 95 << 168 */ 23595 { { 0xe93cece9cea132fcl,0x985542d8f74e867al,0x2a3d18a5cc8fcf87l, 23596 0xa0561055479d0039l }, 23597 { 0x3513c7eaac4b3f9dl,0xc095967256477606l,0xa63960f330df8ad6l, 23598 0x59ca8d53cc9ddcb3l }, 23599 0 }, 23600 /* 101 << 168 */ 23601 { { 0x6d8e942b2f208191l,0xd49a6d9453fe5457l,0x2b55e391003010bal, 23602 0x3dd1fd9fdf4605ebl }, 23603 { 0xdc006a3358682886l,0x60a5e86c1bd9ac88l,0xc4bd320ed0cab8f2l, 23604 0x7281e7cb7751855bl }, 23605 0 }, 23606 /* 107 << 168 */ 23607 { { 0x7d564222e1881e7al,0x59061a89db0673c2l,0x1f9d607213f27313l, 23608 0x5b3b29368ff3aeb7l }, 23609 { 0x6cf2304ccf969f43l,0x8eff4a25e7f69ae5l,0xbaeb6411d17da4ffl, 23610 0x666af0af9eea17ecl }, 23611 0 }, 23612 /* 113 << 168 */ 23613 { { 0x6c0b811697f4cd0bl,0xcd7825d40e4ea852l,0x80158fb0677fef3dl, 23614 0x5bb1a3aaa10ee693l }, 23615 { 0xc5df66678066fc9bl,0x3200dc11f404d4a6l,0x58868950a8686d8el, 23616 0xbdaaffb53770fabal }, 23617 0 }, 23618 /* 116 << 168 */ 23619 { { 0xba6a9f84660326f5l,0x61c1e44161bc3e88l,0xfbf992a0bde85cf8l, 23620 0xe704dd1e6f8c8f5fl }, 23621 { 0x231caa0ab1d7d486l,0xd10616d8891cd571l,0x2ddada75c008833cl, 23622 0x44337d6dad514c94l }, 23623 0 }, 23624 /* 119 << 168 */ 23625 { { 0xd48678b8f6933cf0l,0x7b4d623e0b739471l,0x4ad620287b216238l, 23626 0xb4d4918959c4fabel }, 23627 { 0x8c2a1bdc296d42d5l,0x9235d0ec2fd3eb96l,0xfe271972f81c135bl, 23628 0x82b5181741471e16l }, 23629 0 }, 23630 /* 125 << 168 */ 23631 { { 0xe9aa8ce4051f8e81l,0x14484af67cd1391fl,0x53a361dcafb1656el, 23632 0x6ad8ba02f4d9d0cbl }, 23633 { 0xfb4385466c50a722l,0x2f1c5bbc7edb37f4l,0x8dc90ccb16e4b795l, 23634 0xbcb32e1508127094l }, 23635 0 }, 23636 }, 23637 { 23638 /* 0 << 176 */ 23639 { { 0x00, 0x00, 0x00, 0x00 }, 23640 { 0x00, 0x00, 0x00, 0x00 }, 23641 1 }, 23642 /* 1 << 176 */ 23643 { { 0xb81d783e979f3925l,0x1efd130aaf4c89a7l,0x525c2144fd1bf7fal, 23644 0x4b2969041b265a9el }, 23645 { 0xed8e9634b9db65b6l,0x35c82e3203599d8al,0xdaa7a54f403563f3l, 23646 0x9df088ad022c38abl }, 23647 0 }, 23648 /* 3 << 176 */ 23649 { { 0x9e93ba24f111661el,0xedced484b105eb04l,0x96dc9ba1f424b578l, 23650 0xbf8f66b7e83e9069l }, 23651 { 0x872d4df4d7ed8216l,0xbf07f3778e2cbecfl,0x4281d89998e73754l, 23652 0xfec85fbb8aab8708l }, 23653 0 }, 23654 /* 4 << 176 */ 23655 { { 0x13b5bf22765fa7d0l,0x59805bf01d6a5370l,0x67a5e29d4280db98l, 23656 0x4f53916f776b1ce3l }, 23657 { 0x714ff61f33ddf626l,0x4206238ea085d103l,0x1c50d4b7e5809ee3l, 23658 0x999f450d85f8eb1dl }, 23659 0 }, 23660 /* 5 << 176 */ 23661 { { 0x82eebe731a3a93bcl,0x42bbf465a21adc1al,0xc10b6fa4ef030efdl, 23662 0x247aa4c787b097bbl }, 23663 { 0x8b8dc632f60c77dal,0x6ffbc26ac223523el,0xa4f6ff11344579cfl, 23664 0x5825653c980250f6l }, 23665 0 }, 23666 /* 7 << 176 */ 23667 { { 0xeda6c595d314e7bcl,0x2ee7464b467899edl,0x1cef423c0a1ed5d3l, 23668 0x217e76ea69cc7613l }, 23669 { 0x27ccce1fe7cda917l,0x12d8016b8a893f16l,0xbcd6de849fc74f6bl, 23670 0xfa5817e2f3144e61l }, 23671 0 }, 23672 /* 9 << 176 */ 23673 { { 0xc0b48d4e49ccd6d7l,0xff8fb02c88bd5580l,0xc75235e907d473b2l, 23674 0x4fab1ac5a2188af3l }, 23675 { 0x030fa3bc97576ec0l,0xe8c946e80b7e7d2fl,0x40a5c9cc70305600l, 23676 0x6d8260a9c8b013b4l }, 23677 0 }, 23678 /* 10 << 176 */ 23679 { { 0xe6c51073615cd9e4l,0x498ec047f1243c06l,0x3e5a8809b17b3d8cl, 23680 0x5cd99e610cc565f1l }, 23681 { 0x81e312df7851dafel,0xf156f5baa79061e2l,0x80d62b71880c590el, 23682 0xbec9746f0a39faa1l }, 23683 0 }, 23684 /* 11 << 176 */ 23685 { { 0x2b09d2c3cfdcf7ddl,0x41a9fce3723fcab4l,0x73d905f707f57ca3l, 23686 0x080f9fb1ac8e1555l }, 23687 { 0x7c088e849ba7a531l,0x07d35586ed9a147fl,0x602846abaf48c336l, 23688 0x7320fd320ccf0e79l }, 23689 0 }, 23690 /* 13 << 176 */ 23691 { { 0x92eb40907f8f875dl,0x9c9d754e56c26bbfl,0x158cea618110bbe7l, 23692 0x62a6b802745f91eal }, 23693 { 0xa79c41aac6e7394bl,0x445b6a83ad57ef10l,0x0c5277eb6ea6f40cl, 23694 0x319fe96b88633365l }, 23695 0 }, 23696 /* 15 << 176 */ 23697 { { 0x77f84203d39b8c34l,0xed8b1be63125eddbl,0x5bbf2441f6e39dc5l, 23698 0xb00f6ee66a5d678al }, 23699 { 0xba456ecf57d0ea99l,0xdcae0f5817e06c43l,0x01643de40f5b4baal, 23700 0x2c324341d161b9bel }, 23701 0 }, 23702 /* 16 << 176 */ 23703 { { 0x949c9976e1337c26l,0x6faadebdd73d68e5l,0x9e158614f1b768d9l, 23704 0x22dfa5579cc4f069l }, 23705 { 0xccd6da17be93c6d6l,0x24866c61a504f5b9l,0x2121353c8d694da1l, 23706 0x1c6ca5800140b8c6l }, 23707 0 }, 23708 /* 17 << 176 */ 23709 { { 0x4e77c5575b45afb4l,0xe9ded649efb8912dl,0x7ec9bbf542f6e557l, 23710 0x2570dfff62671f00l }, 23711 { 0x2b3bfb7888e084bdl,0xa024b238f37fe5b4l,0x44e7dc0495649aeel, 23712 0x498ca2555e7ec1d8l }, 23713 0 }, 23714 /* 19 << 176 */ 23715 { { 0x2e44d22526a1fc90l,0x0d6d10d24d70705dl,0xd94b6b10d70c45f4l, 23716 0x0f201022b216c079l }, 23717 { 0xcec966c5658fde41l,0xa8d2bc7d7e27601dl,0xbfcce3e1ff230be7l, 23718 0x3394ff6b0033ffb5l }, 23719 0 }, 23720 /* 21 << 176 */ 23721 { { 0x05d99be8b9c20cdal,0x89f7aad5d5cd0c98l,0x7ef936fe5bb94183l, 23722 0x92ca0753b05cd7f2l }, 23723 { 0x9d65db1174a1e035l,0x02628cc813eaea92l,0xf2d9e24249e4fbf2l, 23724 0x94fdfd9be384f8b7l }, 23725 0 }, 23726 /* 23 << 176 */ 23727 { { 0x29882d7c98379d44l,0xd000bdfb509edc8al,0xc6f95979e66fe464l, 23728 0x504a6115fa61bde0l }, 23729 { 0x56b3b871effea31al,0x2d3de26df0c21a54l,0x21dbff31834753bfl, 23730 0xe67ecf4969269d86l }, 23731 0 }, 23732 /* 25 << 176 */ 23733 { { 0xed29a56da16d4b34l,0x7fba9d09dca21c4fl,0x66d7ac006d8de486l, 23734 0x6006198773a2a5e1l }, 23735 { 0x8b400f869da28ff0l,0x3133f70843c4599cl,0x9911c9b8ee28cb0dl, 23736 0xcd7e28748e0af61dl }, 23737 0 }, 23738 /* 27 << 176 */ 23739 { { 0x6a7bb6a93b5bdb83l,0x08da65c0a4a72318l,0xc58d22aa63eb065fl, 23740 0x1717596c1b15d685l }, 23741 { 0x112df0d0b266d88bl,0xf688ae975941945al,0x487386e37c292cacl, 23742 0x42f3b50d57d6985cl }, 23743 0 }, 23744 /* 28 << 176 */ 23745 { { 0x69e3be0427596893l,0xb6bb02a645bf452bl,0x0875c11af4c698c8l, 23746 0x6652b5c7bece3794l }, 23747 { 0x7b3755fd4f5c0499l,0x6ea16558b5532b38l,0xd1c69889a2e96ef7l, 23748 0x9c773c3a61ed8f48l }, 23749 0 }, 23750 /* 29 << 176 */ 23751 { { 0x5a304ada8545d185l,0x82ae44ea738bb8cbl,0x628a35e3df87e10el, 23752 0xd3624f3da15b9fe3l }, 23753 { 0xcc44209b14be4254l,0x7d0efcbcbdbc2ea5l,0x1f60336204c37bbel, 23754 0x21f363f556a5852cl }, 23755 0 }, 23756 /* 31 << 176 */ 23757 { { 0x81262e4225346689l,0x716da290b07c7004l,0x35f911eab7950ee3l, 23758 0x6fd72969261d21b5l }, 23759 { 0x5238980308b640d3l,0x5b0026ee887f12a1l,0x20e21660742e9311l, 23760 0x0ef6d5415ff77ff7l }, 23761 0 }, 23762 /* 33 << 176 */ 23763 { { 0x64aa0874925dd0b0l,0x5ffd503851c474c6l,0x4478c72c8ebd4157l, 23764 0xb98694cb8c8375e2l }, 23765 { 0xeda4edeecd8e208cl,0xf98a053d2c0670a6l,0x564bd3057f346b9dl, 23766 0xafbbf3e94c318fddl }, 23767 0 }, 23768 /* 34 << 176 */ 23769 { { 0x8a03410aa96c4685l,0xef1b6b16a978a31bl,0x44738a3b629df6cfl, 23770 0xa1dc65da807713e9l }, 23771 { 0x569cc7884c373442l,0x1f30a2464965fb52l,0x56822f1677ff5e2el, 23772 0x63f18812e303748bl }, 23773 0 }, 23774 /* 35 << 176 */ 23775 { { 0x2abdc403dd0983ecl,0xec0c08c7f365c6f5l,0xe555083fbdb66b8bl, 23776 0x593685bc4e8973ffl }, 23777 { 0x737df3f920e9c705l,0x00c7bcc309c31a5al,0x5f1d23e2efdcb34dl, 23778 0x79d9b382470f7949l }, 23779 0 }, 23780 /* 36 << 176 */ 23781 { { 0x44a315645fd2eb1dl,0x4e7397263fdd1356l,0x9b96735463200efel, 23782 0xcb70402e520bbb6al }, 23783 { 0xcbc90d7e693d2642l,0x6fb00064bc9b4002l,0x95f2eab3d96f7150l, 23784 0xb1619e3fe035f47al }, 23785 0 }, 23786 /* 37 << 176 */ 23787 { { 0xd22d6073d1561bb7l,0x40666e4ba9928683l,0x90654dab8ab3f9b1l, 23788 0x7625c507b8773421l }, 23789 { 0x288f28220ca88cd2l,0xbb88114ed8d005c1l,0xbeec2b0af603a11bl, 23790 0x8fdda60325f7949el }, 23791 0 }, 23792 /* 39 << 176 */ 23793 { { 0x6503632d6ee4f1d0l,0xd5449747ea394840l,0xd696167a8abe13a1l, 23794 0xc080f76e609ebaa9l }, 23795 { 0x181acf0c10aa70d6l,0x70614461291e5e50l,0x7ade8e84b9f0c0a3l, 23796 0xef1de9f2cb11b41el }, 23797 0 }, 23798 /* 40 << 176 */ 23799 { { 0x2d5c3c848e592413l,0x727022961832ba2cl,0x22979b51596c6321l, 23800 0x738f31cb5a04db64l }, 23801 { 0x0bdaa6ca98f84ee5l,0x4e9e827c15e21eeel,0x4c59dbcc3ea632e0l, 23802 0xed3404db5bc6f027l }, 23803 0 }, 23804 /* 41 << 176 */ 23805 { { 0x2841f05cfbaf8b26l,0xac9830db5b243770l,0xde3ab1707787f324l, 23806 0x1ee12efe079209bcl }, 23807 { 0x2d3fd62d5bcf6e3cl,0x8a680655d60b0582l,0xdafc5061bc2b64a1l, 23808 0xe0d91e7526a88788l }, 23809 0 }, 23810 /* 43 << 176 */ 23811 { { 0x2d49c685426b1b1el,0x6c2149caeabb02f7l,0xa4697d7fde11984fl, 23812 0xa0e32fb3ed3c8707l }, 23813 { 0xb783e825f4ca12dal,0xb2666e2448770a50l,0x82d47f478660e923l, 23814 0x6e36cd71fb4a984fl }, 23815 0 }, 23816 /* 44 << 176 */ 23817 { { 0x3295a8ea43c66b92l,0x99387af6ac5d19d4l,0x545f9b1b8e9d2090l, 23818 0x138b1c4c2660f530l }, 23819 { 0xbfb05fd2ff872627l,0xb6614b0f4c3bc45cl,0x13defece62ca0fb0l, 23820 0x82ddae134fededd8l }, 23821 0 }, 23822 /* 45 << 176 */ 23823 { { 0x5a34499b871c4cbbl,0x3ab0e69a2eb6084bl,0xa8d0160025ef7755l, 23824 0x5db8f611d9e70f5dl }, 23825 { 0x63f9eb9a7afa95d7l,0x328b97f9706d7964l,0x8bcf9a0f4b71dfcal, 23826 0x53d4c3042a5c7934l }, 23827 0 }, 23828 /* 46 << 176 */ 23829 { { 0x0c87dd3a8768d9aal,0x201ce5a082f6a55fl,0xa3de6f3049ca4602l, 23830 0x36f421422aeb5f17l }, 23831 { 0x5c9962399817b77al,0x2584a10ae8d165acl,0x80f683d0c726f4aal, 23832 0x524307502dcdfa48l }, 23833 0 }, 23834 /* 47 << 176 */ 23835 { { 0x0c04399f94683df2l,0x0978e9d4e954838dl,0x01faa5e8cf4a7a7bl, 23836 0x92f6e6a90dae61cfl }, 23837 { 0x0c0f1293373dc957l,0x8320178fd8cc6b67l,0x4af977ed4b6444f2l, 23838 0xd8c9a401ad8e5f84l }, 23839 0 }, 23840 /* 48 << 176 */ 23841 { { 0xbd5660ed9aed9f40l,0x70ca6ad1532a8c99l,0xc4978bfb95c371eal, 23842 0xe5464d0d7003109dl }, 23843 { 0x1af32fdfd9e535efl,0xabf57ea798c9185bl,0xed7a741712b42488l, 23844 0x8e0296a7e97286fal }, 23845 0 }, 23846 /* 49 << 176 */ 23847 { { 0x79ee35ac16fca804l,0x8f16e6165f59782el,0x8fbef1011737694el, 23848 0xb34b7625462be08bl }, 23849 { 0x7e63e1b016e75c91l,0xb6a18edd2d23728dl,0xcf761a1e7f299ab6l, 23850 0x796dcdebf16c770el }, 23851 0 }, 23852 /* 51 << 176 */ 23853 { { 0x47354f22308ee4afl,0x96959a538ecd6f4bl,0xf60b5f104055cbd2l, 23854 0x04b1c9599bd86095l }, 23855 { 0x26accd8486008564l,0x46b2fe0478f31ea7l,0x5500dbf72dd76f23l, 23856 0x36bcdf584c496c6fl }, 23857 0 }, 23858 /* 52 << 176 */ 23859 { { 0x8836cd431527d7cel,0x1f236623187a50eal,0x6470c0ae847221f0l, 23860 0xc61f86b47e449110l }, 23861 { 0x7cc9cc20fa9fcec1l,0xa394903019134349l,0xafe5a08ff53ab467l, 23862 0x9caba02301ed2919l }, 23863 0 }, 23864 /* 53 << 176 */ 23865 { { 0xffecbdce406abf1el,0x0ef4bcd73ae340d4l,0x7e37bae0e19d5613l, 23866 0xe191669be4c6e97al }, 23867 { 0x9fafe59797292db7l,0xab7ef3713172d716l,0x9f0fff330ce3b533l, 23868 0xca94ff8f932dd8cfl }, 23869 0 }, 23870 /* 55 << 176 */ 23871 { { 0x659c8b5d78aea69el,0xdde7ab46476a8fb9l,0x26bfe303bd01b5e6l, 23872 0xf3dfb08a726a937cl }, 23873 { 0xe7a591fa0a263670l,0xe872c3f8f97434a0l,0x4881a82e2e0f2c21l, 23874 0x17624e48788ef958l }, 23875 0 }, 23876 /* 57 << 176 */ 23877 { { 0xd526d66da7222e5bl,0xd33bb78efeb00e25l,0x9a7d670b932c8d08l, 23878 0xea31e5273cee093fl }, 23879 { 0x55cc091bd04b7a43l,0x12b08d6dd01a123dl,0x1d98a6467fb0e7bal, 23880 0xdabb09483535fd0dl }, 23881 0 }, 23882 /* 59 << 176 */ 23883 { { 0x2862314d08b69b19l,0x9cf302e191effcfal,0x43bdc8462ead917al, 23884 0x21b238bbf94b3d8fl }, 23885 { 0xa3736160e2f465d3l,0x4d7fb6818541e255l,0x46fa089a23551edcl, 23886 0xf7c41d17c1fefa8cl }, 23887 0 }, 23888 /* 60 << 176 */ 23889 { { 0x8ed0807fed113000l,0x8e1672d04c691484l,0x33a13ab31ee86ca0l, 23890 0x9df0d9573bcaee4fl }, 23891 { 0x0cf0c638ef0dfb71l,0x1e0fe22ac2c9510al,0x43f506716fcc6a21l, 23892 0xccb58404cec03a94l }, 23893 0 }, 23894 /* 61 << 176 */ 23895 { { 0x59547e37fd0936c1l,0x81e0517df45140b1l,0xcc6ccd89ed49e3fcl, 23896 0xc2fa23eff3b897del }, 23897 { 0x149511ef2050c80al,0xf66bea6b3140b833l,0xbbe1401e2786d723l, 23898 0x0aeb549c887509bcl }, 23899 0 }, 23900 /* 63 << 176 */ 23901 { { 0xf938e85060f5867al,0x806e1fff72429adcl,0x5ff7962a45f43b52l, 23902 0xd8375ab6b2bbb403l }, 23903 { 0x00d5819b21b287fcl,0x15c7190ebae37d58l,0x075ce5ce05fcfb07l, 23904 0x76368d06dbc003cbl }, 23905 0 }, 23906 /* 64 << 176 */ 23907 { { 0x01079383171b445fl,0x9bcf21e38131ad4cl,0x8cdfe205c93987e8l, 23908 0xe63f4152c92e8c8fl }, 23909 { 0x729462a930add43dl,0x62ebb143c980f05al,0x4f3954e53b06e968l, 23910 0xfe1d75ad242cf6b1l }, 23911 0 }, 23912 /* 65 << 176 */ 23913 { { 0x1cf508197630655el,0x9b4685c408d417f5l,0x6ea942619b049259l, 23914 0x31c29b54fe73b755l }, 23915 { 0x3d2872a1f1f2af17l,0xbcd1139956bcbc4bl,0x4d14f59890d7a85cl, 23916 0xd2c46040dbcbe998l }, 23917 0 }, 23918 /* 71 << 176 */ 23919 { { 0x3c8a06ca9792c42al,0x92535628602460ddl,0xa95e13f2ddd4c676l, 23920 0xe823841d3b20d463l }, 23921 { 0x0248605bbfad6051l,0x82985dd61af51233l,0x3d243a5cdef7d742l, 23922 0x0a88ce55ff6aa911l }, 23923 0 }, 23924 /* 77 << 176 */ 23925 { { 0xcf5b5962449aec98l,0x40322a6531a41389l,0xcd15606fd72c0527l, 23926 0xfe91eac7b90d65a0l }, 23927 { 0xcd32415487636360l,0x82f2c7bdfc653a6fl,0xd04d138ae315ce7cl, 23928 0x40ebfd5e78118dbcl }, 23929 0 }, 23930 /* 83 << 176 */ 23931 { { 0x0f9ea6ae4144660fl,0x02345c6513279b25l,0x139497b65c7671cbl, 23932 0x7259f14b2ebed1d5l }, 23933 { 0xa1e5d98ce9b29988l,0xaed0efcd8df73ac8l,0x88339f073b81a77cl, 23934 0x28f2bbca7109c8a6l }, 23935 0 }, 23936 /* 89 << 176 */ 23937 { { 0xa264f99d811472ddl,0x0e7eae0afc07a80cl,0x77f264d4a683cdc6l, 23938 0x0512df49d053c668l }, 23939 { 0x2b4dfbade61dea15l,0x83de61acfd74890al,0xd2552bab32d41182l, 23940 0x1fb9411435924e6al }, 23941 0 }, 23942 /* 95 << 176 */ 23943 { { 0x85efe53ade23c988l,0x89d41dbbf897f91bl,0x1357f91e7873fa8dl, 23944 0x7a6ec2e3718d911cl }, 23945 { 0xf9e4f92e8f209a01l,0x4ffb96a70fdd67f3l,0x4c81a787f83dde1cl, 23946 0x0d68fce15e163b60l }, 23947 0 }, 23948 /* 101 << 176 */ 23949 { { 0xbc79b4b26ab6da9dl,0xb4be5c278bb005f1l,0x63624530cd3b280bl, 23950 0x543142f04e880026l }, 23951 { 0xbf7fb14cad90ddbfl,0xfe456e8a3966732dl,0x85499fb987ce35e9l, 23952 0x8af09e6b24f1305dl }, 23953 0 }, 23954 /* 107 << 176 */ 23955 { { 0x5fc563ec16dc2b4bl,0xfe5631b25d0e535fl,0xbf4c489f9a93e36cl, 23956 0x56badff1da2a07c4l }, 23957 { 0x72ac6b77fb7c5595l,0x4b25b9428e6645d9l,0xeeae127251f0657el, 23958 0x30779ca51abeb76bl }, 23959 0 }, 23960 /* 113 << 176 */ 23961 { { 0x3d602ef5d909f43dl,0x2b2951a6bb347c79l,0x44903bfaa0d88896l, 23962 0xd4ab20e8684c104fl }, 23963 { 0x55f70b4dd9b7e626l,0x084b3ee646a5f9ecl,0x1799cbe3da4ae81al, 23964 0xc7cfac937fd6b80fl }, 23965 0 }, 23966 /* 116 << 176 */ 23967 { { 0x45647911ca20c525l,0x78f83186004706abl,0x5596377d97510538l, 23968 0x047863defe041f8cl }, 23969 { 0xaea784896ec82367l,0x9d4eac2601eee8fcl,0xb32728f19b57d9dbl, 23970 0x60a158f5313c0f65l }, 23971 0 }, 23972 /* 119 << 176 */ 23973 { { 0xf78caf129754377bl,0xa7fce16b6966f0c4l,0xfea937555a54a2b7l, 23974 0x52d7f79b7cdfe951l }, 23975 { 0x3e14b92e94b1dac0l,0x363f2e5af168b73bl,0xcc0e9dcb6436a8c2l, 23976 0x2dbece4bb52cbd27l }, 23977 0 }, 23978 /* 125 << 176 */ 23979 { { 0x7e7907ed8df38ffel,0xa68ec827e24e8a24l,0x5093a97e5f168732l, 23980 0xa9ffea2f39ebb6dbl }, 23981 { 0x89e02c12284276d4l,0xc1179e3b3f9502d6l,0x01becb51d8f69eb6l, 23982 0x86eee2935eb1c73cl }, 23983 0 }, 23984 }, 23985 { 23986 /* 0 << 184 */ 23987 { { 0x00, 0x00, 0x00, 0x00 }, 23988 { 0x00, 0x00, 0x00, 0x00 }, 23989 1 }, 23990 /* 1 << 184 */ 23991 { { 0xf3b7963f4c830320l,0x842c7aa0903203e3l,0xaf22ca0ae7327afbl, 23992 0x38e13092967609b6l }, 23993 { 0x73b8fb62757558f1l,0x3cc3e831f7eca8c1l,0xe4174474f6331627l, 23994 0xa77989cac3c40234l }, 23995 0 }, 23996 /* 3 << 184 */ 23997 { { 0xb32cb8b0b796d219l,0xc3e95f4f34741dd9l,0x8721212568edf6f5l, 23998 0x7a03aee4a2b9cb8el }, 23999 { 0x0cd3c376f53a89aal,0x0d8af9b1948a28dcl,0xcf86a3f4902ab04fl, 24000 0x8aacb62a7f42002dl }, 24001 0 }, 24002 /* 4 << 184 */ 24003 { { 0xfd8e139f8f5fcda8l,0xf3e558c4bdee5bfdl,0xd76cbaf4e33f9f77l, 24004 0x3a4c97a471771969l }, 24005 { 0xda27e84bf6dce6a7l,0xff373d9613e6c2d1l,0xf115193cd759a6e9l, 24006 0x3f9b702563d2262cl }, 24007 0 }, 24008 /* 5 << 184 */ 24009 { { 0x9cb0ae6c252bd479l,0x05e0f88a12b5848fl,0x78f6d2b2a5c97663l, 24010 0x6f6e149bc162225cl }, 24011 { 0xe602235cde601a89l,0xd17bbe98f373be1fl,0xcaf49a5ba8471827l, 24012 0x7e1a0a8518aaa116l }, 24013 0 }, 24014 /* 7 << 184 */ 24015 { { 0x8b1e572235e6fc06l,0x3477728f0b3e13d5l,0x150c294daa8a7372l, 24016 0xc0291d433bfa528al }, 24017 { 0xc6c8bc67cec5a196l,0xdeeb31e45c2e8a7cl,0xba93e244fb6e1c51l, 24018 0xb9f8b71b2e28e156l }, 24019 0 }, 24020 /* 9 << 184 */ 24021 { { 0x343ac0a3ee9523f0l,0xbb75eab2975ea978l,0x1bccf332107387f4l, 24022 0x790f92599ab0062el }, 24023 { 0xf1a363ad1e4f6a5fl,0x06e08b8462519a50l,0x609151877265f1eel, 24024 0x6a80ca3493ae985el }, 24025 0 }, 24026 /* 10 << 184 */ 24027 { { 0xa3f4f521e447f2c4l,0x81b8da7a604291f0l,0xd680bc467d5926del, 24028 0x84f21fd534a1202fl }, 24029 { 0x1d1e31814e9df3d8l,0x1ca4861a39ab8d34l,0x809ddeec5b19aa4al, 24030 0x59f72f7e4d329366l }, 24031 0 }, 24032 /* 11 << 184 */ 24033 { { 0x2dfb9e08be0f4492l,0x3ff0da03e9d5e517l,0x03dbe9a1f79466a8l, 24034 0x0b87bcd015ea9932l }, 24035 { 0xeb64fc83ab1f58abl,0x6d9598da817edc8al,0x699cff661d3b67e5l, 24036 0x645c0f2992635853l }, 24037 0 }, 24038 /* 13 << 184 */ 24039 { { 0xd50e57c7d7fe71f3l,0x15342190bc97ce38l,0x51bda2de4df07b63l, 24040 0xba12aeae200eb87dl }, 24041 { 0xabe135d2a9b4f8f6l,0x04619d65fad6d99cl,0x4a6683a77994937cl, 24042 0x7a778c8b6f94f09al }, 24043 0 }, 24044 /* 15 << 184 */ 24045 { { 0x8dd1fb83425c6559l,0x7fc00ee60af06fdal,0xe98c922533d956dfl, 24046 0x0f1ef3354fbdc8a2l }, 24047 { 0x2abb5145b79b8ea2l,0x40fd2945bdbff288l,0x6a814ac4d7185db7l, 24048 0xc4329d6fc084609al }, 24049 0 }, 24050 /* 16 << 184 */ 24051 { { 0x511053e453544774l,0x834d0ecc3adba2bcl,0x4215d7f7bae371f5l, 24052 0xfcfd57bf6c8663bcl }, 24053 { 0xded2383dd6901b1dl,0x3b49fbb4b5587dc3l,0xfd44a08d07625f62l, 24054 0x3ee4d65b9de9b762l }, 24055 0 }, 24056 /* 17 << 184 */ 24057 { { 0x55ef9d3dcc26e8b0l,0xf869c827729b707al,0xdbbf450d8c47e00cl, 24058 0x73d546ea60972ed7l }, 24059 { 0x9563e11f0dcd6821l,0xe48e1af57d80de7fl,0xbe7139b49057838dl, 24060 0xf3f0ad4d7e5ca535l }, 24061 0 }, 24062 /* 19 << 184 */ 24063 { { 0xac66d1d49f8f8cc2l,0x43fe5c154ef18941l,0xbae77b6ddc30fcbfl, 24064 0xdb95ea7d945723b7l }, 24065 { 0x43298e2bda8097e2l,0x8004167baf22ea9bl,0x9cf5974196a83d57l, 24066 0xb35c9aba3cf67d5el }, 24067 0 }, 24068 /* 21 << 184 */ 24069 { { 0x0569a48df766f793l,0x6b4c7b16706b3442l,0xcc97754416ff41e0l, 24070 0x800c56e31fee2e86l }, 24071 { 0xce0c3d0fcdf93450l,0x6ec3703582f35916l,0x902520d5bbc11e68l, 24072 0x7e2b988505078223l }, 24073 0 }, 24074 /* 23 << 184 */ 24075 { { 0xb30d1769101da00bl,0xb26872d5113cfdb6l,0x7b0491da44e48db5l, 24076 0x810e73bb2013f8c9l }, 24077 { 0xc86e579a570f0b59l,0xf34107e37a918f34l,0x49286d00277473f1l, 24078 0x74423f5abc85905dl }, 24079 0 }, 24080 /* 25 << 184 */ 24081 { { 0x90d7417879de6b48l,0xe762caf0d14fa75bl,0xa309dcf3bd91ec5dl, 24082 0x7aafe1ddf526d04fl }, 24083 { 0x76911342d39e36ffl,0xe28994d2fabb34b8l,0xac23a92c863110cbl, 24084 0x9f0f69673aabd166l }, 24085 0 }, 24086 /* 27 << 184 */ 24087 { { 0x7436bdf47e333f98l,0x879cf31f2455af64l,0x07933a9cf6cfde92l, 24088 0xfcac38a5b6e3203fl }, 24089 { 0xa39b6a8098e5a6e0l,0x1d600b5da4837528l,0x54718de7c32d412bl, 24090 0x02870f46317937ccl }, 24091 0 }, 24092 /* 28 << 184 */ 24093 { { 0x1f13756db1761ec8l,0xe53c8b98a4b97e55l,0xb2aee3f84096cc28l, 24094 0x48c361a0920f1a8dl }, 24095 { 0xa98b672d8c31190al,0x7bc1e7d1001855d4l,0x242cfb07bf3f4b2al, 24096 0x9bf44a3f32a28bc4l }, 24097 0 }, 24098 /* 29 << 184 */ 24099 { { 0x96d4b271e36eeccdl,0x2d8c01b859237e23l,0x24f7a6eb8adf2653l, 24100 0xc08ac4ab41183d80l }, 24101 { 0xc35e5bb7036367c3l,0xd8c97cbc0ba59f61l,0x296b1f4c5aafe986l, 24102 0xa519c7a17d179c37l }, 24103 0 }, 24104 /* 31 << 184 */ 24105 { { 0x4043490790ae5f49l,0x8ac8f73649556b81l,0xb57a89b0f4e77a16l, 24106 0xe1a1565d071020eal }, 24107 { 0x4a27f34d3dda8450l,0x65af18b9bc395814l,0xaf21939f9ff49991l, 24108 0x47e00639b4af7691l }, 24109 0 }, 24110 /* 33 << 184 */ 24111 { { 0x4b3e263246b1f9b2l,0x6457d838efde99d3l,0x77d5142325e56171l, 24112 0xb45de3df7d54996cl }, 24113 { 0x1ee2dd3194098d98l,0x986896141f3ebdc5l,0x2704a107997efb47l, 24114 0x96b502eecb11e520l }, 24115 0 }, 24116 /* 34 << 184 */ 24117 { { 0x58c8039ec19f866el,0xc84c053e386c2644l,0xb3708ab049435704l, 24118 0x1b70c3c86fc47b24l }, 24119 { 0x235582a27f095649l,0x0d344b66673c9a9el,0x777c9e71e2b00efdl, 24120 0x91691d6e5b877856l }, 24121 0 }, 24122 /* 35 << 184 */ 24123 { { 0x11c663c49cd31e22l,0x46ae0bd95fb943d7l,0x6e36bca6a392fc01l, 24124 0x4f8cc3a77948716fl }, 24125 { 0x10ae9d6b3aa4bbb0l,0xcc9b6cb5d8001a86l,0x012c8e3aa0a4ceedl, 24126 0xe462971e52274942l }, 24127 0 }, 24128 /* 36 << 184 */ 24129 { { 0x9982e2ac42e176a5l,0x324eba46e2782b64l,0x3d8caaafe18350f5l, 24130 0xf3d82af2f5d674cal }, 24131 { 0xc2090fed56600d1el,0x4548e0ef5950de07l,0xb2f0023f765a4febl, 24132 0xb303103339f16790l }, 24133 0 }, 24134 /* 37 << 184 */ 24135 { { 0xb94095dc7bdacf7al,0x0e73db39509b310al,0x76e99a6b41b5f772l, 24136 0xef40e9c596f3dbd7l }, 24137 { 0xd0d644f980f2179el,0xe0db831d5a89807el,0xa0188493c2a2d6c6l, 24138 0xf2d9a85e5ba9faa9l }, 24139 0 }, 24140 /* 39 << 184 */ 24141 { { 0x598b7876cdd95b93l,0x5f7cc827336966e8l,0x01887109e797f102l, 24142 0x665671c446c7c296l }, 24143 { 0xb314793c6e019c72l,0x5a6c81580e0329acl,0x4faf2f1b44281b98l, 24144 0x825884072e1fc97el }, 24145 0 }, 24146 /* 40 << 184 */ 24147 { { 0xa692781d61a3c8b3l,0x08bc385432876d0el,0xbecf05fb28027b03l, 24148 0x636c687da4b1e12fl }, 24149 { 0x00e3003d07217c58l,0x613ba9375e01b2a3l,0xa58c8405881de16el, 24150 0xc653c43014f8f48bl }, 24151 0 }, 24152 /* 41 << 184 */ 24153 { { 0x68e53c7c89c0c7c2l,0xf2e680b23c423272l,0xacd47fae60f50133l, 24154 0x4c484c6534f05605l }, 24155 { 0x663bdcf9ebffbb7dl,0xb49cff3be42421c6l,0x0549f7b13f53f261l, 24156 0xc516aeda7c374766l }, 24157 0 }, 24158 /* 43 << 184 */ 24159 { { 0xa515fe0f76a0ec26l,0xf727c0797b0b8b21l,0xaeed4c671993651el, 24160 0x1465a7f828ac7c87l }, 24161 { 0x776bd5131f0ef90bl,0x57515d2cd9773e61l,0x235455e95564c50bl, 24162 0xf44daef80bf06a24l }, 24163 0 }, 24164 /* 44 << 184 */ 24165 { { 0xbc1c6897d6a0d0f9l,0xd8e0ea0e3b0d7f55l,0xb35baa92b85b7aadl, 24166 0x2becd1b7674e48f4l }, 24167 { 0xe2d7f78d6d7a9ac2l,0xf5074262f99c95d0l,0x4852470a89f611e9l, 24168 0xf7aa911992869decl }, 24169 0 }, 24170 /* 45 << 184 */ 24171 { { 0x0bd1755b0ac4840fl,0x0f4c6c2aa22eef10l,0x3f72fe2d78d16dd9l, 24172 0xb2d49200ff7096a4l }, 24173 { 0xa5dead555ffca031l,0x1d013c320b65f4cfl,0x67e498582a23f441l, 24174 0x55bae166d02412c0l }, 24175 0 }, 24176 /* 46 << 184 */ 24177 { { 0x546dd4545739a62al,0x353dc1422a30b836l,0x1462449d99cbd704l, 24178 0xda02d0772da69411l }, 24179 { 0xcb115fe565b1a1adl,0x395235f501230a22l,0x8ae630eed164d970l, 24180 0x60b679f0074e3a7el }, 24181 0 }, 24182 /* 47 << 184 */ 24183 { { 0x2e64695245d231e1l,0xc96663ac00d8a0fbl,0xc1fbaa0cd07e1f41l, 24184 0x4b31484488758781l }, 24185 { 0xd6971a835183e72el,0xd1d01f174cbe99b7l,0xe90b438c5a2f7512l, 24186 0xf858fa452957c620l }, 24187 0 }, 24188 /* 48 << 184 */ 24189 { { 0xed7f2e774e6daae2l,0x7b3ae0e39e0a19bcl,0xd3293f8a91ae677el, 24190 0xd363b0cb45c8611fl }, 24191 { 0xbe1d1ccf309ae93bl,0xa3f80be73920cae1l,0xaaacba74498edf01l, 24192 0x1e6d2a4ab2f5ac90l }, 24193 0 }, 24194 /* 49 << 184 */ 24195 { { 0xb5c5bb67b972a778l,0xc2423a4a190f9b5al,0x4e693cf365247948l, 24196 0xc37d129ea94a65a3l }, 24197 { 0xbea4736b6e9cd47bl,0xf3d1bd212338f524l,0xa2a0278e067a45dal, 24198 0xc86d631b5b5dce9bl }, 24199 0 }, 24200 /* 51 << 184 */ 24201 { { 0xc2d75f46116952cel,0xd2b66269b75e40dal,0x024f670f921c4111l, 24202 0x37ffd854c91fd490l }, 24203 { 0x6be44d0385b2f613l,0x040cd7d9ba11c4f9l,0x04c1cb762c0efb1fl, 24204 0xd905ff4f505e4698l }, 24205 0 }, 24206 /* 52 << 184 */ 24207 { { 0x60c5f03f233550f1l,0xd4d09411925afd2el,0xa95b65c3d258e5a6l, 24208 0x1a19cfb59f902c6al }, 24209 { 0xb486013af5ad5c68l,0xa2506776979638f3l,0x1232b4d0a38e0b28l, 24210 0xa64784b8d36a7b4fl }, 24211 0 }, 24212 /* 53 << 184 */ 24213 { { 0x22c75830a13dcb47l,0xd6e81258efd7a08fl,0x6db703b6e4fc49b8l, 24214 0x8a5ac636f01817e9l }, 24215 { 0x8d27b6e1b3f24514l,0x40edc3bc708c51d7l,0x9a1eec7765bb086dl, 24216 0x812ccb42b10800f8l }, 24217 0 }, 24218 /* 55 << 184 */ 24219 { { 0x1a39c6acd4338453l,0x3d93822954b1295dl,0x7bf0bf45e0d81165l, 24220 0x83d58ca5972804d2l }, 24221 { 0x105d3ddb00524b94l,0x65d516e7920378ecl,0x1d28f5f1aea33926l, 24222 0xa0b354313901c906l }, 24223 0 }, 24224 /* 57 << 184 */ 24225 { { 0x000442a1e4f354del,0x165b44d9d1d112f5l,0x67fd9ced0d05c0a9l, 24226 0xd6ce074360bd5d60l }, 24227 { 0x9ac80c931522af2al,0x8232d522fa07d449l,0x287b5534c3fdb652l, 24228 0x9f0548b3abd2ab98l }, 24229 0 }, 24230 /* 59 << 184 */ 24231 { { 0xde8d7086b9aea1d4l,0x692180d98a7dc3fcl,0xd64ffb53bad3e6f3l, 24232 0x84628acf36ce3f91l }, 24233 { 0xf76e470b6d498ac5l,0xa16945547abad602l,0x5b8fd6a5a255c1f6l, 24234 0xffe24e4a8576ae2al }, 24235 0 }, 24236 /* 60 << 184 */ 24237 { { 0x5655179de7d70e03l,0x3e780c5c72a84570l,0xc102b4cb1d50029cl, 24238 0x3e71bdd5f075e839l }, 24239 { 0x6460f4f0b498b822l,0x2682e06c6d4b8da5l,0x4eae53c996a740d4l, 24240 0xc19d8bef6389702cl }, 24241 0 }, 24242 /* 61 << 184 */ 24243 { { 0x711be2081025fe1dl,0x2e562c89f0bc6a99l,0xcfd2be3a28bf4150l, 24244 0x33037b4a38e5bc91l }, 24245 { 0x10c6da9df52fea02l,0x511f62444f0ea410l,0x19d37ca81a294c3fl, 24246 0x7e40f444618e6fd3l }, 24247 0 }, 24248 /* 63 << 184 */ 24249 { { 0x4095f5ddbedb8734l,0x9c16027c4432f51al,0xced8179d873d0f11l, 24250 0x70c2bc9f6ebe6e61l }, 24251 { 0x5c31035d616cf2f4l,0xf92e0fbd00a4af3dl,0xe6048a03511893c4l, 24252 0x639a804b52e2f462l }, 24253 0 }, 24254 /* 64 << 184 */ 24255 { { 0x8735728dc2c6ff70l,0x79d6122fc5dc2235l,0x23f5d00319e277f9l, 24256 0x7ee84e25dded8cc7l }, 24257 { 0x91a8afb063cd880al,0x3f3ea7c63574af60l,0x0cfcdc8402de7f42l, 24258 0x62d0792fb31aa152l }, 24259 0 }, 24260 /* 65 << 184 */ 24261 { { 0x0f4bcefd9da373e4l,0x7278f44d119271a3l,0xb2dff94449e111c0l, 24262 0xb0a3abf8e5d2b2d4l }, 24263 { 0x01baabb48ea80631l,0x27517ed3da305f85l,0x0a1ca6fc3f56aa86l, 24264 0x183d9c7694c22839l }, 24265 0 }, 24266 /* 71 << 184 */ 24267 { { 0xe9a0dfbf22e238d7l,0x8690dfd97e8d8d31l,0xb3cb2a0d4006c59cl, 24268 0xe4d297caa1850d74l }, 24269 { 0x066f10517842d14cl,0x68dd32737d43602bl,0x1f9f5cf931345f39l, 24270 0x44f18c2b10593890l }, 24271 0 }, 24272 /* 77 << 184 */ 24273 { { 0x8d8c0233a7c3f60bl,0xfb59fe2d2bcbbd4cl,0xfa311680dc3e5b44l, 24274 0xb3cba9f3fbea5eedl }, 24275 { 0xcb353b2f61e0e690l,0x06edf0c1b6e0efe0l,0xa29578cb1d0c02a2l, 24276 0xaeb2d677937fec07l }, 24277 0 }, 24278 /* 83 << 184 */ 24279 { { 0xa19a81c5cdd0cac9l,0x5c10b942ec9cf85bl,0x0843ef4639e8c298l, 24280 0xcfd45d0e6c043258l }, 24281 { 0x1011bcb9fb7e4b58l,0xae6362a544402bbdl,0x9ecc8c68ec15d751l, 24282 0xbc05998869d1a00bl }, 24283 0 }, 24284 /* 89 << 184 */ 24285 { { 0xe9a43619460147e3l,0x881a6af423067448l,0x94f93ae6cee17a6bl, 24286 0x469e692f10782558l }, 24287 { 0x01e244a1289bdb32l,0x240645779dddf970l,0x664cbd92d8f521ecl, 24288 0xadaf8ffb600222d0l }, 24289 0 }, 24290 /* 95 << 184 */ 24291 { { 0x68314c740dbec437l,0x2095e1295ec75e2cl,0x8e88a3ddf0e6c606l, 24292 0x40ac647d1230f6b2l }, 24293 { 0x09d124aaa2e6b991l,0xa22f9e2bcc81037cl,0xc842b64d15c3a1c2l, 24294 0x4d822becce808c65l }, 24295 0 }, 24296 /* 101 << 184 */ 24297 { { 0xb02204d06ffb396bl,0x82eb6ecc881bead6l,0xf58432cebd6896c8l, 24298 0xc243468da38f4b9dl }, 24299 { 0x8486402df8e628bdl,0x5dd338a1a4df2401l,0x748a41ab0daac953l, 24300 0xaa121d13e51e6235l }, 24301 0 }, 24302 /* 107 << 184 */ 24303 { { 0x6daa0a4e50abc6aal,0x99fcc5bdeafb7cf2l,0xc705f64c4b8dbd2al, 24304 0x7deff836e7b51e90l }, 24305 { 0xd92f42b859a8180fl,0x3bb298f8618d24acl,0x2433aa7357a56438l, 24306 0xcf29895b48a6a238l }, 24307 0 }, 24308 /* 113 << 184 */ 24309 { { 0x74079dc59ed25aafl,0x7988245c023d5143l,0x7edfc6a6feb79c24l, 24310 0x7ed03c50a6baa70fl }, 24311 { 0x71d3413596a753b4l,0x59efbafcef976246l,0xed050260a4a6947fl, 24312 0xabbc1f8066254247l }, 24313 0 }, 24314 /* 116 << 184 */ 24315 { { 0x1f804e00caa4646fl,0x8643dc8870944924l,0xa37f1ca273f86de9l, 24316 0xa3199f9228889898l }, 24317 { 0xc273ba580c1e4adfl,0x0f0d38af65bc82f0l,0xd8b28ab5f8a6cd3bl, 24318 0xeea6e08575894d8el }, 24319 0 }, 24320 /* 119 << 184 */ 24321 { { 0x398f39132c1620f7l,0x9046d2dea921f3a3l,0x40a25a2785b50bb0l, 24322 0xb9adeca0d32e95f3l }, 24323 { 0xa4199b1bdede5cbfl,0x9068aee084f5410bl,0x6665e4f5730f0397l, 24324 0x2e9ba18c8ae20659l }, 24325 0 }, 24326 /* 125 << 184 */ 24327 { { 0xd76e9b2351835897l,0x72a0e000012deda6l,0x5bf08922bfec23e4l, 24328 0x8c2fcf1385cf2b7bl }, 24329 { 0x6c42f935c63332c6l,0x8736c58395eccce9l,0x2d2abbb10721afc8l, 24330 0x1f7a76cc42d4e029l }, 24331 0 }, 24332 }, 24333 { 24334 /* 0 << 192 */ 24335 { { 0x00, 0x00, 0x00, 0x00 }, 24336 { 0x00, 0x00, 0x00, 0x00 }, 24337 1 }, 24338 /* 1 << 192 */ 24339 { { 0x56f8410ef4f8b16al,0x97241afec47b266al,0x0a406b8e6d9c87c1l, 24340 0x803f3e02cd42ab1bl }, 24341 { 0x7f0309a804dbec69l,0xa83b85f73bbad05fl,0xc6097273ad8e197fl, 24342 0xc097440e5067adc1l }, 24343 0 }, 24344 /* 3 << 192 */ 24345 { { 0x266344a43794f8dcl,0xdcca923a483c5c36l,0x2d6b6bbf3f9d10a0l, 24346 0xb320c5ca81d9bdf3l }, 24347 { 0x620e28ff47b50a95l,0x933e3b01cef03371l,0xf081bf8599100153l, 24348 0x183be9a0c3a8c8d6l }, 24349 0 }, 24350 /* 4 << 192 */ 24351 { { 0xb6c185c341dca566l,0x7de7fedad8622aa3l,0x99e84d92901b6dfbl, 24352 0x30a02b0e7c4ad288l }, 24353 { 0xc7c81daa2fd3cf36l,0xd1319547df89e59fl,0xb2be8184cd496733l, 24354 0xd5f449eb93d3412bl }, 24355 0 }, 24356 /* 5 << 192 */ 24357 { { 0x25470fabe085116bl,0x04a4337587285310l,0x4e39187ee2bfd52fl, 24358 0x36166b447d9ebc74l }, 24359 { 0x92ad433cfd4b322cl,0x726aa817ba79ab51l,0xf96eacd8c1db15ebl, 24360 0xfaf71e910476be63l }, 24361 0 }, 24362 /* 7 << 192 */ 24363 { { 0x72cfd2e949dee168l,0x1ae052233e2af239l,0x009e75be1d94066al, 24364 0x6cca31c738abf413l }, 24365 { 0xb50bd61d9bc49908l,0x4a9b4a8cf5e2bc1el,0xeb6cc5f7946f83acl, 24366 0x27da93fcebffab28l }, 24367 0 }, 24368 /* 9 << 192 */ 24369 { { 0x3ce519ef76257c51l,0x6f5818d318d477e7l,0xab022e037963edc0l, 24370 0xf0403a898bd1f5f3l }, 24371 { 0xe43b8da0496033cal,0x0994e10ea1cfdd72l,0xb1ec6d20ba73c0e2l, 24372 0x0329c9ecb6bcfad1l }, 24373 0 }, 24374 /* 10 << 192 */ 24375 { { 0xf1ff42a12c84bd9dl,0x751f3ec4390c674al,0x27bb36f701e5e0cal, 24376 0x65dfff515caf6692l }, 24377 { 0x5df579c4cd7bbd3fl,0xef8fb29785591205l,0x1ded7203e47ac732l, 24378 0xa93dc45ccd1c331al }, 24379 0 }, 24380 /* 11 << 192 */ 24381 { { 0xbdec338e3318d2d4l,0x733dd7bbbe8de963l,0x61bcc3baa2c47ebdl, 24382 0xa821ad1935efcbdel }, 24383 { 0x91ac668c024cdd5cl,0x7ba558e4c1cdfa49l,0x491d4ce0908fb4dal, 24384 0x7ba869f9f685bde8l }, 24385 0 }, 24386 /* 13 << 192 */ 24387 { { 0xed1b5ec279f464bal,0x2d65e42c47d72e26l,0x8198e5749e67f926l, 24388 0x4106673834747e44l }, 24389 { 0x4637acc1e37e5447l,0x02cbc9ecf3e15822l,0x58a8e98e805aa83cl, 24390 0x73facd6e5595e800l }, 24391 0 }, 24392 /* 15 << 192 */ 24393 { { 0x468ff80338330507l,0x06f34ddf4037a53el,0x70cd1a408d6993a4l, 24394 0xf85a159743e5c022l }, 24395 { 0x396fc9c2c125a67dl,0x03b7bebf1064bfcbl,0x7c444592a9806dcbl, 24396 0x1b02614b4487cd54l }, 24397 0 }, 24398 /* 16 << 192 */ 24399 { { 0x8303604f692ac542l,0xf079ffe1227b91d3l,0x19f63e6315aaf9bdl, 24400 0xf99ee565f1f344fbl }, 24401 { 0x8a1d661fd6219199l,0x8c883bc6d48ce41cl,0x1065118f3c74d904l, 24402 0x713889ee0faf8b1bl }, 24403 0 }, 24404 /* 17 << 192 */ 24405 { { 0xb47b60f70de21bb6l,0x64acae4fdcd836cal,0x3375ea6dc744ce63l, 24406 0xb764265fb047955bl }, 24407 { 0xc68a5d4c9841c2c3l,0x60e98fd7cf454f60l,0xc701fbe2756aea0cl, 24408 0x09c8885eaab21c79l }, 24409 0 }, 24410 /* 19 << 192 */ 24411 { { 0x45bb810869d2d46cl,0xe47c8b3968c8365al,0xf3b87663267551bdl, 24412 0x1590768f5b67547al }, 24413 { 0x371c1db2fb2ed3ffl,0xe316691917a59440l,0x03c0d178df242c14l, 24414 0x40c93fceed862ac1l }, 24415 0 }, 24416 /* 21 << 192 */ 24417 { { 0x1286da692bc982d6l,0x5f6d80f27bdae7e3l,0x3d9c5647a6f064fbl, 24418 0xfdc8e6a1d74c1540l }, 24419 { 0x97da48c6d68b135al,0xc2097979d66dbfffl,0x0296adb9ea20531dl, 24420 0xa333730d4ab2c8f0l }, 24421 0 }, 24422 /* 23 << 192 */ 24423 { { 0x0eb3565429847fedl,0xfdc142860a673dd0l,0x721b36278b62dd0bl, 24424 0x105a293e711a5771l }, 24425 { 0xdf001cce7f761927l,0xf7b681b011d04c7dl,0x16dff792a3ac1996l, 24426 0x580c120b0fc4ae30l }, 24427 0 }, 24428 /* 25 << 192 */ 24429 { { 0x31ea3d4f7ee8d0bcl,0x3832f22a0f42c3dcl,0xc661061a1a87a2f4l, 24430 0x0978c9f64b45576bl }, 24431 { 0xb7abac3c6dfb5fd2l,0x27f36a00b7e01b90l,0x68f733cde9429e36l, 24432 0x953a4681dcbfe8cbl }, 24433 0 }, 24434 /* 27 << 192 */ 24435 { { 0xbfb7c41067fe1eafl,0xa2073c6a6929a785l,0x6f2536f4a75fdb79l, 24436 0x859ad26d809bca69l }, 24437 { 0x06f2c0693b197e7bl,0x656ad9f48ec0a573l,0xe7c7901f9a4d0262l, 24438 0xbec29443b938602bl }, 24439 0 }, 24440 /* 28 << 192 */ 24441 { { 0xd00397fc0f0073a4l,0x5b668fa46f8d675fl,0x14374ac91522108cl, 24442 0x92efa7d10283e42el }, 24443 { 0x673e6df90b6d024al,0x05f914d457581f26l,0xf5c8516267df8c12l, 24444 0x1197f1b4e06c2462l }, 24445 0 }, 24446 /* 29 << 192 */ 24447 { { 0x6e2d1cb3dd9c90c1l,0x28f82d5a7990579el,0x90e189cd06226195l, 24448 0xbd2939df19b0dc74l }, 24449 { 0x18b18505c0917177l,0xeed5470d3117d9c4l,0x39ef92eb6c893ca0l, 24450 0x4533ef8244a41940l }, 24451 0 }, 24452 /* 31 << 192 */ 24453 { { 0xcaee9dec34943ddal,0x8e50e98e8b4b6782l,0x24358ea591ea3a1fl, 24454 0x71c4c827a9e1c194l }, 24455 { 0xa38baa5d09bb7a94l,0xfb4ab4c057b58f9cl,0x4a01065e24e0ee19l, 24456 0xb9cf805107b877bfl }, 24457 0 }, 24458 /* 33 << 192 */ 24459 { { 0xd38c1ce0a2980d5el,0x8b84cca4541face7l,0x93298136dbd8d05dl, 24460 0x582708d03f85c85al }, 24461 { 0x6545eec7282960e4l,0x92e184aebaadec07l,0x05452564fd27a20fl, 24462 0x79d4668abddce6ebl }, 24463 0 }, 24464 /* 34 << 192 */ 24465 { { 0xf5cc5cccf5191707l,0xe800328bd5d01f67l,0x0572012ebd9b1599l, 24466 0xf5be11a6863d0125l }, 24467 { 0x4da7ca876ea441e0l,0x47dbf83b321b134al,0x5cbadcdac1acfb4al, 24468 0x19ac798a734f8e25l }, 24469 0 }, 24470 /* 35 << 192 */ 24471 { { 0xe312623a7002114fl,0xb888b637e047686bl,0x23b2c270cbac91bdl, 24472 0xb50b31884dbfe02dl }, 24473 { 0x8335ce43de97eef6l,0x6a4e65502bac193al,0xf2b35aac3101f720l, 24474 0x5b2c88d5379a2015l }, 24475 0 }, 24476 /* 36 << 192 */ 24477 { { 0xf445e77131547128l,0x22761665e27811cal,0x9b944e91a37c6681l, 24478 0xc0aa06a536899860l }, 24479 { 0x8c2b5816cfcd557el,0xf2734a19945aa357l,0x536ca07ca55a0049l, 24480 0x8328fdccc636d967l }, 24481 0 }, 24482 /* 37 << 192 */ 24483 { { 0x52b513616aca06bdl,0x8d19b893cdf16560l,0x06b28179c3b438cdl, 24484 0xde1ef747cd1819e4l }, 24485 { 0xbc6cc43b5f557985l,0xa277e11f61e0142al,0x58890f1e429cc392l, 24486 0x28d17dbfe5fc8f5el }, 24487 0 }, 24488 /* 39 << 192 */ 24489 { { 0x556df61a29a8f7cbl,0x5cf554dfd14ab27al,0x243f933ba755b886l, 24490 0xa4d0b06ff2d4ce87l }, 24491 { 0xa745eb8d2c0f1d39l,0xc228747aea3047a5l,0xced774c41d2cecc0l, 24492 0x54a55c3a774fb01al }, 24493 0 }, 24494 /* 40 << 192 */ 24495 { { 0xa691398a4a9eb3f0l,0x56c1dbff3b99a48fl,0x9a87e1b91b4b5b32l, 24496 0xad6396145378b5fel }, 24497 { 0x437a243ec26b5302l,0x0275878c3ccb4c10l,0x0e81e4a21de07015l, 24498 0x0c6265c9850df3c0l }, 24499 0 }, 24500 /* 41 << 192 */ 24501 { { 0x182c3f0e6be95db0l,0x8c5ab38cae065c62l,0xcce8294ebe23abacl, 24502 0xed5b65c47d0add6dl }, 24503 { 0xbce57d78cc9494cal,0x76f75c717f435877l,0xb3084b2eb06560a9l, 24504 0x67216bc850b55981l }, 24505 0 }, 24506 /* 43 << 192 */ 24507 { { 0x49c9fd92557de68bl,0x357aa44fc3151b7al,0xd36286d11e4aebd0l, 24508 0x84562cd736a51203l }, 24509 { 0x42a57e7c3cacc002l,0x794a47751b1e25a3l,0x2c2ab68cac0d4356l, 24510 0xececb6addb31afdcl }, 24511 0 }, 24512 /* 44 << 192 */ 24513 { { 0x47a5f010b4c21bfel,0x45c5610f0ac3dc20l,0x20e689fcea3bf4dcl, 24514 0xf244ea49fb5f46e4l }, 24515 { 0xd918e59e8ca38e45l,0x7d6c601d96189a6fl,0x1a40f03854138471l, 24516 0xfe867d7308a9d034l }, 24517 0 }, 24518 /* 45 << 192 */ 24519 { { 0x3b49e489100c0410l,0x8831d3992adc2b29l,0xb6726cd1247a8116l, 24520 0x83a71a59d1d56d8el }, 24521 { 0x82ade2fe5cd333e9l,0x3b087ef83ea11f1al,0x17b96ca66ce879cel, 24522 0xc2f74a971871dc43l }, 24523 0 }, 24524 /* 46 << 192 */ 24525 { { 0xa11a1e3680b576cel,0xf91278bbce2683e8l,0xc3bab95fbae8bc5bl, 24526 0x642ca26397351715l }, 24527 { 0x5ffc14726fecbbc1l,0x2465e996a23f36d4l,0x06fc53bf5187d428l, 24528 0x54b4014351fbce91l }, 24529 0 }, 24530 /* 47 << 192 */ 24531 { { 0x081ca6f0eafc7b2cl,0x1ba047a38c48703fl,0xe84865046663accfl, 24532 0xde1f97568d43689cl }, 24533 { 0xf5373e1d5bc19f75l,0x4e48c493d64b0a54l,0x0c43f4e25807dbf6l, 24534 0x73bef15167778c36l }, 24535 0 }, 24536 /* 48 << 192 */ 24537 { { 0xca6c0937b1b76ba6l,0x1a2eab854d2026dcl,0xb1715e1519d9ae0al, 24538 0xf1ad9199bac4a026l }, 24539 { 0x35b3dfb807ea7b0el,0xedf5496f3ed9eb89l,0x8932e5ff2d6d08abl, 24540 0xf314874e25bd2731l }, 24541 0 }, 24542 /* 49 << 192 */ 24543 { { 0x9d5322e89e9bba53l,0xdd7c9ceb989ff350l,0xd76147eadab0d7b3l, 24544 0x8e45b1c6d7a9a9a1l }, 24545 { 0x8f896a91d4f10c10l,0x999a73c54068de06l,0x84a9d0839cf0a779l, 24546 0x4d7cc7689f608ab2l }, 24547 0 }, 24548 /* 51 << 192 */ 24549 { { 0x1833ccddaee93c82l,0x6a05ef7b9f35f20fl,0xc538dac9ae413bc2l, 24550 0x1e74f4658b4784bdl }, 24551 { 0xccb2bc4a49ffd544l,0x9b88183d2b17ae88l,0x96037a136e43824fl, 24552 0xbbb61441480bf3dfl }, 24553 0 }, 24554 /* 52 << 192 */ 24555 { { 0x13319d20e090ad42l,0x4ff3186e12cbb719l,0xf38e504913fc0a46l, 24556 0x83185a1254e60378l }, 24557 { 0x08c4057797ea8935l,0x7b2212a946b614f9l,0xedcdfa520634cfb3l, 24558 0xdbc60eed9e7d5726l }, 24559 0 }, 24560 /* 53 << 192 */ 24561 { { 0x9b0785c6c7e1070fl,0xec112f53cbf561e5l,0xc93511e37fab3464l, 24562 0x9e6dc4da9de8e0c2l }, 24563 { 0x7733c425e206b4eel,0xb8b254ef50cedf29l,0xfaee4bbbd50ad285l, 24564 0x216e76d58c4eb6cfl }, 24565 0 }, 24566 /* 55 << 192 */ 24567 { { 0x9d6a28641d51f254l,0x26c5062a0c2822c3l,0xd74ebba8334bf4eel, 24568 0x6e5446eb0b8f7305l }, 24569 { 0x5988ae8eb629beccl,0x71e576d0a1de7d1dl,0x15e39592a8873970l, 24570 0x2b1f9a9342ecc74el }, 24571 0 }, 24572 /* 57 << 192 */ 24573 { { 0xcbdb70727c519bf9l,0x112986bbcaaf48e6l,0x64d4c6d1a13baf3cl, 24574 0x85ccf6f7a065e77el }, 24575 { 0x183be337749beaedl,0xb3703096cba6c9b1l,0x1edf81f0e42b8afel, 24576 0xf04ed594ccb73ad7l }, 24577 0 }, 24578 /* 59 << 192 */ 24579 { { 0xfa954ebc38491e9fl,0xf75a5808d32f0b03l,0x196d4a828083b9d3l, 24580 0x92d5a0be5e8dc9fel }, 24581 { 0x4a507ae9aea628bal,0xeea5861e11a02fb5l,0xa033b84fd23ec8f7l, 24582 0x1a68c36ec60f11d5l }, 24583 0 }, 24584 /* 60 << 192 */ 24585 { { 0x3dfb55bdab920ef2l,0xe0090971e6244484l,0xdc39fd08f7c6e1a3l, 24586 0x1ca765356ee79e72l }, 24587 { 0x472c8985287d590cl,0x67635e35ad6daeb4l,0x06ec4e7980f9fee3l, 24588 0x0aceb39921dc5fdbl }, 24589 0 }, 24590 /* 61 << 192 */ 24591 { { 0xdb2478fd9410a756l,0xd106aefe3a53a1e6l,0x1f4c940d14286333l, 24592 0x6a98659d04950958l }, 24593 { 0x3232a1c6a6bbe060l,0x19ad132ca5e7ca9bl,0x3c9c13ef800fae29l, 24594 0x9b0d9068b8660f49l }, 24595 0 }, 24596 /* 63 << 192 */ 24597 { { 0x1e7f043795c53027l,0x5221e5c0da9a3806l,0xf297d8e379d9385fl, 24598 0x4d69e95f78ba697el }, 24599 { 0xdda936cee76d13c1l,0xd9a5790a485b12f5l,0xeab84add51efbfd0l, 24600 0xc9a3ee9ca9f44aa4l }, 24601 0 }, 24602 /* 64 << 192 */ 24603 { { 0xefb26a753f73f449l,0x1d1c94f88d44fc79l,0x49f0fbc53bc0dc4dl, 24604 0xb747ea0b3698a0d0l }, 24605 { 0x5218c3fe228d291el,0x35b804b543c129d6l,0xfac859b8d1acc516l, 24606 0x6c10697d95d6e668l }, 24607 0 }, 24608 /* 65 << 192 */ 24609 { { 0x8c12e87a15454db4l,0xbc1fc546908e8fbcl,0xc35d83c7e4cf1636l, 24610 0xcb2f5ac820641524l }, 24611 { 0x2400aae2e644ecd0l,0x9b01e2d14be37119l,0x6cffd52831b54857l, 24612 0xb3fd5d864b5cbf81l }, 24613 0 }, 24614 /* 71 << 192 */ 24615 { { 0x2e999a4739709fb9l,0x4cb4bbdb62c2b30fl,0x4c7259ac09de0c92l, 24616 0x73c1e34f8c59a0ffl }, 24617 { 0x0a9e5f2e48cb0a12l,0x5e07449fcf499bb0l,0x0527a8b4b02c4a54l, 24618 0x7381287159da01e4l }, 24619 0 }, 24620 /* 77 << 192 */ 24621 { { 0xe0b876ca0548ff87l,0x74b5a9b25e03bae3l,0xd5564cc5dd0642d2l, 24622 0x29ed211b668c4977l }, 24623 { 0xf29d3b7aa7422b11l,0x17f2d3586d29b8bal,0x2e35cdda2bb887del, 24624 0x650f148078e4444bl }, 24625 0 }, 24626 /* 83 << 192 */ 24627 { { 0x8c75532fb47435ebl,0x2234e2c5a113f905l,0x27b75fea31508ae9l, 24628 0x09733e40d489ad0bl }, 24629 { 0x73b38464a1b06da1l,0x0aed522dc5b7ccf2l,0xcc04783e78d7e5afl, 24630 0xa81c8a8ff23eaab7l }, 24631 0 }, 24632 /* 89 << 192 */ 24633 { { 0x6bb5eca73c149ffal,0x4593d851c536487al,0x3675daaad85eb9edl, 24634 0xbf65d0f9b8a58ffbl }, 24635 { 0x1dc6ddddc22e83eel,0xb673397ee10d3c17l,0x6bdc20600ca62c93l, 24636 0x260389c30b821f6dl }, 24637 0 }, 24638 /* 95 << 192 */ 24639 { { 0x45f5cf07b417be10l,0x0acb1a44e5d561d8l,0x54b7baeafb1dfbe9l, 24640 0x0e6e66219044672el }, 24641 { 0xa9b6db6d9a793601l,0xd70eadb8a4a0ba4al,0xaedace846098b89el, 24642 0x970f2c23ac39d40fl }, 24643 0 }, 24644 /* 101 << 192 */ 24645 { { 0x9dff8d289c7eaaa8l,0x38bcd076db0cc361l,0x25760147cdea9db8l, 24646 0x44c89dd40163f343l }, 24647 { 0x18815d7544db8365l,0xa186d57b37f3e4b3l,0xa71de7806e84a7fal, 24648 0xf1c08989e56646b3l }, 24649 0 }, 24650 /* 107 << 192 */ 24651 { { 0xad73e1448fb56a43l,0x078c14fb715543c9l,0xa57770fd64b92d54l, 24652 0xf0420a9277e9b919l }, 24653 { 0xc660d0cb588ccc1dl,0x069baa1471415c2el,0x747438dc32982740l, 24654 0x4782ce08767381eel }, 24655 0 }, 24656 /* 113 << 192 */ 24657 { { 0xc2a1ee5fdb3b6b5dl,0x08ce544820e1339fl,0x3cb954b77073955fl, 24658 0xb9ed2ee7f32d0832l }, 24659 { 0xc0a998b1b4aac98el,0x4912273dbca4bac7l,0xac0f5014c3f92c4al, 24660 0xbf3dc27f9e916e78l }, 24661 0 }, 24662 /* 116 << 192 */ 24663 { { 0x222c7bae28833944l,0xbb78a867f5e3cf67l,0x590cbd96faf6cfd6l, 24664 0x1c50aecb3b0d842el }, 24665 { 0x8f2c5df1dbade9a5l,0x60923fb7e3840cecl,0xe8f2db6b03a67512l, 24666 0x90af187be0d7c628l }, 24667 0 }, 24668 /* 119 << 192 */ 24669 { { 0xb4162b615fee3ccbl,0xe9786e7d7327e651l,0x6c85bd938812d9c1l, 24670 0xfe4905083dc9e838l }, 24671 { 0xe66f25178a6765dfl,0x72fd294edeee184cl,0x07608bd27b6ec227l, 24672 0x9df7b664dfdaa5e6l }, 24673 0 }, 24674 /* 125 << 192 */ 24675 { { 0x4aea16602d53a155l,0x7285069a32ab07fdl,0xf6f3000d8b6fcd19l, 24676 0x010b1f246e98953fl }, 24677 { 0xe180bc559f9aa221l,0x7717ee383cba4534l,0x5997f3aa36cbda06l, 24678 0x54c6090064a04b05l }, 24679 0 }, 24680 }, 24681 { 24682 /* 0 << 200 */ 24683 { { 0x00, 0x00, 0x00, 0x00 }, 24684 { 0x00, 0x00, 0x00, 0x00 }, 24685 1 }, 24686 /* 1 << 200 */ 24687 { { 0x25914f7881fdad90l,0xcf638f560d2cf6abl,0xb90bc03fcc054de5l, 24688 0x932811a718b06350l }, 24689 { 0x2f00b3309bbd11ffl,0x76108a6fb4044974l,0x801bb9e0a851d266l, 24690 0x0dd099bebf8990c1l }, 24691 0 }, 24692 /* 3 << 200 */ 24693 { { 0xebd6a6777b0ac93dl,0xa6e37b0d78f5e0d7l,0x2516c09676f5492bl, 24694 0x1e4bf8889ac05f3al }, 24695 { 0xcdb42ce04df0ba2bl,0x935d5cfd5062341bl,0x8a30333382acac20l, 24696 0x429438c45198b00el }, 24697 0 }, 24698 /* 4 << 200 */ 24699 { { 0xfb2838be67e573e0l,0x05891db94084c44bl,0x9131137396c1c2c5l, 24700 0x6aebfa3fd958444bl }, 24701 { 0xac9cdce9e56e55c1l,0x7148ced32caa46d0l,0x2e10c7efb61fe8ebl, 24702 0x9fd835daff97cf4dl }, 24703 0 }, 24704 /* 5 << 200 */ 24705 { { 0x6c626f56c1770616l,0x5351909e09da9a2dl,0xe58e6825a3730e45l, 24706 0x9d8c8bc003ef0a79l }, 24707 { 0x543f78b6056becfdl,0x33f13253a090b36dl,0x82ad4997794432f9l, 24708 0x1386493c4721f502l }, 24709 0 }, 24710 /* 7 << 200 */ 24711 { { 0xe566f400b008733al,0xcba0697d512e1f57l,0x9537c2b240509cd0l, 24712 0x5f989c6957353d8cl }, 24713 { 0x7dbec9724c3c2b2fl,0x90e02fa8ff031fa8l,0xf4d15c53cfd5d11fl, 24714 0xb3404fae48314dfcl }, 24715 0 }, 24716 /* 9 << 200 */ 24717 { { 0xf02cc3a9f327a07fl,0xefb27a9b4490937dl,0x81451e96b1b3afa5l, 24718 0x67e24de891883be4l }, 24719 { 0x1ad65d4770869e54l,0xd36291a464a3856al,0x070a1abf7132e880l, 24720 0x9511d0a30e28dfdfl }, 24721 0 }, 24722 /* 10 << 200 */ 24723 { { 0xfdeed650f8d1cac4l,0xeb99194b6d16bda5l,0xb53b19f71cabbe46l, 24724 0x5f45af5039b9276cl }, 24725 { 0xd0784c6126ee9d77l,0xf7a1558b0c02ca5dl,0xb61d6c59f032e720l, 24726 0xae3ffb95470cf3f7l }, 24727 0 }, 24728 /* 11 << 200 */ 24729 { { 0x9b185facc72a4be5l,0xf66de2364d848089l,0xba14d07c717afea9l, 24730 0x25bfbfc02d551c1cl }, 24731 { 0x2cef0ecd4cdf3d88l,0x8cee2aa3647f73c4l,0xc10a7d3d722d67f7l, 24732 0x090037a294564a21l }, 24733 0 }, 24734 /* 13 << 200 */ 24735 { { 0x6ac07bb84f3815c4l,0xddb9f6241aa9017el,0x31e30228ca85720al, 24736 0xe59d63f57cb75838l }, 24737 { 0x69e18e777baad2d0l,0x2cfdb784d42f5d73l,0x025dd53df5774983l, 24738 0x2f80e7cee042cd52l }, 24739 0 }, 24740 /* 15 << 200 */ 24741 { { 0x43f18d7f4d6ee4abl,0xd3ac8cde9570c3dcl,0x527e49070b8c9b2al, 24742 0x716709a7c5a4c0f1l }, 24743 { 0x930852b0916a26b1l,0x3cc17fcf4e071177l,0x34f5e3d459694868l, 24744 0xee0341aba28f655dl }, 24745 0 }, 24746 /* 16 << 200 */ 24747 { { 0xf431f462060b5f61l,0xa56f46b47bd057c2l,0x348dca6c47e1bf65l, 24748 0x9a38783e41bcf1ffl }, 24749 { 0x7a5d33a9da710718l,0x5a7799872e0aeaf6l,0xca87314d2d29d187l, 24750 0xfa0edc3ec687d733l }, 24751 0 }, 24752 /* 17 << 200 */ 24753 { { 0x4b764317aa365220l,0x7a24affe68cc0355l,0x76732ed0ceb3df5el, 24754 0x2ce1332aae096ed0l }, 24755 { 0x89ce70a7b8adac9dl,0xfdddcf05b3fc85c8l,0xbd7b29c6f2ee8bfel, 24756 0xa1effcb9457d50f3l }, 24757 0 }, 24758 /* 19 << 200 */ 24759 { { 0x6053972dac953207l,0xc2ca9a8408ad12f6l,0x9ed6cd386ba36190l, 24760 0xa5b50a48539d18a4l }, 24761 { 0xd9491347dbf18c2al,0x2cdce4662e9697cfl,0x4e97db5ca9e31819l, 24762 0x0fb02e2d4c044b74l }, 24763 0 }, 24764 /* 21 << 200 */ 24765 { { 0x66a4dd414aa5e9ddl,0x6ec7576e64f6aeb9l,0x3f08ce06c7e980b5l, 24766 0x52fe9fd6c1a2aa7el }, 24767 { 0xfe46e6d95074326al,0xd570ed734c126c1dl,0x86c7ec257217d55al, 24768 0x3cb434057c3de2b2l }, 24769 0 }, 24770 /* 23 << 200 */ 24771 { { 0x48e0295dcc9e79bfl,0x2419485693eb403dl,0x9386fb7709dd8194l, 24772 0xb6e89bb101a242f6l }, 24773 { 0xc7994f3924d308d7l,0xf0fbc392de673d88l,0x43eed52ea11abb62l, 24774 0xc900f9d0c83e7fbel }, 24775 0 }, 24776 /* 25 << 200 */ 24777 { { 0x214a10dca8152891l,0xe6787b4c64f1abb2l,0x276333d9fa1a10edl, 24778 0xc0e1c88e47dbccbcl }, 24779 { 0x8a3c37c4849dd12el,0x2144a8c8d86e109fl,0xbb6891f7286c140cl, 24780 0xb0b8c5e29cce5e6fl }, 24781 0 }, 24782 /* 27 << 200 */ 24783 { { 0x3f9e0e3499753288l,0x6b26f1ebe559d93al,0x647fe21d9841faf1l, 24784 0x48a4b6efa786ea02l }, 24785 { 0x6e09cd22665a882dl,0x95390d81b63ccda6l,0x5b014db4b026a44al, 24786 0x5b96efb22ad30ff1l }, 24787 0 }, 24788 /* 28 << 200 */ 24789 { { 0x64c50c8b4a3b99e9l,0x2489a675d0a26f4fl,0xe2aacaeed85bc6fdl, 24790 0x556882038a6019bal }, 24791 { 0x7ceb9da645cfac07l,0xe1ad3d25652dbd09l,0x086adf348d3b5d2bl, 24792 0xf9256d8aec3654a0l }, 24793 0 }, 24794 /* 29 << 200 */ 24795 { { 0x571c246bf009a690l,0x8fe54231ccd90d3al,0x8adde6adfe173b79l, 24796 0x75d9a392b05a5e3bl }, 24797 { 0x607f47b0d1bb3a84l,0xe4e3b472058e691al,0xfc0f793bf3d956e3l, 24798 0x6a6730b605de54dal }, 24799 0 }, 24800 /* 31 << 200 */ 24801 { { 0x4daf7f540d80aaa1l,0xc571d04c229c4574l,0x469e2da5fffca53dl, 24802 0x9fffe29513ff7f59l }, 24803 { 0x2075da5a33a254f7l,0x769f33acd35e575dl,0x7b940d2c3d35001al, 24804 0x2d606b57e34c95b7l }, 24805 0 }, 24806 /* 33 << 200 */ 24807 { { 0xc7e4f8b899365f86l,0x8f6f959faae69527l,0x749ffedffdfaeeeal, 24808 0x2b91f0221b54c2a0l }, 24809 { 0xe75c2352addbdf83l,0xe7329922fff2694cl,0xbb65ae06badadeacl, 24810 0x16cbb9d1f56be3b5l }, 24811 0 }, 24812 /* 34 << 200 */ 24813 { { 0xb100a4c67a07bd70l,0x222fee7634787efel,0xa4dafc14f1e79d1bl, 24814 0x0d3a82dad18b8be4l }, 24815 { 0xe0181445fc06922fl,0x0873d99b714a90b6l,0xdf43082fa5087a0el, 24816 0x195e49367399e0dbl }, 24817 0 }, 24818 /* 35 << 200 */ 24819 { { 0x7e83545aae6fcc9cl,0x1a24fce819e15ce2l,0x4a3465c536d8c6a8l, 24820 0xd1e5f24109436ae0l }, 24821 { 0xed334bfc6be463d5l,0xc46a600b934fbdcfl,0xbd2fd65b920321ffl, 24822 0x953fa91767fa154el }, 24823 0 }, 24824 /* 36 << 200 */ 24825 { { 0x5dca4995f93ddad1l,0x061efcabf72470c2l,0xad78d54d5e7e0741l, 24826 0xa91f4e839c4e0ab4l }, 24827 { 0xdd4403af5c75aa0dl,0x4308c8ee13c69113l,0x3a3b66f51ebc36adl, 24828 0xc07cc3f0f4bf777al }, 24829 0 }, 24830 /* 37 << 200 */ 24831 { { 0x3fd1963e37a86b32l,0x22e236d60bd0880el,0xb87467cf89f0fa5cl, 24832 0x85b9c6c0310e0265l }, 24833 { 0x82979a96783459ael,0xd19b0919bd529ed3l,0xa21f771808434f94l, 24834 0x3dd130a9195369c6l }, 24835 0 }, 24836 /* 39 << 200 */ 24837 { { 0xc61e62767915d157l,0xc48244279e07fb0el,0x8980c1cc8420ea49l, 24838 0x10d82e4a588d4e2bl }, 24839 { 0xdddecd52b17eff2dl,0xe44c7b2ded8492a4l,0x96ca89ebb9bea6afl, 24840 0x724166fe1b03ed03l }, 24841 0 }, 24842 /* 40 << 200 */ 24843 { { 0xfc87975f8fb54738l,0x3516078827c3ead3l,0x834116d2b74a085al, 24844 0x53c99a73a62fe996l }, 24845 { 0x87585be05b81c51bl,0x925bafa8be0852b7l,0x76a4fafda84d19a7l, 24846 0x39a45982585206d4l }, 24847 0 }, 24848 /* 41 << 200 */ 24849 { { 0x8bbc484ed551f3e1l,0x6e058a90b7eb06d2l,0xfaccd9a0e5cd281al, 24850 0xe7661b78d5b44900l }, 24851 { 0x03afe115725fde22l,0xbe929230c7229fd1l,0x5cd0d16a0000035el, 24852 0x1f6a9df0c8f5a910l }, 24853 0 }, 24854 /* 43 << 200 */ 24855 { { 0xe54bbcfd535dfc82l,0x89be0b89a9012196l,0xa67831ee71011beal, 24856 0x2ea7a8292db43878l }, 24857 { 0xff7c144378ffe871l,0xa67dc3d4c63f65eal,0xbbfc7fc2a1527419l, 24858 0x6440380bf6c36b8fl }, 24859 0 }, 24860 /* 44 << 200 */ 24861 { { 0x71ab9f69d812d7e6l,0x2847c5516e142126l,0x9e27755bb31e7753l, 24862 0xb89533e2943b8c7fl }, 24863 { 0xbe7f0c6e14fa7dc6l,0x782a06388cee1f7al,0x7069292938e13a6bl, 24864 0x1e1221f0c63f4d28l }, 24865 0 }, 24866 /* 45 << 200 */ 24867 { { 0x9030aa9a63a431f4l,0x0fa7b5d45039a318l,0x6a0cf40af083687dl, 24868 0x46689cec659fa752l }, 24869 { 0x8259727a456fa97el,0x4f618a355b08d7fcl,0x2c44217b72028d15l, 24870 0x8083b09935111e32l }, 24871 0 }, 24872 /* 46 << 200 */ 24873 { { 0xaa5976523b5b29f1l,0xb07f10ab37432a54l,0x16e3e2236e36556fl, 24874 0xf1c7c9bd47cd4586l }, 24875 { 0xa4eef99d3f87216dl,0x4e54d3c52e1eaa79l,0x534c5901d2540d91l, 24876 0x718df7c9b6f0fcfcl }, 24877 0 }, 24878 /* 47 << 200 */ 24879 { { 0x99497f8a2eb0ee3bl,0x87e550c1caeb3a20l,0xd23e053dfb91627cl, 24880 0xb971c043873124e6l }, 24881 { 0x3581ab853b16e467l,0x24541c926145187bl,0x4423ec5c010c2527l, 24882 0x775f13029fa82a68l }, 24883 0 }, 24884 /* 48 << 200 */ 24885 { { 0x499b6ab65eb03c0el,0xf19b795472bc3fdel,0xa86b5b9c6e3a80d2l, 24886 0xe43775086d42819fl }, 24887 { 0xc1663650bb3ee8a3l,0x75eb14fcb132075fl,0xa8ccc9067ad834f6l, 24888 0xea6a2474e6e92ffdl }, 24889 0 }, 24890 /* 49 << 200 */ 24891 { { 0xbaebdd8a0c40aec4l,0x5eccafb563e8cfd0l,0x1c204c0eb5159938l, 24892 0x607109d34b996aa9l }, 24893 { 0x024c6c4b9cef59fel,0xbc846e216ed4b6f1l,0xf6a50ff3ff652c0al, 24894 0x368af2c72d95220cl }, 24895 0 }, 24896 /* 51 << 200 */ 24897 { { 0xec9c2e35cbd3ccafl,0xb9eeff3ddcda8f30l,0x82012e191062d02el, 24898 0xed964cc94efc6b6el }, 24899 { 0x8853ea0a6bf54c22l,0xea40fcc0f3cbe264l,0x21f9c01ddecf114el, 24900 0x05e754c63da71e59l }, 24901 0 }, 24902 /* 52 << 200 */ 24903 { { 0xe6a26d38046dfc72l,0x70409579c2175175l,0x2a575ac5d44e0c1dl, 24904 0xb35395e01479ab5al }, 24905 { 0x1550a5d4f7bfbd8el,0x01daeb680778807bl,0xe0aa940321294dbal, 24906 0x84bcdc8c5b5a93b7l }, 24907 0 }, 24908 /* 53 << 200 */ 24909 { { 0x876cc4d2520f04abl,0x6e320f5da85ff6a8l,0x7c504720ce17bc80l, 24910 0xe7907079a62089f9l }, 24911 { 0xa45c4ac7bca45feel,0xd8f3facd5bd54b0cl,0xc0b036277b3e4a24l, 24912 0xaabe96dfe4cd4b57l }, 24913 0 }, 24914 /* 55 << 200 */ 24915 { { 0xdc85a54773862ce4l,0x169051a3cc6f5d85l,0x8e3d3be0355f4df7l, 24916 0xa139d6fac72bac76l }, 24917 { 0xddc95d0dfeb0a6f0l,0xd53f70e545cd6955l,0x18eede5e47e54112l, 24918 0x4a135dc9cbc6a52el }, 24919 0 }, 24920 /* 57 << 200 */ 24921 { { 0x705a08ba90a58fb4l,0x10eef880fb3f8a64l,0x4ced9ba2f8e585ffl, 24922 0xb4f0f955fc6ebef5l }, 24923 { 0x152c1a338d8b739el,0xb2be701db495bee5l,0xd27141a8d3540a74l, 24924 0x20c8a00247f9e9d7l }, 24925 0 }, 24926 /* 59 << 200 */ 24927 { { 0x6d5ae921f5adcb3fl,0xaed1047003a3b610l,0x7c75e36f22256df9l, 24928 0xe664b36fb97dae99l }, 24929 { 0x138b5eca91e746ael,0xb3e01ef5648674a7l,0xa3f256da9e375c74l, 24930 0xa00e82bc6a82d6f3l }, 24931 0 }, 24932 /* 60 << 200 */ 24933 { { 0xe7a01eae6e28b4a8l,0xb3bf8224782166c9l,0x0b7ba2a06a244510l, 24934 0x9751a69c2abbb4dbl }, 24935 { 0xb611adc1b3f9fcbcl,0x1d08eb3b436c4675l,0x1c71e98a20f96a64l, 24936 0x33d9b58c7ffd3f08l }, 24937 0 }, 24938 /* 61 << 200 */ 24939 { { 0x7c7b03c1affa2d6cl,0x5f189bb9aec6e624l,0xe77a1eedadeff5e7l, 24940 0xfc58b90f4280b467l }, 24941 { 0x561e5d579b71cb4el,0x8ed767aa36d6a17el,0x38d8671e8aa9e188l, 24942 0x7bc68f07a95350c0l }, 24943 0 }, 24944 /* 63 << 200 */ 24945 { { 0xe0cd38cf98c01384l,0xc6741123a4226d9fl,0xdd1d42dbf877a0b8l, 24946 0xc5986ef0110b3cbal }, 24947 { 0xeba949f809c8cebel,0x96b47bc4bd39f1dcl,0xbad140b6e07a2a3cl, 24948 0x2a8d80999ac5ca8al }, 24949 0 }, 24950 /* 64 << 200 */ 24951 { { 0x39d934abd3c095f1l,0x04b261bee4b76d71l,0x1d2e6970e73e6984l, 24952 0x879fb23b5e5fcb11l }, 24953 { 0x11506c72dfd75490l,0x3a97d08561bcf1c1l,0x43201d82bf5e7007l, 24954 0x7f0ac52f798232a7l }, 24955 0 }, 24956 /* 65 << 200 */ 24957 { { 0x8cf27618590ca850l,0x58134f6f44bb94f2l,0x0a147562b78b4eecl, 24958 0x2e5986e39f1ed647l }, 24959 { 0x9becf893348393b0l,0xaea21b92c31c2a86l,0x3d69859e5ff1b9a6l, 24960 0x6fcd19f4cd805691l }, 24961 0 }, 24962 /* 71 << 200 */ 24963 { { 0x81619bd4841f43c3l,0x3a3325538e5c61f0l,0x2b68921eda862151l, 24964 0x97f5c8a741a491f8l }, 24965 { 0x8b452094d3b9afa0l,0x93b2b7b4f2124dbcl,0x53285e7d26e0e26dl, 24966 0x3f003fc5c8a24edel }, 24967 0 }, 24968 /* 77 << 200 */ 24969 { { 0x4cdabb586c025824l,0x5935ad1586bfcd7dl,0x8ce2c3101b7c5533l, 24970 0x761c9fe96cae8808l }, 24971 { 0x8a0723f5d9e66d70l,0xb640b323dcced11dl,0x5768528051ae548cl, 24972 0x83576f75d53f3f2cl }, 24973 0 }, 24974 /* 83 << 200 */ 24975 { { 0xc715edc47b532ec3l,0x159765e6c4a6e14bl,0x4a74f15228cd2d45l, 24976 0xbfd309edae8c753bl }, 24977 { 0xf56bb5315d6d5245l,0x2c89c21833b30a55l,0xe436141acd4ed5fal, 24978 0x7eb7a5c707868ee6l }, 24979 0 }, 24980 /* 89 << 200 */ 24981 { { 0x9a3ad3ffb0c7c48cl,0x25e8d977738e3638l,0xbb6c6c9d1c024074l, 24982 0xeda1ac0f8cfdf416l }, 24983 { 0x93059ba538de49e2l,0xdb199cfc1b9ce741l,0x49b05e9446f3b494l, 24984 0x717cafc606480902l }, 24985 0 }, 24986 /* 95 << 200 */ 24987 { { 0x8d27421052885708l,0x9d2297fd74e5b9b5l,0xe7cb6a68dc4d7318l, 24988 0x0b60b0d276357b31l }, 24989 { 0x57301994532c2095l,0xfbae2ba203373452l,0xe8020b20ba700583l, 24990 0x1ca7772c2988919cl }, 24991 0 }, 24992 /* 101 << 200 */ 24993 { { 0x723296eb918f3eecl,0x358c9ff0b79901c6l,0x64a1934c8d5e814cl, 24994 0x7e5a9afced165177l }, 24995 { 0xd783840168733e7al,0xfcf3c0b6f61ede6dl,0x94ec0bf08434e804l, 24996 0xa5a70153c192c1cdl }, 24997 0 }, 24998 /* 107 << 200 */ 24999 { { 0x03cdf976c23e49d4l,0x51e5cfa5a2ae72d5l,0x7716faa3100f7a51l, 25000 0xc53153a2c14dc015l }, 25001 { 0xe7c69b052b47ec18l,0xff4756907ea93b01l,0x55fde3c540a2f205l, 25002 0x0263d0b12f85aed6l }, 25003 0 }, 25004 /* 113 << 200 */ 25005 { { 0x668c56619686fe30l,0x382a8ccd8f73a476l,0xda012cbfb40a85e7l, 25006 0x55ea1e72e9e88b91l }, 25007 { 0x8312556088cc5afcl,0x44ae54cbc45b19c7l,0xc91fffa8f86a02cdl, 25008 0xc79f573752d7e89bl }, 25009 0 }, 25010 /* 116 << 200 */ 25011 { { 0x652b50523e357579l,0x08ce7d3a2afe5746l,0x9dc1cca6f71a12efl, 25012 0x80a221c24f6c4196l }, 25013 { 0xdde40eff0f49f508l,0x7995bb46913b0dc3l,0x4adbdeb385e44f6el, 25014 0x6816bb3ab222e4bbl }, 25015 0 }, 25016 /* 119 << 200 */ 25017 { { 0xce1ee518579a1a4dl,0x5d86e8912bc3870al,0x230878d18da907c4l, 25018 0xc648392777ae7ea8l }, 25019 { 0x64319653016c0ad7l,0x7cbfa0b0b71f20dal,0xbf087dc3395ed4d8l, 25020 0x59512add307d218dl }, 25021 0 }, 25022 /* 125 << 200 */ 25023 { { 0x7378a969d8ae335el,0x11c69965506d3a42l,0x212539769949468al, 25024 0x570cf87e64995050l }, 25025 { 0xf300ad2e30b94e22l,0xbc159cf8f36dad32l,0xdff3b3767ca8aa6al, 25026 0xa5de93b5627fb9e7l }, 25027 0 }, 25028 }, 25029 { 25030 /* 0 << 208 */ 25031 { { 0x00, 0x00, 0x00, 0x00 }, 25032 { 0x00, 0x00, 0x00, 0x00 }, 25033 1 }, 25034 /* 1 << 208 */ 25035 { { 0x75d9bc15adf7cccfl,0x81a3e5d6dfa1e1b0l,0x8c39e444249bc17el, 25036 0xf37dccb28ea7fd43l }, 25037 { 0xda654873907fba12l,0x35daa6da4a372904l,0x0564cfc66283a6c5l, 25038 0xd09fa4f64a9395bfl }, 25039 0 }, 25040 /* 3 << 208 */ 25041 { { 0xc51aa29e5cfe5c48l,0x82c020ae815ee096l,0x7848ad827549a68al, 25042 0x7933d48960471355l }, 25043 { 0x04998d2e67c51e57l,0x0f64020ad9944afcl,0x7a299fe1a7fadac6l, 25044 0x40c73ff45aefe92cl }, 25045 0 }, 25046 /* 4 << 208 */ 25047 { { 0xe5f649be9d8e68fdl,0xdb0f05331b044320l,0xf6fde9b3e0c33398l, 25048 0x92f4209b66c8cfael }, 25049 { 0xe9d1afcc1a739d4bl,0x09aea75fa28ab8del,0x14375fb5eac6f1d0l, 25050 0x6420b560708f7aa5l }, 25051 0 }, 25052 /* 5 << 208 */ 25053 { { 0xbf44ffc75488771al,0xcb76e3f17f2f2191l,0x4197bde394f86a42l, 25054 0x45c25bb970641d9al }, 25055 { 0xd8a29e31f88ce6dcl,0xbe2becfd4bb7ac7dl,0x13094214b5670cc7l, 25056 0xe90a8fd560af8433l }, 25057 0 }, 25058 /* 7 << 208 */ 25059 { { 0x0ecf9b8b4ebd3f02l,0xa47acd9d86b770eal,0x93b84a6a2da213cel, 25060 0xd760871b53e7c8cfl }, 25061 { 0x7a5f58e536e530d7l,0x7abc52a51912ad51l,0x7ad43db02ea0252al, 25062 0x498b00ecc176b742l }, 25063 0 }, 25064 /* 9 << 208 */ 25065 { { 0x9ff713ef888ae17fl,0x6007f68fb34b7bebl,0x5d2b18983b653d64l, 25066 0xcbf73e91d3ca4b1bl }, 25067 { 0x4b050ad56cdfb3a1l,0x41bd3ec3d1f833a4l,0x78d7e2ee719d7bf5l, 25068 0xea4604672a27412el }, 25069 0 }, 25070 /* 10 << 208 */ 25071 { { 0x7dad6d1b42cd7900l,0xb6e6b439e058f8a4l,0x8836f1e662aa3bbcl, 25072 0xd45bf2c811142b0al }, 25073 { 0xae324bac3c045ed1l,0x372be24d270a8333l,0xeeda7a3a6b7c73b6l, 25074 0xf6675402db49562al }, 25075 0 }, 25076 /* 11 << 208 */ 25077 { { 0xc312ba68441e760dl,0x84d0d061a50e512el,0xfe764f4e4bbdd849l, 25078 0xa924adcf9dadd5c0l }, 25079 { 0x08685961debfe976l,0xd3d846c529fba601l,0x43bf8227dc3f4040l, 25080 0x05e767b8a49e9ff5l }, 25081 0 }, 25082 /* 13 << 208 */ 25083 { { 0xc4689c309953e453l,0x5e355a2e1712dca5l,0x1ff83c81f1cd96f7l, 25084 0xb06b89fb44cf56dbl }, 25085 { 0x1827705365f16e0dl,0x6403b91de5618672l,0xba3f9475be384bc6l, 25086 0x7f691cbe303ce5f3l }, 25087 0 }, 25088 /* 15 << 208 */ 25089 { { 0x4589ba03210f4045l,0xd5e7366301e8012al,0x1c26052d74462ffal, 25090 0xe78f600c4f989519l }, 25091 { 0xc63ca0c97cee0b2fl,0xbe588573af760b5fl,0x05906fc4593773cdl, 25092 0xd5970fb0e322d5afl }, 25093 0 }, 25094 /* 16 << 208 */ 25095 { { 0x103c46e60ebcf726l,0x4482b8316231470el,0x6f6dfaca487c2109l, 25096 0x2e0ace9762e666efl }, 25097 { 0x3246a9d31f8d1f42l,0x1b1e83f1574944d2l,0x13dfa63aa57f334bl, 25098 0x0cf8daed9f025d81l }, 25099 0 }, 25100 /* 17 << 208 */ 25101 { { 0xf67c098aae0690aal,0x1a4656422b7bc62bl,0xaffc6b917220dea2l, 25102 0xd97ac543d2552deel }, 25103 { 0x1f84514a7e816b8el,0xe9887e81a8f38552l,0x2e6358e6847ad46bl, 25104 0x1f67871e6bc9895el }, 25105 0 }, 25106 /* 19 << 208 */ 25107 { { 0x2462b6e0d47f43fal,0x71db3610d8a245e5l,0x0c26b0e734208974l, 25108 0x0cd6d49d2029bd2el }, 25109 { 0xf207c9f6091922b8l,0x0c476c5c7f0fbf66l,0x6de7efb2295d6da8l, 25110 0xea054ee10ced6cfel }, 25111 0 }, 25112 /* 21 << 208 */ 25113 { { 0xd21496e3e9bd795cl,0xf293f617c6a557del,0x9d041b7239a45642l, 25114 0xe8353dab4ac87f80l }, 25115 { 0x21e9f35620d8d019l,0x1f4adca9d2fb2668l,0xe5f68227dfecd64al, 25116 0x10d71b79d7f09ec0l }, 25117 0 }, 25118 /* 23 << 208 */ 25119 { { 0xca3f068999f87118l,0x99a933911b2417f0l,0xa383481a3d1f70e5l, 25120 0x7a31a6c833b14414l }, 25121 { 0x9d60f4368b2a9931l,0xd4c97ded80588534l,0x7cb29e82ab6a8bdal, 25122 0x3799bdad97b4c45al }, 25123 0 }, 25124 /* 25 << 208 */ 25125 { { 0x51da0ff629011af3l,0xcbb03c809a4f0855l,0xea3536725555b10bl, 25126 0x4bf94e025c7da97el }, 25127 { 0x384352f5ff713300l,0xb2c2b675192d41e6l,0x4ff66861625ca046l, 25128 0xf0f5e472013dddc4l }, 25129 0 }, 25130 /* 27 << 208 */ 25131 { { 0x38c44cdc59987914l,0xad7f2829757fb853l,0x9aabf1c8688e3342l, 25132 0xbe0f1e4ef534c850l }, 25133 { 0x732cac652ec24ecal,0x9328b657933bb5e4l,0xe2747ff60bb31033l, 25134 0xdbaab72cfcdc36acl }, 25135 0 }, 25136 /* 28 << 208 */ 25137 { { 0x0e5e3049a639fc6bl,0xe75c35d986003625l,0x0cf35bd85dcc1646l, 25138 0x8bcaced26c26273al }, 25139 { 0xe22ecf1db5536742l,0x013dd8971a9e068bl,0x17f411cb8a7909c5l, 25140 0x5757ac98861dd506l }, 25141 0 }, 25142 /* 29 << 208 */ 25143 { { 0xaf410d5aac66a3e8l,0x39fcbffb2031f658l,0xd29e58c947ce11fbl, 25144 0x7f0b874965f73e49l }, 25145 { 0xedc30f4b27fea6c6l,0xe03b9103d2baa340l,0xa7bb3f17ae680612l, 25146 0xe06656a8197af6f0l }, 25147 0 }, 25148 /* 31 << 208 */ 25149 { { 0x84562095bff86165l,0x994194e916bc7589l,0xb1320c7ec14c6710l, 25150 0x508a8d7f766e978fl }, 25151 { 0xd04adc9ec7e1f6fel,0x7bafaff68398cecfl,0x906df2fccef3b934l, 25152 0xc65afe18f3008c38l }, 25153 0 }, 25154 /* 33 << 208 */ 25155 { { 0x477ffeeeab983130l,0x5426363a96e83d55l,0xcf0370a15204af42l, 25156 0x99834414b5a6ea8fl }, 25157 { 0xf475ba711ab4ee8al,0x8486da5d0102d8f2l,0x55082e713839c821l, 25158 0xa57e58395b65defal }, 25159 0 }, 25160 /* 34 << 208 */ 25161 { { 0x34b2185bbbb33a76l,0x189038b7d48158c2l,0xfa32eb90e9e90217l, 25162 0x79271771730e74dfl }, 25163 { 0x315ed8c2a5d01ffdl,0x9799dae723e6a95el,0x40070aa016f5715al, 25164 0x40e6c0ca5ea51f8cl }, 25165 0 }, 25166 /* 35 << 208 */ 25167 { { 0x099c0570d8132163l,0xcd5508a3023dbbf3l,0x18162ff526bfe6a6l, 25168 0xf39e071144bbb455l }, 25169 { 0x49664996eaa3cf96l,0x1c6442d5e2649be9l,0x6199f740c01d269dl, 25170 0x4be605ee37542c11l }, 25171 0 }, 25172 /* 36 << 208 */ 25173 { { 0xc7313e9cf36658f0l,0xc433ef1c71f8057el,0x853262461b6a835al, 25174 0xc8f053987c86394cl }, 25175 { 0xff398cdfe983c4a1l,0xbf5e816203b7b931l,0x93193c46b7b9045bl, 25176 0x1e4ebf5da4a6e46bl }, 25177 0 }, 25178 /* 37 << 208 */ 25179 { { 0xd032fbfd0dbf82b4l,0x707181f668e58969l,0xef434381e7be2d5el, 25180 0x290669176f2c64ddl }, 25181 { 0xf66cffc3772769abl,0x68d8a76a17aad01cl,0xdd3991c590f6e078l, 25182 0xdb74db06ea4ac7dcl }, 25183 0 }, 25184 /* 39 << 208 */ 25185 { { 0x9f34a7c11c78be71l,0x7bf2f2d149ca6987l,0xb528a514dcd34afcl, 25186 0x4dddb3f1183a68b1l }, 25187 { 0x54d2626660b83883l,0x9073e4e0e0cd8dadl,0xbd2b837d9eb818b2l, 25188 0x5fa5f9086ae2e32dl }, 25189 0 }, 25190 /* 40 << 208 */ 25191 { { 0xf9942a6043a24fe7l,0x29c1191effb3492bl,0x9f662449902fde05l, 25192 0xc792a7ac6713c32dl }, 25193 { 0x2fd88ad8b737982cl,0x7e3a0319a21e60e3l,0x09b0de447383591al, 25194 0x6df141ee8310a456l }, 25195 0 }, 25196 /* 41 << 208 */ 25197 { { 0xcd02ba1e0df98a64l,0x301b6bfa03f5676el,0x41e1a8d4a2fe4090l, 25198 0x489c1cbf47f0e1dcl }, 25199 { 0x4171a98c20760847l,0xdcb21cee77af4796l,0x5fb0f0c9d0b7e981l, 25200 0x4c2791dff33b9f8dl }, 25201 0 }, 25202 /* 43 << 208 */ 25203 { { 0x95d7ec0c50420a50l,0x5794665c2a6756d5l,0x73558c6e9101e7f5l, 25204 0xa3fa0f8c1642af0el }, 25205 { 0xa11b309b4ee43551l,0x3939de30cb8fc712l,0x9710f2320fde8921l, 25206 0x2a4db2d5cae8b41cl }, 25207 0 }, 25208 /* 44 << 208 */ 25209 { { 0xaec1a039e6d6f471l,0x14b2ba0f1198d12el,0xebc1a1603aeee5acl, 25210 0x401f4836e0b964cel }, 25211 { 0x2ee437964fd03f66l,0x3fdb4e49dd8f3f12l,0x6ef267f629380f18l, 25212 0x3e8e96708da64d16l }, 25213 0 }, 25214 /* 45 << 208 */ 25215 { { 0xdf6cdac0bc4c78adl,0xbe9e32182e97376el,0xa37f9d8b1a139274l, 25216 0x7640c3982807128el }, 25217 { 0xe9735166c05b5f85l,0xbccd3675100e5716l,0x51376a293e5c9682l, 25218 0x95efe088848f6aeal }, 25219 0 }, 25220 /* 46 << 208 */ 25221 { { 0xfac2d7dd23d14105l,0xdda17149a9136f52l,0xb9f3a9c672d1a99bl, 25222 0x2fcf532a142c3b20l }, 25223 { 0xc2731f1e61190c1bl,0x26dbe810a76509e4l,0xc96cc431908bb92fl, 25224 0x5661a84d80e3e694l }, 25225 0 }, 25226 /* 47 << 208 */ 25227 { { 0x5194d144150ba121l,0x8de57c48b6b11561l,0x803228da96c156d9l, 25228 0x2112e4250a8f6376l }, 25229 { 0x15436294643449ffl,0xfc3880add4118cd0l,0x16ed90731e3f7413l, 25230 0xa400699901d38d6dl }, 25231 0 }, 25232 /* 48 << 208 */ 25233 { { 0xbc19180c207674f1l,0x112e09a733ae8fdbl,0x996675546aaeb71el, 25234 0x79432af1e101b1c7l }, 25235 { 0xd5eb558fde2ddec6l,0x81392d1f5357753fl,0xa7a76b973ae1158al, 25236 0x416fbbff4a899991l }, 25237 0 }, 25238 /* 49 << 208 */ 25239 { { 0xf84c9147c52d7384l,0x86391accec01efa6l,0xffd68616f9c6f3f4l, 25240 0xc7536461b17c2de6l }, 25241 { 0xa81f4ba10121abdfl,0xa068a2e26f6eae27l,0xe0ee90350eb159f0l, 25242 0x4c48f761fd8c4b9cl }, 25243 0 }, 25244 /* 51 << 208 */ 25245 { { 0x4b6d71e87790000cl,0xced195744ce9293el,0xc25626a3747585e8l, 25246 0xb8307d22d7044270l }, 25247 { 0xf08e7ef6117c24cbl,0xae6403162f660d04l,0xbc3ffdcff224a2fdl, 25248 0x1ebc0328d0586c7el }, 25249 0 }, 25250 /* 52 << 208 */ 25251 { { 0x9e65fdfd0d4a9dcfl,0x7bc29e48944ddf12l,0xbc1a92d93c856866l, 25252 0x273c69056e98dfe2l }, 25253 { 0x69fce418cdfaa6b8l,0x606bd8235061c69fl,0x42d495a06af75e27l, 25254 0x8ed3d5056d873a1fl }, 25255 0 }, 25256 /* 53 << 208 */ 25257 { { 0x46b160e5a6022278l,0x86b1d50cc30a51fcl,0xe898ac0e684b81b7l, 25258 0x04d591e277b93597l }, 25259 { 0xd20cac347626e18al,0xb49c941f0a968733l,0x054e6e7e21631627l, 25260 0xd6d33db9d4c716b1l }, 25261 0 }, 25262 /* 55 << 208 */ 25263 { { 0xaa79ab4bf91e9b75l,0x7df3235bd34d961dl,0x9f3954e6534a40e1l, 25264 0x80f88d2c790b4456l }, 25265 { 0x98f7711b21e9fb2al,0x0a04c318877d27e6l,0x499b7c2412338848l, 25266 0x0b1dbe9ccd5e7ec3l }, 25267 0 }, 25268 /* 57 << 208 */ 25269 { { 0xb430ff44e04715ffl,0x671358d565d076d0l,0x3946d38f22c3aa06l, 25270 0x80919ea363b2d627l }, 25271 { 0x14ffa219e8790922l,0xfe1d895ae8d89c48l,0x717e9e51748e806el, 25272 0xb91e1ddf550d711dl }, 25273 0 }, 25274 /* 59 << 208 */ 25275 { { 0x8aac26225f540127l,0x57cd5d7cba25f742l,0x87006a6b1df7a0fcl, 25276 0x88e9ab863ecbf26cl }, 25277 { 0xe1b8155f9143b314l,0xc00196130b679bddl,0x819e7b61a1871d07l, 25278 0xc36e7892cc2c9cc9l }, 25279 0 }, 25280 /* 60 << 208 */ 25281 { { 0x4b03c55b8e33787fl,0xef42f975a6384673l,0xff7304f75051b9f0l, 25282 0x18aca1dc741c87c2l }, 25283 { 0x56f120a72d4bfe80l,0xfd823b3d053e732cl,0x11bccfe47537ca16l, 25284 0xdf6c9c741b5a996bl }, 25285 0 }, 25286 /* 61 << 208 */ 25287 { { 0x65729b05301ee370l,0x3ed09a2a24c2824cl,0x781ef66a33481977l, 25288 0xf2ccdeec193506d0l }, 25289 { 0x92b4f70d703422d6l,0x7f004a43f80a1b99l,0x47db23607a856445l, 25290 0x783a8dd1ce5b0622l }, 25291 0 }, 25292 /* 63 << 208 */ 25293 { { 0x7febefd34e9aac5al,0x601c89e2bdd6173el,0x79b08930c257431el, 25294 0x915d601d399ee099l }, 25295 { 0xfa48347eca02acd2l,0xc33249baeeb7ccedl,0xd76e408755704722l, 25296 0xd3709c600dcf4878l }, 25297 0 }, 25298 /* 64 << 208 */ 25299 { { 0xee7332c7904fc3fal,0x14a23f45c7e3636al,0xc38659c3f091d9aal, 25300 0x4a995e5db12d8540l }, 25301 { 0x20a53becf3a5598al,0x56534b17b1eaa995l,0x9ed3dca4bf04e03cl, 25302 0x716c563ad8d56268l }, 25303 0 }, 25304 /* 65 << 208 */ 25305 { { 0x963353201580f3adl,0x6c495304b0cd50d4l,0xd035cdc7555ff981l, 25306 0xe65cd063c6b6bdfbl }, 25307 { 0x7deb3cbb437e749cl,0xa9de9f3db5dc24a1l,0xe2e76a2b35c29ffal, 25308 0x4d35e261323ba650l }, 25309 0 }, 25310 /* 71 << 208 */ 25311 { { 0x52c46fc8c89e2766l,0x7330b02bb945e5f2l,0xc77ef75c2673ebbcl, 25312 0x1740e72657c33783l }, 25313 { 0xf0312d29623565fbl,0xff9f707af0ca1ed9l,0xb98609ca5ea51a4al, 25314 0xde86b9a87b5cc91fl }, 25315 0 }, 25316 /* 77 << 208 */ 25317 { { 0x0dece4badca158b7l,0x5e39baf6a3e9f837l,0xcf14e6dc4d57b640l, 25318 0x0548aaa4b67bcbe7l }, 25319 { 0xb6cf5b393c90e434l,0xf8b3c5645006f3abl,0xa74e92859bf04bd9l, 25320 0xf59a3a6bf99c8977l }, 25321 0 }, 25322 /* 83 << 208 */ 25323 { { 0x652ca66ac5b072d5l,0x2102b55993ad4928l,0x1b5f192d88210f9bl, 25324 0xb18710144c6ad7e5l }, 25325 { 0x3979fde3bc0abf13l,0xb5cb4c7dac3fd631l,0x4aedffa6c200ec7bl, 25326 0x8aed81ceaddf3610l }, 25327 0 }, 25328 /* 89 << 208 */ 25329 { { 0x72b48105abeefbael,0x0e9e6e41827bb22bl,0xf45ada151e52a848l, 25330 0xb8e94579534867a2l }, 25331 { 0x3a08773b7adb0fdcl,0xe7133a28b83316dfl,0xc8b7b08c5bb41470l, 25332 0x28719eb4aaf140c7l }, 25333 0 }, 25334 /* 95 << 208 */ 25335 { { 0x398996cd430007cel,0x20d8c0e07642d616l,0x81566639a7eb2397l, 25336 0x74aa0b692e133732l }, 25337 { 0x326745907ba80aa7l,0x56a491c39bd69d64l,0xc8c8b040e54dcce0l, 25338 0x3f991872d571d037l }, 25339 0 }, 25340 /* 101 << 208 */ 25341 { { 0x70e681fa4fb595c9l,0xf0635d6386b4d97bl,0xfc029284c1347081l, 25342 0x5a4e9cbe4fee0303l }, 25343 { 0xd43da8609c31094fl,0x0412cfed6515b4aal,0x10fc06da8d53be86l, 25344 0x4b7b380b4bccc94dl }, 25345 0 }, 25346 /* 107 << 208 */ 25347 { { 0x560d57408e7d6738l,0xa82268a8937f12a2l,0x87787b2d3d95b463l, 25348 0xb36539b2030e23bfl }, 25349 { 0x60d16b8fd61e761dl,0x96ba2949fe8efccdl,0x8c170eda667fa7ebl, 25350 0xc880d74cf800d7c3l }, 25351 0 }, 25352 /* 113 << 208 */ 25353 { { 0x7c05d6c1efcbfea0l,0xae7ba3291a2f6dd8l,0x521598ed5bd42ecfl, 25354 0x58e07842ef0ab40cl }, 25355 { 0xae65105f66c752a5l,0x4910fba45f99d499l,0xbfdaf5fce9e44357l, 25356 0x6aaf4053796ee5b6l }, 25357 0 }, 25358 /* 116 << 208 */ 25359 { { 0xf58fecb16f640f62l,0xe274b92b39f51946l,0x7f4dfc046288af44l, 25360 0x0a91f32aeac329e5l }, 25361 { 0x43ad274bd6aaba31l,0x719a16400f6884f9l,0x685d29f6daf91e20l, 25362 0x5ec1cc3327e49d52l }, 25363 0 }, 25364 /* 119 << 208 */ 25365 { { 0x615ac02527ba93edl,0x0d43915d3556ef47l,0x8c739fd1cb0cda89l, 25366 0xa2318169625f7a16l }, 25367 { 0x17d486113e0479cel,0x814beb6038ee541el,0x09c9807fb98ef355l, 25368 0x4ad3668752d07af6l }, 25369 0 }, 25370 /* 125 << 208 */ 25371 { { 0x5c1f42e444f3f568l,0xd743b7c078fb409bl,0xe09edccb6224362cl, 25372 0x7f13d140c5fe872cl }, 25373 { 0x85e8cb88f403c0ebl,0x918a231b688d20a0l,0xc65b7ab9f246c73fl, 25374 0xda743fbf76dbd6adl }, 25375 0 }, 25376 }, 25377 { 25378 /* 0 << 216 */ 25379 { { 0x00, 0x00, 0x00, 0x00 }, 25380 { 0x00, 0x00, 0x00, 0x00 }, 25381 1 }, 25382 /* 1 << 216 */ 25383 { { 0xa0158eeae457a477l,0xd19857dbee6ddc05l,0xb326522418c41671l, 25384 0x3ffdfc7e3c2c0d58l }, 25385 { 0x3a3a525426ee7cdal,0x341b0869df02c3a8l,0xa023bf42723bbfc8l, 25386 0x3d15002a14452691l }, 25387 0 }, 25388 /* 3 << 216 */ 25389 { { 0xf3cae7e9262a3539l,0x78a49d1d6670d59el,0x37de0f63c1c5e1b9l, 25390 0x3072c30c69cb7c1cl }, 25391 { 0x1d278a5277c850e6l,0x84f15f8f1f6a3de6l,0x46a8bb45592ca7adl, 25392 0x1912e3eee4d424b8l }, 25393 0 }, 25394 /* 4 << 216 */ 25395 { { 0x6ba7a92079e5fb67l,0xe1331feb70aa725el,0x5080ccf57df5d837l, 25396 0xe4cae01d7ff72e21l }, 25397 { 0xd9243ee60412a77dl,0x06ff7cacdf449025l,0xbe75f7cd23ef5a31l, 25398 0xbc9578220ddef7a8l }, 25399 0 }, 25400 /* 5 << 216 */ 25401 { { 0xdc988086365e668bl,0xada8dcdaaabda5fbl,0xbc146b4c255f1fbel, 25402 0x9cfcde29cf34cfc3l }, 25403 { 0xacbb453e7e85d1e4l,0x9ca09679f92358b5l,0x15fc2d96240823ffl, 25404 0x8d65adf70c11d11el }, 25405 0 }, 25406 /* 7 << 216 */ 25407 { { 0x775557f10296f4fdl,0x1dca76a3ea51b436l,0xf3e98f60fb950805l, 25408 0x31ff32ea831cf7f1l }, 25409 { 0x643e7bf18d2c714bl,0x64b5c3392e9d2acal,0xa9fd9ccc6adc2d23l, 25410 0xfc2397eccc721b9bl }, 25411 0 }, 25412 /* 9 << 216 */ 25413 { { 0xf031182db48ec57dl,0x515d32f804b233b9l,0x06bbb1d4093aad26l, 25414 0x88a142fe0d83d1ecl }, 25415 { 0x3b95c099245c73f8l,0xb126d4af52edcd32l,0xf8022c1e8fcb52e6l, 25416 0x5a51ac4c0106d339l }, 25417 0 }, 25418 /* 10 << 216 */ 25419 { { 0xc589e1ce44ace150l,0xe0f8d3d94381e97cl,0x59e99b1162c5a4b8l, 25420 0x90d262f7fd0ec9f9l }, 25421 { 0xfbc854c9283e13c9l,0x2d04fde7aedc7085l,0x057d776547dcbecbl, 25422 0x8dbdf5919a76fa5fl }, 25423 0 }, 25424 /* 11 << 216 */ 25425 { { 0xb7f70a1a7c64a054l,0x0dc1c0df9db43e79l,0x6d0a4ae251fe63d6l, 25426 0xe0d5e3327f0c8abfl }, 25427 { 0xff5500362b7ecee8l,0x3ea0e6f75d055008l,0x30deb62ff24ac84fl, 25428 0x936969fd5d7116b7l }, 25429 0 }, 25430 /* 13 << 216 */ 25431 { { 0x02da76122617cf7fl,0xd6e25d4eeee35260l,0xb2fa5b0afd3533e9l, 25432 0xe76bb7b0b9126f88l }, 25433 { 0x692e6a9988856866l,0x3fdf394f49db65cal,0x2529699122d8d606l, 25434 0xe815bfbf3dd7c4cfl }, 25435 0 }, 25436 /* 15 << 216 */ 25437 { { 0x69c984ed4d844e7fl,0xd354b2174a2e8a82l,0x25bd4addfb2c4136l, 25438 0xf72df4de144b26e1l }, 25439 { 0xd0aa9db0e6101afdl,0x4445efaae49bd1b8l,0x5dc54eee331593b2l, 25440 0xfa35e3b9094bf10bl }, 25441 0 }, 25442 /* 16 << 216 */ 25443 { { 0xdb567d6ac42bd6d2l,0x6df86468bb1f96ael,0x0efe5b1a4843b28el, 25444 0x961bbb056379b240l }, 25445 { 0xb6caf5f070a6a26bl,0x70686c0d328e6e39l,0x80da06cf895fc8d3l, 25446 0x804d8810b363fdc9l }, 25447 0 }, 25448 /* 17 << 216 */ 25449 { { 0x660a0f893ea089c3l,0xa25823aac9009b09l,0xb2262d7ba681f5e5l, 25450 0x4fc30c8c3413863al }, 25451 { 0x691544b7c32059f7l,0xf65cf276b21c6134l,0xe3a96b2a5104dabal, 25452 0xbb08d109a43ee42fl }, 25453 0 }, 25454 /* 19 << 216 */ 25455 { { 0x85a52d69f9916861l,0x595469a4da4fa813l,0x1dd7786e3338502fl, 25456 0x34b8ef2853963ac5l }, 25457 { 0xc0f019f81a891b25l,0xb619970c4f4bd775l,0x8c2a5af3be19f681l, 25458 0x9463db0498ec1728l }, 25459 0 }, 25460 /* 21 << 216 */ 25461 { { 0xeb62c27801f39eabl,0x27de39340ab3a4aal,0xfbd17520a982ca8dl, 25462 0x58817ec2e4bdc6edl }, 25463 { 0x312d78de31c6ac13l,0x9483bf7609202ea6l,0xf64ab8b622c6d8e1l, 25464 0xdddf589ce580de74l }, 25465 0 }, 25466 /* 23 << 216 */ 25467 { { 0xe0fa3336ee98a92al,0x7d80eeef66a4d745l,0xb612531bba0119d3l, 25468 0x86e770c1b351fe15l }, 25469 { 0xafbad6f882d5a397l,0x1e5f1cb80dbf0110l,0x25138ac09f79063dl, 25470 0x089ed22f2746a156l }, 25471 0 }, 25472 /* 25 << 216 */ 25473 { { 0x198d1b5d7d8b8ddel,0xf32c11078dab37fbl,0xf15fcb6d42b93874l, 25474 0x91ddb74f41f94f84l }, 25475 { 0x6a64540a271524b2l,0x950a0c12758b5a64l,0xf9f237933dce9580l, 25476 0xc8edd0ab2cf8ce32l }, 25477 0 }, 25478 /* 27 << 216 */ 25479 { { 0xefc6357eae1046b7l,0xe6704929612932e4l,0xa20305d4b1355b17l, 25480 0x88a9136a58b4a156l }, 25481 { 0xbc379985b4d275ecl,0x718b91316eaf338bl,0x61229a7ad152a509l, 25482 0x1109f7c445157ae9l }, 25483 0 }, 25484 /* 28 << 216 */ 25485 { { 0xcf197ca7fb8088fal,0x014272474ddc96c5l,0xa2d2550a30777176l, 25486 0x534698984d0cf71dl }, 25487 { 0x6ce937b83a2aaac6l,0xe9f91dc35af38d9bl,0x2598ad83c8bf2899l, 25488 0x8e706ac9b5536c16l }, 25489 0 }, 25490 /* 29 << 216 */ 25491 { { 0x2bde42140df85c2cl,0x4fb839f4058a7a63l,0x7c10572a47f51231l, 25492 0x878826231989824el }, 25493 { 0xa8293d2016e1564al,0xcb11c0f818c04576l,0x83b91e7d9740c631l, 25494 0xbdcb23d0cbffcea0l }, 25495 0 }, 25496 /* 31 << 216 */ 25497 { { 0x64bdfd2a9094bfc8l,0x8558acc60fc54d1el,0x3992848faf27721el, 25498 0x7a8fcbdaa14cd009l }, 25499 { 0x6de6120900a4b9c2l,0xbd192b1b20cf8f28l,0x2356b90168d9be83l, 25500 0xce1e7a944a49a48al }, 25501 0 }, 25502 /* 33 << 216 */ 25503 { { 0x7630103b6ac189b9l,0x15d35edc6f1f5549l,0x9051799d31cb58edl, 25504 0xb4f32694a7a8579el }, 25505 { 0x6f037435f2abe306l,0xf0595696410fb2f7l,0x2a0d347a5cc98f59l, 25506 0x9c19a9a87e3bbd69l }, 25507 0 }, 25508 /* 34 << 216 */ 25509 { { 0x87f8df7c0e58d493l,0xb1ae5ed058b73f12l,0xc368f784dea0c34dl, 25510 0x9bd0a120859a91a0l }, 25511 { 0xb00d88b7cc863c68l,0x3a1cc11e3d1f4d65l,0xea38e0e70aa85593l, 25512 0x37f13e987dc4aee8l }, 25513 0 }, 25514 /* 35 << 216 */ 25515 { { 0x91dbe00e49430cd2l,0xcc67c0b17aa8ef6bl,0x769985b8a273f1a5l, 25516 0x358371dc360e5dafl }, 25517 { 0xbf9b9127d6d8b5e8l,0x748ae12cb45588c1l,0x9c609eb556076c58l, 25518 0xf287489109733e89l }, 25519 0 }, 25520 /* 36 << 216 */ 25521 { { 0x10d38667bc947badl,0x738e07ce2a36ee2el,0xc93470cdc577fcacl, 25522 0xdee1b6162782470dl }, 25523 { 0x36a25e672e793d12l,0xd6aa6caee0f186dal,0x474d0fd980e07af7l, 25524 0xf7cdc47dba8a5cd4l }, 25525 0 }, 25526 /* 37 << 216 */ 25527 { { 0xceb6aa80f8a08fddl,0xd98fc56f46fead7bl,0xe26bd3f8b07b3f1fl, 25528 0x3547e9b99d361c3el }, 25529 { 0x1a89f802e94b8eccl,0x2210a590c0a40ef2l,0xe7e5b965afc01bf2l, 25530 0xca3d57fe234b936bl }, 25531 0 }, 25532 /* 39 << 216 */ 25533 { { 0x9230a70db9f9e8cdl,0xa63cebfcb81ba2ecl,0x8482ca87a8f664d6l, 25534 0xa8ae78e00b137064l }, 25535 { 0xb787bd558384c687l,0xfde1d1bdb29ae830l,0xc4a9b2e39f0b7535l, 25536 0x7e6c9a15efde2d01l }, 25537 0 }, 25538 /* 40 << 216 */ 25539 { { 0x7d2e5c054f7269b1l,0xfcf30777e287c385l,0x10edc84ff2a46f21l, 25540 0x354417574f43fa36l }, 25541 { 0xf1327899fd703431l,0xa438d7a616dd587al,0x65c34c57e9c8352dl, 25542 0xa728edab5cc5a24el }, 25543 0 }, 25544 /* 41 << 216 */ 25545 { { 0xcd6e6db872896d4fl,0x324afa99896c4640l,0x37d18c3d33a292bdl, 25546 0x98dba3b44143421fl }, 25547 { 0x2406f3c949c61b84l,0x402d974754899588l,0xc73b7fd634a485e5l, 25548 0x75c9bae08587f0c3l }, 25549 0 }, 25550 /* 43 << 216 */ 25551 { { 0x6c32fa8cb0b4a04dl,0xeb58d0d875fda587l,0x61d8a157c4b86563l, 25552 0x92191bf01006b8afl }, 25553 { 0xd04d3eff32d3478bl,0x3cc52eab2a684fc8l,0xb19a0f1625de54ccl, 25554 0x5c5295973620db2dl }, 25555 0 }, 25556 /* 44 << 216 */ 25557 { { 0xa97b51265c3427b0l,0x6401405cd282c9bdl,0x3629f8d7222c5c45l, 25558 0xb1c02c16e8d50aedl }, 25559 { 0xbea2ed75d9635bc9l,0x226790c76e24552fl,0x3c33f2a365f1d066l, 25560 0x2a43463e6dfccc2el }, 25561 0 }, 25562 /* 45 << 216 */ 25563 { { 0x09b2e0d3b8da1e01l,0xa3a1a8fee9c0eb04l,0x59af5afe8bf653bal, 25564 0xba979f8bd0a54836l }, 25565 { 0xa0d8194b51ee6ffbl,0x451c29e2f4b0586cl,0x7eb5fddb7471ee3dl, 25566 0x84b627d4bcb3afd8l }, 25567 0 }, 25568 /* 46 << 216 */ 25569 { { 0x8cc3453adb483761l,0xe7cc608565d5672bl,0x277ed6cbde3efc87l, 25570 0x19f2f36869234eafl }, 25571 { 0x9aaf43175c0b800bl,0x1f1e7c898b6da6e2l,0x6cfb4715b94ec75el, 25572 0xd590dd5f453118c2l }, 25573 0 }, 25574 /* 47 << 216 */ 25575 { { 0xa70e9b0afb54e812l,0x092a0d7d8d86819bl,0x5421ff042e669090l, 25576 0x8af770c6b133c952l }, 25577 { 0xc8e8dd596c8b1426l,0x1c92eb0e9523b483l,0x5a7c88f2cf3d40edl, 25578 0x4cc0c04bf5dd98f8l }, 25579 0 }, 25580 /* 48 << 216 */ 25581 { { 0x14e49da11f17a34cl,0x5420ab39235a1456l,0xb76372412f50363bl, 25582 0x7b15d623c3fabb6el }, 25583 { 0xa0ef40b1e274e49cl,0x5cf5074496b1860al,0xd6583fbf66afe5a4l, 25584 0x44240510f47e3e9al }, 25585 0 }, 25586 /* 49 << 216 */ 25587 { { 0xb3939a8ffd617288l,0x3d37e5c2d68c2636l,0x4a595fac9d666c0el, 25588 0xfebcad9edb3a4978l }, 25589 { 0x6d284a49c125016fl,0x05a7b9c80ee246a2l,0xe8b351739436c6e9l, 25590 0xffb89032d4be40b7l }, 25591 0 }, 25592 /* 51 << 216 */ 25593 { { 0xba1387a5436ebf33l,0xc351a400e8d05267l,0x18645dde4259dbe8l, 25594 0x5fc32895c10fd676l }, 25595 { 0x1ef7a944807f040el,0x9486b5c625738e5fl,0xc9e56cf4a7e3e96cl, 25596 0x34c7dc87a20be832l }, 25597 0 }, 25598 /* 52 << 216 */ 25599 { { 0xe10d49996fe8393fl,0x0f809a3fe91f3a32l,0x61096d1c802f63c8l, 25600 0x289e146257750d3dl }, 25601 { 0xed06167e9889feeal,0xd5c9c0e2e0993909l,0x46fca0d856508ac6l, 25602 0x918260474f1b8e83l }, 25603 0 }, 25604 /* 53 << 216 */ 25605 { { 0x1d5f2ad7a9bf79cbl,0x228fb24fca9c2f98l,0x5f7c3883701c4b71l, 25606 0x18cf76c4ec42d686l }, 25607 { 0x3680d2e94dcdec8dl,0x6d58e87ba0d60cb6l,0x72fbf086a0e513cfl, 25608 0xb922d3c5346ed99al }, 25609 0 }, 25610 /* 55 << 216 */ 25611 { { 0x1678d658c2b9b874l,0x0e0b2c47f6360d4dl,0x01a45c02a0c9b9acl, 25612 0x05e82e9d0da69afbl }, 25613 { 0x50be4001f28b8018l,0x503d967b667d8241l,0x6cd816534981da04l, 25614 0x9b18c3117f09c35fl }, 25615 0 }, 25616 /* 57 << 216 */ 25617 { { 0xdfdfd5b409d22331l,0xf445126817f0c6a2l,0xe51d1aa8a5cde27bl, 25618 0xb61a12a37aaf9513l }, 25619 { 0xe43a241d3b3ea114l,0x5c62b624366ae28dl,0x085a530db5f237eal, 25620 0x7c4ed375651205afl }, 25621 0 }, 25622 /* 59 << 216 */ 25623 { { 0xf9de879dce842decl,0xe505320a94cedb89l,0xee55dae7f05ad888l, 25624 0x44ffbfa7f028b4efl }, 25625 { 0xa3c1b32e63b2cd31l,0x201a058910c5ab29l,0x20f930afcd4085d6l, 25626 0xda79ed169f6ff24bl }, 25627 0 }, 25628 /* 60 << 216 */ 25629 { { 0x7e8cfbcf704e23c6l,0xc71b7d2228aaa65bl,0xa041b2bd245e3c83l, 25630 0x69b98834d21854ffl }, 25631 { 0x89d227a3963bfeecl,0x99947aaade7da7cbl,0x1d9ee9dbee68a9b1l, 25632 0x0a08f003698ec368l }, 25633 0 }, 25634 /* 61 << 216 */ 25635 { { 0x04c64f33b0959be5l,0x182332ba396a7fe2l,0x4c5401e302e15b97l, 25636 0x92880f9877db104bl }, 25637 { 0x0bf0b9cc21726a33l,0x780264741acc7b6dl,0x9721f621a26f08e3l, 25638 0xe3935b434197fed1l }, 25639 0 }, 25640 /* 63 << 216 */ 25641 { { 0x0bffae503652be69l,0x395a9c6afb3fd5d8l,0x17f66adaa4fadfbfl, 25642 0x1ee92a35f9268f8cl }, 25643 { 0x40ded34d6827781al,0xcd36224e34e63dccl,0xec90cf571cd1ef7al, 25644 0xf6067d578f72a3bfl }, 25645 0 }, 25646 /* 64 << 216 */ 25647 { { 0x142b55021a93507al,0xb4cd11878d3c06cfl,0xdf70e76a91ec3f40l, 25648 0x484e81ad4e7553c2l }, 25649 { 0x830f87b5272e9d6el,0xea1c93e5c6ff514al,0x67cc2adcc4192a8el, 25650 0xc77e27e242f4535al }, 25651 0 }, 25652 /* 65 << 216 */ 25653 { { 0x537388d299e2f9d2l,0x15ead88612cd6d08l,0x33dfe3a769082d86l, 25654 0x0ef25f4266d79d40l }, 25655 { 0x8035b4e546ba5cf1l,0x4e48f53711eec591l,0x40b56cda122a7aael, 25656 0x78e270211dbb79a7l }, 25657 0 }, 25658 /* 71 << 216 */ 25659 { { 0x520b655355b4a5b1l,0xeee835cafb4f5fdel,0xb2ae86e59a823d7fl, 25660 0x24325f4fc084497fl }, 25661 { 0x542bed4e6f0eefa4l,0x2909233b141792fdl,0x74bfc3bfc847a946l, 25662 0x8ec1d009e212cb44l }, 25663 0 }, 25664 /* 77 << 216 */ 25665 { { 0xc2082b6d5cedd516l,0xaf148eadeafa3a10l,0x104cd5855ad63aa6l, 25666 0xe3fdbf8c78c11e1el }, 25667 { 0x78651c493c25c24el,0x8064c4f37b7cce0el,0xa55441d4a6d8a928l, 25668 0x4525c40eb0db3adcl }, 25669 0 }, 25670 /* 83 << 216 */ 25671 { { 0x5f69e49cfde6001el,0xc61e753aee59b47el,0xd0d4559971b0db5bl, 25672 0x7f76f7b45ad4acc3l }, 25673 { 0xb0318a9c39830897l,0x2b15da22feef3822l,0x34049400acfb0753l, 25674 0x16f4fb51a5114ed4l }, 25675 0 }, 25676 /* 89 << 216 */ 25677 { { 0x0b5c76928defbf10l,0xb9f1795cb79cdb6el,0xba17e7759a90317cl, 25678 0x3cb69cf950cf514bl }, 25679 { 0x076cc4c1e5b892ffl,0x75724e8fb548b73cl,0x2ebcdb33248ff2e6l, 25680 0x1f12967be109b08fl }, 25681 0 }, 25682 /* 95 << 216 */ 25683 { { 0x3f514c63461b7bb3l,0x3bdca5aa70afbad7l,0x368ce251eab3e38bl, 25684 0xdc0fb3300d101049l }, 25685 { 0x7ce09abdff5013eel,0x926dd7dd7d10729dl,0xe6fe47ab6f486197l, 25686 0xd23964eaa6eb6903l }, 25687 0 }, 25688 /* 101 << 216 */ 25689 { { 0x537ceb74eca30797l,0xf171bba557b0f338l,0x220a31fee831f1f8l, 25690 0xabbc2c7c5ae6bbbcl }, 25691 { 0xaf7609f27eadfb60l,0x22cff1d58f28b51bl,0x63c3d76d6d1863bdl, 25692 0x3a6a2fb489e8a4c8l }, 25693 0 }, 25694 /* 107 << 216 */ 25695 { { 0x9e74f8beb26e38f0l,0xc4c73fc4ea8bd55bl,0x086f688e1429e1fcl, 25696 0x91438ff40f78159fl }, 25697 { 0x3571ae5f20810acbl,0x305edafe7451eb00l,0x8443c96d5704385cl, 25698 0xc03b234e542605b5l }, 25699 0 }, 25700 /* 113 << 216 */ 25701 { { 0x2e5ff4fed85567c2l,0x136f49c7e4abd0c6l,0x5a68730cfb8a62d1l, 25702 0x101ebfd030bcb848l }, 25703 { 0x634b0618fee950bbl,0xfa748d21c8aa65bal,0xc1d67c3e699f5560l, 25704 0x6fb0546cb22889d2l }, 25705 0 }, 25706 /* 116 << 216 */ 25707 { { 0xa9784ebd9c95f0f9l,0x5ed9deb224640771l,0x31244af7035561c4l, 25708 0x87332f3a7ee857del }, 25709 { 0x09e16e9e2b9e0d88l,0x52d910f456a06049l,0x507ed477a9592f48l, 25710 0x85cb917b2365d678l }, 25711 0 }, 25712 /* 119 << 216 */ 25713 { { 0x6108f2b458a9d40dl,0xb036034838e15a52l,0xcc5610a3fd5625d6l, 25714 0x79825dd083b0418el }, 25715 { 0xf83a95fc6324b6e5l,0x2463114deedfc4ebl,0x58b177e32250707fl, 25716 0x778dcd454af8d942l }, 25717 0 }, 25718 /* 125 << 216 */ 25719 { { 0x1ecf2670eb816bf8l,0xa2d6e73aaa6d59c6l,0xf9a11434156852ebl, 25720 0x9bc9bb70f6f82c83l }, 25721 { 0xd23a018d9c874836l,0xd26bf8bc6db5a8b5l,0x1d648846bec0c624l, 25722 0x39f15d97ef90302fl }, 25723 0 }, 25724 }, 25725 { 25726 /* 0 << 224 */ 25727 { { 0x00, 0x00, 0x00, 0x00 }, 25728 { 0x00, 0x00, 0x00, 0x00 }, 25729 1 }, 25730 /* 1 << 224 */ 25731 { { 0xe3417bc035d0b34al,0x440b386b8327c0a7l,0x8fb7262dac0362d1l, 25732 0x2c41114ce0cdf943l }, 25733 { 0x2ba5cef1ad95a0b1l,0xc09b37a867d54362l,0x26d6cdd201e486c9l, 25734 0x20477abf42ff9297l }, 25735 0 }, 25736 /* 3 << 224 */ 25737 { { 0x126f35b51e706ad9l,0xb99cebb4c3a9ebdfl,0xa75389afbf608d90l, 25738 0x76113c4fc6c89858l }, 25739 { 0x80de8eb097e2b5aal,0x7e1022cc63b91304l,0x3bdab6056ccc066cl, 25740 0x33cbb144b2edf900l }, 25741 0 }, 25742 /* 4 << 224 */ 25743 { { 0xc41764717af715d2l,0xe2f7f594d0134a96l,0x2c1873efa41ec956l, 25744 0xe4e7b4f677821304l }, 25745 { 0xe5c8ff9788d5374al,0x2b915e6380823d5bl,0xea6bc755b2ee8fe2l, 25746 0x6657624ce7112651l }, 25747 0 }, 25748 /* 5 << 224 */ 25749 { { 0x157af101dace5acal,0xc4fdbcf211a6a267l,0xdaddf340c49c8609l, 25750 0x97e49f52e9604a65l }, 25751 { 0x9be8e790937e2ad5l,0x846e2508326e17f1l,0x3f38007a0bbbc0dcl, 25752 0xcf03603fb11e16d6l }, 25753 0 }, 25754 /* 7 << 224 */ 25755 { { 0x5ed0c007f8ae7c38l,0x6db07a5c3d740192l,0xbe5e9c2a5fe36db3l, 25756 0xd5b9d57a76e95046l }, 25757 { 0x54ac32e78eba20f2l,0xef11ca8f71b9a352l,0x305e373eff98a658l, 25758 0xffe5a100823eb667l }, 25759 0 }, 25760 /* 9 << 224 */ 25761 { { 0x5c8ed8d5da64309dl,0x61a6de5691b30704l,0xd6b52f6a2f9b5808l, 25762 0x0eee419498c958a7l }, 25763 { 0xcddd9aab771e4caal,0x83965dfd78bc21bel,0x02affce3b3b504f5l, 25764 0x30847a21561c8291l }, 25765 0 }, 25766 /* 10 << 224 */ 25767 { { 0xd2eb2cf152bfda05l,0xe0e4c4e96197b98cl,0x1d35076cf8a1726fl, 25768 0x6c06085b2db11e3dl }, 25769 { 0x15c0c4d74463ba14l,0x9d292f830030238cl,0x1311ee8b3727536dl, 25770 0xfeea86efbeaedc1el }, 25771 0 }, 25772 /* 11 << 224 */ 25773 { { 0xb9d18cd366131e2el,0xf31d974f80fe2682l,0xb6e49e0fe4160289l, 25774 0x7c48ec0b08e92799l }, 25775 { 0x818111d8d1989aa7l,0xb34fa0aaebf926f9l,0xdb5fe2f5a245474al, 25776 0xf80a6ebb3c7ca756l }, 25777 0 }, 25778 /* 13 << 224 */ 25779 { { 0x8ea610593de9abe3l,0x404348819cdc03bel,0x9b261245cfedce8cl, 25780 0x78c318b4cf5234a1l }, 25781 { 0x510bcf16fde24c99l,0x2a77cb75a2c2ff5dl,0x9c895c2b27960fb4l, 25782 0xd30ce975b0eda42bl }, 25783 0 }, 25784 /* 15 << 224 */ 25785 { { 0x09521177ff57d051l,0x2ff38037fb6a1961l,0xfc0aba74a3d76ad4l, 25786 0x7c76480325a7ec17l }, 25787 { 0x7532d75f48879bc8l,0xea7eacc058ce6bc1l,0xc82176b48e896c16l, 25788 0x9a30e0b22c750fedl }, 25789 0 }, 25790 /* 16 << 224 */ 25791 { { 0xc37e2c2e421d3aa4l,0xf926407ce84fa840l,0x18abc03d1454e41cl, 25792 0x26605ecd3f7af644l }, 25793 { 0x242341a6d6a5eabfl,0x1edb84f4216b668el,0xd836edb804010102l, 25794 0x5b337ce7945e1d8cl }, 25795 0 }, 25796 /* 17 << 224 */ 25797 { { 0xd2075c77c055dc14l,0x2a0ffa2581d89cdfl,0x8ce815ea6ffdcbafl, 25798 0xa3428878fb648867l }, 25799 { 0x277699cf884655fbl,0xfa5b5bd6364d3e41l,0x01f680c6441e1cb7l, 25800 0x3fd61e66b70a7d67l }, 25801 0 }, 25802 /* 19 << 224 */ 25803 { { 0xfd5bb657b1fa70fbl,0xfa07f50fd8073a00l,0xf72e3aa7bca02500l, 25804 0xf68f895d9975740dl }, 25805 { 0x301120605cae2a6al,0x01bd721802874842l,0x3d4238917ce47bd3l, 25806 0xa66663c1789544f6l }, 25807 0 }, 25808 /* 21 << 224 */ 25809 { { 0xb4b9a39b36194d40l,0xe857a7c577612601l,0xf4209dd24ecf2f58l, 25810 0x82b9e66d5a033487l }, 25811 { 0xc1e36934e4e8b9ddl,0xd2372c9da42377d7l,0x51dc94c70e3ae43bl, 25812 0x4c57761e04474f6fl }, 25813 0 }, 25814 /* 23 << 224 */ 25815 { { 0xa39114e24415503bl,0xc08ff7c64cbb17e9l,0x1eff674dd7dec966l, 25816 0x6d4690af53376f63l }, 25817 { 0xff6fe32eea74237bl,0xc436d17ecd57508el,0x15aa28e1edcc40fel, 25818 0x0d769c04581bbb44l }, 25819 0 }, 25820 /* 25 << 224 */ 25821 { { 0xfe51d0296ae55043l,0x8931e98f44a87de1l,0xe57f1cc609e4fee2l, 25822 0x0d063b674e072d92l }, 25823 { 0x70a998b9ed0e4316l,0xe74a736b306aca46l,0xecf0fbf24fda97c7l, 25824 0xa40f65cb3e178d93l }, 25825 0 }, 25826 /* 27 << 224 */ 25827 { { 0x8667e981c27253c9l,0x05a6aefb92b36a45l,0xa62c4b369cb7bb46l, 25828 0x8394f37511f7027bl }, 25829 { 0x747bc79c5f109d0fl,0xcad88a765b8cc60al,0x80c5a66b58f09e68l, 25830 0xe753d451f6127eacl }, 25831 0 }, 25832 /* 28 << 224 */ 25833 { { 0xc44b74a15b0ec6f5l,0x47989fe45289b2b8l,0x745f848458d6fc73l, 25834 0xec362a6ff61c70abl }, 25835 { 0x070c98a7b3a8ad41l,0x73a20fc07b63db51l,0xed2c2173f44c35f4l, 25836 0x8a56149d9acc9dcal }, 25837 0 }, 25838 /* 29 << 224 */ 25839 { { 0x98f178819ac6e0f4l,0x360fdeafa413b5edl,0x0625b8f4a300b0fdl, 25840 0xf1f4d76a5b3222d3l }, 25841 { 0x9d6f5109587f76b8l,0x8b4ee08d2317fdb5l,0x88089bb78c68b095l, 25842 0x95570e9a5808d9b9l }, 25843 0 }, 25844 /* 31 << 224 */ 25845 { { 0x2e1284943fb42622l,0x3b2700ac500907d5l,0xf370fb091a95ec63l, 25846 0xf8f30be231b6dfbdl }, 25847 { 0xf2b2f8d269e55f15l,0x1fead851cc1323e9l,0xfa366010d9e5eef6l, 25848 0x64d487b0e316107el }, 25849 0 }, 25850 /* 33 << 224 */ 25851 { { 0xc9a9513929607745l,0x0ca07420a26f2b28l,0xcb2790e74bc6f9ddl, 25852 0x345bbb58adcaffc0l }, 25853 { 0xc65ea38cbe0f27a2l,0x67c24d7c641fcb56l,0x2c25f0a7a9e2c757l, 25854 0x93f5cdb016f16c49l }, 25855 0 }, 25856 /* 34 << 224 */ 25857 { { 0x2ca5a9d7c5ee30a1l,0xd1593635b909b729l,0x804ce9f3dadeff48l, 25858 0xec464751b07c30c3l }, 25859 { 0x89d65ff39e49af6al,0xf2d6238a6f3d01bcl,0x1095561e0bced843l, 25860 0x51789e12c8a13fd8l }, 25861 0 }, 25862 /* 35 << 224 */ 25863 { { 0xd633f929763231dfl,0x46df9f7de7cbddefl,0x01c889c0cb265da8l, 25864 0xfce1ad10af4336d2l }, 25865 { 0x8d110df6fc6a0a7el,0xdd431b986da425dcl,0xcdc4aeab1834aabel, 25866 0x84deb1248439b7fcl }, 25867 0 }, 25868 /* 36 << 224 */ 25869 { { 0x8796f1693c2a5998l,0x9b9247b47947190dl,0x55b9d9a511597014l, 25870 0x7e9dd70d7b1566eel }, 25871 { 0x94ad78f7cbcd5e64l,0x0359ac179bd4c032l,0x3b11baaf7cc222ael, 25872 0xa6a6e284ba78e812l }, 25873 0 }, 25874 /* 37 << 224 */ 25875 { { 0x8392053f24cea1a0l,0xc97bce4a33621491l,0x7eb1db3435399ee9l, 25876 0x473f78efece81ad1l }, 25877 { 0x41d72fe0f63d3d0dl,0xe620b880afab62fcl,0x92096bc993158383l, 25878 0x41a213578f896f6cl }, 25879 0 }, 25880 /* 39 << 224 */ 25881 { { 0x6fb4d4e42bad4d5fl,0xfa4c3590fef0059bl,0x6a10218af5122294l, 25882 0x9a78a81aa85751d1l }, 25883 { 0x04f20579a98e84e7l,0xfe1242c04997e5b5l,0xe77a273bca21e1e4l, 25884 0xfcc8b1ef9411939dl }, 25885 0 }, 25886 /* 40 << 224 */ 25887 { { 0xe20ea30292d0487al,0x1442dbec294b91fel,0x1f7a4afebb6b0e8fl, 25888 0x1700ef746889c318l }, 25889 { 0xf5bbffc370f1fc62l,0x3b31d4b669c79ccal,0xe8bc2aaba7f6340dl, 25890 0xb0b08ab4a725e10al }, 25891 0 }, 25892 /* 41 << 224 */ 25893 { { 0x44f05701ae340050l,0xba4b30161cf0c569l,0x5aa29f83fbe19a51l, 25894 0x1b9ed428b71d752el }, 25895 { 0x1666e54eeb4819f5l,0x616cdfed9e18b75bl,0x112ed5be3ee27b0bl, 25896 0xfbf2831944c7de4dl }, 25897 0 }, 25898 /* 43 << 224 */ 25899 { { 0x722eb104e2b4e075l,0x49987295437c4926l,0xb1e4c0e446a9b82dl, 25900 0xd0cb319757a006f5l }, 25901 { 0xf3de0f7dd7808c56l,0xb5c54d8f51f89772l,0x500a114aadbd31aal, 25902 0x9afaaaa6295f6cabl }, 25903 0 }, 25904 /* 44 << 224 */ 25905 { { 0x94705e2104cf667al,0xfc2a811b9d3935d7l,0x560b02806d09267cl, 25906 0xf19ed119f780e53bl }, 25907 { 0xf0227c09067b6269l,0x967b85335caef599l,0x155b924368efeebcl, 25908 0xcd6d34f5c497bae6l }, 25909 0 }, 25910 /* 45 << 224 */ 25911 { { 0x1dd8d5d36cceb370l,0x2aeac579a78d7bf9l,0x5d65017d70b67a62l, 25912 0x70c8e44f17c53f67l }, 25913 { 0xd1fc095086a34d09l,0xe0fca256e7134907l,0xe24fa29c80fdd315l, 25914 0x2c4acd03d87499adl }, 25915 0 }, 25916 /* 46 << 224 */ 25917 { { 0xbaaf75173b5a9ba6l,0xb9cbe1f612e51a51l,0xd88edae35e154897l, 25918 0xe4309c3c77b66ca0l }, 25919 { 0xf5555805f67f3746l,0x85fc37baa36401ffl,0xdf86e2cad9499a53l, 25920 0x6270b2a3ecbc955bl }, 25921 0 }, 25922 /* 47 << 224 */ 25923 { { 0xafae64f5974ad33bl,0x04d85977fe7b2df1l,0x2a3db3ff4ab03f73l, 25924 0x0b87878a8702740al }, 25925 { 0x6d263f015a061732l,0xc25430cea32a1901l,0xf7ebab3ddb155018l, 25926 0x3a86f69363a9b78el }, 25927 0 }, 25928 /* 48 << 224 */ 25929 { { 0x349ae368da9f3804l,0x470f07fea164349cl,0xd52f4cc98562baa5l, 25930 0xc74a9e862b290df3l }, 25931 { 0xd3a1aa3543471a24l,0x239446beb8194511l,0xbec2dd0081dcd44dl, 25932 0xca3d7f0fc42ac82dl }, 25933 0 }, 25934 /* 49 << 224 */ 25935 { { 0x1f3db085fdaf4520l,0xbb6d3e804549daf2l,0xf5969d8a19ad5c42l, 25936 0x7052b13ddbfd1511l }, 25937 { 0x11890d1b682b9060l,0xa71d3883ac34452cl,0xa438055b783805b4l, 25938 0x432412774725b23el }, 25939 0 }, 25940 /* 51 << 224 */ 25941 { { 0x40b08f7443b30ca8l,0xe10b5bbad9934583l,0xe8a546d6b51110adl, 25942 0x1dd50e6628e0b6c5l }, 25943 { 0x292e9d54cff2b821l,0x3882555d47281760l,0x134838f83724d6e3l, 25944 0xf2c679e022ddcda1l }, 25945 0 }, 25946 /* 52 << 224 */ 25947 { { 0x40ee88156d2a5768l,0x7f227bd21c1e7e2dl,0x487ba134d04ff443l, 25948 0x76e2ff3dc614e54bl }, 25949 { 0x36b88d6fa3177ec7l,0xbf731d512328fff5l,0x758caea249ba158el, 25950 0x5ab8ff4c02938188l }, 25951 0 }, 25952 /* 53 << 224 */ 25953 { { 0x33e1605635edc56dl,0x5a69d3497e940d79l,0x6c4fd00103866dcbl, 25954 0x20a38f574893cdefl }, 25955 { 0xfbf3e790fac3a15bl,0x6ed7ea2e7a4f8e6bl,0xa663eb4fbc3aca86l, 25956 0x22061ea5080d53f7l }, 25957 0 }, 25958 /* 55 << 224 */ 25959 { { 0x635a8e5ec3a0ee43l,0x70aaebca679898ffl,0x9ee9f5475dc63d56l, 25960 0xce987966ffb34d00l }, 25961 { 0xf9f86b195e26310al,0x9e435484382a8ca8l,0x253bcb81c2352fe4l, 25962 0xa4eac8b04474b571l }, 25963 0 }, 25964 /* 57 << 224 */ 25965 { { 0x2617f91c93aa96b8l,0x0fc8716b7fca2e13l,0xa7106f5e95328723l, 25966 0xd1c9c40b262e6522l }, 25967 { 0xb9bafe8642b7c094l,0x1873439d1543c021l,0xe1baa5de5cbefd5dl, 25968 0xa363fc5e521e8affl }, 25969 0 }, 25970 /* 59 << 224 */ 25971 { { 0xbc00fc2f2f8ba2c7l,0x0966eb2f7c67aa28l,0x13f7b5165a786972l, 25972 0x3bfb75578a2fbba0l }, 25973 { 0x131c4f235a2b9620l,0xbff3ed276faf46bel,0x9b4473d17e172323l, 25974 0x421e8878339f6246l }, 25975 0 }, 25976 /* 60 << 224 */ 25977 { { 0x0fa8587a25a41632l,0xc0814124a35b6c93l,0x2b18a9f559ebb8dbl, 25978 0x264e335776edb29cl }, 25979 { 0xaf245ccdc87c51e2l,0x16b3015b501e6214l,0xbb31c5600a3882cel, 25980 0x6961bb94fec11e04l }, 25981 0 }, 25982 /* 61 << 224 */ 25983 { { 0x3b825b8deff7a3a0l,0xbec33738b1df7326l,0x68ad747c99604a1fl, 25984 0xd154c9349a3bd499l }, 25985 { 0xac33506f1cc7a906l,0x73bb53926c560e8fl,0x6428fcbe263e3944l, 25986 0xc11828d51c387434l }, 25987 0 }, 25988 /* 63 << 224 */ 25989 { { 0x659b17c8d8ceb147l,0x9b649eeeb70a5554l,0x6b7fa0b5ac6bc634l, 25990 0xd99fe2c71d6e732fl }, 25991 { 0x30e6e7628d3abba2l,0x18fee6e7a797b799l,0x5c9d360dc696464dl, 25992 0xe3baeb4827bfde12l }, 25993 0 }, 25994 /* 64 << 224 */ 25995 { { 0x2bf5db47f23206d5l,0x2f6d34201d260152l,0x17b876533f8ff89al, 25996 0x5157c30c378fa458l }, 25997 { 0x7517c5c52d4fb936l,0xef22f7ace6518cdcl,0xdeb483e6bf847a64l, 25998 0xf508455892e0fa89l }, 25999 0 }, 26000 /* 65 << 224 */ 26001 { { 0xf77bb113a74ed3bel,0x89e4eb8f074f2637l,0x7fbfa84df7ce2aebl, 26002 0xe7c6ecd5baaefe4cl }, 26003 { 0x176bba7df6319542l,0x70098120f6080799l,0x2e2118339054d9aal, 26004 0x1be4c6a78295a912l }, 26005 0 }, 26006 /* 71 << 224 */ 26007 { { 0x6bb4d8c35df1455fl,0xb839f08f0384b033l,0x718868af11f95d50l, 26008 0xae256a92e07a8801l }, 26009 { 0xa5bafaf24d71a273l,0x18ff04ea2a30e68fl,0x364c193287ba727el, 26010 0x4bb8cf99befcaf73l }, 26011 0 }, 26012 /* 77 << 224 */ 26013 { { 0xc79f5b1f4e9fb3d7l,0x52854970a51cccddl,0xa4e27e97f00054a3l, 26014 0x26a79792240e1232l }, 26015 { 0xb15579fecb5ff465l,0x6ef54c3bd1722a84l,0xee211bfa5239a4d8l, 26016 0x36c7db27270b7059l }, 26017 0 }, 26018 /* 83 << 224 */ 26019 { { 0x5e7da0a9f9858cd3l,0x67459de5b633de49l,0x2db0d54b2e73892el, 26020 0x37f50877adae399al }, 26021 { 0x83c28b83b65e6179l,0xae5a915ca39faf17l,0x6ab8f3fbe841b53cl, 26022 0x7c30997b0df7d004l }, 26023 0 }, 26024 /* 89 << 224 */ 26025 { { 0x87904ca7b3b862bdl,0x7593db93cf9ea671l,0x8a2670f8739aa783l, 26026 0x3921d779f5154ca6l }, 26027 { 0xe81ca56468f65ebbl,0x0c600603bc4e64d4l,0xdf170049cb83b2d1l, 26028 0x373893b863487064l }, 26029 0 }, 26030 /* 95 << 224 */ 26031 { { 0x7c3c52b9c0c4e88el,0x0f0484d06f0c2446l,0xeb876827000fe87bl, 26032 0xa749b3136d20f94al }, 26033 { 0x0876dae9d55abda6l,0xe6e4367620726911l,0xf85e8a8c4a2676b4l, 26034 0x4e8c97f1b4a890ebl }, 26035 0 }, 26036 /* 101 << 224 */ 26037 { { 0xa992f482a3c0a4f4l,0xe1536f3f7a8d961al,0x26fc79ae000752b0l, 26038 0xdbfb706b76ad8508l }, 26039 { 0x2642b2ed6f4cf9e4l,0xa013db54557fa7e2l,0x2ef711821d326116l, 26040 0x8dc3f5bcbafc83ecl }, 26041 0 }, 26042 /* 107 << 224 */ 26043 { { 0x9671258578e5a201l,0xc71aca1de9125569l,0x360c45c0e2231379l, 26044 0x2d71783512e82369l }, 26045 { 0x392432d3d84b2153l,0x502fd3f6d6939ffel,0x33c440ae6e766cacl, 26046 0x99f1fbee28062416l }, 26047 0 }, 26048 /* 113 << 224 */ 26049 { { 0xe51ad841861604cbl,0x1ec9c54f630283a7l,0xcc42cad582a39473l, 26050 0xa2eb053709929c4al }, 26051 { 0xe374459767f655a3l,0x9f54c2451d7f2674l,0xd85e9163fbc8aba5l, 26052 0x12fd0b55866bc892l }, 26053 0 }, 26054 /* 116 << 224 */ 26055 { { 0x4f2c3063d7bd4661l,0xe533798d57a974ccl,0x44860d503ea02d85l, 26056 0xf2a7f4e5acaa0521l }, 26057 { 0x05593061abb108f0l,0x56d1056044528309l,0x1f674df9c88b6d1el, 26058 0x19fdc4cbd8744c4dl }, 26059 0 }, 26060 /* 119 << 224 */ 26061 { { 0xfd1488ec00f2f1d5l,0x24fcc67b44a825ddl,0xc7bfae2ea925a0f4l, 26062 0x5e03249cad59cf48l }, 26063 { 0x1dc5a8e11af4844cl,0x89b2fbc58a598c20l,0xb0f56afff2078121l, 26064 0x8194012d4878bb0dl }, 26065 0 }, 26066 /* 125 << 224 */ 26067 { { 0xc1cbe9d3a5ae1031l,0x38da74435706b987l,0x01844b55b353f188l, 26068 0x390c59ca87a807c5l }, 26069 { 0x55ac7b1fb13b780cl,0x060970bff375c1cbl,0x8dd1f378c7ab4e5cl, 26070 0xcca782e5cf726645l }, 26071 0 }, 26072 }, 26073 { 26074 /* 0 << 232 */ 26075 { { 0x00, 0x00, 0x00, 0x00 }, 26076 { 0x00, 0x00, 0x00, 0x00 }, 26077 1 }, 26078 /* 1 << 232 */ 26079 { { 0x91213462f23f2d92l,0x6cab71bd60b94078l,0x6bdd0a63176cde20l, 26080 0x54c9b20cee4d54bcl }, 26081 { 0x3cd2d8aa9f2ac02fl,0x03f8e617206eedb0l,0xc7f68e1693086434l, 26082 0x831469c592dd3db9l }, 26083 0 }, 26084 /* 3 << 232 */ 26085 { { 0x4a9090cde36d0757l,0xf722d7b1d9a29382l,0xfb7fb04c04b48ddfl, 26086 0x628ad2a7ebe16f43l }, 26087 { 0xcd3fbfb520226040l,0x6c34ecb15104b6c4l,0x30c0754ec903c188l, 26088 0xec336b082d23cab0l }, 26089 0 }, 26090 /* 4 << 232 */ 26091 { { 0x9f51439e558df019l,0x230da4baac712b27l,0x518919e355185a24l, 26092 0x4dcefcdd84b78f50l }, 26093 { 0xa7d90fb2a47d4c5al,0x55ac9abfb30e009el,0xfd2fc35974eed273l, 26094 0xb72d824cdbea8fafl }, 26095 0 }, 26096 /* 5 << 232 */ 26097 { { 0xd213f923cbb13d1bl,0x98799f425bfb9bfel,0x1ae8ddc9701144a9l, 26098 0x0b8b3bb64c5595eel }, 26099 { 0x0ea9ef2e3ecebb21l,0x17cb6c4b3671f9a7l,0x47ef464f726f1d1fl, 26100 0x171b94846943a276l }, 26101 0 }, 26102 /* 7 << 232 */ 26103 { { 0xc9941109a607419dl,0xfaa71e62bb6bca80l,0x34158c1307c431f3l, 26104 0x594abebc992bc47al }, 26105 { 0x6dfea691eb78399fl,0x48aafb353f42cba4l,0xedcd65af077c04f0l, 26106 0x1a29a366e884491al }, 26107 0 }, 26108 /* 9 << 232 */ 26109 { { 0x7bf6a5c1f7ea25aal,0xd165e6bffbb07d5fl,0xe353936189e78671l, 26110 0xa3fcac892bac4219l }, 26111 { 0xdfab6fd4f0baa8abl,0x5a4adac1e2c1c2e5l,0x6cd75e3140d85849l, 26112 0xce263fea19b39181l }, 26113 0 }, 26114 /* 10 << 232 */ 26115 { { 0xb8d804a3315980cdl,0x693bc492fa3bebf7l,0x3578aeee2253c504l, 26116 0x158de498cd2474a2l }, 26117 { 0x1331f5c7cfda8368l,0xd2d7bbb378d7177el,0xdf61133af3c1e46el, 26118 0x5836ce7dd30e7be8l }, 26119 0 }, 26120 /* 11 << 232 */ 26121 { { 0xe042ece59a29a5c5l,0xb19b3c073b6c8402l,0xc97667c719d92684l, 26122 0xb5624622ebc66372l }, 26123 { 0x0cb96e653c04fa02l,0x83a7176c8eaa39aal,0x2033561deaa1633fl, 26124 0x45a9d0864533df73l }, 26125 0 }, 26126 /* 13 << 232 */ 26127 { { 0xa29ae9df5ece6e7cl,0x0603ac8f0facfb55l,0xcfe85b7adda233a5l, 26128 0xe618919fbd75f0b8l }, 26129 { 0xf555a3d299bf1603l,0x1f43afc9f184255al,0xdcdaf341319a3e02l, 26130 0xd3b117ef03903a39l }, 26131 0 }, 26132 /* 15 << 232 */ 26133 { { 0xb6b82fa74d82f4c2l,0x90725a606804efb3l,0xbc82ec46adc3425el, 26134 0xb7b805812787843el }, 26135 { 0xdf46d91cdd1fc74cl,0xdc1c62cbe783a6c4l,0x59d1b9f31a04cbbal, 26136 0xd87f6f7295e40764l }, 26137 0 }, 26138 /* 16 << 232 */ 26139 { { 0x196860411e84e0e5l,0xa5db84d3aea34c93l,0xf9d5bb197073a732l, 26140 0xb8d2fe566bcfd7c0l }, 26141 { 0x45775f36f3eb82fal,0x8cb20cccfdff8b58l,0x1659b65f8374c110l, 26142 0xb8b4a422330c789al }, 26143 0 }, 26144 /* 17 << 232 */ 26145 { { 0xa6312c9e8977d99bl,0xbe94433183f531e7l,0x8232c0c218d3b1d4l, 26146 0x617aae8be1247b73l }, 26147 { 0x40153fc4282aec3bl,0xc6063d2ff7b8f823l,0x68f10e583304f94cl, 26148 0x31efae74ee676346l }, 26149 0 }, 26150 /* 19 << 232 */ 26151 { { 0xd98bf2a43734e520l,0x5e3abbe3209bdcbal,0x77c76553bc945b35l, 26152 0x5331c093c6ef14aal }, 26153 { 0x518ffe2976b60c80l,0x2285593b7ace16f8l,0xab1f64ccbe2b9784l, 26154 0xe8f2c0d9ab2421b6l }, 26155 0 }, 26156 /* 21 << 232 */ 26157 { { 0x481dae5fd5ecfefcl,0x07084fd8c2bff8fcl,0x8040a01aea324596l, 26158 0x4c646980d4de4036l }, 26159 { 0x9eb8ab4ed65abfc3l,0xe01cb91f13541ec7l,0x8f029adbfd695012l, 26160 0x9ae284833c7569ecl }, 26161 0 }, 26162 /* 23 << 232 */ 26163 { { 0xc83605f6f10ff927l,0xd387145123739fc6l,0x6d163450cac1c2ccl, 26164 0x6b521296a2ec1ac5l }, 26165 { 0x0606c4f96e3cb4a5l,0xe47d3f41778abff7l,0x425a8d5ebe8e3a45l, 26166 0x53ea9e97a6102160l }, 26167 0 }, 26168 /* 25 << 232 */ 26169 { { 0x6b72fab526bc2797l,0x13670d1699f16771l,0x001700521e3e48d1l, 26170 0x978fe401b7adf678l }, 26171 { 0x55ecfb92d41c5dd4l,0x5ff8e247c7b27da5l,0xe7518272013fb606l, 26172 0x5768d7e52f547a3cl }, 26173 0 }, 26174 /* 27 << 232 */ 26175 { { 0x0e966e64c73b2383l,0x49eb3447d17d8762l,0xde1078218da05dabl, 26176 0x443d8baa016b7236l }, 26177 { 0x163b63a5ea7610d6l,0xe47e4185ce1ca979l,0xae648b6580baa132l, 26178 0xebf53de20e0d5b64l }, 26179 0 }, 26180 /* 28 << 232 */ 26181 { { 0x6ba535da9a85788bl,0xd21f03aebd0626d4l,0x099f8c47e873dc64l, 26182 0xcda8564d018ec97el }, 26183 { 0x3e8d7a5cde92c68cl,0x78e035a173323cc4l,0x3ef26275f880ff7cl, 26184 0xa4ee3dff273eedaal }, 26185 0 }, 26186 /* 29 << 232 */ 26187 { { 0x8bbaec49571d92acl,0x569e85fe4692517fl,0x8333b014a14ea4afl, 26188 0x32f2a62f12e5c5adl }, 26189 { 0x98c2ce3a06d89b85l,0xb90741aa2ff77a08l,0x2530defc01f795a2l, 26190 0xd6e5ba0b84b3c199l }, 26191 0 }, 26192 /* 31 << 232 */ 26193 { { 0x3d1b24cb28c682c6l,0x27f252288612575bl,0xb587c779e8e66e98l, 26194 0x7b0c03e9405eb1fel }, 26195 { 0xfdf0d03015b548e7l,0xa8be76e038b36af7l,0x4cdab04a4f310c40l, 26196 0x6287223ef47ecaecl }, 26197 0 }, 26198 /* 33 << 232 */ 26199 { { 0x0a4c6f3670ad54aal,0xc24cfd0d2a543909l,0xe1b0bc5b745c1a97l, 26200 0xb8431cfd68f0ddbfl }, 26201 { 0x326357989ed8cb06l,0xa00a80ff759d2b7dl,0x81f335c190570e02l, 26202 0xbfccd89849c4e4d9l }, 26203 0 }, 26204 /* 34 << 232 */ 26205 { { 0x4dcb646bfd16d8c4l,0x76a6b640e38ba57bl,0xd92de1f79d8ae7e2l, 26206 0x126f48f13f77f23bl }, 26207 { 0xb7b53ca977e8abc2l,0x3faa17112c0787ffl,0xf8f9308c8e5762f8l, 26208 0x600a8a7f6b83aea8l }, 26209 0 }, 26210 /* 35 << 232 */ 26211 { { 0xa2aed4a799aa03c0l,0x1f93b93da18b79c5l,0x7b4550b7314192c3l, 26212 0x9da00676272bb08el }, 26213 { 0xe42f0d7e23e072edl,0x7ce76494888b5783l,0x4c7900203680b63bl, 26214 0x6040c83f662a8718l }, 26215 0 }, 26216 /* 36 << 232 */ 26217 { { 0xba9e5c88a56d73edl,0x6c24f7712ca054d3l,0x4a37c235083beae1l, 26218 0x04a883b26483e9fdl }, 26219 { 0x0c63f3aee27c2c5dl,0x0e1da88dae4671f1l,0xa577e8e25995e1dbl, 26220 0xbfc4b1b16ed6066al }, 26221 0 }, 26222 /* 37 << 232 */ 26223 { { 0x8b398541f53d9e63l,0x4ab045bb019395cbl,0x69a1b90371dd70c7l, 26224 0xdedf284b38aaa431l }, 26225 { 0xb45e245aaed3efe7l,0x49460905079f2facl,0xde4dee470845bd78l, 26226 0x0540524039d02ec3l }, 26227 0 }, 26228 /* 39 << 232 */ 26229 { { 0x300cf051675cc986l,0x758afea99324219fl,0xf524c3fad5a93b5fl, 26230 0xb73385abc3864a8al }, 26231 { 0xbde19289f6be9050l,0xbb9018558205a3f3l,0x99a9d14d229f6b89l, 26232 0x4c3a802f4336e68fl }, 26233 0 }, 26234 /* 40 << 232 */ 26235 { { 0xdd4a12d8e12b31f8l,0x577e29bc177736e6l,0x2353722ba88935e8l, 26236 0xca1d3729015f286dl }, 26237 { 0x86c7b6a239a3e035l,0x6e5250bfd3b03a9fl,0x79d98930fd0d536el, 26238 0x8c4cbbabfa0c3832l }, 26239 0 }, 26240 /* 41 << 232 */ 26241 { { 0x92ecff374f8e6163l,0x171cc8830f35faeal,0xc5434242bcd36142l, 26242 0x707049adb28b63bbl }, 26243 { 0xa1f4d1dbf6443da9l,0x002bb062dabc108bl,0x17287f171a272b08l, 26244 0x2a3aac8c884cf6bbl }, 26245 0 }, 26246 /* 43 << 232 */ 26247 { { 0x55524645651c0a5al,0x14624a9703cf0d12l,0xca9315a8f884a9e2l, 26248 0x9840c6e2df7c9d59l }, 26249 { 0xd96bd10a7438e8d5l,0x12be73d2b2f887del,0x5e47445dca2493efl, 26250 0x85aef555e9fff03el }, 26251 0 }, 26252 /* 44 << 232 */ 26253 { { 0x169b38c9a43b2339l,0x884308d91732bfabl,0xe4b593a28ff202ddl, 26254 0xaf51d11f1e65376cl }, 26255 { 0x6ec648de741525ffl,0xf93cbd369ff4c628l,0xc76df9efb1129c79l, 26256 0x31a5f2e2b7a67294l }, 26257 0 }, 26258 /* 45 << 232 */ 26259 { { 0x0661bc02801d0e38l,0x4a37dc0e71fc46b7l,0x0b224cfc80c3e311l, 26260 0x2dd3d2779646a957l }, 26261 { 0xfa45aa18ef524012l,0x5d2a2d0916185a09l,0x34d5c630b5313dcel, 26262 0xd9581ed151e4cf84l }, 26263 0 }, 26264 /* 46 << 232 */ 26265 { { 0x5845aa4a8ebd2af8l,0x141404ecd3df43ccl,0xff3fc7681ffd48d9l, 26266 0x8a096e72e0cefb65l }, 26267 { 0xc9c81cfdffc3a5cdl,0x7550aa3029b27cf9l,0x34dca72b65fa0380l, 26268 0xe8c5f6059ddd032bl }, 26269 0 }, 26270 /* 47 << 232 */ 26271 { { 0xe53da8a46bfbadb3l,0x4a9dfa55afaeeb5el,0x076245ea6644b1d4l, 26272 0xc19be4012307bbcbl }, 26273 { 0x097774c19d77318bl,0xacc8a1519cfd51c4l,0x736ef6b3ecaa7b08l, 26274 0x107479132d643a80l }, 26275 0 }, 26276 /* 48 << 232 */ 26277 { { 0x2d500910cab91f1el,0xbedd9e444d1cd216l,0xd634b74fedd02252l, 26278 0xbd60f8e11258617al }, 26279 { 0xd8c7537b9e05614al,0xfd26c766e7af5fc5l,0x0660b581582bd926l, 26280 0x87019244acf07fc8l }, 26281 0 }, 26282 /* 49 << 232 */ 26283 { { 0xd4889fdf6220ae8el,0x745d67ec1abf1549l,0x957b2e3d2fb89c36l, 26284 0x9768c90edc62ada9l }, 26285 { 0x90332fd748e6c46el,0x5aa5a4e54e90ef0dl,0x58838fd3ddcc8571l, 26286 0xd12f6c6f9a721126l }, 26287 0 }, 26288 /* 51 << 232 */ 26289 { { 0x2f0fd0b2cec757bal,0x46a7a9c63032cd1dl,0x9af3a600547d7a77l, 26290 0x828e16eca43da1bal }, 26291 { 0x0b303a66092a8d92l,0x78ba0389c23d08bal,0x52aed08d4616bd29l, 26292 0x4c0ff1210539c9fal }, 26293 0 }, 26294 /* 52 << 232 */ 26295 { { 0x2c3b7322badcfe8el,0x6e0616fac5e25a04l,0x0a3c12753da6e4a2l, 26296 0xe46c957e077bca01l }, 26297 { 0xb46ca4e3da4be64bl,0xa59bda668e75ee78l,0x41835184a4de98f2l, 26298 0x6efb1f924ed6a568l }, 26299 0 }, 26300 /* 53 << 232 */ 26301 { { 0xbb8cdc094af1dd72l,0x93c0aa38a2460633l,0xf66f5d238a7ebc93l, 26302 0x43ecda843e8e37a6l }, 26303 { 0x399da8265fd5139el,0x8b39930fd446f38el,0x114414135d2b68efl, 26304 0x8be163b8d1637c38l }, 26305 0 }, 26306 /* 55 << 232 */ 26307 { { 0x488e2a35b70ddbd3l,0xb4aa5f718da50077l,0xb38b74b1d8752bbdl, 26308 0x7007f328416106a3l }, 26309 { 0xe6a62e4fcec4ea68l,0x9fdfb79741ef920bl,0x1a19d7dfe3c337a6l, 26310 0x08f643558be0f586l }, 26311 0 }, 26312 /* 57 << 232 */ 26313 { { 0x91a5d8ff60343a1fl,0x921e442173ef8cdfl,0x4358f27b975138cdl, 26314 0x36fd8577a4992b08l }, 26315 { 0xc07c8ca1f8d044c6l,0xcf42903687747b6bl,0x0932ffb0867c8632l, 26316 0x7e565213250e5a89l }, 26317 0 }, 26318 /* 59 << 232 */ 26319 { { 0xae7c3b9b06255feal,0x2eb1d9a78a6fe229l,0xf81548e77601e6f8l, 26320 0x777394eb7bd96d6cl }, 26321 { 0x54734187000a3509l,0xaeec146492d43c04l,0xc9b7f0d7c428b4acl, 26322 0x9d4bcedccd7f7018l }, 26323 0 }, 26324 /* 60 << 232 */ 26325 { { 0x4741b9b311370605l,0x47fa72f75d09b355l,0x391a71ac7a144c6al, 26326 0x0808c0f498b6e3cal }, 26327 { 0x7eaed9ef7fe53900l,0xf157a2a5e5a830bal,0xd13ec09127974afcl, 26328 0x78d710a70b87997dl }, 26329 0 }, 26330 /* 61 << 232 */ 26331 { { 0xcbb96ecb4e263f81l,0x093e0d1509084351l,0x7af3232629220a81l, 26332 0xd721b415c60f36dcl }, 26333 { 0xe3340a87fe9387a1l,0x6088bf482ff2b126l,0xd31028f1d2bc982cl, 26334 0x9794e106630d52cbl }, 26335 0 }, 26336 /* 63 << 232 */ 26337 { { 0x1dac76780b11e972l,0x46e814c62698dafel,0x553f7370c37640d6l, 26338 0xdcf588cc51cede93l }, 26339 { 0x4d6b56d3c3f6215bl,0x07edc6621b8f8f03l,0xdfef9d60b9a5dfbcl, 26340 0x377edf4d10af7a5bl }, 26341 0 }, 26342 /* 64 << 232 */ 26343 { { 0x8928e99aeeaf8c49l,0xee7aa73d6e24d728l,0x4c5007c2e72b156cl, 26344 0x5fcf57c5ed408a1dl }, 26345 { 0x9f719e39b6057604l,0x7d343c01c2868bbfl,0x2cca254b7e103e2dl, 26346 0xe6eb38a9f131bea2l }, 26347 0 }, 26348 /* 65 << 232 */ 26349 { { 0x26ae28bede7a4b7el,0xd2f07569d2664163l,0x798690d4ff69266al, 26350 0x77093d356ef3695dl }, 26351 { 0xaca9903d567dd3dfl,0x259c59a3a274c67bl,0x9f34bc0bfc1198b0l, 26352 0x51a7726290b1521cl }, 26353 0 }, 26354 /* 71 << 232 */ 26355 { { 0xa20644bc80ca5391l,0xf9cdb4f7e5b36ea3l,0xe7936c0641426e22l, 26356 0x39bc23033eef8a52l }, 26357 { 0x31253f43e5d8f896l,0xb0e5a588dc3df499l,0x1d03519a2d7e66d5l, 26358 0x923de91f6d7da5e3l }, 26359 0 }, 26360 /* 77 << 232 */ 26361 { { 0x17a833ffedf861e4l,0x0ee3d0af4ebec965l,0xd0fac1c1ea66870el, 26362 0x325756d0ae810cf4l }, 26363 { 0x4ed78d2c78e9a415l,0x6cc65685192046e4l,0x03e4243d8498a91el, 26364 0x56a02dd25ab97794l }, 26365 0 }, 26366 /* 83 << 232 */ 26367 { { 0xc2fd373748e2b156l,0x259e9a98139645bel,0xe90106fb9877b4f1l, 26368 0x49e5bac5889ce002l }, 26369 { 0x936a7dd18cf14e0bl,0x70bf6d304e3a8a01l,0x99d3e8bfeb748b62l, 26370 0xa52a27c99b31c55cl }, 26371 0 }, 26372 /* 89 << 232 */ 26373 { { 0x9db1d41d300637d5l,0xe38744397c2dd836l,0x36179baf0d04ceb3l, 26374 0xe9ccd17b251b3f2dl }, 26375 { 0xd8228073442b6d1dl,0x59a038363eed2971l,0xb443732046979f5cl, 26376 0x54ad4113ae63937cl }, 26377 0 }, 26378 /* 95 << 232 */ 26379 { { 0x092c34e6d9246e9fl,0xb4b3b63d3eeb18a7l,0x8b3778beed9d1383l, 26380 0xe4cb7be9d70d5d80l }, 26381 { 0xcff12e9b3d059203l,0x277af117ba86699fl,0x9bd4e8e363603585l, 26382 0x0750b0f28e89c8d5l }, 26383 0 }, 26384 /* 101 << 232 */ 26385 { { 0x38b77e5958f7187bl,0x31c7068de0cb618el,0xa0f8e0d6c11ebe62l, 26386 0x07adc8010473d7ebl }, 26387 { 0x36161a2c5c3e9510l,0xb2ec90d64ad04815l,0x01e2dd1f917d8166l, 26388 0x549bcbdd6aa0f794l }, 26389 0 }, 26390 /* 107 << 232 */ 26391 { { 0x4ab27c3a8e4e45e5l,0xf6bd9d82f2bb99e7l,0xcab48c735e9da59fl, 26392 0xdeb09eb2b9727353l }, 26393 { 0xc4a7954bafb8fa3el,0x34af2a49abf6803dl,0xc1ee1416d63e13bbl, 26394 0xd49bf42d7a949193l }, 26395 0 }, 26396 /* 113 << 232 */ 26397 { { 0x504823ea9c9c07c6l,0x9dbec902bee2288cl,0x018d7875f0ceb6bbl, 26398 0x678b997304f7022cl }, 26399 { 0x74d658238c5fb369l,0x7d4e1f114ca89ee8l,0x148316399905abc0l, 26400 0xc107324e2c4deff4l }, 26401 0 }, 26402 /* 116 << 232 */ 26403 { { 0x1bc4fa8bdadc4404l,0x0edb9534daa12ee3l,0x084481b6a5f7289cl, 26404 0x7f42461d9d8fb3d2l }, 26405 { 0xf93f1d3212293c70l,0xc14706596bb73ea3l,0xf80834afde339cadl, 26406 0x99dcfc0081f22953l }, 26407 0 }, 26408 /* 119 << 232 */ 26409 { { 0x497e544f9fca737el,0x7f6342210e91e1afl,0x638e500c78d7b20bl, 26410 0xb1ffed3f7ebaa947l }, 26411 { 0x751aa54871086f83l,0x8100bb703cf97848l,0xc32f91ace19ad68fl, 26412 0x7dffb6851fb9157el }, 26413 0 }, 26414 /* 125 << 232 */ 26415 { { 0x5108589778e25060l,0x33e3cb7316cfe6cbl,0x0884cb8d410c0822l, 26416 0xaa806ecc0be3fc94l }, 26417 { 0x9f9121f5f692353el,0xb9ab0310f8ee3349l,0x390032ce2561973el, 26418 0xc07b6c6c8856b766l }, 26419 0 }, 26420 }, 26421 { 26422 /* 0 << 240 */ 26423 { { 0x00, 0x00, 0x00, 0x00 }, 26424 { 0x00, 0x00, 0x00, 0x00 }, 26425 1 }, 26426 /* 1 << 240 */ 26427 { { 0x1083e2ea1f095615l,0x0a28ad7714e68c33l,0x6bfc02523d8818bel, 26428 0xb585113af35850cdl }, 26429 { 0x7d935f0b30df8aa1l,0xaddda07c4ab7e3acl,0x92c34299552f00cbl, 26430 0xc33ed1de2909df6cl }, 26431 0 }, 26432 /* 3 << 240 */ 26433 { { 0xabe7905a83cdd60el,0x50602fb5a1170184l,0x689886cdb023642al, 26434 0xd568d090a6e1fb00l }, 26435 { 0x5b1922c70259217fl,0x93831cd9c43141e4l,0xdfca35870c95f86el, 26436 0xdec2057a568ae828l }, 26437 0 }, 26438 /* 4 << 240 */ 26439 { { 0x568f8925913cc16dl,0x18bc5b6de1a26f5al,0xdfa413bef5f499ael, 26440 0xf8835decc3f0ae84l }, 26441 { 0xb6e60bd865a40ab0l,0x65596439194b377el,0xbcd8562592084a69l, 26442 0x5ce433b94f23ede0l }, 26443 0 }, 26444 /* 5 << 240 */ 26445 { { 0x860d523d42e06189l,0xbf0779414e3aff13l,0x0b616dcac1b20650l, 26446 0xe66dd6d12131300dl }, 26447 { 0xd4a0fd67ff99abdel,0xc9903550c7aac50dl,0x022ecf8b7c46b2d7l, 26448 0x3333b1e83abf92afl }, 26449 0 }, 26450 /* 7 << 240 */ 26451 { { 0xefecdef7be42a582l,0xd3fc608065046be6l,0xc9af13c809e8dba9l, 26452 0x1e6c9847641491ffl }, 26453 { 0x3b574925d30c31f7l,0xb7eb72baac2a2122l,0x776a0dacef0859e7l, 26454 0x06fec31421900942l }, 26455 0 }, 26456 /* 9 << 240 */ 26457 { { 0x7ec62fbbf4737f21l,0xd8dba5ab6209f5acl,0x24b5d7a9a5f9adbel, 26458 0x707d28f7a61dc768l }, 26459 { 0x7711460bcaa999eal,0xba7b174d1c92e4ccl,0x3c4bab6618d4bf2dl, 26460 0xb8f0c980eb8bd279l }, 26461 0 }, 26462 /* 10 << 240 */ 26463 { { 0x9d658932790691bfl,0xed61058906b736ael,0x712c2f04c0d63b6el, 26464 0x5cf06fd5c63d488fl }, 26465 { 0x97363facd9588e41l,0x1f9bf7622b93257el,0xa9d1ffc4667acacel, 26466 0x1cf4a1aa0a061ecfl }, 26467 0 }, 26468 /* 11 << 240 */ 26469 { { 0x28d675b2c0519a23l,0x9ebf94fe4f6952e3l,0xf28bb767a2294a8al, 26470 0x85512b4dfe0af3f5l }, 26471 { 0x18958ba899b16a0dl,0x95c2430cba7548a7l,0xb30d1b10a16be615l, 26472 0xe3ebbb9785bfb74cl }, 26473 0 }, 26474 /* 13 << 240 */ 26475 { { 0x81eeb865d2fdca23l,0x5a15ee08cc8ef895l,0x768fa10a01905614l, 26476 0xeff5b8ef880ee19bl }, 26477 { 0xf0c0cabbcb1c8a0el,0x2e1ee9cdb8c838f9l,0x0587d8b88a4a14c0l, 26478 0xf6f278962ff698e5l }, 26479 0 }, 26480 /* 15 << 240 */ 26481 { { 0x9c4b646e9e2fce99l,0x68a210811e80857fl,0x06d54e443643b52al, 26482 0xde8d6d630d8eb843l }, 26483 { 0x7032156342146a0al,0x8ba826f25eaa3622l,0x227a58bd86138787l, 26484 0x43b6c03c10281d37l }, 26485 0 }, 26486 /* 16 << 240 */ 26487 { { 0x02b37a952f41deffl,0x0e44a59ae63b89b7l,0x673257dc143ff951l, 26488 0x19c02205d752baf4l }, 26489 { 0x46c23069c4b7d692l,0x2e6392c3fd1502acl,0x6057b1a21b220846l, 26490 0xe51ff9460c1b5b63l }, 26491 0 }, 26492 /* 17 << 240 */ 26493 { { 0x7aca2632f02fc0f0l,0xb92b337dc7f01c86l,0x624bc4bf5afbdc7dl, 26494 0x812b07bc4de21a5el }, 26495 { 0x29d137240b2090ccl,0x0403c5095a1b2132l,0x1dca34d50e35e015l, 26496 0xf085ed7d3bbbb66fl }, 26497 0 }, 26498 /* 19 << 240 */ 26499 { { 0xc27b98f9f781e865l,0x51e1f692994e1345l,0x0807d516e19361eel, 26500 0x13885ceffb998aefl }, 26501 { 0xd223d5e92f0f8a17l,0x48672010e8d20280l,0x6f02fd60237eac98l, 26502 0xcc51bfad9ada7ee7l }, 26503 0 }, 26504 /* 21 << 240 */ 26505 { { 0x2756bcdd1e09701dl,0x94e31db990d45c80l,0xb9e856a98566e584l, 26506 0x4f87d9deab10e3f3l }, 26507 { 0x166ecb373ded9cb2l,0xfd14c7073f653d3el,0x105d049b92aec425l, 26508 0x7f657e4909a42e11l }, 26509 0 }, 26510 /* 23 << 240 */ 26511 { { 0xea6490076a159594l,0x3e424d6b1f97ce52l,0xac6df30a185e8ccbl, 26512 0xad56ec80517747bfl }, 26513 { 0xf0935ccf4391fe93l,0x866b260f03811d40l,0x792047b99f7b9abel, 26514 0xb1600bc88ee42d84l }, 26515 0 }, 26516 /* 25 << 240 */ 26517 { { 0x2d97b3db7768a85fl,0x2b78f6334287e038l,0x86c947676f892bb1l, 26518 0x920bfb1ac0a9c200l }, 26519 { 0x4292f6ec332041b2l,0xa30bb937c9989d54l,0x39f941ebc6d5879el, 26520 0x76a450fcdfdbb187l }, 26521 0 }, 26522 /* 27 << 240 */ 26523 { { 0x31256089ee430db6l,0xaece9bd8f6836f56l,0x484cfc4bfb85a046l, 26524 0xee1e3e2c1599b2b9l }, 26525 { 0x7e3c38903d122eafl,0xaa940ce0c770556cl,0x4802d6631b08fae8l, 26526 0xb08a85807f69f8bal }, 26527 0 }, 26528 /* 28 << 240 */ 26529 { { 0x70ed0a0405411eael,0x60deb08f16494c66l,0x8cf20fc6133797bbl, 26530 0x3e30f4f50c6bc310l }, 26531 { 0x1a677c29749c46c7l,0xfe1d93f4f11e981cl,0x937303d82e3e688bl, 26532 0x01aef5a7a6aa9e85l }, 26533 0 }, 26534 /* 29 << 240 */ 26535 { { 0x4902f495b959b920l,0x13b0fdbdfca2d885l,0x41cbd9e7b6a2f0fal, 26536 0xf9bdf11056430b87l }, 26537 { 0xd705a223954d19b9l,0x74d0fc5c972a4fdel,0xcbcbfed6912977eal, 26538 0x870611fdcc59a5afl }, 26539 0 }, 26540 /* 31 << 240 */ 26541 { { 0xf4f19bd04089236al,0x3b206c12313d0e0bl,0x73e70df303feaeb2l, 26542 0x09dba0eb9bd1efe0l }, 26543 { 0x4c7fd532fc4e5305l,0xd792ffede93d787al,0xc72dc4e2e4245010l, 26544 0xe7e0d47d0466bbbdl }, 26545 0 }, 26546 /* 33 << 240 */ 26547 { { 0x549c861983e4f8bbl,0xf70133fbd8e06829l,0xc962b8e28c64e849l, 26548 0xad87f5b1901e4c25l }, 26549 { 0xd005bde568a1cab5l,0x6a591acf0d2a95bal,0x728f14ce30ebcae4l, 26550 0x303cec99a3459b0fl }, 26551 0 }, 26552 /* 34 << 240 */ 26553 { { 0x62e62f258350e6bcl,0x5a5ea94d96adba1fl,0x36c2a2844a23c7b3l, 26554 0x32f50a72992f5c8bl }, 26555 { 0x55d685204136c6afl,0x1aafd32992794f20l,0x69f5d820b59aa9bfl, 26556 0x218966a8570e209al }, 26557 0 }, 26558 /* 35 << 240 */ 26559 { { 0xf3204feb2f9a31fcl,0x77f33a360429f463l,0xfb9f3a5a59a1d6a7l, 26560 0x4445a2e93b1a78e0l }, 26561 { 0xc77a9b6fd58e32d3l,0xa44e23c8302e6390l,0x7d8e00b4c0f7bcb0l, 26562 0xd2e2237b0ffa46f4l }, 26563 0 }, 26564 /* 36 << 240 */ 26565 { { 0xb3046cb13c8ea6d3l,0xf0151b5efce2f445l,0xa968e60b55e5715el, 26566 0x39e52662587dce61l }, 26567 { 0xfde176e0b7de2862l,0x298d83e68e8db497l,0x1042136773641bfbl, 26568 0xd72ac78d36e0bb0dl }, 26569 0 }, 26570 /* 37 << 240 */ 26571 { { 0x2cabb94fff6b8340l,0xf425a35a21771acbl,0x564fec3d12c4a758l, 26572 0x57a61af39ba8f281l }, 26573 { 0x5807e78c97e9a71dl,0x991d9be75b8314e6l,0x1cd90b16ec4133b9l, 26574 0xff043efa0f1ac621l }, 26575 0 }, 26576 /* 39 << 240 */ 26577 { { 0xea6e5527d7e58321l,0xfb95c13c04056ff1l,0x9447361f2fc4e732l, 26578 0x63cbc655786d0154l }, 26579 { 0x302c0d668610fb71l,0xbf692d6920d06613l,0x8465b74b4be8355al, 26580 0xcc883c95c31356b7l }, 26581 0 }, 26582 /* 40 << 240 */ 26583 { { 0x4ab6e919b33eabcal,0xb58f0998a1acacbfl,0xa747e5782ddbc28fl, 26584 0xf9dd04ca59866cbcl }, 26585 { 0x084c062ff7a0073fl,0x6d22acdfb577fc38l,0x0870ee08eacd907cl, 26586 0x710b4b266c9fcf95l }, 26587 0 }, 26588 /* 41 << 240 */ 26589 { { 0xa99546faf1c835a7l,0x1514a5a30d59f933l,0x1f6ad0f81bedd730l, 26590 0x24de76287b528aaal }, 26591 { 0x4d9e7845c02fff87l,0xba74f8a942c79e67l,0x5bf5015f476e285bl, 26592 0x0b1a5d8b1b93b364l }, 26593 0 }, 26594 /* 43 << 240 */ 26595 { { 0x8c7c0d7ff839819fl,0xc82b819827a95965l,0xce7294d377270519l, 26596 0xfb508d6cad47aff7l }, 26597 { 0xf6de15431035076al,0x697d60ac5dd465c6l,0x88d771b8a76dcd26l, 26598 0x8c7ce11ab10c9c44l }, 26599 0 }, 26600 /* 44 << 240 */ 26601 { { 0x215ea44a08216060l,0xccfa18a187996cf6l,0xccfb2483f7eccdd2l, 26602 0x07aa601ad453c66al }, 26603 { 0xd43cf263cffee9e2l,0x230bc099718f69bfl,0xc43de21300c193e8l, 26604 0x94cf251799c8746fl }, 26605 0 }, 26606 /* 45 << 240 */ 26607 { { 0x4785d7f87d1320c5l,0x84bed8c3d0771dcbl,0xff28044d22254edbl, 26608 0x2e5992a445f71504l }, 26609 { 0xcb92695b72bbf5cdl,0x9bcbde35c42422e5l,0x856594fd1d07ed86l, 26610 0x3aaf0b717716b4ffl }, 26611 0 }, 26612 /* 46 << 240 */ 26613 { { 0x3edf24f9eebed405l,0x9e3141360eccb503l,0xf7704c25b85c2bc2l, 26614 0x4cb7c1de9a3247eel }, 26615 { 0x798ac8f2f0b507c5l,0x6e6217206851bbf1l,0xc0b89398c0d9ed16l, 26616 0xf7d5d2a09f20728fl }, 26617 0 }, 26618 /* 47 << 240 */ 26619 { { 0x7358a94a19f0ededl,0x5e08c4c3e32ccfbbl,0x84a8eeeb0089f071l, 26620 0xdaf0514c41fc436el }, 26621 { 0x30fe216f310309afl,0xe72f77bd564e6fc9l,0xe7ef3bddfdc59fd5l, 26622 0xd199b1c9a8e1169cl }, 26623 0 }, 26624 /* 48 << 240 */ 26625 { { 0xb9dc857c5b0f7bd4l,0x6990c2c9108ea1cdl,0x84730b83b984c7a9l, 26626 0x552723d2eab18a78l }, 26627 { 0x9752c2e2919ba0f9l,0x075a3bd94bf40890l,0x71e52a04a6d98212l, 26628 0x3fb6607a9f18a4c8l }, 26629 0 }, 26630 /* 49 << 240 */ 26631 { { 0xa0305d01e8c3214dl,0x025b3cae8d51cea3l,0xeeaf7ab239923274l, 26632 0x51179407c876b72cl }, 26633 { 0xcf0241c7d4549a68l,0xffae7f4c793dab3dl,0xdfb5917b4bdf2280l, 26634 0xcf25c870a652e391l }, 26635 0 }, 26636 /* 51 << 240 */ 26637 { { 0xb1345466b922e1c8l,0xae42f46ab5bf8a34l,0x1e1ab6053310e604l, 26638 0x64093cd9b4d7a658l }, 26639 { 0x5d3b385ab3d9242cl,0x2225b99ae56f8ec7l,0x19a8cbfc9a916e11l, 26640 0x11c5df831f957c03l }, 26641 0 }, 26642 /* 52 << 240 */ 26643 { { 0x09f1d04af381147bl,0x7be13628b26b345fl,0xd8371966d1c60b78l, 26644 0xf1743c2c5d91808fl }, 26645 { 0x8a2966acafc71cc3l,0x0ba9702efdfc24c3l,0x60c80158e6fbb539l, 26646 0x58eaee49812c32f4l }, 26647 0 }, 26648 /* 53 << 240 */ 26649 { { 0x31af7f5ee89d0b84l,0xa776dada6caa110bl,0xd67b7891df6d54ddl, 26650 0x831613cab82b8a5cl }, 26651 { 0x7a4eb86ef020af6dl,0x2914fd11bd795a7bl,0xc038a273fcb54a17l, 26652 0x6b2dc8e18219cc75l }, 26653 0 }, 26654 /* 55 << 240 */ 26655 { { 0x031fc875464ba9b5l,0xe268cf45bd812dd3l,0x443f57defbfb664al, 26656 0xfd1a38544e28c2fal }, 26657 { 0xb8799782cb96515bl,0xa12d3e3f1138c95dl,0x0cc5ee117748ee57l, 26658 0x6ab167cf955a7dfcl }, 26659 0 }, 26660 /* 57 << 240 */ 26661 { { 0x0d54aaca4dc1c74fl,0x74af1807bf2e0d61l,0x151254f87aebe0f1l, 26662 0x4072f38bf6376095l }, 26663 { 0x31ebe17a26646abfl,0xdc8cb6b40ecc1282l,0x4f6326bbbc095a66l, 26664 0x37dad65a0363636dl }, 26665 0 }, 26666 /* 59 << 240 */ 26667 { { 0xc851860a70f8c15al,0xb2d4555488368381l,0xbfd46e197019c7b6l, 26668 0xa1a9b12f6bb6f33bl }, 26669 { 0xecfd5fe6f170c82bl,0x6d58bb52d601afc3l,0xb8b3de15fe6eb102l, 26670 0xad07336886a47964l }, 26671 0 }, 26672 /* 60 << 240 */ 26673 { { 0x89f514c91911840fl,0xc9fa6b504cc106bcl,0x70a97f0dfe55b4f1l, 26674 0xada6306be5888609l }, 26675 { 0xa9437881c6dc8d15l,0x0fc0f5368411f3dfl,0xd26162087a913dd2l, 26676 0x4fe1c7c4e92848cdl }, 26677 0 }, 26678 /* 61 << 240 */ 26679 { { 0xaa18eb262e07383dl,0xb948c35c34e90f3dl,0x95e97f81d3653565l, 26680 0x4a821a2687b5b75dl }, 26681 { 0x87b4d81c892db882l,0xa69e65d689f3bfadl,0xe475f532eb371cacl, 26682 0xd8cc23fa17194d5dl }, 26683 0 }, 26684 /* 63 << 240 */ 26685 { { 0x3fc0052ad789d484l,0xe8c67aac29324323l,0x133fd07cf54c43d3l, 26686 0xd4a0848fb91d4faal }, 26687 { 0xf683ce065ea5098fl,0xe84348f9887c8a76l,0x38f8c2cf79b224b6l, 26688 0x327e4c534a818cb1l }, 26689 0 }, 26690 /* 64 << 240 */ 26691 { { 0xb6d92a7f3e5f9f11l,0x9afe153ad6cb3b8el,0x4d1a6dd7ddf800bdl, 26692 0xf6c13cc0caf17e19l }, 26693 { 0x15f6c58e325fc3eel,0x71095400a31dc3b2l,0x168e7c07afa3d3e7l, 26694 0x3f8417a194c7ae2dl }, 26695 0 }, 26696 /* 65 << 240 */ 26697 { { 0x0c9e9237d5f812bcl,0xdae5b7e9595f02e5l,0x5ec1dece42b1e9a8l, 26698 0x506a6ef8e527a685l }, 26699 { 0xe3049290236af251l,0x6322dd1bf81970acl,0x1459d39c516d5e61l, 26700 0x672f502d9455b694l }, 26701 0 }, 26702 /* 71 << 240 */ 26703 { { 0xf83788e06b228af2l,0xaafc823911f596fal,0x6d47fa592f0fcb13l, 26704 0x0b7af65f1c99c5d4l }, 26705 { 0xbc4c185dca961e6fl,0xec02b09f158481a4l,0x4bbfd9f31423fdd4l, 26706 0x0ff44a53b619644bl }, 26707 0 }, 26708 /* 77 << 240 */ 26709 { { 0x23e255a3ea3f59d8l,0x1f4a47a8261ac30bl,0x346bf409c8faf0b3l, 26710 0xd13e73fbc03a226bl }, 26711 { 0x670ddc792fe8a79bl,0x335fa172f1aac412l,0xe2347de1a5ceff20l, 26712 0x66e02c73381130f2l }, 26713 0 }, 26714 /* 83 << 240 */ 26715 { { 0xa6b874c51db717cdl,0x027d318ab00f160bl,0x578f89f49be791afl, 26716 0x659ef2f01f3b5e9bl }, 26717 { 0xa0c593033835d84cl,0xb71e261fdb6f9a60l,0x65837c7f44b7813fl, 26718 0xea776163ea4bcc96l }, 26719 0 }, 26720 /* 89 << 240 */ 26721 { { 0x208234118df3f15fl,0xe0514d4694f341acl,0xdc66282d6486d704l, 26722 0xd5fb354ad2548389l }, 26723 { 0xf3e98d72df273295l,0x27ded7fa50cd09fcl,0x4f486af3c5c1c169l, 26724 0xe51044150aa41ba3l }, 26725 0 }, 26726 /* 95 << 240 */ 26727 { { 0x66b14d296fce0aecl,0x35fe5e60c8915ceal,0x06a023b736c5da39l, 26728 0x0977c9f0404e932fl }, 26729 { 0x1dd6f95db54866del,0xe5ec79359387430cl,0x98dee57b5ef42e67l, 26730 0x1707f01912ed3ad0l }, 26731 0 }, 26732 /* 101 << 240 */ 26733 { { 0xeb3abdedeec82495l,0x587a696e764a41c7l,0x13fdcce2add1a6a3l, 26734 0x299a0d43286b2162l }, 26735 { 0x2c4e71e18131f1b4l,0x48f0e806ada3d04fl,0x91d2de80c57491b2l, 26736 0x1b1266236cc355cbl }, 26737 0 }, 26738 /* 107 << 240 */ 26739 { { 0xdc28afe5a6d44444l,0xb5ad8d3cfe0b947bl,0x50c6126c96ce9fb9l, 26740 0x5384a998d1fc7d39l }, 26741 { 0xa43ff8898788f51cl,0x30359593a6bc7b87l,0x3e1691dccc0d019al, 26742 0xda0ef5ad7943abcdl }, 26743 0 }, 26744 /* 113 << 240 */ 26745 { { 0x5bc58b6f020b5cd7l,0x9098e202e103ff4el,0xc1f1a3d9f6fce7c7l, 26746 0xf9dc32a856090ccel }, 26747 { 0x4c7d2520a9cc3b09l,0x98d47b5dd8c4dfcel,0xdcee788297e689b4l, 26748 0xe5eec71815f982b9l }, 26749 0 }, 26750 /* 116 << 240 */ 26751 { { 0xff154bb8a1e1538cl,0xb9883276f7dcfae9l,0x1ac0a4d2c1c8cba4l, 26752 0x511a54cc76e6b284l }, 26753 { 0xe2da436f00011f6dl,0x4d357a190f43a8adl,0xf36899c95458655bl, 26754 0xe5f75c768d613ed9l }, 26755 0 }, 26756 /* 119 << 240 */ 26757 { { 0x15b4af1d93f12ef8l,0x3f4c5868fd032f88l,0x39f67a08f27d86bdl, 26758 0x2f551820da32db6bl }, 26759 { 0x72fe295ac2c16214l,0x39927c381a2cf9afl,0x8dda23d6b1dc1ae7l, 26760 0x1209ff3ed32071d4l }, 26761 0 }, 26762 /* 125 << 240 */ 26763 { { 0x861fdceb9a3c6c6fl,0x76d7a01386778453l,0xbf8d147cd5e422cbl, 26764 0xd16f532e51772d19l }, 26765 { 0x72025ee2570d02cdl,0xe8e7737be80c7664l,0x81b7d56c334a8d8fl, 26766 0x42477a0ff1b79308l }, 26767 0 }, 26768 }, 26769 { 26770 /* 0 << 248 */ 26771 { { 0x00, 0x00, 0x00, 0x00 }, 26772 { 0x00, 0x00, 0x00, 0x00 }, 26773 1 }, 26774 /* 1 << 248 */ 26775 { { 0xf306a3c8ee3c76cbl,0x3cf11623d32a1f6el,0xe6d5ab646863e956l, 26776 0x3b8a4cbe5c005c26l }, 26777 { 0xdcd529a59ce6bb27l,0xc4afaa5204d4b16fl,0xb0624a267923798dl, 26778 0x85e56df66b307fabl }, 26779 0 }, 26780 /* 3 << 248 */ 26781 { { 0x896895959884aaf7l,0xb1959be307b348a6l,0x96250e573c147c87l, 26782 0xae0efb3add0c61f8l }, 26783 { 0xed00745eca8c325el,0x3c911696ecff3f70l,0x73acbc65319ad41dl, 26784 0x7b01a020f0b1c7efl }, 26785 0 }, 26786 /* 4 << 248 */ 26787 { { 0x9910ba6b23a5d896l,0x1fe19e357fe4364el,0x6e1da8c39a33c677l, 26788 0x15b4488b29fd9fd0l }, 26789 { 0x1f4392541a1f22bfl,0x920a8a70ab8163e8l,0x3fd1b24907e5658el, 26790 0xf2c4f79cb6ec839bl }, 26791 0 }, 26792 /* 5 << 248 */ 26793 { { 0x262143b5224c08dcl,0x2bbb09b481b50c91l,0xc16ed709aca8c84fl, 26794 0xa6210d9db2850ca8l }, 26795 { 0x6d8df67a09cb54d6l,0x91eef6e0500919a4l,0x90f613810f132857l, 26796 0x9acede47f8d5028bl }, 26797 0 }, 26798 /* 7 << 248 */ 26799 { { 0x45e21446de673629l,0x57f7aa1e703c2d21l,0xa0e99b7f98c868c7l, 26800 0x4e42f66d8b641676l }, 26801 { 0x602884dc91077896l,0xa0d690cfc2c9885bl,0xfeb4da333b9a5187l, 26802 0x5f789598153c87eel }, 26803 0 }, 26804 /* 9 << 248 */ 26805 { { 0xb19b1c4fca66eca8l,0xf04a20b55663de54l,0x42a29a33c223b617l, 26806 0x86c68d0d44827e11l }, 26807 { 0x71f90ddeadba1206l,0xeeffb4167a6ceeeal,0x9e302fbac543e8afl, 26808 0xcf07f7471aa77b96l }, 26809 0 }, 26810 /* 10 << 248 */ 26811 { { 0xcf57fca29849e95bl,0x96e9793ed510053cl,0x89fa443d07d3e75el, 26812 0xfe2bc235e52800a0l }, 26813 { 0x1c208b8c0ac7e740l,0xb5852a49e7222263l,0x217e4005e541e592l, 26814 0xee52747dc960b0e1l }, 26815 0 }, 26816 /* 11 << 248 */ 26817 { { 0x5fd7cafb475952afl,0x23a6d71954a43337l,0xa83a7523b1617941l, 26818 0x0b7f35d412b37dd4l }, 26819 { 0x81ec51292ae27eafl,0x7ca92fb3318169dfl,0xc01bfd6078d0875al, 26820 0xcc6074e3c99c436el }, 26821 0 }, 26822 /* 13 << 248 */ 26823 { { 0x4ca6bdebf57912b8l,0x9a17577e98507b5al,0x8ed4ab7759e51dfcl, 26824 0x103b7b2a470f5a36l }, 26825 { 0x0c8545ac12553321l,0xab5861a760482817l,0xf4b5f602b9b856cfl, 26826 0x609955787adf2e5fl }, 26827 0 }, 26828 /* 15 << 248 */ 26829 { { 0x60ce25b1ee5cb44fl,0xddcc7d182c2d7598l,0x1765a1b301847b5cl, 26830 0xf5d9c3635d0d23b7l }, 26831 { 0x42ff1ba7928b65d0l,0x587ac69d6148e043l,0x3099be0dd320390bl, 26832 0xa7b88dfc4278329fl }, 26833 0 }, 26834 /* 16 << 248 */ 26835 { { 0x80802dc91ec34f9el,0xd8772d3533810603l,0x3f06d66c530cb4f3l, 26836 0x7be5ed0dc475c129l }, 26837 { 0xcb9e3c1931e82b10l,0xc63d2857c9ff6b4cl,0xb92118c692a1b45el, 26838 0x0aec44147285bbcal }, 26839 0 }, 26840 /* 17 << 248 */ 26841 { { 0x7685bb9e0ba4e0b7l,0x330a7ebc5e58c29bl,0xbc1d9173e8a3797al, 26842 0x7c506a16ea60f86cl }, 26843 { 0x9defb9248c099445l,0xcf1ddcc0256df210l,0x4844ce293d07e990l, 26844 0x92318e37e2628503l }, 26845 0 }, 26846 /* 19 << 248 */ 26847 { { 0x61acd597fdf968d7l,0x7321a8b26598c381l,0xcb86a2809f448a0cl, 26848 0x38534a01855df66al }, 26849 { 0xc119ec141e29037fl,0xe23c20ad0b42ba67l,0xefb1c4e033fb4f22l, 26850 0xf088358f445a5032l }, 26851 0 }, 26852 /* 21 << 248 */ 26853 { { 0x2d73f5d1b8475744l,0xcc297e0a9d399b06l,0xa8c61d4038d3df06l, 26854 0xacc6e8651a2d27a0l }, 26855 { 0x63dd6f6230153bf2l,0x6b23ad7bd73b83b7l,0x25382bf767ff7dcdl, 26856 0x7e268c8fcf7ce2d1l }, 26857 0 }, 26858 /* 23 << 248 */ 26859 { { 0x4b9161c3cb2ebef1l,0x6009716b669ed801l,0x97c65219aacefe44l, 26860 0xde13597d71aae4b5l }, 26861 { 0x3a077a816141d651l,0xe1b4e80129f876eal,0x729aed6d5c00c96cl, 26862 0x0c6f404374cc645el }, 26863 0 }, 26864 /* 25 << 248 */ 26865 { { 0x22c51812df5a66e1l,0x1c8069c9ae7dedeal,0xcff9d86f0eea5180l, 26866 0x676dbd6f44235ddal }, 26867 { 0xa53f01383db1ad42l,0xd079e571bcf19029l,0x1e37b9ecfab0cf82l, 26868 0x93ae35ed4844e9c4l }, 26869 0 }, 26870 /* 27 << 248 */ 26871 { { 0xdaee55a543756358l,0x0ace18d41b2d3f89l,0x3391fa36824dd7d4l, 26872 0x7b9963d1770e5f3fl }, 26873 { 0xc1fb9a78c94f724dl,0x94ff86fe76c4da6bl,0xb5d928c64170609bl, 26874 0xc9372becfb015a9fl }, 26875 0 }, 26876 /* 28 << 248 */ 26877 { { 0x9c34b650e16e05e9l,0x965a774094e74640l,0xa3fd22fbcea3f029l, 26878 0x1eb6a9688f95277cl }, 26879 { 0x2520a63d7bad84f6l,0xad917201f58f2feel,0xea92c1669b840d48l, 26880 0x12109c4aacef5cbdl }, 26881 0 }, 26882 /* 29 << 248 */ 26883 { { 0xd85850d0d407a252l,0x6fa3b14de63909d4l,0x2ff9f6593e0fba69l, 26884 0x7f9fd2a2d1b2cd0bl }, 26885 { 0x611233d745ad896al,0xfe4211648df850f9l,0x7808832399e32983l, 26886 0x4b040859dee6741dl }, 26887 0 }, 26888 /* 31 << 248 */ 26889 { { 0x7dd2afd456e1ed5cl,0xd48429ec41ba4992l,0x97a02188968bab27l, 26890 0x09ecf813e63c4168l }, 26891 { 0xf4ac65e77288b10cl,0x10630ab2afac7410l,0x4e3e59c3bb049e56l, 26892 0x25972fff40fea0b1l }, 26893 0 }, 26894 /* 33 << 248 */ 26895 { { 0xfd8363da98365c18l,0x8aa57b1a8d47bf91l,0x423dce57695f4dd6l, 26896 0xfccf54d4cc17f034l }, 26897 { 0x8fdba27c3610ea51l,0xcc0a06d654306b06l,0xb97a121c389b9dfdl, 26898 0x7dbb90eb1ed0ca42l }, 26899 0 }, 26900 /* 34 << 248 */ 26901 { { 0xd32d7cec0094e84cl,0x862ae25e2ece8f72l,0x8644ef1cdfceb8abl, 26902 0x68a9969c8e225628l }, 26903 { 0xdf209e27b3117876l,0x308a6e1882ba242bl,0xcbd09a659bf0cdb6l, 26904 0x79f2826cc85b9705l }, 26905 0 }, 26906 /* 35 << 248 */ 26907 { { 0x3b36b6bf8f011496l,0xea6acc1a9bcf6ef8l,0x6db132263b101f12l, 26908 0x4fc4e35e3b7585c3l }, 26909 { 0x641de27556eb64c6l,0x9b2834d3f3b08519l,0xebb76a2ba1f44b40l, 26910 0x1b545ccd3cd31677l }, 26911 0 }, 26912 /* 36 << 248 */ 26913 { { 0xab293027aad991c1l,0x598d0bf8849be4b7l,0x8c94a21ab972da90l, 26914 0xada4cfdd7ecfa840l }, 26915 { 0x93d4b9c0fbcec63al,0x7ca617a203219a34l,0x900424eb6a652a55l, 26916 0xaf9346e9eb8562e0l }, 26917 0 }, 26918 /* 37 << 248 */ 26919 { { 0x9681a73d2d8bc904l,0x8b5f9b317b1553bel,0xfb03b874f6bc852fl, 26920 0x8e658fb8cbbec8b0l }, 26921 { 0x9b2ff17bb9e9f9d1l,0xf46e9bf3e8679854l,0x7fbb1323618ed3aal, 26922 0x064a1c5d714ebc3dl }, 26923 0 }, 26924 /* 39 << 248 */ 26925 { { 0xac0bdfc39f0e69dcl,0x71957386ae12f132l,0xa263ef2e6aa90b5bl, 26926 0xa94b152390d42976l }, 26927 { 0xfb2d17741bcdbf7bl,0xba77b77c3a04f72fl,0xa6818ed8ec3e25a1l, 26928 0x2e0e01743733e251l }, 26929 0 }, 26930 /* 40 << 248 */ 26931 { { 0xc3e04d7902381461l,0xb1643ab5911bc478l,0xc92becfa390b3ef2l, 26932 0x54476778acd2f1b6l }, 26933 { 0x8daa0c4d66bf3aafl,0x2bc1287b2c21c65al,0xee182910b5a13ac3l, 26934 0xbb04730090b0790al }, 26935 0 }, 26936 /* 41 << 248 */ 26937 { { 0x8bdd6f35a8540489l,0x788c03e5ee390d4el,0x203323c18f653017l, 26938 0x39953308c4bc0094l }, 26939 { 0x6ee0857118308d0bl,0x70e9f90b450b0002l,0x191662aa8139f145l, 26940 0xd7c5415b62d71124l }, 26941 0 }, 26942 /* 43 << 248 */ 26943 { { 0x41b37d72b927231cl,0xca17b5429e4de13al,0x7bc03469cded2ce3l, 26944 0x961b0ecb4f4560f9l }, 26945 { 0x7c5bd41b43d31fa1l,0x3ed047f643f44dc3l,0x5b02083efe1a4d14l, 26946 0xcc2c66ac18b330bcl }, 26947 0 }, 26948 /* 44 << 248 */ 26949 { { 0x83766947d17d4e0bl,0xc5772beefdc3a47bl,0x765a50db1a6fd0ffl, 26950 0x17f904ba45b0995el }, 26951 { 0xcee643832883487el,0xf56db7f3c270aaedl,0x6738d94f46cb1fd9l, 26952 0xc8fa426a142fd4d5l }, 26953 0 }, 26954 /* 45 << 248 */ 26955 { { 0xc85bef5b5a78efcel,0xaf380c6b0580e41el,0x6c093256a43b8d9bl, 26956 0xed9d07bbea670933l }, 26957 { 0xfdb9a295f1682c6el,0x4cc29a63532b6bb7l,0x21a918f9f8e42dd0l, 26958 0x9ac935ce0edacca0l }, 26959 0 }, 26960 /* 46 << 248 */ 26961 { { 0xbfe48a8ff43daf9dl,0xd7799b31b313c052l,0x46d480d77119c60el, 26962 0x5090d91f0b80bcb9l }, 26963 { 0xc94c4c1e873bd7bfl,0x16e69b4f9915aa0al,0x769be02bb1d5928cl, 26964 0x3fdaf62162e1d85al }, 26965 0 }, 26966 /* 47 << 248 */ 26967 { { 0x03497a57371c1b5cl,0x11e4c0b3552ab6abl,0xf857061f0a169ee7l, 26968 0xc21c6c43e6d1bc66l }, 26969 { 0x706283a82832be7al,0xd35b143299aba62cl,0x7f4da83de9aef62dl, 26970 0x2b7e5fc8723fa4e5l }, 26971 0 }, 26972 /* 48 << 248 */ 26973 { { 0xae485bb72b724759l,0x945353e1b2d4c63al,0x82159d07de7d6f2cl, 26974 0x389caef34ec5b109l }, 26975 { 0x4a8ebb53db65ef14l,0x2dc2cb7edd99de43l,0x816fa3ed83f2405fl, 26976 0x73429bb9c14208a3l }, 26977 0 }, 26978 /* 49 << 248 */ 26979 { { 0xc086e737eb4cfa54l,0x9400e1ad3c44aad9l,0x210bba94336959b4l, 26980 0x08621a809106f0cal }, 26981 { 0x2ae66096c510ee9cl,0x2ba21617fc76a895l,0xc0707f8b0c186f1el, 26982 0x1fe170a3ed0bfe25l }, 26983 0 }, 26984 /* 51 << 248 */ 26985 { { 0x3780fe2084759c5cl,0x716ec626b7050aa7l,0x6a43fb8b84b63bd1l, 26986 0xb01098a039bc449fl }, 26987 { 0x96b3ff8ebb7daa4dl,0x2d146882654a7f01l,0x2500f701dcae6143l, 26988 0xc13d51d01626fd3bl }, 26989 0 }, 26990 /* 52 << 248 */ 26991 { { 0x08ed8febd56daf06l,0x8d98277b4a837f69l,0x9947c636a9b6e05al, 26992 0x58c8a77ac0d58abdl }, 26993 { 0xf45496a45f121e4fl,0x16cd67c71076d3d3l,0xecbd1958e3fb0c5dl, 26994 0xfbe185ec38e1eb47l }, 26995 0 }, 26996 /* 53 << 248 */ 26997 { { 0x65b067eb740216e3l,0x1e19a71479db8760l,0x8d30dca18878de5al, 26998 0x627d03e8aa47c005l }, 26999 { 0x096d58c0d2536c96l,0x232e6a4d69b12c2al,0x850eb8c0e7044bcel, 27000 0xd9cf923bef2ee9a1l }, 27001 0 }, 27002 /* 55 << 248 */ 27003 { { 0x8b301094c8eaee90l,0x9a96950b8330928fl,0x472ba105faccc3bal, 27004 0x00f8620e9153172al }, 27005 { 0x019b8164303fcdf5l,0x614d5c3c41fb4c73l,0x632d98f2c5992f89l, 27006 0xfbeb29d790e2dea5l }, 27007 0 }, 27008 /* 57 << 248 */ 27009 { { 0xefd48b577f91d6e0l,0x8575605595bcf5d4l,0x7677b4a7bb9d891bl, 27010 0xdc9931e9685912c9l }, 27011 { 0x69bca306f31a07c8l,0x3dd729534962a7f0l,0xdcea49cc9d366c2al, 27012 0xce664ba7dc79a57dl }, 27013 0 }, 27014 /* 59 << 248 */ 27015 { { 0x7842d547013ec3b5l,0xa2785ceb433cf990l,0x9d667e5f700ab14al, 27016 0x4b46f362a0f46d55l }, 27017 { 0x152c0e80cc7a3487l,0x7f3a88cef86f5e68l,0x6f950a73f1b2a75fl, 27018 0x9be5b1aa51d24f3bl }, 27019 0 }, 27020 /* 60 << 248 */ 27021 { { 0xaea68626dc4ad4f4l,0x5dc516824ddbc0b6l,0xa76697bd602e9065l, 27022 0xbeeb3ea58c37888el }, 27023 { 0x1ec4a2f214569113l,0xe48b820ca35f4484l,0x9fb560949ae44df2l, 27024 0x6ca1346292cc09fdl }, 27025 0 }, 27026 /* 61 << 248 */ 27027 { { 0x887e0b87bcdc3a36l,0x6b0d617d503dee65l,0x96bda1f6cebcb893l, 27028 0xdc0dd17341e20b3el }, 27029 { 0x812fbacfa6657c11l,0x32492fcbc94a6f4bl,0x854a0bcb6a772123l, 27030 0x1ed573f65d463f31l }, 27031 0 }, 27032 /* 63 << 248 */ 27033 { { 0x22c7ef7bd022cc4dl,0xeec383d61e63b4bcl,0x52e0aaa06502b46fl, 27034 0x9224187ded5e41bfl }, 27035 { 0x3a01f53dd26faf1cl,0x9bc4ee2e4e591d10l,0x10b7a98eea7e4c88l, 27036 0xe521c150e2c1beccl }, 27037 0 }, 27038 /* 64 << 248 */ 27039 { { 0xb618d590b01e6e27l,0x047e2ccde180b2dcl,0xd1b299b504aea4a9l, 27040 0x412c9e1e9fa403a4l }, 27041 { 0x88d28a3679407552l,0x49c50136f332b8e3l,0x3a1b6fcce668de19l, 27042 0x178851bc75122b97l }, 27043 0 }, 27044 /* 65 << 248 */ 27045 { { 0x26f9b9322ed53a71l,0x0bac7348c72ef2e0l,0x7e96001da5c6faf1l, 27046 0x5d43f76dea00eb2dl }, 27047 { 0x1327370f44f1c478l,0x1c83a9ac6bb964c8l,0xa3a9769f76ffbd25l, 27048 0xdf045fb6b04f1bddl }, 27049 0 }, 27050 /* 71 << 248 */ 27051 { { 0x4283898d556b975el,0x6e2301ffe3880361l,0xc6d3b2bbe9198077l, 27052 0xc4799578d21cac02l }, 27053 { 0x11448ff8f784eb7cl,0xb775973fbb81898dl,0x4e51f061519c76b9l, 27054 0xaba1f3ef3cad0393l }, 27055 0 }, 27056 /* 77 << 248 */ 27057 { { 0x59d60c1c9b339830l,0x5af60a44ac32746dl,0x5ac006bc9dea8d80l, 27058 0x4a2a56d97f2b1180l }, 27059 { 0x2032845a46946fc4l,0xe25b911226a3b503l,0xfed89db9a28827d3l, 27060 0xdd2d7e90c6b74593l }, 27061 0 }, 27062 /* 83 << 248 */ 27063 { { 0x9b047a26cda38ecfl,0x6889284f5f6cb442l,0x4d128bcb14753820l, 27064 0x8f9937c160eedd78l }, 27065 { 0xe333bad751ab9127l,0xd31b01c67ace3b19l,0x0732de39d7c0b4bel, 27066 0xad04fa4c649e2b9bl }, 27067 0 }, 27068 /* 89 << 248 */ 27069 { { 0x02e042689d1495bal,0x95dca5a85591b5f8l,0xb10488d856f46c71l, 27070 0x97829baf3590000al }, 27071 { 0xaeda5cb378c9e78al,0x3615873a7ba1c71cl,0x7c9f9f4d4333aa12l, 27072 0x893fab42cea8e6d3l }, 27073 0 }, 27074 /* 95 << 248 */ 27075 { { 0x9eb09fff69aaa09fl,0xf36678a926731322l,0x8be61ee1cafcabafl, 27076 0x77a172f558ddb763l }, 27077 { 0x7e09dfc66471130el,0x7f8909791039771el,0x0e44071d37800b9bl, 27078 0x09123d27fe762d10l }, 27079 0 }, 27080 /* 101 << 248 */ 27081 { { 0xffd455a7a1b7fdd6l,0xb6162cb4dabdffael,0xf859519ec89c0e56l, 27082 0x07406c1b421f2846l }, 27083 { 0x42db24ed9e96ddbbl,0x03bcae092dc5da85l,0x75099cd217aa7493l, 27084 0x8cd1aa4266b8740dl }, 27085 0 }, 27086 /* 107 << 248 */ 27087 { { 0xe94333d5dde7fec3l,0x894fd673745a9be3l,0xaf3d97c725683748l, 27088 0xeaa469a2c9ec165fl }, 27089 { 0xc9a18decdc7abd3bl,0xf059008082717b02l,0x9816374a4fdf4300l, 27090 0x449d3eb74fb5a6cel }, 27091 0 }, 27092 /* 113 << 248 */ 27093 { { 0x7fc983ebd28001a6l,0xeabf5276dae74b6bl,0x50adb67d742ed0a5l, 27094 0x1d2ad363650e1446l }, 27095 { 0x5a564253d122f5d0l,0x7e5aefc7e30471del,0xdc64cbb3e5dc2f2cl, 27096 0xe645b9fa9437be4el }, 27097 0 }, 27098 /* 116 << 248 */ 27099 { { 0x0f58cec54e27d357l,0x08dcf2b70004539el,0xb1ead64104f96709l, 27100 0x350fed185a914c72l }, 27101 { 0x44f43523c5147854l,0x45f8b46f46d04ac7l,0x62c306869a449d51l, 27102 0xaacc0f0d9e66d9a3l }, 27103 0 }, 27104 /* 119 << 248 */ 27105 { { 0x94cb62e5bdd61b63l,0xe6ce5b5104a0ec57l,0x0461cb95f0bda8a4l, 27106 0xca2d6220cbadfe8fl }, 27107 { 0x6c19bdf03c1ad65el,0x774a49bae04239d5l,0xf78cb7404a2fd59dl, 27108 0xaebf90ed66a09130l }, 27109 0 }, 27110 /* 125 << 248 */ 27111 { { 0x10e4074857cc8d54l,0x29985831918e3cf9l,0x3d87def9f2e344eel, 27112 0x8899992c68977860l }, 27113 { 0xbdc8d73b210f3c50l,0x98aa042fa9857f46l,0x76a34daf6c71357fl, 27114 0x086289d3200bcb6dl }, 27115 0 }, 27116 }, 27117 { 27118 /* 0 << 256 */ 27119 { { 0x00, 0x00, 0x00, 0x00 }, 27120 { 0x00, 0x00, 0x00, 0x00 }, 27121 1 }, 27122 /* 1 << 256 */ 27123 { { 0xb4e370af3aeac968l,0xe4f7fee9c4b63266l,0xb4acd4c2e3ac5664l, 27124 0xf8910bd2ceb38cbfl }, 27125 { 0x1c3ae50cc9c0726el,0x15309569d97b40bfl,0x70884b7ffd5a5a1bl, 27126 0x3890896aef8314cdl }, 27127 0 }, 27128 /* 3 << 256 */ 27129 { { 0x996884f5903fa271l,0xe6da0fd2b9da921el,0xa6f2f2695db01e54l, 27130 0x1ee3e9bd6876214el }, 27131 { 0xa26e181ce27a9497l,0x36d254e48e215e04l,0x42f32a6c252cabcal, 27132 0x9948148780b57614l }, 27133 0 }, 27134 /* 4 << 256 */ 27135 { { 0xab41b43a43228d83l,0x24ae1c304ad63f99l,0x8e525f1a46a51229l, 27136 0x14af860fcd26d2b4l }, 27137 { 0xd6baef613f714aa1l,0xf51865adeb78795el,0xd3e21fcee6a9d694l, 27138 0x82ceb1dd8a37b527l }, 27139 0 }, 27140 /* 5 << 256 */ 27141 { { 0x4a665bfd2f9fd51al,0x7f2f1fe2481b97f7l,0xcad05d69ad36ce50l, 27142 0x314fc2a4844f4dedl }, 27143 { 0xd5593d8cb55fc5c6l,0xe3510ce8bfb1e23dl,0xf9b7be6937453ccel, 27144 0xd3541b7969fae631l }, 27145 0 }, 27146 /* 7 << 256 */ 27147 { { 0x711b8a4176a9f05dl,0x06ca4e4b9011d488l,0x543bc62ba248a65el, 27148 0x017535ffc9290894l }, 27149 { 0x840b84ce406851d7l,0xafa3acdf90e960b4l,0xac3394af7128fd34l, 27150 0x54eb4d5b2ac0f92cl }, 27151 0 }, 27152 /* 9 << 256 */ 27153 { { 0x3549a0f14df48fecl,0x6ae7b1eec239f83al,0x001dcf253eb90ff3l, 27154 0x02ff0f02581e90edl }, 27155 { 0x72921d8ca103dcefl,0x2c513c3c5876293el,0xc07064ca6b68875el, 27156 0x7198d44653b9537cl }, 27157 0 }, 27158 /* 10 << 256 */ 27159 { { 0x58349b77685e089bl,0x1c678441219b7b8cl,0xba8da91f61e2e20dl, 27160 0xf9c50b8c309fd4e6l }, 27161 { 0x99b0164996d0ef64l,0xac334ded60cdb63al,0x6b9ada19fb0bce4fl, 27162 0x39dc9375c7896377l }, 27163 0 }, 27164 /* 11 << 256 */ 27165 { { 0x068dda8b7e1bc126l,0x77c7c58176243a21l,0xcc8ba55c875f9dael, 27166 0xdde7afe2ce469f95l }, 27167 { 0xde2a15f5e9523b85l,0x447512c6d85674ael,0x5691f89e12c6c20cl, 27168 0xd64ef40e0fae4513l }, 27169 0 }, 27170 /* 13 << 256 */ 27171 { { 0x10db2041c4d9eb40l,0x420eccb724f03f8al,0x64470fd17d29080el, 27172 0xf66c5b4416e52414l }, 27173 { 0xa32cc70e4ca94031l,0xa67931592c8401bal,0x34f2dc29abfcc58dl, 27174 0x6f340f9a07325d7dl }, 27175 0 }, 27176 /* 15 << 256 */ 27177 { { 0xf55d446b060a52bbl,0x2f33cb9f02939f24l,0x0f27a01bc8953718l, 27178 0x362882917fcd3932l }, 27179 { 0x7485613488ed4436l,0xcfe69e27195f089el,0xd6ab040a8ff10bd8l, 27180 0x9741c5472e4a1623l }, 27181 0 }, 27182 /* 16 << 256 */ 27183 { { 0xc52d8d8b6d55d6a4l,0xc4130fb3be58e8f9l,0x5f55c345e1275627l, 27184 0xb881a03c117042d3l }, 27185 { 0x00a970a53238d301l,0x40d7cf2412a2c4f1l,0xace4a2f5d770ea74l, 27186 0x36a2e587e96940b2l }, 27187 0 }, 27188 /* 17 << 256 */ 27189 { { 0x84793d9fef12d4c8l,0x04b89b152d8a163cl,0x0fdb566fb4a87740l, 27190 0xf7e6e5cf9e595680l }, 27191 { 0xbcb973e41c5cd74el,0xafcb439fe4ed49d8l,0xd5c0820aebbae8eel, 27192 0x23483d836f56e2a2l }, 27193 0 }, 27194 /* 19 << 256 */ 27195 { { 0x91f9b8be5e8ad115l,0xf1fd6a2e225db496l,0xf362d2cf4a444085l, 27196 0x033d9201eea043ebl }, 27197 { 0x1e50c0989951a150l,0x4814fca5cfcf1f94l,0xaf3e8ef41bf82de5l, 27198 0xba0e2991038cff53l }, 27199 0 }, 27200 /* 21 << 256 */ 27201 { { 0x904a41ae5fc373fal,0x235556d61a6a3fc4l,0xe44eb3ea36eeb570l, 27202 0xa4e1b34a26ba5ca6l }, 27203 { 0x210e7c9131180257l,0x2c28669622158b0cl,0xc78b69c783ddd341l, 27204 0xfc05941b294e1750l }, 27205 0 }, 27206 /* 23 << 256 */ 27207 { { 0x70666f51fc167dedl,0x47e9e289fe75b8d1l,0x8a5f59739605a03el, 27208 0x19876a58dd579094l }, 27209 { 0x69a5c8cca964e426l,0xed74a652ccf20306l,0x5c93ae3cf06d31d5l, 27210 0x51922fa2127a8a12l }, 27211 0 }, 27212 /* 25 << 256 */ 27213 { { 0xa18e26f99e3d509el,0xbc296dd2c10814fal,0x5dadd6eeaa24e147l, 27214 0xdba2121a8340f12el }, 27215 { 0xd348e7f3e245ca21l,0x1e45a42978e3eb5bl,0x252bf89c169677bbl, 27216 0xfb33a2564021ac55l }, 27217 0 }, 27218 /* 27 << 256 */ 27219 { { 0x30dc46586e7d72b8l,0x38df46fb0d81c3d6l,0x901bab6e10e84162l, 27220 0x25d7303ff7932801l }, 27221 { 0xe781d5f37500be42l,0x9a7104c3380ff208l,0xfa801181652121a1l, 27222 0xef89f4f18d3bed43l }, 27223 0 }, 27224 /* 28 << 256 */ 27225 { { 0xbe4ae5683594917al,0xef7c1c47a04bf81el,0xa1dc3612046d91a0l, 27226 0x3eee37affb11b338l }, 27227 { 0x7e90278fd03d8f51l,0x3045a6da4fa183c6l,0xb39e573391cd16a9l, 27228 0xc748a504e54e9411l }, 27229 0 }, 27230 /* 29 << 256 */ 27231 { { 0x07804331a1c6ec56l,0x25358e795b347123l,0x1ab9b39acf9432a4l, 27232 0x9628501d0a7881cel }, 27233 { 0x749d58988a46d98el,0x01ea43346a17c321l,0xe2b197f9b1f9160fl, 27234 0x2052c7c07815f2a2l }, 27235 0 }, 27236 /* 31 << 256 */ 27237 { { 0xaa691bfbc57a1a6dl,0x06cae127d737d525l,0x5be04b2f963c7c98l, 27238 0x936b1f5bfc00bc4al }, 27239 { 0x3fed4ac77eda6a34l,0xba6ca7aa2500a438l,0x1e979fa6786c2a75l, 27240 0xa3db26bec13f37d4l }, 27241 0 }, 27242 /* 33 << 256 */ 27243 { { 0x20afae333d7006d1l,0xdcbca6fbbda467d1l,0x2714b3827df4006cl, 27244 0x9abc0510c8e94549l }, 27245 { 0x5b30a6d464c14915l,0xba91d0c35752b44fl,0x7ad9b19bbb389f1fl, 27246 0xe4c7aa04ef7c6e13l }, 27247 0 }, 27248 /* 34 << 256 */ 27249 { { 0x1e24a3f23d12e2b6l,0xf99df403febd6db3l,0x61e580a6b0c8e12fl, 27250 0x819341b7c2bfe085l }, 27251 { 0xd53002d640828921l,0x31e1eb65cea010efl,0xc48d0cfe85b3279fl, 27252 0xb90de69089f35fa5l }, 27253 0 }, 27254 /* 35 << 256 */ 27255 { { 0xa3f6fd3c88ed748fl,0x6d72613af48127b9l,0xe85ed703d1e6f7e5l, 27256 0xbb563db449636f40l }, 27257 { 0x23bae3c9708497bal,0x89dbff163aa65cf4l,0x70861847e6c0850al, 27258 0x5ef19d5d48b2e90cl }, 27259 0 }, 27260 /* 36 << 256 */ 27261 { { 0xab6a1e13107f7bacl,0x83a8bc57972091f5l,0x3c65b454f6dcba41l, 27262 0xd7606ff96abc431dl }, 27263 { 0xa3af9c189bd09971l,0x6ddd3bbf276bad63l,0xd2aba9beab4f0816l, 27264 0x8f13063c151581edl }, 27265 0 }, 27266 /* 37 << 256 */ 27267 { { 0xf9c02364f5761b15l,0x3cfa250afd478139l,0x67d51e7416e26191l, 27268 0x0281bbf65eda396cl }, 27269 { 0xbd38d4d70d1f4510l,0x2032a930edff593el,0x0ab74a0cf2ea4ad7l, 27270 0xb95aa9c3302498d6l }, 27271 0 }, 27272 /* 39 << 256 */ 27273 { { 0x2995495dd7da3c7cl,0x28d579d0a0bb703el,0xabec6afec8288837l, 27274 0x93c34dfd05ab989bl }, 27275 { 0xcc94f05dde5ea3dfl,0xc3e3d4ef90f436e6l,0x32b3dee1cf59dc4el, 27276 0x5eab01635447d9d9l }, 27277 0 }, 27278 /* 40 << 256 */ 27279 { { 0xd31c5e8e2c23464el,0x5bcc382f50cfbde7l,0x6cee3d8da93c3d9bl, 27280 0xbee2948909ee62acl }, 27281 { 0x4848d59c10742b84l,0x2486796fe35e9c84l,0x1a1d9570cd8f391al, 27282 0x839aa0913eedb743l }, 27283 0 }, 27284 /* 41 << 256 */ 27285 { { 0xae02a7ce0f83f369l,0x3b67c56097994835l,0x715def441ae4bbeal, 27286 0x11e764ee59f6b9eel }, 27287 { 0x70c775051c962c3al,0x42811507d937a258l,0x06dbdceed03e6e86l, 27288 0x39a3a7ed48cae79el }, 27289 0 }, 27290 /* 43 << 256 */ 27291 { { 0xa32e729fb220eef8l,0x12d876baf37ac5d7l,0x9376ab45105a7f34l, 27292 0xb422331a4deb7275l }, 27293 { 0x6ea07fb7686dea5el,0xba67ed3e1d8e32c9l,0x5ae52632bbc6bb9cl, 27294 0xdca55b86d1397575l }, 27295 0 }, 27296 /* 44 << 256 */ 27297 { { 0xd9183f74378200b1l,0xe5ea1645762f5605l,0x78b42e2f7bd6290fl, 27298 0xa0bdfccc07fa0899l }, 27299 { 0x2f92ea52dacda629l,0x810b4e6c48de27e2l,0x013d8587d9d1250dl, 27300 0xc153d519dd5141d5l }, 27301 0 }, 27302 /* 45 << 256 */ 27303 { { 0x8f1f6cb5b8f1d719l,0xa9abc27b04e15a4el,0xc0d944a92ad42296l, 27304 0x69ecc877f3d2b0e5l }, 27305 { 0xec60dbea16a5581al,0x2a0ead5fb85130d6l,0x7b3d2ebb6fddac23l, 27306 0x06213269ac448663l }, 27307 0 }, 27308 /* 46 << 256 */ 27309 { { 0xe1074008ac11e180l,0xdff3339c14b8f830l,0x136e22be636504f3l, 27310 0xb07ae98aa09c5c4cl }, 27311 { 0x9b0a0517192168e9l,0x39e09fac86ad0865l,0x24f90705adb08d41l, 27312 0x9c699cc759d3be24l }, 27313 0 }, 27314 /* 47 << 256 */ 27315 { { 0xd9e16551907e36b0l,0x57f24b6caf91cb5al,0xbdb7dfdb062edae4l, 27316 0x99e3bffe4b85f424l }, 27317 { 0x250774f4b2961ba7l,0xe7c0f2386d993c51l,0xcd0aae29f559b4bdl, 27318 0x3b12893a09a6859bl }, 27319 0 }, 27320 /* 48 << 256 */ 27321 { { 0xac177eb985ae12c3l,0x8e6cb5cc6cf76537l,0x134abb19f265f9e3l, 27322 0xc37309b71ba3f55dl }, 27323 { 0x570833b4392d564bl,0xaa273a27d8c22f00l,0x9ba6b6276006773al, 27324 0x2156c94f0a16c092l }, 27325 0 }, 27326 /* 49 << 256 */ 27327 { { 0x2be0436b408e1258l,0xb179a2e34f47f121l,0x140b948fa42d3cfcl, 27328 0x96649c6700d2b4e6l }, 27329 { 0x2bf934c7d08a4b34l,0x371c770136b472ddl,0x36297876e06adc73l, 27330 0x59e0d8251c3e6558l }, 27331 0 }, 27332 /* 51 << 256 */ 27333 { { 0x9368cfd304a8bc81l,0x145249d4c49e58c7l,0x8c7ac1891392be01l, 27334 0x58cbcb5fbc7b0903l }, 27335 { 0x502218a1a0377b0al,0x5c17eb8afb625836l,0x845c09ef349f4d26l, 27336 0x15fdeb2554ddce85l }, 27337 0 }, 27338 /* 52 << 256 */ 27339 { { 0xf773535a64e8344dl,0xb8486a33d0dbabe6l,0x43c2df99b578862dl, 27340 0xcead29a11a39820el }, 27341 { 0x3e5466fe63134d63l,0xc37ea88fdf43a104l,0x3b34ac34bbaacb5al, 27342 0x8281c240bc20be5al }, 27343 0 }, 27344 /* 53 << 256 */ 27345 { { 0x55113d5e0f8dec77l,0xdfe59f251d7e1543l,0x3b2837e0a63a849al, 27346 0xdfbdb8b67a5691afl }, 27347 { 0x8dd6faf0bd4cf444l,0x28b2bdfaab128b6cl,0x44af3ee24b1098ebl, 27348 0xbbf328ebe50b2d02l }, 27349 0 }, 27350 /* 55 << 256 */ 27351 { { 0xf231b1f4e4e6151al,0x6ac7130413258c6al,0x6f9cb1c1a09b9f86l, 27352 0xbfc9291ee52ed880l }, 27353 { 0x2a7d8230bea258a2l,0xd52a0da6baf386acl,0x5166764b3af00b7el, 27354 0x84792b043c985be2l }, 27355 0 }, 27356 /* 57 << 256 */ 27357 { { 0x914ca588a906d9e4l,0xb4e4e86abc27a876l,0x97e6ed27724324f2l, 27358 0xda7e9aa5c0b87d2cl }, 27359 { 0xafccbe6b33a56f84l,0x69e8fd4ac892d90al,0xb47512910bb5457fl, 27360 0xad65e4d05cb136fal }, 27361 0 }, 27362 /* 59 << 256 */ 27363 { { 0xb09974d2fd679a1bl,0x17abc2a54578faf0l,0xe7da92828c830388l, 27364 0x7e455d8b0edf6146l }, 27365 { 0xdff3b2f0c324bdb6l,0xe7a1718769f4a4f9l,0xfb4e0b3129c500a4l, 27366 0x1ed50799a09c5a07l }, 27367 0 }, 27368 /* 60 << 256 */ 27369 { { 0x6b669496c679d9f9l,0x3b741f36e78f0830l,0xf99d4857eb3f9e53l, 27370 0x41be594276f7d4ael }, 27371 { 0x75f44d57c09a112bl,0xa5139fd68475eeb7l,0xa4560cd5c6bc9df6l, 27372 0x8ce2c4cf50845434l }, 27373 0 }, 27374 /* 61 << 256 */ 27375 { { 0x96b515c32b3cb0a6l,0x65836de3930d5344l,0xfb032d5b00e6d403l, 27376 0x2648301843c93bd1l }, 27377 { 0xfc4525dd4b572363l,0x12b7923e7b28ab5cl,0xf376b633e22ac5e6l, 27378 0xd6ff6582e30b4707l }, 27379 0 }, 27380 /* 63 << 256 */ 27381 { { 0x8bdce75c83b09e07l,0x64228b19227717c4l,0xeae8f8a2dc6a1f02l, 27382 0x1081031be72f3b6dl }, 27383 { 0xba0f876072c3f736l,0xde38a0c5246a28adl,0x0b116fe08596c412l, 27384 0xb9e37be3fa135d11l }, 27385 0 }, 27386 /* 64 << 256 */ 27387 { { 0x09800dc1b48d4168l,0xa740b282bfee87a2l,0x80c6b75dc94a547al, 27388 0x8cb622f0099c1985l }, 27389 { 0xe6c789631467e05dl,0x027b658822fd3064l,0xe14735e2c2fdb68cl, 27390 0xfd2869947d853158l }, 27391 0 }, 27392 /* 65 << 256 */ 27393 { { 0x301916a5bbd7caf1l,0xef563fda4e2076c2l,0xccbc56088467f279l, 27394 0xd7de3088b8d0f1bfl }, 27395 { 0x3d9adcce8586910dl,0x3fa3b8b9d775e0e9l,0x4b7a4a1d88136503l, 27396 0xc748656de4994fcel }, 27397 0 }, 27398 /* 71 << 256 */ 27399 { { 0x18cc605c2d9f8646l,0x3764f1c29e441b64l,0xb0ea7f7fc4b64ee3l, 27400 0xb5c22d0c042f8678l }, 27401 { 0x3761f7f89b3057fdl,0xc85b8de64a207ce4l,0x11da715bc5c04cf7l, 27402 0x0cb1fa77c8e99c1fl }, 27403 0 }, 27404 /* 77 << 256 */ 27405 { { 0x35f9cfc8045dab4el,0x08a65c6771a7d720l,0xf076767b8eef1351l, 27406 0x5351dbff8638fbe5l }, 27407 { 0x5aead6f7772ad54cl,0x5f6b441fafe93e69l,0xb7b83d1aeeb876b5l, 27408 0xbe1ba4a7cdc094d9l }, 27409 0 }, 27410 /* 83 << 256 */ 27411 { { 0x005d8f04ec0377bal,0x036b8e1ace58f05dl,0xdd6ffc6f1b28cf58l, 27412 0xc3d95a58e206189fl }, 27413 { 0xcb2873c1f52e8b8cl,0xcffdb18d80142af1l,0x7cf88eb64c77ed78l, 27414 0xb3a3141981ef2c12l }, 27415 0 }, 27416 /* 89 << 256 */ 27417 { { 0xbb17e6f957c175b1l,0xf33abc63260a6f6dl,0x9435f2de620ddd6bl, 27418 0x90bdde59ff3e99eal }, 27419 { 0x3d7875e0567b520fl,0xdd6954aa813b4978l,0x1af3dc24de7b631cl, 27420 0x82ddcd08934d3c97l }, 27421 0 }, 27422 /* 95 << 256 */ 27423 { { 0x7a9d60affc5ce598l,0xc6f507597c37abfdl,0xaa1b32f3a79355d0l, 27424 0xac581b94d7e4fcf3l }, 27425 { 0x2669cefd139f6466l,0x560a98bb26f97570l,0x32e1c1db2837b908l, 27426 0x7823d7922d252781l }, 27427 0 }, 27428 /* 101 << 256 */ 27429 { { 0xea018b4cdedf9af0l,0x4b64c0a380c1d2f9l,0x527a0b1c36992c44l, 27430 0x72a2408142b7adffl }, 27431 { 0x0023d10f97a502eel,0xc0f9ed067b401ac4l,0xabd1bd03d6d3b516l, 27432 0xc320e3e478c5d0bel }, 27433 0 }, 27434 /* 107 << 256 */ 27435 { { 0x9f5d2a6a37dd009cl,0x88c0f42ac2c3cbacl,0x3155636977552a1el, 27436 0xe78ec89d02f8098fl }, 27437 { 0x276c2ad71b6eeff9l,0xf4c49a28f7f91856l,0x698a2368dc795124l, 27438 0x5502810de92a6c0fl }, 27439 0 }, 27440 /* 113 << 256 */ 27441 { { 0x82a5042e9f5e5192l,0x64da65fac0965a88l,0xf4c80dd56668399el, 27442 0x635323757e33c233l }, 27443 { 0x5e5339b1a0048616l,0x4a17b1931c91741fl,0x65fdc7c213dcf3d0l, 27444 0x230181426d10c410l }, 27445 0 }, 27446 /* 116 << 256 */ 27447 { { 0x090a04220f46c635l,0xc7eac842a04de3f5l,0x45b69d4c8990d4b2l, 27448 0x032aeb50b8e0cdc6l }, 27449 { 0x02ce332a4ee3f307l,0x3c80c1545043980fl,0xc774838bcbd5287cl, 27450 0x052661074a37d0ael }, 27451 0 }, 27452 /* 119 << 256 */ 27453 { { 0xc401b9c0f4d70fbfl,0xf82bbfde98ee47fel,0x94965118c84d91afl, 27454 0xdd9a67c4d3b6ad1dl }, 27455 { 0x85c9cf1eb66a3ad4l,0x05580a0fbf5f514cl,0xf3ef0fd00218536el, 27456 0x1dc2cf2bd14a7ca9l }, 27457 0 }, 27458 /* 125 << 256 */ 27459 { { 0x18c83e337c1e24d4l,0x30911165563657c6l,0xf9be1af679e53083l, 27460 0x9b058059637753cel }, 27461 { 0x6a37fa24e54522b9l,0xc11d38b426dbf4c4l,0xbc6738655ebd4d9al, 27462 0x2b40e9427fd4e2ecl }, 27463 0 }, 27464 }, 27465 }; 27466 27467 /* Structure used to describe recoding of scalar multiplication. */ 27468 typedef struct ecc_recode_sum { 27469 /* Index into pre-computation table. */ 27470 uint8_t i; 27471 /* Multiplier to add point into. */ 27472 uint8_t mul; 27473 /* Use the negative of the point. */ 27474 uint8_t neg; 27475 } ecc_recode_sum; 27476 27477 /* The index into pre-computation table to use. */ 27478 static uint8_t recode_index_4_8[258] = { 27479 0, 1, 1, 1, 3, 4, 2, 5, 3, 2, 4, 8, 3, 9, 5, 4, 27480 11, 12, 6, 13, 7, 5, 8, 15, 55, 16, 9, 6, 18, 19, 7, 20, 27481 11, 8, 12, 23, 24, 25, 13, 9, 27, 28, 14, 29, 30, 10, 15, 33, 27482 11, 35, 16, 12, 37, 38, 17, 39, 18, 13, 19, 41, 42, 43, 20, 14, 27483 45, 46, 21, 44, 22, 15, 23, 47, 24, 43, 25, 16, 42, 48, 26, 41, 27484 27, 17, 28, 49, 18, 40, 29, 19, 30, 50, 31, 39, 32, 20, 33, 51, 27485 34, 38, 35, 21, 37, 52, 22, 36, 37, 23, 38, 53, 24, 35, 39, 25, 27486 34, 54, 40, 33, 55, 26, 32, 56, 27, 31, 43, 28, 30, 57, 44, 29, 27487 45, 29, 44, 57, 30, 28, 43, 31, 27, 56, 32, 26, 55, 33, 40, 54, 27488 34, 25, 39, 35, 24, 53, 38, 23, 37, 36, 22, 52, 37, 21, 35, 38, 27489 34, 51, 33, 20, 32, 39, 31, 50, 30, 19, 29, 40, 18, 49, 28, 17, 27490 27, 41, 26, 48, 42, 16, 25, 43, 24, 47, 23, 15, 22, 44, 21, 46, 27491 45, 14, 20, 43, 42, 41, 19, 13, 18, 39, 17, 38, 37, 12, 16, 35, 27492 11, 33, 15, 10, 30, 29, 14, 28, 27, 9, 13, 25, 24, 23, 12, 8, 27493 11, 20, 7, 19, 18, 6, 9, 16, 55, 15, 8, 5, 7, 13, 6, 12, 27494 11, 4, 5, 9, 3, 8, 4, 2, 3, 5, 2, 4, 3, 1, 1, 1, 27495 0, 1, 27496 }; 27497 27498 /* Multiple to add point into. */ 27499 static uint8_t recode_mul_4_8[258] = { 27500 0, 1, 2, 3, 1, 1, 2, 1, 2, 3, 2, 1, 3, 1, 2, 3, 27501 1, 1, 2, 1, 2, 3, 2, 1, 2, 1, 2, 3, 1, 1, 3, 1, 27502 2, 3, 2, 1, 1, 1, 2, 3, 1, 1, 2, 1, 1, 3, 2, 1, 27503 3, 1, 2, 3, 1, 1, 2, 1, 2, 3, 2, 1, 1, 1, 2, 3, 27504 1, 1, 2, 3, 2, 3, 2, 1, 2, 3, 2, 3, 3, 1, 2, 3, 27505 2, 3, 2, 1, 3, 3, 2, 3, 2, 1, 2, 3, 2, 3, 2, 1, 27506 2, 3, 2, 3, 3, 1, 3, 3, 2, 3, 2, 1, 3, 3, 2, 3, 27507 3, 1, 2, 3, 1, 3, 3, 1, 3, 3, 2, 3, 3, 1, 2, 3, 27508 2, 3, 2, 1, 3, 3, 2, 3, 3, 1, 3, 3, 1, 3, 2, 1, 27509 3, 3, 2, 3, 3, 1, 2, 3, 2, 3, 3, 1, 3, 3, 2, 3, 27510 2, 1, 2, 3, 2, 3, 2, 1, 2, 3, 2, 3, 3, 1, 2, 3, 27511 2, 3, 2, 1, 3, 3, 2, 3, 2, 1, 2, 3, 2, 3, 2, 1, 27512 1, 3, 2, 1, 1, 1, 2, 3, 2, 1, 2, 1, 1, 3, 2, 1, 27513 3, 1, 2, 3, 1, 1, 2, 1, 1, 3, 2, 1, 1, 1, 2, 3, 27514 2, 1, 3, 1, 1, 3, 2, 1, 2, 1, 2, 3, 2, 1, 2, 1, 27515 1, 3, 2, 1, 3, 1, 2, 3, 2, 1, 2, 1, 1, 3, 2, 1, 27516 0, 1, 27517 }; 27518 27519 /* Whether to negate y-ordinate. */ 27520 static uint8_t recode_neg_4_8[258] = { 27521 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27522 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 27523 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27524 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27525 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 27526 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 27527 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 27528 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 27529 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 27530 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 27531 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 27532 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 27533 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27534 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27535 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 27536 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27537 0, 0, 27538 }; 27539 27540 /* Recode the scalar for multiplication using pre-computed values, multipliers 27541 * and subtraction. 27542 * 27543 * k Scalar to multiply by. 27544 * v Vector of operations to peform. 27545 */ 27546 static void sp_256_ecc_recode_sum_8_4(sp_digit* k, ecc_recode_sum* v) 27547 { 27548 int i, j; 27549 uint16_t y; 27550 int carry = 0; 27551 int o; 27552 sp_digit n; 27553 27554 j = 0; 27555 n = k[j]; 27556 o = 0; 27557 for (i=0; i<33; i++) { 27558 y = n; 27559 if (o + 8 < 64) { 27560 y &= 0xff; 27561 n >>= 8; 27562 o += 8; 27563 } 27564 else if (o + 8 == 64) { 27565 n >>= 8; 27566 if (++j < 4) 27567 n = k[j]; 27568 o = 0; 27569 } 27570 else if (++j < 4) { 27571 n = k[j]; 27572 y |= (n << (64 - o)) & 0xff; 27573 o -= 56; 27574 n >>= o; 27575 } 27576 27577 y += carry; 27578 v[i].i = recode_index_4_8[y]; 27579 v[i].mul = recode_mul_4_8[y]; 27580 v[i].neg = recode_neg_4_8[y]; 27581 carry = (y >> 8) + v[i].neg; 27582 } 27583 } 27584 27585 /* Multiply the base point of P256 by the scalar and return the result. 27586 * If map is true then convert result to affine co-ordinates. 27587 * 27588 * r Resulting point. 27589 * k Scalar to multiply by. 27590 * map Indicates whether to convert result to affine. 27591 * heap Heap to use for allocation. 27592 * returns MEMORY_E when memory allocation fails and MP_OKAY on success. 27593 */ 27594 static int sp_256_ecc_mulmod_base_4(sp_point* r, sp_digit* k, int map, 27595 void* heap) 27596 { 27597 #if !defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SMALL_STACK) 27598 sp_point td[4]; 27599 sp_point pd; 27600 sp_digit tmpd[2 * 4 * 5]; 27601 #endif 27602 sp_point* t; 27603 sp_point* p; 27604 sp_digit* tmp; 27605 sp_digit* negy; 27606 int i; 27607 ecc_recode_sum v[33]; 27608 int err; 27609 27610 (void)heap; 27611 27612 err = sp_ecc_point_new(heap, pd, p); 27613 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK) 27614 t = (sp_point*)XMALLOC(sizeof(sp_point) * 4, heap, DYNAMIC_TYPE_ECC); 27615 if (t == NULL) 27616 err = MEMORY_E; 27617 tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 4 * 5, heap, 27618 DYNAMIC_TYPE_ECC); 27619 if (tmp == NULL) 27620 err = MEMORY_E; 27621 #else 27622 t = td; 27623 tmp = tmpd; 27624 #endif 27625 negy = tmp; 27626 27627 if (err == MP_OKAY) { 27628 sp_256_ecc_recode_sum_8_4(k, v); 27629 27630 XMEMCPY(p->z, p256_norm_mod, sizeof(p256_norm_mod)); 27631 XMEMSET(t, 0, sizeof(sp_point) * 4); 27632 for (i=0; i<4; i++) { 27633 XMEMCPY(t[i].z, p256_norm_mod, sizeof(p256_norm_mod)); 27634 t[i].infinity = 1; 27635 } 27636 27637 i = 32; 27638 XMEMCPY(t[v[i].mul].x, p256_table[i][v[i].i].x, sizeof(p256_table[i]->x)); 27639 XMEMCPY(t[v[i].mul].y, p256_table[i][v[i].i].y, sizeof(p256_table[i]->y)); 27640 t[v[i].mul].infinity = p256_table[i][v[i].i].infinity; 27641 for (--i; i>=0; i--) { 27642 XMEMCPY(p->x, p256_table[i][v[i].i].x, sizeof(p256_table[i]->x)); 27643 XMEMCPY(p->y, p256_table[i][v[i].i].y, sizeof(p256_table[i]->y)); 27644 p->infinity = p256_table[i][v[i].i].infinity; 27645 sp_256_sub_4(negy, p256_mod, p->y); 27646 sp_256_cond_copy_4(p->y, negy, (sp_digit)0 - v[i].neg); 27647 sp_256_proj_point_add_qz1_4(&t[v[i].mul], &t[v[i].mul], p, tmp); 27648 } 27649 sp_256_proj_point_add_4(&t[2], &t[2], &t[3], tmp); 27650 sp_256_proj_point_add_4(&t[1], &t[1], &t[3], tmp); 27651 sp_256_proj_point_dbl_4(&t[2], &t[2], tmp); 27652 sp_256_proj_point_add_4(&t[1], &t[1], &t[2], tmp); 27653 27654 if (map) 27655 sp_256_map_4(r, &t[1], tmp); 27656 else 27657 XMEMCPY(r, &t[1], sizeof(sp_point)); 27658 } 27659 27660 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK) 27661 if (t != NULL) { 27662 XMEMSET(t, 0, sizeof(sp_point) * 4); 27663 XFREE(t, heap, DYNAMIC_TYPE_ECC); 27664 } 27665 if (tmp != NULL) { 27666 XMEMSET(tmp, 0, sizeof(sp_digit) * 2 * 4 * 5); 27667 XFREE(tmp, heap, DYNAMIC_TYPE_ECC); 27668 } 27669 #else 27670 ForceZero(tmpd, sizeof(tmpd)); 27671 ForceZero(td, sizeof(td)); 27672 #endif 27673 sp_ecc_point_free(p, 0, heap); 27674 27675 return MP_OKAY; 27676 } 27677 27678 #endif /* WOLFSSL_SP_SMALL */ 27679 /* Multiply the base point of P256 by the scalar and return the result. 27680 * If map is true then convert result to affine co-ordinates. 27681 * 27682 * km Scalar to multiply by. 27683 * r Resulting point. 27684 * map Indicates whether to convert result to affine. 27685 * heap Heap to use for allocation. 27686 * returns MEMORY_E when memory allocation fails and MP_OKAY on success. 27687 */ 27688 int sp_ecc_mulmod_base_256(mp_int* km, ecc_point* r, int map, void* heap) 27689 { 27690 #if !defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SMALL_STACK) 27691 sp_point p; 27692 sp_digit kd[4]; 27693 #endif 27694 sp_point* point; 27695 sp_digit* k = NULL; 27696 int err = MP_OKAY; 27697 #ifdef HAVE_INTEL_AVX2 27698 word32 cpuid_flags = cpuid_get_flags(); 27699 #endif 27700 27701 err = sp_ecc_point_new(heap, p, point); 27702 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK) 27703 if (err == MP_OKAY) { 27704 k = XMALLOC(sizeof(sp_digit) * 4, heap, DYNAMIC_TYPE_ECC); 27705 if (k == NULL) 27706 err = MEMORY_E; 27707 } 27708 #else 27709 k = kd; 27710 #endif 27711 if (err == MP_OKAY) { 27712 sp_256_from_mp(k, 4, km); 27713 27714 #ifdef HAVE_INTEL_AVX2 27715 if (IS_INTEL_BMI2(cpuid_flags) && IS_INTEL_ADX(cpuid_flags)) 27716 err = sp_256_ecc_mulmod_base_avx2_4(point, k, map, heap); 27717 else 27718 #endif 27719 err = sp_256_ecc_mulmod_base_4(point, k, map, heap); 27720 } 27721 if (err == MP_OKAY) 27722 err = sp_256_point_to_ecc_point_4(point, r); 27723 27724 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK) 27725 if (k != NULL) 27726 XFREE(k, heap, DYNAMIC_TYPE_ECC); 27727 #endif 27728 sp_ecc_point_free(point, 0, heap); 27729 27730 return err; 27731 } 27732 27733 #if defined(WOLFSSL_VALIDATE_ECC_KEYGEN) || defined(HAVE_ECC_SIGN) 27734 /* Returns 1 if the number of zero. 27735 * Implementation is constant time. 27736 * 27737 * a Number to check. 27738 * returns 1 if the number is zero and 0 otherwise. 27739 */ 27740 static int sp_256_iszero_4(const sp_digit* a) 27741 { 27742 return (a[0] | a[1] | a[2] | a[3]) == 0; 27743 } 27744 27745 #endif /* WOLFSSL_VALIDATE_ECC_KEYGEN || HAVE_ECC_SIGN */ 27746 /* Add 1 to a. (a = a + 1) 27747 * 27748 * r A single precision integer. 27749 * a A single precision integer. 27750 */ 27751 static void sp_256_add_one_4(sp_digit* a) 27752 { 27753 __asm__ __volatile__ ( 27754 "ldp x1, x2, [%[a], 0]\n\t" 27755 "ldp x3, x4, [%[a], 16]\n\t" 27756 "adds x1, x1, #1\n\t" 27757 "adcs x2, x2, xzr\n\t" 27758 "adcs x3, x3, xzr\n\t" 27759 "adcs x4, x4, xzr\n\t" 27760 "stp x1, x2, [%[a], 0]\n\t" 27761 "stp x3, x4, [%[a], 16]\n\t" 27762 : 27763 : [a] "r" (a) 27764 : "memory", "x1", "x2", "x3", "x4" 27765 ); 27766 } 27767 27768 /* Read big endian unsigned byte aray into r. 27769 * 27770 * r A single precision integer. 27771 * a Byte array. 27772 * n Number of bytes in array to read. 27773 */ 27774 static void sp_256_from_bin(sp_digit* r, int max, const byte* a, int n) 27775 { 27776 int i, j = 0, s = 0; 27777 27778 r[0] = 0; 27779 for (i = n-1; i >= 0; i--) { 27780 r[j] |= ((sp_digit)a[i]) << s; 27781 if (s >= 56) { 27782 r[j] &= 0xffffffffffffffffl; 27783 s = 64 - s; 27784 if (j + 1 >= max) 27785 break; 27786 r[++j] = a[i] >> s; 27787 s = 8 - s; 27788 } 27789 else 27790 s += 8; 27791 } 27792 27793 for (j++; j < max; j++) 27794 r[j] = 0; 27795 } 27796 27797 /* Generates a scalar that is in the range 1..order-1. 27798 * 27799 * rng Random number generator. 27800 * k Scalar value. 27801 * returns RNG failures, MEMORY_E when memory allocation fails and 27802 * MP_OKAY on success. 27803 */ 27804 static int sp_256_ecc_gen_k_4(WC_RNG* rng, sp_digit* k) 27805 { 27806 int err; 27807 byte buf[32]; 27808 27809 do { 27810 err = wc_RNG_GenerateBlock(rng, buf, sizeof(buf)); 27811 if (err == 0) { 27812 sp_256_from_bin(k, 4, buf, sizeof(buf)); 27813 if (sp_256_cmp_4(k, p256_order2) < 0) { 27814 sp_256_add_one_4(k); 27815 break; 27816 } 27817 } 27818 } 27819 while (err == 0); 27820 27821 return err; 27822 } 27823 27824 /* Makes a random EC key pair. 27825 * 27826 * rng Random number generator. 27827 * priv Generated private value. 27828 * pub Generated public point. 27829 * heap Heap to use for allocation. 27830 * returns ECC_INF_E when the point does not have the correct order, RNG 27831 * failures, MEMORY_E when memory allocation fails and MP_OKAY on success. 27832 */ 27833 int sp_ecc_make_key_256(WC_RNG* rng, mp_int* priv, ecc_point* pub, void* heap) 27834 { 27835 #if !defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SMALL_STACK) 27836 sp_point p; 27837 sp_digit kd[4]; 27838 #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN 27839 sp_point inf; 27840 #endif 27841 #endif 27842 sp_point* point; 27843 sp_digit* k = NULL; 27844 #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN 27845 sp_point* infinity; 27846 #endif 27847 int err; 27848 #ifdef HAVE_INTEL_AVX2 27849 word32 cpuid_flags = cpuid_get_flags(); 27850 #endif 27851 27852 (void)heap; 27853 27854 err = sp_ecc_point_new(heap, p, point); 27855 #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN 27856 if (err == MP_OKAY) 27857 err = sp_ecc_point_new(heap, inf, infinity); 27858 #endif 27859 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK) 27860 if (err == MP_OKAY) { 27861 k = XMALLOC(sizeof(sp_digit) * 4, heap, DYNAMIC_TYPE_ECC); 27862 if (k == NULL) 27863 err = MEMORY_E; 27864 } 27865 #else 27866 k = kd; 27867 #endif 27868 27869 if (err == MP_OKAY) 27870 err = sp_256_ecc_gen_k_4(rng, k); 27871 if (err == MP_OKAY) { 27872 #ifdef HAVE_INTEL_AVX2 27873 if (IS_INTEL_BMI2(cpuid_flags) && IS_INTEL_ADX(cpuid_flags)) 27874 err = sp_256_ecc_mulmod_base_avx2_4(point, k, 1, NULL); 27875 else 27876 #endif 27877 err = sp_256_ecc_mulmod_base_4(point, k, 1, NULL); 27878 } 27879 27880 #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN 27881 if (err == MP_OKAY) { 27882 #ifdef HAVE_INTEL_AVX2 27883 if (IS_INTEL_BMI2(cpuid_flags) && IS_INTEL_ADX(cpuid_flags)) { 27884 err = sp_256_ecc_mulmod_avx2_4(infinity, point, p256_order, 1, 27885 NULL); 27886 } 27887 else 27888 #endif 27889 err = sp_256_ecc_mulmod_4(infinity, point, p256_order, 1, NULL); 27890 } 27891 if (err == MP_OKAY) { 27892 if (!sp_256_iszero_4(point->x) || !sp_256_iszero_4(point->y)) 27893 err = ECC_INF_E; 27894 } 27895 #endif 27896 27897 if (err == MP_OKAY) 27898 err = sp_256_to_mp(k, priv); 27899 if (err == MP_OKAY) 27900 err = sp_256_point_to_ecc_point_4(point, pub); 27901 27902 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK) 27903 if (k != NULL) 27904 XFREE(k, heap, DYNAMIC_TYPE_ECC); 27905 #endif 27906 #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN 27907 sp_ecc_point_free(infinity, 1, heap); 27908 #endif 27909 sp_ecc_point_free(point, 1, heap); 27910 27911 return err; 27912 } 27913 27914 #ifdef HAVE_ECC_DHE 27915 /* Write r as big endian to byte aray. 27916 * Fixed length number of bytes written: 32 27917 * 27918 * r A single precision integer. 27919 * a Byte array. 27920 */ 27921 static void sp_256_to_bin(sp_digit* r, byte* a) 27922 { 27923 int i, j, s = 0, b; 27924 27925 j = 256 / 8 - 1; 27926 a[j] = 0; 27927 for (i=0; i<4 && j>=0; i++) { 27928 b = 0; 27929 a[j--] |= r[i] << s; b += 8 - s; 27930 if (j < 0) 27931 break; 27932 while (b < 64) { 27933 a[j--] = r[i] >> b; b += 8; 27934 if (j < 0) 27935 break; 27936 } 27937 s = 8 - (b - 64); 27938 if (j >= 0) 27939 a[j] = 0; 27940 if (s != 0) 27941 j++; 27942 } 27943 } 27944 27945 /* Multiply the point by the scalar and serialize the X ordinate. 27946 * The number is 0 padded to maximum size on output. 27947 * 27948 * priv Scalar to multiply the point by. 27949 * pub Point to multiply. 27950 * out Buffer to hold X ordinate. 27951 * outLen On entry, size of the buffer in bytes. 27952 * On exit, length of data in buffer in bytes. 27953 * heap Heap to use for allocation. 27954 * returns BUFFER_E if the buffer is to small for output size, 27955 * MEMORY_E when memory allocation fails and MP_OKAY on success. 27956 */ 27957 int sp_ecc_secret_gen_256(mp_int* priv, ecc_point* pub, byte* out, 27958 word32* outLen, void* heap) 27959 { 27960 #if !defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SMALL_STACK) 27961 sp_point p; 27962 sp_digit kd[4]; 27963 #endif 27964 sp_point* point = NULL; 27965 sp_digit* k = NULL; 27966 int err = MP_OKAY; 27967 #ifdef HAVE_INTEL_AVX2 27968 word32 cpuid_flags = cpuid_get_flags(); 27969 #endif 27970 27971 if (*outLen < 32) 27972 err = BUFFER_E; 27973 27974 if (err == MP_OKAY) 27975 err = sp_ecc_point_new(heap, p, point); 27976 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK) 27977 if (err == MP_OKAY) { 27978 k = XMALLOC(sizeof(sp_digit) * 4, heap, DYNAMIC_TYPE_ECC); 27979 if (k == NULL) 27980 err = MEMORY_E; 27981 } 27982 #else 27983 k = kd; 27984 #endif 27985 27986 if (err == MP_OKAY) { 27987 sp_256_from_mp(k, 4, priv); 27988 sp_256_point_from_ecc_point_4(point, pub); 27989 #ifdef HAVE_INTEL_AVX2 27990 if (IS_INTEL_BMI2(cpuid_flags) && IS_INTEL_ADX(cpuid_flags)) 27991 err = sp_256_ecc_mulmod_avx2_4(point, point, k, 1, heap); 27992 else 27993 #endif 27994 err = sp_256_ecc_mulmod_4(point, point, k, 1, heap); 27995 } 27996 if (err == MP_OKAY) { 27997 sp_256_to_bin(point->x, out); 27998 *outLen = 32; 27999 } 28000 28001 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK) 28002 if (k != NULL) 28003 XFREE(k, heap, DYNAMIC_TYPE_ECC); 28004 #endif 28005 sp_ecc_point_free(point, 0, heap); 28006 28007 return err; 28008 } 28009 #endif /* HAVE_ECC_DHE */ 28010 28011 #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY) 28012 /* Add b to a into r. (r = a + b) 28013 * 28014 * r A single precision integer. 28015 * a A single precision integer. 28016 * b A single precision integer. 28017 */ 28018 static sp_digit sp_256_add_4(sp_digit* r, const sp_digit* a, 28019 const sp_digit* b) 28020 { 28021 sp_digit c = 0; 28022 28023 __asm__ __volatile__ ( 28024 "ldp x3, x4, [%[a], 0]\n\t" 28025 "ldp x5, x6, [%[a], 16]\n\t" 28026 "ldp x7, x8, [%[b], 0]\n\t" 28027 "ldp x9, x10, [%[b], 16]\n\t" 28028 "adds x3, x3, x7\n\t" 28029 "adcs x4, x4, x8\n\t" 28030 "adcs x5, x5, x9\n\t" 28031 "adcs x6, x6, x10\n\t" 28032 "stp x3, x4, [%[r], 0]\n\t" 28033 "stp x5, x6, [%[r], 16]\n\t" 28034 "cset %[c], cs\n\t" 28035 : [c] "+r" (c) 28036 : [r] "r" (r), [a] "r" (a), [b] "r" (b) 28037 : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10" 28038 ); 28039 28040 return c; 28041 } 28042 28043 #endif 28044 #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY) 28045 #ifdef WOLFSSL_SP_SMALL 28046 /* Multiply a and b into r. (r = a * b) 28047 * 28048 * r A single precision integer. 28049 * a A single precision integer. 28050 * b A single precision integer. 28051 */ 28052 static void sp_256_mul_4(sp_digit* r, const sp_digit* a, const sp_digit* b) 28053 { 28054 sp_digit tmp[8]; 28055 28056 __asm__ __volatile__ ( 28057 "mov x5, 0\n\t" 28058 "mov x6, 0\n\t" 28059 "mov x7, 0\n\t" 28060 "mov x8, 0\n\t" 28061 "\n1:\n\t" 28062 "subs x3, x5, 24\n\t" 28063 "csel x3, xzr, x3, cc\n\t" 28064 "sub x4, x5, x3\n\t" 28065 "\n2:\n\t" 28066 "ldr x10, [%[a], x3]\n\t" 28067 "ldr x11, [%[b], x4]\n\t" 28068 "mul x9, x10, x11\n\t" 28069 "umulh x10, x10, x11\n\t" 28070 "adds x6, x6, x9\n\t" 28071 "adcs x7, x7, x10\n\t" 28072 "adc x8, x8, xzr\n\t" 28073 "add x3, x3, #8\n\t" 28074 "sub x4, x4, #8\n\t" 28075 "cmp x3, 32\n\t" 28076 "b.eq 3f\n\t" 28077 "cmp x3, x5\n\t" 28078 "b.le 2b\n\t" 28079 "\n3:\n\t" 28080 "str x6, [%[r], x5]\n\t" 28081 "mov x6, x7\n\t" 28082 "mov x7, x8\n\t" 28083 "mov x8, #0\n\t" 28084 "add x5, x5, #8\n\t" 28085 "cmp x5, 48\n\t" 28086 "b.le 1b\n\t" 28087 "str x6, [%[r], x5]\n\t" 28088 : 28089 : [r] "r" (tmp), [a] "r" (a), [b] "r" (b) 28090 : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11" 28091 ); 28092 28093 XMEMCPY(r, tmp, sizeof(tmp)); 28094 } 28095 28096 #else 28097 /* Multiply a and b into r. (r = a * b) 28098 * 28099 * r A single precision integer. 28100 * a A single precision integer. 28101 * b A single precision integer. 28102 */ 28103 static void sp_256_mul_4(sp_digit* r, const sp_digit* a, const sp_digit* b) 28104 { 28105 sp_digit tmp[4]; 28106 28107 __asm__ __volatile__ ( 28108 "ldp x8, x9, [%[a], 0]\n\t" 28109 "ldp x10, x11, [%[a], 16]\n\t" 28110 "ldp x12, x13, [%[b], 0]\n\t" 28111 "ldp x14, x15, [%[b], 16]\n\t" 28112 "# A[0] * B[0]\n\t" 28113 "mul x3, x8, x12\n\t" 28114 "umulh x4, x8, x12\n\t" 28115 "str x3, [%[tmp]]\n\t" 28116 "# A[0] * B[1]\n\t" 28117 "mul x6, x8, x13\n\t" 28118 "umulh x7, x8, x13\n\t" 28119 "adds x4, x4, x6\n\t" 28120 "adc x5, xzr, x7\n\t" 28121 "# A[1] * B[0]\n\t" 28122 "mul x6, x9, x12\n\t" 28123 "umulh x7, x9, x12\n\t" 28124 "adds x4, x4, x6\n\t" 28125 "adcs x5, x5, x7\n\t" 28126 "adc x3, xzr, xzr\n\t" 28127 "str x4, [%[tmp], 8]\n\t" 28128 "# A[0] * B[2]\n\t" 28129 "mul x6, x8, x14\n\t" 28130 "umulh x7, x8, x14\n\t" 28131 "adds x5, x5, x6\n\t" 28132 "adcs x3, x3, x7\n\t" 28133 "adc x4, xzr, xzr\n\t" 28134 "# A[1] * B[1]\n\t" 28135 "mul x6, x9, x13\n\t" 28136 "umulh x7, x9, x13\n\t" 28137 "adds x5, x5, x6\n\t" 28138 "adcs x3, x3, x7\n\t" 28139 "adc x4, x4, xzr\n\t" 28140 "# A[2] * B[0]\n\t" 28141 "mul x6, x10, x12\n\t" 28142 "umulh x7, x10, x12\n\t" 28143 "adds x5, x5, x6\n\t" 28144 "adcs x3, x3, x7\n\t" 28145 "adc x4, x4, xzr\n\t" 28146 "str x5, [%[tmp], 16]\n\t" 28147 "# A[0] * B[3]\n\t" 28148 "mul x6, x8, x15\n\t" 28149 "umulh x7, x8, x15\n\t" 28150 "adds x3, x3, x6\n\t" 28151 "adcs x4, x4, x7\n\t" 28152 "adc x5, xzr, xzr\n\t" 28153 "# A[1] * B[2]\n\t" 28154 "mul x6, x9, x14\n\t" 28155 "umulh x7, x9, x14\n\t" 28156 "adds x3, x3, x6\n\t" 28157 "adcs x4, x4, x7\n\t" 28158 "adc x5, x5, xzr\n\t" 28159 "# A[2] * B[1]\n\t" 28160 "mul x6, x10, x13\n\t" 28161 "umulh x7, x10, x13\n\t" 28162 "adds x3, x3, x6\n\t" 28163 "adcs x4, x4, x7\n\t" 28164 "adc x5, x5, xzr\n\t" 28165 "# A[3] * B[0]\n\t" 28166 "mul x6, x11, x12\n\t" 28167 "umulh x7, x11, x12\n\t" 28168 "adds x3, x3, x6\n\t" 28169 "adcs x4, x4, x7\n\t" 28170 "adc x5, x5, xzr\n\t" 28171 "str x3, [%[tmp], 24]\n\t" 28172 "# A[1] * B[3]\n\t" 28173 "mul x6, x9, x15\n\t" 28174 "umulh x7, x9, x15\n\t" 28175 "adds x4, x4, x6\n\t" 28176 "adcs x5, x5, x7\n\t" 28177 "adc x3, xzr, xzr\n\t" 28178 "# A[2] * B[2]\n\t" 28179 "mul x6, x10, x14\n\t" 28180 "umulh x7, x10, x14\n\t" 28181 "adds x4, x4, x6\n\t" 28182 "adcs x5, x5, x7\n\t" 28183 "adc x3, x3, xzr\n\t" 28184 "# A[3] * B[1]\n\t" 28185 "mul x6, x11, x13\n\t" 28186 "umulh x7, x11, x13\n\t" 28187 "adds x4, x4, x6\n\t" 28188 "adcs x5, x5, x7\n\t" 28189 "adc x3, x3, xzr\n\t" 28190 "str x4, [%[r], 32]\n\t" 28191 "# A[2] * B[3]\n\t" 28192 "mul x6, x10, x15\n\t" 28193 "umulh x7, x10, x15\n\t" 28194 "adds x5, x5, x6\n\t" 28195 "adcs x3, x3, x7\n\t" 28196 "adc x4, xzr, xzr\n\t" 28197 "# A[3] * B[2]\n\t" 28198 "mul x6, x11, x14\n\t" 28199 "umulh x7, x11, x14\n\t" 28200 "adds x5, x5, x6\n\t" 28201 "adcs x3, x3, x7\n\t" 28202 "adc x4, x4, xzr\n\t" 28203 "str x5, [%[r], 40]\n\t" 28204 "# A[3] * B[3]\n\t" 28205 "mul x6, x11, x15\n\t" 28206 "umulh x7, x11, x15\n\t" 28207 "adds x3, x3, x6\n\t" 28208 "adc x4, x4, x7\n\t" 28209 "stp x3, x4, [%[r], 48]\n\t" 28210 : 28211 : [r] "r" (r), [a] "r" (a), [b] "r" (b), [tmp] "r" (tmp) 28212 : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15" 28213 ); 28214 28215 XMEMCPY(r, tmp, sizeof(tmp)); 28216 } 28217 28218 #endif /* WOLFSSL_SP_SMALL */ 28219 #ifdef HAVE_INTEL_AVX2 28220 #endif /* HAVE_INTEL_AVX2 */ 28221 #endif 28222 #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY) 28223 /* Sub b from a into a. (a -= b) 28224 * 28225 * a A single precision integer and result. 28226 * b A single precision integer. 28227 */ 28228 static sp_digit sp_256_sub_in_place_4(sp_digit* a, const sp_digit* b) 28229 { 28230 sp_digit c = 0; 28231 28232 __asm__ __volatile__ ( 28233 "ldp x2, x3, [%[a], 0]\n\t" 28234 "ldp x4, x5, [%[a], 16]\n\t" 28235 "ldp x6, x7, [%[b], 0]\n\t" 28236 "ldp x8, x9, [%[b], 16]\n\t" 28237 "subs x2, x2, x6\n\t" 28238 "sbcs x3, x3, x7\n\t" 28239 "sbcs x4, x4, x8\n\t" 28240 "sbcs x5, x5, x9\n\t" 28241 "stp x2, x3, [%[a], 0]\n\t" 28242 "stp x4, x5, [%[a], 16]\n\t" 28243 "csetm %[c], cc\n\t" 28244 : [c] "+r" (c) 28245 : [a] "r" (a), [b] "r" (b) 28246 : "memory", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9" 28247 ); 28248 28249 return c; 28250 } 28251 28252 /* Mul a by digit b into r. (r = a * b) 28253 * 28254 * r A single precision integer. 28255 * a A single precision integer. 28256 * b A single precision digit. 28257 */ 28258 static void sp_256_mul_d_4(sp_digit* r, const sp_digit* a, 28259 const sp_digit b) 28260 { 28261 __asm__ __volatile__ ( 28262 "# A[0] * B\n\t" 28263 "ldr x8, [%[a]]\n\t" 28264 "mul x3, %[b], x8\n\t" 28265 "umulh x4, %[b], x8\n\t" 28266 "mov x5, 0\n\t" 28267 "str x3, [%[r]]\n\t" 28268 "# A[1] * B\n\t" 28269 "ldr x8, [%[a], 8]\n\t" 28270 "mov x3, 0\n\t" 28271 "mul x6, %[b], x8\n\t" 28272 "umulh x7, %[b], x8\n\t" 28273 "adds x4, x4, x6\n\t" 28274 "adcs x5, x5, x7\n\t" 28275 "adc x3, xzr, xzr\n\t" 28276 "str x4, [%[r], 8]\n\t" 28277 "# A[2] * B\n\t" 28278 "ldr x8, [%[a], 16]\n\t" 28279 "mov x4, 0\n\t" 28280 "mul x6, %[b], x8\n\t" 28281 "umulh x7, %[b], x8\n\t" 28282 "adds x5, x5, x6\n\t" 28283 "adcs x3, x3, x7\n\t" 28284 "adc x4, xzr, xzr\n\t" 28285 "str x5, [%[r], 16]\n\t" 28286 "# A[3] * B\n\t" 28287 "ldr x8, [%[a], 24]\n\t" 28288 "mul x6, %[b], x8\n\t" 28289 "umulh x7, %[b], x8\n\t" 28290 "adds x3, x3, x6\n\t" 28291 "adc x4, x4, x7\n\t" 28292 "str x3, [%[r], 24]\n\t" 28293 "str x4, [%[r], 32]\n\t" 28294 : 28295 : [r] "r" (r), [a] "r" (a), [b] "r" (b) 28296 : "memory", "x3", "x4", "x5", "x6", "x7", "x8" 28297 ); 28298 } 28299 28300 /* Divide the double width number (d1|d0) by the dividend. (d1|d0 / div) 28301 * 28302 * d1 The high order half of the number to divide. 28303 * d0 The low order half of the number to divide. 28304 * div The dividend. 28305 * returns the result of the division. 28306 */ 28307 static sp_digit div_256_word_4(sp_digit d1, sp_digit d0, sp_digit div) 28308 { 28309 sp_digit r; 28310 28311 __asm__ __volatile__ ( 28312 "lsr x5, %[div], 32\n\t" 28313 "add x5, x5, 1\n\t" 28314 28315 "udiv x3, %[d1], x5\n\t" 28316 "lsl x6, x3, 32\n\t" 28317 "mul x4, %[div], x6\n\t" 28318 "umulh x3, %[div], x6\n\t" 28319 "subs %[d0], %[d0], x4\n\t" 28320 "sbc %[d1], %[d1], x3\n\t" 28321 28322 "udiv x3, %[d1], x5\n\t" 28323 "lsl x3, x3, 32\n\t" 28324 "add x6, x6, x3\n\t" 28325 "mul x4, %[div], x3\n\t" 28326 "umulh x3, %[div], x3\n\t" 28327 "subs %[d0], %[d0], x4\n\t" 28328 "sbc %[d1], %[d1], x3\n\t" 28329 28330 "lsl x3, %[d1], 32\n\t" 28331 "orr x3, x3, %[d0], lsr 32\n\t" 28332 28333 "udiv x3, x3, x5\n\t" 28334 "add x6, x6, x3\n\t" 28335 "mul x4, %[div], x3\n\t" 28336 "umulh x3, %[div], x3\n\t" 28337 "subs %[d0], %[d0], x4\n\t" 28338 "sbc %[d1], %[d1], x3\n\t" 28339 28340 "lsl x3, %[d1], 32\n\t" 28341 "orr x3, x3, %[d0], lsr 32\n\t" 28342 28343 "udiv x3, x3, x5\n\t" 28344 "add x6, x6, x3\n\t" 28345 "mul x4, %[div], x3\n\t" 28346 "umulh x3, %[div], x3\n\t" 28347 "subs %[d0], %[d0], x4\n\t" 28348 "sbc %[d1], %[d1], x3\n\t" 28349 28350 "udiv x3, %[d0], %[div]\n\t" 28351 "add x6, x6, x3\n\t" 28352 "mul x3, %[div], x3\n\t" 28353 "sub %[d0], %[d0], x3\n\t" 28354 "mov %[r], x6\n\t" 28355 28356 : [r] "=r" (r) 28357 : [d1] "r" (d1), [d0] "r" (d0), [div] "r" (div) 28358 : "x3", "x4", "x5", "x6" 28359 ); 28360 28361 return r; 28362 } 28363 28364 /* AND m into each word of a and store in r. 28365 * 28366 * r A single precision integer. 28367 * a A single precision integer. 28368 * m Mask to AND against each digit. 28369 */ 28370 static void sp_256_mask_4(sp_digit* r, sp_digit* a, sp_digit m) 28371 { 28372 #ifdef WOLFSSL_SP_SMALL 28373 int i; 28374 28375 for (i=0; i<4; i++) 28376 r[i] = a[i] & m; 28377 #else 28378 r[0] = a[0] & m; 28379 r[1] = a[1] & m; 28380 r[2] = a[2] & m; 28381 r[3] = a[3] & m; 28382 #endif 28383 } 28384 28385 /* Divide d in a and put remainder into r (m*d + r = a) 28386 * m is not calculated as it is not needed at this time. 28387 * 28388 * a Nmber to be divided. 28389 * d Number to divide with. 28390 * m Multiplier result. 28391 * r Remainder from the division. 28392 * returns MP_OKAY indicating success. 28393 */ 28394 static WC_INLINE int sp_256_div_4(sp_digit* a, sp_digit* d, sp_digit* m, 28395 sp_digit* r) 28396 { 28397 sp_digit t1[8], t2[5]; 28398 sp_digit div, r1; 28399 int i; 28400 28401 (void)m; 28402 28403 div = d[3]; 28404 XMEMCPY(t1, a, sizeof(*t1) * 2 * 4); 28405 for (i=3; i>=0; i--) { 28406 r1 = div_256_word_4(t1[4 + i], t1[4 + i - 1], div); 28407 28408 sp_256_mul_d_4(t2, d, r1); 28409 t1[4 + i] += sp_256_sub_in_place_4(&t1[i], t2); 28410 t1[4 + i] -= t2[4]; 28411 sp_256_mask_4(t2, d, t1[4 + i]); 28412 t1[4 + i] += sp_256_add_4(&t1[i], &t1[i], t2); 28413 sp_256_mask_4(t2, d, t1[4 + i]); 28414 t1[4 + i] += sp_256_add_4(&t1[i], &t1[i], t2); 28415 } 28416 28417 r1 = sp_256_cmp_4(t1, d) >= 0; 28418 sp_256_cond_sub_4(r, t1, t2, (sp_digit)0 - r1); 28419 28420 return MP_OKAY; 28421 } 28422 28423 /* Reduce a modulo m into r. (r = a mod m) 28424 * 28425 * r A single precision number that is the reduced result. 28426 * a A single precision number that is to be reduced. 28427 * m A single precision number that is the modulus to reduce with. 28428 * returns MP_OKAY indicating success. 28429 */ 28430 static WC_INLINE int sp_256_mod_4(sp_digit* r, sp_digit* a, sp_digit* m) 28431 { 28432 return sp_256_div_4(a, m, NULL, r); 28433 } 28434 28435 #endif 28436 #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY) 28437 #ifdef WOLFSSL_SP_SMALL 28438 /* Square a and put result in r. (r = a * a) 28439 * 28440 * r A single precision integer. 28441 * a A single precision integer. 28442 */ 28443 static void sp_256_sqr_4(sp_digit* r, const sp_digit* a) 28444 { 28445 sp_digit tmp[8]; 28446 28447 __asm__ __volatile__ ( 28448 "mov x6, 0\n\t" 28449 "mov x7, 0\n\t" 28450 "mov x8, 0\n\t" 28451 "mov x5, 0\n\t" 28452 "\n1:\n\t" 28453 "subs x3, x5, 24\n\t" 28454 "csel x3, xzr, x3, cc\n\t" 28455 "sub x4, x5, x3\n\t" 28456 "\n2:\n\t" 28457 "cmp x4, x3\n\t" 28458 "b.eq 4f\n\t" 28459 "ldr x10, [%[a], x3]\n\t" 28460 "ldr x11, [%[a], x4]\n\t" 28461 "mul x9, x10, x11\n\t" 28462 "umulh x10, x10, x11\n\t" 28463 "adds x6, x6, x9\n\t" 28464 "adcs x7, x7, x10\n\t" 28465 "adc x8, x8, xzr\n\t" 28466 "adds x6, x6, x9\n\t" 28467 "adcs x7, x7, x10\n\t" 28468 "adc x8, x8, xzr\n\t" 28469 "b.al 5f\n\t" 28470 "\n4:\n\t" 28471 "ldr x10, [%[a], x3]\n\t" 28472 "mul x9, x10, x10\n\t" 28473 "umulh x10, x10, x10\n\t" 28474 "adds x6, x6, x9\n\t" 28475 "adcs x7, x7, x10\n\t" 28476 "adc x8, x8, xzr\n\t" 28477 "\n5:\n\t" 28478 "add x3, x3, #8\n\t" 28479 "sub x4, x4, #8\n\t" 28480 "cmp x3, 32\n\t" 28481 "b.eq 3f\n\t" 28482 "cmp x3, x4\n\t" 28483 "b.gt 3f\n\t" 28484 "cmp x3, x5\n\t" 28485 "b.le 2b\n\t" 28486 "\n3:\n\t" 28487 "str x6, [%[r], x5]\n\t" 28488 "mov x6, x7\n\t" 28489 "mov x7, x8\n\t" 28490 "mov x8, #0\n\t" 28491 "add x5, x5, #8\n\t" 28492 "cmp x5, 48\n\t" 28493 "b.le 1b\n\t" 28494 "str x6, [%[r], x5]\n\t" 28495 : 28496 : [r] "r" (tmp), [a] "r" (a) 28497 : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11" 28498 ); 28499 28500 XMEMCPY(r, tmp, sizeof(tmp)); 28501 } 28502 28503 #else 28504 /* Square a and put result in r. (r = a * a) 28505 * 28506 * r A single precision integer. 28507 * a A single precision integer. 28508 */ 28509 static void sp_256_sqr_4(sp_digit* r, const sp_digit* a) 28510 { 28511 sp_digit tmp[4]; 28512 28513 __asm__ __volatile__ ( 28514 "ldp x10, x11, [%[a], 0]\n\t" 28515 "ldp x12, x13, [%[a], 16]\n\t" 28516 "# A[0] * A[0]\n\t" 28517 "mul x2, x10, x10\n\t" 28518 "umulh x3, x10, x10\n\t" 28519 "str x2, [%[tmp]]\n\t" 28520 "mov x4, 0\n\t" 28521 "# A[0] * A[1]\n\t" 28522 "mul x8, x10, x11\n\t" 28523 "umulh x9, x10, x11\n\t" 28524 "adds x3, x3, x8\n\t" 28525 "adcs x4, x4, x9\n\t" 28526 "adc x2, xzr, xzr\n\t" 28527 "adds x3, x3, x8\n\t" 28528 "adcs x4, x4, x9\n\t" 28529 "adc x2, x2, xzr\n\t" 28530 "str x3, [%[tmp], 8]\n\t" 28531 "# A[0] * A[2]\n\t" 28532 "mul x8, x10, x12\n\t" 28533 "umulh x9, x10, x12\n\t" 28534 "adds x4, x4, x8\n\t" 28535 "adcs x2, x2, x9\n\t" 28536 "adc x3, xzr, xzr\n\t" 28537 "adds x4, x4, x8\n\t" 28538 "adcs x2, x2, x9\n\t" 28539 "adc x3, x3, xzr\n\t" 28540 "# A[1] * A[1]\n\t" 28541 "mul x8, x11, x11\n\t" 28542 "umulh x9, x11, x11\n\t" 28543 "adds x4, x4, x8\n\t" 28544 "adcs x2, x2, x9\n\t" 28545 "adc x3, x3, xzr\n\t" 28546 "str x4, [%[tmp], 16]\n\t" 28547 "# A[0] * A[3]\n\t" 28548 "mul x8, x10, x13\n\t" 28549 "umulh x9, x10, x13\n\t" 28550 "adds x2, x2, x8\n\t" 28551 "adcs x3, x3, x9\n\t" 28552 "adc x4, xzr, xzr\n\t" 28553 "adds x2, x2, x8\n\t" 28554 "adcs x3, x3, x9\n\t" 28555 "adc x4, x4, xzr\n\t" 28556 "# A[1] * A[2]\n\t" 28557 "mul x8, x11, x12\n\t" 28558 "umulh x9, x11, x12\n\t" 28559 "adds x2, x2, x8\n\t" 28560 "adcs x3, x3, x9\n\t" 28561 "adc x4, x4, xzr\n\t" 28562 "adds x2, x2, x8\n\t" 28563 "adcs x3, x3, x9\n\t" 28564 "adc x4, x4, xzr\n\t" 28565 "str x2, [%[tmp], 24]\n\t" 28566 "# A[1] * A[3]\n\t" 28567 "mul x8, x11, x13\n\t" 28568 "umulh x9, x11, x13\n\t" 28569 "adds x3, x3, x8\n\t" 28570 "adcs x4, x4, x9\n\t" 28571 "adc x2, xzr, xzr\n\t" 28572 "adds x3, x3, x8\n\t" 28573 "adcs x4, x4, x9\n\t" 28574 "adc x2, x2, xzr\n\t" 28575 "# A[2] * A[2]\n\t" 28576 "mul x8, x12, x12\n\t" 28577 "umulh x9, x12, x12\n\t" 28578 "adds x3, x3, x8\n\t" 28579 "adcs x4, x4, x9\n\t" 28580 "adc x2, x2, xzr\n\t" 28581 "str x3, [%[r], 32]\n\t" 28582 "# A[2] * A[3]\n\t" 28583 "mul x8, x12, x13\n\t" 28584 "umulh x9, x12, x13\n\t" 28585 "adds x4, x4, x8\n\t" 28586 "adcs x2, x2, x9\n\t" 28587 "adc x3, xzr, xzr\n\t" 28588 "adds x4, x4, x8\n\t" 28589 "adcs x2, x2, x9\n\t" 28590 "adc x3, x3, xzr\n\t" 28591 "str x4, [%[r], 40]\n\t" 28592 "# A[3] * A[3]\n\t" 28593 "mul x8, x13, x13\n\t" 28594 "umulh x9, x13, x13\n\t" 28595 "adds x2, x2, x8\n\t" 28596 "adc x3, x3, x9\n\t" 28597 "stp x2, x3, [%[r], 48]\n\t" 28598 : 28599 : [r] "r" (r), [a] "r" (a), [tmp] "r" (tmp) 28600 : "memory", "x2", "x3", "x4", "x8", "x9", "x10", "x5", "x6", "x7", "x10", "x11", "x12", "x13" 28601 ); 28602 28603 XMEMCPY(r, tmp, sizeof(tmp)); 28604 } 28605 28606 #endif /* WOLFSSL_SP_SMALL */ 28607 #ifdef WOLFSSL_SP_SMALL 28608 /* Order-2 for the P256 curve. */ 28609 static const uint64_t p256_order_2[4] = { 28610 0xf3b9cac2fc63254f,0xbce6faada7179e84,0xffffffffffffffff, 28611 0xffffffff00000000 28612 }; 28613 #else 28614 /* The low half of the order-2 of the P256 curve. */ 28615 static const uint64_t p256_order_low[2] = { 28616 0xf3b9cac2fc63254f,0xbce6faada7179e84 28617 }; 28618 #endif /* WOLFSSL_SP_SMALL */ 28619 28620 /* Multiply two number mod the order of P256 curve. (r = a * b mod order) 28621 * 28622 * r Result of the multiplication. 28623 * a First operand of the multiplication. 28624 * b Second operand of the multiplication. 28625 */ 28626 static void sp_256_mont_mul_order_4(sp_digit* r, sp_digit* a, sp_digit* b) 28627 { 28628 sp_256_mul_4(r, a, b); 28629 sp_256_mont_reduce_4(r, p256_order, p256_mp_order); 28630 } 28631 28632 /* Square number mod the order of P256 curve. (r = a * a mod order) 28633 * 28634 * r Result of the squaring. 28635 * a Number to square. 28636 */ 28637 static void sp_256_mont_sqr_order_4(sp_digit* r, sp_digit* a) 28638 { 28639 sp_256_sqr_4(r, a); 28640 sp_256_mont_reduce_4(r, p256_order, p256_mp_order); 28641 } 28642 28643 #ifndef WOLFSSL_SP_SMALL 28644 /* Square number mod the order of P256 curve a number of times. 28645 * (r = a ^ n mod order) 28646 * 28647 * r Result of the squaring. 28648 * a Number to square. 28649 */ 28650 static void sp_256_mont_sqr_n_order_4(sp_digit* r, sp_digit* a, int n) 28651 { 28652 int i; 28653 28654 sp_256_mont_sqr_order_4(r, a); 28655 for (i=1; i<n; i++) 28656 sp_256_mont_sqr_order_4(r, r); 28657 } 28658 #endif /* !WOLFSSL_SP_SMALL */ 28659 28660 /* Invert the number, in Montgomery form, modulo the order of the P256 curve. 28661 * (r = 1 / a mod order) 28662 * 28663 * r Inverse result. 28664 * a Number to invert. 28665 * td Temporary data. 28666 */ 28667 static void sp_256_mont_inv_order_4(sp_digit* r, sp_digit* a, 28668 sp_digit* td) 28669 { 28670 #ifdef WOLFSSL_SP_SMALL 28671 sp_digit* t = td; 28672 int i; 28673 28674 XMEMCPY(t, a, sizeof(sp_digit) * 4); 28675 for (i=254; i>=0; i--) { 28676 sp_256_mont_sqr_order_4(t, t); 28677 if (p256_order_2[i / 64] & ((sp_digit)1 << (i % 64))) 28678 sp_256_mont_mul_order_4(t, t, a); 28679 } 28680 XMEMCPY(r, t, sizeof(sp_digit) * 4); 28681 #else 28682 sp_digit* t = td; 28683 sp_digit* t2 = td + 2 * 4; 28684 sp_digit* t3 = td + 4 * 4; 28685 int i; 28686 28687 /* t = a^2 */ 28688 sp_256_mont_sqr_order_4(t, a); 28689 /* t = a^3 = t * a */ 28690 sp_256_mont_mul_order_4(t, t, a); 28691 /* t2= a^c = t ^ 2 ^ 2 */ 28692 sp_256_mont_sqr_n_order_4(t2, t, 2); 28693 /* t3= a^f = t2 * t */ 28694 sp_256_mont_mul_order_4(t3, t2, t); 28695 /* t2= a^f0 = t3 ^ 2 ^ 4 */ 28696 sp_256_mont_sqr_n_order_4(t2, t3, 4); 28697 /* t = a^ff = t2 * t3 */ 28698 sp_256_mont_mul_order_4(t, t2, t3); 28699 /* t3= a^ff00 = t ^ 2 ^ 8 */ 28700 sp_256_mont_sqr_n_order_4(t2, t, 8); 28701 /* t = a^ffff = t2 * t */ 28702 sp_256_mont_mul_order_4(t, t2, t); 28703 /* t2= a^ffff0000 = t ^ 2 ^ 16 */ 28704 sp_256_mont_sqr_n_order_4(t2, t, 16); 28705 /* t = a^ffffffff = t2 * t */ 28706 sp_256_mont_mul_order_4(t, t2, t); 28707 /* t2= a^ffffffff0000000000000000 = t ^ 2 ^ 64 */ 28708 sp_256_mont_sqr_n_order_4(t2, t, 64); 28709 /* t2= a^ffffffff00000000ffffffff = t2 * t */ 28710 sp_256_mont_mul_order_4(t2, t2, t); 28711 /* t2= a^ffffffff00000000ffffffff00000000 = t2 ^ 2 ^ 32 */ 28712 sp_256_mont_sqr_n_order_4(t2, t2, 32); 28713 /* t2= a^ffffffff00000000ffffffffffffffff = t2 * t */ 28714 sp_256_mont_mul_order_4(t2, t2, t); 28715 /* t2= a^ffffffff00000000ffffffffffffffffbce6 */ 28716 for (i=127; i>=112; i--) { 28717 sp_256_mont_sqr_order_4(t2, t2); 28718 if (p256_order_low[i / 64] & ((sp_digit)1 << (i % 64))) 28719 sp_256_mont_mul_order_4(t2, t2, a); 28720 } 28721 /* t2= a^ffffffff00000000ffffffffffffffffbce6f */ 28722 sp_256_mont_sqr_n_order_4(t2, t2, 4); 28723 sp_256_mont_mul_order_4(t2, t2, t3); 28724 /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84 */ 28725 for (i=107; i>=64; i--) { 28726 sp_256_mont_sqr_order_4(t2, t2); 28727 if (p256_order_low[i / 64] & ((sp_digit)1 << (i % 64))) 28728 sp_256_mont_mul_order_4(t2, t2, a); 28729 } 28730 /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84f */ 28731 sp_256_mont_sqr_n_order_4(t2, t2, 4); 28732 sp_256_mont_mul_order_4(t2, t2, t3); 28733 /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2 */ 28734 for (i=59; i>=32; i--) { 28735 sp_256_mont_sqr_order_4(t2, t2); 28736 if (p256_order_low[i / 64] & ((sp_digit)1 << (i % 64))) 28737 sp_256_mont_mul_order_4(t2, t2, a); 28738 } 28739 /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2f */ 28740 sp_256_mont_sqr_n_order_4(t2, t2, 4); 28741 sp_256_mont_mul_order_4(t2, t2, t3); 28742 /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254 */ 28743 for (i=27; i>=0; i--) { 28744 sp_256_mont_sqr_order_4(t2, t2); 28745 if (p256_order_low[i / 64] & ((sp_digit)1 << (i % 64))) 28746 sp_256_mont_mul_order_4(t2, t2, a); 28747 } 28748 /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632540 */ 28749 sp_256_mont_sqr_n_order_4(t2, t2, 4); 28750 /* r = a^ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f */ 28751 sp_256_mont_mul_order_4(r, t2, t3); 28752 #endif /* WOLFSSL_SP_SMALL */ 28753 } 28754 28755 #ifdef HAVE_INTEL_AVX2 28756 /* Multiply two number mod the order of P256 curve. (r = a * b mod order) 28757 * 28758 * r Result of the multiplication. 28759 * a First operand of the multiplication. 28760 * b Second operand of the multiplication. 28761 */ 28762 static void sp_256_mont_mul_order_avx2_4(sp_digit* r, sp_digit* a, sp_digit* b) 28763 { 28764 sp_256_mul_avx2_4(r, a, b); 28765 sp_256_mont_reduce_avx2_4(r, p256_order, p256_mp_order); 28766 } 28767 28768 /* Square number mod the order of P256 curve. (r = a * a mod order) 28769 * 28770 * r Result of the squaring. 28771 * a Number to square. 28772 */ 28773 static void sp_256_mont_sqr_order_avx2_4(sp_digit* r, sp_digit* a) 28774 { 28775 sp_256_sqr_avx2_4(r, a); 28776 sp_256_mont_reduce_avx2_4(r, p256_order, p256_mp_order); 28777 } 28778 28779 #ifndef WOLFSSL_SP_SMALL 28780 /* Square number mod the order of P256 curve a number of times. 28781 * (r = a ^ n mod order) 28782 * 28783 * r Result of the squaring. 28784 * a Number to square. 28785 */ 28786 static void sp_256_mont_sqr_n_order_avx2_4(sp_digit* r, sp_digit* a, int n) 28787 { 28788 int i; 28789 28790 sp_256_mont_sqr_order_avx2_4(r, a); 28791 for (i=1; i<n; i++) 28792 sp_256_mont_sqr_order_avx2_4(r, r); 28793 } 28794 #endif /* !WOLFSSL_SP_SMALL */ 28795 28796 /* Invert the number, in Montgomery form, modulo the order of the P256 curve. 28797 * (r = 1 / a mod order) 28798 * 28799 * r Inverse result. 28800 * a Number to invert. 28801 * td Temporary data. 28802 */ 28803 static void sp_256_mont_inv_order_avx2_4(sp_digit* r, sp_digit* a, 28804 sp_digit* td) 28805 { 28806 #ifdef WOLFSSL_SP_SMALL 28807 sp_digit* t = td; 28808 int i; 28809 28810 XMEMCPY(t, a, sizeof(sp_digit) * 4); 28811 for (i=254; i>=0; i--) { 28812 sp_256_mont_sqr_order_avx2_4(t, t); 28813 if (p256_order_2[i / 64] & ((sp_digit)1 << (i % 64))) 28814 sp_256_mont_mul_order_avx2_4(t, t, a); 28815 } 28816 XMEMCPY(r, t, sizeof(sp_digit) * 4); 28817 #else 28818 sp_digit* t = td; 28819 sp_digit* t2 = td + 2 * 4; 28820 sp_digit* t3 = td + 4 * 4; 28821 int i; 28822 28823 /* t = a^2 */ 28824 sp_256_mont_sqr_order_avx2_4(t, a); 28825 /* t = a^3 = t * a */ 28826 sp_256_mont_mul_order_avx2_4(t, t, a); 28827 /* t2= a^c = t ^ 2 ^ 2 */ 28828 sp_256_mont_sqr_n_order_avx2_4(t2, t, 2); 28829 /* t3= a^f = t2 * t */ 28830 sp_256_mont_mul_order_avx2_4(t3, t2, t); 28831 /* t2= a^f0 = t3 ^ 2 ^ 4 */ 28832 sp_256_mont_sqr_n_order_avx2_4(t2, t3, 4); 28833 /* t = a^ff = t2 * t3 */ 28834 sp_256_mont_mul_order_avx2_4(t, t2, t3); 28835 /* t3= a^ff00 = t ^ 2 ^ 8 */ 28836 sp_256_mont_sqr_n_order_avx2_4(t2, t, 8); 28837 /* t = a^ffff = t2 * t */ 28838 sp_256_mont_mul_order_avx2_4(t, t2, t); 28839 /* t2= a^ffff0000 = t ^ 2 ^ 16 */ 28840 sp_256_mont_sqr_n_order_avx2_4(t2, t, 16); 28841 /* t = a^ffffffff = t2 * t */ 28842 sp_256_mont_mul_order_avx2_4(t, t2, t); 28843 /* t2= a^ffffffff0000000000000000 = t ^ 2 ^ 64 */ 28844 sp_256_mont_sqr_n_order_avx2_4(t2, t, 64); 28845 /* t2= a^ffffffff00000000ffffffff = t2 * t */ 28846 sp_256_mont_mul_order_avx2_4(t2, t2, t); 28847 /* t2= a^ffffffff00000000ffffffff00000000 = t2 ^ 2 ^ 32 */ 28848 sp_256_mont_sqr_n_order_avx2_4(t2, t2, 32); 28849 /* t2= a^ffffffff00000000ffffffffffffffff = t2 * t */ 28850 sp_256_mont_mul_order_avx2_4(t2, t2, t); 28851 /* t2= a^ffffffff00000000ffffffffffffffffbce6 */ 28852 for (i=127; i>=112; i--) { 28853 sp_256_mont_sqr_order_avx2_4(t2, t2); 28854 if (p256_order_low[i / 64] & ((sp_digit)1 << (i % 64))) 28855 sp_256_mont_mul_order_avx2_4(t2, t2, a); 28856 } 28857 /* t2= a^ffffffff00000000ffffffffffffffffbce6f */ 28858 sp_256_mont_sqr_n_order_avx2_4(t2, t2, 4); 28859 sp_256_mont_mul_order_avx2_4(t2, t2, t3); 28860 /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84 */ 28861 for (i=107; i>=64; i--) { 28862 sp_256_mont_sqr_order_avx2_4(t2, t2); 28863 if (p256_order_low[i / 64] & ((sp_digit)1 << (i % 64))) 28864 sp_256_mont_mul_order_avx2_4(t2, t2, a); 28865 } 28866 /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84f */ 28867 sp_256_mont_sqr_n_order_avx2_4(t2, t2, 4); 28868 sp_256_mont_mul_order_avx2_4(t2, t2, t3); 28869 /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2 */ 28870 for (i=59; i>=32; i--) { 28871 sp_256_mont_sqr_order_avx2_4(t2, t2); 28872 if (p256_order_low[i / 64] & ((sp_digit)1 << (i % 64))) 28873 sp_256_mont_mul_order_avx2_4(t2, t2, a); 28874 } 28875 /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2f */ 28876 sp_256_mont_sqr_n_order_avx2_4(t2, t2, 4); 28877 sp_256_mont_mul_order_avx2_4(t2, t2, t3); 28878 /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254 */ 28879 for (i=27; i>=0; i--) { 28880 sp_256_mont_sqr_order_avx2_4(t2, t2); 28881 if (p256_order_low[i / 64] & ((sp_digit)1 << (i % 64))) 28882 sp_256_mont_mul_order_avx2_4(t2, t2, a); 28883 } 28884 /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632540 */ 28885 sp_256_mont_sqr_n_order_avx2_4(t2, t2, 4); 28886 /* r = a^ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f */ 28887 sp_256_mont_mul_order_avx2_4(r, t2, t3); 28888 #endif /* WOLFSSL_SP_SMALL */ 28889 } 28890 28891 #endif /* HAVE_INTEL_AVX2 */ 28892 #endif /* HAVE_ECC_SIGN || HAVE_ECC_VERIFY */ 28893 #ifdef HAVE_ECC_SIGN 28894 #ifndef SP_ECC_MAX_SIG_GEN 28895 #define SP_ECC_MAX_SIG_GEN 64 28896 #endif 28897 28898 /* Sign the hash using the private key. 28899 * e = [hash, 256 bits] from binary 28900 * r = (k.G)->x mod order 28901 * s = (r * x + e) / k mod order 28902 * The hash is truncated to the first 256 bits. 28903 * 28904 * hash Hash to sign. 28905 * hashLen Length of the hash data. 28906 * rng Random number generator. 28907 * priv Private part of key - scalar. 28908 * rm First part of result as an mp_int. 28909 * sm Sirst part of result as an mp_int. 28910 * heap Heap to use for allocation. 28911 * returns RNG failures, MEMORY_E when memory allocation fails and 28912 * MP_OKAY on success. 28913 */ 28914 int sp_ecc_sign_256(const byte* hash, word32 hashLen, WC_RNG* rng, mp_int* priv, 28915 mp_int* rm, mp_int* sm, void* heap) 28916 { 28917 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK) 28918 sp_digit* d; 28919 #else 28920 sp_digit ed[2*4]; 28921 sp_digit xd[2*4]; 28922 sp_digit kd[2*4]; 28923 sp_digit rd[2*4]; 28924 sp_digit td[3 * 2*4]; 28925 sp_point p; 28926 #endif 28927 sp_digit* e = NULL; 28928 sp_digit* x = NULL; 28929 sp_digit* k = NULL; 28930 sp_digit* r = NULL; 28931 sp_digit* tmp = NULL; 28932 sp_point* point = NULL; 28933 sp_digit carry; 28934 sp_digit* s; 28935 sp_digit* kInv; 28936 int err = MP_OKAY; 28937 int64_t c; 28938 int i; 28939 #ifdef HAVE_INTEL_AVX2 28940 word32 cpuid_flags = cpuid_get_flags(); 28941 #endif 28942 28943 (void)heap; 28944 28945 err = sp_ecc_point_new(heap, p, point); 28946 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK) 28947 if (err == MP_OKAY) { 28948 d = XMALLOC(sizeof(sp_digit) * 7 * 2 * 4, heap, DYNAMIC_TYPE_ECC); 28949 if (d != NULL) { 28950 e = d + 0 * 4; 28951 x = d + 2 * 4; 28952 k = d + 4 * 4; 28953 r = d + 6 * 4; 28954 tmp = d + 8 * 4; 28955 } 28956 else 28957 err = MEMORY_E; 28958 } 28959 #else 28960 e = ed; 28961 x = xd; 28962 k = kd; 28963 r = rd; 28964 tmp = td; 28965 #endif 28966 s = e; 28967 kInv = k; 28968 28969 if (err == MP_OKAY) { 28970 if (hashLen > 32) 28971 hashLen = 32; 28972 28973 sp_256_from_bin(e, 4, hash, hashLen); 28974 sp_256_from_mp(x, 4, priv); 28975 } 28976 28977 for (i = SP_ECC_MAX_SIG_GEN; err == MP_OKAY && i > 0; i--) { 28978 /* New random point. */ 28979 err = sp_256_ecc_gen_k_4(rng, k); 28980 if (err == MP_OKAY) { 28981 #ifdef HAVE_INTEL_AVX2 28982 if (IS_INTEL_BMI2(cpuid_flags) && IS_INTEL_ADX(cpuid_flags)) 28983 err = sp_256_ecc_mulmod_base_avx2_4(point, k, 1, heap); 28984 else 28985 #endif 28986 err = sp_256_ecc_mulmod_base_4(point, k, 1, NULL); 28987 } 28988 28989 if (err == MP_OKAY) { 28990 /* r = point->x mod order */ 28991 XMEMCPY(r, point->x, sizeof(sp_digit) * 4); 28992 sp_256_norm_4(r); 28993 c = sp_256_cmp_4(r, p256_order); 28994 sp_256_cond_sub_4(r, r, p256_order, 0 - (c >= 0)); 28995 sp_256_norm_4(r); 28996 28997 /* Conv k to Montgomery form (mod order) */ 28998 #ifdef HAVE_INTEL_AVX2 28999 if (IS_INTEL_BMI2(cpuid_flags) && IS_INTEL_ADX(cpuid_flags)) 29000 sp_256_mul_avx2_4(k, k, p256_norm_order); 29001 else 29002 #endif 29003 sp_256_mul_4(k, k, p256_norm_order); 29004 err = sp_256_mod_4(k, k, p256_order); 29005 } 29006 if (err == MP_OKAY) { 29007 sp_256_norm_4(k); 29008 /* kInv = 1/k mod order */ 29009 #ifdef HAVE_INTEL_AVX2 29010 if (IS_INTEL_BMI2(cpuid_flags) && IS_INTEL_ADX(cpuid_flags)) 29011 sp_256_mont_inv_order_avx2_4(kInv, k, tmp); 29012 else 29013 #endif 29014 sp_256_mont_inv_order_4(kInv, k, tmp); 29015 sp_256_norm_4(kInv); 29016 29017 /* s = r * x + e */ 29018 #ifdef HAVE_INTEL_AVX2 29019 if (IS_INTEL_BMI2(cpuid_flags) && IS_INTEL_ADX(cpuid_flags)) 29020 sp_256_mul_avx2_4(x, x, r); 29021 else 29022 #endif 29023 sp_256_mul_4(x, x, r); 29024 err = sp_256_mod_4(x, x, p256_order); 29025 } 29026 if (err == MP_OKAY) { 29027 sp_256_norm_4(x); 29028 carry = sp_256_add_4(s, e, x); 29029 sp_256_cond_sub_4(s, s, p256_order, 0 - carry); 29030 sp_256_norm_4(s); 29031 c = sp_256_cmp_4(s, p256_order); 29032 sp_256_cond_sub_4(s, s, p256_order, 0 - (c >= 0)); 29033 sp_256_norm_4(s); 29034 29035 /* s = s * k^-1 mod order */ 29036 #ifdef HAVE_INTEL_AVX2 29037 if (IS_INTEL_BMI2(cpuid_flags) && IS_INTEL_ADX(cpuid_flags)) 29038 sp_256_mont_mul_order_avx2_4(s, s, kInv); 29039 else 29040 #endif 29041 sp_256_mont_mul_order_4(s, s, kInv); 29042 sp_256_norm_4(s); 29043 29044 /* Check that signature is usable. */ 29045 if (!sp_256_iszero_4(s)) 29046 break; 29047 } 29048 } 29049 29050 if (i == 0) 29051 err = RNG_FAILURE_E; 29052 29053 if (err == MP_OKAY) 29054 err = sp_256_to_mp(r, rm); 29055 if (err == MP_OKAY) 29056 err = sp_256_to_mp(s, sm); 29057 29058 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK) 29059 if (d != NULL) { 29060 XMEMSET(d, 0, sizeof(sp_digit) * 8 * 4); 29061 XFREE(d, heap, DYNAMIC_TYPE_ECC); 29062 } 29063 #else 29064 XMEMSET(e, 0, sizeof(sp_digit) * 2 * 4); 29065 XMEMSET(x, 0, sizeof(sp_digit) * 2 * 4); 29066 XMEMSET(k, 0, sizeof(sp_digit) * 2 * 4); 29067 XMEMSET(r, 0, sizeof(sp_digit) * 2 * 4); 29068 XMEMSET(r, 0, sizeof(sp_digit) * 2 * 4); 29069 XMEMSET(tmp, 0, sizeof(sp_digit) * 3 * 2*4); 29070 #endif 29071 sp_ecc_point_free(point, 1, heap); 29072 29073 return err; 29074 } 29075 #endif /* HAVE_ECC_SIGN */ 29076 29077 #ifdef HAVE_ECC_VERIFY 29078 /* Verify the signature values with the hash and public key. 29079 * e = Truncate(hash, 256) 29080 * u1 = e/s mod order 29081 * u2 = r/s mod order 29082 * r == (u1.G + u2.Q)->x mod order 29083 * Optimization: Leave point in projective form. 29084 * (x, y, 1) == (x' / z'*z', y' / z'*z'*z', z' / z') 29085 * (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x' 29086 * The hash is truncated to the first 256 bits. 29087 * 29088 * hash Hash to sign. 29089 * hashLen Length of the hash data. 29090 * rng Random number generator. 29091 * priv Private part of key - scalar. 29092 * rm First part of result as an mp_int. 29093 * sm Sirst part of result as an mp_int. 29094 * heap Heap to use for allocation. 29095 * returns RNG failures, MEMORY_E when memory allocation fails and 29096 * MP_OKAY on success. 29097 */ 29098 int sp_ecc_verify_256(const byte* hash, word32 hashLen, mp_int* pX, 29099 mp_int* pY, mp_int* pZ, mp_int* r, mp_int* sm, int* res, void* heap) 29100 { 29101 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK) 29102 sp_digit* d = NULL; 29103 #else 29104 sp_digit u1d[2*4]; 29105 sp_digit u2d[2*4]; 29106 sp_digit sd[2*4]; 29107 sp_digit tmpd[2*4 * 5]; 29108 sp_point p1d; 29109 sp_point p2d; 29110 #endif 29111 sp_digit* u1; 29112 sp_digit* u2; 29113 sp_digit* s; 29114 sp_digit* tmp; 29115 sp_point* p1; 29116 sp_point* p2 = NULL; 29117 sp_digit carry; 29118 int64_t c; 29119 int err; 29120 #ifdef HAVE_INTEL_AVX2 29121 word32 cpuid_flags = cpuid_get_flags(); 29122 #endif 29123 29124 err = sp_ecc_point_new(heap, p1d, p1); 29125 if (err == MP_OKAY) 29126 err = sp_ecc_point_new(heap, p2d, p2); 29127 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK) 29128 if (err == MP_OKAY) { 29129 d = XMALLOC(sizeof(sp_digit) * 16 * 4, heap, DYNAMIC_TYPE_ECC); 29130 if (d != NULL) { 29131 u1 = d + 0 * 4; 29132 u2 = d + 2 * 4; 29133 s = d + 4 * 4; 29134 tmp = d + 6 * 4; 29135 } 29136 else 29137 err = MEMORY_E; 29138 } 29139 #else 29140 u1 = u1d; 29141 u2 = u2d; 29142 s = sd; 29143 tmp = tmpd; 29144 #endif 29145 29146 if (err == MP_OKAY) { 29147 if (hashLen > 32) 29148 hashLen = 32; 29149 29150 sp_256_from_bin(u1, 4, hash, hashLen); 29151 sp_256_from_mp(u2, 4, r); 29152 sp_256_from_mp(s, 4, sm); 29153 sp_256_from_mp(p2->x, 4, pX); 29154 sp_256_from_mp(p2->y, 4, pY); 29155 sp_256_from_mp(p2->z, 4, pZ); 29156 29157 #ifdef HAVE_INTEL_AVX2 29158 if (IS_INTEL_BMI2(cpuid_flags) && IS_INTEL_ADX(cpuid_flags)) 29159 sp_256_mul_avx2_4(s, s, p256_norm_order); 29160 else 29161 #endif 29162 sp_256_mul_4(s, s, p256_norm_order); 29163 err = sp_256_mod_4(s, s, p256_order); 29164 } 29165 if (err == MP_OKAY) { 29166 sp_256_norm_4(s); 29167 #ifdef HAVE_INTEL_AVX2 29168 if (IS_INTEL_BMI2(cpuid_flags) && IS_INTEL_ADX(cpuid_flags)) { 29169 sp_256_mont_inv_order_avx2_4(s, s, tmp); 29170 sp_256_mont_mul_order_avx2_4(u1, u1, s); 29171 sp_256_mont_mul_order_avx2_4(u2, u2, s); 29172 } 29173 else 29174 #endif 29175 { 29176 sp_256_mont_inv_order_4(s, s, tmp); 29177 sp_256_mont_mul_order_4(u1, u1, s); 29178 sp_256_mont_mul_order_4(u2, u2, s); 29179 } 29180 29181 #ifdef HAVE_INTEL_AVX2 29182 if (IS_INTEL_BMI2(cpuid_flags) && IS_INTEL_ADX(cpuid_flags)) 29183 err = sp_256_ecc_mulmod_base_avx2_4(p1, u1, 0, heap); 29184 else 29185 #endif 29186 err = sp_256_ecc_mulmod_base_4(p1, u1, 0, heap); 29187 } 29188 if (err == MP_OKAY) { 29189 #ifdef HAVE_INTEL_AVX2 29190 if (IS_INTEL_BMI2(cpuid_flags) && IS_INTEL_ADX(cpuid_flags)) 29191 err = sp_256_ecc_mulmod_avx2_4(p2, p2, u2, 0, heap); 29192 else 29193 #endif 29194 err = sp_256_ecc_mulmod_4(p2, p2, u2, 0, heap); 29195 } 29196 29197 if (err == MP_OKAY) { 29198 #ifdef HAVE_INTEL_AVX2 29199 if (IS_INTEL_BMI2(cpuid_flags) && IS_INTEL_ADX(cpuid_flags)) 29200 sp_256_proj_point_add_avx2_4(p1, p1, p2, tmp); 29201 else 29202 #endif 29203 sp_256_proj_point_add_4(p1, p1, p2, tmp); 29204 29205 /* (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x' */ 29206 /* Reload r and convert to Montgomery form. */ 29207 sp_256_from_mp(u2, 4, r); 29208 err = sp_256_mod_mul_norm_4(u2, u2, p256_mod); 29209 } 29210 29211 if (err == MP_OKAY) { 29212 /* u1 = r.z'.z' mod prime */ 29213 sp_256_mont_sqr_4(p1->z, p1->z, p256_mod, p256_mp_mod); 29214 sp_256_mont_mul_4(u1, u2, p1->z, p256_mod, p256_mp_mod); 29215 *res = sp_256_cmp_4(p1->x, u1) == 0; 29216 if (*res == 0) { 29217 /* Reload r and add order. */ 29218 sp_256_from_mp(u2, 4, r); 29219 carry = sp_256_add_4(u2, u2, p256_order); 29220 /* Carry means result is greater than mod and is not valid. */ 29221 if (!carry) { 29222 sp_256_norm_4(u2); 29223 29224 /* Compare with mod and if greater or equal then not valid. */ 29225 c = sp_256_cmp_4(u2, p256_mod); 29226 if (c < 0) { 29227 /* Convert to Montogomery form */ 29228 err = sp_256_mod_mul_norm_4(u2, u2, p256_mod); 29229 if (err == MP_OKAY) { 29230 /* u1 = (r + 1*order).z'.z' mod prime */ 29231 sp_256_mont_mul_4(u1, u2, p1->z, p256_mod, 29232 p256_mp_mod); 29233 *res = sp_256_cmp_4(p1->x, u2) == 0; 29234 } 29235 } 29236 } 29237 } 29238 } 29239 29240 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK) 29241 if (d != NULL) 29242 XFREE(d, heap, DYNAMIC_TYPE_ECC); 29243 #endif 29244 sp_ecc_point_free(p1, 0, heap); 29245 sp_ecc_point_free(p2, 0, heap); 29246 29247 return err; 29248 } 29249 #endif /* HAVE_ECC_VERIFY */ 29250 29251 #ifdef HAVE_ECC_CHECK_KEY 29252 /* Check that the x and y oridinates are a valid point on the curve. 29253 * 29254 * point EC point. 29255 * heap Heap to use if dynamically allocating. 29256 * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is 29257 * not on the curve and MP_OKAY otherwise. 29258 */ 29259 static int sp_256_ecc_is_point_4(sp_point* point, void* heap) 29260 { 29261 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK) 29262 sp_digit* d = NULL; 29263 #else 29264 sp_digit t1d[2*4]; 29265 sp_digit t2d[2*4]; 29266 #endif 29267 sp_digit* t1; 29268 sp_digit* t2; 29269 int err = MP_OKAY; 29270 29271 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK) 29272 d = XMALLOC(sizeof(sp_digit) * 4 * 4, heap, DYNAMIC_TYPE_ECC); 29273 if (d != NULL) { 29274 t1 = d + 0 * 4; 29275 t2 = d + 2 * 4; 29276 } 29277 else 29278 err = MEMORY_E; 29279 #else 29280 (void)heap; 29281 29282 t1 = t1d; 29283 t2 = t2d; 29284 #endif 29285 29286 if (err == MP_OKAY) { 29287 sp_256_sqr_4(t1, point->y); 29288 sp_256_mod_4(t1, t1, p256_mod); 29289 sp_256_sqr_4(t2, point->x); 29290 sp_256_mod_4(t2, t2, p256_mod); 29291 sp_256_mul_4(t2, t2, point->x); 29292 sp_256_mod_4(t2, t2, p256_mod); 29293 sp_256_sub_4(t2, p256_mod, t2); 29294 sp_256_mont_add_4(t1, t1, t2, p256_mod); 29295 29296 sp_256_mont_add_4(t1, t1, point->x, p256_mod); 29297 sp_256_mont_add_4(t1, t1, point->x, p256_mod); 29298 sp_256_mont_add_4(t1, t1, point->x, p256_mod); 29299 29300 if (sp_256_cmp_4(t1, p256_b) != 0) 29301 err = MP_VAL; 29302 } 29303 29304 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK) 29305 if (d != NULL) 29306 XFREE(d, heap, DYNAMIC_TYPE_ECC); 29307 #endif 29308 29309 return err; 29310 } 29311 29312 /* Check that the x and y oridinates are a valid point on the curve. 29313 * 29314 * pX X ordinate of EC point. 29315 * pY Y ordinate of EC point. 29316 * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is 29317 * not on the curve and MP_OKAY otherwise. 29318 */ 29319 int sp_ecc_is_point_256(mp_int* pX, mp_int* pY) 29320 { 29321 #if !defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SMALL_STACK) 29322 sp_point pubd; 29323 #endif 29324 sp_point* pub; 29325 byte one[1] = { 1 }; 29326 int err; 29327 29328 err = sp_ecc_point_new(NULL, pubd, pub); 29329 if (err == MP_OKAY) { 29330 sp_256_from_mp(pub->x, 4, pX); 29331 sp_256_from_mp(pub->y, 4, pY); 29332 sp_256_from_bin(pub->z, 4, one, sizeof(one)); 29333 29334 err = sp_256_ecc_is_point_4(pub, NULL); 29335 } 29336 29337 sp_ecc_point_free(pub, 0, NULL); 29338 29339 return err; 29340 } 29341 29342 /* Check that the private scalar generates the EC point (px, py), the point is 29343 * on the curve and the point has the correct order. 29344 * 29345 * pX X ordinate of EC point. 29346 * pY Y ordinate of EC point. 29347 * privm Private scalar that generates EC point. 29348 * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is 29349 * not on the curve, ECC_INF_E if the point does not have the correct order, 29350 * ECC_PRIV_KEY_E when the private scalar doesn't generate the EC point and 29351 * MP_OKAY otherwise. 29352 */ 29353 int sp_ecc_check_key_256(mp_int* pX, mp_int* pY, mp_int* privm, void* heap) 29354 { 29355 #if !defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SMALL_STACK) 29356 sp_digit privd[4]; 29357 sp_point pubd; 29358 sp_point pd; 29359 #endif 29360 sp_digit* priv = NULL; 29361 sp_point* pub; 29362 sp_point* p = NULL; 29363 byte one[1] = { 1 }; 29364 int err; 29365 #ifdef HAVE_INTEL_AVX2 29366 word32 cpuid_flags = cpuid_get_flags(); 29367 #endif 29368 29369 err = sp_ecc_point_new(heap, pubd, pub); 29370 if (err == MP_OKAY) 29371 err = sp_ecc_point_new(heap, pd, p); 29372 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK) 29373 if (err == MP_OKAY) { 29374 priv = XMALLOC(sizeof(sp_digit) * 4, heap, DYNAMIC_TYPE_ECC); 29375 if (priv == NULL) 29376 err = MEMORY_E; 29377 } 29378 #else 29379 priv = privd; 29380 #endif 29381 29382 if (err == MP_OKAY) { 29383 sp_256_from_mp(pub->x, 4, pX); 29384 sp_256_from_mp(pub->y, 4, pY); 29385 sp_256_from_bin(pub->z, 4, one, sizeof(one)); 29386 sp_256_from_mp(priv, 4, privm); 29387 29388 /* Check point at infinitiy. */ 29389 if (sp_256_iszero_4(pub->x) && 29390 sp_256_iszero_4(pub->y)) 29391 err = ECC_INF_E; 29392 } 29393 29394 if (err == MP_OKAY) { 29395 /* Check range of X and Y */ 29396 if (sp_256_cmp_4(pub->x, p256_mod) >= 0 || 29397 sp_256_cmp_4(pub->y, p256_mod) >= 0) 29398 err = ECC_OUT_OF_RANGE_E; 29399 } 29400 29401 if (err == MP_OKAY) { 29402 /* Check point is on curve */ 29403 err = sp_256_ecc_is_point_4(pub, heap); 29404 } 29405 29406 if (err == MP_OKAY) { 29407 /* Point * order = infinity */ 29408 #ifdef HAVE_INTEL_AVX2 29409 if (IS_INTEL_BMI2(cpuid_flags) && IS_INTEL_ADX(cpuid_flags)) 29410 err = sp_256_ecc_mulmod_avx2_4(p, pub, p256_order, 1, heap); 29411 else 29412 #endif 29413 err = sp_256_ecc_mulmod_4(p, pub, p256_order, 1, heap); 29414 } 29415 if (err == MP_OKAY) { 29416 /* Check result is infinity */ 29417 if (!sp_256_iszero_4(p->x) || 29418 !sp_256_iszero_4(p->y)) { 29419 err = ECC_INF_E; 29420 } 29421 } 29422 29423 if (err == MP_OKAY) { 29424 /* Base * private = point */ 29425 #ifdef HAVE_INTEL_AVX2 29426 if (IS_INTEL_BMI2(cpuid_flags) && IS_INTEL_ADX(cpuid_flags)) 29427 err = sp_256_ecc_mulmod_base_avx2_4(p, priv, 1, heap); 29428 else 29429 #endif 29430 err = sp_256_ecc_mulmod_base_4(p, priv, 1, heap); 29431 } 29432 if (err == MP_OKAY) { 29433 /* Check result is public key */ 29434 if (sp_256_cmp_4(p->x, pub->x) != 0 || 29435 sp_256_cmp_4(p->y, pub->y) != 0) { 29436 err = ECC_PRIV_KEY_E; 29437 } 29438 } 29439 29440 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK) 29441 if (priv != NULL) 29442 XFREE(priv, heap, DYNAMIC_TYPE_ECC); 29443 #endif 29444 sp_ecc_point_free(p, 0, heap); 29445 sp_ecc_point_free(pub, 0, heap); 29446 29447 return err; 29448 } 29449 #endif 29450 #ifdef WOLFSSL_PUBLIC_ECC_ADD_DBL 29451 /* Add two projective EC points together. 29452 * (pX, pY, pZ) + (qX, qY, qZ) = (rX, rY, rZ) 29453 * 29454 * pX First EC point's X ordinate. 29455 * pY First EC point's Y ordinate. 29456 * pZ First EC point's Z ordinate. 29457 * qX Second EC point's X ordinate. 29458 * qY Second EC point's Y ordinate. 29459 * qZ Second EC point's Z ordinate. 29460 * rX Resultant EC point's X ordinate. 29461 * rY Resultant EC point's Y ordinate. 29462 * rZ Resultant EC point's Z ordinate. 29463 * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise. 29464 */ 29465 int sp_ecc_proj_add_point_256(mp_int* pX, mp_int* pY, mp_int* pZ, 29466 mp_int* qX, mp_int* qY, mp_int* qZ, 29467 mp_int* rX, mp_int* rY, mp_int* rZ) 29468 { 29469 #if !defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SMALL_STACK) 29470 sp_digit tmpd[2 * 4 * 5]; 29471 sp_point pd; 29472 sp_point qd; 29473 #endif 29474 sp_digit* tmp; 29475 sp_point* p; 29476 sp_point* q = NULL; 29477 int err; 29478 #ifdef HAVE_INTEL_AVX2 29479 word32 cpuid_flags = cpuid_get_flags(); 29480 #endif 29481 29482 err = sp_ecc_point_new(NULL, pd, p); 29483 if (err == MP_OKAY) 29484 err = sp_ecc_point_new(NULL, qd, q); 29485 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK) 29486 if (err == MP_OKAY) { 29487 tmp = XMALLOC(sizeof(sp_digit) * 2 * 4 * 5, NULL, DYNAMIC_TYPE_ECC); 29488 if (tmp == NULL) 29489 err = MEMORY_E; 29490 } 29491 #else 29492 tmp = tmpd; 29493 #endif 29494 29495 if (err == MP_OKAY) { 29496 sp_256_from_mp(p->x, 4, pX); 29497 sp_256_from_mp(p->y, 4, pY); 29498 sp_256_from_mp(p->z, 4, pZ); 29499 sp_256_from_mp(q->x, 4, qX); 29500 sp_256_from_mp(q->y, 4, qY); 29501 sp_256_from_mp(q->z, 4, qZ); 29502 29503 #ifdef HAVE_INTEL_AVX2 29504 if (IS_INTEL_BMI2(cpuid_flags) && IS_INTEL_ADX(cpuid_flags)) 29505 sp_256_proj_point_add_avx2_4(p, p, q, tmp); 29506 else 29507 #endif 29508 sp_256_proj_point_add_4(p, p, q, tmp); 29509 } 29510 29511 if (err == MP_OKAY) 29512 err = sp_256_to_mp(p->x, rX); 29513 if (err == MP_OKAY) 29514 err = sp_256_to_mp(p->y, rY); 29515 if (err == MP_OKAY) 29516 err = sp_256_to_mp(p->z, rZ); 29517 29518 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK) 29519 if (tmp != NULL) 29520 XFREE(tmp, NULL, DYNAMIC_TYPE_ECC); 29521 #endif 29522 sp_ecc_point_free(q, 0, NULL); 29523 sp_ecc_point_free(p, 0, NULL); 29524 29525 return err; 29526 } 29527 29528 /* Double a projective EC point. 29529 * (pX, pY, pZ) + (pX, pY, pZ) = (rX, rY, rZ) 29530 * 29531 * pX EC point's X ordinate. 29532 * pY EC point's Y ordinate. 29533 * pZ EC point's Z ordinate. 29534 * rX Resultant EC point's X ordinate. 29535 * rY Resultant EC point's Y ordinate. 29536 * rZ Resultant EC point's Z ordinate. 29537 * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise. 29538 */ 29539 int sp_ecc_proj_dbl_point_256(mp_int* pX, mp_int* pY, mp_int* pZ, 29540 mp_int* rX, mp_int* rY, mp_int* rZ) 29541 { 29542 #if !defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SMALL_STACK) 29543 sp_digit tmpd[2 * 4 * 2]; 29544 sp_point pd; 29545 #endif 29546 sp_digit* tmp; 29547 sp_point* p; 29548 int err; 29549 #ifdef HAVE_INTEL_AVX2 29550 word32 cpuid_flags = cpuid_get_flags(); 29551 #endif 29552 29553 err = sp_ecc_point_new(NULL, pd, p); 29554 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK) 29555 if (err == MP_OKAY) { 29556 tmp = XMALLOC(sizeof(sp_digit) * 2 * 4 * 2, NULL, DYNAMIC_TYPE_ECC); 29557 if (tmp == NULL) 29558 err = MEMORY_E; 29559 } 29560 #else 29561 tmp = tmpd; 29562 #endif 29563 29564 if (err == MP_OKAY) { 29565 sp_256_from_mp(p->x, 4, pX); 29566 sp_256_from_mp(p->y, 4, pY); 29567 sp_256_from_mp(p->z, 4, pZ); 29568 29569 #ifdef HAVE_INTEL_AVX2 29570 if (IS_INTEL_BMI2(cpuid_flags) && IS_INTEL_ADX(cpuid_flags)) 29571 sp_256_proj_point_dbl_avx2_4(p, p, tmp); 29572 else 29573 #endif 29574 sp_256_proj_point_dbl_4(p, p, tmp); 29575 } 29576 29577 if (err == MP_OKAY) 29578 err = sp_256_to_mp(p->x, rX); 29579 if (err == MP_OKAY) 29580 err = sp_256_to_mp(p->y, rY); 29581 if (err == MP_OKAY) 29582 err = sp_256_to_mp(p->z, rZ); 29583 29584 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK) 29585 if (tmp != NULL) 29586 XFREE(tmp, NULL, DYNAMIC_TYPE_ECC); 29587 #endif 29588 sp_ecc_point_free(p, 0, NULL); 29589 29590 return err; 29591 } 29592 29593 /* Map a projective EC point to affine in place. 29594 * pZ will be one. 29595 * 29596 * pX EC point's X ordinate. 29597 * pY EC point's Y ordinate. 29598 * pZ EC point's Z ordinate. 29599 * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise. 29600 */ 29601 int sp_ecc_map_256(mp_int* pX, mp_int* pY, mp_int* pZ) 29602 { 29603 #if !defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SMALL_STACK) 29604 sp_digit tmpd[2 * 4 * 4]; 29605 sp_point pd; 29606 #endif 29607 sp_digit* tmp; 29608 sp_point* p; 29609 int err; 29610 29611 err = sp_ecc_point_new(NULL, pd, p); 29612 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK) 29613 if (err == MP_OKAY) { 29614 tmp = XMALLOC(sizeof(sp_digit) * 2 * 4 * 4, NULL, DYNAMIC_TYPE_ECC); 29615 if (tmp == NULL) 29616 err = MEMORY_E; 29617 } 29618 #else 29619 tmp = tmpd; 29620 #endif 29621 if (err == MP_OKAY) { 29622 sp_256_from_mp(p->x, 4, pX); 29623 sp_256_from_mp(p->y, 4, pY); 29624 sp_256_from_mp(p->z, 4, pZ); 29625 29626 sp_256_map_4(p, p, tmp); 29627 } 29628 29629 if (err == MP_OKAY) 29630 err = sp_256_to_mp(p->x, pX); 29631 if (err == MP_OKAY) 29632 err = sp_256_to_mp(p->y, pY); 29633 if (err == MP_OKAY) 29634 err = sp_256_to_mp(p->z, pZ); 29635 29636 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK) 29637 if (tmp != NULL) 29638 XFREE(tmp, NULL, DYNAMIC_TYPE_ECC); 29639 #endif 29640 sp_ecc_point_free(p, 0, NULL); 29641 29642 return err; 29643 } 29644 #endif /* WOLFSSL_PUBLIC_ECC_ADD_DBL */ 29645 #ifdef HAVE_COMP_KEY 29646 /* Find the square root of a number mod the prime of the curve. 29647 * 29648 * y The number to operate on and the result. 29649 * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise. 29650 */ 29651 static int sp_256_mont_sqrt_4(sp_digit* y) 29652 { 29653 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK) 29654 sp_digit* d; 29655 #else 29656 sp_digit t1d[2 * 4]; 29657 sp_digit t2d[2 * 4]; 29658 #endif 29659 sp_digit* t1; 29660 sp_digit* t2; 29661 int err = MP_OKAY; 29662 #ifdef HAVE_INTEL_AVX2 29663 word32 cpuid_flags = cpuid_get_flags(); 29664 #endif 29665 29666 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK) 29667 d = XMALLOC(sizeof(sp_digit) * 4 * 4, NULL, DYNAMIC_TYPE_ECC); 29668 if (d != NULL) { 29669 t1 = d + 0 * 4; 29670 t2 = d + 2 * 4; 29671 } 29672 else 29673 err = MEMORY_E; 29674 #else 29675 t1 = t1d; 29676 t2 = t2d; 29677 #endif 29678 29679 if (err == MP_OKAY) { 29680 #ifdef HAVE_INTEL_AVX2 29681 if (IS_INTEL_BMI2(cpuid_flags) && IS_INTEL_ADX(cpuid_flags)) { 29682 /* t2 = y ^ 0x2 */ 29683 sp_256_mont_sqr_avx2_4(t2, y, p256_mod, p256_mp_mod); 29684 /* t1 = y ^ 0x3 */ 29685 sp_256_mont_mul_avx2_4(t1, t2, y, p256_mod, p256_mp_mod); 29686 /* t2 = y ^ 0xc */ 29687 sp_256_mont_sqr_n_avx2_4(t2, t1, 2, p256_mod, p256_mp_mod); 29688 /* t1 = y ^ 0xf */ 29689 sp_256_mont_mul_avx2_4(t1, t1, t2, p256_mod, p256_mp_mod); 29690 /* t2 = y ^ 0xf0 */ 29691 sp_256_mont_sqr_n_avx2_4(t2, t1, 4, p256_mod, p256_mp_mod); 29692 /* t1 = y ^ 0xff */ 29693 sp_256_mont_mul_avx2_4(t1, t1, t2, p256_mod, p256_mp_mod); 29694 /* t2 = y ^ 0xff00 */ 29695 sp_256_mont_sqr_n_avx2_4(t2, t1, 8, p256_mod, p256_mp_mod); 29696 /* t1 = y ^ 0xffff */ 29697 sp_256_mont_mul_avx2_4(t1, t1, t2, p256_mod, p256_mp_mod); 29698 /* t2 = y ^ 0xffff0000 */ 29699 sp_256_mont_sqr_n_avx2_4(t2, t1, 16, p256_mod, p256_mp_mod); 29700 /* t1 = y ^ 0xffffffff */ 29701 sp_256_mont_mul_avx2_4(t1, t1, t2, p256_mod, p256_mp_mod); 29702 /* t1 = y ^ 0xffffffff00000000 */ 29703 sp_256_mont_sqr_n_avx2_4(t1, t1, 32, p256_mod, p256_mp_mod); 29704 /* t1 = y ^ 0xffffffff00000001 */ 29705 sp_256_mont_mul_avx2_4(t1, t1, y, p256_mod, p256_mp_mod); 29706 /* t1 = y ^ 0xffffffff00000001000000000000000000000000 */ 29707 sp_256_mont_sqr_n_avx2_4(t1, t1, 96, p256_mod, p256_mp_mod); 29708 /* t1 = y ^ 0xffffffff00000001000000000000000000000001 */ 29709 sp_256_mont_mul_avx2_4(t1, t1, y, p256_mod, p256_mp_mod); 29710 sp_256_mont_sqr_n_avx2_4(y, t1, 94, p256_mod, p256_mp_mod); 29711 } 29712 else 29713 #endif 29714 { 29715 /* t2 = y ^ 0x2 */ 29716 sp_256_mont_sqr_4(t2, y, p256_mod, p256_mp_mod); 29717 /* t1 = y ^ 0x3 */ 29718 sp_256_mont_mul_4(t1, t2, y, p256_mod, p256_mp_mod); 29719 /* t2 = y ^ 0xc */ 29720 sp_256_mont_sqr_n_4(t2, t1, 2, p256_mod, p256_mp_mod); 29721 /* t1 = y ^ 0xf */ 29722 sp_256_mont_mul_4(t1, t1, t2, p256_mod, p256_mp_mod); 29723 /* t2 = y ^ 0xf0 */ 29724 sp_256_mont_sqr_n_4(t2, t1, 4, p256_mod, p256_mp_mod); 29725 /* t1 = y ^ 0xff */ 29726 sp_256_mont_mul_4(t1, t1, t2, p256_mod, p256_mp_mod); 29727 /* t2 = y ^ 0xff00 */ 29728 sp_256_mont_sqr_n_4(t2, t1, 8, p256_mod, p256_mp_mod); 29729 /* t1 = y ^ 0xffff */ 29730 sp_256_mont_mul_4(t1, t1, t2, p256_mod, p256_mp_mod); 29731 /* t2 = y ^ 0xffff0000 */ 29732 sp_256_mont_sqr_n_4(t2, t1, 16, p256_mod, p256_mp_mod); 29733 /* t1 = y ^ 0xffffffff */ 29734 sp_256_mont_mul_4(t1, t1, t2, p256_mod, p256_mp_mod); 29735 /* t1 = y ^ 0xffffffff00000000 */ 29736 sp_256_mont_sqr_n_4(t1, t1, 32, p256_mod, p256_mp_mod); 29737 /* t1 = y ^ 0xffffffff00000001 */ 29738 sp_256_mont_mul_4(t1, t1, y, p256_mod, p256_mp_mod); 29739 /* t1 = y ^ 0xffffffff00000001000000000000000000000000 */ 29740 sp_256_mont_sqr_n_4(t1, t1, 96, p256_mod, p256_mp_mod); 29741 /* t1 = y ^ 0xffffffff00000001000000000000000000000001 */ 29742 sp_256_mont_mul_4(t1, t1, y, p256_mod, p256_mp_mod); 29743 sp_256_mont_sqr_n_4(y, t1, 94, p256_mod, p256_mp_mod); 29744 } 29745 } 29746 29747 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK) 29748 if (d != NULL) 29749 XFREE(d, NULL, DYNAMIC_TYPE_ECC); 29750 #endif 29751 29752 return err; 29753 } 29754 29755 /* Uncompress the point given the X ordinate. 29756 * 29757 * xm X ordinate. 29758 * odd Whether the Y ordinate is odd. 29759 * ym Calculated Y ordinate. 29760 * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise. 29761 */ 29762 int sp_ecc_uncompress_256(mp_int* xm, int odd, mp_int* ym) 29763 { 29764 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK) 29765 sp_digit* d; 29766 #else 29767 sp_digit xd[2 * 4]; 29768 sp_digit yd[2 * 4]; 29769 #endif 29770 sp_digit* x; 29771 sp_digit* y; 29772 int err = MP_OKAY; 29773 #ifdef HAVE_INTEL_AVX2 29774 word32 cpuid_flags = cpuid_get_flags(); 29775 #endif 29776 29777 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK) 29778 d = XMALLOC(sizeof(sp_digit) * 4 * 4, NULL, DYNAMIC_TYPE_ECC); 29779 if (d != NULL) { 29780 x = d + 0 * 4; 29781 y = d + 2 * 4; 29782 } 29783 else 29784 err = MEMORY_E; 29785 #else 29786 x = xd; 29787 y = yd; 29788 #endif 29789 29790 if (err == MP_OKAY) { 29791 sp_256_from_mp(x, 4, xm); 29792 29793 err = sp_256_mod_mul_norm_4(x, x, p256_mod); 29794 } 29795 29796 if (err == MP_OKAY) { 29797 /* y = x^3 */ 29798 #ifdef HAVE_INTEL_AVX2 29799 if (IS_INTEL_BMI2(cpuid_flags) && IS_INTEL_ADX(cpuid_flags)) { 29800 sp_256_mont_sqr_avx2_4(y, x, p256_mod, p256_mp_mod); 29801 sp_256_mont_mul_avx2_4(y, y, x, p256_mod, p256_mp_mod); 29802 } 29803 else 29804 #endif 29805 { 29806 sp_256_mont_sqr_4(y, x, p256_mod, p256_mp_mod); 29807 sp_256_mont_mul_4(y, y, x, p256_mod, p256_mp_mod); 29808 } 29809 /* y = x^3 - 3x */ 29810 sp_256_mont_sub_4(y, y, x, p256_mod); 29811 sp_256_mont_sub_4(y, y, x, p256_mod); 29812 sp_256_mont_sub_4(y, y, x, p256_mod); 29813 /* y = x^3 - 3x + b */ 29814 err = sp_256_mod_mul_norm_4(x, p256_b, p256_mod); 29815 } 29816 if (err == MP_OKAY) { 29817 sp_256_mont_add_4(y, y, x, p256_mod); 29818 /* y = sqrt(x^3 - 3x + b) */ 29819 err = sp_256_mont_sqrt_4(y); 29820 } 29821 if (err == MP_OKAY) { 29822 XMEMSET(y + 4, 0, 4 * sizeof(sp_digit)); 29823 sp_256_mont_reduce_4(y, p256_mod, p256_mp_mod); 29824 if (((y[0] ^ odd) & 1) != 0) 29825 sp_256_mont_sub_4(y, p256_mod, y, p256_mod); 29826 29827 err = sp_256_to_mp(y, ym); 29828 } 29829 29830 #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK) 29831 if (d != NULL) 29832 XFREE(d, NULL, DYNAMIC_TYPE_ECC); 29833 #endif 29834 29835 return err; 29836 } 29837 #endif 29838 #endif /* WOLFSSL_SP_NO_256 */ 29839 #endif /* WOLFSSL_HAVE_SP_ECC */ 29840 #endif /* WOLFSSL_SP_ARM64_ASM */ 29841 #endif /* WOLFSSL_HAVE_SP_RSA || WOLFSSL_HAVE_SP_DH || WOLFSSL_HAVE_SP_ECC */ 29842
Generated on Tue Jul 12 2022 16:58:08 by 1.7.2