version 1.12.2.2, 2006/11/08 00:44:05 |
version 1.13, 2006/03/25 00:05:41 |
|
|
* Second step: test primes' safety (processor intensive) |
* Second step: test primes' safety (processor intensive) |
*/ |
*/ |
|
|
#include <sys/types.h> |
#include "includes.h" |
|
|
#include <openssl/bn.h> |
|
|
|
#include <stdio.h> |
|
#include <stdlib.h> |
|
#include <string.h> |
|
#include <stdarg.h> |
|
#include <time.h> |
|
|
|
#include "xmalloc.h" |
#include "xmalloc.h" |
#include "log.h" |
#include "log.h" |
|
|
|
#include <openssl/bn.h> |
|
|
/* |
/* |
* File output defines |
* File output defines |
*/ |
*/ |
|
|
|
|
/* validation check: count the number of primes tried */ |
/* validation check: count the number of primes tried */ |
largetries = 0; |
largetries = 0; |
if ((q = BN_new()) == NULL) |
q = BN_new(); |
fatal("BN_new failed"); |
|
|
|
/* |
/* |
* Generate random starting point for subprime search, or use |
* Generate random starting point for subprime search, or use |
* specified parameter. |
* specified parameter. |
*/ |
*/ |
if ((largebase = BN_new()) == NULL) |
largebase = BN_new(); |
fatal("BN_new failed"); |
if (start == NULL) |
if (start == NULL) { |
BN_rand(largebase, power, 1, 1); |
if (BN_rand(largebase, power, 1, 1) == 0) |
else |
fatal("BN_rand failed"); |
BN_copy(largebase, start); |
} else { |
|
if (BN_copy(largebase, start) == NULL) |
|
fatal("BN_copy: failed"); |
|
} |
|
|
|
/* ensure odd */ |
/* ensure odd */ |
if (BN_set_bit(largebase, 0) == 0) |
BN_set_bit(largebase, 0); |
fatal("BN_set_bit: failed"); |
|
|
|
time(&time_start); |
time(&time_start); |
|
|
|
|
continue; /* Definitely composite, skip */ |
continue; /* Definitely composite, skip */ |
|
|
debug2("test q = largebase+%u", 2 * j); |
debug2("test q = largebase+%u", 2 * j); |
if (BN_set_word(q, 2 * j) == 0) |
BN_set_word(q, 2 * j); |
fatal("BN_set_word failed"); |
BN_add(q, q, largebase); |
if (BN_add(q, q, largebase) == 0) |
|
fatal("BN_add failed"); |
|
if (qfileout(out, QTYPE_SOPHIE_GERMAIN, QTEST_SIEVE, |
if (qfileout(out, QTYPE_SOPHIE_GERMAIN, QTEST_SIEVE, |
largetries, (power - 1) /* MSB */, (0), q) == -1) { |
largetries, (power - 1) /* MSB */, (0), q) == -1) { |
ret = -1; |
ret = -1; |
|
|
|
|
time(&time_start); |
time(&time_start); |
|
|
if ((p = BN_new()) == NULL) |
p = BN_new(); |
fatal("BN_new failed"); |
q = BN_new(); |
if ((q = BN_new()) == NULL) |
ctx = BN_CTX_new(); |
fatal("BN_new failed"); |
|
if ((ctx = BN_CTX_new()) == NULL) |
|
fatal("BN_CTX_new failed"); |
|
|
|
debug2("%.24s Final %u Miller-Rabin trials (%x generator)", |
debug2("%.24s Final %u Miller-Rabin trials (%x generator)", |
ctime(&time_start), trials, generator_wanted); |
ctime(&time_start), trials, generator_wanted); |
|
|
case QTYPE_SOPHIE_GERMAIN: |
case QTYPE_SOPHIE_GERMAIN: |
debug2("%10u: (%u) Sophie-Germain", count_in, in_type); |
debug2("%10u: (%u) Sophie-Germain", count_in, in_type); |
a = q; |
a = q; |
if (BN_hex2bn(&a, cp) == 0) |
BN_hex2bn(&a, cp); |
fatal("BN_hex2bn failed"); |
|
/* p = 2*q + 1 */ |
/* p = 2*q + 1 */ |
if (BN_lshift(p, q, 1) == 0) |
BN_lshift(p, q, 1); |
fatal("BN_lshift failed"); |
BN_add_word(p, 1); |
if (BN_add_word(p, 1) == 0) |
|
fatal("BN_add_word failed"); |
|
in_size += 1; |
in_size += 1; |
generator_known = 0; |
generator_known = 0; |
break; |
break; |
|
|
case QTYPE_UNKNOWN: |
case QTYPE_UNKNOWN: |
debug2("%10u: (%u)", count_in, in_type); |
debug2("%10u: (%u)", count_in, in_type); |
a = p; |
a = p; |
if (BN_hex2bn(&a, cp) == 0) |
BN_hex2bn(&a, cp); |
fatal("BN_hex2bn failed"); |
|
/* q = (p-1) / 2 */ |
/* q = (p-1) / 2 */ |
if (BN_rshift(q, p, 1) == 0) |
BN_rshift(q, p, 1); |
fatal("BN_rshift failed"); |
|
break; |
break; |
default: |
default: |
debug2("Unknown prime type"); |
debug2("Unknown prime type"); |