Compare commits

...

11 Commits

Author SHA1 Message Date
hashlag
2c9200ab21 Merge branch 'mac-bench'
All checks were successful
Chaos Ci / test-and-benchmark (push) Successful in 1m44s
Add benchmarks for MAC algorithms.
2026-01-29 23:43:28 +03:00
hashlag
6246bf4538 Add HmacSha1_PartialUpdate100Bench 2026-01-29 23:40:39 +03:00
hashlag
78c59dc668 Add HmacSha1_ReuseBench 2026-01-29 23:39:00 +03:00
hashlag
d4fa11795b Add HmacSha1_CreateComputeDeleteBench 2026-01-29 23:38:22 +03:00
hashlag
3780586e63 Add HmacMd5_PartialUpdate100Bench 2026-01-29 23:34:53 +03:00
hashlag
cc9963f1ca Add HmacMd5_ReuseBench 2026-01-29 23:34:20 +03:00
hashlag
05533e7c6b Add HmacMd5_CreateComputeDeleteBench 2026-01-29 23:33:45 +03:00
hashlag
961a521c57 Add HmacBenches.cpp to ChaosBenches_SOURCE 2026-01-29 23:31:15 +03:00
hashlag
029055f9a3 Add HmacMd4_PartialUpdate100Bench 2026-01-29 23:30:16 +03:00
hashlag
b5f86b5633 Add HmacMd4_ReuseBench 2026-01-29 23:29:33 +03:00
hashlag
0bc29c86e5 Add HmacMd4_CreateComputeDeleteBench 2026-01-29 23:16:07 +03:00
2 changed files with 175 additions and 1 deletions

View File

@@ -15,7 +15,8 @@ FetchContent_MakeAvailable(googlebenchmark)
set(ChaosBenches_SOURCE BenchmarkMain.cpp set(ChaosBenches_SOURCE BenchmarkMain.cpp
Hash/Md4HasherBenches.cpp Hash/Md4HasherBenches.cpp
Hash/Md5HasherBenches.cpp Hash/Md5HasherBenches.cpp
Hash/Sha1HasherBenches.cpp) Hash/Sha1HasherBenches.cpp
Mac/HmacBenches.cpp)
add_executable(ChaosBenches ${ChaosBenches_SOURCE}) add_executable(ChaosBenches ${ChaosBenches_SOURCE})
target_link_libraries(ChaosBenches benchmark::benchmark) target_link_libraries(ChaosBenches benchmark::benchmark)

View File

