/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying file Copyright.txt or https://cmake.org/licensing for details. */ #pragma once #include "cmConfigure.h" // IWYU pragma: keep #include #include #include #include #include /** * @brief Abstract base class for cryptographic hash generators */ class cmCryptoHash { public: enum Algo { AlgoMD5, AlgoSHA1, AlgoSHA224, AlgoSHA256, AlgoSHA384, AlgoSHA512, AlgoSHA3_224, AlgoSHA3_256, AlgoSHA3_384, AlgoSHA3_512 }; cmCryptoHash(Algo algo); ~cmCryptoHash(); cmCryptoHash(cmCryptoHash const&) = delete; cmCryptoHash& operator=(cmCryptoHash const&) = delete; /// @brief Returns a new hash generator of the requested type /// @arg algo Hash type name. Supported hash types are /// MD5, SHA1, SHA224, SHA256, SHA384, SHA512, /// SHA3_224, SHA3_256, SHA3_384, SHA3_512 /// @return A valid auto pointer if algo is supported or /// an invalid/NULL pointer otherwise static std::unique_ptr New(cm::string_view algo); /// @brief Converts a hex character to its binary value (4 bits) /// @arg input Hex character [0-9a-fA-F]. /// @arg output Binary value of the input character (4 bits) /// @return True if input was a valid hex character static bool IntFromHexDigit(char input, char& output); /// @brief Converts a byte hash to a sequence of hex character pairs static std::string ByteHashToString(const std::vector& hash); /// @brief Calculates a binary hash from string input data /// @return Binary hash vector std::vector ByteHashString(cm::string_view input); /// @brief Calculates a binary hash from file content /// @see ByteHashString() /// @return Non empty binary hash vector if the file was read successfully. /// An empty vector otherwise. std::vector ByteHashFile(const std::string& file); /// @brief Calculates a hash string from string input data /// @return Sequence of hex characters pairs for each byte of the binary hash std::string HashString(cm::string_view input); /// @brief Calculates a hash string from file content /// @see HashString() /// @return Non empty hash string if the file was read successfully. /// An empty string otherwise. std::string HashFile(const std::string& file); void Initialize(); void Append(void const*, size_t); void Append(cm::string_view input); std::vector Finalize(); std::string FinalizeHex(); private: unsigned int Id; struct rhash_context* CTX; };