5 #include "sw/device/lib/crypto/impl/aes_gcm/ghash.h"
9 #include "gmock/gmock.h"
10 #include "gtest/gtest.h"
12 namespace ghash_unittest {
14 using ::testing::ElementsAreArray;
16 TEST(Ghash, McGrawViegaTestCase1) {
24 std::array<uint32_t, 4> H = {
30 std::array<uint32_t, 4> exp_result = {0, 0, 0, 0};
34 ghash_init_subkey(H.data(), &ctx);
36 uint32_t result[kGhashBlockNumWords];
37 ghash_final(&ctx, result);
39 EXPECT_THAT(result, testing::ElementsAreArray(exp_result));
42 TEST(Ghash, ProcessFullBlocksOneByte) {
44 std::array<uint32_t, 4> H = {
52 size_t partial_len = 0;
54 uint32_t input_word = 0xaabbccdd;
55 uint8_t *input = (
unsigned char *)&input_word;
56 size_t input_len =
sizeof(input_word);
58 std::array<uint32_t, 4> zero_block = {0, 0, 0, 0};
62 ghash_init_subkey(H.data(), &ctx);
64 EXPECT_THAT(ctx.
state.data, testing::ElementsAreArray(zero_block));
65 ghash_process_full_blocks(&ctx, partial_len, &partial, input_len, input);
66 EXPECT_THAT(ctx.
state.data, testing::ElementsAreArray(zero_block));
67 EXPECT_EQ(partial.data[0], input_word);
68 EXPECT_EQ(partial.data[1], 0);
69 EXPECT_EQ(partial.data[2], 0);
70 EXPECT_EQ(partial.data[3], 0);
77 std::array<uint32_t, 4> H = {
83 std::array<uint32_t, 4> zero = {0, 0, 0, 0};
88 ghash_init_subkey(H.data(), &ctx);
90 EXPECT_THAT(ctx.
state.data, testing::ElementsAreArray(zero));
93 size_t partial_len = 0;
95 uint8_t *input = &one;
96 ghash_process_full_blocks(&ctx, partial_len, &partial, input_len, input);
97 EXPECT_LT(input_len, kGhashBlockNumBytes - partial_len);
98 EXPECT_EQ(partial.data[0], one);
99 EXPECT_THAT(ctx.
state.data, testing::ElementsAreArray(zero));
101 ghash_update(&ctx, 1, &one);
102 EXPECT_THAT(ctx.
state.data, testing::ElementsAreArray(H));
103 uint32_t result[kGhashBlockNumWords];
104 ghash_final(&ctx, result);
106 EXPECT_THAT(result, testing::ElementsAreArray(H));
109 TEST(Ghash, McGrawViegaTestCase2) {
117 std::array<uint32_t, 4> H = {
123 std::array<uint32_t, 0> A = {};
124 std::array<uint32_t, 4> C = {
130 std::array<uint32_t, 4> exp_result = {
138 std::array<uint64_t, 2> bitlengths = {
139 A.size() *
sizeof(uint32_t) * 8,
140 C.size() *
sizeof(uint32_t) * 8,
142 bitlengths[0] = __builtin_bswap64(bitlengths[0]);
143 bitlengths[1] = __builtin_bswap64(bitlengths[1]);
147 ghash_init_subkey(H.data(), &ctx);
149 ghash_update(&ctx, A.size() *
sizeof(uint32_t), (
unsigned char *)A.data());
150 ghash_update(&ctx, C.size() *
sizeof(uint32_t), (
unsigned char *)C.data());
151 ghash_update(&ctx, bitlengths.size() *
sizeof(uint64_t),
152 (
unsigned char *)bitlengths.data());
153 uint32_t result[kGhashBlockNumWords];
154 ghash_final(&ctx, result);
156 EXPECT_THAT(result, testing::ElementsAreArray(exp_result));
159 TEST(Ghash, ContextReset) {
163 std::array<uint32_t, 4> H = {
169 std::array<uint32_t, 0> A = {};
170 std::array<uint32_t, 4> C = {
176 std::array<uint32_t, 4> exp_result = {
184 std::array<uint64_t, 2> bitlengths = {
185 A.size() *
sizeof(uint32_t) * 8,
186 C.size() *
sizeof(uint32_t) * 8,
188 bitlengths[0] = __builtin_bswap64(bitlengths[0]);
189 bitlengths[1] = __builtin_bswap64(bitlengths[1]);
193 ghash_init_subkey(H.data(), &ctx);
197 ghash_update(&ctx, A.size() *
sizeof(uint32_t), (
unsigned char *)A.data());
198 ghash_update(&ctx, C.size() *
sizeof(uint32_t), (
unsigned char *)C.data());
199 ghash_update(&ctx, bitlengths.size() *
sizeof(uint64_t),
200 (
unsigned char *)bitlengths.data());
201 uint32_t result[kGhashBlockNumWords];
202 ghash_final(&ctx, result);
204 EXPECT_THAT(result, testing::ElementsAreArray(exp_result));
208 ghash_update(&ctx, A.size() *
sizeof(uint32_t), (
unsigned char *)A.data());
209 ghash_update(&ctx, C.size() *
sizeof(uint32_t), (
unsigned char *)C.data());
210 ghash_update(&ctx, bitlengths.size() *
sizeof(uint64_t),
211 (
unsigned char *)bitlengths.data());
212 ghash_final(&ctx, result);
214 EXPECT_THAT(result, testing::ElementsAreArray(exp_result));
217 TEST(Ghash, McGrawViegaTestCase18) {
226 std::array<uint32_t, 4> H = {
232 std::array<uint32_t, 5> A = {
233 0xcefaedfe, 0xefbeadde, 0xcefaedfe, 0xefbeadde, 0xd2daadab,
235 std::array<uint32_t, 15> C = {
236 0x2fef8d5a, 0xf1539e0c, 0x53785df7, 0x202a9e65, 0x2ab2b2ee,
237 0x1964deaf, 0x4fab58a0, 0xf46b746f, 0xb7c3c00f, 0x4544f280,
238 0xf1eba32d, 0xde2cd8c5, 0x978941a2, 0x2ef80e20, 0x3f7eae44,
240 std::array<uint32_t, 4> exp_result = {
248 std::array<uint64_t, 2> bitlengths = {
249 A.size() *
sizeof(uint32_t) * 8,
250 C.size() *
sizeof(uint32_t) * 8,
252 bitlengths[0] = __builtin_bswap64(bitlengths[0]);
253 bitlengths[1] = __builtin_bswap64(bitlengths[1]);
257 ghash_init_subkey(H.data(), &ctx);
259 ghash_update(&ctx, A.size() *
sizeof(uint32_t), (
unsigned char *)A.data());
260 ghash_update(&ctx, C.size() *
sizeof(uint32_t), (
unsigned char *)C.data());
261 ghash_update(&ctx, bitlengths.size() *
sizeof(uint64_t),
262 (
unsigned char *)bitlengths.data());
263 uint32_t result[kGhashBlockNumWords];
264 ghash_final(&ctx, result);
266 EXPECT_THAT(result, testing::ElementsAreArray(exp_result));