| // This Source Code Form is subject to the terms of the Mozilla Public |
| // License, v. 2.0. If a copy of the MPL was not distributed with this file, |
| // You can obtain one at http://mozilla.org/MPL/2.0/. |
| |
| #include "gcm-vectors.h" |
| #include "gtest/gtest.h" |
| #include "util.h" |
| |
| #include "gcm.h" |
| |
| namespace nss_test { |
| |
| class GHashTest : public ::testing::TestWithParam<gcm_kat_value> { |
| protected: |
| void TestGHash(const gcm_kat_value val, bool sw) { |
| // Read test data. |
| std::vector<uint8_t> hash_key = hex_string_to_bytes(val.hash_key); |
| ASSERT_EQ(16UL, hash_key.size()); |
| std::vector<uint8_t> additional_data = |
| hex_string_to_bytes(val.additional_data); |
| std::vector<uint8_t> result = hex_string_to_bytes(val.result); |
| std::vector<uint8_t> cipher_text(result.begin(), result.end() - 16); |
| std::vector<uint8_t> expected = hex_string_to_bytes(val.ghash); |
| ASSERT_EQ(16UL, expected.size()); |
| |
| // Prepare context. |
| gcmHashContext ghashCtx; |
| ASSERT_EQ(SECSuccess, gcmHash_InitContext(&ghashCtx, hash_key.data(), sw)); |
| |
| // Hash additional_data, cipher_text. |
| gcmHash_Reset(&ghashCtx, |
| const_cast<const unsigned char *>(additional_data.data()), |
| additional_data.size()); |
| gcmHash_Update(&ghashCtx, |
| const_cast<const unsigned char *>(cipher_text.data()), |
| cipher_text.size()); |
| |
| // Finalise (hash in the length). |
| uint8_t result_bytes[16]; |
| unsigned int out_len; |
| ASSERT_EQ(SECSuccess, gcmHash_Final(&ghashCtx, result_bytes, &out_len, 16)); |
| ASSERT_EQ(16U, out_len); |
| EXPECT_EQ(expected, std::vector<uint8_t>(result_bytes, result_bytes + 16)); |
| } |
| }; |
| |
| #ifdef NSS_X86_OR_X64 |
| TEST_P(GHashTest, KAT_X86_HW) { TestGHash(GetParam(), false); } |
| #endif |
| TEST_P(GHashTest, KAT_Sftw) { TestGHash(GetParam(), true); } |
| |
| INSTANTIATE_TEST_CASE_P(NISTTestVector, GHashTest, |
| ::testing::ValuesIn(kGcmKatValues)); |
| |
| } // nss_test |