Compare commits

...

17 Commits

Author SHA1 Message Date
hashlag
0647a7c3dc DesEncryptor/DesDecryptor: expose key type.
All checks were successful
Chaos Ci / test-and-benchmark (push) Successful in 1m57s
2026-02-08 02:57:00 +03:00
hashlag
7c86d704b7 Merge branch 'block-expose-key-size'
All checks were successful
Chaos Ci / test-and-benchmark (push) Successful in 1m54s
Expose block ciphers' key sizes for usage in compile-time context.
2026-02-07 18:14:09 +03:00
hashlag
9f6265395d DesCryptTests: Replace magic const 8 (where used as the key length) with DesCrypt::KeySize.
All checks were successful
Chaos Ci / test-and-benchmark (push) Successful in 1m51s
2026-02-07 18:09:42 +03:00
hashlag
151c93560c Expose DES key size through DesCrypt, DesCrypt::Encryptor, DesCrypt::Decryptor. 2026-02-07 18:02:27 +03:00
hashlag
3059bd4c66 Make SeArray::Size() static. 2026-02-07 17:54:37 +03:00
hashlag
ccf1397595 Merge branch 'exception-tests'
All checks were successful
Chaos Ci / test-and-benchmark (push) Successful in 1m56s
Add missing ChaosException tests.
2026-02-06 18:18:45 +03:00
hashlag
6a09d81ae2 Add ChaosExceptionTests.
All checks were successful
Chaos Ci / test-and-benchmark (push) Successful in 2m2s
2026-02-06 18:05:57 +03:00
hashlag
b4f015f501 Compile tests with -Wunused -Werror=unused.
All checks were successful
Chaos Ci / test-and-benchmark (push) Successful in 1m54s
Promotes cleaner and less error-prone code.
2026-02-05 16:16:38 +03:00
hashlag
95e74db6ec Perform aggregate zero-init instead of .fill(0) where appropriate.
All checks were successful
Chaos Ci / test-and-benchmark (push) Successful in 1m50s
Simpler and more consistent code.
2026-02-05 00:40:55 +03:00
hashlag
ed22d29af0 Merge branch 'explicit-bounds'
All checks were successful
Chaos Ci / test-and-benchmark (push) Successful in 1m50s
Harden against out-of-bounds writes.
2026-02-04 23:52:50 +03:00
hashlag
65eb51c133 Remove unused CrunchUInt64() overload.
All checks were successful
Chaos Ci / test-and-benchmark (push) Successful in 1m57s
2026-02-04 23:47:45 +03:00
hashlag
b34fda75ef DesCryptTests: IteratorUsage tests: Add testcases with begin == end.
All checks were successful
Chaos Ci / test-and-benchmark (push) Successful in 1m57s
2026-02-04 23:37:05 +03:00
hashlag
15d841893c IteratorUsage tests: Add some canary nulled space before begin.
Hardening against write-before-begin.
2026-02-04 23:31:14 +03:00
hashlag
5fd27cd7b5 Merge branch 'stream-bounds-tests' into explicit-bounds
All checks were successful
Chaos Ci / test-and-benchmark (push) Successful in 1m50s
Add some past-the-end write hardening tests for stream ciphers.
2026-02-04 01:02:56 +03:00
hashlag
1bf91a90d0 Add Arc4CryptTests, DecryptOutIteratorUsageTest.
Harden against past-the-end write.
2026-02-04 01:01:54 +03:00
hashlag
2d64389d66 Add Arc4CryptTests, EncryptOutIteratorUsageTest.
Harden against past-the-end write.
2026-02-04 00:43:40 +03:00
hashlag
ccdf14d31a Add Arc4GenTests, GenerateOutIteratorUsageTest.
Harden against past-the-end write.
2026-02-04 00:25:15 +03:00
8 changed files with 287 additions and 68 deletions

View File

