/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying file Copyright.txt or https://cmake.org/licensing for details. */ #ifndef cmCryptoHash_h #define cmCryptoHash_h #include #include #include #include /** * @brief Abstract base class for cryptographic hash generators */ class cmCryptoHash { public: virtual ~cmCryptoHash() {} /// @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 /// @return A valid auto pointer if algo is supported or /// an invalid/NULL pointer otherwise static CM_AUTO_PTR New(const char* 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(const std::string& 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(const std::string& 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); protected: virtual void Initialize() = 0; virtual void Append(unsigned char const*, int) = 0; virtual std::vector Finalize() = 0; }; class cmCryptoHashMD5 : public cmCryptoHash { struct cmsysMD5_s* MD5; public: cmCryptoHashMD5(); ~cmCryptoHashMD5() CM_OVERRIDE; protected: void Initialize() CM_OVERRIDE; void Append(unsigned char const* buf, int sz) CM_OVERRIDE; std::vector Finalize() CM_OVERRIDE; }; #define cmCryptoHash_SHA_CLASS_DECL(SHA) \ class cmCryptoHash##SHA : public cmCryptoHash \ { \ union _SHA_CTX* SHA; \ \ public: \ cmCryptoHash##SHA(); \ ~cmCryptoHash##SHA(); \ \ protected: \ virtual void Initialize(); \ virtual void Append(unsigned char const* buf, int sz); \ virtual std::vector Finalize(); \ } cmCryptoHash_SHA_CLASS_DECL(SHA1); cmCryptoHash_SHA_CLASS_DECL(SHA224); cmCryptoHash_SHA_CLASS_DECL(SHA256); cmCryptoHash_SHA_CLASS_DECL(SHA384); cmCryptoHash_SHA_CLASS_DECL(SHA512); #undef cmCryptoHash_SHA_CLASS_DECL #endif