deprecate mp_tc_(and|or|xor) in favor of mp_(and|or|xor)
* same behavior for positive numbers * generalisation for negative numbers, treating them as two complement * improve algorithm, iterate once over the digits, manually perform two complement * simplify mp_add_d, mp_sub_d * functions are safe in case of a==c or b==c * renamed mp_tc_div_2d to mp_signed_rsh (signed right shift)
This commit is contained in:
parent
aeeea0d7cb
commit
1af0de1f91
@ -122,4 +122,28 @@ void bn_reverse(unsigned char *s, int len)
|
||||
s_mp_reverse(s, len);
|
||||
}
|
||||
#endif
|
||||
#ifdef BN_MP_TC_AND_C
|
||||
mp_err mp_tc_and(const mp_int *a, const mp_int *b, mp_int *c)
|
||||
{
|
||||
return mp_and(a, b, c);
|
||||
}
|
||||
#endif
|
||||
#ifdef BN_MP_TC_OR_C
|
||||
mp_err mp_tc_or(const mp_int *a, const mp_int *b, mp_int *c)
|
||||
{
|
||||
return mp_or(a, b, c);
|
||||
}
|
||||
#endif
|
||||
#ifdef BN_MP_TC_XOR_C
|
||||
mp_err mp_tc_xor(const mp_int *a, const mp_int *b, mp_int *c)
|
||||
{
|
||||
return mp_xor(a, b, c);
|
||||
}
|
||||
#endif
|
||||
#ifdef BN_MP_TC_DIV_2D_C
|
||||
mp_err mp_tc_div_2d(const mp_int *a, int b, mp_int *c)
|
||||
{
|
||||
return mp_signed_rsh(a, b, c);
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
@ -8,7 +8,7 @@ mp_err mp_add_d(const mp_int *a, mp_digit b, mp_int *c)
|
||||
{
|
||||
mp_err err;
|
||||
int ix, oldused;
|
||||
mp_digit *tmpa, *tmpc, mu;
|
||||
mp_digit *tmpa, *tmpc;
|
||||
|
||||
/* grow c as required */
|
||||
if (c->alloc < (a->used + 1)) {
|
||||
@ -46,15 +46,9 @@ mp_err mp_add_d(const mp_int *a, mp_digit b, mp_int *c)
|
||||
|
||||
/* if a is positive */
|
||||
if (a->sign == MP_ZPOS) {
|
||||
/* add digit, after this we're propagating
|
||||
* the carry.
|
||||
*/
|
||||
*tmpc = *tmpa++ + b;
|
||||
mu = *tmpc >> MP_DIGIT_BIT;
|
||||
*tmpc++ &= MP_MASK;
|
||||
|
||||
/* now handle rest of the digits */
|
||||
for (ix = 1; ix < a->used; ix++) {
|
||||
/* add digits, mu is carry */
|
||||
mp_digit mu = b;
|
||||
for (ix = 0; ix < a->used; ix++) {
|
||||
*tmpc = *tmpa++ + mu;
|
||||
mu = *tmpc >> MP_DIGIT_BIT;
|
||||
*tmpc++ &= MP_MASK;
|
||||
|
62
bn_mp_and.c
62
bn_mp_and.c
@ -3,38 +3,54 @@
|
||||
/* LibTomMath, multiple-precision integer library -- Tom St Denis */
|
||||
/* SPDX-License-Identifier: Unlicense */
|
||||
|
||||
/* AND two ints together */
|
||||
/* two complement and */
|
||||
mp_err mp_and(const mp_int *a, const mp_int *b, mp_int *c)
|
||||
{
|
||||
int ix, px;
|
||||
int used = MP_MAX(a->used, b->used) + 1, i;
|
||||
mp_err err;
|
||||
mp_int t;
|
||||
const mp_int *x;
|
||||
mp_digit ac = 1, bc = 1, cc = 1;
|
||||
mp_sign csign = (a->sign == MP_NEG && b->sign == MP_NEG) ? MP_NEG : MP_ZPOS;
|
||||
|
||||
if (a->used > b->used) {
|
||||
if ((err = mp_init_copy(&t, a)) != MP_OKAY) {
|
||||
if (c->alloc < used) {
|
||||
if ((err = mp_grow(c, used)) != MP_OKAY) {
|
||||
return err;
|
||||
}
|
||||
px = b->used;
|
||||
x = b;
|
||||
} else {
|
||||
if ((err = mp_init_copy(&t, b)) != MP_OKAY) {
|
||||
return err;
|
||||
}
|
||||
|
||||
for (i = 0; i < used; i++) {
|
||||
mp_digit x, y;
|
||||
|
||||
/* convert to two complement if negative */
|
||||
if (a->sign == MP_NEG) {
|
||||
ac += i >= a->used ? MP_MASK : ~a->dp[i] & MP_MASK;
|
||||
x = ac & MP_MASK;
|
||||
ac >>= MP_DIGIT_BIT;
|
||||
} else {
|
||||
x = i >= a->used ? 0 : a->dp[i];
|
||||
}
|
||||
|
||||
/* convert to two complement if negative */
|
||||
if (b->sign == MP_NEG) {
|
||||
bc += i >= b->used ? MP_MASK : ~b->dp[i] & MP_MASK;
|
||||
y = bc & MP_MASK;
|
||||
bc >>= MP_DIGIT_BIT;
|
||||
} else {
|
||||
y = i >= b->used ? 0 : b->dp[i];
|
||||
}
|
||||
|
||||
c->dp[i] = x & y;
|
||||
|
||||
/* convert to to sign-magnitude if negative */
|
||||
if (csign == MP_NEG) {
|
||||
cc += ~c->dp[i] & MP_MASK;
|
||||
c->dp[i] = cc & MP_MASK;
|
||||
cc >>= MP_DIGIT_BIT;
|
||||
}
|
||||
px = a->used;
|
||||
x = a;
|
||||
}
|
||||
|
||||
for (ix = 0; ix < px; ix++) {
|
||||
t.dp[ix] &= x->dp[ix];
|
||||
}
|
||||
|
||||
/* zero digits above the last from the smallest mp_int */
|
||||
MP_ZERO_DIGITS(t.dp + ix, t.used - ix);
|
||||
|
||||
mp_clamp(&t);
|
||||
mp_exch(c, &t);
|
||||
mp_clear(&t);
|
||||
c->used = used;
|
||||
c->sign = csign;
|
||||
mp_clamp(c);
|
||||
return MP_OKAY;
|
||||
}
|
||||
#endif
|
||||
|
@ -44,10 +44,7 @@ mp_err mp_lshd(mp_int *a, int b)
|
||||
}
|
||||
|
||||
/* zero the lower digits */
|
||||
top = a->dp;
|
||||
for (x = 0; x < b; x++) {
|
||||
*top++ = 0;
|
||||
}
|
||||
MP_ZERO_DIGITS(a->dp, b);
|
||||
|
||||
return MP_OKAY;
|
||||
}
|
||||
|
60
bn_mp_or.c
60
bn_mp_or.c
@ -3,34 +3,54 @@
|
||||
/* LibTomMath, multiple-precision integer library -- Tom St Denis */
|
||||
/* SPDX-License-Identifier: Unlicense */
|
||||
|
||||
/* OR two ints together */
|
||||
/* two complement or */
|
||||
mp_err mp_or(const mp_int *a, const mp_int *b, mp_int *c)
|
||||
{
|
||||
int ix, px;
|
||||
mp_err err;
|
||||
mp_int t;
|
||||
const mp_int *x;
|
||||
int used = MP_MAX(a->used, b->used) + 1, i;
|
||||
mp_err err;
|
||||
mp_digit ac = 1, bc = 1, cc = 1;
|
||||
mp_sign csign = (a->sign == MP_NEG || b->sign == MP_NEG) ? MP_NEG : MP_ZPOS;
|
||||
|
||||
if (a->used > b->used) {
|
||||
if ((err = mp_init_copy(&t, a)) != MP_OKAY) {
|
||||
if (c->alloc < used) {
|
||||
if ((err = mp_grow(c, used)) != MP_OKAY) {
|
||||
return err;
|
||||
}
|
||||
px = b->used;
|
||||
x = b;
|
||||
} else {
|
||||
if ((err = mp_init_copy(&t, b)) != MP_OKAY) {
|
||||
return err;
|
||||
}
|
||||
px = a->used;
|
||||
x = a;
|
||||
}
|
||||
|
||||
for (ix = 0; ix < px; ix++) {
|
||||
t.dp[ix] |= x->dp[ix];
|
||||
for (i = 0; i < used; i++) {
|
||||
mp_digit x, y;
|
||||
|
||||
/* convert to two complement if negative */
|
||||
if (a->sign == MP_NEG) {
|
||||
ac += i >= a->used ? MP_MASK : ~a->dp[i] & MP_MASK;
|
||||
x = ac & MP_MASK;
|
||||
ac >>= MP_DIGIT_BIT;
|
||||
} else {
|
||||
x = i >= a->used ? 0 : a->dp[i];
|
||||
}
|
||||
|
||||
/* convert to two complement if negative */
|
||||
if (b->sign == MP_NEG) {
|
||||
bc += i >= b->used ? MP_MASK : ~b->dp[i] & MP_MASK;
|
||||
y = bc & MP_MASK;
|
||||
bc >>= MP_DIGIT_BIT;
|
||||
} else {
|
||||
y = i >= b->used ? 0 : b->dp[i];
|
||||
}
|
||||
|
||||
c->dp[i] = x | y;
|
||||
|
||||
/* convert to to sign-magnitude if negative */
|
||||
if (csign == MP_NEG) {
|
||||
cc += ~c->dp[i] & MP_MASK;
|
||||
c->dp[i] = cc & MP_MASK;
|
||||
cc >>= MP_DIGIT_BIT;
|
||||
}
|
||||
}
|
||||
mp_clamp(&t);
|
||||
mp_exch(c, &t);
|
||||
mp_clear(&t);
|
||||
|
||||
c->used = used;
|
||||
c->sign = csign;
|
||||
mp_clamp(c);
|
||||
return MP_OKAY;
|
||||
}
|
||||
#endif
|
||||
|
@ -43,9 +43,7 @@ void mp_rshd(mp_int *a, int b)
|
||||
}
|
||||
|
||||
/* zero the top digits */
|
||||
for (; x < a->used; x++) {
|
||||
*bottom++ = 0;
|
||||
}
|
||||
MP_ZERO_DIGITS(bottom, a->used - x);
|
||||
|
||||
/* remove excess digits */
|
||||
a->used -= b;
|
||||
|
22
bn_mp_signed_rsh.c
Normal file
22
bn_mp_signed_rsh.c
Normal file
@ -0,0 +1,22 @@
|
||||
#include "tommath_private.h"
|
||||
#ifdef BN_MP_SIGNED_RSH_C
|
||||
/* LibTomMath, multiple-precision integer library -- Tom St Denis */
|
||||
/* SPDX-License-Identifier: Unlicense */
|
||||
|
||||
/* shift right by a certain bit count with sign extension */
|
||||
mp_err mp_signed_rsh(const mp_int *a, int b, mp_int *c)
|
||||
{
|
||||
mp_err res;
|
||||
if (a->sign == MP_ZPOS) {
|
||||
return mp_div_2d(a, b, c, NULL);
|
||||
}
|
||||
|
||||
res = mp_add_d(a, 1uL, c);
|
||||
if (res != MP_OKAY) {
|
||||
return res;
|
||||
}
|
||||
|
||||
res = mp_div_2d(c, b, c, NULL);
|
||||
return (res == MP_OKAY) ? mp_sub_d(c, 1uL, c) : res;
|
||||
}
|
||||
#endif
|
@ -6,7 +6,7 @@
|
||||
/* single digit subtraction */
|
||||
mp_err mp_sub_d(const mp_int *a, mp_digit b, mp_int *c)
|
||||
{
|
||||
mp_digit *tmpa, *tmpc, mu;
|
||||
mp_digit *tmpa, *tmpc;
|
||||
mp_err err;
|
||||
int ix, oldused;
|
||||
|
||||
@ -50,17 +50,14 @@ mp_err mp_sub_d(const mp_int *a, mp_digit b, mp_int *c)
|
||||
c->sign = MP_NEG;
|
||||
c->used = 1;
|
||||
} else {
|
||||
mp_digit mu = b;
|
||||
|
||||
/* positive/size */
|
||||
c->sign = MP_ZPOS;
|
||||
c->used = a->used;
|
||||
|
||||
/* subtract first digit */
|
||||
*tmpc = *tmpa++ - b;
|
||||
mu = *tmpc >> (MP_SIZEOF_BITS(mp_digit) - 1u);
|
||||
*tmpc++ &= MP_MASK;
|
||||
|
||||
/* handle rest of the digits */
|
||||
for (ix = 1; ix < a->used; ix++) {
|
||||
/* subtract digits, mu is carry */
|
||||
for (ix = 0; ix < a->used; ix++) {
|
||||
*tmpc = *tmpa++ - mu;
|
||||
mu = *tmpc >> (MP_SIZEOF_BITS(mp_digit) - 1u);
|
||||
*tmpc++ &= MP_MASK;
|
||||
|
@ -1,78 +0,0 @@
|
||||
#include "tommath_private.h"
|
||||
#ifdef BN_MP_TC_AND_C
|
||||
/* LibTomMath, multiple-precision integer library -- Tom St Denis */
|
||||
/* SPDX-License-Identifier: Unlicense */
|
||||
|
||||
/* two complement and */
|
||||
mp_err mp_tc_and(const mp_int *a, const mp_int *b, mp_int *c)
|
||||
{
|
||||
mp_err err = MP_OKAY;
|
||||
int bits, abits, bbits;
|
||||
mp_sign sa = a->sign, sb = b->sign;
|
||||
mp_int *mx = NULL, _mx, acpy, bcpy;
|
||||
|
||||
if ((sa == MP_NEG) || (sb == MP_NEG)) {
|
||||
abits = mp_count_bits(a);
|
||||
bbits = mp_count_bits(b);
|
||||
bits = MP_MAX(abits, bbits);
|
||||
err = mp_init_set_int(&_mx, 1uL);
|
||||
if (err != MP_OKAY) {
|
||||
goto end;
|
||||
}
|
||||
|
||||
mx = &_mx;
|
||||
err = mp_mul_2d(mx, bits + 1, mx);
|
||||
if (err != MP_OKAY) {
|
||||
goto end;
|
||||
}
|
||||
|
||||
if (sa == MP_NEG) {
|
||||
err = mp_init(&acpy);
|
||||
if (err != MP_OKAY) {
|
||||
goto end;
|
||||
}
|
||||
|
||||
err = mp_add(mx, a, &acpy);
|
||||
if (err != MP_OKAY) {
|
||||
mp_clear(&acpy);
|
||||
goto end;
|
||||
}
|
||||
a = &acpy;
|
||||
}
|
||||
if (sb == MP_NEG) {
|
||||
err = mp_init(&bcpy);
|
||||
if (err != MP_OKAY) {
|
||||
goto end;
|
||||
}
|
||||
|
||||
err = mp_add(mx, b, &bcpy);
|
||||
if (err != MP_OKAY) {
|
||||
mp_clear(&bcpy);
|
||||
goto end;
|
||||
}
|
||||
b = &bcpy;
|
||||
}
|
||||
}
|
||||
|
||||
err = mp_and(a, b, c);
|
||||
|
||||
if ((sa == MP_NEG) && (sb == MP_NEG) && (err == MP_OKAY)) {
|
||||
err = mp_sub(c, mx, c);
|
||||
}
|
||||
|
||||
end:
|
||||
if (a == &acpy) {
|
||||
mp_clear(&acpy);
|
||||
}
|
||||
|
||||
if (b == &bcpy) {
|
||||
mp_clear(&bcpy);
|
||||
}
|
||||
|
||||
if (mx == &_mx) {
|
||||
mp_clear(mx);
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
#endif
|
@ -1,22 +0,0 @@
|
||||
#include "tommath_private.h"
|
||||
#ifdef BN_MP_TC_DIV_2D_C
|
||||
/* LibTomMath, multiple-precision integer library -- Tom St Denis */
|
||||
/* SPDX-License-Identifier: Unlicense */
|
||||
|
||||
/* two complement right shift */
|
||||
mp_err mp_tc_div_2d(const mp_int *a, int b, mp_int *c)
|
||||
{
|
||||
mp_err err;
|
||||
if (a->sign == MP_ZPOS) {
|
||||
return mp_div_2d(a, b, c, NULL);
|
||||
}
|
||||
|
||||
err = mp_add_d(a, 1uL, c);
|
||||
if (err != MP_OKAY) {
|
||||
return err;
|
||||
}
|
||||
|
||||
err = mp_div_2d(c, b, c, NULL);
|
||||
return (err == MP_OKAY) ? mp_sub_d(c, 1uL, c) : err;
|
||||
}
|
||||
#endif
|
@ -1,78 +0,0 @@
|
||||
#include "tommath_private.h"
|
||||
#ifdef BN_MP_TC_OR_C
|
||||
/* LibTomMath, multiple-precision integer library -- Tom St Denis */
|
||||
/* SPDX-License-Identifier: Unlicense */
|
||||
|
||||
/* two complement or */
|
||||
mp_err mp_tc_or(const mp_int *a, const mp_int *b, mp_int *c)
|
||||
{
|
||||
mp_err err = MP_OKAY;
|
||||
int bits, abits, bbits;
|
||||
mp_sign sa = a->sign, sb = b->sign;
|
||||
mp_int *mx = NULL, _mx, acpy, bcpy;
|
||||
|
||||
if ((sa == MP_NEG) || (sb == MP_NEG)) {
|
||||
abits = mp_count_bits(a);
|
||||
bbits = mp_count_bits(b);
|
||||
bits = MP_MAX(abits, bbits);
|
||||
err = mp_init_set_int(&_mx, 1uL);
|
||||
if (err != MP_OKAY) {
|
||||
goto end;
|
||||
}
|
||||
|
||||
mx = &_mx;
|
||||
err = mp_mul_2d(mx, bits + 1, mx);
|
||||
if (err != MP_OKAY) {
|
||||
goto end;
|
||||
}
|
||||
|
||||
if (sa == MP_NEG) {
|
||||
err = mp_init(&acpy);
|
||||
if (err != MP_OKAY) {
|
||||
goto end;
|
||||
}
|
||||
|
||||
err = mp_add(mx, a, &acpy);
|
||||
if (err != MP_OKAY) {
|
||||
mp_clear(&acpy);
|
||||
goto end;
|
||||
}
|
||||
a = &acpy;
|
||||
}
|
||||
if (sb == MP_NEG) {
|
||||
err = mp_init(&bcpy);
|
||||
if (err != MP_OKAY) {
|
||||
goto end;
|
||||
}
|
||||
|
||||
err = mp_add(mx, b, &bcpy);
|
||||
if (err != MP_OKAY) {
|
||||
mp_clear(&bcpy);
|
||||
goto end;
|
||||
}
|
||||
b = &bcpy;
|
||||
}
|
||||
}
|
||||
|
||||
err = mp_or(a, b, c);
|
||||
|
||||
if (((sa == MP_NEG) || (sb == MP_NEG)) && (err == MP_OKAY)) {
|
||||
err = mp_sub(c, mx, c);
|
||||
}
|
||||
|
||||
end:
|
||||
if (a == &acpy) {
|
||||
mp_clear(&acpy);
|
||||
}
|
||||
|
||||
if (b == &bcpy) {
|
||||
mp_clear(&bcpy);
|
||||
}
|
||||
|
||||
if (mx == &_mx) {
|
||||
mp_clear(mx);
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
#endif
|
@ -1,78 +0,0 @@
|
||||
#include "tommath_private.h"
|
||||
#ifdef BN_MP_TC_XOR_C
|
||||
/* LibTomMath, multiple-precision integer library -- Tom St Denis */
|
||||
/* SPDX-License-Identifier: Unlicense */
|
||||
|
||||
/* two complement xor */
|
||||
mp_err mp_tc_xor(const mp_int *a, const mp_int *b, mp_int *c)
|
||||
{
|
||||
mp_err err = MP_OKAY;
|
||||
int bits, abits, bbits;
|
||||
mp_sign sa = a->sign, sb = b->sign;
|
||||
mp_int *mx = NULL, _mx, acpy, bcpy;
|
||||
|
||||
if ((sa == MP_NEG) || (sb == MP_NEG)) {
|
||||
abits = mp_count_bits(a);
|
||||
bbits = mp_count_bits(b);
|
||||
bits = MP_MAX(abits, bbits);
|
||||
err = mp_init_set_int(&_mx, 1uL);
|
||||
if (err != MP_OKAY) {
|
||||
goto end;
|
||||
}
|
||||
|
||||
mx = &_mx;
|
||||
err = mp_mul_2d(mx, bits + 1, mx);
|
||||
if (err != MP_OKAY) {
|
||||
goto end;
|
||||
}
|
||||
|
||||
if (sa == MP_NEG) {
|
||||
err = mp_init(&acpy);
|
||||
if (err != MP_OKAY) {
|
||||
goto end;
|
||||
}
|
||||
|
||||
err = mp_add(mx, a, &acpy);
|
||||
if (err != MP_OKAY) {
|
||||
mp_clear(&acpy);
|
||||
goto end;
|
||||
}
|
||||
a = &acpy;
|
||||
}
|
||||
if (sb == MP_NEG) {
|
||||
err = mp_init(&bcpy);
|
||||
if (err != MP_OKAY) {
|
||||
goto end;
|
||||
}
|
||||
|
||||
err = mp_add(mx, b, &bcpy);
|
||||
if (err != MP_OKAY) {
|
||||
mp_clear(&bcpy);
|
||||
goto end;
|
||||
}
|
||||
b = &bcpy;
|
||||
}
|
||||
}
|
||||
|
||||
err = mp_xor(a, b, c);
|
||||
|
||||
if ((((sa == MP_NEG) && (sb != MP_NEG)) || ((sa != MP_NEG) && (sb == MP_NEG))) && (err == MP_OKAY)) {
|
||||
err = mp_sub(c, mx, c);
|
||||
}
|
||||
|
||||
end:
|
||||
if (a == &acpy) {
|
||||
mp_clear(&acpy);
|
||||
}
|
||||
|
||||
if (b == &bcpy) {
|
||||
mp_clear(&bcpy);
|
||||
}
|
||||
|
||||
if (mx == &_mx) {
|
||||
mp_clear(mx);
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
#endif
|
60
bn_mp_xor.c
60
bn_mp_xor.c
@ -3,34 +3,54 @@
|
||||
/* LibTomMath, multiple-precision integer library -- Tom St Denis */
|
||||
/* SPDX-License-Identifier: Unlicense */
|
||||
|
||||
/* XOR two ints together */
|
||||
/* two complement xor */
|
||||
mp_err mp_xor(const mp_int *a, const mp_int *b, mp_int *c)
|
||||
{
|
||||
int ix, px;
|
||||
mp_err err;
|
||||
mp_int t;
|
||||
const mp_int *x;
|
||||
int used = MP_MAX(a->used, b->used) + 1, i;
|
||||
mp_err err;
|
||||
mp_digit ac = 1, bc = 1, cc = 1;
|
||||
mp_sign csign = (a->sign != b->sign) ? MP_NEG : MP_ZPOS;
|
||||
|
||||
if (a->used > b->used) {
|
||||
if ((err = mp_init_copy(&t, a)) != MP_OKAY) {
|
||||
if (c->alloc < used) {
|
||||
if ((err = mp_grow(c, used)) != MP_OKAY) {
|
||||
return err;
|
||||
}
|
||||
px = b->used;
|
||||
x = b;
|
||||
} else {
|
||||
if ((err = mp_init_copy(&t, b)) != MP_OKAY) {
|
||||
return err;
|
||||
}
|
||||
px = a->used;
|
||||
x = a;
|
||||
}
|
||||
|
||||
for (ix = 0; ix < px; ix++) {
|
||||
t.dp[ix] ^= x->dp[ix];
|
||||
for (i = 0; i < used; i++) {
|
||||
mp_digit x, y;
|
||||
|
||||
/* convert to two complement if negative */
|
||||
if (a->sign == MP_NEG) {
|
||||
ac += i >= a->used ? MP_MASK : ~a->dp[i] & MP_MASK;
|
||||
x = ac & MP_MASK;
|
||||
ac >>= MP_DIGIT_BIT;
|
||||
} else {
|
||||
x = i >= a->used ? 0 : a->dp[i];
|
||||
}
|
||||
|
||||
/* convert to two complement if negative */
|
||||
if (b->sign == MP_NEG) {
|
||||
bc += i >= b->used ? MP_MASK : ~b->dp[i] & MP_MASK;
|
||||
y = bc & MP_MASK;
|
||||
bc >>= MP_DIGIT_BIT;
|
||||
} else {
|
||||
y = i >= b->used ? 0 : b->dp[i];
|
||||
}
|
||||
|
||||
c->dp[i] = x ^ y;
|
||||
|
||||
/* convert to to sign-magnitude if negative */
|
||||
if (csign == MP_NEG) {
|
||||
cc += ~c->dp[i] & MP_MASK;
|
||||
c->dp[i] = cc & MP_MASK;
|
||||
cc >>= MP_DIGIT_BIT;
|
||||
}
|
||||
}
|
||||
mp_clamp(&t);
|
||||
mp_exch(c, &t);
|
||||
mp_clear(&t);
|
||||
|
||||
c->used = used;
|
||||
c->sign = csign;
|
||||
mp_clamp(c);
|
||||
return MP_OKAY;
|
||||
}
|
||||
#endif
|
||||
|
32
demo/test.c
32
demo/test.c
@ -347,7 +347,7 @@ LBL_ERR:
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
static int test_mp_tc_div_2d(void)
|
||||
static int test_mp_signed_rsh(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
@ -371,9 +371,9 @@ static int test_mp_tc_div_2d(void)
|
||||
if ((l >> em) < 0)
|
||||
mp_neg(&d, &d);
|
||||
|
||||
mp_tc_div_2d(&a, em, &b);
|
||||
mp_signed_rsh(&a, em, &b);
|
||||
if (mp_cmp(&b, &d) != MP_EQ) {
|
||||
printf("\nmp_tc_div_2d() bad result!");
|
||||
printf("\nmp_signed_rsh() bad result!");
|
||||
goto LBL_ERR;
|
||||
}
|
||||
}
|
||||
@ -386,7 +386,7 @@ LBL_ERR:
|
||||
|
||||
}
|
||||
|
||||
static int test_mp_tc_xor(void)
|
||||
static int test_mp_xor(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
@ -412,9 +412,9 @@ static int test_mp_tc_xor(void)
|
||||
if ((l ^ em) < 0)
|
||||
mp_neg(&d, &d);
|
||||
|
||||
mp_tc_xor(&a, &b, &c);
|
||||
mp_xor(&a, &b, &c);
|
||||
if (mp_cmp(&c, &d) != MP_EQ) {
|
||||
printf("\nmp_tc_xor() bad result!");
|
||||
printf("\nmp_xor() bad result!");
|
||||
goto LBL_ERR;
|
||||
}
|
||||
}
|
||||
@ -427,7 +427,7 @@ LBL_ERR:
|
||||
|
||||
}
|
||||
|
||||
static int test_mp_tc_or(void)
|
||||
static int test_mp_or(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
@ -453,9 +453,9 @@ static int test_mp_tc_or(void)
|
||||
if ((l | em) < 0)
|
||||
mp_neg(&d, &d);
|
||||
|
||||
mp_tc_or(&a, &b, &c);
|
||||
mp_or(&a, &b, &c);
|
||||
if (mp_cmp(&c, &d) != MP_EQ) {
|
||||
printf("\nmp_tc_or() bad result!");
|
||||
printf("\nmp_or() bad result!");
|
||||
goto LBL_ERR;
|
||||
}
|
||||
}
|
||||
@ -467,7 +467,7 @@ LBL_ERR:
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
static int test_mp_tc_and(void)
|
||||
static int test_mp_and(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
@ -493,9 +493,9 @@ static int test_mp_tc_and(void)
|
||||
if ((l & em) < 0)
|
||||
mp_neg(&d, &d);
|
||||
|
||||
mp_tc_and(&a, &b, &c);
|
||||
mp_and(&a, &b, &c);
|
||||
if (mp_cmp(&c, &d) != MP_EQ) {
|
||||
printf("\nmp_tc_and() bad result!");
|
||||
printf("\nmp_and() bad result!");
|
||||
goto LBL_ERR;
|
||||
}
|
||||
}
|
||||
@ -2021,6 +2021,7 @@ int unit_tests(int argc, char **argv)
|
||||
} test[] = {
|
||||
#define T(n) { #n, test_##n }
|
||||
T(trivial_stuff),
|
||||
T(mp_and),
|
||||
T(mp_cnt_lsb),
|
||||
T(mp_complement),
|
||||
T(mp_decr),
|
||||
@ -2037,6 +2038,7 @@ int unit_tests(int argc, char **argv)
|
||||
T(mp_kronecker),
|
||||
T(mp_montgomery_reduce),
|
||||
T(mp_n_root),
|
||||
T(mp_or),
|
||||
T(mp_prime_is_prime),
|
||||
T(mp_prime_rand),
|
||||
T(mp_rand),
|
||||
@ -2044,12 +2046,10 @@ int unit_tests(int argc, char **argv)
|
||||
T(mp_reduce_2k),
|
||||
T(mp_reduce_2k_l),
|
||||
T(mp_set_double),
|
||||
T(mp_signed_rsh),
|
||||
T(mp_sqrt),
|
||||
T(mp_sqrtmod_prime),
|
||||
T(mp_tc_and),
|
||||
T(mp_tc_div_2d),
|
||||
T(mp_tc_or),
|
||||
T(mp_tc_xor),
|
||||
T(mp_xor),
|
||||
T(s_mp_balance_mul),
|
||||
T(s_mp_jacobi),
|
||||
T(s_mp_karatsuba_mul),
|
||||
|
29
doc/bn.tex
29
doc/bn.tex
@ -1238,13 +1238,6 @@ function simply copies $a$ over to ``c'' and zeroes $d$. The variable $d$ may b
|
||||
value to signal that the remainder is not desired. The division itself is implemented as a left-shift
|
||||
operation of $a$ by $b$ bits.
|
||||
|
||||
\index{mp\_tc\_div\_2d}\label{arithrightshift}
|
||||
\begin{alltt}
|
||||
int mp_tc_div_2d (mp_int * a, int b, mp_int * c, mp_int * d);
|
||||
\end{alltt}
|
||||
The two-co,mplement version of the function above. This can be used to implement arbitrary-precision two-complement integers together with the two-complement bit-wise operations at page \ref{tcbitwiseops}.
|
||||
|
||||
|
||||
It is also not very uncommon to need just the power of two $2^b$; for example the startvalue for the Newton method.
|
||||
|
||||
\index{mp\_2expt}
|
||||
@ -1280,30 +1273,20 @@ in place and no new digits are required to complete it.
|
||||
|
||||
\subsection{AND, OR, XOR and COMPLEMENT Operations}
|
||||
|
||||
While AND, OR and XOR operations are not typical ``bignum functions'' they can be useful in several instances. The
|
||||
three functions are prototyped as follows.
|
||||
While AND, OR and XOR operations compute arbitrary-precision bitwise operations. Negative numbers
|
||||
are treated as if they are in two-complement representation, while internally they are sign-magnitude however.
|
||||
|
||||
\index{mp\_or} \index{mp\_and} \index{mp\_xor}
|
||||
\index{mp\_or} \index{mp\_and} \index{mp\_xor} \index{mp\_complement}
|
||||
\begin{alltt}
|
||||
int mp_or (mp_int * a, mp_int * b, mp_int * c);
|
||||
int mp_and (mp_int * a, mp_int * b, mp_int * c);
|
||||
int mp_xor (mp_int * a, mp_int * b, mp_int * c);
|
||||
\end{alltt}
|
||||
|
||||
Which compute $c = a \odot b$ where $\odot$ is one of OR, AND or XOR.
|
||||
|
||||
The following four functions allow implementing arbitrary-precision two-complement numbers.
|
||||
|
||||
\index{mp\_tc\_or} \index{mp\_tc\_and} \index{mp\_tc\_xor} \index{mp\_complement} \label{tcbitwiseops}
|
||||
\begin{alltt}
|
||||
int mp_tc_or (mp_int * a, mp_int * b, mp_int * c);
|
||||
int mp_tc_and (mp_int * a, mp_int * b, mp_int * c);
|
||||
int mp_tc_xor (mp_int * a, mp_int * b, mp_int * c);
|
||||
int mp_complement(const mp_int *a, mp_int *b);
|
||||
int mp_signed_rsh(mp_int * a, int b, mp_int * c, mp_int * d);
|
||||
\end{alltt}
|
||||
|
||||
They compute $c = a \odot b$ as above if both $a$ and $b$ are positive. Negative values are converted into their two-complement representations first. The function \texttt{mp\_complement} computes a two-complement $b = \sim a$.
|
||||
|
||||
The function \texttt{mp\_complement} computes a two-complement $b = \sim a$. The function \texttt{mp\_signed\_rsh} performs
|
||||
sign extending right shift. For positive numbers it is equivalent to \texttt{mp\_div\_2d}.
|
||||
|
||||
\subsection{Bit Picking}
|
||||
\index{mp\_get\_bit}
|
||||
|
@ -728,6 +728,10 @@
|
||||
RelativePath="bn_mp_signed_bin_size.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="bn_mp_signed_rsh.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="bn_mp_sqr.c"
|
||||
>
|
||||
@ -756,22 +760,6 @@
|
||||
RelativePath="bn_mp_submod.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="bn_mp_tc_and.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="bn_mp_tc_div_2d.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="bn_mp_tc_or.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="bn_mp_tc_xor.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="bn_mp_to_signed_bin.c"
|
||||
>
|
||||
|
18
makefile
18
makefile
@ -45,15 +45,15 @@ bn_mp_rand.o bn_mp_read_radix.o bn_mp_read_signed_bin.o bn_mp_read_unsigned_bin.
|
||||
bn_mp_reduce_2k.o bn_mp_reduce_2k_l.o bn_mp_reduce_2k_setup.o bn_mp_reduce_2k_setup_l.o \
|
||||
bn_mp_reduce_is_2k.o bn_mp_reduce_is_2k_l.o bn_mp_reduce_setup.o bn_mp_rshd.o bn_mp_set.o \
|
||||
bn_mp_set_double.o bn_mp_set_int.o bn_mp_set_long.o bn_mp_set_long_long.o bn_mp_shrink.o \
|
||||
bn_mp_signed_bin_size.o bn_mp_sqr.o bn_mp_sqrmod.o bn_mp_sqrt.o bn_mp_sqrtmod_prime.o bn_mp_sub.o \
|
||||
bn_mp_sub_d.o bn_mp_submod.o bn_mp_tc_and.o bn_mp_tc_div_2d.o bn_mp_tc_or.o bn_mp_tc_xor.o \
|
||||
bn_mp_to_signed_bin.o bn_mp_to_signed_bin_n.o bn_mp_to_unsigned_bin.o bn_mp_to_unsigned_bin_n.o \
|
||||
bn_mp_toradix.o bn_mp_toradix_n.o bn_mp_unsigned_bin_size.o bn_mp_xor.o bn_mp_zero.o bn_prime_tab.o \
|
||||
bn_s_mp_add.o bn_s_mp_balance_mul.o bn_s_mp_exptmod.o bn_s_mp_exptmod_fast.o bn_s_mp_get_bit.o \
|
||||
bn_s_mp_invmod_fast.o bn_s_mp_invmod_slow.o bn_s_mp_karatsuba_mul.o bn_s_mp_karatsuba_sqr.o \
|
||||
bn_s_mp_montgomery_reduce_fast.o bn_s_mp_mul_digs.o bn_s_mp_mul_digs_fast.o bn_s_mp_mul_high_digs.o \
|
||||
bn_s_mp_mul_high_digs_fast.o bn_s_mp_rand_jenkins.o bn_s_mp_rand_platform.o bn_s_mp_reverse.o \
|
||||
bn_s_mp_sqr.o bn_s_mp_sqr_fast.o bn_s_mp_sub.o bn_s_mp_toom_mul.o bn_s_mp_toom_sqr.o
|
||||
bn_mp_signed_bin_size.o bn_mp_signed_rsh.o bn_mp_sqr.o bn_mp_sqrmod.o bn_mp_sqrt.o bn_mp_sqrtmod_prime.o \
|
||||
bn_mp_sub.o bn_mp_sub_d.o bn_mp_submod.o bn_mp_to_signed_bin.o bn_mp_to_signed_bin_n.o \
|
||||
bn_mp_to_unsigned_bin.o bn_mp_to_unsigned_bin_n.o bn_mp_toradix.o bn_mp_toradix_n.o \
|
||||
bn_mp_unsigned_bin_size.o bn_mp_xor.o bn_mp_zero.o bn_prime_tab.o bn_s_mp_add.o bn_s_mp_balance_mul.o \
|
||||
bn_s_mp_exptmod.o bn_s_mp_exptmod_fast.o bn_s_mp_get_bit.o bn_s_mp_invmod_fast.o bn_s_mp_invmod_slow.o \
|
||||
bn_s_mp_karatsuba_mul.o bn_s_mp_karatsuba_sqr.o bn_s_mp_montgomery_reduce_fast.o bn_s_mp_mul_digs.o \
|
||||
bn_s_mp_mul_digs_fast.o bn_s_mp_mul_high_digs.o bn_s_mp_mul_high_digs_fast.o bn_s_mp_rand_jenkins.o \
|
||||
bn_s_mp_rand_platform.o bn_s_mp_reverse.o bn_s_mp_sqr.o bn_s_mp_sqr_fast.o bn_s_mp_sub.o \
|
||||
bn_s_mp_toom_mul.o bn_s_mp_toom_sqr.o
|
||||
|
||||
#END_INS
|
||||
|
||||
|
@ -48,15 +48,15 @@ bn_mp_rand.o bn_mp_read_radix.o bn_mp_read_signed_bin.o bn_mp_read_unsigned_bin.
|
||||
bn_mp_reduce_2k.o bn_mp_reduce_2k_l.o bn_mp_reduce_2k_setup.o bn_mp_reduce_2k_setup_l.o \
|
||||
bn_mp_reduce_is_2k.o bn_mp_reduce_is_2k_l.o bn_mp_reduce_setup.o bn_mp_rshd.o bn_mp_set.o \
|
||||
bn_mp_set_double.o bn_mp_set_int.o bn_mp_set_long.o bn_mp_set_long_long.o bn_mp_shrink.o \
|
||||
bn_mp_signed_bin_size.o bn_mp_sqr.o bn_mp_sqrmod.o bn_mp_sqrt.o bn_mp_sqrtmod_prime.o bn_mp_sub.o \
|
||||
bn_mp_sub_d.o bn_mp_submod.o bn_mp_tc_and.o bn_mp_tc_div_2d.o bn_mp_tc_or.o bn_mp_tc_xor.o \
|
||||
bn_mp_to_signed_bin.o bn_mp_to_signed_bin_n.o bn_mp_to_unsigned_bin.o bn_mp_to_unsigned_bin_n.o \
|
||||
bn_mp_toradix.o bn_mp_toradix_n.o bn_mp_unsigned_bin_size.o bn_mp_xor.o bn_mp_zero.o bn_prime_tab.o \
|
||||
bn_s_mp_add.o bn_s_mp_balance_mul.o bn_s_mp_exptmod.o bn_s_mp_exptmod_fast.o bn_s_mp_get_bit.o \
|
||||
bn_s_mp_invmod_fast.o bn_s_mp_invmod_slow.o bn_s_mp_karatsuba_mul.o bn_s_mp_karatsuba_sqr.o \
|
||||
bn_s_mp_montgomery_reduce_fast.o bn_s_mp_mul_digs.o bn_s_mp_mul_digs_fast.o bn_s_mp_mul_high_digs.o \
|
||||
bn_s_mp_mul_high_digs_fast.o bn_s_mp_rand_jenkins.o bn_s_mp_rand_platform.o bn_s_mp_reverse.o \
|
||||
bn_s_mp_sqr.o bn_s_mp_sqr_fast.o bn_s_mp_sub.o bn_s_mp_toom_mul.o bn_s_mp_toom_sqr.o
|
||||
bn_mp_signed_bin_size.o bn_mp_signed_rsh.o bn_mp_sqr.o bn_mp_sqrmod.o bn_mp_sqrt.o bn_mp_sqrtmod_prime.o \
|
||||
bn_mp_sub.o bn_mp_sub_d.o bn_mp_submod.o bn_mp_to_signed_bin.o bn_mp_to_signed_bin_n.o \
|
||||
bn_mp_to_unsigned_bin.o bn_mp_to_unsigned_bin_n.o bn_mp_toradix.o bn_mp_toradix_n.o \
|
||||
bn_mp_unsigned_bin_size.o bn_mp_xor.o bn_mp_zero.o bn_prime_tab.o bn_s_mp_add.o bn_s_mp_balance_mul.o \
|
||||
bn_s_mp_exptmod.o bn_s_mp_exptmod_fast.o bn_s_mp_get_bit.o bn_s_mp_invmod_fast.o bn_s_mp_invmod_slow.o \
|
||||
bn_s_mp_karatsuba_mul.o bn_s_mp_karatsuba_sqr.o bn_s_mp_montgomery_reduce_fast.o bn_s_mp_mul_digs.o \
|
||||
bn_s_mp_mul_digs_fast.o bn_s_mp_mul_high_digs.o bn_s_mp_mul_high_digs_fast.o bn_s_mp_rand_jenkins.o \
|
||||
bn_s_mp_rand_platform.o bn_s_mp_reverse.o bn_s_mp_sqr.o bn_s_mp_sqr_fast.o bn_s_mp_sub.o \
|
||||
bn_s_mp_toom_mul.o bn_s_mp_toom_sqr.o
|
||||
|
||||
HEADERS_PUB=tommath.h
|
||||
HEADERS=tommath_private.h tommath_class.h tommath_superclass.h $(HEADERS_PUB)
|
||||
|
@ -40,15 +40,15 @@ bn_mp_rand.obj bn_mp_read_radix.obj bn_mp_read_signed_bin.obj bn_mp_read_unsigne
|
||||
bn_mp_reduce_2k.obj bn_mp_reduce_2k_l.obj bn_mp_reduce_2k_setup.obj bn_mp_reduce_2k_setup_l.obj \
|
||||
bn_mp_reduce_is_2k.obj bn_mp_reduce_is_2k_l.obj bn_mp_reduce_setup.obj bn_mp_rshd.obj bn_mp_set.obj \
|
||||
bn_mp_set_double.obj bn_mp_set_int.obj bn_mp_set_long.obj bn_mp_set_long_long.obj bn_mp_shrink.obj \
|
||||
bn_mp_signed_bin_size.obj bn_mp_sqr.obj bn_mp_sqrmod.obj bn_mp_sqrt.obj bn_mp_sqrtmod_prime.obj bn_mp_sub.obj \
|
||||
bn_mp_sub_d.obj bn_mp_submod.obj bn_mp_tc_and.obj bn_mp_tc_div_2d.obj bn_mp_tc_or.obj bn_mp_tc_xor.obj \
|
||||
bn_mp_to_signed_bin.obj bn_mp_to_signed_bin_n.obj bn_mp_to_unsigned_bin.obj bn_mp_to_unsigned_bin_n.obj \
|
||||
bn_mp_toradix.obj bn_mp_toradix_n.obj bn_mp_unsigned_bin_size.obj bn_mp_xor.obj bn_mp_zero.obj bn_prime_tab.obj \
|
||||
bn_s_mp_add.obj bn_s_mp_balance_mul.obj bn_s_mp_exptmod.obj bn_s_mp_exptmod_fast.obj bn_s_mp_get_bit.obj \
|
||||
bn_s_mp_invmod_fast.obj bn_s_mp_invmod_slow.obj bn_s_mp_karatsuba_mul.obj bn_s_mp_karatsuba_sqr.obj \
|
||||
bn_s_mp_montgomery_reduce_fast.obj bn_s_mp_mul_digs.obj bn_s_mp_mul_digs_fast.obj bn_s_mp_mul_high_digs.obj \
|
||||
bn_s_mp_mul_high_digs_fast.obj bn_s_mp_rand_jenkins.obj bn_s_mp_rand_platform.obj bn_s_mp_reverse.obj \
|
||||
bn_s_mp_sqr.obj bn_s_mp_sqr_fast.obj bn_s_mp_sub.obj bn_s_mp_toom_mul.obj bn_s_mp_toom_sqr.obj
|
||||
bn_mp_signed_bin_size.obj bn_mp_signed_rsh.obj bn_mp_sqr.obj bn_mp_sqrmod.obj bn_mp_sqrt.obj bn_mp_sqrtmod_prime.obj \
|
||||
bn_mp_sub.obj bn_mp_sub_d.obj bn_mp_submod.obj bn_mp_to_signed_bin.obj bn_mp_to_signed_bin_n.obj \
|
||||
bn_mp_to_unsigned_bin.obj bn_mp_to_unsigned_bin_n.obj bn_mp_toradix.obj bn_mp_toradix_n.obj \
|
||||
bn_mp_unsigned_bin_size.obj bn_mp_xor.obj bn_mp_zero.obj bn_prime_tab.obj bn_s_mp_add.obj bn_s_mp_balance_mul.obj \
|
||||
bn_s_mp_exptmod.obj bn_s_mp_exptmod_fast.obj bn_s_mp_get_bit.obj bn_s_mp_invmod_fast.obj bn_s_mp_invmod_slow.obj \
|
||||
bn_s_mp_karatsuba_mul.obj bn_s_mp_karatsuba_sqr.obj bn_s_mp_montgomery_reduce_fast.obj bn_s_mp_mul_digs.obj \
|
||||
bn_s_mp_mul_digs_fast.obj bn_s_mp_mul_high_digs.obj bn_s_mp_mul_high_digs_fast.obj bn_s_mp_rand_jenkins.obj \
|
||||
bn_s_mp_rand_platform.obj bn_s_mp_reverse.obj bn_s_mp_sqr.obj bn_s_mp_sqr_fast.obj bn_s_mp_sub.obj \
|
||||
bn_s_mp_toom_mul.obj bn_s_mp_toom_sqr.obj
|
||||
|
||||
HEADERS_PUB=tommath.h
|
||||
HEADERS=tommath_private.h tommath_class.h tommath_superclass.h $(HEADERS_PUB)
|
||||
|
@ -42,15 +42,15 @@ bn_mp_rand.o bn_mp_read_radix.o bn_mp_read_signed_bin.o bn_mp_read_unsigned_bin.
|
||||
bn_mp_reduce_2k.o bn_mp_reduce_2k_l.o bn_mp_reduce_2k_setup.o bn_mp_reduce_2k_setup_l.o \
|
||||
bn_mp_reduce_is_2k.o bn_mp_reduce_is_2k_l.o bn_mp_reduce_setup.o bn_mp_rshd.o bn_mp_set.o \
|
||||
bn_mp_set_double.o bn_mp_set_int.o bn_mp_set_long.o bn_mp_set_long_long.o bn_mp_shrink.o \
|
||||
bn_mp_signed_bin_size.o bn_mp_sqr.o bn_mp_sqrmod.o bn_mp_sqrt.o bn_mp_sqrtmod_prime.o bn_mp_sub.o \
|
||||
bn_mp_sub_d.o bn_mp_submod.o bn_mp_tc_and.o bn_mp_tc_div_2d.o bn_mp_tc_or.o bn_mp_tc_xor.o \
|
||||
bn_mp_to_signed_bin.o bn_mp_to_signed_bin_n.o bn_mp_to_unsigned_bin.o bn_mp_to_unsigned_bin_n.o \
|
||||
bn_mp_toradix.o bn_mp_toradix_n.o bn_mp_unsigned_bin_size.o bn_mp_xor.o bn_mp_zero.o bn_prime_tab.o \
|
||||
bn_s_mp_add.o bn_s_mp_balance_mul.o bn_s_mp_exptmod.o bn_s_mp_exptmod_fast.o bn_s_mp_get_bit.o \
|
||||
bn_s_mp_invmod_fast.o bn_s_mp_invmod_slow.o bn_s_mp_karatsuba_mul.o bn_s_mp_karatsuba_sqr.o \
|
||||
bn_s_mp_montgomery_reduce_fast.o bn_s_mp_mul_digs.o bn_s_mp_mul_digs_fast.o bn_s_mp_mul_high_digs.o \
|
||||
bn_s_mp_mul_high_digs_fast.o bn_s_mp_rand_jenkins.o bn_s_mp_rand_platform.o bn_s_mp_reverse.o \
|
||||
bn_s_mp_sqr.o bn_s_mp_sqr_fast.o bn_s_mp_sub.o bn_s_mp_toom_mul.o bn_s_mp_toom_sqr.o
|
||||
bn_mp_signed_bin_size.o bn_mp_signed_rsh.o bn_mp_sqr.o bn_mp_sqrmod.o bn_mp_sqrt.o bn_mp_sqrtmod_prime.o \
|
||||
bn_mp_sub.o bn_mp_sub_d.o bn_mp_submod.o bn_mp_to_signed_bin.o bn_mp_to_signed_bin_n.o \
|
||||
bn_mp_to_unsigned_bin.o bn_mp_to_unsigned_bin_n.o bn_mp_toradix.o bn_mp_toradix_n.o \
|
||||
bn_mp_unsigned_bin_size.o bn_mp_xor.o bn_mp_zero.o bn_prime_tab.o bn_s_mp_add.o bn_s_mp_balance_mul.o \
|
||||
bn_s_mp_exptmod.o bn_s_mp_exptmod_fast.o bn_s_mp_get_bit.o bn_s_mp_invmod_fast.o bn_s_mp_invmod_slow.o \
|
||||
bn_s_mp_karatsuba_mul.o bn_s_mp_karatsuba_sqr.o bn_s_mp_montgomery_reduce_fast.o bn_s_mp_mul_digs.o \
|
||||
bn_s_mp_mul_digs_fast.o bn_s_mp_mul_high_digs.o bn_s_mp_mul_high_digs_fast.o bn_s_mp_rand_jenkins.o \
|
||||
bn_s_mp_rand_platform.o bn_s_mp_reverse.o bn_s_mp_sqr.o bn_s_mp_sqr_fast.o bn_s_mp_sub.o \
|
||||
bn_s_mp_toom_mul.o bn_s_mp_toom_sqr.o
|
||||
|
||||
#END_INS
|
||||
|
||||
|
@ -49,15 +49,15 @@ bn_mp_rand.o bn_mp_read_radix.o bn_mp_read_signed_bin.o bn_mp_read_unsigned_bin.
|
||||
bn_mp_reduce_2k.o bn_mp_reduce_2k_l.o bn_mp_reduce_2k_setup.o bn_mp_reduce_2k_setup_l.o \
|
||||
bn_mp_reduce_is_2k.o bn_mp_reduce_is_2k_l.o bn_mp_reduce_setup.o bn_mp_rshd.o bn_mp_set.o \
|
||||
bn_mp_set_double.o bn_mp_set_int.o bn_mp_set_long.o bn_mp_set_long_long.o bn_mp_shrink.o \
|
||||
bn_mp_signed_bin_size.o bn_mp_sqr.o bn_mp_sqrmod.o bn_mp_sqrt.o bn_mp_sqrtmod_prime.o bn_mp_sub.o \
|
||||
bn_mp_sub_d.o bn_mp_submod.o bn_mp_tc_and.o bn_mp_tc_div_2d.o bn_mp_tc_or.o bn_mp_tc_xor.o \
|
||||
bn_mp_to_signed_bin.o bn_mp_to_signed_bin_n.o bn_mp_to_unsigned_bin.o bn_mp_to_unsigned_bin_n.o \
|
||||
bn_mp_toradix.o bn_mp_toradix_n.o bn_mp_unsigned_bin_size.o bn_mp_xor.o bn_mp_zero.o bn_prime_tab.o \
|
||||
bn_s_mp_add.o bn_s_mp_balance_mul.o bn_s_mp_exptmod.o bn_s_mp_exptmod_fast.o bn_s_mp_get_bit.o \
|
||||
bn_s_mp_invmod_fast.o bn_s_mp_invmod_slow.o bn_s_mp_karatsuba_mul.o bn_s_mp_karatsuba_sqr.o \
|
||||
bn_s_mp_montgomery_reduce_fast.o bn_s_mp_mul_digs.o bn_s_mp_mul_digs_fast.o bn_s_mp_mul_high_digs.o \
|
||||
bn_s_mp_mul_high_digs_fast.o bn_s_mp_rand_jenkins.o bn_s_mp_rand_platform.o bn_s_mp_reverse.o \
|
||||
bn_s_mp_sqr.o bn_s_mp_sqr_fast.o bn_s_mp_sub.o bn_s_mp_toom_mul.o bn_s_mp_toom_sqr.o
|
||||
bn_mp_signed_bin_size.o bn_mp_signed_rsh.o bn_mp_sqr.o bn_mp_sqrmod.o bn_mp_sqrt.o bn_mp_sqrtmod_prime.o \
|
||||
bn_mp_sub.o bn_mp_sub_d.o bn_mp_submod.o bn_mp_to_signed_bin.o bn_mp_to_signed_bin_n.o \
|
||||
bn_mp_to_unsigned_bin.o bn_mp_to_unsigned_bin_n.o bn_mp_toradix.o bn_mp_toradix_n.o \
|
||||
bn_mp_unsigned_bin_size.o bn_mp_xor.o bn_mp_zero.o bn_prime_tab.o bn_s_mp_add.o bn_s_mp_balance_mul.o \
|
||||
bn_s_mp_exptmod.o bn_s_mp_exptmod_fast.o bn_s_mp_get_bit.o bn_s_mp_invmod_fast.o bn_s_mp_invmod_slow.o \
|
||||
bn_s_mp_karatsuba_mul.o bn_s_mp_karatsuba_sqr.o bn_s_mp_montgomery_reduce_fast.o bn_s_mp_mul_digs.o \
|
||||
bn_s_mp_mul_digs_fast.o bn_s_mp_mul_high_digs.o bn_s_mp_mul_high_digs_fast.o bn_s_mp_rand_jenkins.o \
|
||||
bn_s_mp_rand_platform.o bn_s_mp_reverse.o bn_s_mp_sqr.o bn_s_mp_sqr_fast.o bn_s_mp_sub.o \
|
||||
bn_s_mp_toom_mul.o bn_s_mp_toom_sqr.o
|
||||
|
||||
HEADERS_PUB=tommath.h
|
||||
HEADERS=tommath_private.h tommath_class.h tommath_superclass.h $(HEADERS_PUB)
|
||||
|
28
tommath.h
28
tommath.h
@ -367,14 +367,6 @@ extern void (*ltm_rng_callback)(void);
|
||||
#endif
|
||||
|
||||
/* ---> binary operations <--- */
|
||||
/* c = a XOR b */
|
||||
mp_err mp_xor(const mp_int *a, const mp_int *b, mp_int *c) MP_WUR;
|
||||
|
||||
/* c = a OR b */
|
||||
mp_err mp_or(const mp_int *a, const mp_int *b, mp_int *c) MP_WUR;
|
||||
|
||||
/* c = a AND b */
|
||||
mp_err mp_and(const mp_int *a, const mp_int *b, mp_int *c) MP_WUR;
|
||||
|
||||
/* Checks the bit at position b and returns MP_YES
|
||||
* if the bit is 1, MP_NO if it is 0 and MP_VAL
|
||||
@ -383,22 +375,26 @@ mp_err mp_and(const mp_int *a, const mp_int *b, mp_int *c) MP_WUR;
|
||||
MP_DEPRECATED(s_mp_get_bit) int mp_get_bit(const mp_int *a, int b) MP_WUR;
|
||||
|
||||
/* c = a XOR b (two complement) */
|
||||
mp_err mp_tc_xor(const mp_int *a, const mp_int *b, mp_int *c) MP_WUR;
|
||||
MP_DEPRECATED(mp_xor) mp_err mp_tc_xor(const mp_int *a, const mp_int *b, mp_int *c) MP_WUR;
|
||||
mp_err mp_xor(const mp_int *a, const mp_int *b, mp_int *c) MP_WUR;
|
||||
|
||||
/* c = a OR b (two complement) */
|
||||
mp_err mp_tc_or(const mp_int *a, const mp_int *b, mp_int *c) MP_WUR;
|
||||
MP_DEPRECATED(mp_or) mp_err mp_tc_or(const mp_int *a, const mp_int *b, mp_int *c) MP_WUR;
|
||||
mp_err mp_or(const mp_int *a, const mp_int *b, mp_int *c) MP_WUR;
|
||||
|
||||
/* c = a AND b (two complement) */
|
||||
mp_err mp_tc_and(const mp_int *a, const mp_int *b, mp_int *c) MP_WUR;
|
||||
MP_DEPRECATED(mp_and) mp_err mp_tc_and(const mp_int *a, const mp_int *b, mp_int *c) MP_WUR;
|
||||
mp_err mp_and(const mp_int *a, const mp_int *b, mp_int *c) MP_WUR;
|
||||
|
||||
/* right shift (two complement) */
|
||||
mp_err mp_tc_div_2d(const mp_int *a, int b, mp_int *c) MP_WUR;
|
||||
/* b = ~a (bitwise not, two complement) */
|
||||
mp_err mp_complement(const mp_int *a, mp_int *b) MP_WUR;
|
||||
|
||||
/* right shift with sign extension */
|
||||
MP_DEPRECATED(mp_signed_rsh) mp_err mp_tc_div_2d(const mp_int *a, int b, mp_int *c) MP_WUR;
|
||||
mp_err mp_signed_rsh(const mp_int *a, int b, mp_int *c) MP_WUR;
|
||||
|
||||
/* ---> Basic arithmetic <--- */
|
||||
|
||||
/* b = ~a */
|
||||
mp_err mp_complement(const mp_int *a, mp_int *b) MP_WUR;
|
||||
|
||||
/* b = -a */
|
||||
mp_err mp_neg(const mp_int *a, mp_int *b) MP_WUR;
|
||||
|
||||
|
@ -114,6 +114,7 @@
|
||||
# define BN_MP_SET_LONG_LONG_C
|
||||
# define BN_MP_SHRINK_C
|
||||
# define BN_MP_SIGNED_BIN_SIZE_C
|
||||
# define BN_MP_SIGNED_RSH_C
|
||||
# define BN_MP_SQR_C
|
||||
# define BN_MP_SQRMOD_C
|
||||
# define BN_MP_SQRT_C
|
||||
@ -121,10 +122,6 @@
|
||||
# define BN_MP_SUB_C
|
||||
# define BN_MP_SUB_D_C
|
||||
# define BN_MP_SUBMOD_C
|
||||
# define BN_MP_TC_AND_C
|
||||
# define BN_MP_TC_DIV_2D_C
|
||||
# define BN_MP_TC_OR_C
|
||||
# define BN_MP_TC_XOR_C
|
||||
# define BN_MP_TO_SIGNED_BIN_C
|
||||
# define BN_MP_TO_SIGNED_BIN_N_C
|
||||
# define BN_MP_TO_UNSIGNED_BIN_C
|
||||
@ -197,6 +194,14 @@
|
||||
# define BN_MP_TOOM_SQR_C
|
||||
# define BN_S_MP_TOOM_SQR_C
|
||||
# define BN_S_MP_REVERSE_C
|
||||
# define BN_MP_TC_AND_C
|
||||
# define BN_MP_AND_C
|
||||
# define BN_MP_TC_OR_C
|
||||
# define BN_MP_OR_C
|
||||
# define BN_MP_TC_XOR_C
|
||||
# define BN_MP_XOR_C
|
||||
# define BN_MP_TC_DIV_2D_C
|
||||
# define BN_MP_SIGNED_RSH_C
|
||||
#endif
|
||||
|
||||
#if defined(BN_MP_2EXPT_C)
|
||||
@ -228,10 +233,8 @@
|
||||
#endif
|
||||
|
||||
#if defined(BN_MP_AND_C)
|
||||
# define BN_MP_INIT_COPY_C
|
||||
# define BN_MP_GROW_C
|
||||
# define BN_MP_CLAMP_C
|
||||
# define BN_MP_EXCH_C
|
||||
# define BN_MP_CLEAR_C
|
||||
#endif
|
||||
|
||||
#if defined(BN_MP_CLAMP_C)
|
||||
@ -632,10 +635,8 @@
|
||||
#endif
|
||||
|
||||
#if defined(BN_MP_OR_C)
|
||||
# define BN_MP_INIT_COPY_C
|
||||
# define BN_MP_GROW_C
|
||||
# define BN_MP_CLAMP_C
|
||||
# define BN_MP_EXCH_C
|
||||
# define BN_MP_CLEAR_C
|
||||
#endif
|
||||
|
||||
#if defined(BN_MP_PRIME_FERMAT_C)
|
||||
@ -887,6 +888,12 @@
|
||||
# define BN_MP_UNSIGNED_BIN_SIZE_C
|
||||
#endif
|
||||
|
||||
#if defined(BN_MP_SIGNED_RSH_C)
|
||||
# define BN_MP_DIV_2D_C
|
||||
# define BN_MP_ADD_D_C
|
||||
# define BN_MP_SUB_D_C
|
||||
#endif
|
||||
|
||||
#if defined(BN_MP_SQR_C)
|
||||
# define BN_S_MP_TOOM_SQR_C
|
||||
# define BN_S_MP_KARATSUBA_SQR_C
|
||||
@ -950,45 +957,6 @@
|
||||
# define BN_MP_MOD_C
|
||||
#endif
|
||||
|
||||
#if defined(BN_MP_TC_AND_C)
|
||||
# define BN_MP_COUNT_BITS_C
|
||||
# define BN_MP_INIT_SET_INT_C
|
||||
# define BN_MP_MUL_2D_C
|
||||
# define BN_MP_INIT_C
|
||||
# define BN_MP_ADD_C
|
||||
# define BN_MP_CLEAR_C
|
||||
# define BN_MP_AND_C
|
||||
# define BN_MP_SUB_C
|
||||
#endif
|
||||
|
||||
#if defined(BN_MP_TC_DIV_2D_C)
|
||||
# define BN_MP_DIV_2D_C
|
||||
# define BN_MP_ADD_D_C
|
||||
# define BN_MP_SUB_D_C
|
||||
#endif
|
||||
|
||||
#if defined(BN_MP_TC_OR_C)
|
||||
# define BN_MP_COUNT_BITS_C
|
||||
# define BN_MP_INIT_SET_INT_C
|
||||
# define BN_MP_MUL_2D_C
|
||||
# define BN_MP_INIT_C
|
||||
# define BN_MP_ADD_C
|
||||
# define BN_MP_CLEAR_C
|
||||
# define BN_MP_OR_C
|
||||
# define BN_MP_SUB_C
|
||||
#endif
|
||||
|
||||
#if defined(BN_MP_TC_XOR_C)
|
||||
# define BN_MP_COUNT_BITS_C
|
||||
# define BN_MP_INIT_SET_INT_C
|
||||
# define BN_MP_MUL_2D_C
|
||||
# define BN_MP_INIT_C
|
||||
# define BN_MP_ADD_C
|
||||
# define BN_MP_CLEAR_C
|
||||
# define BN_MP_XOR_C
|
||||
# define BN_MP_SUB_C
|
||||
#endif
|
||||
|
||||
#if defined(BN_MP_TO_SIGNED_BIN_C)
|
||||
# define BN_MP_TO_UNSIGNED_BIN_C
|
||||
#endif
|
||||
@ -1029,10 +997,8 @@
|
||||
#endif
|
||||
|
||||
#if defined(BN_MP_XOR_C)
|
||||
# define BN_MP_INIT_COPY_C
|
||||
# define BN_MP_GROW_C
|
||||
# define BN_MP_CLAMP_C
|
||||
# define BN_MP_EXCH_C
|
||||
# define BN_MP_CLEAR_C
|
||||
#endif
|
||||
|
||||
#if defined(BN_MP_ZERO_C)
|
||||
|
Loading…
Reference in New Issue
Block a user