// Copyright (c) 2025-2026, Brandon Lehmann // BSD 3-Clause License (see LICENSE) #include "test_harness.h" #include "tinyaes/gcm.h" #include "vectors/aes_gcm_vectors.inl" #define VEC(arr) std::vector(arr, arr + sizeof(arr)) #define EMPTY_VEC std::vector() TEST(gcm_tc1_aes128_no_plaintext_no_aad) { std::vector ct, tag; auto result = tinyaes::gcm_encrypt(VEC(gcm_tc1_key), VEC(gcm_tc1_iv), EMPTY_VEC, EMPTY_VEC, ct, tag); ASSERT_TRUE(result == tinyaes::Result::Success); ASSERT_TRUE(ct.empty()); ASSERT_EQ(tag, VEC(gcm_tc1_tag)); } TEST(gcm_tc2_aes128_16byte_plaintext) { std::vector ct, tag; auto result = tinyaes::gcm_encrypt(VEC(gcm_tc2_key), VEC(gcm_tc2_iv), EMPTY_VEC, VEC(gcm_tc2_plain), ct, tag); ASSERT_TRUE(result == tinyaes::Result::Success); ASSERT_EQ(ct, VEC(gcm_tc2_cipher)); ASSERT_EQ(tag, VEC(gcm_tc2_tag)); } TEST(gcm_tc3_aes128_64byte_plaintext) { std::vector ct, tag; auto result = tinyaes::gcm_encrypt(VEC(gcm_tc3_key), VEC(gcm_tc3_iv), EMPTY_VEC, VEC(gcm_tc3_plain), ct, tag); ASSERT_TRUE(result == tinyaes::Result::Success); ASSERT_EQ(ct, VEC(gcm_tc3_cipher)); ASSERT_EQ(tag, VEC(gcm_tc3_tag)); } TEST(gcm_tc4_aes128_with_aad) { std::vector ct, tag; auto result = tinyaes::gcm_encrypt(VEC(gcm_tc4_key), VEC(gcm_tc4_iv), VEC(gcm_tc4_aad), VEC(gcm_tc4_plain), ct, tag); ASSERT_TRUE(result == tinyaes::Result::Success); ASSERT_EQ(ct, VEC(gcm_tc4_cipher)); ASSERT_EQ(tag, VEC(gcm_tc4_tag)); } TEST(gcm_tc13_aes256_no_plaintext_no_aad) { std::vector ct, tag; auto result = tinyaes::gcm_encrypt(VEC(gcm_tc13_key), VEC(gcm_tc13_iv), EMPTY_VEC, EMPTY_VEC, ct, tag); ASSERT_TRUE(result == tinyaes::Result::Success); ASSERT_TRUE(ct.empty()); ASSERT_EQ(tag, VEC(gcm_tc13_tag)); } TEST(gcm_tc14_aes256_16byte_plaintext) { std::vector ct, tag; auto result = tinyaes::gcm_encrypt(VEC(gcm_tc14_key), VEC(gcm_tc14_iv), EMPTY_VEC, VEC(gcm_tc14_plain), ct, tag); ASSERT_TRUE(result == tinyaes::Result::Success); ASSERT_EQ(ct, VEC(gcm_tc14_cipher)); ASSERT_EQ(tag, VEC(gcm_tc14_tag)); } TEST(gcm_tc2_decrypt_verify) { std::vector pt; auto result = tinyaes::gcm_decrypt(VEC(gcm_tc2_key), VEC(gcm_tc2_iv), EMPTY_VEC, VEC(gcm_tc2_cipher), VEC(gcm_tc2_tag), pt); ASSERT_TRUE(result == tinyaes::Result::Success); ASSERT_EQ(pt, VEC(gcm_tc2_plain)); } TEST(gcm_tc3_decrypt_verify) { std::vector pt; auto result = tinyaes::gcm_decrypt(VEC(gcm_tc3_key), VEC(gcm_tc3_iv), EMPTY_VEC, VEC(gcm_tc3_cipher), VEC(gcm_tc3_tag), pt); ASSERT_TRUE(result == tinyaes::Result::Success); ASSERT_EQ(pt, VEC(gcm_tc3_plain)); } TEST(gcm_tc4_decrypt_verify) { std::vector pt; auto result = tinyaes::gcm_decrypt(VEC(gcm_tc4_key), VEC(gcm_tc4_iv), VEC(gcm_tc4_aad), VEC(gcm_tc4_cipher), VEC(gcm_tc4_tag), pt); ASSERT_TRUE(result == tinyaes::Result::Success); ASSERT_EQ(pt, VEC(gcm_tc4_plain)); } TEST(gcm_roundtrip) { std::vector key(16, 0x42); std::vector iv(12, 0x01); std::vector aad = {0xAA, 0xBB, 0xCC}; std::vector plaintext = {0x48, 0x65, 0x6c, 0x6c, 0x6f}; // "Hello" std::vector ct, tag, pt; auto result = tinyaes::gcm_encrypt(key, iv, aad, plaintext, ct, tag); ASSERT_TRUE(result == tinyaes::Result::Success); result = tinyaes::gcm_decrypt(key, iv, aad, ct, tag, pt); ASSERT_TRUE(result == tinyaes::Result::Success); ASSERT_EQ(pt, plaintext); } #undef VEC #undef EMPTY_VEC