move jenkins prng to bn_s_mp_rand_jenkins.c
This commit is contained in:
parent
c8cc3657e7
commit
2a2e2716c2
@ -153,13 +153,13 @@ matrix:
|
|||||||
|
|
||||||
# GCC for the x86-64 architecture testing against a different Bigint-implementation
|
# GCC for the x86-64 architecture testing against a different Bigint-implementation
|
||||||
# with 333333 different inputs.
|
# with 333333 different inputs.
|
||||||
- env: SANITIZER=1 BUILDOPTIONS='--with-cc=gcc-5 --test-vs-mtest=333333 --with-valgrind'
|
- env: BUILDOPTIONS='--with-cc=gcc-5 --test-vs-mtest=333333 --with-valgrind'
|
||||||
- env: SANITIZER=1 BUILDOPTIONS='--with-cc=clang-7 --test-vs-mtest=333333 --with-valgrind'
|
- env: BUILDOPTIONS='--with-cc=clang-7 --test-vs-mtest=333333 --with-valgrind'
|
||||||
|
|
||||||
# clang for the x86-64 architecture testing against a different Bigint-implementation
|
# clang for the x86-64 architecture testing against a different Bigint-implementation
|
||||||
# with a better random source.
|
# with a better random source.
|
||||||
- env: SANITIZER=1 BUILDOPTIONS='--with-cc=gcc-5 --test-vs-mtest=333333 --mtest-real-rand --with-valgrind'
|
- env: BUILDOPTIONS='--with-cc=gcc-5 --test-vs-mtest=333333 --mtest-real-rand --with-valgrind'
|
||||||
- env: SANITIZER=1 BUILDOPTIONS='--with-cc=clang-7 --test-vs-mtest=333333 --mtest-real-rand --with-valgrind'
|
- env: BUILDOPTIONS='--with-cc=clang-7 --test-vs-mtest=333333 --mtest-real-rand --with-valgrind'
|
||||||
|
|
||||||
|
|
||||||
# Notifications go to
|
# Notifications go to
|
||||||
|
@ -3,11 +3,11 @@
|
|||||||
/* LibTomMath, multiple-precision integer library -- Tom St Denis */
|
/* LibTomMath, multiple-precision integer library -- Tom St Denis */
|
||||||
/* SPDX-License-Identifier: Unlicense */
|
/* SPDX-License-Identifier: Unlicense */
|
||||||
|
|
||||||
int (*s_mp_rand_source)(void *, size_t) = s_mp_rand_source_platform;
|
int (*s_mp_rand_source)(void *, size_t) = s_mp_rand_platform;
|
||||||
|
|
||||||
void mp_rand_source(int (*source)(void *out, size_t size))
|
void mp_rand_source(int (*source)(void *out, size_t size))
|
||||||
{
|
{
|
||||||
s_mp_rand_source = (source == NULL) ? s_mp_rand_source_platform : source;
|
s_mp_rand_source = (source == NULL) ? s_mp_rand_platform : source;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* makes a pseudo-random int of a given size */
|
/* makes a pseudo-random int of a given size */
|
||||||
|
52
bn_s_mp_rand_jenkins.c
Normal file
52
bn_s_mp_rand_jenkins.c
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
#include "tommath_private.h"
|
||||||
|
#ifdef BN_S_MP_RAND_JENKINS_C
|
||||||
|
/* LibTomMath, multiple-precision integer library -- Tom St Denis */
|
||||||
|
/* SPDX-License-Identifier: Unlicense */
|
||||||
|
|
||||||
|
/* Bob Jenkins' http://burtleburtle.net/bob/rand/smallprng.html */
|
||||||
|
/* Chosen for speed and a good "mix" */
|
||||||
|
typedef struct ranctx {
|
||||||
|
uint64_t a;
|
||||||
|
uint64_t b;
|
||||||
|
uint64_t c;
|
||||||
|
uint64_t d;
|
||||||
|
} ranctx;
|
||||||
|
|
||||||
|
static ranctx jenkins_x;
|
||||||
|
|
||||||
|
#define rot(x,k) (((x)<<(k))|((x)>>(64-(k))))
|
||||||
|
static uint64_t s_rand_jenkins_val(void)
|
||||||
|
{
|
||||||
|
uint64_t e = jenkins_x.a - rot(jenkins_x.b, 7);
|
||||||
|
jenkins_x.a = jenkins_x.b ^ rot(jenkins_x.c, 13);
|
||||||
|
jenkins_x.b = jenkins_x.c + rot(jenkins_x.d, 37);
|
||||||
|
jenkins_x.c = jenkins_x.d + e;
|
||||||
|
jenkins_x.d = e + jenkins_x.a;
|
||||||
|
return jenkins_x.d;
|
||||||
|
}
|
||||||
|
|
||||||
|
void s_mp_rand_jenkins_init(uint64_t seed)
|
||||||
|
{
|
||||||
|
uint64_t i;
|
||||||
|
jenkins_x.a = 0xf1ea5eed;
|
||||||
|
jenkins_x.b = jenkins_x.c = jenkins_x.d = seed;
|
||||||
|
for (i = 0; i < 20; ++i) {
|
||||||
|
(void)s_rand_jenkins_val();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int s_mp_rand_jenkins(void *p, size_t n)
|
||||||
|
{
|
||||||
|
char *q = (char *)p;
|
||||||
|
while (n > 0) {
|
||||||
|
int i;
|
||||||
|
uint64_t x = s_rand_jenkins_val();
|
||||||
|
for (i = 0; i < 8 && n > 0; ++i, --n) {
|
||||||
|
*q++ = (char)(x & 0xFF);
|
||||||
|
x >>= 8;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return MP_OKAY;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
@ -1,5 +1,5 @@
|
|||||||
#include "tommath_private.h"
|
#include "tommath_private.h"
|
||||||
#ifdef BN_S_MP_RAND_SOURCE_PLATFORM_C
|
#ifdef BN_S_MP_RAND_PLATFORM_C
|
||||||
/* LibTomMath, multiple-precision integer library -- Tom St Denis */
|
/* LibTomMath, multiple-precision integer library -- Tom St Denis */
|
||||||
/* SPDX-License-Identifier: Unlicense */
|
/* SPDX-License-Identifier: Unlicense */
|
||||||
|
|
||||||
@ -128,7 +128,7 @@ static int s_read_ltm_rng(void *p, size_t n)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int s_mp_rand_source_platform(void *p, size_t n)
|
int s_mp_rand_platform(void *p, size_t n)
|
||||||
{
|
{
|
||||||
#if defined(MP_ARC4RANDOM)
|
#if defined(MP_ARC4RANDOM)
|
||||||
arc4random_buf(p, n);
|
arc4random_buf(p, n);
|
@ -15360,7 +15360,10 @@ BN_S_MP_MUL_HIGH_DIGS_FAST_C
|
|||||||
+--->BN_MP_CLAMP_C
|
+--->BN_MP_CLAMP_C
|
||||||
|
|
||||||
|
|
||||||
BN_S_MP_RAND_SOURCE_PLATFORM_C
|
BN_S_MP_RAND_JENKINS_C
|
||||||
|
|
||||||
|
|
||||||
|
BN_S_MP_RAND_PLATFORM_C
|
||||||
|
|
||||||
|
|
||||||
BN_S_MP_REVERSE_C
|
BN_S_MP_REVERSE_C
|
||||||
|
@ -26,8 +26,6 @@ void ndraw(mp_int *a, const char *name)
|
|||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
srand(LTM_DEMO_RAND_SEED);
|
|
||||||
|
|
||||||
#ifdef MP_8BIT
|
#ifdef MP_8BIT
|
||||||
printf("Digit size 8 Bit \n");
|
printf("Digit size 8 Bit \n");
|
||||||
#endif
|
#endif
|
||||||
|
@ -1,5 +1,11 @@
|
|||||||
#include "shared.h"
|
#include "shared.h"
|
||||||
|
|
||||||
|
#ifdef LTM_MTEST_REAL_RAND
|
||||||
|
#define LTM_MTEST_RAND_SEED time(NULL)
|
||||||
|
#else
|
||||||
|
#define LTM_MTEST_RAND_SEED 23
|
||||||
|
#endif
|
||||||
|
|
||||||
static void draw(mp_int *a)
|
static void draw(mp_int *a)
|
||||||
{
|
{
|
||||||
ndraw(a, "");
|
ndraw(a, "");
|
||||||
@ -21,6 +27,8 @@ int mtest_opponent(void)
|
|||||||
unsigned long expt_n, add_n, sub_n, mul_n, div_n, sqr_n, mul2d_n, div2d_n,
|
unsigned long expt_n, add_n, sub_n, mul_n, div_n, sqr_n, mul2d_n, div2d_n,
|
||||||
gcd_n, lcm_n, inv_n, div2_n, mul2_n, add_d_n, sub_d_n;
|
gcd_n, lcm_n, inv_n, div2_n, mul2_n, add_d_n, sub_d_n;
|
||||||
|
|
||||||
|
srand(LTM_MTEST_RAND_SEED);
|
||||||
|
|
||||||
if (mp_init_multi(&a, &b, &c, &d, &e, &f, NULL)!= MP_OKAY)
|
if (mp_init_multi(&a, &b, &c, &d, &e, &f, NULL)!= MP_OKAY)
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
|
|
||||||
|
@ -18,12 +18,6 @@
|
|||||||
#define LTM_DEMO_TEST_REDUCE_2K_L 0
|
#define LTM_DEMO_TEST_REDUCE_2K_L 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef LTM_DEMO_REAL_RAND
|
|
||||||
#define LTM_DEMO_RAND_SEED time(NULL)
|
|
||||||
#else
|
|
||||||
#define LTM_DEMO_RAND_SEED 23
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define MP_WUR /* TODO: result checks disabled for now */
|
#define MP_WUR /* TODO: result checks disabled for now */
|
||||||
#include "tommath.h"
|
#include "tommath.h"
|
||||||
|
|
||||||
|
62
demo/test.c
62
demo/test.c
@ -1,4 +1,25 @@
|
|||||||
#include "shared.h"
|
#include "shared.h"
|
||||||
|
#include "tommath_private.h"
|
||||||
|
|
||||||
|
static long rand_long(void)
|
||||||
|
{
|
||||||
|
long x;
|
||||||
|
if (s_mp_rand_source(&x, sizeof(x)) != MP_OKAY) {
|
||||||
|
fprintf(stderr, "s_mp_rand_source failed\n");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int rand_int(void)
|
||||||
|
{
|
||||||
|
int x;
|
||||||
|
if (s_mp_rand_source(&x, sizeof(x)) != MP_OKAY) {
|
||||||
|
fprintf(stderr, "s_mp_rand_source failed\n");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
static int test_trivial_stuff(void)
|
static int test_trivial_stuff(void)
|
||||||
{
|
{
|
||||||
@ -260,7 +281,7 @@ static int test_mp_complement(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < 1000; ++i) {
|
for (i = 0; i < 1000; ++i) {
|
||||||
long l = ((long)rand() * rand() + 1) * (rand() % 1 ? -1 : 1);
|
long l = rand_long();
|
||||||
mp_set_long(&a, (unsigned long)labs(l));
|
mp_set_long(&a, (unsigned long)labs(l));
|
||||||
if (l < 0)
|
if (l < 0)
|
||||||
mp_neg(&a, &a);
|
mp_neg(&a, &a);
|
||||||
@ -297,12 +318,12 @@ static int test_mp_tc_div_2d(void)
|
|||||||
long l;
|
long l;
|
||||||
int em;
|
int em;
|
||||||
|
|
||||||
l = ((long)rand() * rand() + 1) * (rand() % 1 ? -1 : 1);
|
l = rand_long();
|
||||||
mp_set_long(&a, (unsigned long)labs(l));
|
mp_set_long(&a, (unsigned long)labs(l));
|
||||||
if (l < 0)
|
if (l < 0)
|
||||||
mp_neg(&a, &a);
|
mp_neg(&a, &a);
|
||||||
|
|
||||||
em = rand() % 32;
|
em = abs(rand_int()) % 32;
|
||||||
|
|
||||||
mp_set_long(&d, (unsigned long)labs(l >> em));
|
mp_set_long(&d, (unsigned long)labs(l >> em));
|
||||||
if ((l >> em) < 0)
|
if ((l >> em) < 0)
|
||||||
@ -333,14 +354,14 @@ static int test_mp_tc_xor(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < 1000; ++i) {
|
for (i = 0; i < 1000; ++i) {
|
||||||
int l, em;
|
long l, em;
|
||||||
|
|
||||||
l = ((long)rand() * rand() + 1) * (rand() % 1 ? -1 : 1);
|
l = rand_long();
|
||||||
mp_set_int(&a, (unsigned long)labs(l));
|
mp_set_int(&a, (unsigned long)labs(l));
|
||||||
if (l < 0)
|
if (l < 0)
|
||||||
mp_neg(&a, &a);
|
mp_neg(&a, &a);
|
||||||
|
|
||||||
em = ((long)rand() * rand() + 1) * (rand() % 1 ? -1 : 1);
|
em = rand_long();
|
||||||
mp_set_int(&b, (unsigned long)labs(em));
|
mp_set_int(&b, (unsigned long)labs(em));
|
||||||
if (em < 0)
|
if (em < 0)
|
||||||
mp_neg(&b, &b);
|
mp_neg(&b, &b);
|
||||||
@ -376,12 +397,12 @@ static int test_mp_tc_or(void)
|
|||||||
for (i = 0; i < 1000; ++i) {
|
for (i = 0; i < 1000; ++i) {
|
||||||
long l, em;
|
long l, em;
|
||||||
|
|
||||||
l = ((long)rand() * rand() + 1) * (rand() % 1 ? -1 : 1);
|
l = rand_long();
|
||||||
mp_set_long(&a, (unsigned long)labs(l));
|
mp_set_long(&a, (unsigned long)labs(l));
|
||||||
if (l < 0)
|
if (l < 0)
|
||||||
mp_neg(&a, &a);
|
mp_neg(&a, &a);
|
||||||
|
|
||||||
em = ((long)rand() * rand() + 1) * (rand() % 1 ? -1 : 1);
|
em = rand_long();
|
||||||
mp_set_long(&b, (unsigned long)labs(em));
|
mp_set_long(&b, (unsigned long)labs(em));
|
||||||
if (em < 0)
|
if (em < 0)
|
||||||
mp_neg(&b, &b);
|
mp_neg(&b, &b);
|
||||||
@ -416,12 +437,12 @@ static int test_mp_tc_and(void)
|
|||||||
for (i = 0; i < 1000; ++i) {
|
for (i = 0; i < 1000; ++i) {
|
||||||
long l, em;
|
long l, em;
|
||||||
|
|
||||||
l = ((long)rand() * rand() + 1) * (rand() % 1 ? -1 : 1);
|
l = rand_long();
|
||||||
mp_set_long(&a, (unsigned long)labs(l));
|
mp_set_long(&a, (unsigned long)labs(l));
|
||||||
if (l < 0)
|
if (l < 0)
|
||||||
mp_neg(&a, &a);
|
mp_neg(&a, &a);
|
||||||
|
|
||||||
em = ((long)rand() * rand() + 1) * (rand() % 1 ? -1 : 1);
|
em = rand_long();
|
||||||
mp_set_long(&b, (unsigned long)labs(em));
|
mp_set_long(&b, (unsigned long)labs(em));
|
||||||
if (em < 0)
|
if (em < 0)
|
||||||
mp_neg(&b, &b);
|
mp_neg(&b, &b);
|
||||||
@ -518,8 +539,8 @@ static int test_mp_set_double(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < 1000; ++i) {
|
for (i = 0; i < 1000; ++i) {
|
||||||
int tmp = rand();
|
int tmp = rand_int();
|
||||||
double dbl = (double)tmp * rand() + 1;
|
double dbl = (double)tmp * rand_int() + 1;
|
||||||
if (mp_set_double(&a, dbl) != MP_OKAY) {
|
if (mp_set_double(&a, dbl) != MP_OKAY) {
|
||||||
printf("\nmp_set_double() failed");
|
printf("\nmp_set_double() failed");
|
||||||
goto LBL_ERR;
|
goto LBL_ERR;
|
||||||
@ -558,7 +579,7 @@ static int test_mp_get_int(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < 1000; ++i) {
|
for (i = 0; i < 1000; ++i) {
|
||||||
t = ((unsigned long)rand() * (unsigned long)rand() + 1uL) & 0xFFFFFFFFuL;
|
t = (unsigned long)rand_long() & 0xFFFFFFFFuL;
|
||||||
mp_set_int(&a, t);
|
mp_set_int(&a, t);
|
||||||
if (t != mp_get_int(&a)) {
|
if (t != mp_get_int(&a)) {
|
||||||
printf("\nmp_get_int() bad result!");
|
printf("\nmp_get_int() bad result!");
|
||||||
@ -662,7 +683,7 @@ static int test_mp_sqrt(void)
|
|||||||
for (i = 0; i < 1000; ++i) {
|
for (i = 0; i < 1000; ++i) {
|
||||||
printf("%6d\r", i);
|
printf("%6d\r", i);
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
n = (rand() & 15) + 1;
|
n = (rand_int() & 15) + 1;
|
||||||
mp_rand(&a, n);
|
mp_rand(&a, n);
|
||||||
if (mp_sqrt(&a, &b) != MP_OKAY) {
|
if (mp_sqrt(&a, &b) != MP_OKAY) {
|
||||||
printf("\nmp_sqrt() error!");
|
printf("\nmp_sqrt() error!");
|
||||||
@ -701,7 +722,7 @@ static int test_mp_is_square(void)
|
|||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
|
|
||||||
/* test mp_is_square false negatives */
|
/* test mp_is_square false negatives */
|
||||||
n = (rand() & 7) + 1;
|
n = (rand_int() & 7) + 1;
|
||||||
mp_rand(&a, n);
|
mp_rand(&a, n);
|
||||||
mp_sqr(&a, &a);
|
mp_sqr(&a, &a);
|
||||||
if (mp_is_square(&a, &n) != MP_OKAY) {
|
if (mp_is_square(&a, &n) != MP_OKAY) {
|
||||||
@ -789,7 +810,7 @@ static int test_mp_prime_rand(void)
|
|||||||
for (ix = 10; ix < 128; ix++) {
|
for (ix = 10; ix < 128; ix++) {
|
||||||
printf("Testing (not safe-prime): %9d bits \r", ix);
|
printf("Testing (not safe-prime): %9d bits \r", ix);
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
err = mp_prime_rand(&a, 8, ix, (rand() & 1) ? 0 : MP_PRIME_2MSB_ON);
|
err = mp_prime_rand(&a, 8, ix, (rand_int() & 1) ? 0 : MP_PRIME_2MSB_ON);
|
||||||
if (err != MP_OKAY) {
|
if (err != MP_OKAY) {
|
||||||
printf("\nfailed with error: %s\n", mp_error_to_string(err));
|
printf("\nfailed with error: %s\n", mp_error_to_string(err));
|
||||||
goto LBL_ERR;
|
goto LBL_ERR;
|
||||||
@ -850,7 +871,7 @@ static int test_mp_prime_is_prime(void)
|
|||||||
for (ix = 16; ix < 128; ix++) {
|
for (ix = 16; ix < 128; ix++) {
|
||||||
printf("Testing ( safe-prime): %9d bits \r", ix);
|
printf("Testing ( safe-prime): %9d bits \r", ix);
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
err = mp_prime_rand(&a, 8, ix, ((rand() & 1) ? 0 : MP_PRIME_2MSB_ON) | MP_PRIME_SAFE);
|
err = mp_prime_rand(&a, 8, ix, ((rand_int() & 1) ? 0 : MP_PRIME_2MSB_ON) | MP_PRIME_SAFE);
|
||||||
if (err != MP_OKAY) {
|
if (err != MP_OKAY) {
|
||||||
printf("\nfailed with error: %s\n", mp_error_to_string(err));
|
printf("\nfailed with error: %s\n", mp_error_to_string(err));
|
||||||
goto LBL_ERR;
|
goto LBL_ERR;
|
||||||
@ -941,7 +962,7 @@ static int test_mp_montgomery_reduce(void)
|
|||||||
|
|
||||||
/* now test a random reduction */
|
/* now test a random reduction */
|
||||||
for (ix = 0; ix < 100; ix++) {
|
for (ix = 0; ix < 100; ix++) {
|
||||||
mp_rand(&c, 1 + abs(rand()) % (2*i));
|
mp_rand(&c, 1 + abs(rand_int()) % (2*i));
|
||||||
mp_copy(&c, &d);
|
mp_copy(&c, &d);
|
||||||
mp_copy(&c, &e);
|
mp_copy(&c, &e);
|
||||||
|
|
||||||
@ -1096,7 +1117,7 @@ static int test_mp_div_3(void)
|
|||||||
printf("%9d\r", cnt);
|
printf("%9d\r", cnt);
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
}
|
}
|
||||||
mp_rand(&a, abs(rand()) % 128 + 1);
|
mp_rand(&a, abs(rand_int()) % 128 + 1);
|
||||||
mp_div(&a, &d, &b, &e);
|
mp_div(&a, &d, &b, &e);
|
||||||
mp_div_3(&a, &c, &r2);
|
mp_div_3(&a, &c, &r2);
|
||||||
|
|
||||||
@ -1853,6 +1874,9 @@ int unit_tests(int argc, char **argv)
|
|||||||
unsigned long i;
|
unsigned long i;
|
||||||
int res = EXIT_SUCCESS, j;
|
int res = EXIT_SUCCESS, j;
|
||||||
|
|
||||||
|
s_mp_rand_jenkins_init((uint64_t)time(NULL));
|
||||||
|
mp_rand_source(s_mp_rand_jenkins);
|
||||||
|
|
||||||
for (i = 0; i < sizeof(test) / sizeof(test[0]); ++i) {
|
for (i = 0; i < sizeof(test) / sizeof(test[0]); ++i) {
|
||||||
if (argc > 1) {
|
if (argc > 1) {
|
||||||
for (j = 1; j < argc; ++j) {
|
for (j = 1; j < argc; ++j) {
|
||||||
|
75
etc/tune.c
75
etc/tune.c
@ -10,15 +10,6 @@
|
|||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
static uint64_t s_ranval(void);
|
|
||||||
static void s_raninit(uint64_t seed);
|
|
||||||
static uint64_t s_timer_function(void);
|
|
||||||
static void s_timer_start(void);
|
|
||||||
static uint64_t s_timer_stop(void);
|
|
||||||
static uint64_t s_time_mul(int size);
|
|
||||||
static uint64_t s_time_sqr(int size);
|
|
||||||
static void s_usage(char *s);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Please take in mind that both multiplicands are of the same size. The balancing
|
Please take in mind that both multiplicands are of the same size. The balancing
|
||||||
mechanism in mp_balance works well but has some overhead itself. You can test
|
mechanism in mp_balance works well but has some overhead itself. You can test
|
||||||
@ -26,56 +17,12 @@ static void s_usage(char *s);
|
|||||||
to generate ratios of the form 1:x.
|
to generate ratios of the form 1:x.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Bob Jenkins' http://burtleburtle.net/bob/rand/smallprng.html */
|
static uint64_t s_timer_function(void);
|
||||||
/* Chosen for speed and a good "mix" */
|
static void s_timer_start(void);
|
||||||
typedef struct ranctx {
|
static uint64_t s_timer_stop(void);
|
||||||
uint64_t a;
|
static uint64_t s_time_mul(int size);
|
||||||
uint64_t b;
|
static uint64_t s_time_sqr(int size);
|
||||||
uint64_t c;
|
static void s_usage(char *s);
|
||||||
uint64_t d;
|
|
||||||
} ranctx;
|
|
||||||
|
|
||||||
static ranctx burtle_x;
|
|
||||||
|
|
||||||
# define rot(x,k) (((x)<<(k))|((x)>>(64-(k))))
|
|
||||||
static uint64_t s_ranval(void)
|
|
||||||
{
|
|
||||||
uint64_t e = burtle_x.a - rot(burtle_x.b, 7);
|
|
||||||
burtle_x.a = burtle_x.b ^ rot(burtle_x.c, 13);
|
|
||||||
burtle_x.b = burtle_x.c + rot(burtle_x.d, 37);
|
|
||||||
burtle_x.c = burtle_x.d + e;
|
|
||||||
burtle_x.d = e + burtle_x.a;
|
|
||||||
return burtle_x.d;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void s_raninit(uint64_t seed)
|
|
||||||
{
|
|
||||||
uint64_t i;
|
|
||||||
burtle_x.a = 0xf1ea5eed;
|
|
||||||
burtle_x.b = burtle_x.c = burtle_x.d = seed;
|
|
||||||
for (i = 0; i < 20; ++i) {
|
|
||||||
(void) s_ranval();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
The original used LTM's mp_rand which uses the cryptographically secure
|
|
||||||
source of the OS for its purpose. That is too expensive, too slow and
|
|
||||||
most important for a benchmark: it is not repeatable.
|
|
||||||
*/
|
|
||||||
static int s_ranbuf(void *p, size_t n)
|
|
||||||
{
|
|
||||||
char *q = (char *)p;
|
|
||||||
while (n > 0) {
|
|
||||||
int i;
|
|
||||||
uint64_t x = s_ranval();
|
|
||||||
for (i = 0; i < 8 && n > 0; ++i, --n) {
|
|
||||||
*q++ = (char)(x & 0xFF);
|
|
||||||
x >>= 8;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return MP_OKAY;
|
|
||||||
}
|
|
||||||
|
|
||||||
static uint64_t s_timer_function(void)
|
static uint64_t s_timer_function(void)
|
||||||
{
|
{
|
||||||
@ -263,8 +210,6 @@ int main(int argc, char **argv)
|
|||||||
s_number_of_test_loops = 64;
|
s_number_of_test_loops = 64;
|
||||||
s_stabilization_extra = 3;
|
s_stabilization_extra = 3;
|
||||||
|
|
||||||
mp_rand_source(s_ranbuf);
|
|
||||||
|
|
||||||
/* Very simple option parser, please treat it nicely. */
|
/* Very simple option parser, please treat it nicely. */
|
||||||
if (argc != 1) {
|
if (argc != 1) {
|
||||||
for (opt = 1; (opt < argc) && (argv[opt][0] == '-'); opt++) {
|
for (opt = 1; (opt < argc) && (argv[opt][0] == '-'); opt++) {
|
||||||
@ -504,7 +449,13 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
s_raninit(seed);
|
/*
|
||||||
|
mp_rand uses the cryptographically secure
|
||||||
|
source of the OS by default. That is too expensive, too slow and
|
||||||
|
most important for a benchmark: it is not repeatable.
|
||||||
|
*/
|
||||||
|
s_mp_rand_jenkins_init(seed);
|
||||||
|
mp_rand_source(s_mp_rand_jenkins);
|
||||||
|
|
||||||
ksm = KARATSUBA_MUL_CUTOFF;
|
ksm = KARATSUBA_MUL_CUTOFF;
|
||||||
kss = KARATSUBA_SQR_CUTOFF;
|
kss = KARATSUBA_SQR_CUTOFF;
|
||||||
|
@ -873,7 +873,11 @@
|
|||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="bn_s_mp_rand_source_platform.c"
|
RelativePath="bn_s_mp_rand_jenkins.c"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="bn_s_mp_rand_platform.c"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
|
4
makefile
4
makefile
@ -52,8 +52,8 @@ bn_mp_toradix.o bn_mp_toradix_n.o bn_mp_unsigned_bin_size.o bn_mp_xor.o bn_mp_ze
|
|||||||
bn_s_mp_add.o bn_s_mp_balance_mul.o bn_s_mp_exptmod.o bn_s_mp_exptmod_fast.o bn_s_mp_invmod_fast.o \
|
bn_s_mp_add.o bn_s_mp_balance_mul.o bn_s_mp_exptmod.o bn_s_mp_exptmod_fast.o bn_s_mp_invmod_fast.o \
|
||||||
bn_s_mp_invmod_slow.o bn_s_mp_karatsuba_mul.o bn_s_mp_karatsuba_sqr.o bn_s_mp_montgomery_reduce_fast.o \
|
bn_s_mp_invmod_slow.o bn_s_mp_karatsuba_mul.o bn_s_mp_karatsuba_sqr.o bn_s_mp_montgomery_reduce_fast.o \
|
||||||
bn_s_mp_mul_digs.o bn_s_mp_mul_digs_fast.o bn_s_mp_mul_high_digs.o bn_s_mp_mul_high_digs_fast.o \
|
bn_s_mp_mul_digs.o bn_s_mp_mul_digs_fast.o bn_s_mp_mul_high_digs.o bn_s_mp_mul_high_digs_fast.o \
|
||||||
bn_s_mp_rand_source_platform.o bn_s_mp_reverse.o bn_s_mp_sqr.o bn_s_mp_sqr_fast.o bn_s_mp_sub.o \
|
bn_s_mp_rand_jenkins.o bn_s_mp_rand_platform.o bn_s_mp_reverse.o bn_s_mp_sqr.o bn_s_mp_sqr_fast.o \
|
||||||
bn_s_mp_toom_mul.o bn_s_mp_toom_sqr.o
|
bn_s_mp_sub.o bn_s_mp_toom_mul.o bn_s_mp_toom_sqr.o
|
||||||
|
|
||||||
#END_INS
|
#END_INS
|
||||||
|
|
||||||
|
@ -55,8 +55,8 @@ bn_mp_toradix.o bn_mp_toradix_n.o bn_mp_unsigned_bin_size.o bn_mp_xor.o bn_mp_ze
|
|||||||
bn_s_mp_add.o bn_s_mp_balance_mul.o bn_s_mp_exptmod.o bn_s_mp_exptmod_fast.o bn_s_mp_invmod_fast.o \
|
bn_s_mp_add.o bn_s_mp_balance_mul.o bn_s_mp_exptmod.o bn_s_mp_exptmod_fast.o bn_s_mp_invmod_fast.o \
|
||||||
bn_s_mp_invmod_slow.o bn_s_mp_karatsuba_mul.o bn_s_mp_karatsuba_sqr.o bn_s_mp_montgomery_reduce_fast.o \
|
bn_s_mp_invmod_slow.o bn_s_mp_karatsuba_mul.o bn_s_mp_karatsuba_sqr.o bn_s_mp_montgomery_reduce_fast.o \
|
||||||
bn_s_mp_mul_digs.o bn_s_mp_mul_digs_fast.o bn_s_mp_mul_high_digs.o bn_s_mp_mul_high_digs_fast.o \
|
bn_s_mp_mul_digs.o bn_s_mp_mul_digs_fast.o bn_s_mp_mul_high_digs.o bn_s_mp_mul_high_digs_fast.o \
|
||||||
bn_s_mp_rand_source_platform.o bn_s_mp_reverse.o bn_s_mp_sqr.o bn_s_mp_sqr_fast.o bn_s_mp_sub.o \
|
bn_s_mp_rand_jenkins.o bn_s_mp_rand_platform.o bn_s_mp_reverse.o bn_s_mp_sqr.o bn_s_mp_sqr_fast.o \
|
||||||
bn_s_mp_toom_mul.o bn_s_mp_toom_sqr.o
|
bn_s_mp_sub.o bn_s_mp_toom_mul.o bn_s_mp_toom_sqr.o
|
||||||
|
|
||||||
HEADERS_PUB=tommath.h tommath_class.h tommath_superclass.h
|
HEADERS_PUB=tommath.h tommath_class.h tommath_superclass.h
|
||||||
|
|
||||||
|
@ -47,8 +47,8 @@ bn_mp_toradix.obj bn_mp_toradix_n.obj bn_mp_unsigned_bin_size.obj bn_mp_xor.obj
|
|||||||
bn_s_mp_add.obj bn_s_mp_balance_mul.obj bn_s_mp_exptmod.obj bn_s_mp_exptmod_fast.obj bn_s_mp_invmod_fast.obj \
|
bn_s_mp_add.obj bn_s_mp_balance_mul.obj bn_s_mp_exptmod.obj bn_s_mp_exptmod_fast.obj bn_s_mp_invmod_fast.obj \
|
||||||
bn_s_mp_invmod_slow.obj bn_s_mp_karatsuba_mul.obj bn_s_mp_karatsuba_sqr.obj bn_s_mp_montgomery_reduce_fast.obj \
|
bn_s_mp_invmod_slow.obj bn_s_mp_karatsuba_mul.obj bn_s_mp_karatsuba_sqr.obj bn_s_mp_montgomery_reduce_fast.obj \
|
||||||
bn_s_mp_mul_digs.obj bn_s_mp_mul_digs_fast.obj bn_s_mp_mul_high_digs.obj bn_s_mp_mul_high_digs_fast.obj \
|
bn_s_mp_mul_digs.obj bn_s_mp_mul_digs_fast.obj bn_s_mp_mul_high_digs.obj bn_s_mp_mul_high_digs_fast.obj \
|
||||||
bn_s_mp_rand_source_platform.obj bn_s_mp_reverse.obj bn_s_mp_sqr.obj bn_s_mp_sqr_fast.obj bn_s_mp_sub.obj \
|
bn_s_mp_rand_jenkins.obj bn_s_mp_rand_platform.obj bn_s_mp_reverse.obj bn_s_mp_sqr.obj bn_s_mp_sqr_fast.obj \
|
||||||
bn_s_mp_toom_mul.obj bn_s_mp_toom_sqr.obj
|
bn_s_mp_sub.obj bn_s_mp_toom_mul.obj bn_s_mp_toom_sqr.obj
|
||||||
|
|
||||||
HEADERS_PUB=tommath.h tommath_class.h tommath_superclass.h
|
HEADERS_PUB=tommath.h tommath_class.h tommath_superclass.h
|
||||||
|
|
||||||
|
@ -49,8 +49,8 @@ bn_mp_toradix.o bn_mp_toradix_n.o bn_mp_unsigned_bin_size.o bn_mp_xor.o bn_mp_ze
|
|||||||
bn_s_mp_add.o bn_s_mp_balance_mul.o bn_s_mp_exptmod.o bn_s_mp_exptmod_fast.o bn_s_mp_invmod_fast.o \
|
bn_s_mp_add.o bn_s_mp_balance_mul.o bn_s_mp_exptmod.o bn_s_mp_exptmod_fast.o bn_s_mp_invmod_fast.o \
|
||||||
bn_s_mp_invmod_slow.o bn_s_mp_karatsuba_mul.o bn_s_mp_karatsuba_sqr.o bn_s_mp_montgomery_reduce_fast.o \
|
bn_s_mp_invmod_slow.o bn_s_mp_karatsuba_mul.o bn_s_mp_karatsuba_sqr.o bn_s_mp_montgomery_reduce_fast.o \
|
||||||
bn_s_mp_mul_digs.o bn_s_mp_mul_digs_fast.o bn_s_mp_mul_high_digs.o bn_s_mp_mul_high_digs_fast.o \
|
bn_s_mp_mul_digs.o bn_s_mp_mul_digs_fast.o bn_s_mp_mul_high_digs.o bn_s_mp_mul_high_digs_fast.o \
|
||||||
bn_s_mp_rand_source_platform.o bn_s_mp_reverse.o bn_s_mp_sqr.o bn_s_mp_sqr_fast.o bn_s_mp_sub.o \
|
bn_s_mp_rand_jenkins.o bn_s_mp_rand_platform.o bn_s_mp_reverse.o bn_s_mp_sqr.o bn_s_mp_sqr_fast.o \
|
||||||
bn_s_mp_toom_mul.o bn_s_mp_toom_sqr.o
|
bn_s_mp_sub.o bn_s_mp_toom_mul.o bn_s_mp_toom_sqr.o
|
||||||
|
|
||||||
#END_INS
|
#END_INS
|
||||||
|
|
||||||
|
@ -56,8 +56,8 @@ bn_mp_toradix.o bn_mp_toradix_n.o bn_mp_unsigned_bin_size.o bn_mp_xor.o bn_mp_ze
|
|||||||
bn_s_mp_add.o bn_s_mp_balance_mul.o bn_s_mp_exptmod.o bn_s_mp_exptmod_fast.o bn_s_mp_invmod_fast.o \
|
bn_s_mp_add.o bn_s_mp_balance_mul.o bn_s_mp_exptmod.o bn_s_mp_exptmod_fast.o bn_s_mp_invmod_fast.o \
|
||||||
bn_s_mp_invmod_slow.o bn_s_mp_karatsuba_mul.o bn_s_mp_karatsuba_sqr.o bn_s_mp_montgomery_reduce_fast.o \
|
bn_s_mp_invmod_slow.o bn_s_mp_karatsuba_mul.o bn_s_mp_karatsuba_sqr.o bn_s_mp_montgomery_reduce_fast.o \
|
||||||
bn_s_mp_mul_digs.o bn_s_mp_mul_digs_fast.o bn_s_mp_mul_high_digs.o bn_s_mp_mul_high_digs_fast.o \
|
bn_s_mp_mul_digs.o bn_s_mp_mul_digs_fast.o bn_s_mp_mul_high_digs.o bn_s_mp_mul_high_digs_fast.o \
|
||||||
bn_s_mp_rand_source_platform.o bn_s_mp_reverse.o bn_s_mp_sqr.o bn_s_mp_sqr_fast.o bn_s_mp_sub.o \
|
bn_s_mp_rand_jenkins.o bn_s_mp_rand_platform.o bn_s_mp_reverse.o bn_s_mp_sqr.o bn_s_mp_sqr_fast.o \
|
||||||
bn_s_mp_toom_mul.o bn_s_mp_toom_sqr.o
|
bn_s_mp_sub.o bn_s_mp_toom_mul.o bn_s_mp_toom_sqr.o
|
||||||
|
|
||||||
HEADERS_PUB=tommath.h tommath_class.h tommath_superclass.h
|
HEADERS_PUB=tommath.h tommath_class.h tommath_superclass.h
|
||||||
|
|
||||||
|
@ -150,7 +150,8 @@
|
|||||||
# define BN_S_MP_MUL_DIGS_FAST_C
|
# define BN_S_MP_MUL_DIGS_FAST_C
|
||||||
# define BN_S_MP_MUL_HIGH_DIGS_C
|
# define BN_S_MP_MUL_HIGH_DIGS_C
|
||||||
# define BN_S_MP_MUL_HIGH_DIGS_FAST_C
|
# define BN_S_MP_MUL_HIGH_DIGS_FAST_C
|
||||||
# define BN_S_MP_RAND_SOURCE_PLATFORM_C
|
# define BN_S_MP_RAND_JENKINS_C
|
||||||
|
# define BN_S_MP_RAND_PLATFORM_C
|
||||||
# define BN_S_MP_REVERSE_C
|
# define BN_S_MP_REVERSE_C
|
||||||
# define BN_S_MP_SQR_C
|
# define BN_S_MP_SQR_C
|
||||||
# define BN_S_MP_SQR_FAST_C
|
# define BN_S_MP_SQR_FAST_C
|
||||||
@ -1173,7 +1174,11 @@
|
|||||||
# define BN_MP_CLAMP_C
|
# define BN_MP_CLAMP_C
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(BN_S_MP_RAND_SOURCE_PLATFORM_C)
|
#if defined(BN_S_MP_RAND_JENKINS_C)
|
||||||
|
# define BN_S_MP_RAND_JENKINS_INIT_C
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(BN_S_MP_RAND_PLATFORM_C)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(BN_S_MP_REVERSE_C)
|
#if defined(BN_S_MP_REVERSE_C)
|
||||||
|
@ -130,9 +130,13 @@ MP_WUR int s_mp_invmod_slow(const mp_int *a, const mp_int *b, mp_int *c);
|
|||||||
MP_WUR int s_mp_montgomery_reduce_fast(mp_int *x, const mp_int *n, mp_digit rho);
|
MP_WUR int s_mp_montgomery_reduce_fast(mp_int *x, const mp_int *n, mp_digit rho);
|
||||||
MP_WUR int s_mp_exptmod_fast(const mp_int *G, const mp_int *X, const mp_int *P, mp_int *Y, int redmode);
|
MP_WUR int s_mp_exptmod_fast(const mp_int *G, const mp_int *X, const mp_int *P, mp_int *Y, int redmode);
|
||||||
MP_WUR int s_mp_exptmod(const mp_int *G, const mp_int *X, const mp_int *P, mp_int *Y, int redmode);
|
MP_WUR int s_mp_exptmod(const mp_int *G, const mp_int *X, const mp_int *P, mp_int *Y, int redmode);
|
||||||
MP_WUR int s_mp_rand_source_platform(void *p, size_t n);
|
MP_WUR int s_mp_rand_platform(void *p, size_t n);
|
||||||
void s_mp_reverse(unsigned char *s, int len);
|
void s_mp_reverse(unsigned char *s, int len);
|
||||||
|
|
||||||
|
/* TODO: jenkins prng is not thread safe as of now */
|
||||||
|
MP_WUR int s_mp_rand_jenkins(void *p, size_t n);
|
||||||
|
void s_mp_rand_jenkins_init(uint64_t);
|
||||||
|
|
||||||
extern const char *const mp_s_rmap;
|
extern const char *const mp_s_rmap;
|
||||||
extern const uint8_t mp_s_rmap_reverse[];
|
extern const uint8_t mp_s_rmap_reverse[];
|
||||||
extern const size_t mp_s_rmap_reverse_sz;
|
extern const size_t mp_s_rmap_reverse_sz;
|
||||||
|
Loading…
Reference in New Issue
Block a user