allow 0-9 in words as well

This commit is contained in:
TLINDEN
2015-08-03 21:14:59 +02:00
parent f9ee00a462
commit 6458d09cda
7 changed files with 102 additions and 14 deletions

View File

@@ -56,6 +56,8 @@ modify `$PREFIX` during installation time like this:
/usr/share/dict/american-english) /usr/share/dict/american-english)
-l --minlen <count> Minimum word len (default: 5) -l --minlen <count> Minimum word len (default: 5)
-m --maxlen <count> Maximum word len (default: 10) -m --maxlen <count> Maximum word len (default: 10)
-n --dontjump Use all words in the dict file, e.g.
if it is an original diceware list
-d --debug Enable debug output -d --debug Enable debug output
-v --version Print program version -v --version Print program version
-h -? --help Print this help screen -h -? --help Print this help screen

View File

@@ -133,7 +133,7 @@
.\" ======================================================================== .\" ========================================================================
.\" .\"
.IX Title "DICEPWGEN 1" .IX Title "DICEPWGEN 1"
.TH DICEPWGEN 1 "2015-08-02" "perl v5.18.2" "User Contributed Perl Documentation" .TH DICEPWGEN 1 "2015-08-03" "perl v5.18.2" "User Contributed Perl Documentation"
.\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" For nroff, turn off justification. Always turn off hyphenation; it makes
.\" way too many mistakes in technical documents. .\" way too many mistakes in technical documents.
.if n .ad l .if n .ad l
@@ -142,7 +142,7 @@
dicepwgen \- A diceware password generator dicepwgen \- A diceware password generator
.SH "SYNOPSIS" .SH "SYNOPSIS"
.IX Header "SYNOPSIS" .IX Header "SYNOPSIS"
.Vb 11 .Vb 10
\& Usage: dice [\-tcfvhd] \& Usage: dice [\-tcfvhd]
\& Options: \& Options:
\& \-t \-\-humantoss Asks interactively for rolled dices \& \-t \-\-humantoss Asks interactively for rolled dices
@@ -151,6 +151,8 @@ dicepwgen \- A diceware password generator
\& /usr/share/dict/american\-english) \& /usr/share/dict/american\-english)
\& \-l \-\-minlen <count> Minimum word len (default: 5) \& \-l \-\-minlen <count> Minimum word len (default: 5)
\& \-m \-\-maxlen <count> Maximum word len (default: 10) \& \-m \-\-maxlen <count> Maximum word len (default: 10)
\& \-n \-\-dontjump Use all words in the dict file, e.g.
\& if it is an original diceware list
\& \-d \-\-debug Enable debug output \& \-d \-\-debug Enable debug output
\& \-v \-\-version Print program version \& \-v \-\-version Print program version
\& \-h \-? \-\-help Print this help screen \& \-h \-? \-\-help Print this help screen
@@ -170,11 +172,35 @@ minimum and maximum word length.
You can tell dicepwgen to use another dictionary file with You can tell dicepwgen to use another dictionary file with
the option \fB\-f\fR. the option \fB\-f\fR.
.PP .PP
If you're using a precomputed diceware list, use the parameter
\&\fB\-n\fR, in which case dicepwgen will use all entries in the file.
.PP
The program only uses words which contain 7bit \s-1ASCII\s0 letters The program only uses words which contain 7bit \s-1ASCII\s0 letters
(a\-zA-Z), which are easier for password usage anyway. (a\-zA\-Z0\-9), which are easier for password usage anyway.
.SH "FILES" .SH "FILES"
.IX Header "FILES" .IX Header "FILES"
\&\fB/usr/share/dict/american\-english\fR: default dictionary file. \&\fB/usr/share/dict/american\-english\fR: default dictionary file.
.PP
You can use almost any dictionary file you want. Dicepwgen expects
the file to be in the following format: one word per line.
.PP
You can also use precomputed diceware word lists by adding the
option \fB\-n\fR to the commandline. If the file already contains
numbers, you have to remove them before using. Say, the file
looks like this:
.PP
.Vb 4
\& 11126 abase
\& 11131 abash
\& 11132 abate
\& 11133 abbas
.Ve
.PP
Prepare the file with this shell oneliner:
.PP
.Vb 1
\& grep "^[0\-9]" dicewarelist.txt | awk \*(Aq{print $2}\*(Aq >> newlist.txt
.Ve
.SH "SEE ALSO" .SH "SEE ALSO"
.IX Header "SEE ALSO" .IX Header "SEE ALSO"
<http://world.std.com/~reinhold/diceware.html> <http://world.std.com/~reinhold/diceware.html>
@@ -185,6 +211,15 @@ The program only uses words which contain 7bit \s-1ASCII\s0 letters
In order to report a bug, unexpected behavior, feature requests In order to report a bug, unexpected behavior, feature requests
or to submit a patch, please open an issue on github: or to submit a patch, please open an issue on github:
<https://github.com/TLINDEN/diceware/issues>. <https://github.com/TLINDEN/diceware/issues>.
.PP
Current known issues:
.IP "\(bu" 4
The program does not count the lines in a dictionary file before
using it. If the file contains a low number of entries (e.g. because
it is a precomputed diceware word list and \fB\-n\fR has not been
specified), it seems to \*(L"hang\*(R". In fact it runs very long because it
jumps over a random number of entries and restarts from the beginning
again and again til the required number of words has been collected (7776).
.SH "LICENSE" .SH "LICENSE"
.IX Header "LICENSE" .IX Header "LICENSE"
This software is licensed under the \s-1GNU GENERAL PUBLIC LICENSE\s0 version 3. This software is licensed under the \s-1GNU GENERAL PUBLIC LICENSE\s0 version 3.

View File

@@ -32,6 +32,8 @@ int usage() {
" /usr/share/dict/american-english)\n" " /usr/share/dict/american-english)\n"
"-l --minlen <count> Minimum word len (default: 5)\n" "-l --minlen <count> Minimum word len (default: 5)\n"
"-m --maxlen <count> Maximum word len (default: 10)\n" "-m --maxlen <count> Maximum word len (default: 10)\n"
"-n --dontjump Use all words in the dict file, e.g.\n"
" if it is an original diceware list\n"
"-d --debug Enable debug output\n" "-d --debug Enable debug output\n"
"-v --version Print program version\n" "-v --version Print program version\n"
"-h -? --help Print this help screen\n" "-h -? --help Print this help screen\n"
@@ -46,8 +48,7 @@ int main (int argc, char **argv) {
WMIN = 6; WMIN = 6;
WMAX = 10; WMAX = 10;
humantoss = 0; humantoss = verbose = dontjump = 0;
verbose = 0;
static struct option longopts[] = { static struct option longopts[] = {
{ "wordcount", required_argument, NULL, 'c' }, { "wordcount", required_argument, NULL, 'c' },
@@ -55,12 +56,13 @@ int main (int argc, char **argv) {
{ "maxlen", required_argument, NULL, 'm' }, { "maxlen", required_argument, NULL, 'm' },
{ "humantoss", required_argument, NULL, 't' }, { "humantoss", required_argument, NULL, 't' },
{ "dictfile", required_argument, NULL, 'f' }, { "dictfile", required_argument, NULL, 'f' },
{ "dontjump", no_argument, NULL, 'n' },
{ "version", no_argument, NULL, 'v' }, { "version", no_argument, NULL, 'v' },
{ "help", no_argument, NULL, 'h' }, { "help", no_argument, NULL, 'h' },
{ "debug", no_argument, NULL, 'd' }, { "debug", no_argument, NULL, 'd' },
}; };
while ((opt = getopt_long(argc, argv, "l:m:tf:c:vh?d", longopts, NULL)) != -1) { while ((opt = getopt_long(argc, argv, "l:m:tf:c:vh?dn", longopts, NULL)) != -1) {
switch (opt) { switch (opt) {
case 'v': case 'v':
fprintf(stderr, "This is %s version %s\n", argv[0], VERSION); fprintf(stderr, "This is %s version %s\n", argv[0], VERSION);
@@ -85,6 +87,9 @@ int main (int argc, char **argv) {
case 'd': case 'd':
verbose++; verbose++;
break; break;
case 'n':
dontjump = 1;
break;
case 'f': case 'f':
dictfile = malloc(strlen(optarg)); dictfile = malloc(strlen(optarg));
strncpy(dictfile, optarg, strlen(optarg)); strncpy(dictfile, optarg, strlen(optarg));
@@ -99,6 +104,11 @@ int main (int argc, char **argv) {
dictfile = STRINGIZE_VALUE_OF(DICTFILE); dictfile = STRINGIZE_VALUE_OF(DICTFILE);
} }
if(dontjump) {
WMIN = 0;
WMAX = 128;
}
debug(" using dictfile: %s", dictfile); debug(" using dictfile: %s", dictfile);
debug("minimum word length: %d", WMIN); debug("minimum word length: %d", WMIN);
debug("maximum word length: %d", WMAX); debug("maximum word length: %d", WMAX);

View File

@@ -42,6 +42,7 @@
int humantoss; int humantoss;
int verbose; int verbose;
int dontjump;
int WMIN; int WMIN;
int WMAX; int WMAX;

View File

@@ -12,6 +12,8 @@ dicepwgen - A diceware password generator
/usr/share/dict/american-english) /usr/share/dict/american-english)
-l --minlen <count> Minimum word len (default: 5) -l --minlen <count> Minimum word len (default: 5)
-m --maxlen <count> Maximum word len (default: 10) -m --maxlen <count> Maximum word len (default: 10)
-n --dontjump Use all words in the dict file, e.g.
if it is an original diceware list
-d --debug Enable debug output -d --debug Enable debug output
-v --version Print program version -v --version Print program version
-h -? --help Print this help screen -h -? --help Print this help screen
@@ -31,13 +33,33 @@ minimum and maximum word length.
You can tell dicepwgen to use another dictionary file with You can tell dicepwgen to use another dictionary file with
the option B<-f>. the option B<-f>.
If you're using a precomputed diceware list, use the parameter
B<-n>, in which case dicepwgen will use all entries in the file.
The program only uses words which contain 7bit ASCII letters The program only uses words which contain 7bit ASCII letters
(a-zA-Z), which are easier for password usage anyway. (a-zA-Z0-9), which are easier for password usage anyway.
=head1 FILES =head1 FILES
B</usr/share/dict/american-english>: default dictionary file. B</usr/share/dict/american-english>: default dictionary file.
You can use almost any dictionary file you want. Dicepwgen expects
the file to be in the following format: one word per line.
You can also use precomputed diceware word lists by adding the
option B<-n> to the commandline. If the file already contains
numbers, you have to remove them before using. Say, the file
looks like this:
11126 abase
11131 abash
11132 abate
11133 abbas
Prepare the file with this shell oneliner:
grep "^[0-9]" dicewarelist.txt | awk '{print $2}' >> newlist.txt
=head1 SEE ALSO =head1 SEE ALSO
L<http://world.std.com/~reinhold/diceware.html> L<http://world.std.com/~reinhold/diceware.html>
@@ -50,6 +72,21 @@ In order to report a bug, unexpected behavior, feature requests
or to submit a patch, please open an issue on github: or to submit a patch, please open an issue on github:
L<https://github.com/TLINDEN/diceware/issues>. L<https://github.com/TLINDEN/diceware/issues>.
Current known issues:
=over
=item *
The program does not count the lines in a dictionary file before
using it. If the file contains a low number of entries (e.g. because
it is a precomputed diceware word list and B<-n> has not been
specified), it seems to "hang". In fact it runs very long because it
jumps over a random number of entries and restarts from the beginning
again and again til the required number of words has been collected (7776).
=back
=head1 LICENSE =head1 LICENSE
This software is licensed under the GNU GENERAL PUBLIC LICENSE version 3. This software is licensed under the GNU GENERAL PUBLIC LICENSE version 3.

View File

@@ -106,18 +106,20 @@ char **fetch_dict(char *dictfile) {
LOOP: LOOP:
while ((linelen = getline(&line, &len, DICT)) != -1) { while ((linelen = getline(&line, &len, DICT)) != -1) {
if(jump > 0) { if(! dontjump) {
jump--; if(jump > 0) {
continue; jump--;
} continue;
else { }
jump = rand_lim(32); else {
jump = rand_lim(32);
}
} }
if(linelen >= WMIN+1 && linelen <= WMAX+1) { if(linelen >= WMIN+1 && linelen <= WMAX+1) {
line[linelen-1] = '\0'; /* remove newline */ line[linelen-1] = '\0'; /* remove newline */
for(i=0; i<linelen-1; i++) { for(i=0; i<linelen-1; i++) {
if(isalpha((int)line[i]) == 0) { if(isalnum((int)line[i]) == 0) {
next = 1; next = 1;
break; break;
} }

View File

@@ -36,6 +36,7 @@
extern int WMIN; extern int WMIN;
extern int WMAX; extern int WMAX;
extern int dontjump;
int *incr_dicedigit(int *digits); int *incr_dicedigit(int *digits);
int get_dicenum(int *digits); int get_dicenum(int *digits);