From a2978ab5fbf8294fe925d8db4ccece7e5b3ccefb Mon Sep 17 00:00:00 2001 From: tony Date: Mon, 24 Oct 2016 18:10:55 +0100 Subject: Tidy-up and tweaks. --- dict-generate.cpp | 87 ++++++++++++++++++++++++++++++------------------------- test.c | 26 ++++++++++++----- 2 files changed, 67 insertions(+), 46 deletions(-) diff --git a/dict-generate.cpp b/dict-generate.cpp index 1a56a8e..410182d 100644 --- a/dict-generate.cpp +++ b/dict-generate.cpp @@ -390,8 +390,9 @@ struct StringInt StringInt * Self() const { return const_cast(this); } }; -typedef std::map EntryMap_t; -typedef std::list NodeList_t; +typedef map EntryMap_t; +typedef list StringList_t; +typedef list NodeList_t; typedef set StringIntSet_t; typedef basic_string StringOfInts; typedef vector UintVect; @@ -401,23 +402,23 @@ typedef vector StringIntVect_t; // Variables holding 'interesting' information on the data unsigned int MaxLength, MinLength, NumChars, NumInWords, NumDuplicate; -int MaxOccurReduce; -string MaxOccurStr; struct FileInfo { - FileInfo() : Words(0), BruteIgnore(0), Accented(0), Dups(0), Used(0) { } + FileInfo() : Words(0), BruteIgnore(0), Accented(0), Dups(0), Used(0), Rank(0) { } string Name; + StringList_t Pwds; int Words; int BruteIgnore; int Accented; int Dups; int Used; + int Rank; }; /********************************************************************************** - * Read the file of words and add them to Entries. + * Read the file of words and add them to the file information. */ -static bool ReadInputFile(EntryMap_t & Entries, const string & FileName, int DictNum, FileInfo &Info, int MaxRank) +static bool ReadInputFile(const string & FileName, FileInfo &Info, int MaxRank) { ifstream f(FileName.c_str()); if (!f.is_open()) @@ -473,43 +474,51 @@ static bool ReadInputFile(EntryMap_t & Entries, const string & FileName, int Dic if (y < MinLength) MinLength = y; NumChars += y; - ++NumInWords; + + Info.Pwds.push_back(Line); ++Rank; + } + f.close(); + return true; +} - EntryMap_t::iterator It = Entries.find(Line); - if (It != Entries.end()) +static void CombineWordLists(EntryMap_t & Entries, FileInfo *Infos, int NumInfo) +{ + bool Done = false; + int Rank = 0; + while(!Done) + { + int i; + ++Rank; + Done = true; + for(i = 0; i < NumInfo; ++i) { - // This is a repeat of a previous entry - int r = It->second.mRank; - if (r > Rank) + FileInfo *p = Infos + i; + while(!p->Pwds.empty()) { - // Remember new lower rank - It->second.mRank = Rank; - It->second.mDict = DictNum; - It->second.mOccurs += 1; - r -= Rank; - if (r > MaxOccurReduce) + Done = false; + string Word = p->Pwds.front(); + p->Pwds.pop_front(); + EntryMap_t::iterator It = Entries.find(Word); + if (It != Entries.end()) { - MaxOccurStr = Line; - MaxOccurReduce = r; + // Word is repeat of one from another file + p->Dups += 1; + ++NumDuplicate; + } + else + { + // New word, add it + Entry e; + e.mDict = i; + e.mRank = Rank; + Entries.insert(std::pair(Word, e)); + p->Used += 1; + break; } } - else - ++Info.Dups; - ++NumDuplicate; - } - else - { - // New word - Entry e; - e.mDict = DictNum; - e.mRank = Rank; - Entries.insert(std::pair(Line, e)); - ++Info.Used; } } - f.close(); - return true; } /********************************************************************************** @@ -1597,10 +1606,11 @@ int main(int argc, char *argv[]) << endl; return 1; } - ReadInputFile(Entries, FileName, i, InInfo[NumFiles], MaxRank); + ReadInputFile(FileName, InInfo[NumFiles], MaxRank); if (NumFiles < int(sizeof InInfo / sizeof InInfo[0] - 1)) ++NumFiles; } + CombineWordLists(Entries, InInfo, NumFiles); if (Verbose) { if (!OutFile && (OutType == OUT_C_CODE)) @@ -1611,9 +1621,9 @@ int main(int argc, char *argv[]) cout << "Read input file " << Fi->Name << endl; cout << " Input words " << Fi->Words << endl; cout << " Used words " << Fi->Used << endl; - cout << /*" Unused " << Fi->BruteIgnore << + cout << " Unused " << Fi->BruteIgnore << " Bruteforce compare, " << Fi->Accented << - " Accented char, " << Fi->Dups << " Duplicates" << */ endl; + " Accented char, " << Fi->Dups << " Duplicates" << endl; } } bool InputCharSet[256]; @@ -1635,7 +1645,6 @@ int main(int argc, char *argv[]) cout << "Num input chars = " << NumChars << endl; cout << "Num input words = " << NumInWords << endl; cout << "Duplicate words = " << NumDuplicate; - cout << " (Rank most reduced for \"" << MaxOccurStr.c_str() << "\")"<< endl; cout << "Number of Ends = " << NumEnds << endl; cout << "Number of Nodes = " << NumNodes << endl; cout << "Trie height = " << Hi << endl; diff --git a/test.c b/test.c index b15cbe3..f2e48d5 100644 --- a/test.c +++ b/test.c @@ -33,7 +33,6 @@ #include #include #include -#include #include #include @@ -67,7 +66,7 @@ static void CalcPass(const char *Pwd, int Quiet) Len = strlen(Pwd); m = e - m; - printf("Pass %s \tLength %d\tEntropy bits=%.3f log10=%.3f\tMulti-word extra bits=%.1f factor=%.1f\n", Pwd, Len, e, e * 0.301029996, m, pow(2.0,m)); + printf("Pass %s \tLength %d\tEntropy bits=%.3f log10=%.3f\tMulti-word extra bits=%.1f\n", Pwd, Len, e, e * 0.301029996, m); p = Info; ChkLen = 0; while(p) @@ -202,9 +201,10 @@ int DoChecks(char *file) int main(int argc, char **argv) { - int i, Quiet, Checks; + int i, Quiet, Checks, White; Quiet = 0; Checks = 0; + White = 0; if (!ZxcvbnInit("zxcvbn.dict")) { printf("Failed to open dictionary file\n"); @@ -212,19 +212,26 @@ int main(int argc, char **argv) } if ((argc > 1) && (argv[1][0] == '-')) { - Checks = !strcmp(argv[1], "-t"); - Quiet = !strcmp(argv[1], "-q"); - if ((Checks + Quiet) == 0) + if (!strcmp(argv[1], "-qs") || !strcmp(argv[1], "-sq")) + Quiet = White = 1; + if (!strcmp(argv[1], "-t")) + Checks = 1; + if (!strcmp(argv[1], "-q")) + Quiet = 1; + if (!strcmp(argv[1], "-s")) + White = 1; + if ((Checks + Quiet + White) == 0) { char *s = strrchr(argv[0], '/'); if (s == NULL) s = argv[0]; else ++s; - printf( "Usage: %s [ -q ] [ pwd1 pwd2 ... ]\n" + printf( "Usage: %s [ -q | -qs ] [ pwd1 pwd2 ... ]\n" " Output entropy of given passwords. If no passwords on command line read\n" " them from stdin.\n" " -q option stops password analysis details from being output.\n" + " -s Ignore anything from space on a line when reading from stdin.\n" " %s -t file\n" " Read the file and check for correct results.\n", s, s); @@ -256,6 +263,11 @@ int main(int argc, char **argv) Line[i] = 0; break; } + if (White && (Line[i] == ' ')) + { + Line[i] = 0; + break; + } } if (Line[0]) CalcPass(Line, Quiet); -- cgit v1.2.3