summaryrefslogtreecommitdiffstats
path: root/security/nss/gtests/freebl_gtest/ghash_unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'security/nss/gtests/freebl_gtest/ghash_unittest.cc')
-rw-r--r--security/nss/gtests/freebl_gtest/ghash_unittest.cc55
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