ARM backends: fix round key byte-swap on little-endian (vrev32q_u8), rewrite decrypt to pre-process middle keys with InvMixColumns, fix GHASH PMULL reflect and reduction ordering. API: add nonce/IV-generating convenience overloads for CTR, CBC, and GCM (library generates and prepends nonce, appends tag). Add C API for IV/nonce generation. Rename error codes (TINYAES_OK, Result::Ok, Result::AuthenticationFailed, etc.). Build: add MinGW GCC AVX-512 debug alignment fix, harden bench/fuzz CMake targets (warnings-as-errors, linker hardening), align with tinysha CMake conventions. Add README. Tests: expand coverage for nonce-generating API overloads, add NIST GCM test vectors, improve fuzz target differential testing.
94 lines
2.6 KiB
C++
94 lines
2.6 KiB
C++
// Copyright (c) 2025-2026, Brandon Lehmann
|
|
// BSD 3-Clause License (see LICENSE)
|
|
|
|
#include "test_harness.h"
|
|
#include "tinyaes/ecb.h"
|
|
|
|
#include "vectors/aes_ecb_vectors.inl"
|
|
|
|
#define VEC(arr) std::vector<uint8_t>(arr, arr + sizeof(arr))
|
|
|
|
TEST(ecb_aes128_encrypt)
|
|
{
|
|
std::vector<uint8_t> ct;
|
|
auto result = tinyaes::ecb_encrypt(VEC(ecb_128_key), VEC(ecb_128_plain), ct);
|
|
ASSERT_TRUE(result == tinyaes::Result::Ok);
|
|
ASSERT_EQ(ct, VEC(ecb_128_cipher));
|
|
}
|
|
|
|
TEST(ecb_aes128_decrypt)
|
|
{
|
|
std::vector<uint8_t> pt;
|
|
auto result = tinyaes::ecb_decrypt(VEC(ecb_128_key), VEC(ecb_128_cipher), pt);
|
|
ASSERT_TRUE(result == tinyaes::Result::Ok);
|
|
ASSERT_EQ(pt, VEC(ecb_128_plain));
|
|
}
|
|
|
|
TEST(ecb_aes192_encrypt)
|
|
{
|
|
std::vector<uint8_t> ct;
|
|
auto result = tinyaes::ecb_encrypt(VEC(ecb_192_key), VEC(ecb_192_plain), ct);
|
|
ASSERT_TRUE(result == tinyaes::Result::Ok);
|
|
ASSERT_EQ(ct, VEC(ecb_192_cipher));
|
|
}
|
|
|
|
TEST(ecb_aes192_decrypt)
|
|
{
|
|
std::vector<uint8_t> pt;
|
|
auto result = tinyaes::ecb_decrypt(VEC(ecb_192_key), VEC(ecb_192_cipher), pt);
|
|
ASSERT_TRUE(result == tinyaes::Result::Ok);
|
|
ASSERT_EQ(pt, VEC(ecb_192_plain));
|
|
}
|
|
|
|
TEST(ecb_aes256_encrypt)
|
|
{
|
|
std::vector<uint8_t> ct;
|
|
auto result = tinyaes::ecb_encrypt(VEC(ecb_256_key), VEC(ecb_256_plain), ct);
|
|
ASSERT_TRUE(result == tinyaes::Result::Ok);
|
|
ASSERT_EQ(ct, VEC(ecb_256_cipher));
|
|
}
|
|
|
|
TEST(ecb_aes256_decrypt)
|
|
{
|
|
std::vector<uint8_t> pt;
|
|
auto result = tinyaes::ecb_decrypt(VEC(ecb_256_key), VEC(ecb_256_cipher), pt);
|
|
ASSERT_TRUE(result == tinyaes::Result::Ok);
|
|
ASSERT_EQ(pt, VEC(ecb_256_plain));
|
|
}
|
|
|
|
TEST(ecb_aes128_multi_block)
|
|
{
|
|
std::vector<uint8_t> ct;
|
|
auto result = tinyaes::ecb_encrypt(VEC(ecb_128_multi_key), VEC(ecb_128_multi_plain), ct);
|
|
ASSERT_TRUE(result == tinyaes::Result::Ok);
|
|
ASSERT_EQ(ct, VEC(ecb_128_multi_cipher));
|
|
}
|
|
|
|
TEST(ecb_aes128_multi_block_decrypt)
|
|
{
|
|
std::vector<uint8_t> pt;
|
|
auto result = tinyaes::ecb_decrypt(VEC(ecb_128_multi_key), VEC(ecb_128_multi_cipher), pt);
|
|
ASSERT_TRUE(result == tinyaes::Result::Ok);
|
|
ASSERT_EQ(pt, VEC(ecb_128_multi_plain));
|
|
}
|
|
|
|
TEST(ecb_invalid_key_size)
|
|
{
|
|
std::vector<uint8_t> key(15, 0), pt(16, 0), ct;
|
|
ASSERT_TRUE(tinyaes::ecb_encrypt(key, pt, ct) == tinyaes::Result::InvalidKeySize);
|
|
}
|
|
|
|
TEST(ecb_non_block_aligned)
|
|
{
|
|
std::vector<uint8_t> key(16, 0), pt(17, 0), ct;
|
|
ASSERT_TRUE(tinyaes::ecb_encrypt(key, pt, ct) == tinyaes::Result::InvalidInputSize);
|
|
}
|
|
|
|
TEST(ecb_empty_input)
|
|
{
|
|
std::vector<uint8_t> key(16, 0), pt, ct;
|
|
ASSERT_TRUE(tinyaes::ecb_encrypt(key, pt, ct) == tinyaes::Result::InvalidInputSize);
|
|
}
|
|
|
|
#undef VEC
|