Added unversioned files
This commit is contained in:
parent
de842d4b07
commit
fd2a8aef4e
|
@ -0,0 +1,25 @@
|
||||||
|
#include "tommath_private.h"
|
||||||
|
#ifdef BN_MP_COMPLEMENT_C
|
||||||
|
/* LibTomMath, multiple-precision integer library -- Tom St Denis
|
||||||
|
*
|
||||||
|
* LibTomMath is a library that provides multiple-precision
|
||||||
|
* integer arithmetic as well as number theoretic functionality.
|
||||||
|
*
|
||||||
|
* The library was designed directly after the MPI library by
|
||||||
|
* Michael Fromberger but has been written from scratch with
|
||||||
|
* additional optimizations in place.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Unlicense
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* b = ~a */
|
||||||
|
int mp_complement(const mp_int *a, mp_int *b)
|
||||||
|
{
|
||||||
|
int res = mp_neg(a, b);
|
||||||
|
return (res == MP_OKAY) ? mp_sub_d(b, 1uL, b) : res;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* ref: $Format:%D$ */
|
||||||
|
/* git commit: $Format:%H$ */
|
||||||
|
/* commit time: $Format:%ai$ */
|
|
@ -0,0 +1,54 @@
|
||||||
|
#include "tommath_private.h"
|
||||||
|
#ifdef BN_MP_GET_BIT_C
|
||||||
|
|
||||||
|
/* LibTomMath, multiple-precision integer library -- Tom St Denis
|
||||||
|
*
|
||||||
|
* LibTomMath is a library that provides multiple-precision
|
||||||
|
* integer arithmetic as well as number theoretic functionality.
|
||||||
|
*
|
||||||
|
* The library was designed directly after the MPI library by
|
||||||
|
* Michael Fromberger but has been written from scratch with
|
||||||
|
* additional optimizations in place.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Unlicense
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Checks the bit at position b and returns MP_YES
|
||||||
|
if the bit is 1, MP_NO if it is 0 and MP_VAL
|
||||||
|
in case of error */
|
||||||
|
int mp_get_bit(const mp_int *a, int b)
|
||||||
|
{
|
||||||
|
int limb;
|
||||||
|
mp_digit bit, isset;
|
||||||
|
|
||||||
|
if (b < 0) {
|
||||||
|
return MP_VAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
limb = b / DIGIT_BIT;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Zero is a special value with the member "used" set to zero.
|
||||||
|
* Needs to be tested before the check for the upper boundary
|
||||||
|
* otherwise (limb >= a->used) would be true for a = 0
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (mp_iszero(a) != MP_NO) {
|
||||||
|
return MP_NO;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (limb >= a->used) {
|
||||||
|
return MP_VAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
bit = (mp_digit)(1) << (b % DIGIT_BIT);
|
||||||
|
|
||||||
|
isset = a->dp[limb] & bit;
|
||||||
|
return (isset != 0u) ? MP_YES : MP_NO;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* ref: $Format:%D$ */
|
||||||
|
/* git commit: $Format:%H$ */
|
||||||
|
/* commit time: $Format:%ai$ */
|
|
@ -0,0 +1,31 @@
|
||||||
|
#include "tommath_private.h"
|
||||||
|
#ifdef BN_MP_GET_DOUBLE_C
|
||||||
|
/* LibTomMath, multiple-precision integer library -- Tom St Denis
|
||||||
|
*
|
||||||
|
* LibTomMath is a library that provides multiple-precision
|
||||||
|
* integer arithmetic as well as number theoretic functionality.
|
||||||
|
*
|
||||||
|
* The library was designed directly after the MPI library by
|
||||||
|
* Michael Fromberger but has been written from scratch with
|
||||||
|
* additional optimizations in place.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Unlicense
|
||||||
|
*/
|
||||||
|
|
||||||
|
double mp_get_double(const mp_int *a)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
double d = 0.0, fac = 1.0;
|
||||||
|
for (i = 0; i < DIGIT_BIT; ++i) {
|
||||||
|
fac *= 2.0;
|
||||||
|
}
|
||||||
|
for (i = USED(a); i --> 0;) {
|
||||||
|
d = (d * fac) + (double)DIGIT(a, i);
|
||||||
|
}
|
||||||
|
return (mp_isneg(a) != MP_NO) ? -d : d;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* ref: $Format:%D$ */
|
||||||
|
/* git commit: $Format:%H$ */
|
||||||
|
/* commit time: $Format:%ai$ */
|
|
@ -0,0 +1,144 @@
|
||||||
|
#include "tommath_private.h"
|
||||||
|
#ifdef BN_MP_KRONECKER_C
|
||||||
|
|
||||||
|
/* LibTomMath, multiple-precision integer library -- Tom St Denis
|
||||||
|
*
|
||||||
|
* LibTomMath is a library that provides multiple-precision
|
||||||
|
* integer arithmetic as well as number theoretic functionality.
|
||||||
|
*
|
||||||
|
* The library was designed directly after the MPI library by
|
||||||
|
* Michael Fromberger but has been written from scratch with
|
||||||
|
* additional optimizations in place.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Unlicense
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Kronecker symbol (a|p)
|
||||||
|
Straightforward implementation of algorithm 1.4.10 in
|
||||||
|
Henri Cohen: "A Course in Computational Algebraic Number Theory"
|
||||||
|
|
||||||
|
@book{cohen2013course,
|
||||||
|
title={A course in computational algebraic number theory},
|
||||||
|
author={Cohen, Henri},
|
||||||
|
volume={138},
|
||||||
|
year={2013},
|
||||||
|
publisher={Springer Science \& Business Media}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
int mp_kronecker(const mp_int *a, const mp_int *p, int *c)
|
||||||
|
{
|
||||||
|
mp_int a1, p1, r;
|
||||||
|
|
||||||
|
int e = MP_OKAY;
|
||||||
|
int v, k;
|
||||||
|
|
||||||
|
static const int table[8] = {0, 1, 0, -1, 0, -1, 0, 1};
|
||||||
|
|
||||||
|
if (mp_iszero(p) != MP_NO) {
|
||||||
|
if ((a->used == 1) && (a->dp[0] == 1u)) {
|
||||||
|
*c = 1;
|
||||||
|
return e;
|
||||||
|
} else {
|
||||||
|
*c = 0;
|
||||||
|
return e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((mp_iseven(a) != MP_NO) && (mp_iseven(p) != MP_NO)) {
|
||||||
|
*c = 0;
|
||||||
|
return e;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((e = mp_init_copy(&a1, a)) != MP_OKAY) {
|
||||||
|
return e;
|
||||||
|
}
|
||||||
|
if ((e = mp_init_copy(&p1, p)) != MP_OKAY) {
|
||||||
|
goto LBL_KRON_0;
|
||||||
|
}
|
||||||
|
|
||||||
|
v = mp_cnt_lsb(&p1);
|
||||||
|
if ((e = mp_div_2d(&p1, v, &p1, NULL)) != MP_OKAY) {
|
||||||
|
goto LBL_KRON_1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((v & 0x1) == 0) {
|
||||||
|
k = 1;
|
||||||
|
} else {
|
||||||
|
k = table[a->dp[0] & 7u];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (p1.sign == MP_NEG) {
|
||||||
|
p1.sign = MP_ZPOS;
|
||||||
|
if (a1.sign == MP_NEG) {
|
||||||
|
k = -k;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((e = mp_init(&r)) != MP_OKAY) {
|
||||||
|
goto LBL_KRON_1;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
if (mp_iszero(&a1) != MP_NO) {
|
||||||
|
if (mp_cmp_d(&p1, 1uL) == MP_EQ) {
|
||||||
|
*c = k;
|
||||||
|
goto LBL_KRON;
|
||||||
|
} else {
|
||||||
|
*c = 0;
|
||||||
|
goto LBL_KRON;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
v = mp_cnt_lsb(&a1);
|
||||||
|
if ((e = mp_div_2d(&a1, v, &a1, NULL)) != MP_OKAY) {
|
||||||
|
goto LBL_KRON;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((v & 0x1) == 1) {
|
||||||
|
k = k * table[p1.dp[0] & 7u];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (a1.sign == MP_NEG) {
|
||||||
|
/*
|
||||||
|
* Compute k = (-1)^((a1)*(p1-1)/4) * k
|
||||||
|
* a1.dp[0] + 1 cannot overflow because the MSB
|
||||||
|
* of the type mp_digit is not set by definition
|
||||||
|
*/
|
||||||
|
if (((a1.dp[0] + 1u) & p1.dp[0] & 2u) != 0u) {
|
||||||
|
k = -k;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
/* compute k = (-1)^((a1-1)*(p1-1)/4) * k */
|
||||||
|
if ((a1.dp[0] & p1.dp[0] & 2u) != 0u) {
|
||||||
|
k = -k;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((e = mp_copy(&a1, &r)) != MP_OKAY) {
|
||||||
|
goto LBL_KRON;
|
||||||
|
}
|
||||||
|
r.sign = MP_ZPOS;
|
||||||
|
if ((e = mp_mod(&p1, &r, &a1)) != MP_OKAY) {
|
||||||
|
goto LBL_KRON;
|
||||||
|
}
|
||||||
|
if ((e = mp_copy(&r, &p1)) != MP_OKAY) {
|
||||||
|
goto LBL_KRON;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
LBL_KRON:
|
||||||
|
mp_clear(&r);
|
||||||
|
LBL_KRON_1:
|
||||||
|
mp_clear(&p1);
|
||||||
|
LBL_KRON_0:
|
||||||
|
mp_clear(&a1);
|
||||||
|
|
||||||
|
return e;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* ref: $Format:%D$ */
|
||||||
|
/* git commit: $Format:%H$ */
|
||||||
|
/* commit time: $Format:%ai$ */
|
|
@ -0,0 +1,198 @@
|
||||||
|
#include "tommath_private.h"
|
||||||
|
#ifdef BN_MP_PRIME_FROBENIUS_UNDERWOOD_C
|
||||||
|
|
||||||
|
/* LibTomMath, multiple-precision integer library -- Tom St Denis
|
||||||
|
*
|
||||||
|
* LibTomMath is a library that provides multiple-precision
|
||||||
|
* integer arithmetic as well as number theoretic functionality.
|
||||||
|
*
|
||||||
|
* The library was designed directly after the MPI library by
|
||||||
|
* Michael Fromberger but has been written from scratch with
|
||||||
|
* additional optimizations in place.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Unlicense
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* See file bn_mp_prime_is_prime.c or the documentation in doc/bn.tex for the details
|
||||||
|
*/
|
||||||
|
#ifndef LTM_USE_FIPS_ONLY
|
||||||
|
|
||||||
|
#ifdef MP_8BIT
|
||||||
|
/*
|
||||||
|
* floor of positive solution of
|
||||||
|
* (2^16)-1 = (a+4)*(2*a+5)
|
||||||
|
* TODO: Both values are smaller than N^(1/4), would have to use a bigint
|
||||||
|
* for a instead but any a biger than about 120 are already so rare that
|
||||||
|
* it is possible to ignore them and still get enough pseudoprimes.
|
||||||
|
* But it is still a restriction of the set of available pseudoprimes
|
||||||
|
* which makes this implementation less secure if used stand-alone.
|
||||||
|
*/
|
||||||
|
#define LTM_FROBENIUS_UNDERWOOD_A 177
|
||||||
|
#else
|
||||||
|
#define LTM_FROBENIUS_UNDERWOOD_A 32764
|
||||||
|
#endif
|
||||||
|
int mp_prime_frobenius_underwood(const mp_int *N, int *result)
|
||||||
|
{
|
||||||
|
mp_int T1z, T2z, Np1z, sz, tz;
|
||||||
|
|
||||||
|
int a, ap2, length, i, j, isset;
|
||||||
|
int e;
|
||||||
|
|
||||||
|
*result = MP_NO;
|
||||||
|
|
||||||
|
if ((e = mp_init_multi(&T1z, &T2z, &Np1z, &sz, &tz, NULL)) != MP_OKAY) {
|
||||||
|
return e;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (a = 0; a < LTM_FROBENIUS_UNDERWOOD_A; a++) {
|
||||||
|
/* TODO: That's ugly! No, really, it is! */
|
||||||
|
if ((a==2) || (a==4) || (a==7) || (a==8) || (a==10) ||
|
||||||
|
(a==14) || (a==18) || (a==23) || (a==26) || (a==28)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
/* (32764^2 - 4) < 2^31, no bigint for >MP_8BIT needed) */
|
||||||
|
if ((e = mp_set_long(&T1z, (unsigned long)a)) != MP_OKAY) {
|
||||||
|
goto LBL_FU_ERR;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((e = mp_sqr(&T1z, &T1z)) != MP_OKAY) {
|
||||||
|
goto LBL_FU_ERR;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((e = mp_sub_d(&T1z, 4uL, &T1z)) != MP_OKAY) {
|
||||||
|
goto LBL_FU_ERR;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((e = mp_kronecker(&T1z, N, &j)) != MP_OKAY) {
|
||||||
|
goto LBL_FU_ERR;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (j == -1) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (j == 0) {
|
||||||
|
/* composite */
|
||||||
|
goto LBL_FU_ERR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* Tell it a composite and set return value accordingly */
|
||||||
|
if (a >= LTM_FROBENIUS_UNDERWOOD_A) {
|
||||||
|
e = MP_ITER;
|
||||||
|
goto LBL_FU_ERR;
|
||||||
|
}
|
||||||
|
/* Composite if N and (a+4)*(2*a+5) are not coprime */
|
||||||
|
if ((e = mp_set_long(&T1z, (unsigned long)((a+4)*((2*a)+5)))) != MP_OKAY) {
|
||||||
|
goto LBL_FU_ERR;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((e = mp_gcd(N, &T1z, &T1z)) != MP_OKAY) {
|
||||||
|
goto LBL_FU_ERR;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!((T1z.used == 1) && (T1z.dp[0] == 1u))) {
|
||||||
|
goto LBL_FU_ERR;
|
||||||
|
}
|
||||||
|
|
||||||
|
ap2 = a + 2;
|
||||||
|
if ((e = mp_add_d(N, 1uL, &Np1z)) != MP_OKAY) {
|
||||||
|
goto LBL_FU_ERR;
|
||||||
|
}
|
||||||
|
|
||||||
|
mp_set(&sz, 1uL);
|
||||||
|
mp_set(&tz, 2uL);
|
||||||
|
length = mp_count_bits(&Np1z);
|
||||||
|
|
||||||
|
for (i = length - 2; i >= 0; i--) {
|
||||||
|
/*
|
||||||
|
* temp = (sz*(a*sz+2*tz))%N;
|
||||||
|
* tz = ((tz-sz)*(tz+sz))%N;
|
||||||
|
* sz = temp;
|
||||||
|
*/
|
||||||
|
if ((e = mp_mul_2(&tz, &T2z)) != MP_OKAY) {
|
||||||
|
goto LBL_FU_ERR;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* a = 0 at about 50% of the cases (non-square and odd input) */
|
||||||
|
if (a != 0) {
|
||||||
|
if ((e = mp_mul_d(&sz, (mp_digit)a, &T1z)) != MP_OKAY) {
|
||||||
|
goto LBL_FU_ERR;
|
||||||
|
}
|
||||||
|
if ((e = mp_add(&T1z, &T2z, &T2z)) != MP_OKAY) {
|
||||||
|
goto LBL_FU_ERR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((e = mp_mul(&T2z, &sz, &T1z)) != MP_OKAY) {
|
||||||
|
goto LBL_FU_ERR;
|
||||||
|
}
|
||||||
|
if ((e = mp_sub(&tz, &sz, &T2z)) != MP_OKAY) {
|
||||||
|
goto LBL_FU_ERR;
|
||||||
|
}
|
||||||
|
if ((e = mp_add(&sz, &tz, &sz)) != MP_OKAY) {
|
||||||
|
goto LBL_FU_ERR;
|
||||||
|
}
|
||||||
|
if ((e = mp_mul(&sz, &T2z, &tz)) != MP_OKAY) {
|
||||||
|
goto LBL_FU_ERR;
|
||||||
|
}
|
||||||
|
if ((e = mp_mod(&tz, N, &tz)) != MP_OKAY) {
|
||||||
|
goto LBL_FU_ERR;
|
||||||
|
}
|
||||||
|
if ((e = mp_mod(&T1z, N, &sz)) != MP_OKAY) {
|
||||||
|
goto LBL_FU_ERR;
|
||||||
|
}
|
||||||
|
if ((isset = mp_get_bit(&Np1z, i)) == MP_VAL) {
|
||||||
|
e = isset;
|
||||||
|
goto LBL_FU_ERR;
|
||||||
|
}
|
||||||
|
if (isset == MP_YES) {
|
||||||
|
/*
|
||||||
|
* temp = (a+2) * sz + tz
|
||||||
|
* tz = 2 * tz - sz
|
||||||
|
* sz = temp
|
||||||
|
*/
|
||||||
|
if (a == 0) {
|
||||||
|
if ((e = mp_mul_2(&sz, &T1z)) != MP_OKAY) {
|
||||||
|
goto LBL_FU_ERR;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if ((e = mp_mul_d(&sz, (mp_digit)ap2, &T1z)) != MP_OKAY) {
|
||||||
|
goto LBL_FU_ERR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ((e = mp_add(&T1z, &tz, &T1z)) != MP_OKAY) {
|
||||||
|
goto LBL_FU_ERR;
|
||||||
|
}
|
||||||
|
if ((e = mp_mul_2(&tz, &T2z)) != MP_OKAY) {
|
||||||
|
goto LBL_FU_ERR;
|
||||||
|
}
|
||||||
|
if ((e = mp_sub(&T2z, &sz, &tz)) != MP_OKAY) {
|
||||||
|
goto LBL_FU_ERR;
|
||||||
|
}
|
||||||
|
mp_exch(&sz, &T1z);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((e = mp_set_long(&T1z, (unsigned long)((2 * a) + 5))) != MP_OKAY) {
|
||||||
|
goto LBL_FU_ERR;
|
||||||
|
}
|
||||||
|
if ((e = mp_mod(&T1z, N, &T1z)) != MP_OKAY) {
|
||||||
|
goto LBL_FU_ERR;
|
||||||
|
}
|
||||||
|
if ((mp_iszero(&sz) != MP_NO) && (mp_cmp(&tz, &T1z) == MP_EQ)) {
|
||||||
|
*result = MP_YES;
|
||||||
|
goto LBL_FU_ERR;
|
||||||
|
}
|
||||||
|
|
||||||
|
LBL_FU_ERR:
|
||||||
|
mp_clear_multi(&tz, &sz, &Np1z, &T2z, &T1z, NULL);
|
||||||
|
return e;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* ref: $Format:%D$ */
|
||||||
|
/* git commit: $Format:%H$ */
|
||||||
|
/* commit time: $Format:%ai$ */
|
|
@ -0,0 +1,411 @@
|
||||||
|
#include "tommath_private.h"
|
||||||
|
#ifdef BN_MP_PRIME_STRONG_LUCAS_SELFRIDGE_C
|
||||||
|
|
||||||
|
/* LibTomMath, multiple-precision integer library -- Tom St Denis
|
||||||
|
*
|
||||||
|
* LibTomMath is a library that provides multiple-precision
|
||||||
|
* integer arithmetic as well as number theoretic functionality.
|
||||||
|
*
|
||||||
|
* The library was designed directly after the MPI library by
|
||||||
|
* Michael Fromberger but has been written from scratch with
|
||||||
|
* additional optimizations in place.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Unlicense
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* See file bn_mp_prime_is_prime.c or the documentation in doc/bn.tex for the details
|
||||||
|
*/
|
||||||
|
#ifndef LTM_USE_FIPS_ONLY
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 8-bit is just too small. You can try the Frobenius test
|
||||||
|
* but that frobenius test can fail, too, for the same reason.
|
||||||
|
*/
|
||||||
|
#ifndef MP_8BIT
|
||||||
|
|
||||||
|
/*
|
||||||
|
* multiply bigint a with int d and put the result in c
|
||||||
|
* Like mp_mul_d() but with a signed long as the small input
|
||||||
|
*/
|
||||||
|
static int s_mp_mul_si(const mp_int *a, long d, mp_int *c)
|
||||||
|
{
|
||||||
|
mp_int t;
|
||||||
|
int err, neg = 0;
|
||||||
|
|
||||||
|
if ((err = mp_init(&t)) != MP_OKAY) {
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
if (d < 0) {
|
||||||
|
neg = 1;
|
||||||
|
d = -d;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* mp_digit might be smaller than a long, which excludes
|
||||||
|
* the use of mp_mul_d() here.
|
||||||
|
*/
|
||||||
|
if ((err = mp_set_long(&t, (unsigned long) d)) != MP_OKAY) {
|
||||||
|
goto LBL_MPMULSI_ERR;
|
||||||
|
}
|
||||||
|
if ((err = mp_mul(a, &t, c)) != MP_OKAY) {
|
||||||
|
goto LBL_MPMULSI_ERR;
|
||||||
|
}
|
||||||
|
if (neg == 1) {
|
||||||
|
c->sign = (a->sign == MP_NEG) ? MP_ZPOS: MP_NEG;
|
||||||
|
}
|
||||||
|
LBL_MPMULSI_ERR:
|
||||||
|
mp_clear(&t);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
Strong Lucas-Selfridge test.
|
||||||
|
returns MP_YES if it is a strong L-S prime, MP_NO if it is composite
|
||||||
|
|
||||||
|
Code ported from Thomas Ray Nicely's implementation of the BPSW test
|
||||||
|
at http://www.trnicely.net/misc/bpsw.html
|
||||||
|
|
||||||
|
Freeware copyright (C) 2016 Thomas R. Nicely <http://www.trnicely.net>.
|
||||||
|
Released into the public domain by the author, who disclaims any legal
|
||||||
|
liability arising from its use
|
||||||
|
|
||||||
|
The multi-line comments are made by Thomas R. Nicely and are copied verbatim.
|
||||||
|
Additional comments marked "CZ" (without the quotes) are by the code-portist.
|
||||||
|
|
||||||
|
(If that name sounds familiar, he is the guy who found the fdiv bug in the
|
||||||
|
Pentium (P5x, I think) Intel processor)
|
||||||
|
*/
|
||||||
|
int mp_prime_strong_lucas_selfridge(const mp_int *a, int *result)
|
||||||
|
{
|
||||||
|
/* CZ TODO: choose better variable names! */
|
||||||
|
mp_int Dz, gcd, Np1, Uz, Vz, U2mz, V2mz, Qmz, Q2mz, Qkdz, T1z, T2z, T3z, T4z, Q2kdz;
|
||||||
|
/* CZ TODO: Some of them need the full 32 bit, hence the (temporary) exclusion of MP_8BIT */
|
||||||
|
int32_t D, Ds, J, sign, P, Q, r, s, u, Nbits;
|
||||||
|
int e;
|
||||||
|
int isset, oddness;
|
||||||
|
|
||||||
|
*result = MP_NO;
|
||||||
|
/*
|
||||||
|
Find the first element D in the sequence {5, -7, 9, -11, 13, ...}
|
||||||
|
such that Jacobi(D,N) = -1 (Selfridge's algorithm). Theory
|
||||||
|
indicates that, if N is not a perfect square, D will "nearly
|
||||||
|
always" be "small." Just in case, an overflow trap for D is
|
||||||
|
included.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if ((e = mp_init_multi(&Dz, &gcd, &Np1, &Uz, &Vz, &U2mz, &V2mz, &Qmz, &Q2mz, &Qkdz, &T1z, &T2z, &T3z, &T4z, &Q2kdz,
|
||||||
|
NULL)) != MP_OKAY) {
|
||||||
|
return e;
|
||||||
|
}
|
||||||
|
|
||||||
|
D = 5;
|
||||||
|
sign = 1;
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
Ds = sign * D;
|
||||||
|
sign = -sign;
|
||||||
|
if ((e = mp_set_long(&Dz, (unsigned long)D)) != MP_OKAY) {
|
||||||
|
goto LBL_LS_ERR;
|
||||||
|
}
|
||||||
|
if ((e = mp_gcd(a, &Dz, &gcd)) != MP_OKAY) {
|
||||||
|
goto LBL_LS_ERR;
|
||||||
|
}
|
||||||
|
/* if 1 < GCD < N then N is composite with factor "D", and
|
||||||
|
Jacobi(D,N) is technically undefined (but often returned
|
||||||
|
as zero). */
|
||||||
|
if ((mp_cmp_d(&gcd, 1uL) == MP_GT) && (mp_cmp(&gcd, a) == MP_LT)) {
|
||||||
|
goto LBL_LS_ERR;
|
||||||
|
}
|
||||||
|
if (Ds < 0) {
|
||||||
|
Dz.sign = MP_NEG;
|
||||||
|
}
|
||||||
|
if ((e = mp_kronecker(&Dz, a, &J)) != MP_OKAY) {
|
||||||
|
goto LBL_LS_ERR;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (J == -1) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
D += 2;
|
||||||
|
|
||||||
|
if (D > (INT_MAX - 2)) {
|
||||||
|
e = MP_VAL;
|
||||||
|
goto LBL_LS_ERR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
P = 1; /* Selfridge's choice */
|
||||||
|
Q = (1 - Ds) / 4; /* Required so D = P*P - 4*Q */
|
||||||
|
|
||||||
|
/* NOTE: The conditions (a) N does not divide Q, and
|
||||||
|
(b) D is square-free or not a perfect square, are included by
|
||||||
|
some authors; e.g., "Prime numbers and computer methods for
|
||||||
|
factorization," Hans Riesel (2nd ed., 1994, Birkhauser, Boston),
|
||||||
|
p. 130. For this particular application of Lucas sequences,
|
||||||
|
these conditions were found to be immaterial. */
|
||||||
|
|
||||||
|
/* Now calculate N - Jacobi(D,N) = N + 1 (even), and calculate the
|
||||||
|
odd positive integer d and positive integer s for which
|
||||||
|
N + 1 = 2^s*d (similar to the step for N - 1 in Miller's test).
|
||||||
|
The strong Lucas-Selfridge test then returns N as a strong
|
||||||
|
Lucas probable prime (slprp) if any of the following
|
||||||
|
conditions is met: U_d=0, V_d=0, V_2d=0, V_4d=0, V_8d=0,
|
||||||
|
V_16d=0, ..., etc., ending with V_{2^(s-1)*d}=V_{(N+1)/2}=0
|
||||||
|
(all equalities mod N). Thus d is the highest index of U that
|
||||||
|
must be computed (since V_2m is independent of U), compared
|
||||||
|
to U_{N+1} for the standard Lucas-Selfridge test; and no
|
||||||
|
index of V beyond (N+1)/2 is required, just as in the
|
||||||
|
standard Lucas-Selfridge test. However, the quantity Q^d must
|
||||||
|
be computed for use (if necessary) in the latter stages of
|
||||||
|
the test. The result is that the strong Lucas-Selfridge test
|
||||||
|
has a running time only slightly greater (order of 10 %) than
|
||||||
|
that of the standard Lucas-Selfridge test, while producing
|
||||||
|
only (roughly) 30 % as many pseudoprimes (and every strong
|
||||||
|
Lucas pseudoprime is also a standard Lucas pseudoprime). Thus
|
||||||
|
the evidence indicates that the strong Lucas-Selfridge test is
|
||||||
|
more effective than the standard Lucas-Selfridge test, and a
|
||||||
|
Baillie-PSW test based on the strong Lucas-Selfridge test
|
||||||
|
should be more reliable. */
|
||||||
|
|
||||||
|
if ((e = mp_add_d(a, 1uL, &Np1)) != MP_OKAY) {
|
||||||
|
goto LBL_LS_ERR;
|
||||||
|
}
|
||||||
|
s = mp_cnt_lsb(&Np1);
|
||||||
|
|
||||||
|
/* CZ
|
||||||
|
* This should round towards zero because
|
||||||
|
* Thomas R. Nicely used GMP's mpz_tdiv_q_2exp()
|
||||||
|
* and mp_div_2d() is equivalent. Additionally:
|
||||||
|
* dividing an even number by two does not produce
|
||||||
|
* any leftovers.
|
||||||
|
*/
|
||||||
|
if ((e = mp_div_2d(&Np1, s, &Dz, NULL)) != MP_OKAY) {
|
||||||
|
goto LBL_LS_ERR;
|
||||||
|
}
|
||||||
|
/* We must now compute U_d and V_d. Since d is odd, the accumulated
|
||||||
|
values U and V are initialized to U_1 and V_1 (if the target
|
||||||
|
index were even, U and V would be initialized instead to U_0=0
|
||||||
|
and V_0=2). The values of U_2m and V_2m are also initialized to
|
||||||
|
U_1 and V_1; the FOR loop calculates in succession U_2 and V_2,
|
||||||
|
U_4 and V_4, U_8 and V_8, etc. If the corresponding bits
|
||||||
|
(1, 2, 3, ...) of t are on (the zero bit having been accounted
|
||||||
|
for in the initialization of U and V), these values are then
|
||||||
|
combined with the previous totals for U and V, using the
|
||||||
|
composition formulas for addition of indices. */
|
||||||
|
|
||||||
|
mp_set(&Uz, 1uL); /* U=U_1 */
|
||||||
|
mp_set(&Vz, (mp_digit)P); /* V=V_1 */
|
||||||
|
mp_set(&U2mz, 1uL); /* U_1 */
|
||||||
|
mp_set(&V2mz, (mp_digit)P); /* V_1 */
|
||||||
|
|
||||||
|
if (Q < 0) {
|
||||||
|
Q = -Q;
|
||||||
|
if ((e = mp_set_long(&Qmz, (unsigned long)Q)) != MP_OKAY) {
|
||||||
|
goto LBL_LS_ERR;
|
||||||
|
}
|
||||||
|
if ((e = mp_mul_2(&Qmz, &Q2mz)) != MP_OKAY) {
|
||||||
|
goto LBL_LS_ERR;
|
||||||
|
}
|
||||||
|
/* Initializes calculation of Q^d */
|
||||||
|
if ((e = mp_set_long(&Qkdz, (unsigned long)Q)) != MP_OKAY) {
|
||||||
|
goto LBL_LS_ERR;
|
||||||
|
}
|
||||||
|
Qmz.sign = MP_NEG;
|
||||||
|
Q2mz.sign = MP_NEG;
|
||||||
|
Qkdz.sign = MP_NEG;
|
||||||
|
Q = -Q;
|
||||||
|
} else {
|
||||||
|
if ((e = mp_set_long(&Qmz, (unsigned long)Q)) != MP_OKAY) {
|
||||||
|
goto LBL_LS_ERR;
|
||||||
|
}
|
||||||
|
if ((e = mp_mul_2(&Qmz, &Q2mz)) != MP_OKAY) {
|
||||||
|
goto LBL_LS_ERR;
|
||||||
|
}
|
||||||
|
/* Initializes calculation of Q^d */
|
||||||
|
if ((e = mp_set_long(&Qkdz, (unsigned long)Q)) != MP_OKAY) {
|
||||||
|
goto LBL_LS_ERR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Nbits = mp_count_bits(&Dz);
|
||||||
|
|
||||||
|
for (u = 1; u < Nbits; u++) { /* zero bit off, already accounted for */
|
||||||
|
/* Formulas for doubling of indices (carried out mod N). Note that
|
||||||
|
* the indices denoted as "2m" are actually powers of 2, specifically
|
||||||
|
* 2^(ul-1) beginning each loop and 2^ul ending each loop.
|
||||||
|
*
|
||||||
|
* U_2m = U_m*V_m
|
||||||
|
* V_2m = V_m*V_m - 2*Q^m
|
||||||
|
*/
|
||||||
|
|
||||||
|
if ((e = mp_mul(&U2mz, &V2mz, &U2mz)) != MP_OKAY) {
|
||||||
|
goto LBL_LS_ERR;
|
||||||
|
}
|
||||||
|
if ((e = mp_mod(&U2mz, a, &U2mz)) != MP_OKAY) {
|
||||||
|
goto LBL_LS_ERR;
|
||||||
|
}
|
||||||
|
if ((e = mp_sqr(&V2mz, &V2mz)) != MP_OKAY) {
|
||||||
|
goto LBL_LS_ERR;
|
||||||
|
}
|
||||||
|
if ((e = mp_sub(&V2mz, &Q2mz, &V2mz)) != MP_OKAY) {
|
||||||
|
goto LBL_LS_ERR;
|
||||||
|
}
|
||||||
|
if ((e = mp_mod(&V2mz, a, &V2mz)) != MP_OKAY) {
|
||||||
|
goto LBL_LS_ERR;
|
||||||
|
}
|
||||||
|
/* Must calculate powers of Q for use in V_2m, also for Q^d later */
|
||||||
|
if ((e = mp_sqr(&Qmz, &Qmz)) != MP_OKAY) {
|
||||||
|
goto LBL_LS_ERR;
|
||||||
|
}
|
||||||
|
/* prevents overflow */ /* CZ still necessary without a fixed prealloc'd mem.? */
|
||||||
|
if ((e = mp_mod(&Qmz, a, &Qmz)) != MP_OKAY) {
|
||||||
|
goto LBL_LS_ERR;
|
||||||
|
}
|
||||||
|
if ((e = mp_mul_2(&Qmz, &Q2mz)) != MP_OKAY) {
|
||||||
|
goto LBL_LS_ERR;
|
||||||
|
}
|
||||||
|
if ((isset = mp_get_bit(&Dz, u)) == MP_VAL) {
|
||||||
|
e = isset;
|
||||||
|
goto LBL_LS_ERR;
|
||||||
|
}
|
||||||
|
if (isset == MP_YES) {
|
||||||
|
/* Formulas for addition of indices (carried out mod N);
|
||||||
|
*
|
||||||
|
* U_(m+n) = (U_m*V_n + U_n*V_m)/2
|
||||||
|
* V_(m+n) = (V_m*V_n + D*U_m*U_n)/2
|
||||||
|
*
|
||||||
|
* Be careful with division by 2 (mod N)!
|
||||||
|
*/
|
||||||
|
if ((e = mp_mul(&U2mz, &Vz, &T1z)) != MP_OKAY) {
|
||||||
|
goto LBL_LS_ERR;
|
||||||
|
}
|
||||||
|
if ((e = mp_mul(&Uz, &V2mz, &T2z)) != MP_OKAY) {
|
||||||
|
goto LBL_LS_ERR;
|
||||||
|
}
|
||||||
|
if ((e = mp_mul(&V2mz, &Vz, &T3z)) != MP_OKAY) {
|
||||||
|
goto LBL_LS_ERR;
|
||||||
|
}
|
||||||
|
if ((e = mp_mul(&U2mz, &Uz, &T4z)) != MP_OKAY) {
|
||||||
|
goto LBL_LS_ERR;
|
||||||
|
}
|
||||||
|
if ((e = s_mp_mul_si(&T4z, (long)Ds, &T4z)) != MP_OKAY) {
|
||||||
|
goto LBL_LS_ERR;
|
||||||
|
}
|
||||||
|
if ((e = mp_add(&T1z, &T2z, &Uz)) != MP_OKAY) {
|
||||||
|
goto LBL_LS_ERR;
|
||||||
|
}
|
||||||
|
if (mp_isodd(&Uz) != MP_NO) {
|
||||||
|
if ((e = mp_add(&Uz, a, &Uz)) != MP_OKAY) {
|
||||||
|
goto LBL_LS_ERR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* CZ
|
||||||
|
* This should round towards negative infinity because
|
||||||
|
* Thomas R. Nicely used GMP's mpz_fdiv_q_2exp().
|
||||||
|
* But mp_div_2() does not do so, it is truncating instead.
|
||||||
|
*/
|
||||||
|
oddness = mp_isodd(&Uz);
|
||||||
|
if ((e = mp_div_2(&Uz, &Uz)) != MP_OKAY) {
|
||||||
|
goto LBL_LS_ERR;
|
||||||
|
}
|
||||||
|
if ((Uz.sign == MP_NEG) && (oddness != MP_NO)) {
|
||||||
|
if ((e = mp_sub_d(&Uz, 1uL, &Uz)) != MP_OKAY) {
|
||||||
|
goto LBL_LS_ERR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ((e = mp_add(&T3z, &T4z, &Vz)) != MP_OKAY) {
|
||||||
|
goto LBL_LS_ERR;
|
||||||
|
}
|
||||||
|
if (mp_isodd(&Vz) != MP_NO) {
|
||||||
|
if ((e = mp_add(&Vz, a, &Vz)) != MP_OKAY) {
|
||||||
|
goto LBL_LS_ERR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
oddness = mp_isodd(&Vz);
|
||||||
|
if ((e = mp_div_2(&Vz, &Vz)) != MP_OKAY) {
|
||||||
|
goto LBL_LS_ERR;
|
||||||
|
}
|
||||||
|
if ((Vz.sign == MP_NEG) && (oddness != MP_NO)) {
|
||||||
|
if ((e = mp_sub_d(&Vz, 1uL, &Vz)) != MP_OKAY) {
|
||||||
|
goto LBL_LS_ERR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ((e = mp_mod(&Uz, a, &Uz)) != MP_OKAY) {
|
||||||
|
goto LBL_LS_ERR;
|
||||||
|
}
|
||||||
|
if ((e = mp_mod(&Vz, a, &Vz)) != MP_OKAY) {
|
||||||
|
goto LBL_LS_ERR;
|
||||||
|
}
|
||||||
|
/* Calculating Q^d for later use */
|
||||||
|
if ((e = mp_mul(&Qkdz, &Qmz, &Qkdz)) != MP_OKAY) {
|
||||||
|
goto LBL_LS_ERR;
|
||||||
|
}
|
||||||
|
if ((e = mp_mod(&Qkdz, a, &Qkdz)) != MP_OKAY) {
|
||||||
|
goto LBL_LS_ERR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If U_d or V_d is congruent to 0 mod N, then N is a prime or a
|
||||||
|
strong Lucas pseudoprime. */
|
||||||
|
if ((mp_iszero(&Uz) != MP_NO) || (mp_iszero(&Vz) != MP_NO)) {
|
||||||
|
*result = MP_YES;
|
||||||
|
goto LBL_LS_ERR;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* NOTE: Ribenboim ("The new book of prime number records," 3rd ed.,
|
||||||
|
1995/6) omits the condition V0 on p.142, but includes it on
|
||||||
|
p. 130. The condition is NECESSARY; otherwise the test will
|
||||||
|
return false negatives---e.g., the primes 29 and 2000029 will be
|
||||||
|
returned as composite. */
|
||||||
|
|
||||||
|
/* Otherwise, we must compute V_2d, V_4d, V_8d, ..., V_{2^(s-1)*d}
|
||||||
|
by repeated use of the formula V_2m = V_m*V_m - 2*Q^m. If any of
|
||||||
|
these are congruent to 0 mod N, then N is a prime or a strong
|
||||||
|
Lucas pseudoprime. */
|
||||||
|
|
||||||
|
/* Initialize 2*Q^(d*2^r) for V_2m */
|
||||||
|
if ((e = mp_mul_2(&Qkdz, &Q2kdz)) != MP_OKAY) {
|
||||||
|
goto LBL_LS_ERR;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (r = 1; r < s; r++) {
|
||||||
|
if ((e = mp_sqr(&Vz, &Vz)) != MP_OKAY) {
|
||||||
|
goto LBL_LS_ERR;
|
||||||
|
}
|
||||||
|
if ((e = mp_sub(&Vz, &Q2kdz, &Vz)) != MP_OKAY) {
|
||||||
|
goto LBL_LS_ERR;
|
||||||
|
}
|
||||||
|
if ((e = mp_mod(&Vz, a, &Vz)) != MP_OKAY) {
|
||||||
|
goto LBL_LS_ERR;
|
||||||
|
}
|
||||||
|
if (mp_iszero(&Vz) != MP_NO) {
|
||||||
|
*result = MP_YES;
|
||||||
|
goto LBL_LS_ERR;
|
||||||
|
}
|
||||||
|
/* Calculate Q^{d*2^r} for next r (final iteration irrelevant). */
|
||||||
|
if (r < (s - 1)) {
|
||||||
|
if ((e = mp_sqr(&Qkdz, &Qkdz)) != MP_OKAY) {
|
||||||
|
goto LBL_LS_ERR;
|
||||||
|
}
|
||||||
|
if ((e = mp_mod(&Qkdz, a, &Qkdz)) != MP_OKAY) {
|
||||||
|
goto LBL_LS_ERR;
|
||||||
|
}
|
||||||
|
if ((e = mp_mul_2(&Qkdz, &Q2kdz)) != MP_OKAY) {
|
||||||
|
goto LBL_LS_ERR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
LBL_LS_ERR:
|
||||||
|
mp_clear_multi(&Q2kdz, &T4z, &T3z, &T2z, &T1z, &Qkdz, &Q2mz, &Qmz, &V2mz, &U2mz, &Vz, &Uz, &Np1, &gcd, &Dz, NULL);
|
||||||
|
return e;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* ref: $Format:%D$ */
|
||||||
|
/* git commit: $Format:%H$ */
|
||||||
|
/* commit time: $Format:%ai$ */
|
|
@ -0,0 +1,62 @@
|
||||||
|
#include "tommath_private.h"
|
||||||
|
#ifdef BN_MP_SET_DOUBLE_C
|
||||||
|
/* LibTomMath, multiple-precision integer library -- Tom St Denis
|
||||||
|
*
|
||||||
|
* LibTomMath is a library that provides multiple-precision
|
||||||
|
* integer arithmetic as well as number theoretic functionality.
|
||||||
|
*
|
||||||
|
* The library was designed directly after the MPI library by
|
||||||
|
* Michael Fromberger but has been written from scratch with
|
||||||
|
* additional optimizations in place.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Unlicense
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if defined(__STDC_IEC_559__) || defined(__GCC_IEC_559)
|
||||||
|
int mp_set_double(mp_int *a, double b)
|
||||||
|
{
|
||||||
|
uint64_t frac;
|
||||||
|
int exp, res;
|
||||||
|
union {
|
||||||
|
double dbl;
|
||||||
|
uint64_t bits;
|
||||||
|
} cast;
|
||||||
|
cast.dbl = b;
|
||||||
|
|
||||||
|
exp = (int)((unsigned)(cast.bits >> 52) & 0x7FFU);
|
||||||
|
frac = (cast.bits & ((1ULL << 52) - 1ULL)) | (1ULL << 52);
|
||||||
|
|
||||||
|
if (exp == 0x7FF) { /* +-inf, NaN */
|
||||||
|
return MP_VAL;
|
||||||
|
}
|
||||||
|
exp -= 1023 + 52;
|
||||||
|
|
||||||
|
res = mp_set_long_long(a, frac);
|
||||||
|
if (res != MP_OKAY) {
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
res = (exp < 0) ? mp_div_2d(a, -exp, a, NULL) : mp_mul_2d(a, exp, a);
|
||||||
|
if (res != MP_OKAY) {
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (((cast.bits >> 63) != 0ULL) && (mp_iszero(a) == MP_NO)) {
|
||||||
|
SIGN(a) = MP_NEG;
|
||||||
|
}
|
||||||
|
|
||||||
|
return MP_OKAY;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
/* pragma message() not supported by several compilers (in mostly older but still used versions) */
|
||||||
|
# ifdef _MSC_VER
|
||||||
|
# pragma message("mp_set_double implementation is only available on platforms with IEEE754 floating point format")
|
||||||
|
# else
|
||||||
|
# warning "mp_set_double implementation is only available on platforms with IEEE754 floating point format"
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* ref: $Format:%D$ */
|
||||||
|
/* git commit: $Format:%H$ */
|
||||||
|
/* commit time: $Format:%ai$ */
|
|
@ -0,0 +1,90 @@
|
||||||
|
#include "tommath_private.h"
|
||||||
|
#ifdef BN_MP_TC_AND_C
|
||||||
|
/* LibTomMath, multiple-precision integer library -- Tom St Denis
|
||||||
|
*
|
||||||
|
* LibTomMath is a library that provides multiple-precision
|
||||||
|
* integer arithmetic as well as number theoretic functionality.
|
||||||
|
*
|
||||||
|
* The library was designed directly after the MPI library by
|
||||||
|
* Michael Fromberger but has been written from scratch with
|
||||||
|
* additional optimizations in place.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Unlicense
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* two complement and */
|
||||||
|
int mp_tc_and(const mp_int *a, const mp_int *b, mp_int *c)
|
||||||
|
{
|
||||||
|
int res = MP_OKAY, bits, abits, bbits;
|
||||||
|
int as = mp_isneg(a), bs = mp_isneg(b);
|
||||||
|
mp_int *mx = NULL, _mx, acpy, bcpy;
|
||||||
|
|
||||||
|
if ((as != MP_NO) || (bs != MP_NO)) {
|
||||||
|
abits = mp_count_bits(a);
|
||||||
|
bbits = mp_count_bits(b);
|
||||||
|
bits = MAX(abits, bbits);
|
||||||
|
res = mp_init_set_int(&_mx, 1uL);
|
||||||
|
if (res != MP_OKAY) {
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
mx = &_mx;
|
||||||
|
res = mp_mul_2d(mx, bits + 1, mx);
|
||||||
|
if (res != MP_OKAY) {
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (as != MP_NO) {
|
||||||
|
res = mp_init(&acpy);
|
||||||
|
if (res != MP_OKAY) {
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
res = mp_add(mx, a, &acpy);
|
||||||
|
if (res != MP_OKAY) {
|
||||||
|
mp_clear(&acpy);
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
a = &acpy;
|
||||||
|
}
|
||||||
|
if (bs != MP_NO) {
|
||||||
|
res = mp_init(&bcpy);
|
||||||
|
if (res != MP_OKAY) {
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
res = mp_add(mx, b, &bcpy);
|
||||||
|
if (res != MP_OKAY) {
|
||||||
|
mp_clear(&bcpy);
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
b = &bcpy;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
res = mp_and(a, b, c);
|
||||||
|
|
||||||
|
if ((as != MP_NO) && (bs != MP_NO) && (res == MP_OKAY)) {
|
||||||
|
res = 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 res;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* ref: $Format:%D$ */
|
||||||
|
/* git commit: $Format:%H$ */
|
||||||
|
/* commit time: $Format:%ai$ */
|
|
@ -0,0 +1,35 @@
|
||||||
|
#include "tommath_private.h"
|
||||||
|
#ifdef BN_MP_TC_DIV_2D_C
|
||||||
|
/* LibTomMath, multiple-precision integer library -- Tom St Denis
|
||||||
|
*
|
||||||
|
* LibTomMath is a library that provides multiple-precision
|
||||||
|
* integer arithmetic as well as number theoretic functionality.
|
||||||
|
*
|
||||||
|
* The library was designed directly after the MPI library by
|
||||||
|
* Michael Fromberger but has been written from scratch with
|
||||||
|
* additional optimizations in place.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Unlicense
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* two complement right shift */
|
||||||
|
int mp_tc_div_2d(const mp_int *a, int b, mp_int *c)
|
||||||
|
{
|
||||||
|
int res;
|
||||||
|
if (mp_isneg(a) == MP_NO) {
|
||||||
|
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
|
||||||
|
|
||||||
|
/* ref: $Format:%D$ */
|
||||||
|
/* git commit: $Format:%H$ */
|
||||||
|
/* commit time: $Format:%ai$ */
|
|
@ -0,0 +1,90 @@
|
||||||
|
#include "tommath_private.h"
|
||||||
|
#ifdef BN_MP_TC_OR_C
|
||||||
|
/* LibTomMath, multiple-precision integer library -- Tom St Denis
|
||||||
|
*
|
||||||
|
* LibTomMath is a library that provides multiple-precision
|
||||||
|
* integer arithmetic as well as number theoretic functionality.
|
||||||
|
*
|
||||||
|
* The library was designed directly after the MPI library by
|
||||||
|
* Michael Fromberger but has been written from scratch with
|
||||||
|
* additional optimizations in place.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Unlicense
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* two complement or */
|
||||||
|
int mp_tc_or(const mp_int *a, const mp_int *b, mp_int *c)
|
||||||
|
{
|
||||||
|
int res = MP_OKAY, bits, abits, bbits;
|
||||||
|
int as = mp_isneg(a), bs = mp_isneg(b);
|
||||||
|
mp_int *mx = NULL, _mx, acpy, bcpy;
|
||||||
|
|
||||||
|
if ((as != MP_NO) || (bs != MP_NO)) {
|
||||||
|
abits = mp_count_bits(a);
|
||||||
|
bbits = mp_count_bits(b);
|
||||||
|
bits = MAX(abits, bbits);
|
||||||
|
res = mp_init_set_int(&_mx, 1uL);
|
||||||
|
if (res != MP_OKAY) {
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
mx = &_mx;
|
||||||
|
res = mp_mul_2d(mx, bits + 1, mx);
|
||||||
|
if (res != MP_OKAY) {
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (as != MP_NO) {
|
||||||
|
res = mp_init(&acpy);
|
||||||
|
if (res != MP_OKAY) {
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
res = mp_add(mx, a, &acpy);
|
||||||
|
if (res != MP_OKAY) {
|
||||||
|
mp_clear(&acpy);
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
a = &acpy;
|
||||||
|
}
|
||||||
|
if (bs != MP_NO) {
|
||||||
|
res = mp_init(&bcpy);
|
||||||
|
if (res != MP_OKAY) {
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
res = mp_add(mx, b, &bcpy);
|
||||||
|
if (res != MP_OKAY) {
|
||||||
|
mp_clear(&bcpy);
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
b = &bcpy;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
res = mp_or(a, b, c);
|
||||||
|
|
||||||
|
if (((as != MP_NO) || (bs != MP_NO)) && (res == MP_OKAY)) {
|
||||||
|
res = 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 res;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* ref: $Format:%D$ */
|
||||||
|
/* git commit: $Format:%H$ */
|
||||||
|
/* commit time: $Format:%ai$ */
|
|
@ -0,0 +1,90 @@
|
||||||
|
#include "tommath_private.h"
|
||||||
|
#ifdef BN_MP_TC_XOR_C
|
||||||
|
/* LibTomMath, multiple-precision integer library -- Tom St Denis
|
||||||
|
*
|
||||||
|
* LibTomMath is a library that provides multiple-precision
|
||||||
|
* integer arithmetic as well as number theoretic functionality.
|
||||||
|
*
|
||||||
|
* The library was designed directly after the MPI library by
|
||||||
|
* Michael Fromberger but has been written from scratch with
|
||||||
|
* additional optimizations in place.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Unlicense
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* two complement xor */
|
||||||
|
int mp_tc_xor(const mp_int *a, const mp_int *b, mp_int *c)
|
||||||
|
{
|
||||||
|
int res = MP_OKAY, bits, abits, bbits;
|
||||||
|
int as = mp_isneg(a), bs = mp_isneg(b);
|
||||||
|
mp_int *mx = NULL, _mx, acpy, bcpy;
|
||||||
|
|
||||||
|
if ((as != MP_NO) || (bs != MP_NO)) {
|
||||||
|
abits = mp_count_bits(a);
|
||||||
|
bbits = mp_count_bits(b);
|
||||||
|
bits = MAX(abits, bbits);
|
||||||
|
res = mp_init_set_int(&_mx, 1uL);
|
||||||
|
if (res != MP_OKAY) {
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
mx = &_mx;
|
||||||
|
res = mp_mul_2d(mx, bits + 1, mx);
|
||||||
|
if (res != MP_OKAY) {
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (as != MP_NO) {
|
||||||
|
res = mp_init(&acpy);
|
||||||
|
if (res != MP_OKAY) {
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
res = mp_add(mx, a, &acpy);
|
||||||
|
if (res != MP_OKAY) {
|
||||||
|
mp_clear(&acpy);
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
a = &acpy;
|
||||||
|
}
|
||||||
|
if (bs != MP_NO) {
|
||||||
|
res = mp_init(&bcpy);
|
||||||
|
if (res != MP_OKAY) {
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
res = mp_add(mx, b, &bcpy);
|
||||||
|
if (res != MP_OKAY) {
|
||||||
|
mp_clear(&bcpy);
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
b = &bcpy;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
res = mp_xor(a, b, c);
|
||||||
|
|
||||||
|
if ((as != bs) && (res == MP_OKAY)) {
|
||||||
|
res = 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 res;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* ref: $Format:%D$ */
|
||||||
|
/* git commit: $Format:%H$ */
|
||||||
|
/* commit time: $Format:%ai$ */
|
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
|
@ -1,8 +1,8 @@
|
||||||
# Install script for directory: /home/wolverindev/cgit/libtommath
|
# Install script for directory: C:/Users/WolverinDEV/TeaRoot-Client/third_party/tommath
|
||||||
|
|
||||||
# Set the install prefix
|
# Set the install prefix
|
||||||
if(NOT DEFINED CMAKE_INSTALL_PREFIX)
|
if(NOT DEFINED CMAKE_INSTALL_PREFIX)
|
||||||
set(CMAKE_INSTALL_PREFIX "/usr/local")
|
set(CMAKE_INSTALL_PREFIX "C:/Program Files (x86)/libtommath")
|
||||||
endif()
|
endif()
|
||||||
string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}")
|
string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}")
|
||||||
|
|
||||||
|
@ -27,33 +27,29 @@ if(NOT CMAKE_INSTALL_COMPONENT)
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Install shared libraries without execute permission?
|
# Is this installation the result of a crosscompile?
|
||||||
if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE)
|
if(NOT DEFINED CMAKE_CROSSCOMPILING)
|
||||||
set(CMAKE_INSTALL_SO_NO_EXE "1")
|
set(CMAKE_CROSSCOMPILING "FALSE")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if("${CMAKE_INSTALL_COMPONENT}" STREQUAL "Unspecified" OR NOT CMAKE_INSTALL_COMPONENT)
|
if("x${CMAKE_INSTALL_COMPONENT}x" STREQUAL "xUnspecifiedx" OR NOT CMAKE_INSTALL_COMPONENT)
|
||||||
if(EXISTS "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/libtommathShared.so" AND
|
file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/lib" TYPE STATIC_LIBRARY FILES "C:/Users/WolverinDEV/TeaRoot-Client/third_party/tommath/cmake-build-debug/tommathStatic.lib")
|
||||||
NOT IS_SYMLINK "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/libtommathShared.so")
|
|
||||||
file(RPATH_CHECK
|
|
||||||
FILE "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/libtommathShared.so"
|
|
||||||
RPATH "")
|
|
||||||
endif()
|
|
||||||
file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/lib" TYPE SHARED_LIBRARY FILES "/home/wolverindev/cgit/libtommath/cmake-build-debug/libtommathShared.so")
|
|
||||||
if(EXISTS "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/libtommathShared.so" AND
|
|
||||||
NOT IS_SYMLINK "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/libtommathShared.so")
|
|
||||||
if(CMAKE_INSTALL_DO_STRIP)
|
|
||||||
execute_process(COMMAND "/usr/bin/strip" "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/libtommathShared.so")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if("${CMAKE_INSTALL_COMPONENT}" STREQUAL "Unspecified" OR NOT CMAKE_INSTALL_COMPONENT)
|
if("x${CMAKE_INSTALL_COMPONENT}x" STREQUAL "xUnspecifiedx" OR NOT CMAKE_INSTALL_COMPONENT)
|
||||||
|
file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/lib" TYPE STATIC_LIBRARY OPTIONAL FILES "C:/Users/WolverinDEV/TeaRoot-Client/third_party/tommath/cmake-build-debug/tommathShared.lib")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if("x${CMAKE_INSTALL_COMPONENT}x" STREQUAL "xUnspecifiedx" OR NOT CMAKE_INSTALL_COMPONENT)
|
||||||
|
file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/lib" TYPE SHARED_LIBRARY FILES "C:/Users/WolverinDEV/TeaRoot-Client/third_party/tommath/cmake-build-debug/tommathShared.dll")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if("x${CMAKE_INSTALL_COMPONENT}x" STREQUAL "xUnspecifiedx" OR NOT CMAKE_INSTALL_COMPONENT)
|
||||||
file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/include" TYPE FILE FILES
|
file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/include" TYPE FILE FILES
|
||||||
"/home/wolverindev/cgit/libtommath/tommath.h"
|
"C:/Users/WolverinDEV/TeaRoot-Client/third_party/tommath/tommath.h"
|
||||||
"/home/wolverindev/cgit/libtommath/tommath_class.h"
|
"C:/Users/WolverinDEV/TeaRoot-Client/third_party/tommath/tommath_class.h"
|
||||||
"/home/wolverindev/cgit/libtommath/tommath_private.h"
|
"C:/Users/WolverinDEV/TeaRoot-Client/third_party/tommath/tommath_private.h"
|
||||||
"/home/wolverindev/cgit/libtommath/tommath_superclass.h"
|
"C:/Users/WolverinDEV/TeaRoot-Client/third_party/tommath/tommath_superclass.h"
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
@ -65,5 +61,5 @@ endif()
|
||||||
|
|
||||||
string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT
|
string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT
|
||||||
"${CMAKE_INSTALL_MANIFEST_FILES}")
|
"${CMAKE_INSTALL_MANIFEST_FILES}")
|
||||||
file(WRITE "/home/wolverindev/cgit/libtommath/cmake-build-debug/${CMAKE_INSTALL_MANIFEST}"
|
file(WRITE "C:/Users/WolverinDEV/TeaRoot-Client/third_party/tommath/cmake-build-debug/${CMAKE_INSTALL_MANIFEST}"
|
||||||
"${CMAKE_INSTALL_MANIFEST_CONTENT}")
|
"${CMAKE_INSTALL_MANIFEST_CONTENT}")
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,294 @@
|
||||||
|
#!/usr/bin/env perl
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
use Getopt::Long;
|
||||||
|
use File::Find 'find';
|
||||||
|
use File::Basename 'basename';
|
||||||
|
use File::Glob 'bsd_glob';
|
||||||
|
|
||||||
|
sub read_file {
|
||||||
|
my $f = shift;
|
||||||
|
open my $fh, "<", $f or die "FATAL: read_rawfile() cannot open file '$f': $!";
|
||||||
|
binmode $fh;
|
||||||
|
return do { local $/; <$fh> };
|
||||||
|
}
|
||||||
|
|
||||||
|
sub write_file {
|
||||||
|
my ($f, $data) = @_;
|
||||||
|
die "FATAL: write_file() no data" unless defined $data;
|
||||||
|
open my $fh, ">", $f or die "FATAL: write_file() cannot open file '$f': $!";
|
||||||
|
binmode $fh;
|
||||||
|
print $fh $data or die "FATAL: write_file() cannot write to '$f': $!";
|
||||||
|
close $fh or die "FATAL: write_file() cannot close '$f': $!";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub check_source {
|
||||||
|
my @all_files = (
|
||||||
|
bsd_glob("makefile*"),
|
||||||
|
bsd_glob("*.{h,c,sh,pl}"),
|
||||||
|
bsd_glob("*/*.{h,c,sh,pl}"),
|
||||||
|
);
|
||||||
|
|
||||||
|
my $fails = 0;
|
||||||
|
for my $file (sort @all_files) {
|
||||||
|
my $troubles = {};
|
||||||
|
my $lineno = 1;
|
||||||
|
my $content = read_file($file);
|
||||||
|
push @{$troubles->{crlf_line_end}}, '?' if $content =~ /\r/;
|
||||||
|
for my $l (split /\n/, $content) {
|
||||||
|
push @{$troubles->{merge_conflict}}, $lineno if $l =~ /^(<<<<<<<|=======|>>>>>>>)([^<=>]|$)/;
|
||||||
|
push @{$troubles->{trailing_space}}, $lineno if $l =~ / $/;
|
||||||
|
push @{$troubles->{tab}}, $lineno if $l =~ /\t/ && basename($file) !~ /^makefile/i;
|
||||||
|
push @{$troubles->{non_ascii_char}}, $lineno if $l =~ /[^[:ascii:]]/;
|
||||||
|
push @{$troubles->{cpp_comment}}, $lineno if $file =~ /\.(c|h)$/ && ($l =~ /\s\/\// || $l =~ /\/\/\s/);
|
||||||
|
# we prefer using XMALLOC, XFREE, XREALLOC, XCALLOC ...
|
||||||
|
push @{$troubles->{unwanted_malloc}}, $lineno if $file =~ /^[^\/]+\.c$/ && $l =~ /\bmalloc\s*\(/;
|
||||||
|
push @{$troubles->{unwanted_realloc}}, $lineno if $file =~ /^[^\/]+\.c$/ && $l =~ /\brealloc\s*\(/;
|
||||||
|
push @{$troubles->{unwanted_calloc}}, $lineno if $file =~ /^[^\/]+\.c$/ && $l =~ /\bcalloc\s*\(/;
|
||||||
|
push @{$troubles->{unwanted_free}}, $lineno if $file =~ /^[^\/]+\.c$/ && $l =~ /\bfree\s*\(/;
|
||||||
|
# and we probably want to also avoid the following
|
||||||
|
push @{$troubles->{unwanted_memcpy}}, $lineno if $file =~ /^[^\/]+\.c$/ && $l =~ /\bmemcpy\s*\(/;
|
||||||
|
push @{$troubles->{unwanted_memset}}, $lineno if $file =~ /^[^\/]+\.c$/ && $l =~ /\bmemset\s*\(/;
|
||||||
|
push @{$troubles->{unwanted_memcpy}}, $lineno if $file =~ /^[^\/]+\.c$/ && $l =~ /\bmemcpy\s*\(/;
|
||||||
|
push @{$troubles->{unwanted_memmove}}, $lineno if $file =~ /^[^\/]+\.c$/ && $l =~ /\bmemmove\s*\(/;
|
||||||
|
push @{$troubles->{unwanted_memcmp}}, $lineno if $file =~ /^[^\/]+\.c$/ && $l =~ /\bmemcmp\s*\(/;
|
||||||
|
push @{$troubles->{unwanted_strcmp}}, $lineno if $file =~ /^[^\/]+\.c$/ && $l =~ /\bstrcmp\s*\(/;
|
||||||
|
push @{$troubles->{unwanted_strcpy}}, $lineno if $file =~ /^[^\/]+\.c$/ && $l =~ /\bstrcpy\s*\(/;
|
||||||
|
push @{$troubles->{unwanted_strncpy}}, $lineno if $file =~ /^[^\/]+\.c$/ && $l =~ /\bstrncpy\s*\(/;
|
||||||
|
push @{$troubles->{unwanted_clock}}, $lineno if $file =~ /^[^\/]+\.c$/ && $l =~ /\bclock\s*\(/;
|
||||||
|
push @{$troubles->{unwanted_qsort}}, $lineno if $file =~ /^[^\/]+\.c$/ && $l =~ /\bqsort\s*\(/;
|
||||||
|
push @{$troubles->{sizeof_no_brackets}}, $lineno if $file =~ /^[^\/]+\.c$/ && $l =~ /\bsizeof\s*[^\(]/;
|
||||||
|
if ($file =~ m|^[^\/]+\.c$| && $l =~ /^static(\s+[a-zA-Z0-9_]+)+\s+([a-zA-Z0-9_]+)\s*\(/) {
|
||||||
|
my $funcname = $2;
|
||||||
|
# static functions should start with s_
|
||||||
|
push @{$troubles->{staticfunc_name}}, "$lineno($funcname)" if $funcname !~ /^s_/;
|
||||||
|
}
|
||||||
|
$lineno++;
|
||||||
|
}
|
||||||
|
for my $k (sort keys %$troubles) {
|
||||||
|
warn "[$k] $file line:" . join(",", @{$troubles->{$k}}) . "\n";
|
||||||
|
$fails++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
warn( $fails > 0 ? "check-source: FAIL $fails\n" : "check-source: PASS\n" );
|
||||||
|
return $fails;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub check_comments {
|
||||||
|
my $fails = 0;
|
||||||
|
my $first_comment = <<'MARKER';
|
||||||
|
/* LibTomMath, multiple-precision integer library -- Tom St Denis
|
||||||
|
*
|
||||||
|
* LibTomMath is a library that provides multiple-precision
|
||||||
|
* integer arithmetic as well as number theoretic functionality.
|
||||||
|
*
|
||||||
|
* The library was designed directly after the MPI library by
|
||||||
|
* Michael Fromberger but has been written from scratch with
|
||||||
|
* additional optimizations in place.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Unlicense
|
||||||
|
*/
|
||||||
|
MARKER
|
||||||
|
my $last_comment = <<'MARKER';
|
||||||
|
/* ref: $Format:%D$ */
|
||||||
|
/* git commit: $Format:%H$ */
|
||||||
|
/* commit time: $Format:%ai$ */
|
||||||
|
MARKER
|
||||||
|
#my @all_files = (bsd_glob("*.{h,c}"), bsd_glob("*/*.{h,c}"));
|
||||||
|
my @all_files = (bsd_glob("*.{h,c}"));
|
||||||
|
for my $f (@all_files) {
|
||||||
|
my $txt = read_file($f);
|
||||||
|
if ($txt !~ /\Q$first_comment\E/s) {
|
||||||
|
warn "[first_comment] $f\n";
|
||||||
|
$fails++;
|
||||||
|
}
|
||||||
|
if ($txt !~ /\Q$last_comment\E\s*$/s) {
|
||||||
|
warn "[last_comment] $f\n";
|
||||||
|
$fails++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
warn( $fails > 0 ? "check-comments: FAIL $fails\n" : "check-comments: PASS\n" );
|
||||||
|
return $fails;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub prepare_variable {
|
||||||
|
my ($varname, @list) = @_;
|
||||||
|
my $output = "$varname=";
|
||||||
|
my $len = length($output);
|
||||||
|
foreach my $obj (sort @list) {
|
||||||
|
$len = $len + length $obj;
|
||||||
|
$obj =~ s/\*/\$/;
|
||||||
|
if ($len > 100) {
|
||||||
|
$output .= "\\\n";
|
||||||
|
$len = length $obj;
|
||||||
|
}
|
||||||
|
$output .= $obj . ' ';
|
||||||
|
}
|
||||||
|
$output =~ s/ $//;
|
||||||
|
return $output;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub prepare_msvc_files_xml {
|
||||||
|
my ($all, $exclude_re, $targets) = @_;
|
||||||
|
my $last = [];
|
||||||
|
my $depth = 2;
|
||||||
|
|
||||||
|
# sort files in the same order as visual studio (ugly, I know)
|
||||||
|
my @parts = ();
|
||||||
|
for my $orig (@$all) {
|
||||||
|
my $p = $orig;
|
||||||
|
$p =~ s|/|/~|g;
|
||||||
|
$p =~ s|/~([^/]+)$|/$1|g;
|
||||||
|
my @l = map { sprintf "% -99s", $_ } split /\//, $p;
|
||||||
|
push @parts, [ $orig, join(':', @l) ];
|
||||||
|
}
|
||||||
|
my @sorted = map { $_->[0] } sort { $a->[1] cmp $b->[1] } @parts;
|
||||||
|
|
||||||
|
my $files = "<Files>\r\n";
|
||||||
|
for my $full (@sorted) {
|
||||||
|
my @items = split /\//, $full; # split by '/'
|
||||||
|
$full =~ s|/|\\|g; # replace '/' bt '\'
|
||||||
|
shift @items; # drop first one (src)
|
||||||
|
pop @items; # drop last one (filename.ext)
|
||||||
|
my $current = \@items;
|
||||||
|
if (join(':', @$current) ne join(':', @$last)) {
|
||||||
|
my $common = 0;
|
||||||
|
$common++ while ($last->[$common] && $current->[$common] && $last->[$common] eq $current->[$common]);
|
||||||
|
my $back = @$last - $common;
|
||||||
|
if ($back > 0) {
|
||||||
|
$files .= ("\t" x --$depth) . "</Filter>\r\n" for (1..$back);
|
||||||
|
}
|
||||||
|
my $fwd = [ @$current ]; splice(@$fwd, 0, $common);
|
||||||
|
for my $i (0..scalar(@$fwd) - 1) {
|
||||||
|
$files .= ("\t" x $depth) . "<Filter\r\n";
|
||||||
|
$files .= ("\t" x $depth) . "\tName=\"$fwd->[$i]\"\r\n";
|
||||||
|
$files .= ("\t" x $depth) . "\t>\r\n";
|
||||||
|
$depth++;
|
||||||
|
}
|
||||||
|
$last = $current;
|
||||||
|
}
|
||||||
|
$files .= ("\t" x $depth) . "<File\r\n";
|
||||||
|
$files .= ("\t" x $depth) . "\tRelativePath=\"$full\"\r\n";
|
||||||
|
$files .= ("\t" x $depth) . "\t>\r\n";
|
||||||
|
if ($full =~ $exclude_re) {
|
||||||
|
for (@$targets) {
|
||||||
|
$files .= ("\t" x $depth) . "\t<FileConfiguration\r\n";
|
||||||
|
$files .= ("\t" x $depth) . "\t\tName=\"$_\"\r\n";
|
||||||
|
$files .= ("\t" x $depth) . "\t\tExcludedFromBuild=\"true\"\r\n";
|
||||||
|
$files .= ("\t" x $depth) . "\t\t>\r\n";
|
||||||
|
$files .= ("\t" x $depth) . "\t\t<Tool\r\n";
|
||||||
|
$files .= ("\t" x $depth) . "\t\t\tName=\"VCCLCompilerTool\"\r\n";
|
||||||
|
$files .= ("\t" x $depth) . "\t\t\tAdditionalIncludeDirectories=\"\"\r\n";
|
||||||
|
$files .= ("\t" x $depth) . "\t\t\tPreprocessorDefinitions=\"\"\r\n";
|
||||||
|
$files .= ("\t" x $depth) . "\t\t/>\r\n";
|
||||||
|
$files .= ("\t" x $depth) . "\t</FileConfiguration>\r\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$files .= ("\t" x $depth) . "</File>\r\n";
|
||||||
|
}
|
||||||
|
$files .= ("\t" x --$depth) . "</Filter>\r\n" for (@$last);
|
||||||
|
$files .= "\t</Files>";
|
||||||
|
return $files;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub patch_file {
|
||||||
|
my ($content, @variables) = @_;
|
||||||
|
for my $v (@variables) {
|
||||||
|
if ($v =~ /^([A-Z0-9_]+)\s*=.*$/si) {
|
||||||
|
my $name = $1;
|
||||||
|
$content =~ s/\n\Q$name\E\b.*?[^\\]\n/\n$v\n/s;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
die "patch_file failed: " . substr($v, 0, 30) . "..";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $content;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub version_from_tomcrypt_h {
|
||||||
|
my $h = read_file(shift);
|
||||||
|
if ($h =~ /\n#define\s*SCRYPT\s*"([0-9]+)\.([0-9]+)\.([0-9]+)(.*)"/s) {
|
||||||
|
return "VERSION_PC=$1.$2.$3", "VERSION_LT=1:1", "VERSION=$1.$2.$3$4", "PROJECT_NUMBER=$1.$2.$3$4";
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
die "#define SCRYPT not found in tomcrypt.h";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sub process_makefiles {
|
||||||
|
my $write = shift;
|
||||||
|
my $changed_count = 0;
|
||||||
|
my @o = map { my $x = $_; $x =~ s/\.c$/.o/; $x } bsd_glob("*.c");
|
||||||
|
my @all = bsd_glob("*.{c,h}");
|
||||||
|
|
||||||
|
my $var_o = prepare_variable("OBJECTS", @o);
|
||||||
|
(my $var_obj = $var_o) =~ s/\.o\b/.obj/sg;
|
||||||
|
|
||||||
|
# update MSVC project files
|
||||||
|
my $msvc_files = prepare_msvc_files_xml(\@all, qr/NOT_USED_HERE/, ['Debug|Win32', 'Release|Win32', 'Debug|x64', 'Release|x64']);
|
||||||
|
for my $m (qw/libtommath_VS2008.vcproj/) {
|
||||||
|
my $old = read_file($m);
|
||||||
|
my $new = $old;
|
||||||
|
$new =~ s|<Files>.*</Files>|$msvc_files|s;
|
||||||
|
if ($old ne $new) {
|
||||||
|
write_file($m, $new) if $write;
|
||||||
|
warn "changed: $m\n";
|
||||||
|
$changed_count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# update OBJECTS + HEADERS in makefile*
|
||||||
|
for my $m (qw/ makefile makefile.shared makefile_include.mk makefile.msvc makefile.unix makefile.mingw /) {
|
||||||
|
my $old = read_file($m);
|
||||||
|
my $new = $m eq 'makefile.msvc' ? patch_file($old, $var_obj)
|
||||||
|
: patch_file($old, $var_o);
|
||||||
|
if ($old ne $new) {
|
||||||
|
write_file($m, $new) if $write;
|
||||||
|
warn "changed: $m\n";
|
||||||
|
$changed_count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($write) {
|
||||||
|
return 0; # no failures
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
warn( $changed_count > 0 ? "check-makefiles: FAIL $changed_count\n" : "check-makefiles: PASS\n" );
|
||||||
|
return $changed_count;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sub die_usage {
|
||||||
|
die <<"MARKER";
|
||||||
|
usage: $0 -s OR $0 --check-source
|
||||||
|
$0 -o OR $0 --check-comments
|
||||||
|
$0 -m OR $0 --check-makefiles
|
||||||
|
$0 -a OR $0 --check-all
|
||||||
|
$0 -u OR $0 --update-makefiles
|
||||||
|
MARKER
|
||||||
|
}
|
||||||
|
|
||||||
|
GetOptions( "s|check-source" => \my $check_source,
|
||||||
|
"o|check-comments" => \my $check_comments,
|
||||||
|
"m|check-makefiles" => \my $check_makefiles,
|
||||||
|
"a|check-all" => \my $check_all,
|
||||||
|
"u|update-makefiles" => \my $update_makefiles,
|
||||||
|
"h|help" => \my $help
|
||||||
|
) or die_usage;
|
||||||
|
|
||||||
|
my $failure;
|
||||||
|
$failure ||= check_source() if $check_all || $check_source;
|
||||||
|
$failure ||= check_comments() if $check_all || $check_comments;
|
||||||
|
$failure ||= process_makefiles(0) if $check_all || $check_makefiles;
|
||||||
|
$failure ||= process_makefiles(1) if $update_makefiles;
|
||||||
|
|
||||||
|
die_usage unless defined $failure;
|
||||||
|
exit $failure ? 1 : 0;
|
||||||
|
|
||||||
|
# ref: $Format:%D$
|
||||||
|
# git commit: $Format:%H$
|
||||||
|
# commit time: $Format:%ai$
|
|
@ -0,0 +1,106 @@
|
||||||
|
# MAKEFILE for MS Windows (mingw + gcc + gmake)
|
||||||
|
#
|
||||||
|
# BEWARE: variable OBJECTS is updated via ./updatemakes.sh
|
||||||
|
|
||||||
|
### USAGE:
|
||||||
|
# Open a command prompt with gcc + gmake in PATH and start:
|
||||||
|
#
|
||||||
|
# gmake -f makefile.mingw all
|
||||||
|
# test.exe
|
||||||
|
# gmake -f makefile.mingw PREFIX=c:\devel\libtom install
|
||||||
|
|
||||||
|
#The following can be overridden from command line e.g. make -f makefile.mingw CC=gcc ARFLAGS=rcs
|
||||||
|
PREFIX = c:\mingw
|
||||||
|
CC = gcc
|
||||||
|
AR = ar
|
||||||
|
ARFLAGS = r
|
||||||
|
RANLIB = ranlib
|
||||||
|
STRIP = strip
|
||||||
|
CFLAGS = -O2
|
||||||
|
LDFLAGS =
|
||||||
|
|
||||||
|
#Compilation flags
|
||||||
|
LTM_CFLAGS = -I. $(CFLAGS)
|
||||||
|
LTM_LDFLAGS = $(LDFLAGS)
|
||||||
|
|
||||||
|
#Libraries to be created
|
||||||
|
LIBMAIN_S =libtommath.a
|
||||||
|
LIBMAIN_I =libtommath.dll.a
|
||||||
|
LIBMAIN_D =libtommath.dll
|
||||||
|
|
||||||
|
#List of objects to compile (all goes to libtommath.a)
|
||||||
|
OBJECTS=bn_error.o bn_fast_mp_invmod.o bn_fast_mp_montgomery_reduce.o bn_fast_s_mp_mul_digs.o \
|
||||||
|
bn_fast_s_mp_mul_high_digs.o bn_fast_s_mp_sqr.o bn_mp_2expt.o bn_mp_abs.o bn_mp_add.o bn_mp_add_d.o \
|
||||||
|
bn_mp_addmod.o bn_mp_and.o bn_mp_clamp.o bn_mp_clear.o bn_mp_clear_multi.o bn_mp_cmp.o bn_mp_cmp_d.o \
|
||||||
|
bn_mp_cmp_mag.o bn_mp_cnt_lsb.o bn_mp_complement.o bn_mp_copy.o bn_mp_count_bits.o bn_mp_div.o \
|
||||||
|
bn_mp_div_2.o bn_mp_div_2d.o bn_mp_div_3.o bn_mp_div_d.o bn_mp_dr_is_modulus.o bn_mp_dr_reduce.o \
|
||||||
|
bn_mp_dr_setup.o bn_mp_exch.o bn_mp_export.o bn_mp_expt_d.o bn_mp_expt_d_ex.o bn_mp_exptmod.o \
|
||||||
|
bn_mp_exptmod_fast.o bn_mp_exteuclid.o bn_mp_fread.o bn_mp_fwrite.o bn_mp_gcd.o bn_mp_get_bit.o \
|
||||||
|
bn_mp_get_double.o bn_mp_get_int.o bn_mp_get_long.o bn_mp_get_long_long.o bn_mp_grow.o bn_mp_import.o \
|
||||||
|
bn_mp_init.o bn_mp_init_copy.o bn_mp_init_multi.o bn_mp_init_set.o bn_mp_init_set_int.o bn_mp_init_size.o \
|
||||||
|
bn_mp_invmod.o bn_mp_invmod_slow.o bn_mp_is_square.o bn_mp_jacobi.o bn_mp_karatsuba_mul.o \
|
||||||
|
bn_mp_karatsuba_sqr.o bn_mp_kronecker.o bn_mp_lcm.o bn_mp_lshd.o bn_mp_mod.o bn_mp_mod_2d.o bn_mp_mod_d.o \
|
||||||
|
bn_mp_montgomery_calc_normalization.o bn_mp_montgomery_reduce.o bn_mp_montgomery_setup.o bn_mp_mul.o \
|
||||||
|
bn_mp_mul_2.o bn_mp_mul_2d.o bn_mp_mul_d.o bn_mp_mulmod.o bn_mp_n_root.o bn_mp_n_root_ex.o bn_mp_neg.o \
|
||||||
|
bn_mp_or.o bn_mp_prime_fermat.o bn_mp_prime_frobenius_underwood.o bn_mp_prime_is_divisible.o \
|
||||||
|
bn_mp_prime_is_prime.o bn_mp_prime_miller_rabin.o bn_mp_prime_next_prime.o \
|
||||||
|
bn_mp_prime_rabin_miller_trials.o bn_mp_prime_random_ex.o bn_mp_prime_strong_lucas_selfridge.o \
|
||||||
|
bn_mp_radix_size.o bn_mp_radix_smap.o bn_mp_rand.o bn_mp_read_radix.o bn_mp_read_signed_bin.o \
|
||||||
|
bn_mp_read_unsigned_bin.o bn_mp_reduce.o 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_toom_mul.o bn_mp_toom_sqr.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_reverse.o bn_s_mp_add.o bn_s_mp_exptmod.o bn_s_mp_mul_digs.o \
|
||||||
|
bn_s_mp_mul_high_digs.o bn_s_mp_sqr.o bn_s_mp_sub.o bncore.o
|
||||||
|
|
||||||
|
HEADERS_PUB=tommath.h tommath_class.h tommath_superclass.h
|
||||||
|
|
||||||
|
HEADERS=tommath_private.h $(HEADERS_PUB)
|
||||||
|
|
||||||
|
#The default rule for make builds the libtommath.a library (static)
|
||||||
|
default: $(LIBMAIN_S)
|
||||||
|
|
||||||
|
#Dependencies on *.h
|
||||||
|
$(OBJECTS): $(HEADERS)
|
||||||
|
|
||||||
|
.c.o:
|
||||||
|
$(CC) $(LTM_CFLAGS) -c $< -o $@
|
||||||
|
|
||||||
|
#Create libtommath.a
|
||||||
|
$(LIBMAIN_S): $(OBJECTS)
|
||||||
|
$(AR) $(ARFLAGS) $@ $(OBJECTS)
|
||||||
|
$(RANLIB) $@
|
||||||
|
|
||||||
|
#Create DLL + import library libtommath.dll.a
|
||||||
|
$(LIBMAIN_D) $(LIBMAIN_I): $(OBJECTS)
|
||||||
|
$(CC) -s -shared -o $(LIBMAIN_D) $^ -Wl,--enable-auto-import,--export-all -Wl,--out-implib=$(LIBMAIN_I) $(LTM_LDFLAGS)
|
||||||
|
$(STRIP) -S $(LIBMAIN_D)
|
||||||
|
|
||||||
|
#Build test_standalone suite
|
||||||
|
test.exe: $(LIBMAIN_S) demo/demo.c
|
||||||
|
$(CC) $(LTM_CFLAGS) $(LTM_LDFLAGS) demo/demo.c $(LIBMAIN_S) -DLTM_DEMO_TEST_VS_MTEST=0 -o $@
|
||||||
|
@echo NOTICE: start the tests by launching test.exe
|
||||||
|
|
||||||
|
test_standalone: test.exe
|
||||||
|
|
||||||
|
all: $(LIBMAIN_S) test_standalone
|
||||||
|
|
||||||
|
clean:
|
||||||
|
@-cmd /c del /Q /S *.o *.a *.exe *.dll 2>nul
|
||||||
|
|
||||||
|
#Install the library + headers
|
||||||
|
install: $(LIBMAIN_S) $(LIBMAIN_I) $(LIBMAIN_D)
|
||||||
|
cmd /c if not exist "$(PREFIX)\bin" mkdir "$(PREFIX)\bin"
|
||||||
|
cmd /c if not exist "$(PREFIX)\lib" mkdir "$(PREFIX)\lib"
|
||||||
|
cmd /c if not exist "$(PREFIX)\include" mkdir "$(PREFIX)\include"
|
||||||
|
copy /Y $(LIBMAIN_S) "$(PREFIX)\lib"
|
||||||
|
copy /Y $(LIBMAIN_I) "$(PREFIX)\lib"
|
||||||
|
copy /Y $(LIBMAIN_D) "$(PREFIX)\bin"
|
||||||
|
copy /Y tommath*.h "$(PREFIX)\include"
|
||||||
|
|
||||||
|
# ref: $Format:%D$
|
||||||
|
# git commit: $Format:%H$
|
||||||
|
# commit time: $Format:%ai$
|
|
@ -0,0 +1,103 @@
|
||||||
|
# MAKEFILE that is intended to be compatible with any kind of make (GNU make, BSD make, ...)
|
||||||
|
# works on: Linux, *BSD, Cygwin, AIX, HP-UX and hopefully other UNIX systems
|
||||||
|
#
|
||||||
|
# Please do not use here neither any special make syntax nor any unusual tools/utilities!
|
||||||
|
|
||||||
|
# using ICC compiler:
|
||||||
|
# make -f makefile.unix CC=icc CFLAGS="-O3 -xP -ip"
|
||||||
|
|
||||||
|
# using Borland C++Builder:
|
||||||
|
# make -f makefile.unix CC=bcc32
|
||||||
|
|
||||||
|
#The following can be overridden from command line e.g. "make -f makefile.unix CC=gcc ARFLAGS=rcs"
|
||||||
|
DESTDIR =
|
||||||
|
PREFIX = /usr/local
|
||||||
|
LIBPATH = $(PREFIX)/lib
|
||||||
|
INCPATH = $(PREFIX)/include
|
||||||
|
CC = cc
|
||||||
|
AR = ar
|
||||||
|
ARFLAGS = r
|
||||||
|
RANLIB = ranlib
|
||||||
|
CFLAGS = -O2
|
||||||
|
LDFLAGS =
|
||||||
|
|
||||||
|
VERSION = 1.1.0
|
||||||
|
|
||||||
|
#Compilation flags
|
||||||
|
LTM_CFLAGS = -I. $(CFLAGS)
|
||||||
|
LTM_LDFLAGS = $(LDFLAGS)
|
||||||
|
|
||||||
|
#Library to be created (this makefile builds only static library)
|
||||||
|
LIBMAIN_S = libtommath.a
|
||||||
|
|
||||||
|
OBJECTS=bn_error.o bn_fast_mp_invmod.o bn_fast_mp_montgomery_reduce.o bn_fast_s_mp_mul_digs.o \
|
||||||
|
bn_fast_s_mp_mul_high_digs.o bn_fast_s_mp_sqr.o bn_mp_2expt.o bn_mp_abs.o bn_mp_add.o bn_mp_add_d.o \
|
||||||
|
bn_mp_addmod.o bn_mp_and.o bn_mp_clamp.o bn_mp_clear.o bn_mp_clear_multi.o bn_mp_cmp.o bn_mp_cmp_d.o \
|
||||||
|
bn_mp_cmp_mag.o bn_mp_cnt_lsb.o bn_mp_complement.o bn_mp_copy.o bn_mp_count_bits.o bn_mp_div.o \
|
||||||
|
bn_mp_div_2.o bn_mp_div_2d.o bn_mp_div_3.o bn_mp_div_d.o bn_mp_dr_is_modulus.o bn_mp_dr_reduce.o \
|
||||||
|
bn_mp_dr_setup.o bn_mp_exch.o bn_mp_export.o bn_mp_expt_d.o bn_mp_expt_d_ex.o bn_mp_exptmod.o \
|
||||||
|
bn_mp_exptmod_fast.o bn_mp_exteuclid.o bn_mp_fread.o bn_mp_fwrite.o bn_mp_gcd.o bn_mp_get_bit.o \
|
||||||
|
bn_mp_get_double.o bn_mp_get_int.o bn_mp_get_long.o bn_mp_get_long_long.o bn_mp_grow.o bn_mp_import.o \
|
||||||
|
bn_mp_init.o bn_mp_init_copy.o bn_mp_init_multi.o bn_mp_init_set.o bn_mp_init_set_int.o bn_mp_init_size.o \
|
||||||
|
bn_mp_invmod.o bn_mp_invmod_slow.o bn_mp_is_square.o bn_mp_jacobi.o bn_mp_karatsuba_mul.o \
|
||||||
|
bn_mp_karatsuba_sqr.o bn_mp_kronecker.o bn_mp_lcm.o bn_mp_lshd.o bn_mp_mod.o bn_mp_mod_2d.o bn_mp_mod_d.o \
|
||||||
|
bn_mp_montgomery_calc_normalization.o bn_mp_montgomery_reduce.o bn_mp_montgomery_setup.o bn_mp_mul.o \
|
||||||
|
bn_mp_mul_2.o bn_mp_mul_2d.o bn_mp_mul_d.o bn_mp_mulmod.o bn_mp_n_root.o bn_mp_n_root_ex.o bn_mp_neg.o \
|
||||||
|
bn_mp_or.o bn_mp_prime_fermat.o bn_mp_prime_frobenius_underwood.o bn_mp_prime_is_divisible.o \
|
||||||
|
bn_mp_prime_is_prime.o bn_mp_prime_miller_rabin.o bn_mp_prime_next_prime.o \
|
||||||
|
bn_mp_prime_rabin_miller_trials.o bn_mp_prime_random_ex.o bn_mp_prime_strong_lucas_selfridge.o \
|
||||||
|
bn_mp_radix_size.o bn_mp_radix_smap.o bn_mp_rand.o bn_mp_read_radix.o bn_mp_read_signed_bin.o \
|
||||||
|
bn_mp_read_unsigned_bin.o bn_mp_reduce.o 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_toom_mul.o bn_mp_toom_sqr.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_reverse.o bn_s_mp_add.o bn_s_mp_exptmod.o bn_s_mp_mul_digs.o \
|
||||||
|
bn_s_mp_mul_high_digs.o bn_s_mp_sqr.o bn_s_mp_sub.o bncore.o
|
||||||
|
|
||||||
|
HEADERS_PUB=tommath.h tommath_class.h tommath_superclass.h
|
||||||
|
|
||||||
|
HEADERS=tommath_private.h $(HEADERS_PUB)
|
||||||
|
|
||||||
|
#The default rule for make builds the libtommath.a library (static)
|
||||||
|
default: $(LIBMAIN_S)
|
||||||
|
|
||||||
|
#Dependencies on *.h
|
||||||
|
$(OBJECTS): $(HEADERS)
|
||||||
|
|
||||||
|
#This is necessary for compatibility with BSD make (namely on OpenBSD)
|
||||||
|
.SUFFIXES: .o .c
|
||||||
|
.c.o:
|
||||||
|
$(CC) $(LTM_CFLAGS) -c $< -o $@
|
||||||
|
|
||||||
|
#Create libtommath.a
|
||||||
|
$(LIBMAIN_S): $(OBJECTS)
|
||||||
|
$(AR) $(ARFLAGS) $@ $(OBJECTS)
|
||||||
|
$(RANLIB) $@
|
||||||
|
|
||||||
|
#Build test_standalone suite
|
||||||
|
test: $(LIBMAIN_S) demo/demo.c
|
||||||
|
$(CC) $(LTM_CFLAGS) $(LTM_LDFLAGS) demo/demo.c $(LIBMAIN_S) -DLTM_DEMO_TEST_VS_MTEST=0 -o $@
|
||||||
|
@echo "NOTICE: start the tests by: ./test"
|
||||||
|
|
||||||
|
test_standalone: test
|
||||||
|
|
||||||
|
all: $(LIBMAIN_S) test_standalone
|
||||||
|
|
||||||
|
#NOTE: this makefile works also on cygwin, thus we need to delete *.exe
|
||||||
|
clean:
|
||||||
|
-@rm -f $(OBJECTS) $(LIBMAIN_S)
|
||||||
|
-@rm -f demo/demo.o test test.exe
|
||||||
|
|
||||||
|
#Install the library + headers
|
||||||
|
install: $(LIBMAIN_S)
|
||||||
|
@mkdir -p $(DESTDIR)$(INCPATH) $(DESTDIR)$(LIBPATH)/pkgconfig
|
||||||
|
@cp $(LIBMAIN_S) $(DESTDIR)$(LIBPATH)/
|
||||||
|
@cp $(HEADERS_PUB) $(DESTDIR)$(INCPATH)/
|
||||||
|
@sed -e 's,^prefix=.*,prefix=$(PREFIX),' -e 's,^Version:.*,Version: $(VERSION),' libtommath.pc.in > $(DESTDIR)$(LIBPATH)/pkgconfig/libtommath.pc
|
||||||
|
|
||||||
|
# ref: $Format:%D$
|
||||||
|
# git commit: $Format:%H$
|
||||||
|
# commit time: $Format:%ai$
|
Loading…
Reference in New Issue