2 #include "field_10x26.c"
4 #include "field_5x52.c"
7 void static secp256k1_fe_get_hex(char *r, int *rlen, const secp256k1_fe_t *a) {
13 unsigned char tmp[32];
14 secp256k1_fe_t b = *a;
15 secp256k1_fe_normalize(&b);
16 secp256k1_fe_get_b32(tmp, &b);
17 for (int i=0; i<32; i++) {
18 static const char *c = "0123456789ABCDEF";
19 r[2*i] = c[(tmp[i] >> 4) & 0xF];
20 r[2*i+1] = c[(tmp[i]) & 0xF];
25 void static secp256k1_fe_set_hex(secp256k1_fe_t *r, const char *a, int alen) {
26 unsigned char tmp[32] = {};
27 static const int cvt[256] = {0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0,
28 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0,
29 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0,
30 0, 1, 2, 3, 4, 5, 6,7,8,9,0,0,0,0,0,0,
31 0,10,11,12,13,14,15,0,0,0,0,0,0,0,0,0,
32 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0,
33 0,10,11,12,13,14,15,0,0,0,0,0,0,0,0,0,
34 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0,
35 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0,
36 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0,
37 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0,
38 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0,
39 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0,
40 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0,
41 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0,
42 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0};
43 for (int i=0; i<32; i++) {
45 tmp[32 - alen/2 + i] = (cvt[(unsigned char)a[2*i]] << 4) + cvt[(unsigned char)a[2*i+1]];
47 secp256k1_fe_set_b32(r, tmp);
50 void static secp256k1_fe_sqrt(secp256k1_fe_t *r, const secp256k1_fe_t *a) {
51 // calculate a^p, with p={15,780,1022,1023}
52 secp256k1_fe_t a2; secp256k1_fe_sqr(&a2, a);
53 secp256k1_fe_t a3; secp256k1_fe_mul(&a3, &a2, a);
54 secp256k1_fe_t a6; secp256k1_fe_sqr(&a6, &a3);
55 secp256k1_fe_t a12; secp256k1_fe_sqr(&a12, &a6);
56 secp256k1_fe_t a15; secp256k1_fe_mul(&a15, &a12, &a3);
57 secp256k1_fe_t a30; secp256k1_fe_sqr(&a30, &a15);
58 secp256k1_fe_t a60; secp256k1_fe_sqr(&a60, &a30);
59 secp256k1_fe_t a120; secp256k1_fe_sqr(&a120, &a60);
60 secp256k1_fe_t a240; secp256k1_fe_sqr(&a240, &a120);
61 secp256k1_fe_t a255; secp256k1_fe_mul(&a255, &a240, &a15);
62 secp256k1_fe_t a510; secp256k1_fe_sqr(&a510, &a255);
63 secp256k1_fe_t a750; secp256k1_fe_mul(&a750, &a510, &a240);
64 secp256k1_fe_t a780; secp256k1_fe_mul(&a780, &a750, &a30);
65 secp256k1_fe_t a1020; secp256k1_fe_sqr(&a1020, &a510);
66 secp256k1_fe_t a1022; secp256k1_fe_mul(&a1022, &a1020, &a2);
67 secp256k1_fe_t a1023; secp256k1_fe_mul(&a1023, &a1022, a);
68 secp256k1_fe_t x = a15;
69 for (int i=0; i<21; i++) {
70 for (int j=0; j<10; j++) secp256k1_fe_sqr(&x, &x);
71 secp256k1_fe_mul(&x, &x, &a1023);
73 for (int j=0; j<10; j++) secp256k1_fe_sqr(&x, &x);
74 secp256k1_fe_mul(&x, &x, &a1022);
75 for (int i=0; i<2; i++) {
76 for (int j=0; j<10; j++) secp256k1_fe_sqr(&x, &x);
77 secp256k1_fe_mul(&x, &x, &a1023);
79 for (int j=0; j<10; j++) secp256k1_fe_sqr(&x, &x);
80 secp256k1_fe_mul(r, &x, &a780);
83 void static secp256k1_fe_inv(secp256k1_fe_t *r, const secp256k1_fe_t *a) {
84 // calculate a^p, with p={45,63,1019,1023}
85 secp256k1_fe_t a2; secp256k1_fe_sqr(&a2, a);
86 secp256k1_fe_t a3; secp256k1_fe_mul(&a3, &a2, a);
87 secp256k1_fe_t a4; secp256k1_fe_sqr(&a4, &a2);
88 secp256k1_fe_t a5; secp256k1_fe_mul(&a5, &a4, a);
89 secp256k1_fe_t a10; secp256k1_fe_sqr(&a10, &a5);
90 secp256k1_fe_t a11; secp256k1_fe_mul(&a11, &a10, a);
91 secp256k1_fe_t a21; secp256k1_fe_mul(&a21, &a11, &a10);
92 secp256k1_fe_t a42; secp256k1_fe_sqr(&a42, &a21);
93 secp256k1_fe_t a45; secp256k1_fe_mul(&a45, &a42, &a3);
94 secp256k1_fe_t a63; secp256k1_fe_mul(&a63, &a42, &a21);
95 secp256k1_fe_t a126; secp256k1_fe_sqr(&a126, &a63);
96 secp256k1_fe_t a252; secp256k1_fe_sqr(&a252, &a126);
97 secp256k1_fe_t a504; secp256k1_fe_sqr(&a504, &a252);
98 secp256k1_fe_t a1008; secp256k1_fe_sqr(&a1008, &a504);
99 secp256k1_fe_t a1019; secp256k1_fe_mul(&a1019, &a1008, &a11);
100 secp256k1_fe_t a1023; secp256k1_fe_mul(&a1023, &a1019, &a4);
101 secp256k1_fe_t x = a63;
102 for (int i=0; i<21; i++) {
103 for (int j=0; j<10; j++) secp256k1_fe_sqr(&x, &x);
104 secp256k1_fe_mul(&x, &x, &a1023);
106 for (int j=0; j<10; j++) secp256k1_fe_sqr(&x, &x);
107 secp256k1_fe_mul(&x, &x, &a1019);
108 for (int i=0; i<2; i++) {
109 for (int j=0; j<10; j++) secp256k1_fe_sqr(&x, &x);
110 secp256k1_fe_mul(&x, &x, &a1023);
112 for (int j=0; j<10; j++) secp256k1_fe_sqr(&x, &x);
113 secp256k1_fe_mul(r, &x, &a45);
116 void static secp256k1_fe_inv_var(secp256k1_fe_t *r, const secp256k1_fe_t *a) {
117 #if defined(USE_FIELD_INV_BUILTIN)
118 secp256k1_fe_inv(r, a);
121 secp256k1_fe_t c = *a;
122 secp256k1_fe_normalize(&c);
123 secp256k1_fe_get_b32(b, &c);
125 secp256k1_num_init(&n);
126 secp256k1_num_set_bin(&n, b, 32);
127 secp256k1_num_mod_inverse(&n, &n, &secp256k1_fe_consts->p);
128 secp256k1_num_get_bin(b, 32, &n);
129 secp256k1_num_free(&n);
130 secp256k1_fe_set_b32(r, b);
134 void static secp256k1_fe_start(void) {
135 static const unsigned char secp256k1_fe_consts_p[] = {
136 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
137 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
138 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
139 0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFC,0x2F
141 if (secp256k1_fe_consts == NULL) {
142 secp256k1_fe_consts_t *ret = (secp256k1_fe_consts_t*)malloc(sizeof(secp256k1_fe_t));
143 secp256k1_num_init(&ret->p);
144 secp256k1_num_set_bin(&ret->p, secp256k1_fe_consts_p, sizeof(secp256k1_fe_consts_p));
145 secp256k1_fe_consts = ret;
149 void static secp256k1_fe_stop(void) {
150 if (secp256k1_fe_consts != NULL) {
151 secp256k1_fe_consts_t *c = (secp256k1_fe_consts_t*)secp256k1_fe_consts;
152 secp256k1_num_free(&c->p);
154 secp256k1_fe_consts = NULL;