#include <zxcvbn/frequency_lists.hpp> #include <algorithm> #include <memory> #include <utility> #include "base/check.h" #include "base/check_op.h" #include "base/files/memory_mapped_file.h" #include "base/logging.h" #include "base/no_destructor.h" #include "base/notreached.h" #include "base/task/thread_pool.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/abseil-cpp/absl/types/variant.h" namespace zxcvbn { namespace { // A big-endian 16-bit value, consisting of a 15-bit number and a marker bit in // the most significant position (in the first byte). // No alignment requirements. // This is used to store a "rank", which is the position at which a word // occurred in a wordlist. class MarkedBigEndianU15 { … }; static_assert …; struct MergedEntry { … }; // A reference to an entry inside a dictionary. // The entry consists of a MarkedBigEndianU15 representing the word's rank // (the position at which the word appears in the original wordlist) and an // inline string (ASCII, terminated with a byte that has the MARKER_BIT set) // that stores the actual word. class RankedDictEntryRef { … }; // Helper function that does nothing with the RankedDicts apart from letting // it destruct as it goes out of scope. This is called on the ThreadPool to // allow for potentially blocking behavior of `RankedDicts` destructor. void DoNothing(RankedDicts dicts) { … } } // namespace RankedDicts::Datawrapper::Datawrapper(std::vector<char> data) : … { … } RankedDicts::Datawrapper::Datawrapper( std::unique_ptr<base::MemoryMappedFile> map) : … { … } RankedDicts::RankedDicts( const std::vector<std::vector<std::string_view>>& ordered_dicts) { … } RankedDicts::RankedDicts(std::unique_ptr<base::MemoryMappedFile> map) : … { … } // Performs a binary search over an array of variable-size elements. // To find an element in the middle between two others, we first locate the // *byte* in the middle, then seek forward until we hit a marker byte that // will only appear at the start of an allocation. absl::optional<rank_t> RankedDicts::Find(std::string_view needle) const { … } // Determine whether an entry starts at the given offset; in other words, // determine whether a MarkedBigEndianU15 starts there. bool RankedDicts::IsRealMarker(size_t offset) const { … } void SetRankedDictsImplementation(RankedDicts dicts) { … } void SetRankedDicts(RankedDicts dicts) { … } RankedDicts& default_ranked_dicts() { … } } // namespace zxcvbn