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
|
||||
if(NOT DEFINED CMAKE_INSTALL_PREFIX)
|
||||
set(CMAKE_INSTALL_PREFIX "/usr/local")
|
||||
set(CMAKE_INSTALL_PREFIX "C:/Program Files (x86)/libtommath")
|
||||
endif()
|
||||
string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}")
|
||||
|
||||
|
@ -27,33 +27,29 @@ if(NOT CMAKE_INSTALL_COMPONENT)
|
|||
endif()
|
||||
endif()
|
||||
|
||||
# Install shared libraries without execute permission?
|
||||
if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE)
|
||||
set(CMAKE_INSTALL_SO_NO_EXE "1")
|
||||
# Is this installation the result of a crosscompile?
|
||||
if(NOT DEFINED CMAKE_CROSSCOMPILING)
|
||||
set(CMAKE_CROSSCOMPILING "FALSE")
|
||||
endif()
|
||||
|
||||
if("${CMAKE_INSTALL_COMPONENT}" STREQUAL "Unspecified" OR NOT CMAKE_INSTALL_COMPONENT)
|
||||
if(EXISTS "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/libtommathShared.so" AND
|
||||
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()
|
||||
if("x${CMAKE_INSTALL_COMPONENT}x" STREQUAL "xUnspecifiedx" OR NOT CMAKE_INSTALL_COMPONENT)
|
||||
file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/lib" TYPE STATIC_LIBRARY FILES "C:/Users/WolverinDEV/TeaRoot-Client/third_party/tommath/cmake-build-debug/tommathStatic.lib")
|
||||
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
|
||||
"/home/wolverindev/cgit/libtommath/tommath.h"
|
||||
"/home/wolverindev/cgit/libtommath/tommath_class.h"
|
||||
"/home/wolverindev/cgit/libtommath/tommath_private.h"
|
||||
"/home/wolverindev/cgit/libtommath/tommath_superclass.h"
|
||||
"C:/Users/WolverinDEV/TeaRoot-Client/third_party/tommath/tommath.h"
|
||||
"C:/Users/WolverinDEV/TeaRoot-Client/third_party/tommath/tommath_class.h"
|
||||
"C:/Users/WolverinDEV/TeaRoot-Client/third_party/tommath/tommath_private.h"
|
||||
"C:/Users/WolverinDEV/TeaRoot-Client/third_party/tommath/tommath_superclass.h"
|
||||
)
|
||||
endif()
|
||||
|
||||
|
@ -65,5 +61,5 @@ endif()
|
|||
|
||||
string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT
|
||||
"${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}")
|
||||
|
|
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