version 1.63, 2018/02/07 02:06:50 |
version 1.64, 2018/06/06 18:29:18 |
|
|
choose_dh(int min, int wantbits, int max) |
choose_dh(int min, int wantbits, int max) |
{ |
{ |
FILE *f; |
FILE *f; |
char line[4096]; |
char *line = NULL; |
int best, bestcount, which; |
size_t linesize = 0; |
int linenum; |
int best, bestcount, which, linenum; |
struct dhgroup dhg; |
struct dhgroup dhg; |
|
|
if ((f = fopen(_PATH_DH_MODULI, "r")) == NULL) { |
if ((f = fopen(_PATH_DH_MODULI, "r")) == NULL) { |
|
|
|
|
linenum = 0; |
linenum = 0; |
best = bestcount = 0; |
best = bestcount = 0; |
while (fgets(line, sizeof(line), f)) { |
while (getline(&line, &linesize, f) != -1) { |
linenum++; |
linenum++; |
if (!parse_prime(linenum, line, &dhg)) |
if (!parse_prime(linenum, line, &dhg)) |
continue; |
continue; |
|
|
if (dhg.size == best) |
if (dhg.size == best) |
bestcount++; |
bestcount++; |
} |
} |
|
free(line); |
|
line = NULL; |
|
linesize = 0; |
rewind(f); |
rewind(f); |
|
|
if (bestcount == 0) { |
if (bestcount == 0) { |
|
|
|
|
linenum = 0; |
linenum = 0; |
which = arc4random_uniform(bestcount); |
which = arc4random_uniform(bestcount); |
while (fgets(line, sizeof(line), f)) { |
while (getline(&line, &linesize, f) != -1) { |
|
linenum++; |
if (!parse_prime(linenum, line, &dhg)) |
if (!parse_prime(linenum, line, &dhg)) |
continue; |
continue; |
if ((dhg.size > max || dhg.size < min) || |
if ((dhg.size > max || dhg.size < min) || |
|
|
} |
} |
break; |
break; |
} |
} |
|
free(line); |
|
line = NULL; |
fclose(f); |
fclose(f); |
if (linenum != which+1) { |
if (linenum != which+1) { |
logit("WARNING: line %d disappeared in %s, giving up", |
logit("WARNING: line %d disappeared in %s, giving up", |