Fix ARM CE byte ordering, expand C/C++ API, and harden build
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.
This commit is contained in:
@@ -13,11 +13,11 @@ TEST(pkcs7_full_block_padding)
|
||||
std::vector<uint8_t> ct, pt;
|
||||
|
||||
auto result = tinyaes::cbc_encrypt_pkcs7(key, iv, plaintext, ct);
|
||||
ASSERT_TRUE(result == tinyaes::Result::Success);
|
||||
ASSERT_TRUE(result == tinyaes::Result::Ok);
|
||||
ASSERT_TRUE(ct.size() == 32); // 16 data + 16 padding
|
||||
|
||||
result = tinyaes::cbc_decrypt_pkcs7(key, iv, ct, pt);
|
||||
ASSERT_TRUE(result == tinyaes::Result::Success);
|
||||
ASSERT_TRUE(result == tinyaes::Result::Ok);
|
||||
ASSERT_EQ(pt, plaintext);
|
||||
}
|
||||
|
||||
@@ -29,11 +29,11 @@ TEST(pkcs7_single_byte)
|
||||
std::vector<uint8_t> ct, pt;
|
||||
|
||||
auto result = tinyaes::cbc_encrypt_pkcs7(key, iv, plaintext, ct);
|
||||
ASSERT_TRUE(result == tinyaes::Result::Success);
|
||||
ASSERT_TRUE(result == tinyaes::Result::Ok);
|
||||
ASSERT_TRUE(ct.size() == 16); // 1 + 15 padding
|
||||
|
||||
result = tinyaes::cbc_decrypt_pkcs7(key, iv, ct, pt);
|
||||
ASSERT_TRUE(result == tinyaes::Result::Success);
|
||||
ASSERT_TRUE(result == tinyaes::Result::Ok);
|
||||
ASSERT_EQ(pt, plaintext);
|
||||
}
|
||||
|
||||
@@ -45,11 +45,11 @@ TEST(pkcs7_empty_plaintext)
|
||||
std::vector<uint8_t> ct, pt;
|
||||
|
||||
auto result = tinyaes::cbc_encrypt_pkcs7(key, iv, plaintext, ct);
|
||||
ASSERT_TRUE(result == tinyaes::Result::Success);
|
||||
ASSERT_TRUE(result == tinyaes::Result::Ok);
|
||||
ASSERT_TRUE(ct.size() == 16); // Full block of padding (0x10)
|
||||
|
||||
result = tinyaes::cbc_decrypt_pkcs7(key, iv, ct, pt);
|
||||
ASSERT_TRUE(result == tinyaes::Result::Success);
|
||||
ASSERT_TRUE(result == tinyaes::Result::Ok);
|
||||
ASSERT_EQ(pt, plaintext);
|
||||
}
|
||||
|
||||
@@ -61,11 +61,11 @@ TEST(pkcs7_15_byte_plaintext)
|
||||
std::vector<uint8_t> ct, pt;
|
||||
|
||||
auto result = tinyaes::cbc_encrypt_pkcs7(key, iv, plaintext, ct);
|
||||
ASSERT_TRUE(result == tinyaes::Result::Success);
|
||||
ASSERT_TRUE(result == tinyaes::Result::Ok);
|
||||
ASSERT_TRUE(ct.size() == 16); // 15 + 1 padding byte
|
||||
|
||||
result = tinyaes::cbc_decrypt_pkcs7(key, iv, ct, pt);
|
||||
ASSERT_TRUE(result == tinyaes::Result::Success);
|
||||
ASSERT_TRUE(result == tinyaes::Result::Ok);
|
||||
ASSERT_EQ(pt, plaintext);
|
||||
}
|
||||
|
||||
@@ -80,7 +80,7 @@ TEST(pkcs7_invalid_padding_rejected)
|
||||
std::vector<uint8_t> ct, pt;
|
||||
|
||||
auto result = tinyaes::cbc_encrypt_pkcs7(key, iv, plaintext, ct);
|
||||
ASSERT_TRUE(result == tinyaes::Result::Success);
|
||||
ASSERT_TRUE(result == tinyaes::Result::Ok);
|
||||
|
||||
// Flip a bit in the last block (padding block)
|
||||
ct.back() ^= 0x01;
|
||||
@@ -88,3 +88,25 @@ TEST(pkcs7_invalid_padding_rejected)
|
||||
result = tinyaes::cbc_decrypt_pkcs7(key, iv, ct, pt);
|
||||
ASSERT_TRUE(result == tinyaes::Result::InvalidPadding);
|
||||
}
|
||||
|
||||
TEST(pkcs7_multi_position_corruption)
|
||||
{
|
||||
// Encrypt a known 16-byte plaintext, then corrupt each of the 16 positions
|
||||
// in the padding block and verify InvalidPadding for each
|
||||
std::vector<uint8_t> key(16, 0xEE);
|
||||
std::vector<uint8_t> iv(16, 0x00);
|
||||
std::vector<uint8_t> plaintext(16, 0x42);
|
||||
std::vector<uint8_t> ct_orig, pt;
|
||||
|
||||
auto result = tinyaes::cbc_encrypt_pkcs7(key, iv, plaintext, ct_orig);
|
||||
ASSERT_TRUE(result == tinyaes::Result::Ok);
|
||||
ASSERT_TRUE(ct_orig.size() == 32); // 16 data + 16 padding block
|
||||
|
||||
for (size_t i = 0; i < 16; ++i)
|
||||
{
|
||||
std::vector<uint8_t> ct = ct_orig;
|
||||
ct[16 + i] ^= 0x01; // corrupt position i of the padding block
|
||||
result = tinyaes::cbc_decrypt_pkcs7(key, iv, ct, pt);
|
||||
ASSERT_TRUE(result == tinyaes::Result::InvalidPadding);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user