@@ -82,15 +82,6 @@ struct Bitwise
return result; return result;
} }
template<typename OutputIt>
static void CrunchUInt64(OutputIt out, uint64_t value)
{
for (int_fast8_t i = 0; i < 8; ++i)
{
*out++ = (value >> (56 - (i * 8))) & Mask<8>();
}
}
template<typename OutputIt> template<typename OutputIt>
static void CrunchUInt64(OutputIt outBegin, OutputIt outEnd, uint64_t value) static void CrunchUInt64(OutputIt outBegin, OutputIt outEnd, uint64_t value)
{ {
@@ -207,8 +198,10 @@ class DesCrypt
public: public:
using Block = uint64_t; using Block = uint64_t;
static constexpr size_t BlockSize = 8; static constexpr size_t BlockSize = 8;
static constexpr size_t KeySize = 8;
static_assert(BlockSize == sizeof(Block)); static_assert(BlockSize == sizeof(Block));
static_assert(KeySize == Inner_::RawKey::Size());
DesCrypt() = delete; DesCrypt() = delete;
@@ -240,7 +233,9 @@ public:
class DesEncryptor : public Encryptor<DesEncryptor> class DesEncryptor : public Encryptor<DesEncryptor>
{ {
public: public:
using Key = DesCrypt::Key;
static constexpr size_t BlockSize = DesCrypt::BlockSize; static constexpr size_t BlockSize = DesCrypt::BlockSize;
static constexpr size_t KeySize = DesCrypt::KeySize;
DesEncryptor(const Key & key) DesEncryptor(const Key & key)
: Schedule_(Inner_::KeySchedule::Direction::Encrypt, key.Key_) : Schedule_(Inner_::KeySchedule::Direction::Encrypt, key.Key_)
@@ -283,7 +278,9 @@ public:
class DesDecryptor : public Decryptor<DesDecryptor> class DesDecryptor : public Decryptor<DesDecryptor>
{ {
public: public:
using Key = DesCrypt::Key;
static constexpr size_t BlockSize = DesCrypt::BlockSize; static constexpr size_t BlockSize = DesCrypt::BlockSize;
static constexpr size_t KeySize = DesCrypt::KeySize;
DesDecryptor(const Key & key) DesDecryptor(const Key & key)
: Schedule_(Inner_::KeySchedule::Direction::Decrypt, key.Key_) : Schedule_(Inner_::KeySchedule::Direction::Decrypt, key.Key_)

View File

@@ -58,11 +58,6 @@ public:
return Storage_.data() + Storage_.size(); return Storage_.data() + Storage_.size();
} }
constexpr size_t Size() const noexcept
{
return Storage_.size();
}
void Fill(const T & value) void Fill(const T & value)
{ {
Storage_.fill(value); Storage_.fill(value);
@@ -73,6 +68,11 @@ public:
EraseImpl(); EraseImpl();
} }
static constexpr size_t Size() noexcept
{
return S;
}
private: private:
std::array<T, S> Storage_; std::array<T, S> Storage_;

View File

@@ -18,7 +18,8 @@ set(ChaosTests_SOURCE Hash/Md4HasherTests.cpp
Cipher/Arc4GenTests.cpp Cipher/Arc4GenTests.cpp
Cipher/Arc4CryptTests.cpp Cipher/Arc4CryptTests.cpp
Cipher/DesCryptTests.cpp Cipher/DesCryptTests.cpp
Service/SeArrayTests.cpp) Service/SeArrayTests.cpp
Service/ChaosExceptionTests.cpp)
add_executable(ChaosTests ${ChaosTests_SOURCE}) add_executable(ChaosTests ${ChaosTests_SOURCE})
target_link_libraries(ChaosTests gtest gtest_main) target_link_libraries(ChaosTests gtest gtest_main)
@@ -26,6 +27,8 @@ target_include_directories(ChaosTests PRIVATE
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/Chaos> $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/Chaos>
) )
target_compile_options(ChaosTests PRIVATE -Wunused -Werror=unused)
if(CMAKE_BUILD_TYPE STREQUAL "Debug") if(CMAKE_BUILD_TYPE STREQUAL "Debug")
target_compile_options(ChaosTests PRIVATE --coverage) target_compile_options(ChaosTests PRIVATE --coverage)
target_link_options(ChaosTests PRIVATE --coverage) target_link_options(ChaosTests PRIVATE --coverage)

View File

@@ -58,11 +58,8 @@ TEST(Arc4CryptTests, UninitializedArc4CryptTest)
Arc4Crypt arc4; Arc4Crypt arc4;
{ {
std::array<uint8_t, 10> in; std::array<uint8_t, 10> in = {};
in.fill(0); std::array<uint8_t, 10> out = {};
std::array<uint8_t, 10> out;
out.fill(0);
ASSERT_THROW(arc4.Encrypt(out.begin(), in.begin(), in.size()), Chaos::Service::ChaosException); ASSERT_THROW(arc4.Encrypt(out.begin(), in.begin(), in.size()), Chaos::Service::ChaosException);
ASSERT_THROW(arc4.Decrypt(out.begin(), in.begin(), in.size()), Chaos::Service::ChaosException); ASSERT_THROW(arc4.Decrypt(out.begin(), in.begin(), in.size()), Chaos::Service::ChaosException);
@@ -107,3 +104,115 @@ TEST(Arc4CryptTests, RekeyTest)
ciphertext); ciphertext);
} }
} }
TEST(Arc4CryptTests, EncryptOutIteratorUsageTest)
{
const std::vector<uint8_t> data = StrToU8Vec("The quick brown fox jumps over the lazy dog.");
{
std::array<uint8_t, 5> key = { 0x01, 0x02, 0x03, 0x04, 0x05 };
Arc4Crypt crypt(key.begin(), key.end());
std::array<uint8_t, 47> out = {};
std::array<uint8_t, 47> expected =
{
0x00, 0x00, 0x00,
0xe6, 0x51, 0x06, 0x25, 0x81, 0x48, 0xa9, 0x44, 0xa7, 0xe3, 0x30,
0x38, 0x65, 0x66, 0x76, 0x88, 0x0f, 0xed, 0xec, 0x6f, 0x72, 0x89,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
crypt.Encrypt(out.begin() + 3, data.begin(), 22);
ASSERT_EQ(expected, out);
}
{
std::array<uint8_t, 5> key = { 0x01, 0x02, 0x03, 0x04, 0x05 };
Arc4Crypt crypt(key.begin(), key.end());
std::array<uint8_t, 47> out = {};
std::array<uint8_t, 47> expected =
{
0x00, 0x00, 0x00,
0xe6, 0x51, 0x06, 0x25, 0x81, 0x48, 0xa9, 0x44, 0xa7, 0xe3, 0x30,
0x38, 0x65, 0x66, 0x76, 0x88, 0x0f, 0xed, 0xec, 0x6f, 0x72, 0x89,
0xef, 0xa5, 0xfa, 0xe4, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
crypt.Encrypt(out.begin() + 3, data.begin(), 27);
ASSERT_EQ(expected, out);
}
{
std::array<uint8_t, 5> key = { 0x01, 0x02, 0x03, 0x04, 0x05 };
Arc4Crypt crypt(key.begin(), key.end());
std::array<uint8_t, 44> out = {};
std::array<uint8_t, 44> expected = {};
crypt.Encrypt(out.begin() + 3, data.begin(), 0);
ASSERT_EQ(expected, out);
}
}
TEST(Arc4CryptTests, DecryptOutIteratorUsageTest)
{
const std::array<uint8_t, 14> data = { 0x45, 0xA0, 0x1F, 0x64, 0x5F, 0xC3, 0x5B,
0x38, 0x35, 0x52, 0x54, 0x4B, 0x9B, 0xF5 };
const std::vector<uint8_t> key = StrToU8Vec("Secret");
{
Arc4Crypt crypt(key.begin(), key.end());
std::array<uint8_t, 17> out = {};
std::array<uint8_t, 17> expected =
{
0x00, 0x00, 0x00,
'A', 't', 't', 'a', 'c', 'k', ' ', 'a', 't', ' ', 'd', 'a',
0x00, 0x00
};
crypt.Decrypt(out.begin() + 3, data.begin(), 12);
ASSERT_EQ(expected, out);
}
{
Arc4Crypt crypt(key.begin(), key.end());
std::array<uint8_t, 17> out = {};
std::array<uint8_t, 17> expected =
{
0x00, 0x00, 0x00,
'A', 't', 't', 'a', 'c', 'k', ' ',
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
crypt.Decrypt(out.begin() + 3, data.begin(), 7);
ASSERT_EQ(expected, out);
}
{
Arc4Crypt crypt(key.begin(), key.end());
std::array<uint8_t, 14> out = {};
std::array<uint8_t, 14> expected = {};
crypt.Decrypt(out.begin() + 3, data.begin(), 0);
ASSERT_EQ(expected, out);
}
}

View File

@@ -353,3 +353,56 @@ TEST(Arc4GenTests, UninitializedGenTest)
ASSERT_THROW(gen.Drop(256), Chaos::Service::ChaosException); ASSERT_THROW(gen.Drop(256), Chaos::Service::ChaosException);
} }
} }
TEST(Arc4GenTests, GenerateOutIteratorUsageTest)
{
{
uint8_t key[] = { 0x01, 0x02, 0x03, 0x04, 0x05 };
Arc4Gen gen(key, key + std::size(key));
std::array<uint8_t, 23> out = {};
std::array<uint8_t, 23> expected =
{
0x00, 0x00, 0x00,
0xb2, 0x39, 0x63, 0x05, 0xf0, 0x3d, 0xc0, 0x27,
0xcc, 0xc3, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00
};
gen.Generate(out.begin() + 3, 11);
ASSERT_EQ(expected, out);
}
{
uint8_t key[] = { 0x01, 0x02, 0x03, 0x04, 0x05 };
Arc4Gen gen(key, key + std::size(key));
std::array<uint8_t, 23> out = {};
std::array<uint8_t, 23> expected =
{
0x00, 0x00, 0x00,
0xb2, 0x39, 0x63, 0x05, 0xf0, 0x3d, 0xc0, 0x27,
0xcc, 0xc3, 0x52, 0x4a, 0x0a, 0x11, 0x18, 0xa8,
0x69, 0x82, 0x00, 0x00
};
gen.Generate(out.begin() + 3, 18);
ASSERT_EQ(expected, out);
}
{
uint8_t key[] = { 0x01, 0x02, 0x03, 0x04, 0x05 };
Arc4Gen gen(key, key + std::size(key));
std::array<uint8_t, 20> out = {};
std::array<uint8_t, 20> expected = {};
gen.Generate(out.begin() + 3, 0);
ASSERT_EQ(expected, out);
}
}

