3 #include "stg/bfstream.h"
4 #include "stg/os_int.h"
16 TRACKER() : m_lastSize(0), m_callCount(0), m_lastBlock(NULL) {}
17 ~TRACKER() { delete[] m_lastBlock; }
18 bool Call(const void * block, size_t size)
23 m_lastBlock = new char[size];
24 memcpy(m_lastBlock, block, size);
32 size_t LastSize() const { return m_lastSize; }
33 size_t CallCount() const { return m_callCount; }
34 const void * LastBlock() const { return m_lastBlock; }
42 bool Callback(const void * block, size_t size, void * data)
44 TRACKER & tracker = *static_cast<TRACKER *>(data);
45 return tracker.Call(block, size);
52 struct bfstream_data {
55 typedef test_group<bfstream_data> tg;
56 tg bfstream_test_group("BFStream tests group");
58 typedef tg::object testobject;
62 void testobject::test<1>()
64 set_test_name("Check bfstream mechanics");
67 STG::ENCRYPT_STREAM stream("pr7Hhen", Callback, &tracker);
68 ensure_equals("CallCount() == 0 after construction", tracker.CallCount(), 0);
70 uint32_t block[2] = {0x12345678, 0x87654321};
71 stream.Put(&block[0], sizeof(block[0]));
72 ensure_equals("CallCount() == 0 after first put", tracker.CallCount(), 0);
73 stream.Put(&block[1], sizeof(block[1]));
74 ensure_equals("CallCount() == 1 after second put", tracker.CallCount(), 1);
76 uint32_t block2[4] = {0x12345678, 0x87654321, 0x12345678, 0x87654321};
77 stream.Put(&block2[0], sizeof(block2[0]) * 3);
78 ensure_equals("CallCount() == 2 after third put", tracker.CallCount(), 2);
79 stream.Put(&block2[3], sizeof(block2[3]));
80 ensure_equals("CallCount() == 3 after fourth put", tracker.CallCount(), 3);
85 void testobject::test<2>()
87 set_test_name("Check bfstream encryption");
90 STG::ENCRYPT_STREAM stream("pr7Hhen", Callback, &tracker);
92 uint32_t block[2] = {0x12345678, 0x87654321};
93 stream.Put(&block[0], sizeof(block[0]));
94 ensure_equals("LastSize() == 0 after first put", tracker.LastSize(), 0);
95 ensure_equals("LastBlock() == NULL after first put", tracker.LastBlock(), static_cast<const void *>(NULL));
96 stream.Put(&block[1], sizeof(block[1]));
97 ensure_equals("LastSize() == 8 after second put", tracker.LastSize(), 8);
98 const uint32_t * ptr = static_cast<const uint32_t *>(tracker.LastBlock());
99 ensure_equals("ptr[0] == 0xd3988cd after second put", ptr[0], 0xd3988cd);
100 ensure_equals("ptr[1] == 0x7996c6d6 after second put", ptr[1], 0x7996c6d6);
102 uint32_t block2[4] = {0x12345678, 0x87654321, 0x12345678, 0x87654321};
103 stream.Put(&block2[0], sizeof(block2[0]) * 3);
104 ensure_equals("LastSize() == 8 after third put", tracker.LastSize(), 8);
105 ptr = static_cast<const uint32_t *>(tracker.LastBlock());
106 ensure_equals("ptr[0] == 0xd3988cd after third put", ptr[0], 0xd3988cd);
107 ensure_equals("ptr[1] == 0x7996c6d6 after third put", ptr[1], 0x7996c6d6);
109 stream.Put(&block2[3], sizeof(block2[3]));
110 ensure_equals("LastSize() == 8 after fourth put", tracker.LastSize(), 8);
111 ptr = static_cast<const uint32_t *>(tracker.LastBlock());
112 ensure_equals("ptr[0] == 0xd3988cd after fourth put", ptr[0], 0xd3988cd);
113 ensure_equals("ptr[1] == 0x7996c6d6 after fourth put", ptr[1], 0x7996c6d6);
118 void testobject::test<3>()
120 set_test_name("Check bfstream long string processing");
123 STG::ENCRYPT_STREAM estream("pr7Hhen", Callback, &tracker);
124 std::string source = "This is a test long string for checking stream encryption/decryption. \"abcdefghijklmnopqrstuvwxyz 0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ\"";
125 char buffer[source.length() + 9];
126 memset(buffer, 0, sizeof(buffer));
128 estream.Put(source.c_str(), source.length() + 1, true);
129 ensure("Encryption long string LastSize()", tracker.LastSize() >= source.length() + 1);
130 ensure("Encryption long string LastBlock() != NULL", tracker.LastBlock() != NULL);
131 memcpy(buffer, tracker.LastBlock(), std::min(tracker.LastSize(), sizeof(buffer)));
133 STG::DECRYPT_STREAM dstream("pr7Hhen", Callback, &tracker);
134 dstream.Put(buffer, sizeof(buffer), true);
135 ensure("Decryption long string LastSize() decryption", tracker.LastSize() >= sizeof(buffer));
136 ensure("Decryption long string LastBlock() != NULL", tracker.LastBlock() != NULL);
137 memcpy(buffer, tracker.LastBlock(), std::min(tracker.LastSize(), sizeof(buffer)));
139 ensure_equals("Decrypt(Encrypt(source)) == source", std::string(buffer), source);