Add support for Diceware wordlists in numbered and/or PGP-signed formats (#6791)

This allows one to directly use Diceware-compatible wordlists without having to convert the file to the plain wordlist format.

The accepted formats are described in the Diceware documentation:
https://diceware.readthedocs.io/en/stable/wordlists.html
This commit is contained in:
snipfoo 2021-10-02 06:01:04 +02:00 committed by GitHub
parent 5ec2686024
commit e660802fac
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 23 additions and 2 deletions

View File

@ -256,6 +256,7 @@ The same password generation options as documented for the generate command can
Sets the Path of the wordlist for the diceware generator. Sets the Path of the wordlist for the diceware generator.
The wordlist must have > 1000 words, otherwise the program will fail. The wordlist must have > 1000 words, otherwise the program will fail.
If the wordlist has < 4000 words a warning will be printed to STDERR. If the wordlist has < 4000 words a warning will be printed to STDERR.
Any *diceware*-compatible wordlist can used. Note however that *KeePassXC* will NOT verify the PGP signature of signed wordlists.
=== Export options === Export options
*-f*, *--format*:: *-f*, *--format*::

View File

@ -68,8 +68,28 @@ void PassphraseGenerator::setWordList(const QString& path)
} }
QTextStream in(&file); QTextStream in(&file);
while (!in.atEnd()) { QString line = in.readLine();
m_wordlist.append(in.readLine()); bool isSigned = line.startsWith("-----BEGIN PGP SIGNED MESSAGE-----");
if (isSigned) {
while (!line.isNull() && !line.trimmed().isEmpty()) {
line = in.readLine();
}
}
QRegExp rx("^[0-9]+(-[0-9]+)*\\s+([^\\s]+)$");
while (!line.isNull()) {
if (isSigned && line.startsWith("-----BEGIN PGP SIGNATURE-----")) {
break;
}
// Handle dash-escaped lines (if the wordlist is signed)
if (isSigned && line.startsWith("- ")) {
line.remove(0, 2);
}
line = line.trimmed();
line.replace(rx, "\\2");
if (!line.isEmpty()) {
m_wordlist.append(line);
}
line = in.readLine();
} }
if (m_wordlist.size() < 4000) { if (m_wordlist.size() < 4000) {