]> Git Repo - secp256k1.git/blob - src/field.c
10x26 field implementation
[secp256k1.git] / src / field.c
1 #ifdef USE_FIELD_10X26
2 #include "field_10x26.c"
3 #else
4 #include "field_5x52.c"
5 #endif
6
7 void static secp256k1_fe_get_hex(char *r, int *rlen, const secp256k1_fe_t *a) {
8     if (*rlen < 65) {
9         *rlen = 65;
10         return;
11     }
12     *rlen = 65;
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];
21     }
22     r[64] = 0x00;
23 }
24
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++) {
44         if (alen > i*2)
45             tmp[32 - alen/2 + i] = (cvt[(unsigned char)a[2*i]] << 4) + cvt[(unsigned char)a[2*i+1]];
46     }
47     secp256k1_fe_set_b32(r, tmp);
48 }
49
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);
72     }
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);
78     }
79     for (int j=0; j<10; j++) secp256k1_fe_sqr(&x, &x);
80     secp256k1_fe_mul(r, &x, &a780);
81 }
82
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);
105     }
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);
111     }
112     for (int j=0; j<10; j++) secp256k1_fe_sqr(&x, &x);
113     secp256k1_fe_mul(r, &x, &a45);
114 }
115
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);
119 #else
120     unsigned char b[32];
121     secp256k1_fe_t c = *a;
122     secp256k1_fe_normalize(&c);
123     secp256k1_fe_get_b32(b, &c);
124     secp256k1_num_t n; 
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);
131 #endif
132 }
133
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
140     };
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;
146     }
147 }
148
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);
153         free((void*)c);
154         secp256k1_fe_consts = NULL;
155     }
156 }
This page took 0.032419 seconds and 4 git commands to generate.