| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- /* 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 <cmConfigure.h>
- #include <cm_auto_ptr.hxx>
- #include <string>
- #include <vector>
- /**
- * @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<cmCryptoHash> 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<unsigned char>& hash);
- /// @brief Calculates a binary hash from string input data
- /// @return Binary hash vector
- std::vector<unsigned char> 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<unsigned char> 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<unsigned char> 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<unsigned char> 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<unsigned char> 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
|