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_t *a) {
30 unsigned char tmp[65];
33 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_t *
r,
const unsigned char *a,
unsigned int alen) {
48 int len = mpn_set_str(
r->data, a, alen, 256);
56 while (
r->limbs > 1 &&
r->data[
r->limbs-1]==0)
r->limbs--;
60 mp_limb_t c = mpn_add(
r->data, a->
data, a->
limbs,
b->data,
b->limbs);
64 r->data[
r->limbs++] = c;
69 mp_limb_t c = mpn_sub(
r->data, a->
data, a->
limbs,
b->data,
b->limbs);
72 while (
r->limbs > 1 &&
r->data[
r->limbs-1]==0)
r->limbs--;
79 if (
r->limbs >= m->
limbs) {
81 mpn_tdiv_qr(t,
r->data, 0,
r->data,
r->limbs, m->
data, m->
limbs);
82 memset(t, 0,
sizeof(t));
84 while (
r->limbs > 1 &&
r->data[
r->limbs-1]==0)
r->limbs--;
87 if (
r->neg && (
r->limbs > 1 ||
r->data[0] != 0)) {
88 secp256k1_num_sub_abs(
r, m,
r);
112 for (
int i=0; i < m->
limbs; i++) {
117 mp_size_t gn = mpn_gcdext(g,
r->data, &sn, u, m->
limbs, v, m->
limbs);
124 while (
r->limbs > 1 &&
r->data[
r->limbs-1]==0)
r->limbs--;
128 memset(g, 0,
sizeof(g));
129 memset(u, 0,
sizeof(u));
130 memset(v, 0,
sizeof(v));
134 return (a->
limbs == 1 && a->
data[0] == 0);
142 if (a->
limbs >
b->limbs)
return 1;
143 if (a->
limbs <
b->limbs)
return -1;
148 if (a->
limbs >
b->limbs)
return 0;
149 if (a->
limbs <
b->limbs)
return 0;
150 if ((a->
neg && !secp256k1_num_is_zero(a)) != (
b->neg && !secp256k1_num_is_zero(
b)))
return 0;
151 return mpn_cmp(a->
data,
b->data, a->
limbs) == 0;
155 if (!(
b->neg ^ bneg ^ a->
neg)) {
157 if (a->
limbs >=
b->limbs) {
158 secp256k1_num_add_abs(
r, a,
b);
160 secp256k1_num_add_abs(
r,
b, a);
163 if (secp256k1_num_cmp(a,
b) > 0) {
165 secp256k1_num_sub_abs(
r, a,
b);
167 r->neg =
b->neg ^ bneg;
168 secp256k1_num_sub_abs(
r,
b, a);
176 secp256k1_num_subadd(
r, a,
b, 0);
182 secp256k1_num_subadd(
r, a,
b, 1);
191 if ((a->
limbs==1 && a->
data[0]==0) || (
b->limbs==1 &&
b->data[0]==0)) {
198 mpn_mul(tmp, a->
data, a->
limbs,
b->data,
b->limbs);
200 mpn_mul(tmp,
b->data,
b->limbs, a->
data, a->
limbs);
201 r->limbs = a->
limbs +
b->limbs;
202 if (
r->limbs > 1 && tmp[
r->limbs - 1]==0)
r->limbs--;
204 mpn_copyi(
r->data, tmp,
r->limbs);
205 r->neg = a->
neg ^
b->neg;
206 memset(tmp, 0,
sizeof(tmp));
210 if (bits % GMP_NUMB_BITS) {
212 mpn_rshift(
r->data,
r->data,
r->limbs, bits % GMP_NUMB_BITS);
214 if (bits >= GMP_NUMB_BITS) {
216 for (
int i = 0; i <
r->limbs; i++) {
217 int index = i + (bits / GMP_NUMB_BITS);
218 if (index < r->limbs && index < 2*
NUM_LIMBS) {
219 r->data[i] =
r->data[index];
225 while (
r->limbs>1 &&
r->data[
r->limbs-1]==0)
r->limbs--;