32 #define TRACE_LEVEL CRYPTO_TRACE_LEVEL
41 #if (X448_SUPPORT == ENABLED || ED448_SUPPORT == ENABLED)
58 for(i = 1; i < 16; i++)
74 #if (CURVE448_SPEED_OPTIMIZATION_LEVEL <= 1)
79 for(temp = 0, i = 0; i < 16; i++)
82 r[i] = temp & 0x0FFFFFFF;
94 r[0] = temp & 0x0FFFFFFF;
97 r[1] = temp & 0x0FFFFFFF;
100 r[2] = temp & 0x0FFFFFFF;
103 r[3] = temp & 0x0FFFFFFF;
106 r[4] = temp & 0x0FFFFFFF;
109 r[5] = temp & 0x0FFFFFFF;
112 r[6] = temp & 0x0FFFFFFF;
115 r[7] = temp & 0x0FFFFFFF;
118 r[8] = temp & 0x0FFFFFFF;
121 r[9] = temp & 0x0FFFFFFF;
123 temp +=
a[10] +
b[10];
124 r[10] = temp & 0x0FFFFFFF;
126 temp +=
a[11] +
b[11];
127 r[11] = temp & 0x0FFFFFFF;
129 temp +=
a[12] +
b[12];
130 r[12] = temp & 0x0FFFFFFF;
132 temp +=
a[13] +
b[13];
133 r[13] = temp & 0x0FFFFFFF;
135 temp +=
a[14] +
b[14];
136 r[14] = temp & 0x0FFFFFFF;
138 temp +=
a[15] +
b[15];
139 r[15] = temp & 0x0FFFFFFF;
162 for(temp =
b, i = 0; i < 16; i++)
165 r[i] = temp & 0x0FFFFFFF;
184 #if (CURVE448_SPEED_OPTIMIZATION_LEVEL <= 1)
189 for(temp = 0, i = 0; i < 16; i++)
192 r[i] = temp & 0x0FFFFFFF;
204 r[0] = temp & 0x0FFFFFFF;
207 r[1] = temp & 0x0FFFFFFF;
210 r[2] = temp & 0x0FFFFFFF;
213 r[3] = temp & 0x0FFFFFFF;
216 r[4] = temp & 0x0FFFFFFF;
219 r[5] = temp & 0x0FFFFFFF;
222 r[6] = temp & 0x0FFFFFFF;
225 r[7] = temp & 0x0FFFFFFF;
228 r[8] = temp & 0x0FFFFFFF;
231 r[9] = temp & 0x0FFFFFFF;
233 temp +=
a[10] -
b[10];
234 r[10] = temp & 0x0FFFFFFF;
236 temp +=
a[11] -
b[11];
237 r[11] = temp & 0x0FFFFFFF;
239 temp +=
a[12] -
b[12];
240 r[12] = temp & 0x0FFFFFFF;
242 temp +=
a[13] -
b[13];
243 r[13] = temp & 0x0FFFFFFF;
245 temp +=
a[14] -
b[14];
246 r[14] = temp & 0x0FFFFFFF;
248 temp +=
a[15] -
b[15];
249 r[15] = temp & 0x0FFFFFFF;
272 for(temp = -
b, i = 0; i < 16; i++)
275 r[i] = temp & 0x0FFFFFFF;
294 #if (CURVE448_SPEED_OPTIMIZATION_LEVEL == 0)
300 for(acc = 0, i = 0; i < 16; i++)
306 for(j = 0; j <= i; j++)
308 acc += (int64_t)
a[j] *
b[i - j];
314 for(j = i - 7; j < 8; j++)
316 acc += (int64_t)
a[j] *
b[i - j];
321 r[i] = acc & 0x0FFFFFFF;
327 r[0] += (int32_t) acc;
328 r[8] += (int32_t) acc;
333 acc = (int64_t)
a[0] *
b[0];
334 r[0] = acc & 0x0FFFFFFF;
336 acc += (int64_t)
a[0] *
b[1];
337 acc += (int64_t)
a[1] *
b[0];
338 r[1] = acc & 0x0FFFFFFF;
340 acc += (int64_t)
a[0] *
b[2];
341 acc += (int64_t)
a[1] *
b[1];
342 acc += (int64_t)
a[2] *
b[0];
343 r[2] = acc & 0x0FFFFFFF;
345 acc += (int64_t)
a[0] *
b[3];
346 acc += (int64_t)
a[1] *
b[2];
347 acc += (int64_t)
a[2] *
b[1];
348 acc += (int64_t)
a[3] *
b[0];
349 r[3] = acc & 0x0FFFFFFF;
351 acc += (int64_t)
a[0] *
b[4];
352 acc += (int64_t)
a[1] *
b[3];
353 acc += (int64_t)
a[2] *
b[2];
354 acc += (int64_t)
a[3] *
b[1];
355 acc += (int64_t)
a[4] *
b[0];
356 r[4] = acc & 0x0FFFFFFF;
358 acc += (int64_t)
a[0] *
b[5];
359 acc += (int64_t)
a[1] *
b[4];
360 acc += (int64_t)
a[2] *
b[3];
361 acc += (int64_t)
a[3] *
b[2];
362 acc += (int64_t)
a[4] *
b[1];
363 acc += (int64_t)
a[5] *
b[0];
364 r[5] = acc & 0x0FFFFFFF;
366 acc += (int64_t)
a[0] *
b[6];
367 acc += (int64_t)
a[1] *
b[5];
368 acc += (int64_t)
a[2] *
b[4];
369 acc += (int64_t)
a[3] *
b[3];
370 acc += (int64_t)
a[4] *
b[2];
371 acc += (int64_t)
a[5] *
b[1];
372 acc += (int64_t)
a[6] *
b[0];
373 r[6] = acc & 0x0FFFFFFF;
375 acc += (int64_t)
a[0] *
b[7];
376 acc += (int64_t)
a[1] *
b[6];
377 acc += (int64_t)
a[2] *
b[5];
378 acc += (int64_t)
a[3] *
b[4];
379 acc += (int64_t)
a[4] *
b[3];
380 acc += (int64_t)
a[5] *
b[2];
381 acc += (int64_t)
a[6] *
b[1];
382 acc += (int64_t)
a[7] *
b[0];
383 r[7] = acc & 0x0FFFFFFF;
385 acc += (int64_t)
a[1] *
b[7];
386 acc += (int64_t)
a[2] *
b[6];
387 acc += (int64_t)
a[3] *
b[5];
388 acc += (int64_t)
a[4] *
b[4];
389 acc += (int64_t)
a[5] *
b[3];
390 acc += (int64_t)
a[6] *
b[2];
391 acc += (int64_t)
a[7] *
b[1];
392 r[8] = acc & 0x0FFFFFFF;
394 acc += (int64_t)
a[2] *
b[7];
395 acc += (int64_t)
a[3] *
b[6];
396 acc += (int64_t)
a[4] *
b[5];
397 acc += (int64_t)
a[5] *
b[4];
398 acc += (int64_t)
a[6] *
b[3];
399 acc += (int64_t)
a[7] *
b[2];
400 r[9] = acc & 0x0FFFFFFF;
402 acc += (int64_t)
a[3] *
b[7];
403 acc += (int64_t)
a[4] *
b[6];
404 acc += (int64_t)
a[5] *
b[5];
405 acc += (int64_t)
a[6] *
b[4];
406 acc += (int64_t)
a[7] *
b[3];
407 r[10] = acc & 0x0FFFFFFF;
409 acc += (int64_t)
a[4] *
b[7];
410 acc += (int64_t)
a[5] *
b[6];
411 acc += (int64_t)
a[6] *
b[5];
412 acc += (int64_t)
a[7] *
b[4];
413 r[11] = acc & 0x0FFFFFFF;
415 acc += (int64_t)
a[5] *
b[7];
416 acc += (int64_t)
a[6] *
b[6];
417 acc += (int64_t)
a[7] *
b[5];
418 r[12] = acc & 0x0FFFFFFF;
420 acc += (int64_t)
a[6] *
b[7];
421 acc += (int64_t)
a[7] *
b[6];
422 r[13] = acc & 0x0FFFFFFF;
424 acc += (int64_t)
a[7] *
b[7];
425 r[14] = acc & 0x0FFFFFFF;
427 r[15] = acc & 0x0FFFFFFF;
431 r[0] += (int32_t) acc;
432 r[8] += (int32_t) acc;
446 #if (CURVE448_SPEED_OPTIMIZATION_LEVEL == 0)
457 for(i = 0; i < 8; i++)
459 aa[i] =
a[i] +
a[i + 8];
460 bb[i] =
b[i] +
b[i + 8];
469 for(i = 0; i < 8; i++)
472 for(acc3 = 0, j = 0; j <= i; j++)
474 acc1 += (int64_t)
a[8 + j] *
b[8 + i - j];
475 acc2 += (int64_t)
aa[j] * bb[i - j];
476 acc3 += (int64_t)
a[j] *
b[i - j];
484 for(acc3 = 0, j = i + 1; j < 8; j++)
486 acc1 -= (int64_t)
a[j] *
b[8 + i - j];
487 acc2 += (int64_t)
a[8 + j] *
b[16 + i - j];
488 acc3 += (int64_t)
aa[j] * bb[8 + i - j];
496 u[i] = (int32_t) acc1 & 0x0FFFFFFF;
498 u[i + 8] = (int32_t) acc2 & 0x0FFFFFFF;
507 u[0] = (int32_t) acc2 & 0x0FFFFFFF;
509 u[1] += (int32_t) acc2;
511 u[8] = (int32_t) acc1 & 0x0FFFFFFF;
513 u[9] += (int32_t) acc1;
517 #elif (CURVE448_SPEED_OPTIMIZATION_LEVEL == 1)
526 for(temp = 0, i = 0; i < 8; i++)
528 u[i] =
a[i] +
a[i + 8];
529 v[i] =
b[i] +
b[i + 8];
541 for(temp = 0, i = 0; i < 8; i++)
543 temp +=
u[i] -
u[i + 8] + v[i] + w[i + 8];
544 r[i] = temp & 0x0FFFFFFF;
548 for(i = 0; i < 8; i++)
550 temp += -
u[i] + v[i + 8] + w[i] + w[i + 8];
551 r[i + 8] = temp & 0x0FFFFFFF;
558 r[0] = temp & 0x0FFFFFFF;
562 r[8] = temp & 0x0FFFFFFF;
601 temp =
u[0] -
u[8] + v[0] + w[8];
602 r[0] = temp & 0x0FFFFFFF;
604 temp +=
u[1] -
u[9] + v[1] + w[9];
605 r[1] = temp & 0x0FFFFFFF;
607 temp +=
u[2] -
u[10] + v[2] + w[10];
608 r[2] = temp & 0x0FFFFFFF;
610 temp +=
u[3] -
u[11] + v[3] + w[11];
611 r[3] = temp & 0x0FFFFFFF;
613 temp +=
u[4] -
u[12] + v[4] + w[12];
614 r[4] = temp & 0x0FFFFFFF;
616 temp +=
u[5] -
u[13] + v[5] + w[13];
617 r[5] = temp & 0x0FFFFFFF;
619 temp +=
u[6] -
u[14] + v[6] + w[14];
620 r[6] = temp & 0x0FFFFFFF;
622 temp +=
u[7] -
u[15] + v[7] + w[15];
623 r[7] = temp & 0x0FFFFFFF;
625 temp += -
u[0] + v[8] + w[0] + w[8];
626 r[8] = temp & 0x0FFFFFFF;
628 temp += -
u[1] + v[9] + w[1] + w[9];
629 r[9] = temp & 0x0FFFFFFF;
631 temp += -
u[2] + v[10] + w[2] + w[10];
632 r[10] = temp & 0x0FFFFFFF;
634 temp += -
u[3] + v[11] + w[3] + w[11];
635 r[11] = temp & 0x0FFFFFFF;
637 temp += -
u[4] + v[12] + w[4] + w[12];
638 r[12] = temp & 0x0FFFFFFF;
640 temp += -
u[5] + v[13] + w[5] + w[13];
641 r[13] = temp & 0x0FFFFFFF;
643 temp += -
u[6] + v[14] + w[6] + w[14];
644 r[14] = temp & 0x0FFFFFFF;
646 temp += -
u[7] + v[15] + w[7] + w[15];
647 r[15] = temp & 0x0FFFFFFF;
653 r[0] = temp & 0x0FFFFFFF;
657 r[8] = temp & 0x0FFFFFFF;
677 for(temp = 0, i = 0; i < 16; i++)
679 temp += (int64_t)
a[i] *
b;
680 r[i] = temp & 0x0FFFFFFF;
685 r[0] += (int32_t) temp;
686 r[8] += (int32_t) temp;
718 for(i = 1; i <
n; i++)
868 for(temp = 0, i = 0; i < 16; i++)
871 r[i] = temp & 0x0FFFFFFF;
876 for(
r[8] += temp, i = 0; i < 16; i++)
879 r[i] = temp & 0x0FFFFFFF;
884 for(temp = 1, i = 0; i < 8; i++)
887 b[i] = temp & 0x0FFFFFFF;
891 for(temp += 1, i = 8; i < 16; i++)
894 b[i] = temp & 0x0FFFFFFF;
917 for(i = 0; i < 16; i++)
941 for(i = 0; i < 16; i++)
944 dummy =
mask & (
a[i] ^
b[i]);
969 for(i = 0; i < 16; i++)
993 for(i = 0; i < 16; i++)
1000 return ((uint32_t) (
mask | (~
mask + 1))) >> 31;
1016 for(
a[0] = 0, i = 0; i < 7; i++)
1019 a[i] |= (temp << (i * 4)) & 0x0FFFFFFF;
1020 a[i + 1] = temp >> (28 - i * 4);
1023 for(
a[8] = 0, i = 0; i < 7; i++)
1026 a[i + 8] |= (temp << (i * 4)) & 0x0FFFFFFF;
1027 a[i + 9] = temp >> (28 - i * 4);
1044 for(i = 0; i < 7; i++)
1046 temp = (
a[i + 1] << (28 - i * 4)) | (
a[i] >> (i * 4));
1050 for(i = 0; i < 7; i++)
1052 temp = (
a[i + 9] << (28 - 4 * i)) | (
a[i + 8] >> (i * 4));