@@ -0,0 +1,173 @@
#include <benchmark/benchmark.h>
#include <cstring>
#include "Mac/Hmac.hpp"
#include "Hash/Md4.hpp"
#include "Hash/Md5.hpp"
#include "Hash/Sha1.hpp"
using namespace Chaos::Mac::Hmac;
using namespace Chaos::Hash::Md4;
using namespace Chaos::Hash::Md5;
using namespace Chaos::Hash::Sha1;
static const char * KEY_BEGIN = "Niccolo01234567";
static const size_t KEY_LEN = strlen(KEY_BEGIN);
static const char * KEY_END = KEY_BEGIN + KEY_LEN;
static const char * DATA_BEGIN
= "All states, all powers, that have held and hold rule over men have been and are either republics or principalities.\n"
"Principalities are either hereditary, in which the family has been long established; or they are new.\n"
"The new are either entirely new, as was Milan to Francesco Sforza, or they are, as it were, members annexed to the hereditary state of the "
"prince who has acquired them, as was the kingdom of Naples to that of the King of Spain.\n"
"Such dominions thus acquired are either accustomed to live under a prince, or to live in freedom; and are acquired either by the arms of the "
"prince himself, or of others, or else by fortune or by ability.";
static const size_t DATA_LEN = strlen(DATA_BEGIN);
static const char * DATA_END = DATA_BEGIN + DATA_LEN;
static void HmacMd4_CreateComputeDeleteBench(benchmark::State & state)
{
for (auto _ : state)
{
Hmac<Md4Hasher> hmac(KEY_BEGIN, KEY_END);
hmac.Update(DATA_BEGIN, DATA_END);
Md4Hash result = hmac.Finish();
benchmark::DoNotOptimize(result);
}
}
BENCHMARK(HmacMd4_CreateComputeDeleteBench);
static void HmacMd4_ReuseBench(benchmark::State & state)
{
Hmac<Md4Hasher> hmac;
for (auto _ : state)
{
hmac.Rekey(KEY_BEGIN, KEY_END);
hmac.Update(DATA_BEGIN, DATA_END);
Md4Hash result = hmac.Finish();
benchmark::DoNotOptimize(result);
}
}
BENCHMARK(HmacMd4_ReuseBench);
static void HmacMd4_PartialUpdate100Bench(benchmark::State & state)
{
for (auto _ : state)
{
Hmac<Md4Hasher> hmac(KEY_BEGIN, KEY_END);
for (int i = 0; i < 100; ++i)
{
hmac.Update(DATA_BEGIN, DATA_END);
}
Md4Hash result = hmac.Finish();
benchmark::DoNotOptimize(result);
}
}
BENCHMARK(HmacMd4_PartialUpdate100Bench);
static void HmacMd5_CreateComputeDeleteBench(benchmark::State & state)
{
for (auto _ : state)
{
Hmac<Md5Hasher> hmac(KEY_BEGIN, KEY_END);
hmac.Update(DATA_BEGIN, DATA_END);
Md5Hash result = hmac.Finish();
benchmark::DoNotOptimize(result);
}
}
BENCHMARK(HmacMd5_CreateComputeDeleteBench);
static void HmacMd5_ReuseBench(benchmark::State & state)
{
Hmac<Md5Hasher> hmac;
for (auto _ : state)
{
hmac.Rekey(KEY_BEGIN, KEY_END);
hmac.Update(DATA_BEGIN, DATA_END);
Md5Hash result = hmac.Finish();
benchmark::DoNotOptimize(result);
}
}
BENCHMARK(HmacMd5_ReuseBench);
static void HmacMd5_PartialUpdate100Bench(benchmark::State & state)
{
for (auto _ : state)
{
Hmac<Md5Hasher> hmac(KEY_BEGIN, KEY_END);
for (int i = 0; i < 100; ++i)
{
hmac.Update(DATA_BEGIN, DATA_END);
}
Md5Hash result = hmac.Finish();
benchmark::DoNotOptimize(result);
}
}
BENCHMARK(HmacMd5_PartialUpdate100Bench);
static void HmacSha1_CreateComputeDeleteBench(benchmark::State & state)
{
for (auto _ : state)
{
Hmac<Sha1Hasher> hmac(KEY_BEGIN, KEY_END);
hmac.Update(DATA_BEGIN, DATA_END);
Sha1Hash result = hmac.Finish();
benchmark::DoNotOptimize(result);
}
}
BENCHMARK(HmacSha1_CreateComputeDeleteBench);
static void HmacSha1_ReuseBench(benchmark::State & state)
{
Hmac<Sha1Hasher> hmac;
for (auto _ : state)
{
hmac.Rekey(KEY_BEGIN, KEY_END);
hmac.Update(DATA_BEGIN, DATA_END);
Sha1Hash result = hmac.Finish();
benchmark::DoNotOptimize(result);
}
}
BENCHMARK(HmacSha1_ReuseBench);
static void HmacSha1_PartialUpdate100Bench(benchmark::State & state)
{
for (auto _ : state)
{
Hmac<Sha1Hasher> hmac(KEY_BEGIN, KEY_END);
for (int i = 0; i < 100; ++i)
{
hmac.Update(DATA_BEGIN, DATA_END);
}
Sha1Hash result = hmac.Finish();
benchmark::DoNotOptimize(result);
}
}
BENCHMARK(HmacSha1_PartialUpdate100Bench);