Rework hashes (also fix Fletcher16 and CRC64)

This commit is contained in:
Jérôme Leclercq
2022-02-10 01:46:58 +01:00
parent 52100e3b3b
commit 97ee89afb7
29 changed files with 1262 additions and 1330 deletions

View File

@@ -29,7 +29,7 @@ namespace Nz
template<typename O, typename F, typename Tuple> decltype(auto) Apply(O& object, F&& fn, Tuple&& t);
template<typename T> constexpr std::size_t BitCount();
template<typename T> ByteArray ComputeHash(HashType hash, const T& v);
template<typename T> ByteArray ComputeHash(AbstractHash* hash, const T& v);
template<typename T> ByteArray ComputeHash(AbstractHash& hash, const T& v);
template<typename T, std::size_t N> constexpr std::size_t CountOf(T(&name)[N]) noexcept;
template<typename T> std::size_t CountOf(const T& c);
inline bool HashAppend(AbstractHash* hash, const std::string_view& v);

View File

@@ -178,7 +178,7 @@ namespace Nz
template<typename T>
ByteArray ComputeHash(HashType hash, const T& v)
{
return ComputeHash(AbstractHash::Get(hash).get(), v);
return ComputeHash(*AbstractHash::Get(hash), v);
}
/*!
@@ -195,15 +195,13 @@ namespace Nz
* \see ComputeHash
*/
template<typename T>
ByteArray ComputeHash(AbstractHash* hash, const T& v)
ByteArray ComputeHash(AbstractHash& hash, const T& v)
{
NazaraAssert(hash != nullptr, "Invalid abstracthash pointer");
hash->Begin();
hash.Begin();
HashAppend(hash, v);
return hash->End();
return hash.End();
}
/*!
@@ -234,9 +232,9 @@ namespace Nz
return c.size();
}
inline bool HashAppend(AbstractHash* hash, const std::string_view& v)
inline bool HashAppend(AbstractHash& hash, const std::string_view& v)
{
hash->Append(reinterpret_cast<const UInt8*>(v.data()), v.size());
hash.Append(reinterpret_cast<const UInt8*>(v.data()), v.size());
return true;
}

View File

@@ -129,7 +129,7 @@ namespace Nz
Container m_array;
};
inline bool HashAppend(AbstractHash* hash, const ByteArray& byteArray);
inline bool HashAppend(AbstractHash& hash, const ByteArray& byteArray);
}
namespace std

View File

@@ -732,9 +732,9 @@ namespace Nz
return m_array >= rhs.m_array;
}
inline bool HashAppend(AbstractHash* hash, const ByteArray& byteArray)
inline bool HashAppend(AbstractHash& hash, const ByteArray& byteArray)
{
hash->Append(byteArray.GetConstBuffer(), byteArray.GetSize());
hash.Append(byteArray.GetConstBuffer(), byteArray.GetSize());
return true;
}
}

View File

@@ -60,7 +60,7 @@ namespace Nz
File& operator=(File&& file) noexcept;
static inline ByteArray ComputeHash(HashType hash, const std::filesystem::path& filePath);
static inline ByteArray ComputeHash(AbstractHash* hash, const std::filesystem::path& filePath);
static inline ByteArray ComputeHash(AbstractHash& hash, const std::filesystem::path& filePath);
private:
void FlushStream() override;
@@ -71,7 +71,7 @@ namespace Nz
std::unique_ptr<FileImpl> m_impl;
};
NAZARA_CORE_API bool HashAppend(AbstractHash* hash, const File& originalFile);
NAZARA_CORE_API bool HashAppend(AbstractHash& hash, const File& originalFile);
}
#include <Nazara/Core/File.inl>

View File

@@ -18,7 +18,7 @@ namespace Nz
inline ByteArray File::ComputeHash(HashType hash, const std::filesystem::path& filePath)
{
return ComputeHash(AbstractHash::Get(hash).get(), filePath);
return ComputeHash(*AbstractHash::Get(hash), filePath);
}
/*!
@@ -29,7 +29,7 @@ namespace Nz
* \param filePath Path for the file
*/
inline ByteArray File::ComputeHash(AbstractHash* hash, const std::filesystem::path& filePath)
inline ByteArray File::ComputeHash(AbstractHash& hash, const std::filesystem::path& filePath)
{
return Nz::ComputeHash(hash, File(filePath));
}

View File

@@ -13,13 +13,11 @@
namespace Nz
{
struct HashCRC32_state;
class NAZARA_CORE_API HashCRC32 : public AbstractHash
class NAZARA_CORE_API CRC32Hash final : public AbstractHash
{
public:
HashCRC32(UInt32 polynomial = 0x04c11db7);
virtual ~HashCRC32();
CRC32Hash(UInt32 polynomial = DefaultPolynomial);
virtual ~CRC32Hash();
void Append(const UInt8* data, std::size_t len) override;
void Begin() override;
@@ -28,8 +26,11 @@ namespace Nz
std::size_t GetDigestLength() const override;
const char* GetHashName() const override;
static constexpr UInt32 DefaultPolynomial = 0x04C11DB7;
private:
HashCRC32_state* m_state;
UInt32 m_crc;
const UInt32* m_table;
};
}

