initial commit

This commit is contained in:
Brandon Lehmann
2026-02-24 18:11:26 -05:00
commit cc49624c7a
53 changed files with 5153 additions and 0 deletions

90
tests/test_padding.cpp Normal file
View File

@@ -0,0 +1,90 @@
// Copyright (c) 2025-2026, Brandon Lehmann
// BSD 3-Clause License (see LICENSE)
#include "test_harness.h"
#include "tinyaes/cbc.h"
TEST(pkcs7_full_block_padding)
{
// When input is exactly block-aligned, a full padding block (16 bytes of 0x10) is added
std::vector<uint8_t> key(16, 0xAA);
std::vector<uint8_t> iv(16, 0x00);
std::vector<uint8_t> plaintext(16, 0x42); // Exactly one block
std::vector<uint8_t> ct, pt;
auto result = tinyaes::cbc_encrypt_pkcs7(key, iv, plaintext, ct);
ASSERT_TRUE(result == tinyaes::Result::Success);
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_EQ(pt, plaintext);
}
TEST(pkcs7_single_byte)
{
std::vector<uint8_t> key(16, 0xBB);
std::vector<uint8_t> iv(16, 0x00);
std::vector<uint8_t> plaintext = {0xFF};
std::vector<uint8_t> ct, pt;
auto result = tinyaes::cbc_encrypt_pkcs7(key, iv, plaintext, ct);
ASSERT_TRUE(result == tinyaes::Result::Success);
ASSERT_TRUE(ct.size() == 16); // 1 + 15 padding
result = tinyaes::cbc_decrypt_pkcs7(key, iv, ct, pt);
ASSERT_TRUE(result == tinyaes::Result::Success);
ASSERT_EQ(pt, plaintext);
}
TEST(pkcs7_empty_plaintext)
{
std::vector<uint8_t> key(16, 0xCC);
std::vector<uint8_t> iv(16, 0x00);
std::vector<uint8_t> plaintext; // Empty
std::vector<uint8_t> ct, pt;
auto result = tinyaes::cbc_encrypt_pkcs7(key, iv, plaintext, ct);
ASSERT_TRUE(result == tinyaes::Result::Success);
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_EQ(pt, plaintext);
}
TEST(pkcs7_15_byte_plaintext)
{
std::vector<uint8_t> key(16, 0xDD);
std::vector<uint8_t> iv(16, 0x00);
std::vector<uint8_t> plaintext(15, 0x42);
std::vector<uint8_t> ct, pt;
auto result = tinyaes::cbc_encrypt_pkcs7(key, iv, plaintext, ct);
ASSERT_TRUE(result == tinyaes::Result::Success);
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_EQ(pt, plaintext);
}
TEST(pkcs7_invalid_padding_rejected)
{
// Construct ciphertext that decrypts to invalid padding
std::vector<uint8_t> key(16, 0xEE);
std::vector<uint8_t> iv(16, 0x00);
// Encrypt known plaintext, then corrupt last byte of ciphertext
std::vector<uint8_t> plaintext(16, 0x42);
std::vector<uint8_t> ct, pt;
auto result = tinyaes::cbc_encrypt_pkcs7(key, iv, plaintext, ct);
ASSERT_TRUE(result == tinyaes::Result::Success);
// Flip a bit in the last block (padding block)
ct.back() ^= 0x01;
result = tinyaes::cbc_decrypt_pkcs7(key, iv, ct, pt);
ASSERT_TRUE(result == tinyaes::Result::InvalidPadding);
}