/*----- Global state ------------------------------------------------------*/
static unsigned min = 0, max = 256; /* Word length bounds */
-static unsigned bits = 128; /* Minimum acceptable entropy */
+static unsigned minbits = 128, maxbits = UINT_MAX; /* Acceptable entropy */
static unsigned count = 1; /* How many passphrases to make */
static const char wchars[] = "abcdefghijklmnopqrstuvwxyz'";
static void usage(FILE *fp)
{
pquis(fp, "\
-Usage: $ [-p] [-b BITS] [-g GEN] [-n COUNT] [-r [MIN-]MAX] WORDLIST...\n\
+Usage: $ [-p] [-b MIN[-MAX]] [-g GEN] [-n COUNT]\n\
+\t[-r [MIN-]MAX] WORDLIST...\n \
");
}
-h, --help Show this help text.\n\
-v, --version Show the program's version number.\n\
-u, --usage Show a terse usage summary.\n\
--b, --bits=BITS Produce at least BITS bits of entropy.\n\
+-b, --bits=MIN[-MAX] Minimum and maximum bits of entropy.\n\
-g, --generator=GEN Use passphrase generator GEN.\n\
-n, --count=COUNT Generate COUNT passphrases.\n\
-p, --probability Show -log_2 of probability for each phrase.\n\
exit(0);
case 'b': {
char *p;
- unsigned long n = strtoul(optarg, &p, 0);
- if (*p)
- die(EXIT_FAILURE, "bad integer `%s'", optarg);
- bits = n;
+ minbits = strtoul(optarg, &p, 0);
+ if (*p == '-')
+ maxbits = strtoul(p + 1, &p, 0);
+ else
+ maxbits = UINT_MAX;
+ if (*p || minbits > maxbits)
+ die(EXIT_FAILURE, "bad entropy range `%s'", optarg);
} break;
case 'g': {
ppgen_ops **p;
if (ops->endscan)
ops->endscan(ctx);
- for (i = 0; !count || i < count; i++) {
+ for (i = 0; !count || i < count; ) {
double logp = 0;
DRESET(&d);
- while (logp < bits) {
+ while (logp < minbits) {
double pp;
DRESET(&dd);
pp = ops->gen(&dd, &rand_global, ctx);
DPUTD(&d, &dd);
logp += pp;
}
+ if (logp >= (double)maxbits + 1)
+ continue;
dstr_write(&d, stdout);
if (f & f_showp)
printf(" [%g]", logp);
fputc('\n', stdout);
+ i++;
}
ops->done(ctx);