7 #ifndef _SECP256K1_FIELD_IMPL_H_
8 #define _SECP256K1_FIELD_IMPL_H_
10 #if defined HAVE_CONFIG_H
11 #include "libsecp256k1-config.h"
16 #if defined(USE_FIELD_GMP)
18 #elif defined(USE_FIELD_10X26)
19 #include "field_10x26_impl.h"
20 #elif defined(USE_FIELD_5X52)
21 #include "field_5x52_impl.h"
23 #error "Please select field implementation"
26 static void secp256k1_fe_get_hex(
char *
r,
int *rlen,
const secp256k1_fe_t *a) {
32 unsigned char tmp[32];
34 secp256k1_fe_normalize(&
b);
35 secp256k1_fe_get_b32(tmp, &
b);
36 for (
int i=0; i<32; i++) {
37 static const char *c =
"0123456789ABCDEF";
38 r[2*i] = c[(tmp[i] >> 4) & 0xF];
39 r[2*i+1] = c[(tmp[i]) & 0xF];
44 static int secp256k1_fe_set_hex(
secp256k1_fe_t *
r,
const char *a,
int alen) {
45 unsigned char tmp[32] = {};
46 static const int cvt[256] = {0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0,
47 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0,
48 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0,
49 0, 1, 2, 3, 4, 5, 6,7,8,9,0,0,0,0,0,0,
50 0,10,11,12,13,14,15,0,0,0,0,0,0,0,0,0,
51 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0,
52 0,10,11,12,13,14,15,0,0,0,0,0,0,0,0,0,
53 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0,
54 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0,
55 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0,
56 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0,
57 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0,
58 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0,
59 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0,
60 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0,
61 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0};
62 for (
int i=0; i<32; i++) {
64 tmp[32 - alen/2 + i] = (cvt[(
unsigned char)a[2*i]] << 4) + cvt[(
unsigned char)a[2*i+1]];
66 return secp256k1_fe_set_b32(
r, tmp);
77 secp256k1_fe_sqr(&x2, a);
78 secp256k1_fe_mul(&x2, &x2, a);
81 secp256k1_fe_sqr(&x3, &x2);
82 secp256k1_fe_mul(&x3, &x3, a);
85 for (
int j=0; j<3; j++) secp256k1_fe_sqr(&x6, &x6);
86 secp256k1_fe_mul(&x6, &x6, &x3);
89 for (
int j=0; j<3; j++) secp256k1_fe_sqr(&x9, &x9);
90 secp256k1_fe_mul(&x9, &x9, &x3);
93 for (
int j=0; j<2; j++) secp256k1_fe_sqr(&x11, &x11);
94 secp256k1_fe_mul(&x11, &x11, &x2);
97 for (
int j=0; j<11; j++) secp256k1_fe_sqr(&x22, &x22);
98 secp256k1_fe_mul(&x22, &x22, &x11);
101 for (
int j=0; j<22; j++) secp256k1_fe_sqr(&x44, &x44);
102 secp256k1_fe_mul(&x44, &x44, &x22);
105 for (
int j=0; j<44; j++) secp256k1_fe_sqr(&x88, &x88);
106 secp256k1_fe_mul(&x88, &x88, &x44);
109 for (
int j=0; j<88; j++) secp256k1_fe_sqr(&x176, &x176);
110 secp256k1_fe_mul(&x176, &x176, &x88);
113 for (
int j=0; j<44; j++) secp256k1_fe_sqr(&x220, &x220);
114 secp256k1_fe_mul(&x220, &x220, &x44);
117 for (
int j=0; j<3; j++) secp256k1_fe_sqr(&x223, &x223);
118 secp256k1_fe_mul(&x223, &x223, &x3);
123 for (
int j=0; j<23; j++) secp256k1_fe_sqr(&t1, &t1);
124 secp256k1_fe_mul(&t1, &t1, &x22);
125 for (
int j=0; j<6; j++) secp256k1_fe_sqr(&t1, &t1);
126 secp256k1_fe_mul(&t1, &t1, &x2);
127 secp256k1_fe_sqr(&t1, &t1);
128 secp256k1_fe_sqr(
r, &t1);
132 secp256k1_fe_sqr(&t1,
r);
133 secp256k1_fe_negate(&t1, &t1, 1);
134 secp256k1_fe_add(&t1, a);
135 secp256k1_fe_normalize(&t1);
136 return secp256k1_fe_is_zero(&t1);
147 secp256k1_fe_sqr(&x2, a);
148 secp256k1_fe_mul(&x2, &x2, a);
151 secp256k1_fe_sqr(&x3, &x2);
152 secp256k1_fe_mul(&x3, &x3, a);
155 for (
int j=0; j<3; j++) secp256k1_fe_sqr(&x6, &x6);
156 secp256k1_fe_mul(&x6, &x6, &x3);
159 for (
int j=0; j<3; j++) secp256k1_fe_sqr(&x9, &x9);
160 secp256k1_fe_mul(&x9, &x9, &x3);
163 for (
int j=0; j<2; j++) secp256k1_fe_sqr(&x11, &x11);
164 secp256k1_fe_mul(&x11, &x11, &x2);
167 for (
int j=0; j<11; j++) secp256k1_fe_sqr(&x22, &x22);
168 secp256k1_fe_mul(&x22, &x22, &x11);
171 for (
int j=0; j<22; j++) secp256k1_fe_sqr(&x44, &x44);
172 secp256k1_fe_mul(&x44, &x44, &x22);
175 for (
int j=0; j<44; j++) secp256k1_fe_sqr(&x88, &x88);
176 secp256k1_fe_mul(&x88, &x88, &x44);
179 for (
int j=0; j<88; j++) secp256k1_fe_sqr(&x176, &x176);
180 secp256k1_fe_mul(&x176, &x176, &x88);
183 for (
int j=0; j<44; j++) secp256k1_fe_sqr(&x220, &x220);
184 secp256k1_fe_mul(&x220, &x220, &x44);
187 for (
int j=0; j<3; j++) secp256k1_fe_sqr(&x223, &x223);
188 secp256k1_fe_mul(&x223, &x223, &x3);
193 for (
int j=0; j<23; j++) secp256k1_fe_sqr(&t1, &t1);
194 secp256k1_fe_mul(&t1, &t1, &x22);
195 for (
int j=0; j<5; j++) secp256k1_fe_sqr(&t1, &t1);
196 secp256k1_fe_mul(&t1, &t1, a);
197 for (
int j=0; j<3; j++) secp256k1_fe_sqr(&t1, &t1);
198 secp256k1_fe_mul(&t1, &t1, &x2);
199 for (
int j=0; j<2; j++) secp256k1_fe_sqr(&t1, &t1);
200 secp256k1_fe_mul(
r, a, &t1);
204 #if defined(USE_FIELD_INV_BUILTIN)
205 secp256k1_fe_inv(
r, a);
206 #elif defined(USE_FIELD_INV_NUM)
209 secp256k1_fe_normalize(&c);
210 secp256k1_fe_get_b32(
b, &c);
212 secp256k1_num_set_bin(&n,
b, 32);
213 secp256k1_num_mod_inverse(&n, &n, &secp256k1_fe_consts->p);
214 secp256k1_num_get_bin(
b, 32, &n);
217 #error "Please select field inverse implementation"
231 secp256k1_fe_mul(&
r[i], &
r[i - 1], &a[i]);
238 secp256k1_fe_mul(&
r[j], &
r[i], &u);
239 secp256k1_fe_mul(&u, &u, &a[j]);
255 secp256k1_fe_mul(&
r[i], &
r[i - 1], &a[i]);
262 secp256k1_fe_mul(&
r[j], &
r[i], &u);
263 secp256k1_fe_mul(&u, &u, &a[j]);
269 static void secp256k1_fe_start(
void) {
271 static const unsigned char secp256k1_fe_consts_p[] = {
272 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
273 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
274 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
275 0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFC,0x2F
278 if (secp256k1_fe_consts == NULL) {
279 secp256k1_fe_inner_start();
282 secp256k1_num_set_bin(&ret->
p, secp256k1_fe_consts_p,
sizeof(secp256k1_fe_consts_p));
284 secp256k1_fe_consts = ret;
288 static void secp256k1_fe_stop(
void) {
289 if (secp256k1_fe_consts != NULL) {
292 secp256k1_fe_consts = NULL;
293 secp256k1_fe_inner_stop();