version 1.14, 2001/04/15 08:43:45 |
version 1.14.2.2, 2002/03/09 00:20:44 |
|
|
#include "log.h" |
#include "log.h" |
#include "misc.h" |
#include "misc.h" |
|
|
int |
static int |
parse_prime(int linenum, char *line, struct dhgroup *dhg) |
parse_prime(int linenum, char *line, struct dhgroup *dhg) |
{ |
{ |
char *cp, *arg; |
char *cp, *arg; |
|
|
if (cp != NULL || *prime == '\0') |
if (cp != NULL || *prime == '\0') |
goto fail; |
goto fail; |
|
|
dhg->g = BN_new(); |
if ((dhg->g = BN_new()) == NULL) |
dhg->p = BN_new(); |
fatal("parse_prime: BN_new failed"); |
|
if ((dhg->p = BN_new()) == NULL) |
|
fatal("parse_prime: BN_new failed"); |
if (BN_hex2bn(&dhg->g, gen) == 0) |
if (BN_hex2bn(&dhg->g, gen) == 0) |
goto failclean; |
goto failclean; |
|
|
|
|
return (1); |
return (1); |
|
|
failclean: |
failclean: |
BN_free(dhg->g); |
BN_clear_free(dhg->g); |
BN_free(dhg->p); |
BN_clear_free(dhg->p); |
fail: |
fail: |
error("Bad prime description in line %d", linenum); |
error("Bad prime description in line %d", linenum); |
return (0); |
return (0); |
|
|
choose_dh(int min, int wantbits, int max) |
choose_dh(int min, int wantbits, int max) |
{ |
{ |
FILE *f; |
FILE *f; |
char line[1024]; |
char line[2048]; |
int best, bestcount, which; |
int best, bestcount, which; |
int linenum; |
int linenum; |
struct dhgroup dhg; |
struct dhgroup dhg; |
|
|
f = fopen(_PATH_DH_PRIMES, "r"); |
if ((f = fopen(_PATH_DH_MODULI, "r")) == NULL && |
if (!f) { |
(f = fopen(_PATH_DH_PRIMES, "r")) == NULL) { |
log("WARNING: %s does not exist, using old prime", _PATH_DH_PRIMES); |
log("WARNING: %s does not exist, using old modulus", _PATH_DH_MODULI); |
return (dh_new_group1()); |
return (dh_new_group1()); |
} |
} |
|
|
|
|
linenum++; |
linenum++; |
if (!parse_prime(linenum, line, &dhg)) |
if (!parse_prime(linenum, line, &dhg)) |
continue; |
continue; |
BN_free(dhg.g); |
BN_clear_free(dhg.g); |
BN_free(dhg.p); |
BN_clear_free(dhg.p); |
|
|
if (dhg.size > max || dhg.size < min) |
if (dhg.size > max || dhg.size < min) |
continue; |
continue; |
|
|
if (dhg.size == best) |
if (dhg.size == best) |
bestcount++; |
bestcount++; |
} |
} |
fclose (f); |
rewind(f); |
|
|
if (bestcount == 0) { |
if (bestcount == 0) { |
|
fclose(f); |
log("WARNING: no suitable primes in %s", _PATH_DH_PRIMES); |
log("WARNING: no suitable primes in %s", _PATH_DH_PRIMES); |
return (NULL); |
return (NULL); |
} |
} |
|
|
f = fopen(_PATH_DH_PRIMES, "r"); |
|
if (!f) { |
|
fatal("WARNING: %s disappeared, giving up", _PATH_DH_PRIMES); |
|
} |
|
|
|
linenum = 0; |
linenum = 0; |
which = arc4random() % bestcount; |
which = arc4random() % bestcount; |
while (fgets(line, sizeof(line), f)) { |
while (fgets(line, sizeof(line), f)) { |
|
|
if ((dhg.size > max || dhg.size < min) || |
if ((dhg.size > max || dhg.size < min) || |
dhg.size != best || |
dhg.size != best || |
linenum++ != which) { |
linenum++ != which) { |
BN_free(dhg.g); |
BN_clear_free(dhg.g); |
BN_free(dhg.p); |
BN_clear_free(dhg.p); |
continue; |
continue; |
} |
} |
break; |
break; |
|
|
BN_num_bits(dh->p), 2*need); |
BN_num_bits(dh->p), 2*need); |
do { |
do { |
if (dh->priv_key != NULL) |
if (dh->priv_key != NULL) |
BN_free(dh->priv_key); |
BN_clear_free(dh->priv_key); |
dh->priv_key = BN_new(); |
if ((dh->priv_key = BN_new()) == NULL) |
if (dh->priv_key == NULL) |
|
fatal("dh_gen_key: BN_new failed"); |
fatal("dh_gen_key: BN_new failed"); |
/* generate a 2*need bits random private exponent */ |
/* generate a 2*need bits random private exponent */ |
if (!BN_rand(dh->priv_key, 2*need, 0, 0)) |
if (!BN_rand(dh->priv_key, 2*need, 0, 0)) |
|
|
{ |
{ |
DH *dh; |
DH *dh; |
|
|
dh = DH_new(); |
if ((dh = DH_new()) == NULL) |
if (dh == NULL) |
fatal("dh_new_group_asc: DH_new"); |
fatal("DH_new"); |
|
|
|
if (BN_hex2bn(&dh->p, modulus) == 0) |
if (BN_hex2bn(&dh->p, modulus) == 0) |
fatal("BN_hex2bn p"); |
fatal("BN_hex2bn p"); |
|
|
{ |
{ |
DH *dh; |
DH *dh; |
|
|
dh = DH_new(); |
if ((dh = DH_new()) == NULL) |
if (dh == NULL) |
fatal("dh_new_group: DH_new"); |
fatal("DH_new"); |
|
dh->p = modulus; |
dh->p = modulus; |
dh->g = gen; |
dh->g = gen; |
|
|