diff options
Diffstat (limited to 'security/nss/gtests/freebl_gtest/ghash_unittest.cc')
-rw-r--r-- | security/nss/gtests/freebl_gtest/ghash_unittest.cc | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/security/nss/gtests/freebl_gtest/ghash_unittest.cc b/security/nss/gtests/freebl_gtest/ghash_unittest.cc new file mode 100644 index 000000000..3c9045bec --- /dev/null +++ b/security/nss/gtests/freebl_gtest/ghash_unittest.cc @@ -0,0 +1,55 @@ +// 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 |