View File

@@ -44,10 +44,9 @@ TEST(DesCryptTests, EncryptTest)
struct Helper struct Helper
{ {
std::array<uint8_t, DesCrypt::BlockSize> operator()(const std::array<uint8_t, DesCrypt::BlockSize> & data, std::array<uint8_t, DesCrypt::BlockSize> operator()(const std::array<uint8_t, DesCrypt::BlockSize> & data,
const std::array<uint8_t, 8> & key) const const std::array<uint8_t, DesCrypt::KeySize> & key) const
{ {
std::array<uint8_t, DesCrypt::BlockSize> result; std::array<uint8_t, DesCrypt::BlockSize> result = {};
result.fill(0);
DesCrypt::Key desKey(key.begin(), key.end()); DesCrypt::Key desKey(key.begin(), key.end());
DesCrypt::DesEncryptor enc(desKey); DesCrypt::DesEncryptor enc(desKey);
@@ -61,7 +60,7 @@ TEST(DesCryptTests, EncryptTest)
{ {
std::array<uint8_t, DesCrypt::BlockSize> data = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef }; std::array<uint8_t, DesCrypt::BlockSize> data = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef };
std::array<uint8_t, 8> key = { 0x13, 0x34, 0x57, 0x79, 0x9b, 0xbc, 0xdf, 0xf1 }; std::array<uint8_t, DesCrypt::KeySize> key = { 0x13, 0x34, 0x57, 0x79, 0x9b, 0xbc, 0xdf, 0xf1 };
std::array<uint8_t, DesCrypt::BlockSize> expected = { 0x85, 0xe8, 0x13, 0x54, 0x0f, 0x0a, 0xb4, 0x05 }; std::array<uint8_t, DesCrypt::BlockSize> expected = { 0x85, 0xe8, 0x13, 0x54, 0x0f, 0x0a, 0xb4, 0x05 };
@@ -70,7 +69,7 @@ TEST(DesCryptTests, EncryptTest)
{ {
std::array<uint8_t, DesCrypt::BlockSize> data = { 0xaa, 0xf3, 0x83, 0x16, 0x2d, 0x2e, 0x6b, 0xcb }; std::array<uint8_t, DesCrypt::BlockSize> data = { 0xaa, 0xf3, 0x83, 0x16, 0x2d, 0x2e, 0x6b, 0xcb };
std::array<uint8_t, 8> key = { 0x44, 0xbf, 0x32, 0x19, 0x99, 0x25, 0x81, 0x51 }; std::array<uint8_t, DesCrypt::KeySize> key = { 0x44, 0xbf, 0x32, 0x19, 0x99, 0x25, 0x81, 0x51 };
std::array<uint8_t, DesCrypt::BlockSize> expected = { 0x07, 0xe8, 0x7f, 0xaa, 0xb3, 0x17, 0x13, 0x18 }; std::array<uint8_t, DesCrypt::BlockSize> expected = { 0x07, 0xe8, 0x7f, 0xaa, 0xb3, 0x17, 0x13, 0x18 };
@@ -79,7 +78,7 @@ TEST(DesCryptTests, EncryptTest)
{ {
std::array<uint8_t, DesCrypt::BlockSize> data = { 0xe5, 0x1a, 0x9f, 0xd4, 0x19, 0xa7, 0x93, 0x44 }; std::array<uint8_t, DesCrypt::BlockSize> data = { 0xe5, 0x1a, 0x9f, 0xd4, 0x19, 0xa7, 0x93, 0x44 };
std::array<uint8_t, 8> key = { 0xda, 0xec, 0x68, 0xae, 0x83, 0xe0, 0x1e, 0xab }; std::array<uint8_t, DesCrypt::KeySize> key = { 0xda, 0xec, 0x68, 0xae, 0x83, 0xe0, 0x1e, 0xab };
std::array<uint8_t, DesCrypt::BlockSize> expected = { 0x42, 0x27, 0x88, 0xa6, 0x7b, 0x6c, 0x18, 0xed }; std::array<uint8_t, DesCrypt::BlockSize> expected = { 0x42, 0x27, 0x88, 0xa6, 0x7b, 0x6c, 0x18, 0xed };
@@ -92,7 +91,7 @@ TEST(DesCryptTests, EncryptUInt64BlockTest)
struct Helper struct Helper
{ {
uint64_t operator()(uint64_t data, uint64_t operator()(uint64_t data,
const std::array<uint8_t, 8> & key) const const std::array<uint8_t, DesCrypt::KeySize> & key) const
{ {
DesCrypt::Key desKey(key.begin(), key.end()); DesCrypt::Key desKey(key.begin(), key.end());
DesCrypt::DesEncryptor enc(desKey); DesCrypt::DesEncryptor enc(desKey);
@@ -105,7 +104,7 @@ TEST(DesCryptTests, EncryptUInt64BlockTest)
{ {
uint64_t data = 0x0123456789abcdef; uint64_t data = 0x0123456789abcdef;
std::array<uint8_t, 8> key = { 0x13, 0x34, 0x57, 0x79, 0x9b, 0xbc, 0xdf, 0xf1 }; std::array<uint8_t, DesCrypt::KeySize> key = { 0x13, 0x34, 0x57, 0x79, 0x9b, 0xbc, 0xdf, 0xf1 };
uint64_t expected = 0x85e813540f0ab405; uint64_t expected = 0x85e813540f0ab405;
@@ -114,7 +113,7 @@ TEST(DesCryptTests, EncryptUInt64BlockTest)
{ {
uint64_t data = 0xaaf383162d2e6bcb; uint64_t data = 0xaaf383162d2e6bcb;
std::array<uint8_t, 8> key = { 0x44, 0xbf, 0x32, 0x19, 0x99, 0x25, 0x81, 0x51 }; std::array<uint8_t, DesCrypt::KeySize> key = { 0x44, 0xbf, 0x32, 0x19, 0x99, 0x25, 0x81, 0x51 };
uint64_t expected = 0x07e87faab3171318; uint64_t expected = 0x07e87faab3171318;
@@ -123,7 +122,7 @@ TEST(DesCryptTests, EncryptUInt64BlockTest)
{ {
uint64_t data = 0xe51a9fd419a79344; uint64_t data = 0xe51a9fd419a79344;
std::array<uint8_t, 8> key = { 0xda, 0xec, 0x68, 0xae, 0x83, 0xe0, 0x1e, 0xab }; std::array<uint8_t, DesCrypt::KeySize> key = { 0xda, 0xec, 0x68, 0xae, 0x83, 0xe0, 0x1e, 0xab };
uint64_t expected = 0x422788a67b6c18ed; uint64_t expected = 0x422788a67b6c18ed;
@@ -204,10 +203,9 @@ TEST(DesCryptTests, DecryptTest)
struct Helper struct Helper
{ {
std::array<uint8_t, DesCrypt::BlockSize> operator()(const std::array<uint8_t, DesCrypt::BlockSize> & data, std::array<uint8_t, DesCrypt::BlockSize> operator()(const std::array<uint8_t, DesCrypt::BlockSize> & data,
const std::array<uint8_t, 8> & key) const const std::array<uint8_t, DesCrypt::KeySize> & key) const
{ {
std::array<uint8_t, DesCrypt::BlockSize> result; std::array<uint8_t, DesCrypt::BlockSize> result = {};
result.fill(0);
DesCrypt::Key desKey(key.begin(), key.end()); DesCrypt::Key desKey(key.begin(), key.end());
DesCrypt::DesDecryptor dec(desKey); DesCrypt::DesDecryptor dec(desKey);
@@ -221,7 +219,7 @@ TEST(DesCryptTests, DecryptTest)
{ {
std::array<uint8_t, DesCrypt::BlockSize> data = { 0x85, 0xe8, 0x13, 0x54, 0x0f, 0x0a, 0xb4, 0x05 }; std::array<uint8_t, DesCrypt::BlockSize> data = { 0x85, 0xe8, 0x13, 0x54, 0x0f, 0x0a, 0xb4, 0x05 };
std::array<uint8_t, 8> key = { 0x13, 0x34, 0x57, 0x79, 0x9b, 0xbc, 0xdf, 0xf1 }; std::array<uint8_t, DesCrypt::KeySize> key = { 0x13, 0x34, 0x57, 0x79, 0x9b, 0xbc, 0xdf, 0xf1 };
std::array<uint8_t, DesCrypt::BlockSize> expected = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef }; std::array<uint8_t, DesCrypt::BlockSize> expected = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef };
@@ -230,7 +228,7 @@ TEST(DesCryptTests, DecryptTest)
{ {
std::array<uint8_t, DesCrypt::BlockSize> data = { 0x07, 0xe8, 0x7f, 0xaa, 0xb3, 0x17, 0x13, 0x18 }; std::array<uint8_t, DesCrypt::BlockSize> data = { 0x07, 0xe8, 0x7f, 0xaa, 0xb3, 0x17, 0x13, 0x18 };
std::array<uint8_t, 8> key = { 0x44, 0xbf, 0x32, 0x19, 0x99, 0x25, 0x81, 0x51 }; std::array<uint8_t, DesCrypt::KeySize> key = { 0x44, 0xbf, 0x32, 0x19, 0x99, 0x25, 0x81, 0x51 };
std::array<uint8_t, DesCrypt::BlockSize> expected = { 0xaa, 0xf3, 0x83, 0x16, 0x2d, 0x2e, 0x6b, 0xcb }; std::array<uint8_t, DesCrypt::BlockSize> expected = { 0xaa, 0xf3, 0x83, 0x16, 0x2d, 0x2e, 0x6b, 0xcb };
@@ -239,7 +237,7 @@ TEST(DesCryptTests, DecryptTest)
{ {
std::array<uint8_t, DesCrypt::BlockSize> data = { 0x42, 0x27, 0x88, 0xa6, 0x7b, 0x6c, 0x18, 0xed }; std::array<uint8_t, DesCrypt::BlockSize> data = { 0x42, 0x27, 0x88, 0xa6, 0x7b, 0x6c, 0x18, 0xed };
std::array<uint8_t, 8> key = { 0xda, 0xec, 0x68, 0xae, 0x83, 0xe0, 0x1e, 0xab }; std::array<uint8_t, DesCrypt::KeySize> key = { 0xda, 0xec, 0x68, 0xae, 0x83, 0xe0, 0x1e, 0xab };
std::array<uint8_t, DesCrypt::BlockSize> expected = { 0xe5, 0x1a, 0x9f, 0xd4, 0x19, 0xa7, 0x93, 0x44 }; std::array<uint8_t, DesCrypt::BlockSize> expected = { 0xe5, 0x1a, 0x9f, 0xd4, 0x19, 0xa7, 0x93, 0x44 };
@@ -252,7 +250,7 @@ TEST(DesCryptTests, DecryptUInt64BlockTest)
struct Helper struct Helper
{ {
uint64_t operator()(uint64_t data, uint64_t operator()(uint64_t data,
const std::array<uint8_t, 8> & key) const const std::array<uint8_t, DesCrypt::KeySize> & key) const
{ {
DesCrypt::Key desKey(key.begin(), key.end()); DesCrypt::Key desKey(key.begin(), key.end());
DesCrypt::DesDecryptor dec(desKey); DesCrypt::DesDecryptor dec(desKey);
@@ -265,7 +263,7 @@ TEST(DesCryptTests, DecryptUInt64BlockTest)
{ {
uint64_t data = 0x85e813540f0ab405; uint64_t data = 0x85e813540f0ab405;
std::array<uint8_t, 8> key = { 0x13, 0x34, 0x57, 0x79, 0x9b, 0xbc, 0xdf, 0xf1 }; std::array<uint8_t, DesCrypt::KeySize> key = { 0x13, 0x34, 0x57, 0x79, 0x9b, 0xbc, 0xdf, 0xf1 };
uint64_t expected = 0x0123456789abcdef; uint64_t expected = 0x0123456789abcdef;
@@ -274,7 +272,7 @@ TEST(DesCryptTests, DecryptUInt64BlockTest)
{ {
uint64_t data = 0x07e87faab3171318; uint64_t data = 0x07e87faab3171318;
std::array<uint8_t, 8> key = { 0x44, 0xbf, 0x32, 0x19, 0x99, 0x25, 0x81, 0x51 }; std::array<uint8_t, DesCrypt::KeySize> key = { 0x44, 0xbf, 0x32, 0x19, 0x99, 0x25, 0x81, 0x51 };
uint64_t expected = 0xaaf383162d2e6bcb; uint64_t expected = 0xaaf383162d2e6bcb;
@@ -283,7 +281,7 @@ TEST(DesCryptTests, DecryptUInt64BlockTest)
{ {
uint64_t data = 0x422788a67b6c18ed; uint64_t data = 0x422788a67b6c18ed;
std::array<uint8_t, 8> key = { 0xda, 0xec, 0x68, 0xae, 0x83, 0xe0, 0x1e, 0xab }; std::array<uint8_t, DesCrypt::KeySize> key = { 0xda, 0xec, 0x68, 0xae, 0x83, 0xe0, 0x1e, 0xab };
uint64_t expected = 0xe51a9fd419a79344; uint64_t expected = 0xe51a9fd419a79344;
@@ -362,7 +360,7 @@ TEST(DesCryptTests, DecryptLongDataTest)
TEST(DesCryptTests, ShortKeyTest) TEST(DesCryptTests, ShortKeyTest)
{ {
{ {
std::array<uint8_t, 7> key = {}; std::array<uint8_t, DesCrypt::KeySize - 1> key = {};
ASSERT_THROW(DesCrypt::Key(key.begin(), key.end()), Chaos::Service::ChaosException); ASSERT_THROW(DesCrypt::Key(key.begin(), key.end()), Chaos::Service::ChaosException);
} }
} }
@@ -370,7 +368,7 @@ TEST(DesCryptTests, ShortKeyTest)
TEST(DesCryptTests, LongKeyTest) TEST(DesCryptTests, LongKeyTest)
{ {
{ {
std::array<uint8_t, 9> key = {}; std::array<uint8_t, DesCrypt::KeySize + 1> key = {};
ASSERT_THROW(DesCrypt::Key(key.begin(), key.end()), Chaos::Service::ChaosException); ASSERT_THROW(DesCrypt::Key(key.begin(), key.end()), Chaos::Service::ChaosException);
} }
} }
@@ -379,30 +377,44 @@ TEST(DesCryptTests, OutIteratorUsageEncryptTest)
{ {
{ {
std::array<uint8_t, DesCrypt::BlockSize> data = { 0xe5, 0x1a, 0x9f, 0xd4, 0x19, 0xa7, 0x93, 0x44 }; std::array<uint8_t, DesCrypt::BlockSize> data = { 0xe5, 0x1a, 0x9f, 0xd4, 0x19, 0xa7, 0x93, 0x44 };
std::array<uint8_t, 8> key = { 0xda, 0xec, 0x68, 0xae, 0x83, 0xe0, 0x1e, 0xab }; std::array<uint8_t, DesCrypt::KeySize> key = { 0xda, 0xec, 0x68, 0xae, 0x83, 0xe0, 0x1e, 0xab };
std::array<uint8_t, 8> fact = {}; std::array<uint8_t, 11> fact = {};
// Last 3 bytes should be untouched. // First and last 3 bytes should be untouched.
std::array<uint8_t, 8> expected = { 0x42, 0x27, 0x88, 0xa6, 0x7b, 0x00, 0x00, 0x00 }; std::array<uint8_t, 11> expected = { 0x00, 0x00, 0x00, 0x42, 0x27, 0x88, 0xa6, 0x7b, 0x00, 0x00, 0x00 };
DesCrypt::Key desKey(key.begin(), key.end()); DesCrypt::Key desKey(key.begin(), key.end());
DesCrypt::DesEncryptor enc(desKey); DesCrypt::DesEncryptor enc(desKey);
enc.EncryptBlock(fact.begin(), fact.end() - 3, data.begin(), data.end()); enc.EncryptBlock(fact.begin() + 3, fact.end() - 3, data.begin(), data.end());
ASSERT_EQ(expected, fact); ASSERT_EQ(expected, fact);
} }
{ {
std::array<uint8_t, DesCrypt::BlockSize + 2> data = { 0xe5, 0x1a, 0x9f, 0xd4, 0x19, 0xa7, 0x93, 0x44, 0x44, 0x44 }; std::array<uint8_t, DesCrypt::BlockSize + 2> data = { 0xe5, 0x1a, 0x9f, 0xd4, 0x19, 0xa7, 0x93, 0x44, 0x44, 0x44 };
std::array<uint8_t, 8> key = { 0xda, 0xec, 0x68, 0xae, 0x83, 0xe0, 0x1e, 0xab }; std::array<uint8_t, DesCrypt::KeySize> key = { 0xda, 0xec, 0x68, 0xae, 0x83, 0xe0, 0x1e, 0xab };
std::array<uint8_t, 8> fact = {}; std::array<uint8_t, 12> fact = {};
// Last 4 bytes should be untouched. // First and last 4 bytes should be untouched.
std::array<uint8_t, 8> expected = { 0x42, 0x27, 0x88, 0xa6, 0x00, 0x00, 0x00, 0x00 }; std::array<uint8_t, 12> expected = { 0x00, 0x00, 0x00, 0x00, 0x42, 0x27, 0x88, 0xa6, 0x00, 0x00, 0x00, 0x00 };
DesCrypt::Key desKey(key.begin(), key.end()); DesCrypt::Key desKey(key.begin(), key.end());
DesCrypt::DesEncryptor enc(desKey); DesCrypt::DesEncryptor enc(desKey);
enc.EncryptBlock(fact.begin(), fact.end() - 4, data.begin(), data.end()); enc.EncryptBlock(fact.begin() + 4, fact.end() - 4, data.begin(), data.end());
ASSERT_EQ(expected, fact);
}
{
std::array<uint8_t, DesCrypt::BlockSize + 2> data = { 0xe5, 0x1a, 0x9f, 0xd4, 0x19, 0xa7, 0x93, 0x44, 0x44, 0x44 };
std::array<uint8_t, DesCrypt::KeySize> key = { 0xda, 0xec, 0x68, 0xae, 0x83, 0xe0, 0x1e, 0xab };
std::array<uint8_t, 12> fact = {};
std::array<uint8_t, 12> expected = {};
DesCrypt::Key desKey(key.begin(), key.end());
DesCrypt::DesEncryptor enc(desKey);
enc.EncryptBlock(fact.begin() + 3, fact.begin() + 3, data.begin(), data.end());
ASSERT_EQ(expected, fact); ASSERT_EQ(expected, fact);
} }
@@ -412,30 +424,44 @@ TEST(DesCryptTests, OutIteratorUsageDecryptTest)
{ {
{ {
std::array<uint8_t, DesCrypt::BlockSize> data = { 0xe5, 0x1a, 0x9f, 0xd4, 0x19, 0xa7, 0x93, 0x44 }; std::array<uint8_t, DesCrypt::BlockSize> data = { 0xe5, 0x1a, 0x9f, 0xd4, 0x19, 0xa7, 0x93, 0x44 };
std::array<uint8_t, 8> key = { 0xda, 0xec, 0x68, 0xae, 0x83, 0xe0, 0x1e, 0xab }; std::array<uint8_t, DesCrypt::KeySize> key = { 0xda, 0xec, 0x68, 0xae, 0x83, 0xe0, 0x1e, 0xab };
std::array<uint8_t, 8> fact = {}; std::array<uint8_t, 11> fact = {};
// Last 3 bytes should be untouched. // First and last 3 bytes should be untouched.
std::array<uint8_t, 8> expected = { 0x45, 0x69, 0x71, 0x17, 0x13, 0x00, 0x00, 0x00 }; std::array<uint8_t, 11> expected = { 0x00, 0x00, 0x00, 0x45, 0x69, 0x71, 0x17, 0x13, 0x00, 0x00, 0x00 };
DesCrypt::Key desKey(key.begin(), key.end()); DesCrypt::Key desKey(key.begin(), key.end());
DesCrypt::DesDecryptor dec(desKey); DesCrypt::DesDecryptor dec(desKey);
dec.DecryptBlock(fact.begin(), fact.end() - 3, data.begin(), data.end()); dec.DecryptBlock(fact.begin() + 3, fact.end() - 3, data.begin(), data.end());
ASSERT_EQ(expected, fact); ASSERT_EQ(expected, fact);
} }
{ {
std::array<uint8_t, DesCrypt::BlockSize + 2> data = { 0xe5, 0x1a, 0x9f, 0xd4, 0x19, 0xa7, 0x93, 0x44, 0x44, 0x44 }; std::array<uint8_t, DesCrypt::BlockSize + 2> data = { 0xe5, 0x1a, 0x9f, 0xd4, 0x19, 0xa7, 0x93, 0x44, 0x44, 0x44 };
std::array<uint8_t, 8> key = { 0xda, 0xec, 0x68, 0xae, 0x83, 0xe0, 0x1e, 0xab }; std::array<uint8_t, DesCrypt::KeySize> key = { 0xda, 0xec, 0x68, 0xae, 0x83, 0xe0, 0x1e, 0xab };
std::array<uint8_t, 8> fact = {}; std::array<uint8_t, 12> fact = {};
// Last 4 bytes should be untouched. // First and last 4 bytes should be untouched.
std::array<uint8_t, 8> expected = { 0x45, 0x69, 0x71, 0x17, 0x00, 0x00, 0x00, 0x00 }; std::array<uint8_t, 12> expected = { 0x00, 0x00, 0x00, 0x00, 0x45, 0x69, 0x71, 0x17, 0x00, 0x00, 0x00, 0x00 };
DesCrypt::Key desKey(key.begin(), key.end()); DesCrypt::Key desKey(key.begin(), key.end());
DesCrypt::DesDecryptor dec(desKey); DesCrypt::DesDecryptor dec(desKey);
dec.DecryptBlock(fact.begin(), fact.end() - 4, data.begin(), data.end()); dec.DecryptBlock(fact.begin() + 4, fact.end() - 4, data.begin(), data.end());
ASSERT_EQ(expected, fact);
}
{
std::array<uint8_t, DesCrypt::BlockSize + 2> data = { 0xe5, 0x1a, 0x9f, 0xd4, 0x19, 0xa7, 0x93, 0x44, 0x44, 0x44 };
std::array<uint8_t, DesCrypt::KeySize> key = { 0xda, 0xec, 0x68, 0xae, 0x83, 0xe0, 0x1e, 0xab };
std::array<uint8_t, 12> fact = {};
std::array<uint8_t, 12> expected = {};
DesCrypt::Key desKey(key.begin(), key.end());
DesCrypt::DesDecryptor dec(desKey);
dec.DecryptBlock(fact.begin() + 3, fact.begin() + 3, data.begin(), data.end());
ASSERT_EQ(expected, fact); ASSERT_EQ(expected, fact);
} }
@@ -454,7 +480,7 @@ static std::vector<uint8_t> EncryptThroughBase(const Encryptor<Impl> & enc,
TEST(DesCryptTests, EncryptThroughBaseTest) TEST(DesCryptTests, EncryptThroughBaseTest)
{ {
std::array<uint8_t, 8> key = { 0x13, 0x34, 0x57, 0x79, 0x9b, 0xbc, 0xdf, 0xf1 }; std::array<uint8_t, DesCrypt::KeySize> key = { 0x13, 0x34, 0x57, 0x79, 0x9b, 0xbc, 0xdf, 0xf1 };
std::vector<uint8_t> data = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef }; std::vector<uint8_t> data = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef };
std::vector<uint8_t> expected = { 0x85, 0xe8, 0x13, 0x54, 0x0f, 0x0a, 0xb4, 0x05 }; std::vector<uint8_t> expected = { 0x85, 0xe8, 0x13, 0x54, 0x0f, 0x0a, 0xb4, 0x05 };
@@ -473,7 +499,7 @@ static uint64_t EncryptUInt64BlockThroughBase(const Encryptor<Impl> & enc, uint6
TEST(DesCryptTests, EncryptUInt64BlockThroughBaseTest) TEST(DesCryptTests, EncryptUInt64BlockThroughBaseTest)
{ {
std::array<uint8_t, 8> key = { 0x13, 0x34, 0x57, 0x79, 0x9b, 0xbc, 0xdf, 0xf1 }; std::array<uint8_t, DesCrypt::KeySize> key = { 0x13, 0x34, 0x57, 0x79, 0x9b, 0xbc, 0xdf, 0xf1 };
uint64_t data = 0x0123456789abcdef; uint64_t data = 0x0123456789abcdef;
uint64_t expected = 0x85e813540f0ab405; uint64_t expected = 0x85e813540f0ab405;
@@ -497,7 +523,7 @@ static std::vector<uint8_t> DecryptThroughBase(const Decryptor<Impl> & dec,
TEST(DesCryptTests, DecryptThroughBaseTest) TEST(DesCryptTests, DecryptThroughBaseTest)
{ {
std::array<uint8_t, 8> key = { 0x13, 0x34, 0x57, 0x79, 0x9b, 0xbc, 0xdf, 0xf1 }; std::array<uint8_t, DesCrypt::KeySize> key = { 0x13, 0x34, 0x57, 0x79, 0x9b, 0xbc, 0xdf, 0xf1 };
std::vector<uint8_t> data = { 0x85, 0xe8, 0x13, 0x54, 0x0f, 0x0a, 0xb4, 0x05 }; std::vector<uint8_t> data = { 0x85, 0xe8, 0x13, 0x54, 0x0f, 0x0a, 0xb4, 0x05 };
std::vector<uint8_t> expected = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef }; std::vector<uint8_t> expected = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef };
@@ -516,7 +542,7 @@ static uint64_t DecryptUInt64BlockThroughBase(const Decryptor<Impl> & dec, uint6
TEST(DesCryptTests, DecryptUInt64BlockThroughBaseTest) TEST(DesCryptTests, DecryptUInt64BlockThroughBaseTest)
{ {
std::array<uint8_t, 8> key = { 0x13, 0x34, 0x57, 0x79, 0x9b, 0xbc, 0xdf, 0xf1 }; std::array<uint8_t, DesCrypt::KeySize> key = { 0x13, 0x34, 0x57, 0x79, 0x9b, 0xbc, 0xdf, 0xf1 };
uint64_t data = 0x85e813540f0ab405; uint64_t data = 0x85e813540f0ab405;
uint64_t expected = 0x0123456789abcdef; uint64_t expected = 0x0123456789abcdef;

View File

@@ -99,8 +99,7 @@ TEST(HmacTests, LongKeyTest)
TEST(HmacTests, UninitializedHmacTest) TEST(HmacTests, UninitializedHmacTest)
{ {
std::array<uint8_t, 10> in; std::array<uint8_t, 10> in = {};
in.fill(0);
{ {
Hmac<Md5Hasher> hmac; Hmac<Md5Hasher> hmac;

View File

@@ -0,0 +1,32 @@
#include <gtest/gtest.h>
#include <string>
#include "Service/ChaosException.hpp"
using namespace Chaos::Service;
TEST(ChaosExceptionTests, RvalueRefCtorTest)
{
try
{
throw ChaosException("everything's alright :D");
}
catch (const ChaosException & ex)
{
ASSERT_EQ("everything's alright :D", ex.GetMessage());
}
}
TEST(ChaosExceptionTests, ConstLvalueRefCtorTest)
{
const std::string message = "everything's alright :D";
try
{
throw ChaosException(message);
}
catch (const ChaosException & ex)
{
ASSERT_EQ("everything's alright :D", ex.GetMessage());
}
}