Loading Makefile +1 −1 Original line number Diff line number Diff line Loading @@ -21,7 +21,7 @@ $(OBJ)/statsgen.o: $(SRC)/core/statsgen.cpp $(INC)/statsgen.h $(INC)/utils.h $(CXX) $(CXXFLAGS) $< -c -o $@ clean: -rm -rf $(OBJ)/* -rm -rf $(OBJ)/* $(BIN) $(BINGUI) $(BINGUI): qmake -o qmakefile Loading include/statsgen.h +14 −20 Original line number Diff line number Diff line Loading @@ -23,7 +23,8 @@ #define MAX_THREADS 32 typedef std::unordered_map<std::string, uint64_t> StringOccurrence; typedef std::unordered_map<int, uint64_t> IntOccurrence; /** * @brief Simplify number of arguments for functions Loading Loading @@ -88,10 +89,10 @@ struct thread_data { uint64_t total_counter = 0; uint64_t total_filter = 0; std::unordered_map<int, uint64_t> length; std::unordered_map<std::string, uint64_t> simplemasks; std::unordered_map<std::string, uint64_t> advancedmasks; std::unordered_map<std::string, uint64_t> charactersets; IntOccurrence length; StringOccurrence simplemasks; StringOccurrence advancedmasks; StringOccurrence charactersets; std::queue<std::string> password_queue; minMax minMaxValue; Loading @@ -113,20 +114,13 @@ struct thread_data { */ class Statsgen { public: Statsgen() {}; Statsgen(const std::string& name); /** * @brief show all options for the command */ void showHelp(); /** * @brief Initialise the name of the database * @param name: name of the file */ void setFilename(const std::string& name); /** * @brief useful to hide statistics below 1% * @param hr: 1 to hide, else 0 Loading Loading @@ -218,8 +212,8 @@ public: uint64_t getTotalCounter(); uint64_t getTotalFilter(); uint64_t getNbSecurePasswords(); std::unordered_map<int, uint64_t> getStatsLength(); std::unordered_map<std::string, uint64_t> getStatsCharsets(); IntOccurrence getStatsLength(); StringOccurrence getStatsCharsets(); Loading @@ -245,10 +239,10 @@ private: // Dictionary std::unordered_map<int, uint64_t> stats_length; // Passwords' length linked to their occurrence std::unordered_map<std::string, uint64_t> stats_simplemasks; // Passwords' simple mask linked to their occurrence std::unordered_map<std::string, uint64_t> stats_advancedmasks; // Passwords' advanced mask linked to their occurrence std::unordered_map<std::string, uint64_t> stats_charactersets; // Passwords' characterset linked to their occurrence IntOccurrence stats_length; // Passwords' length linked to their occurrence StringOccurrence stats_simplemasks; // Passwords' simple mask linked to their occurrence StringOccurrence stats_advancedmasks; // Passwords' advanced mask linked to their occurrence StringOccurrence stats_charactersets; // Passwords' characterset linked to their occurrence // Counters Loading Loading @@ -298,7 +292,7 @@ void analyse_charset(std::string & charset, const Policy & policy); * @param limitAdvancedmask: define the limit for the size of advanced masks * @param limitSimplemask: define the limit for the size of simple masks */ void analyze_password(const std::string & password, Container & c, SecurityRules & sr, const int & limitAdvancedmask, const int & limitSimplemask); Container analyze_password(const std::string & password, SecurityRules & sr, const int & limitAdvancedmask, const int & limitSimplemask); /** * @brief Update minima and maxima of all general data from analysed passwords Loading include/utils.h +11 −16 Original line number Diff line number Diff line Loading @@ -19,17 +19,12 @@ #include <unordered_map> #include <iomanip> using namespace std; template<typename K, typename V> using UnorderedMapIterator = typename unordered_map<K, V>::const_iterator; using UnorderedMapIterator = typename std::unordered_map<K, V>::const_iterator; template<typename K, typename V> using MapIterator = typename map<K, V>::const_iterator; using MapIterator = typename std::map<K, V>::const_iterator; Loading @@ -39,8 +34,8 @@ using MapIterator = typename map<K, V>::const_iterator; * @return ordered map */ template<typename A> multimap<uint64_t, A> flip_map(const std::unordered_map<A, uint64_t> & src) { multimap<uint64_t, A> dst; std::multimap<uint64_t, A> flip_map(const std::unordered_map<A, uint64_t> & src) { std::multimap<uint64_t, A> dst; for(UnorderedMapIterator<A, uint64_t> it = src.begin(); it != src.end(); ++it) dst.insert(std::pair<uint64_t, A>(it->second, it->first)); Loading @@ -59,7 +54,7 @@ multimap<uint64_t, A> flip_map(const std::unordered_map<A, uint64_t> & src) { * @param hiderare: flag to hide statistics under 1% */ template<typename Type> void readResult(uint64_t res, Type carac, int & count, const uint64_t & total_counter, const int & hiderare) { void readResult(const uint64_t & res, const Type& carac, int & count, const uint64_t & total_counter, const int & hiderare) { float percentage; std::ostringstream ss; percentage = (float) (100*res) / total_counter; Loading @@ -69,9 +64,9 @@ void readResult(uint64_t res, Type carac, int & count, const uint64_t & total_co std::string value(ss.str()); value = value.substr(0,5); cout << setw(40) << right << carac << ": " << setw(5) << right << value << "%" << setw(5) << right << "(" << res << ")" << endl; std::cout << std::setw(40) << std::right << carac << ": " << std::setw(5) << std::right << value << "%" << std::setw(5) << std::right << "(" << res << ")" << std::endl; count++; } Loading @@ -87,9 +82,9 @@ void readResult(uint64_t res, Type carac, int & count, const uint64_t & total_co * @param count: number of shown results */ template<typename Type> void showMap(const unordered_map<Type, uint64_t> & stats, const int & top, const uint64_t & total_counter, const int & hiderare, int & count) { void showMap(const std::unordered_map<Type, uint64_t> & stats, const int & top, const uint64_t & total_counter, const int & hiderare, int & count) { count = 0; multimap<uint64_t, Type> reverse = flip_map<Type>(stats); std::multimap<uint64_t, Type> reverse = flip_map<Type>(stats); MapIterator<uint64_t, Type> it; for(it = reverse.end(); it != reverse.begin(); it--) { Loading @@ -112,5 +107,5 @@ void showMap(const unordered_map<Type, uint64_t> & stats, const int & top, const * @param filename: name of the file * @return number of line */ uint64_t nbline_file(const string & filename); uint64_t nbline_file(const std::string & filename); #endif No newline at end of file src/cli/main.cpp +9 −5 Original line number Diff line number Diff line Loading @@ -70,8 +70,16 @@ void showHelp() { int main(int argc,char* argv[]) { locale::global(locale("")); Statsgen statsgen; string filename; if(argc > 1){ filename = argv[optind]; } else { showHelp(); } Statsgen statsgen(filename); int opt; while ((opt = getopt_long(argc, argv, "hwHt:r:o:dA:S:p:s", long_options, NULL)) != -1){ Loading Loading @@ -104,10 +112,6 @@ int main(int argc,char* argv[]) { } if(argc > 1) filename = argv[optind]; else showHelp(); statsgen.setFilename(filename); if (statsgen.generate_stats()) { statsgen.print_stats(); } Loading src/core/statsgen.cpp +15 −15 Original line number Diff line number Diff line Loading @@ -25,7 +25,7 @@ using namespace std; void Statsgen::setFilename(const std::string& name) { Statsgen::Statsgen(const std::string& name) { if (name == "-"){ is_stdin = true; warn("reading from stdin enabled, loading the whole list in memory"); Loading @@ -47,12 +47,7 @@ void Statsgen::setTop(int val) { void Statsgen::setRegex(const string& expr) { string tmp(expr.length(),' '); copy(expr.begin(), expr.end(), tmp.begin()); regex tmp_reg(tmp); current_regex = tmp_reg; current_regex = string(expr); use_regex = true; } Loading Loading @@ -408,7 +403,8 @@ void analyse_letter(const char & letter, char & last_simplemask, string & simple } void analyse_charset(string & charset, const Policy & policy) { string analyse_charset(const Policy & policy) { string charset; if (policy.digit && !policy.lower && !policy.upper && !policy.special) { charset = "numeric"; } Loading Loading @@ -456,10 +452,12 @@ void analyse_charset(string & charset, const Policy & policy) { else { charset = "all"; } return charset; } void analyze_password(const string & password, Container & c, SecurityRules & sr, const int & limitAdvancedmask, const int & limitSimplemask) { Container analyze_password(const string & password, SecurityRules & sr, const int & limitAdvancedmask, const int & limitSimplemask) { Container c; c.pass_length = password.size(); char last_simplemask = 'a'; Loading @@ -472,7 +470,7 @@ void analyze_password(const string & password, Container & c, SecurityRules & sr analyse_letter(letter, last_simplemask, c.simplemask_string, c.advancedmask_string, c.pol, sizeAdvancedMask, sizeSimpleMask); } analyse_charset(c.characterset, c.pol); c.characterset = analyse_charset(c.pol); if ( (c.pass_length >= sr.minLength) && (c.pol.digit >= sr.minDigit) && Loading @@ -489,6 +487,8 @@ void analyze_password(const string & password, Container & c, SecurityRules & sr if (sizeSimpleMask > limitSimplemask) { c.simplemask_string = "othermasks"; } return c; } Loading Loading @@ -543,7 +543,7 @@ void * generate_stats_thread_queue(void * threadarg) { my_data->total_counter++; if ( !my_data->use_regex || (my_data->use_regex && regex_match(line,my_data->current_regex)) ) { analyze_password(line, c, my_data->sr, my_data->limitAdvancedmask, my_data->limitSimplemask); c = analyze_password(line, my_data->sr, my_data->limitAdvancedmask, my_data->limitSimplemask); my_data->total_filter++; Loading Loading @@ -602,7 +602,7 @@ void * generate_stats_thread(void * threadarg) { if ( !my_data->use_regex || (my_data->use_regex && regex_match(password,my_data->current_regex)) ) { my_data->total_filter += nbPasswords; analyze_password(password, c, my_data->sr,my_data->limitAdvancedmask, my_data->limitSimplemask); c = analyze_password(password, my_data->sr,my_data->limitAdvancedmask, my_data->limitSimplemask); my_data->length[ c.pass_length ] += nbPasswords; my_data->charactersets[ c.characterset ] += nbPasswords; Loading @@ -613,7 +613,7 @@ void * generate_stats_thread(void * threadarg) { else { my_data->total_counter++; if ( !my_data->use_regex || (my_data->use_regex && regex_match(line,my_data->current_regex)) ) { analyze_password(line, c, my_data->sr, my_data->limitAdvancedmask, my_data->limitSimplemask); c = analyze_password(line, my_data->sr, my_data->limitAdvancedmask, my_data->limitSimplemask); my_data->total_filter++; Loading Loading @@ -643,11 +643,11 @@ uint64_t Statsgen::getNbSecurePasswords() { return nbSecurePassword; } std::unordered_map<int, uint64_t> Statsgen::getStatsLength(){ IntOccurrence Statsgen::getStatsLength(){ return stats_length; } std::unordered_map<std::string, uint64_t> Statsgen::getStatsCharsets(){ StringOccurrence Statsgen::getStatsCharsets(){ return stats_charactersets; } Loading Loading
Makefile +1 −1 Original line number Diff line number Diff line Loading @@ -21,7 +21,7 @@ $(OBJ)/statsgen.o: $(SRC)/core/statsgen.cpp $(INC)/statsgen.h $(INC)/utils.h $(CXX) $(CXXFLAGS) $< -c -o $@ clean: -rm -rf $(OBJ)/* -rm -rf $(OBJ)/* $(BIN) $(BINGUI) $(BINGUI): qmake -o qmakefile Loading
include/statsgen.h +14 −20 Original line number Diff line number Diff line Loading @@ -23,7 +23,8 @@ #define MAX_THREADS 32 typedef std::unordered_map<std::string, uint64_t> StringOccurrence; typedef std::unordered_map<int, uint64_t> IntOccurrence; /** * @brief Simplify number of arguments for functions Loading Loading @@ -88,10 +89,10 @@ struct thread_data { uint64_t total_counter = 0; uint64_t total_filter = 0; std::unordered_map<int, uint64_t> length; std::unordered_map<std::string, uint64_t> simplemasks; std::unordered_map<std::string, uint64_t> advancedmasks; std::unordered_map<std::string, uint64_t> charactersets; IntOccurrence length; StringOccurrence simplemasks; StringOccurrence advancedmasks; StringOccurrence charactersets; std::queue<std::string> password_queue; minMax minMaxValue; Loading @@ -113,20 +114,13 @@ struct thread_data { */ class Statsgen { public: Statsgen() {}; Statsgen(const std::string& name); /** * @brief show all options for the command */ void showHelp(); /** * @brief Initialise the name of the database * @param name: name of the file */ void setFilename(const std::string& name); /** * @brief useful to hide statistics below 1% * @param hr: 1 to hide, else 0 Loading Loading @@ -218,8 +212,8 @@ public: uint64_t getTotalCounter(); uint64_t getTotalFilter(); uint64_t getNbSecurePasswords(); std::unordered_map<int, uint64_t> getStatsLength(); std::unordered_map<std::string, uint64_t> getStatsCharsets(); IntOccurrence getStatsLength(); StringOccurrence getStatsCharsets(); Loading @@ -245,10 +239,10 @@ private: // Dictionary std::unordered_map<int, uint64_t> stats_length; // Passwords' length linked to their occurrence std::unordered_map<std::string, uint64_t> stats_simplemasks; // Passwords' simple mask linked to their occurrence std::unordered_map<std::string, uint64_t> stats_advancedmasks; // Passwords' advanced mask linked to their occurrence std::unordered_map<std::string, uint64_t> stats_charactersets; // Passwords' characterset linked to their occurrence IntOccurrence stats_length; // Passwords' length linked to their occurrence StringOccurrence stats_simplemasks; // Passwords' simple mask linked to their occurrence StringOccurrence stats_advancedmasks; // Passwords' advanced mask linked to their occurrence StringOccurrence stats_charactersets; // Passwords' characterset linked to their occurrence // Counters Loading Loading @@ -298,7 +292,7 @@ void analyse_charset(std::string & charset, const Policy & policy); * @param limitAdvancedmask: define the limit for the size of advanced masks * @param limitSimplemask: define the limit for the size of simple masks */ void analyze_password(const std::string & password, Container & c, SecurityRules & sr, const int & limitAdvancedmask, const int & limitSimplemask); Container analyze_password(const std::string & password, SecurityRules & sr, const int & limitAdvancedmask, const int & limitSimplemask); /** * @brief Update minima and maxima of all general data from analysed passwords Loading
include/utils.h +11 −16 Original line number Diff line number Diff line Loading @@ -19,17 +19,12 @@ #include <unordered_map> #include <iomanip> using namespace std; template<typename K, typename V> using UnorderedMapIterator = typename unordered_map<K, V>::const_iterator; using UnorderedMapIterator = typename std::unordered_map<K, V>::const_iterator; template<typename K, typename V> using MapIterator = typename map<K, V>::const_iterator; using MapIterator = typename std::map<K, V>::const_iterator; Loading @@ -39,8 +34,8 @@ using MapIterator = typename map<K, V>::const_iterator; * @return ordered map */ template<typename A> multimap<uint64_t, A> flip_map(const std::unordered_map<A, uint64_t> & src) { multimap<uint64_t, A> dst; std::multimap<uint64_t, A> flip_map(const std::unordered_map<A, uint64_t> & src) { std::multimap<uint64_t, A> dst; for(UnorderedMapIterator<A, uint64_t> it = src.begin(); it != src.end(); ++it) dst.insert(std::pair<uint64_t, A>(it->second, it->first)); Loading @@ -59,7 +54,7 @@ multimap<uint64_t, A> flip_map(const std::unordered_map<A, uint64_t> & src) { * @param hiderare: flag to hide statistics under 1% */ template<typename Type> void readResult(uint64_t res, Type carac, int & count, const uint64_t & total_counter, const int & hiderare) { void readResult(const uint64_t & res, const Type& carac, int & count, const uint64_t & total_counter, const int & hiderare) { float percentage; std::ostringstream ss; percentage = (float) (100*res) / total_counter; Loading @@ -69,9 +64,9 @@ void readResult(uint64_t res, Type carac, int & count, const uint64_t & total_co std::string value(ss.str()); value = value.substr(0,5); cout << setw(40) << right << carac << ": " << setw(5) << right << value << "%" << setw(5) << right << "(" << res << ")" << endl; std::cout << std::setw(40) << std::right << carac << ": " << std::setw(5) << std::right << value << "%" << std::setw(5) << std::right << "(" << res << ")" << std::endl; count++; } Loading @@ -87,9 +82,9 @@ void readResult(uint64_t res, Type carac, int & count, const uint64_t & total_co * @param count: number of shown results */ template<typename Type> void showMap(const unordered_map<Type, uint64_t> & stats, const int & top, const uint64_t & total_counter, const int & hiderare, int & count) { void showMap(const std::unordered_map<Type, uint64_t> & stats, const int & top, const uint64_t & total_counter, const int & hiderare, int & count) { count = 0; multimap<uint64_t, Type> reverse = flip_map<Type>(stats); std::multimap<uint64_t, Type> reverse = flip_map<Type>(stats); MapIterator<uint64_t, Type> it; for(it = reverse.end(); it != reverse.begin(); it--) { Loading @@ -112,5 +107,5 @@ void showMap(const unordered_map<Type, uint64_t> & stats, const int & top, const * @param filename: name of the file * @return number of line */ uint64_t nbline_file(const string & filename); uint64_t nbline_file(const std::string & filename); #endif No newline at end of file
src/cli/main.cpp +9 −5 Original line number Diff line number Diff line Loading @@ -70,8 +70,16 @@ void showHelp() { int main(int argc,char* argv[]) { locale::global(locale("")); Statsgen statsgen; string filename; if(argc > 1){ filename = argv[optind]; } else { showHelp(); } Statsgen statsgen(filename); int opt; while ((opt = getopt_long(argc, argv, "hwHt:r:o:dA:S:p:s", long_options, NULL)) != -1){ Loading Loading @@ -104,10 +112,6 @@ int main(int argc,char* argv[]) { } if(argc > 1) filename = argv[optind]; else showHelp(); statsgen.setFilename(filename); if (statsgen.generate_stats()) { statsgen.print_stats(); } Loading
src/core/statsgen.cpp +15 −15 Original line number Diff line number Diff line Loading @@ -25,7 +25,7 @@ using namespace std; void Statsgen::setFilename(const std::string& name) { Statsgen::Statsgen(const std::string& name) { if (name == "-"){ is_stdin = true; warn("reading from stdin enabled, loading the whole list in memory"); Loading @@ -47,12 +47,7 @@ void Statsgen::setTop(int val) { void Statsgen::setRegex(const string& expr) { string tmp(expr.length(),' '); copy(expr.begin(), expr.end(), tmp.begin()); regex tmp_reg(tmp); current_regex = tmp_reg; current_regex = string(expr); use_regex = true; } Loading Loading @@ -408,7 +403,8 @@ void analyse_letter(const char & letter, char & last_simplemask, string & simple } void analyse_charset(string & charset, const Policy & policy) { string analyse_charset(const Policy & policy) { string charset; if (policy.digit && !policy.lower && !policy.upper && !policy.special) { charset = "numeric"; } Loading Loading @@ -456,10 +452,12 @@ void analyse_charset(string & charset, const Policy & policy) { else { charset = "all"; } return charset; } void analyze_password(const string & password, Container & c, SecurityRules & sr, const int & limitAdvancedmask, const int & limitSimplemask) { Container analyze_password(const string & password, SecurityRules & sr, const int & limitAdvancedmask, const int & limitSimplemask) { Container c; c.pass_length = password.size(); char last_simplemask = 'a'; Loading @@ -472,7 +470,7 @@ void analyze_password(const string & password, Container & c, SecurityRules & sr analyse_letter(letter, last_simplemask, c.simplemask_string, c.advancedmask_string, c.pol, sizeAdvancedMask, sizeSimpleMask); } analyse_charset(c.characterset, c.pol); c.characterset = analyse_charset(c.pol); if ( (c.pass_length >= sr.minLength) && (c.pol.digit >= sr.minDigit) && Loading @@ -489,6 +487,8 @@ void analyze_password(const string & password, Container & c, SecurityRules & sr if (sizeSimpleMask > limitSimplemask) { c.simplemask_string = "othermasks"; } return c; } Loading Loading @@ -543,7 +543,7 @@ void * generate_stats_thread_queue(void * threadarg) { my_data->total_counter++; if ( !my_data->use_regex || (my_data->use_regex && regex_match(line,my_data->current_regex)) ) { analyze_password(line, c, my_data->sr, my_data->limitAdvancedmask, my_data->limitSimplemask); c = analyze_password(line, my_data->sr, my_data->limitAdvancedmask, my_data->limitSimplemask); my_data->total_filter++; Loading Loading @@ -602,7 +602,7 @@ void * generate_stats_thread(void * threadarg) { if ( !my_data->use_regex || (my_data->use_regex && regex_match(password,my_data->current_regex)) ) { my_data->total_filter += nbPasswords; analyze_password(password, c, my_data->sr,my_data->limitAdvancedmask, my_data->limitSimplemask); c = analyze_password(password, my_data->sr,my_data->limitAdvancedmask, my_data->limitSimplemask); my_data->length[ c.pass_length ] += nbPasswords; my_data->charactersets[ c.characterset ] += nbPasswords; Loading @@ -613,7 +613,7 @@ void * generate_stats_thread(void * threadarg) { else { my_data->total_counter++; if ( !my_data->use_regex || (my_data->use_regex && regex_match(line,my_data->current_regex)) ) { analyze_password(line, c, my_data->sr, my_data->limitAdvancedmask, my_data->limitSimplemask); c = analyze_password(line, my_data->sr, my_data->limitAdvancedmask, my_data->limitSimplemask); my_data->total_filter++; Loading Loading @@ -643,11 +643,11 @@ uint64_t Statsgen::getNbSecurePasswords() { return nbSecurePassword; } std::unordered_map<int, uint64_t> Statsgen::getStatsLength(){ IntOccurrence Statsgen::getStatsLength(){ return stats_length; } std::unordered_map<std::string, uint64_t> Statsgen::getStatsCharsets(){ StringOccurrence Statsgen::getStatsCharsets(){ return stats_charactersets; } Loading