Add HMAC as per RFC 2104 draft implementation

This commit is contained in:
hashlag
2025-08-21 02:09:30 +03:00
parent 6c2feef644
commit be03a5314c
5 changed files with 181 additions and 5 deletions

View File

@@ -12,7 +12,8 @@ set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
FetchContent_MakeAvailable(googletest)
set(ChaosTests_SOURCE Md4HasherTests.cpp
Md5HasherTests.cpp)
Md5HasherTests.cpp
HmacTests.cpp)
add_executable(ChaosTests ${ChaosTests_SOURCE})
target_link_libraries(ChaosTests gtest gtest_main)

52
ChaosTests/HmacTests.cpp Normal file
View File

@@ -0,0 +1,52 @@
#include <gtest/gtest.h>
#include "Hash/Md5.hpp"
#include "Mac/Hmac.hpp"
using namespace Chaos::Mac::Hmac;
using namespace Chaos::Hash::Md5;
TEST(HmacTests, RFCTest)
{
struct Helper
{
std::string operator()(const char * key, const char * data) const
{
Hmac<Md5Hasher> hmac(key, key + strlen(key));
hmac.Update(data, data + strlen(data));
return hmac.Finish().ToHexString();
}
};
Helper hmacMd5;
{
const char * key = "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"
"\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b";
const char * data = "Hi There";
ASSERT_EQ("9294727a3638bb1c13f48ef8158bfc9d", hmacMd5(key, data));
}
{
const char * key = "Jefe";
const char * data = "what do ya want for nothing?";
ASSERT_EQ("750c783e6ab0b503eaa86e310a5db738", hmacMd5(key, data));
}
{
uint8_t key[] = { 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa };
uint8_t data[] = { 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd };
Hmac<Md5Hasher> hmacMd5(key, key + std::size(key));
hmacMd5.Update(data, data + std::size(data));
ASSERT_EQ("56be34521d144c88dbb8c733f0e8b3f6", hmacMd5.Finish().ToHexString());
}
}