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