View File

@@ -13,11 +13,11 @@
namespace Nz
{
class NAZARA_CORE_API HashCRC64 : public AbstractHash
class NAZARA_CORE_API CRC64Hash final : public AbstractHash
{
public:
HashCRC64() = default;
~HashCRC64() = default;
CRC64Hash() = default;
~CRC64Hash() = default;
void Append(const UInt8* data, std::size_t len) override;
void Begin() override;

View File

@@ -13,13 +13,11 @@
namespace Nz
{
struct HashFletcher16_state;
class NAZARA_CORE_API HashFletcher16 : public AbstractHash
class NAZARA_CORE_API Fletcher16Hash final : public AbstractHash
{
public:
HashFletcher16();
virtual ~HashFletcher16();
Fletcher16Hash() = default;
~Fletcher16Hash() = default;
void Append(const UInt8* data, std::size_t len) override;
void Begin() override;
@@ -29,7 +27,8 @@ namespace Nz
const char* GetHashName() const override;
private:
HashFletcher16_state* m_state;
UInt16 m_sum1;
UInt16 m_sum2;
};
}

View File

@@ -13,13 +13,11 @@
namespace Nz
{
struct HashMD5_state;
class NAZARA_CORE_API HashMD5 : public AbstractHash
class NAZARA_CORE_API MD5Hash final : public AbstractHash
{
public:
HashMD5();
virtual ~HashMD5();
MD5Hash() = default;
~MD5Hash() = default;
void Append(const UInt8* data, std::size_t len) override;
void Begin() override;
@@ -29,7 +27,11 @@ namespace Nz
const char* GetHashName() const override;
private:
HashMD5_state* m_state;
void md5_process(const UInt8* data);
std::size_t m_count[2]; /* message length in bits, lsw first */
UInt32 m_abcd[4]; /* digest buffer */
UInt8 m_buf[64]; /* accumulate block */
};
}

View File

@@ -15,11 +15,11 @@ namespace Nz
{
union SHA_CTX;
class NAZARA_CORE_API HashSHA1 : public AbstractHash
class NAZARA_CORE_API SHA1Hash final : public AbstractHash
{
public:
HashSHA1();
virtual ~HashSHA1();
SHA1Hash();
~SHA1Hash();
void Append(const UInt8* data, std::size_t len) override;
void Begin() override;

View File

@@ -15,11 +15,11 @@ namespace Nz
{
union SHA_CTX;
class NAZARA_CORE_API HashSHA224 : public AbstractHash
class NAZARA_CORE_API SHA224Hash final : public AbstractHash
{
public:
HashSHA224();
virtual ~HashSHA224();
SHA224Hash();
~SHA224Hash();
void Append(const UInt8* data, std::size_t len) override;
void Begin() override;

View File

@@ -15,11 +15,11 @@ namespace Nz
{
union SHA_CTX;
class NAZARA_CORE_API HashSHA256 : public AbstractHash
class NAZARA_CORE_API SHA256Hash final : public AbstractHash
{
public:
HashSHA256();
virtual ~HashSHA256();
SHA256Hash();
~SHA256Hash();
void Append(const UInt8* data, std::size_t len) override;
void Begin() override;

View File

@@ -15,11 +15,11 @@ namespace Nz
{
union SHA_CTX;
class NAZARA_CORE_API HashSHA384 : public AbstractHash
class NAZARA_CORE_API SHA384Hash final : public AbstractHash
{
public:
HashSHA384();
virtual ~HashSHA384();
SHA384Hash();
~SHA384Hash();
void Append(const UInt8* data, std::size_t len) override;
void Begin() override;

View File

@@ -15,11 +15,11 @@ namespace Nz
{
union SHA_CTX;
class NAZARA_CORE_API HashSHA512 : public AbstractHash
class NAZARA_CORE_API SHA512Hash final : public AbstractHash
{
public:
HashSHA512();
virtual ~HashSHA512();
SHA512Hash();
~SHA512Hash();
void Append(const UInt8* data, std::size_t len) override;
void Begin() override;

View File

@@ -13,13 +13,11 @@
namespace Nz
{
struct HashWhirlpool_state;
class NAZARA_CORE_API HashWhirlpool : public AbstractHash
class NAZARA_CORE_API WhirlpoolHash final : public AbstractHash
{
public:
HashWhirlpool();
virtual ~HashWhirlpool();
WhirlpoolHash() = default;
~WhirlpoolHash() = default;
void Append(const UInt8* data, std::size_t len) override;
void Begin() override;
@@ -29,7 +27,13 @@ namespace Nz
const char* GetHashName() const override;
private:
HashWhirlpool_state* m_state;
void ProcessBuffer();
std::size_t m_bufferBits; // current number of bits on the buffer */
std::size_t m_bufferPos; // current (possibly incomplete) byte slot on the buffer */
UInt8 m_bitLength[32]; // global number of hashed bits (256-bit counter) */
UInt8 m_buffer[64]; // buffer of data to hash */
UInt64 m_hash[8]; // the hashing state */
};
}