更新libclamav库1.0.0版本
This commit is contained in:
55
clamav/libclamav/tomsfastmath/numtheory/fp_gcd.c
Normal file
55
clamav/libclamav/tomsfastmath/numtheory/fp_gcd.c
Normal file
@@ -0,0 +1,55 @@
|
||||
/* TomsFastMath, a fast ISO C bignum library.
|
||||
*
|
||||
* This project is meant to fill in where LibTomMath
|
||||
* falls short. That is speed ;-)
|
||||
*
|
||||
* This project is public domain and free for all purposes.
|
||||
*
|
||||
* Tom St Denis, tomstdenis@gmail.com
|
||||
*/
|
||||
#include <tfm_private.h>
|
||||
|
||||
/* c = (a, b) */
|
||||
void fp_gcd(fp_int *a, fp_int *b, fp_int *c)
|
||||
{
|
||||
fp_int u, v, r;
|
||||
|
||||
/* either zero than gcd is the largest */
|
||||
if (fp_iszero (a) == 1 && fp_iszero (b) == 0) {
|
||||
fp_abs (b, c);
|
||||
return;
|
||||
}
|
||||
if (fp_iszero (a) == 0 && fp_iszero (b) == 1) {
|
||||
fp_abs (a, c);
|
||||
return;
|
||||
}
|
||||
|
||||
/* optimized. At this point if a == 0 then
|
||||
* b must equal zero too
|
||||
*/
|
||||
if (fp_iszero (a) == 1) {
|
||||
fp_zero(c);
|
||||
return;
|
||||
}
|
||||
|
||||
/* sort inputs */
|
||||
if (fp_cmp_mag(a, b) != FP_LT) {
|
||||
fp_init_copy(&u, a);
|
||||
fp_init_copy(&v, b);
|
||||
} else {
|
||||
fp_init_copy(&u, b);
|
||||
fp_init_copy(&v, a);
|
||||
}
|
||||
|
||||
fp_zero(&r);
|
||||
while (fp_iszero(&v) == FP_NO) {
|
||||
fp_mod(&u, &v, &r);
|
||||
fp_copy(&v, &u);
|
||||
fp_copy(&r, &v);
|
||||
}
|
||||
fp_copy(&u, c);
|
||||
}
|
||||
|
||||
/* $Source$ */
|
||||
/* $Revision$ */
|
||||
/* $Date$ */
|
207
clamav/libclamav/tomsfastmath/numtheory/fp_invmod.c
Normal file
207
clamav/libclamav/tomsfastmath/numtheory/fp_invmod.c
Normal file
@@ -0,0 +1,207 @@
|
||||
/* TomsFastMath, a fast ISO C bignum library.
|
||||
*
|
||||
* This project is meant to fill in where LibTomMath
|
||||
* falls short. That is speed ;-)
|
||||
*
|
||||
* This project is public domain and free for all purposes.
|
||||
*
|
||||
* Tom St Denis, tomstdenis@gmail.com
|
||||
*/
|
||||
#include <tfm_private.h>
|
||||
|
||||
static int fp_invmod_slow (fp_int * a, fp_int * b, fp_int * c)
|
||||
{
|
||||
fp_int x, y, u, v, A, B, C, D;
|
||||
int res;
|
||||
|
||||
/* b cannot be negative */
|
||||
if (b->sign == FP_NEG || fp_iszero(b) == 1) {
|
||||
return FP_VAL;
|
||||
}
|
||||
|
||||
/* init temps */
|
||||
fp_init(&x); fp_init(&y);
|
||||
fp_init(&u); fp_init(&v);
|
||||
fp_init(&A); fp_init(&B);
|
||||
fp_init(&C); fp_init(&D);
|
||||
|
||||
/* x = a, y = b */
|
||||
if ((res = fp_mod(a, b, &x)) != FP_OKAY) {
|
||||
return res;
|
||||
}
|
||||
fp_copy(b, &y);
|
||||
|
||||
/* 2. [modified] if x,y are both even then return an error! */
|
||||
if (fp_iseven (&x) == 1 && fp_iseven (&y) == 1) {
|
||||
return FP_VAL;
|
||||
}
|
||||
|
||||
/* 3. u=x, v=y, A=1, B=0, C=0,D=1 */
|
||||
fp_copy (&x, &u);
|
||||
fp_copy (&y, &v);
|
||||
fp_set (&A, 1);
|
||||
fp_set (&D, 1);
|
||||
|
||||
top:
|
||||
/* 4. while u is even do */
|
||||
while (fp_iseven (&u) == 1) {
|
||||
/* 4.1 u = u/2 */
|
||||
fp_div_2 (&u, &u);
|
||||
|
||||
/* 4.2 if A or B is odd then */
|
||||
if (fp_isodd (&A) == 1 || fp_isodd (&B) == 1) {
|
||||
/* A = (A+y)/2, B = (B-x)/2 */
|
||||
fp_add (&A, &y, &A);
|
||||
fp_sub (&B, &x, &B);
|
||||
}
|
||||
/* A = A/2, B = B/2 */
|
||||
fp_div_2 (&A, &A);
|
||||
fp_div_2 (&B, &B);
|
||||
}
|
||||
|
||||
/* 5. while v is even do */
|
||||
while (fp_iseven (&v) == 1) {
|
||||
/* 5.1 v = v/2 */
|
||||
fp_div_2 (&v, &v);
|
||||
|
||||
/* 5.2 if C or D is odd then */
|
||||
if (fp_isodd (&C) == 1 || fp_isodd (&D) == 1) {
|
||||
/* C = (C+y)/2, D = (D-x)/2 */
|
||||
fp_add (&C, &y, &C);
|
||||
fp_sub (&D, &x, &D);
|
||||
}
|
||||
/* C = C/2, D = D/2 */
|
||||
fp_div_2 (&C, &C);
|
||||
fp_div_2 (&D, &D);
|
||||
}
|
||||
|
||||
/* 6. if u >= v then */
|
||||
if (fp_cmp (&u, &v) != FP_LT) {
|
||||
/* u = u - v, A = A - C, B = B - D */
|
||||
fp_sub (&u, &v, &u);
|
||||
fp_sub (&A, &C, &A);
|
||||
fp_sub (&B, &D, &B);
|
||||
} else {
|
||||
/* v - v - u, C = C - A, D = D - B */
|
||||
fp_sub (&v, &u, &v);
|
||||
fp_sub (&C, &A, &C);
|
||||
fp_sub (&D, &B, &D);
|
||||
}
|
||||
|
||||
/* if not zero goto step 4 */
|
||||
if (fp_iszero (&u) == 0)
|
||||
goto top;
|
||||
|
||||
/* now a = C, b = D, gcd == g*v */
|
||||
|
||||
/* if v != 1 then there is no inverse */
|
||||
if (fp_cmp_d (&v, 1) != FP_EQ) {
|
||||
return FP_VAL;
|
||||
}
|
||||
|
||||
/* if its too low */
|
||||
while (fp_cmp_d(&C, 0) == FP_LT) {
|
||||
fp_add(&C, b, &C);
|
||||
}
|
||||
|
||||
/* too big */
|
||||
while (fp_cmp_mag(&C, b) != FP_LT) {
|
||||
fp_sub(&C, b, &C);
|
||||
}
|
||||
|
||||
/* C is now the inverse */
|
||||
fp_copy(&C, c);
|
||||
return FP_OKAY;
|
||||
}
|
||||
|
||||
/* c = 1/a (mod b) for odd b only */
|
||||
int fp_invmod(fp_int *a, fp_int *b, fp_int *c)
|
||||
{
|
||||
fp_int x, y, u, v, B, D;
|
||||
int neg;
|
||||
|
||||
/* 2. [modified] b must be odd */
|
||||
if (fp_iseven (b) == FP_YES) {
|
||||
return fp_invmod_slow(a,b,c);
|
||||
}
|
||||
|
||||
/* init all our temps */
|
||||
fp_init(&x); fp_init(&y);
|
||||
fp_init(&u); fp_init(&v);
|
||||
fp_init(&B); fp_init(&D);
|
||||
|
||||
/* x == modulus, y == value to invert */
|
||||
fp_copy(b, &x);
|
||||
|
||||
/* we need y = |a| */
|
||||
fp_abs(a, &y);
|
||||
|
||||
/* 3. u=x, v=y, A=1, B=0, C=0,D=1 */
|
||||
fp_copy(&x, &u);
|
||||
fp_copy(&y, &v);
|
||||
fp_set (&D, 1);
|
||||
|
||||
top:
|
||||
/* 4. while u is even do */
|
||||
while (fp_iseven (&u) == FP_YES) {
|
||||
/* 4.1 u = u/2 */
|
||||
fp_div_2 (&u, &u);
|
||||
|
||||
/* 4.2 if B is odd then */
|
||||
if (fp_isodd (&B) == FP_YES) {
|
||||
fp_sub (&B, &x, &B);
|
||||
}
|
||||
/* B = B/2 */
|
||||
fp_div_2 (&B, &B);
|
||||
}
|
||||
|
||||
/* 5. while v is even do */
|
||||
while (fp_iseven (&v) == FP_YES) {
|
||||
/* 5.1 v = v/2 */
|
||||
fp_div_2 (&v, &v);
|
||||
|
||||
/* 5.2 if D is odd then */
|
||||
if (fp_isodd (&D) == FP_YES) {
|
||||
/* D = (D-x)/2 */
|
||||
fp_sub (&D, &x, &D);
|
||||
}
|
||||
/* D = D/2 */
|
||||
fp_div_2 (&D, &D);
|
||||
}
|
||||
|
||||
/* 6. if u >= v then */
|
||||
if (fp_cmp (&u, &v) != FP_LT) {
|
||||
/* u = u - v, B = B - D */
|
||||
fp_sub (&u, &v, &u);
|
||||
fp_sub (&B, &D, &B);
|
||||
} else {
|
||||
/* v - v - u, D = D - B */
|
||||
fp_sub (&v, &u, &v);
|
||||
fp_sub (&D, &B, &D);
|
||||
}
|
||||
|
||||
/* if not zero goto step 4 */
|
||||
if (fp_iszero (&u) == FP_NO) {
|
||||
goto top;
|
||||
}
|
||||
|
||||
/* now a = C, b = D, gcd == g*v */
|
||||
|
||||
/* if v != 1 then there is no inverse */
|
||||
if (fp_cmp_d (&v, 1) != FP_EQ) {
|
||||
return FP_VAL;
|
||||
}
|
||||
|
||||
/* b is now the inverse */
|
||||
neg = a->sign;
|
||||
while (D.sign == FP_NEG) {
|
||||
fp_add (&D, b, &D);
|
||||
}
|
||||
fp_copy (&D, c);
|
||||
c->sign = neg;
|
||||
return FP_OKAY;
|
||||
}
|
||||
|
||||
/* $Source$ */
|
||||
/* $Revision$ */
|
||||
/* $Date$ */
|
19
clamav/libclamav/tomsfastmath/numtheory/fp_isprime.c
Normal file
19
clamav/libclamav/tomsfastmath/numtheory/fp_isprime.c
Normal file
@@ -0,0 +1,19 @@
|
||||
/* TomsFastMath, a fast ISO C bignum library.
|
||||
*
|
||||
* This project is meant to fill in where LibTomMath
|
||||
* falls short. That is speed ;-)
|
||||
*
|
||||
* This project is public domain and free for all purposes.
|
||||
*
|
||||
* Tom St Denis, tomstdenis@gmail.com
|
||||
*/
|
||||
#include <tfm_private.h>
|
||||
|
||||
int fp_isprime(fp_int *a)
|
||||
{
|
||||
return fp_isprime_ex(a, 8);
|
||||
}
|
||||
|
||||
/* $Source$ */
|
||||
/* $Revision$ */
|
||||
/* $Date$ */
|
83
clamav/libclamav/tomsfastmath/numtheory/fp_isprime_ex.c
Normal file
83
clamav/libclamav/tomsfastmath/numtheory/fp_isprime_ex.c
Normal file
@@ -0,0 +1,83 @@
|
||||
/* TomsFastMath, a fast ISO C bignum library.
|
||||
*
|
||||
* This project is meant to fill in where LibTomMath
|
||||
* falls short. That is speed ;-)
|
||||
*
|
||||
* This project is public domain and free for all purposes.
|
||||
*
|
||||
* Tom St Denis, tomstdenis@gmail.com
|
||||
*/
|
||||
#include <tfm_private.h>
|
||||
|
||||
/* a few primes */
|
||||
static const fp_digit primes[FP_PRIME_SIZE] = {
|
||||
0x0002, 0x0003, 0x0005, 0x0007, 0x000B, 0x000D, 0x0011, 0x0013,
|
||||
0x0017, 0x001D, 0x001F, 0x0025, 0x0029, 0x002B, 0x002F, 0x0035,
|
||||
0x003B, 0x003D, 0x0043, 0x0047, 0x0049, 0x004F, 0x0053, 0x0059,
|
||||
0x0061, 0x0065, 0x0067, 0x006B, 0x006D, 0x0071, 0x007F, 0x0083,
|
||||
0x0089, 0x008B, 0x0095, 0x0097, 0x009D, 0x00A3, 0x00A7, 0x00AD,
|
||||
0x00B3, 0x00B5, 0x00BF, 0x00C1, 0x00C5, 0x00C7, 0x00D3, 0x00DF,
|
||||
0x00E3, 0x00E5, 0x00E9, 0x00EF, 0x00F1, 0x00FB, 0x0101, 0x0107,
|
||||
0x010D, 0x010F, 0x0115, 0x0119, 0x011B, 0x0125, 0x0133, 0x0137,
|
||||
|
||||
0x0139, 0x013D, 0x014B, 0x0151, 0x015B, 0x015D, 0x0161, 0x0167,
|
||||
0x016F, 0x0175, 0x017B, 0x017F, 0x0185, 0x018D, 0x0191, 0x0199,
|
||||
0x01A3, 0x01A5, 0x01AF, 0x01B1, 0x01B7, 0x01BB, 0x01C1, 0x01C9,
|
||||
0x01CD, 0x01CF, 0x01D3, 0x01DF, 0x01E7, 0x01EB, 0x01F3, 0x01F7,
|
||||
0x01FD, 0x0209, 0x020B, 0x021D, 0x0223, 0x022D, 0x0233, 0x0239,
|
||||
0x023B, 0x0241, 0x024B, 0x0251, 0x0257, 0x0259, 0x025F, 0x0265,
|
||||
0x0269, 0x026B, 0x0277, 0x0281, 0x0283, 0x0287, 0x028D, 0x0293,
|
||||
0x0295, 0x02A1, 0x02A5, 0x02AB, 0x02B3, 0x02BD, 0x02C5, 0x02CF,
|
||||
|
||||
0x02D7, 0x02DD, 0x02E3, 0x02E7, 0x02EF, 0x02F5, 0x02F9, 0x0301,
|
||||
0x0305, 0x0313, 0x031D, 0x0329, 0x032B, 0x0335, 0x0337, 0x033B,
|
||||
0x033D, 0x0347, 0x0355, 0x0359, 0x035B, 0x035F, 0x036D, 0x0371,
|
||||
0x0373, 0x0377, 0x038B, 0x038F, 0x0397, 0x03A1, 0x03A9, 0x03AD,
|
||||
0x03B3, 0x03B9, 0x03C7, 0x03CB, 0x03D1, 0x03D7, 0x03DF, 0x03E5,
|
||||
0x03F1, 0x03F5, 0x03FB, 0x03FD, 0x0407, 0x0409, 0x040F, 0x0419,
|
||||
0x041B, 0x0425, 0x0427, 0x042D, 0x043F, 0x0443, 0x0445, 0x0449,
|
||||
0x044F, 0x0455, 0x045D, 0x0463, 0x0469, 0x047F, 0x0481, 0x048B,
|
||||
|
||||
0x0493, 0x049D, 0x04A3, 0x04A9, 0x04B1, 0x04BD, 0x04C1, 0x04C7,
|
||||
0x04CD, 0x04CF, 0x04D5, 0x04E1, 0x04EB, 0x04FD, 0x04FF, 0x0503,
|
||||
0x0509, 0x050B, 0x0511, 0x0515, 0x0517, 0x051B, 0x0527, 0x0529,
|
||||
0x052F, 0x0551, 0x0557, 0x055D, 0x0565, 0x0577, 0x0581, 0x058F,
|
||||
0x0593, 0x0595, 0x0599, 0x059F, 0x05A7, 0x05AB, 0x05AD, 0x05B3,
|
||||
0x05BF, 0x05C9, 0x05CB, 0x05CF, 0x05D1, 0x05D5, 0x05DB, 0x05E7,
|
||||
0x05F3, 0x05FB, 0x0607, 0x060D, 0x0611, 0x0617, 0x061F, 0x0623,
|
||||
0x062B, 0x062F, 0x063D, 0x0641, 0x0647, 0x0649, 0x064D, 0x0653
|
||||
};
|
||||
|
||||
int fp_isprime_ex(fp_int *a, int t)
|
||||
{
|
||||
fp_int b;
|
||||
fp_digit d;
|
||||
int r, res;
|
||||
|
||||
if (t <= 0 || t > FP_PRIME_SIZE) {
|
||||
return FP_NO;
|
||||
}
|
||||
|
||||
/* do trial division */
|
||||
for (r = 0; r < 256; r++) {
|
||||
fp_mod_d(a, primes[r], &d);
|
||||
if (d == 0) {
|
||||
return FP_NO;
|
||||
}
|
||||
}
|
||||
|
||||
/* now do 't' miller rabins */
|
||||
fp_init(&b);
|
||||
for (r = 0; r < t; r++) {
|
||||
fp_set(&b, primes[r]);
|
||||
fp_prime_miller_rabin(a, &b, &res);
|
||||
if (res == FP_NO) {
|
||||
return FP_NO;
|
||||
}
|
||||
}
|
||||
return FP_YES;
|
||||
}
|
||||
|
||||
/* $Source$ */
|
||||
/* $Revision$ */
|
||||
/* $Date$ */
|
31
clamav/libclamav/tomsfastmath/numtheory/fp_lcm.c
Normal file
31
clamav/libclamav/tomsfastmath/numtheory/fp_lcm.c
Normal file
@@ -0,0 +1,31 @@
|
||||
/* TomsFastMath, a fast ISO C bignum library.
|
||||
*
|
||||
* This project is meant to fill in where LibTomMath
|
||||
* falls short. That is speed ;-)
|
||||
*
|
||||
* This project is public domain and free for all purposes.
|
||||
*
|
||||
* Tom St Denis, tomstdenis@gmail.com
|
||||
*/
|
||||
#include <tfm_private.h>
|
||||
|
||||
/* c = [a, b] */
|
||||
void fp_lcm(fp_int *a, fp_int *b, fp_int *c)
|
||||
{
|
||||
fp_int t1, t2;
|
||||
|
||||
fp_init(&t1);
|
||||
fp_init(&t2);
|
||||
fp_gcd(a, b, &t1);
|
||||
if (fp_cmp_mag(a, b) == FP_GT) {
|
||||
fp_div(a, &t1, &t2, NULL);
|
||||
fp_mul(b, &t2, c);
|
||||
} else {
|
||||
fp_div(b, &t1, &t2, NULL);
|
||||
fp_mul(a, &t2, c);
|
||||
}
|
||||
}
|
||||
|
||||
/* $Source$ */
|
||||
/* $Revision$ */
|
||||
/* $Date$ */
|
@@ -0,0 +1,77 @@
|
||||
/* TomsFastMath, a fast ISO C bignum library.
|
||||
*
|
||||
* This project is meant to fill in where LibTomMath
|
||||
* falls short. That is speed ;-)
|
||||
*
|
||||
* This project is public domain and free for all purposes.
|
||||
*
|
||||
* Tom St Denis, tomstdenis@gmail.com
|
||||
*/
|
||||
#include <tfm_private.h>
|
||||
|
||||
/* Miller-Rabin test of "a" to the base of "b" as described in
|
||||
* HAC pp. 139 Algorithm 4.24
|
||||
*
|
||||
* Sets result to 0 if definitely composite or 1 if probably prime.
|
||||
* Randomly the chance of error is no more than 1/4 and often
|
||||
* very much lower.
|
||||
*/
|
||||
void fp_prime_miller_rabin (fp_int * a, fp_int * b, int *result)
|
||||
{
|
||||
fp_int n1, y, r;
|
||||
int s, j;
|
||||
|
||||
/* default */
|
||||
*result = FP_NO;
|
||||
|
||||
/* ensure b > 1 */
|
||||
if (fp_cmp_d(b, 1) != FP_GT) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* get n1 = a - 1 */
|
||||
fp_init_copy(&n1, a);
|
||||
fp_sub_d(&n1, 1, &n1);
|
||||
|
||||
/* set 2**s * r = n1 */
|
||||
fp_init_copy(&r, &n1);
|
||||
|
||||
/* count the number of least significant bits
|
||||
* which are zero
|
||||
*/
|
||||
s = fp_cnt_lsb(&r);
|
||||
|
||||
/* now divide n - 1 by 2**s */
|
||||
fp_div_2d (&r, s, &r, NULL);
|
||||
|
||||
/* compute y = b**r mod a */
|
||||
fp_init(&y);
|
||||
fp_exptmod(b, &r, a, &y);
|
||||
|
||||
/* if y != 1 and y != n1 do */
|
||||
if (fp_cmp_d (&y, 1) != FP_EQ && fp_cmp (&y, &n1) != FP_EQ) {
|
||||
j = 1;
|
||||
/* while j <= s-1 and y != n1 */
|
||||
while ((j <= (s - 1)) && fp_cmp (&y, &n1) != FP_EQ) {
|
||||
fp_sqrmod (&y, a, &y);
|
||||
|
||||
/* if y == 1 then composite */
|
||||
if (fp_cmp_d (&y, 1) == FP_EQ) {
|
||||
return;
|
||||
}
|
||||
++j;
|
||||
}
|
||||
|
||||
/* if y != n1 then composite */
|
||||
if (fp_cmp (&y, &n1) != FP_EQ) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/* probably prime now */
|
||||
*result = FP_YES;
|
||||
}
|
||||
|
||||
/* $Source$ */
|
||||
/* $Revision$ */
|
||||
/* $Date$ */
|
101
clamav/libclamav/tomsfastmath/numtheory/fp_prime_random_ex.c
Normal file
101
clamav/libclamav/tomsfastmath/numtheory/fp_prime_random_ex.c
Normal file
@@ -0,0 +1,101 @@
|
||||
/* TomsFastMath, a fast ISO C bignum library.
|
||||
*
|
||||
* This project is meant to fill in where LibTomMath
|
||||
* falls short. That is speed ;-)
|
||||
*
|
||||
* This project is public domain and free for all purposes.
|
||||
*
|
||||
* Tom St Denis, tomstdenis@gmail.com
|
||||
*/
|
||||
#include <tfm_private.h>
|
||||
|
||||
/* This is possibly the mother of all prime generation functions, muahahahahaha! */
|
||||
int fp_prime_random_ex(fp_int *a, int t, int size, int flags, tfm_prime_callback cb, void *dat)
|
||||
{
|
||||
unsigned char *tmp, maskAND, maskOR_msb, maskOR_lsb;
|
||||
int res, err, bsize, maskOR_msb_offset;
|
||||
|
||||
/* sanity check the input */
|
||||
if (size <= 1 || cb == NULL || t <= 0 || t > FP_PRIME_SIZE) {
|
||||
return FP_VAL;
|
||||
}
|
||||
|
||||
/* TFM_PRIME_SAFE implies TFM_PRIME_BBS */
|
||||
if (flags & TFM_PRIME_SAFE) {
|
||||
flags |= TFM_PRIME_BBS;
|
||||
}
|
||||
|
||||
/* calc the byte size */
|
||||
bsize = (size>>3)+(size&7?1:0);
|
||||
|
||||
/* we need a buffer of bsize bytes */
|
||||
tmp = malloc(bsize);
|
||||
if (tmp == NULL) {
|
||||
return FP_MEM;
|
||||
}
|
||||
|
||||
/* calc the maskAND value for the MSbyte*/
|
||||
maskAND = 0xFF >> ((8 - (size & 7)) & 7);
|
||||
|
||||
/* calc the maskOR_msb */
|
||||
maskOR_msb = 0;
|
||||
maskOR_msb_offset = (size - 2) >> 3;
|
||||
if (flags & TFM_PRIME_2MSB_ON) {
|
||||
maskOR_msb |= 1 << ((size - 2) & 7);
|
||||
} else if (flags & TFM_PRIME_2MSB_OFF) {
|
||||
maskAND &= ~(1 << ((size - 2) & 7));
|
||||
}
|
||||
|
||||
/* get the maskOR_lsb */
|
||||
maskOR_lsb = 1;
|
||||
if (flags & TFM_PRIME_BBS) {
|
||||
maskOR_lsb |= 3;
|
||||
}
|
||||
|
||||
do {
|
||||
/* read the bytes */
|
||||
if (cb(tmp, bsize, dat) != bsize) {
|
||||
err = FP_VAL;
|
||||
goto error;
|
||||
}
|
||||
|
||||
/* work over the MSbyte */
|
||||
tmp[0] &= maskAND;
|
||||
tmp[0] |= 1 << ((size - 1) & 7);
|
||||
|
||||
/* mix in the maskORs */
|
||||
tmp[maskOR_msb_offset] |= maskOR_msb;
|
||||
tmp[bsize-1] |= maskOR_lsb;
|
||||
|
||||
/* read it in */
|
||||
fp_read_unsigned_bin(a, tmp, bsize);
|
||||
|
||||
/* is it prime? */
|
||||
res = fp_isprime_ex(a, t);
|
||||
if (res == FP_NO) continue;
|
||||
|
||||
if (flags & TFM_PRIME_SAFE) {
|
||||
/* see if (a-1)/2 is prime */
|
||||
fp_sub_d(a, 1, a);
|
||||
fp_div_2(a, a);
|
||||
|
||||
/* is it prime? */
|
||||
res = fp_isprime_ex(a, t);
|
||||
}
|
||||
} while (res == FP_NO);
|
||||
|
||||
if (flags & TFM_PRIME_SAFE) {
|
||||
/* restore a to the original value */
|
||||
fp_mul_2(a, a);
|
||||
fp_add_d(a, 1, a);
|
||||
}
|
||||
|
||||
err = FP_OKAY;
|
||||
error:
|
||||
free(tmp);
|
||||
return err;
|
||||
}
|
||||
|
||||
/* $Source$ */
|
||||
/* $Revision$ */
|
||||
/* $Date$ */
|
Reference in New Issue
Block a user