44 const uint32_t ecc_prime_m[8] = { 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0xffffffff };
45 const uint32_t ecc_prime_r[8] = { 0x00000001, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0xfffffffe, 0x00000000 };
54 #define PRINTF(...) printf(__VA_ARGS__)
55 #define PRINTHEX(...) print_hex(__VA_ARGS__)
57 print_hex(
const char *name,
const uint32_t *d, uint32_t l)
61 for(i = l - 1; i >= 0; --i) {
62 printf(
" %08X", d[i]);
73 static void selfTest();
79 static void ecc_setZero(uint32_t *a);
80 static void ecc_copy(uint32_t *dst,
const uint32_t *src);
81 static uint32_t ecc_isX(
const uint32_t *a,
const uint32_t x);
82 static void ecc_rshift(uint32_t *a);
83 static void ecc_replace(uint32_t bit, uint32_t *dst, uint32_t *src);
84 static uint32_t ecc_add(uint32_t *result,
const uint32_t *a,
const uint32_t *b);
85 static uint32_t ecc_sub(uint32_t *result,
const uint32_t *a,
const uint32_t *b);
86 static void ecc_mult(uint32_t *result,
const uint32_t *x,
const uint32_t *y,
const uint32_t length);
89 __attribute__((always_inline)) static
void ecc_form_s1(uint32_t *dst, const uint32_t *src);
90 __attribute__((always_inline)) static
void ecc_form_s2(uint32_t *dst, const uint32_t *src);
91 __attribute__((always_inline)) static
void ecc_form_s3(uint32_t *dst, const uint32_t *src);
92 __attribute__((always_inline)) static
void ecc_form_s4(uint32_t *dst, const uint32_t *src);
93 __attribute__((always_inline)) static
void ecc_form_d1(uint32_t *dst, const uint32_t *src);
94 __attribute__((always_inline)) static
void ecc_form_d2(uint32_t *dst, const uint32_t *src);
95 __attribute__((always_inline)) static
void ecc_form_d3(uint32_t *dst, const uint32_t *src);
96 __attribute__((always_inline)) static
void ecc_form_d4(uint32_t *dst, const uint32_t *src);
99 static
void ecc_field_Add(uint32_t *result, const uint32_t *x, const uint32_t *y);
100 static
void ecc_field_Sub(uint32_t *result, const uint32_t *x, const uint32_t *y);
101 static
void ecc_field_ModP(uint32_t *result, const uint32_t *T);
102 static
void ecc_field_Mult(uint32_t *result, const uint32_t *A, const uint32_t *B);
103 static
void ecc_field_Inv(uint32_t *result, const uint32_t *A);
106 static
void ecc_projective_double(uint32_t *val);
107 static
void ecc_projective_add(uint32_t *result, const uint32_t *val_1, const uint32_t *x_2, const uint32_t *y_2, const uint32_t *z_2);
117 uint32_t neq = (a[i] != b[i]);
118 int32_t greater = (a[i] > b[i] ? 1 : -1);
119 r ^= ((-(!r && neq)) & (r ^ greater));
124 ecc_ec_mult(uint32_t *resultx, uint32_t *resulty,
const uint32_t *px,
const uint32_t *py,
const uint32_t *secret)
130 PRINTHEX(
"PX", px, 8);
131 PRINTHEX(
"PY", py, 8);
132 PRINTHEX(
"SC", secret, 8);
147 for(i = 255; i >= 0; --i) {
148 ecc_projective_double(Q);
152 ecc_projective_add(temp, Q, px, py, pz);
156 int current_bit = (secret[i / 32] >> (i % 32)) & 0x1;
157 ecc_replace(current_bit, Q, temp);
165 ecc_field_Inv(temp, Q + Z);
166 ecc_field_Mult(resultx, Q + X, temp);
167 ecc_field_Mult(resulty, Q + Y, temp);
168 PRINTHEX(
"RX", resultx, 8);
169 PRINTHEX(
"RY", resulty, 8);
174 ecc_setZero(uint32_t *a)
181 "stm %[a]!, {r1-r4} \n\t"
182 "stm %[a]!, {r1-r4} \n\t"
187 "r1",
"r2",
"r3",
"r4",
"memory"
194 ecc_copy(uint32_t *dst,
const uint32_t *src)
197 "ldm %[s]!, {r2-r5} \n\t"
198 "stm %[d]!, {r2-r5} \n\t"
199 "ldm %[s]!, {r2-r5} \n\t"
200 "stm %[d]!, {r2-r5} \n\t"
206 "r2",
"r3",
"r4",
"r5",
"memory"
210 ecc_isX(
const uint32_t *a,
const uint32_t x)
212 uint32_t r = (a[0] == x);
220 ecc_rshift(uint32_t *a)
227 "sub %[i], %[i], #4 \n\t"
229 "ldr r3, [%[a],%[i]] \n\t"
230 "lsl %[c], r3, #31 \n\t"
231 "lsr r3, r3, #1 \n\t"
232 "orr r4, r4, r3 \n\t"
233 "str r4, [%[a],%[i]] \n\t"
246 ecc_replace(uint32_t bit, uint32_t *dst, uint32_t *src)
250 for(i = 0; i < 24; i++) {
251 dst[i] ^= (bit & (dst[i] ^ src[i]));
255 ecc_add(uint32_t *result,
const uint32_t *a,
const uint32_t *b)
260 "ldm %[x]!, {r4,r5} \n\t"
261 "ldm %[y]!, {r6,r7} \n\t"
262 "add r4, r4, r6 \n\t"
263 "adc r5, r5, r7 \n\t"
264 "stm %[r]!, {r4,r5} \n\t"
265 "ldm %[x]!, {r4,r5} \n\t"
266 "ldm %[y]!, {r6,r7} \n\t"
267 "adc r4, r4, r6 \n\t"
268 "adc r5, r5, r7 \n\t"
269 "stm %[r]!, {r4,r5} \n\t"
270 "ldm %[x]!, {r4,r5} \n\t"
271 "ldm %[y]!, {r6,r7} \n\t"
272 "adc r4, r4, r6 \n\t"
273 "adc r5, r5, r7 \n\t"
274 "stm %[r]!, {r4,r5} \n\t"
275 "ldm %[x]!, {r4,r5} \n\t"
276 "ldm %[y]!, {r6,r7} \n\t"
277 "adc r4, r4, r6 \n\t"
278 "adc r5, r5, r7 \n\t"
279 "stm %[r]!, {r4,r5} \n\t"
293 "r4",
"r5",
"r6",
"r7",
"memory"
299 ecc_sub(uint32_t *result,
const uint32_t *a,
const uint32_t *b)
304 "ldm %[x]!, {r4,r5} \n\t"
305 "ldm %[y]!, {r6,r7} \n\t"
306 "sub r4, r4, r6 \n\t"
307 "sbc r5, r5, r7 \n\t"
308 "stm %[r]!, {r4,r5} \n\t"
309 "ldm %[x]!, {r4,r5} \n\t"
310 "ldm %[y]!, {r6,r7} \n\t"
311 "sbc r4, r4, r6 \n\t"
312 "sbc r5, r5, r7 \n\t"
313 "stm %[r]!, {r4,r5} \n\t"
314 "ldm %[x]!, {r4,r5} \n\t"
315 "ldm %[y]!, {r6,r7} \n\t"
316 "sbc r4, r4, r6 \n\t"
317 "sbc r5, r5, r7 \n\t"
318 "stm %[r]!, {r4,r5} \n\t"
319 "ldm %[x]!, {r4,r5} \n\t"
320 "ldm %[y]!, {r6,r7} \n\t"
321 "sbc r4, r4, r6 \n\t"
322 "sbc r5, r5, r7 \n\t"
323 "stm %[r]!, {r4,r5} \n\t"
337 "r4",
"r5",
"r6",
"r7",
"memory"
343 ecc_mult(uint32_t *result,
const uint32_t *x,
const uint32_t *y,
const uint32_t length)
352 "ldrh r5, [%[x], $0] \n\t"
353 "ldrh r3, [%[y], $0] \n\t"
355 "ldrh r6, [%[x], #2] \n\t"
357 "ldrh r4, [%[y], #2] \n\t"
360 "ldrh %[y], [%[x], $0] \n\t"
362 "add %[y], r3, r4 \n\t"
367 "lsl r4, r4, #16 \n\t"
369 "lsr r3, %[y], #16 \n\t"
370 "orr r4, r4, r3 \n\t"
371 "lsl r3, %[y], #16 \n\t"
372 "add r3, r3, r5 \n\t"
373 "adc r4, r4, r6 \n\t"
374 "stm %[r]!, {r3, r4} \n\t"
381 "r3",
"r4",
"r5",
"r6",
"memory"
385 uint32_t C[length * 2];
386 ecc_mult(result, x, y, length / 2);
387 ecc_mult(result + length, x + (length / 2), y + (length / 2), length / 2);
388 ecc_mult(C, x, y + (length / 2), length / 2);
389 ecc_mult(C + length, x + (length / 2), y, length / 2);
391 carry = ecc_add(C, C, C + length);
397 "mov %[l], %[a] \n\t"
398 "ldm %[a]!, {r3-r6} \n\t"
399 "ldm %[a]!, {r5,r6} \n\t"
400 "sub %[a], %[a], #16 \n\t"
401 "add r3, r3, r5 \n\t"
402 "adc r4, r4, r6 \n\t"
403 "stm %[l]!, {r3,r4} \n\t"
404 "ldm %[a]!, {r3-r6} \n\t"
405 "ldm %[a]!, {r5,r6} \n\t"
406 "adc r3, r3, r5 \n\t"
407 "adc r4, r4, r6 \n\t"
408 "stm %[l]!, {r3,r4} \n\t"
412 "ldm %[a]!, {r3-r6} \n\t"
413 "sub %[a], %[a], #16 \n\t"
414 "add r3, r3, r5 \n\t"
415 "adc r4, r4, r6 \n\t"
416 "stm %[a]!, {r3,r4} \n\t"
430 "r3",
"r4",
"r5",
"r6",
"memory"
443 "add %[r], %[r], #16 \n\t"
444 "mov %[l], %[r] \n\t"
445 "ldm %[r]!, {r3,r4} \n\t"
446 "ldm %[c]!, {r5,r6} \n\t"
447 "add r3, r3, r5 \n\t"
448 "adc r4, r4, r6 \n\t"
449 "stm %[l]!, {r3,r4} \n\t"
450 "ldm %[r]!, {r3,r4} \n\t"
451 "ldm %[c]!, {r5,r6} \n\t"
452 "adc r3, r3, r5 \n\t"
453 "adc r4, r4, r6 \n\t"
454 "stm %[l]!, {r3,r4} \n\t"
455 "ldm %[r]!, {r3,r4} \n\t"
456 "ldm %[c]!, {r5,r6} \n\t"
457 "adc r3, r3, r5 \n\t"
458 "adc r4, r4, r6 \n\t"
459 "stm %[l]!, {r3,r4} \n\t"
460 "ldm %[r]!, {r3,r4} \n\t"
461 "ldm %[c]!, {r5,r6} \n\t"
462 "adc r3, r3, r5 \n\t"
463 "adc r4, r4, r6 \n\t"
464 "stm %[l]!, {r3,r4} \n\t"
465 "ldm %[r]!, {r3,r4} \n\t"
466 "ldm %[c]!, {r5} \n\t"
468 "adc r3, r3, r5 \n\t"
469 "adc r4, r4, r6 \n\t"
470 "stm %[l]!, {r3,r4} \n\t"
471 "ldm %[r]!, {r3,r4} \n\t"
472 "adc r3, r3, r6 \n\t"
473 "adc r4, r4, r6 \n\t"
474 "stm %[l]!, {r3,r4} \n\t"
481 "add %[r], %[r], #8 \n\t"
482 "mov %[l], %[r] \n\t"
483 "ldm %[r]!, {r3,r4} \n\t"
484 "ldm %[c]!, {r5,r6} \n\t"
485 "add r3, r3, r5 \n\t"
486 "adc r4, r4, r6 \n\t"
487 "stm %[l]!, {r3,r4} \n\t"
488 "ldm %[r]!, {r3,r4} \n\t"
489 "ldm %[c]!, {r5,r6} \n\t"
490 "adc r3, r3, r5 \n\t"
491 "adc r4, r4, r6 \n\t"
492 "stm %[l]!, {r3,r4} \n\t"
493 "ldm %[r]!, {r3,r4} \n\t"
494 "ldm %[c]!, {r5} \n\t"
496 "adc r3, r3, r5 \n\t"
497 "adc r4, r4, r6 \n\t"
498 "stm %[l]!, {r3,r4} \n\t"
505 "add %[r], %[r], #4 \n\t"
506 "mov %[l], %[r] \n\t"
507 "ldm %[r]!, {r3,r4} \n\t"
508 "ldm %[c]!, {r5,r6} \n\t"
509 "add r3, r3, r5 \n\t"
510 "adc r4, r4, r6 \n\t"
511 "ldr r5, [%[r], $0] \n\t"
512 "ldr r6, [%[c], $0] \n\t"
513 "adc r5, r5, r6 \n\t"
514 "stm %[l]!, {r3-r5} \n\t"
522 "r3",
"r4",
"r5",
"r6",
"memory"
529 ecc_form_s1(uint32_t *dst, const uint32_t *src)
536 "stm %[d]!, {r2-r4} \n\t"
538 "ldm %[s]!, {r2-r6} \n\t"
539 "stm %[d]!, {r2-r6} \n\t"
545 "r2",
"r3",
"r4",
"r5",
"r6",
"memory"
549 ecc_form_s2(uint32_t *dst, const uint32_t *src)
556 "stm %[d]!, {r2-r4} \n\t"
558 "ldm %[s]!, {r2-r5} \n\t"
559 "stm %[d]!, {r2-r5} \n\t"
561 "stm %[d]!, {r2} \n\t"
567 "r2",
"r3",
"r4",
"r5",
"memory"
571 ecc_form_s3(uint32_t *dst, const uint32_t *src)
576 "ldm %[s]!, {r2-r4} \n\t"
578 "stm %[d]!, {r2-r5} \n\t"
582 "ldm %[s]!, {r4,r5} \n\t"
583 "stm %[d]!, {r2-r5} \n\t"
589 "r2",
"r3",
"r4",
"r5",
"memory"
593 ecc_form_s4(uint32_t *dst, const uint32_t *src)
598 "ldm %[s]!, {r2-r5} \n\t"
599 "stm %[d]!, {r3-r5} \n\t"
601 "ldm %[s]!, {r3-r5} \n\t"
602 "stm %[d]!, {r3-r5} \n\t"
604 "stm %[d]!, {r3,r4} \n\t"
610 "r2",
"r3",
"r4",
"r5",
"memory"
614 ecc_form_d1(uint32_t *dst, const uint32_t *src)
619 "ldm %[s]!, {r2-r7} \n\t"
620 "stm %[d]!, {r5-r7} \n\t"
624 "stm %[d]!, {r3,r5,r6} \n\t"
625 "stm %[d]!, {r2,r4} \n\t"
631 "r2",
"r3",
"r4",
"r5",
"r6",
"r7",
"memory"
635 ecc_form_d2(uint32_t *dst, const uint32_t *src)
640 "ldm %[s]!, {r2-r5} \n\t"
641 "stm %[d]!, {r2-r5} \n\t"
643 "ldm %[s]!, {r4-r6} \n\t"
646 "stm %[d]!, {r2-r4,r6} \n\t"
652 "r2",
"r3",
"r4",
"r5",
"r6",
"memory"
656 ecc_form_d3(uint32_t *dst, const uint32_t *src)
661 "ldm %[s]!, {r2-r4} \n\t"
662 "stm %[d]!, {r2-r4} \n\t"
664 "ldm %[s]!, {r2-r6} \n\t"
666 "stm %[d]!, {r2-r6} \n\t"
672 "r2",
"r3",
"r4",
"r5",
"r6",
"memory"
676 ecc_form_d4(uint32_t *dst, const uint32_t *src)
681 "ldm %[s]!, {r2,r3} \n\t"
683 "stm %[d]!, {r2-r4} \n\t"
685 "ldm %[s]!, {r2-r6} \n\t"
687 "stm %[d]!, {r2-r6} \n\t"
693 "r2",
"r3",
"r4",
"r5",
"r6",
"memory"
699 ecc_field_Add(uint32_t *result,
const uint32_t *x,
const uint32_t *y)
702 uint32_t carry = -ecc_add(result, x, y);
703 ecc_add(temp, result, ecc_prime_r);
706 for(i = 0; i < 8; i++) {
707 result[i] ^= (carry & (result[i] ^ temp[i]));
711 ecc_field_Sub(uint32_t *result,
const uint32_t *x,
const uint32_t *y)
714 uint32_t carry = -ecc_sub(result, x, y);
715 ecc_add(temp, result, ecc_prime_m);
718 for(i = 0; i < 8; i++) {
719 result[i] ^= (carry & (result[i] ^ temp[i]));
723 ecc_field_ModP(uint32_t *result,
const uint32_t *T)
728 ecc_form_s1(SX_o_DX, T);
729 ecc_field_Add(result, result, SX_o_DX);
730 ecc_field_Add(result, result, SX_o_DX);
732 ecc_form_s2(SX_o_DX, T);
733 ecc_field_Add(result, result, SX_o_DX);
734 ecc_field_Add(result, result, SX_o_DX);
736 ecc_form_s3(SX_o_DX, T);
737 ecc_field_Add(result, result, SX_o_DX);
739 ecc_form_s4(SX_o_DX, T);
740 ecc_field_Add(result, result, SX_o_DX);
742 ecc_form_d1(SX_o_DX, T);
743 ecc_field_Sub(result, result, SX_o_DX);
745 ecc_form_d2(SX_o_DX, T);
746 ecc_field_Sub(result, result, SX_o_DX);
748 ecc_form_d3(SX_o_DX, T);
749 ecc_field_Sub(result, result, SX_o_DX);
751 ecc_form_d4(SX_o_DX, T);
752 ecc_field_Sub(result, result, SX_o_DX);
755 ecc_field_Sub(result, result, ecc_prime_m);
759 ecc_field_Mult(uint32_t *result,
const uint32_t *A,
const uint32_t *B)
761 uint32_t product[16];
762 ecc_mult(product, A, B, 8);
763 ecc_field_ModP(result, product);
766 ecc_field_Inv(uint32_t *result,
const uint32_t *A)
768 PRINTHEX(
"Input", A, 8);
771 result[0] = 0x00000001;
773 for(i = 255; i >= 0; --i) {
774 ecc_field_Mult(result, result, result);
775 if(((ecc_prime_m[i / 32] >> (i % 32)) & 0x1) == 1 && i != 1) {
776 ecc_field_Mult(result, result, A);
780 PRINTHEX(
"Result", result, 8);
785 ecc_projective_double(uint32_t *val)
806 uint8_t is_zero = ecc_isX(val + X, 0) & ecc_isX(val + Y, 0) & ecc_isX(val + Z, 1);
808 ecc_field_Sub(temp + X, val + X, val + Z);
809 ecc_field_Add(temp + Y, val + X, val + Z);
810 ecc_field_Mult(temp + Z, temp + X, temp + Y);
811 ecc_field_Add(temp + X, temp + Z, temp + Z);
812 ecc_field_Add(w, temp + Z, temp + X);
813 ecc_field_Mult(temp + X, val + Y, val + Z);
814 ecc_field_Add(s, temp + X, temp + X);
815 ecc_field_Mult(temp + X, s, s);
816 ecc_field_Mult(val + Z, s, temp + X);
817 ecc_field_Mult(temp + X, val + Y, s);
818 ecc_field_Mult(temp + Z, temp + X, temp + X);
819 ecc_field_Mult(temp + Y, val + X, temp + X);
820 ecc_field_Add(B, temp + Y, temp + Y);
821 ecc_field_Mult(temp + X, w, w);
822 ecc_field_Add(temp + Y, B, B);
823 ecc_field_Sub(h, temp + X, temp + Y);
824 ecc_field_Mult(val + X, h, s);
825 ecc_field_Sub(temp + X, B, h);
826 ecc_field_Mult(temp + Y, w, temp + X);
827 ecc_field_Add(temp + Z, temp + Z, temp + Z);
828 ecc_field_Sub(val + Y, temp + Y, temp + Z);
831 ecc_setZero(temp + X);
832 ecc_setZero(temp + Y);
833 ecc_setZero(temp + Z);
834 (temp + Z)[0] = 0x00000001;
836 ecc_replace(is_zero, val, temp);
839 ecc_projective_add(uint32_t *result,
const uint32_t *val_1,
const uint32_t *x_2,
const uint32_t *y_2,
const uint32_t *z_2)
876 #define X1Z2 result + Y
878 #define RA result + Y
879 #define Z1Z2 result + Z
880 #define X2Z1 temp + X
882 #define Y2Z1 temp + X
886 #define UUZZ temp + Y
891 #define Y1Z2 temp + 24
892 #define VYZ temp + 24
894 uint8_t is_input1_zero = ecc_isX(val_1 + X, 0) & ecc_isX(val_1 + Y, 0) & ecc_isX(val_1 + Z, 1);
895 uint8_t is_input2_zero = ecc_isX(x_2, 0) & ecc_isX(y_2, 0) & ecc_isX(z_2, 1);
897 ecc_copy(temp + X, x_2);
898 ecc_copy(temp + Y, y_2);
899 ecc_copy(temp + Z, z_2);
900 ecc_replace(is_input1_zero, result, temp);
902 ecc_copy(temp + X, val_1 + X);
903 ecc_copy(temp + Y, val_1 + Y);
904 ecc_copy(temp + Z, val_1 + Z);
905 ecc_replace(is_input2_zero, result, temp);
908 result = (uint32_t *)((uintptr_t)result ^ (-(is_input2_zero | is_input1_zero) & ((uintptr_t)result ^ (uintptr_t)temp)));
910 ecc_field_Mult(Y1Z2, Y1, Z2);
911 ecc_field_Mult(X2Z1, X2, Z1);
912 ecc_field_Mult(X1Z2, X1, Z2);
913 ecc_field_Sub(V, X2Z1, X1Z2);
914 ecc_field_Mult(VV, V, V);
915 ecc_field_Mult(R, VV, X1Z2);
916 ecc_field_Mult(VVV, V, VV);
917 ecc_field_Mult(Y2Z1, Y2, Z1);
918 ecc_field_Sub(U, Y2Z1, Y1Z2);
919 ecc_field_Mult(UU, U, U);
920 ecc_field_Mult(Z1Z2, Z1, Z2);
921 ecc_field_Mult(UUZZ, UU, Z1Z2);
922 ecc_field_Sub(UZV, UUZZ, VVV);
923 ecc_field_Mult(result + Z, VVV, Z1Z2);
924 ecc_field_Mult(VYZ, VVV, Y1Z2);
925 ecc_field_Add(R2, R, R);
926 ecc_field_Sub(A, UZV, R2);
927 ecc_field_Mult(result + X, V, A);
928 ecc_field_Sub(RA, R, A);
929 ecc_field_Mult(URA, U, RA);
930 ecc_field_Sub(result + Y, URA, VYZ);
936 assertTrue(uint32_t value,
const char *msg)
943 assertFalse(uint32_t value,
const char *msg)
950 assertSame(uint32_t *val_1, uint32_t *val_2,
const char *msg)
959 uint32_t num_000[8] = { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 };
960 uint32_t num_001[8] = { 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 };
961 uint32_t num_002[8] = { 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 };
962 uint32_t num_004[8] = { 0x00000004, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 };
963 uint32_t num_max[8] = { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff };
964 uint32_t primeMinusOne[8] = { 0xfffffffe, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0xffffffff };
969 assertFalse(
ecc_compare(num_001, num_001),
"ecc_compare 1: Wrong result!");
970 assertTrue(
ecc_compare(num_000, num_001) == -1,
"ecc_compare 2: Wrong result!");
971 assertTrue(
ecc_compare(num_001, num_000) == 1,
"ecc_compare 3: Wrong result!");
974 assertTrue(ecc_isX(num_000, 0),
"ecc_isX 1: Wrong result!");
975 assertTrue(ecc_isX(num_001, 1),
"ecc_isX 2: Wrong result!");
976 assertTrue(ecc_isX(num_002, 2),
"ecc_isX 3: Wrong result!");
977 assertTrue(ecc_isX(num_004, 4),
"ecc_isX 4: Wrong result!");
978 assertFalse(ecc_isX(num_000, 1),
"ecc_isX 5: Wrong result!");
979 assertFalse(ecc_isX(num_000, 2),
"ecc_isX 6: Wrong result!");
980 assertFalse(ecc_isX(num_000, 4),
"ecc_isX 7: Wrong result!");
981 assertFalse(ecc_isX(num_001, 0),
"ecc_isX 8: Wrong result!");
982 assertFalse(ecc_isX(num_001, 2),
"ecc_isX 9: Wrong result!");
983 assertFalse(ecc_isX(num_001, 4),
"ecc_isX 10: Wrong result!");
984 assertFalse(ecc_isX(num_002, 0),
"ecc_isX 11: Wrong result!");
985 assertFalse(ecc_isX(num_002, 1),
"ecc_isX 12: Wrong result!");
986 assertFalse(ecc_isX(num_002, 4),
"ecc_isX 13: Wrong result!");
987 assertFalse(ecc_isX(num_004, 0),
"ecc_isX 14: Wrong result!");
988 assertFalse(ecc_isX(num_004, 1),
"ecc_isX 15: Wrong result!");
989 assertFalse(ecc_isX(num_004, 2),
"ecc_isX 16: Wrong result!");
992 assertFalse(ecc_add(result, num_001, num_002),
"ecc_add 1: Unexpected carrybit!");
993 assertFalse(ecc_add(result, result, num_001),
"ecc_add 2: Unexpected carrybit!");
994 assertSame(result, num_004,
"ecc_add 3: Wrong result!");
995 assertTrue(ecc_add(result, num_max, num_002),
"ecc_add 4: Carrybit missing!");
996 assertSame(result, num_001,
"ecc_add 5: Wrong result!");
999 assertFalse(ecc_sub(result, num_004, num_002),
"ecc_sub 1: Unexpected carrybit!");
1000 assertFalse(ecc_sub(result, result, num_001),
"ecc_sub 2: Unexpected carrybit!");
1001 assertFalse(ecc_sub(result, result, num_001),
"ecc_sub 3: Unexpected carrybit!");
1002 assertSame(result, num_000,
"ecc_sub 4: Wrong result!");
1003 assertTrue(ecc_sub(result, num_000, num_001),
"ecc_sub 5: Carrybit missing!");
1004 assertSame(result, num_max,
"ecc_sub 6: Wrong result!");
1007 ecc_field_Sub(result, num_001, num_000);
1008 assertSame(num_001, result,
"ecc_field_Sub 1: Wrong result!");
1009 ecc_field_Sub(result, num_001, num_001);
1010 assertSame(num_000, result,
"ecc_field_Sub 2: Wrong result!");
1011 ecc_field_Sub(result, num_000, num_001);
1012 assertSame(primeMinusOne, result,
"ecc_field_Sub 3: Wrong result!");
1014 printf(
"Tests completed!\n");
#define __attribute__(nothing)
Define attribute to nothing since it isn't handled by IAR.
Calculations on elliptic curve secp256r1
int32_t ecc_compare(const uint32_t *a, const uint32_t *b)
Compares the value of a with the value of b.
void ecc_ec_mult(uint32_t *resultx, uint32_t *resulty, const uint32_t *px, const uint32_t *py, const uint32_t *secret)
ECC scalar multiplication on elliptic curve secp256r1.