/* */ #ifndef D_MESSAGE_DIGEST_H #define D_MESSAGE_DIGEST_H #include "common.h" #include #include #include namespace aria2 { class MessageDigestImpl; class MessageDigest { public: // Made public for make_unique MessageDigest(std::unique_ptr impl); // We don't implement copy ctor. MessageDigest(const MessageDigest&) = delete; // We don't implement assignment operator. MessageDigest& operator=(const MessageDigest&) = delete; ~MessageDigest(); // Factory functions static std::unique_ptr sha1(); // Factory function which takes hashType as string. Throws // exception if hashType is not supported. static std::unique_ptr create(const std::string& hashType); // Returns true if hashType is supported. Otherwise returns false. static bool supports(const std::string& hashType); // Returns a vector containing supported hash function textual names. static std::vector getSupportedHashTypes(); // Returns string containing supported hash function textual names // joined with ','. static std::string getSupportedHashTypeString(); // Returns the number of bytes needed to store digest for hashType. static size_t getDigestLength(const std::string& hashType); // Returns true if hash type specified by lhs is stronger than the // one specified by rhs. Returns false if at least one of lhs and // rhs are not supported. Otherwise returns false. static bool isStronger(const std::string& lhs, const std::string& rhs); static bool isValidHash (const std::string& hashType, const std::string& hexDigest); // Returns canonical hash algorithm name of given algostring. If // given algostring is not supported, then returns algostring // unchanged. static std::string getCanonicalHashType(const std::string& hashType); size_t getDigestLength() const; // Resets this object so that it can be reused. void reset(); MessageDigest& update(const void* data, size_t length); // Stores digest in the region pointed by md. It is caller's // responsibility to allocate memory at least getDigestLength(). // This call can only be called once. To reuse this object, call // reset(). void digest(unsigned char* md); // Returns raw digest, not hex digest. This call can only be called // once. To reuse this object, call reset(). std::string digest(); private: std::unique_ptr pImpl_; }; } // namespace aria2 #endif // D_MESSAGE_DIGEST_H