Cybersecurity-Projects/PROJECTS/beginner/hash-cracker/tests/test_hashers.cpp

88 lines
2.9 KiB
C++

/*
©AngelaMos | 2026
test_hashers.cpp
Tests for all four hash algorithm implementations against known vectors
Verifies MD5, SHA-1, SHA-256, and SHA-512 against NIST/RFC test vectors
for empty string and "password". Checks static name() and digest_length()
properties. Confirms deterministic output and non-empty results.
Connects to:
hash/MD5Hasher.hpp - MD5Hasher tested
hash/SHA1Hasher.hpp - SHA1Hasher tested
hash/SHA256Hasher.hpp - SHA256Hasher tested
hash/SHA512Hasher.hpp - SHA512Hasher tested
hash/EVPHasher.hpp - underlying implementation
*/
#include "src/hash/MD5Hasher.hpp"
#include "src/hash/SHA1Hasher.hpp"
#include "src/hash/SHA256Hasher.hpp"
#include "src/hash/SHA512Hasher.hpp"
#include <gtest/gtest.h>
TEST(SHA256HasherTest, KnownVectors) {
SHA256Hasher hasher;
EXPECT_EQ(hasher.hash(""), "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855");
EXPECT_EQ(hasher.hash("password"),
"5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8");
EXPECT_EQ(hasher.hash("hello"),
"2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824");
}
TEST(SHA256HasherTest, StaticProperties) {
EXPECT_EQ(SHA256Hasher::name(), "SHA256");
EXPECT_EQ(SHA256Hasher::digest_length(), 64);
}
TEST(SHA256HasherTest, Deterministic) {
SHA256Hasher hasher;
auto h1 = hasher.hash("test");
auto h2 = hasher.hash("test");
EXPECT_EQ(h1, h2);
}
TEST(MD5HasherTest, KnownVectors) {
MD5Hasher hasher;
EXPECT_EQ(hasher.hash(""), "d41d8cd98f00b204e9800998ecf8427e");
EXPECT_EQ(hasher.hash("password"), "5f4dcc3b5aa765d61d8327deb882cf99");
}
TEST(MD5HasherTest, StaticProperties) {
EXPECT_EQ(MD5Hasher::name(), "MD5");
EXPECT_EQ(MD5Hasher::digest_length(), 32);
}
TEST(SHA1HasherTest, KnownVectors) {
SHA1Hasher hasher;
EXPECT_EQ(hasher.hash(""), "da39a3ee5e6b4b0d3255bfef95601890afd80709");
EXPECT_EQ(hasher.hash("password"), "5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8");
}
TEST(SHA1HasherTest, StaticProperties) {
EXPECT_EQ(SHA1Hasher::name(), "SHA1");
EXPECT_EQ(SHA1Hasher::digest_length(), 40);
}
TEST(SHA512HasherTest, KnownVectors) {
SHA512Hasher hasher;
EXPECT_EQ(hasher.hash(""), "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce"
"47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e");
EXPECT_EQ(hasher.hash("password"),
"b109f3bbbc244eb82441917ed06d618b9008dd09b3befd1b5e07394c706a8bb9"
"80b1d7785e5976ec049b46df5f1326af5a2ea6d103fd07c95385ffab0cacbc86");
}
TEST(SHA512HasherTest, StaticProperties) {
EXPECT_EQ(SHA512Hasher::name(), "SHA512");
EXPECT_EQ(SHA512Hasher::digest_length(), 128);
}
TEST(HasherTest, NeverReturnsEmpty) {
EXPECT_FALSE(MD5Hasher{}.hash("test").empty());
EXPECT_FALSE(SHA1Hasher{}.hash("test").empty());
EXPECT_FALSE(SHA256Hasher{}.hash("test").empty());
EXPECT_FALSE(SHA512Hasher{}.hash("test").empty());
}