7 #ifndef SECP256K1_NUM_REPR_IMPL_H
8 #define SECP256K1_NUM_REPR_IMPL_H
22 #define secp256k1_num_sanity(a) do { } while(0)
29 static void secp256k1_num_get_bin(
unsigned char *
r,
unsigned int rlen,
const secp256k1_num *a) {
30 unsigned char tmp[65];
34 len = mpn_get_str(tmp, 256, (mp_limb_t*)a->
data, a->
limbs);
36 while (shift < len && tmp[shift] == 0) shift++;
38 memset(
r, 0, rlen - len + shift);
40 memcpy(
r + rlen - len + shift, tmp + shift, len - shift);
42 memset(tmp, 0,
sizeof(tmp));
45 static void secp256k1_num_set_bin(
secp256k1_num *
r,
const unsigned char *a,
unsigned int alen) {
49 len = mpn_set_str(
r->data, a, alen, 256);
57 while (
r->limbs > 1 &&
r->data[
r->limbs-1]==0) {
63 mp_limb_t c = mpn_add(
r->data, a->
data, a->
limbs,
b->data,
b->limbs);
67 r->data[
r->limbs++] = c;
72 mp_limb_t c = mpn_sub(
r->data, a->
data, a->
limbs,
b->data,
b->limbs);
76 while (
r->limbs > 1 &&
r->data[
r->limbs-1]==0) {
85 if (
r->limbs >= m->
limbs) {
87 mpn_tdiv_qr(t,
r->data, 0,
r->data,
r->limbs, m->
data, m->
limbs);
88 memset(t, 0,
sizeof(t));
90 while (
r->limbs > 1 &&
r->data[
r->limbs-1]==0) {
95 if (
r->neg && (
r->limbs > 1 ||
r->data[0] != 0)) {
96 secp256k1_num_sub_abs(
r, m,
r);
123 for (i = 0; i < m->
limbs; i++) {
128 gn = mpn_gcdext(g,
r->data, &sn, u, m->
limbs, v, m->
limbs);
136 while (
r->limbs > 1 &&
r->data[
r->limbs-1]==0) {
142 memset(g, 0,
sizeof(g));
143 memset(u, 0,
sizeof(u));
144 memset(v, 0,
sizeof(v));
154 mpz_inits(ga, gb, NULL);
156 mpz_import(gb,
b->limbs, -1,
sizeof(mp_limb_t), 0, 0,
b->data);
157 mpz_import(ga, a->
limbs, -1,
sizeof(mp_limb_t), 0, 0, a->
data);
162 ret = mpz_jacobi(ga, gb);
164 mpz_clears(ga, gb, NULL);
170 return (a->
limbs == 1 && a->
data[0] == 1);
174 return (a->
limbs == 1 && a->
data[0] == 0);
182 if (a->
limbs >
b->limbs) {
185 if (a->
limbs <
b->limbs) {
192 if (a->
limbs >
b->limbs) {
195 if (a->
limbs <
b->limbs) {
198 if ((a->
neg && !secp256k1_num_is_zero(a)) != (
b->neg && !secp256k1_num_is_zero(
b))) {
201 return mpn_cmp(a->
data,
b->data, a->
limbs) == 0;
205 if (!(
b->neg ^ bneg ^ a->
neg)) {
207 if (a->
limbs >=
b->limbs) {
208 secp256k1_num_add_abs(
r, a,
b);
210 secp256k1_num_add_abs(
r,
b, a);
213 if (secp256k1_num_cmp(a,
b) > 0) {
215 secp256k1_num_sub_abs(
r, a,
b);
217 r->neg =
b->neg ^ bneg;
218 secp256k1_num_sub_abs(
r,
b, a);
226 secp256k1_num_subadd(
r, a,
b, 0);
232 secp256k1_num_subadd(
r, a,
b, 1);
241 if ((a->
limbs==1 && a->
data[0]==0) || (
b->limbs==1 &&
b->data[0]==0)) {
247 if (a->
limbs >=
b->limbs) {
248 mpn_mul(tmp, a->
data, a->
limbs,
b->data,
b->limbs);
250 mpn_mul(tmp,
b->data,
b->limbs, a->
data, a->
limbs);
252 r->limbs = a->
limbs +
b->limbs;
253 if (
r->limbs > 1 && tmp[
r->limbs - 1]==0) {
257 mpn_copyi(
r->data, tmp,
r->limbs);
258 r->neg = a->
neg ^
b->neg;
259 memset(tmp, 0,
sizeof(tmp));
263 if (bits % GMP_NUMB_BITS) {
265 mpn_rshift(
r->data,
r->data,
r->limbs, bits % GMP_NUMB_BITS);
267 if (bits >= GMP_NUMB_BITS) {
270 for (i = 0; i <
r->limbs; i++) {
271 int index = i + (bits / GMP_NUMB_BITS);
272 if (index < r->limbs && index < 2*
NUM_LIMBS) {
273 r->data[i] =
r->data[index];
279 while (
r->limbs>1 &&
r->data[
r->limbs-1]==0) {