version 1.20, 2007/02/24 03:30:11 |
version 1.21, 2008/06/26 09:19:40 |
|
|
#include <sys/types.h> |
#include <sys/types.h> |
|
|
#include <openssl/bn.h> |
#include <openssl/bn.h> |
|
#include <openssl/dh.h> |
|
|
#include <stdio.h> |
#include <stdio.h> |
#include <stdlib.h> |
#include <stdlib.h> |
|
|
#include <time.h> |
#include <time.h> |
|
|
#include "xmalloc.h" |
#include "xmalloc.h" |
|
#include "dh.h" |
#include "log.h" |
#include "log.h" |
|
|
/* |
/* |
|
|
/* need line long enough for largest moduli plus headers */ |
/* need line long enough for largest moduli plus headers */ |
#define QLINESIZE (100+8192) |
#define QLINESIZE (100+8192) |
|
|
/* Type: decimal. |
|
* Specifies the internal structure of the prime modulus. |
|
*/ |
|
#define QTYPE_UNKNOWN (0) |
|
#define QTYPE_UNSTRUCTURED (1) |
|
#define QTYPE_SAFE (2) |
|
#define QTYPE_SCHNORR (3) |
|
#define QTYPE_SOPHIE_GERMAIN (4) |
|
#define QTYPE_STRONG (5) |
|
|
|
/* Tests: decimal (bit field). |
|
* Specifies the methods used in checking for primality. |
|
* Usually, more than one test is used. |
|
*/ |
|
#define QTEST_UNTESTED (0x00) |
|
#define QTEST_COMPOSITE (0x01) |
|
#define QTEST_SIEVE (0x02) |
|
#define QTEST_MILLER_RABIN (0x04) |
|
#define QTEST_JACOBI (0x08) |
|
#define QTEST_ELLIPTIC (0x10) |
|
|
|
/* |
/* |
* Size: decimal. |
* Size: decimal. |
* Specifies the number of the most significant bit (0 to M). |
* Specifies the number of the most significant bit (0 to M). |
|
|
fatal("BN_set_word failed"); |
fatal("BN_set_word failed"); |
if (BN_add(q, q, largebase) == 0) |
if (BN_add(q, q, largebase) == 0) |
fatal("BN_add failed"); |
fatal("BN_add failed"); |
if (qfileout(out, QTYPE_SOPHIE_GERMAIN, QTEST_SIEVE, |
if (qfileout(out, MODULI_TYPE_SOPHIE_GERMAIN, |
largetries, (power - 1) /* MSB */, (0), q) == -1) { |
MODULI_TESTS_SIEVE, largetries, |
|
(power - 1) /* MSB */, (0), q) == -1) { |
ret = -1; |
ret = -1; |
break; |
break; |
} |
} |
|
|
/* tests */ |
/* tests */ |
in_tests = strtoul(cp, &cp, 10); |
in_tests = strtoul(cp, &cp, 10); |
|
|
if (in_tests & QTEST_COMPOSITE) { |
if (in_tests & MODULI_TESTS_COMPOSITE) { |
debug2("%10u: known composite", count_in); |
debug2("%10u: known composite", count_in); |
continue; |
continue; |
} |
} |
|
|
|
|
/* modulus (hex) */ |
/* modulus (hex) */ |
switch (in_type) { |
switch (in_type) { |
case QTYPE_SOPHIE_GERMAIN: |
case MODULI_TYPE_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) |
if (BN_hex2bn(&a, cp) == 0) |
|
|
in_size += 1; |
in_size += 1; |
generator_known = 0; |
generator_known = 0; |
break; |
break; |
case QTYPE_UNSTRUCTURED: |
case MODULI_TYPE_UNSTRUCTURED: |
case QTYPE_SAFE: |
case MODULI_TYPE_SAFE: |
case QTYPE_SCHNORR: |
case MODULI_TYPE_SCHNORR: |
case QTYPE_STRONG: |
case MODULI_TYPE_STRONG: |
case QTYPE_UNKNOWN: |
case MODULI_TYPE_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) |
if (BN_hex2bn(&a, cp) == 0) |
|
|
continue; |
continue; |
} |
} |
|
|
if (in_tests & QTEST_MILLER_RABIN) |
if (in_tests & MODULI_TESTS_MILLER_RABIN) |
in_tries += trials; |
in_tries += trials; |
else |
else |
in_tries = trials; |
in_tries = trials; |
|
|
} |
} |
debug("%10u: q is almost certainly prime", count_in); |
debug("%10u: q is almost certainly prime", count_in); |
|
|
if (qfileout(out, QTYPE_SAFE, (in_tests | QTEST_MILLER_RABIN), |
if (qfileout(out, MODULI_TYPE_SAFE, |
|
in_tests | MODULI_TESTS_MILLER_RABIN, |
in_tries, in_size, generator_known, p)) { |
in_tries, in_size, generator_known, p)) { |
res = -1; |
res = -1; |
break; |
break; |