/* * shake_unittest.cc - unittests for SHAKE-128 and SHAKE-256 XOFs * * 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 "blapi.h" #include "nspr.h" #include "nss.h" #include "secerr.h" #include #include #include #define GTEST_HAS_RTTI 0 #include "gtest/gtest.h" template struct ScopedDelete128 { void operator()(T* ptr) { if (ptr) { SHAKE_128_DestroyContext(ptr, PR_TRUE); } } }; template struct ScopedDelete256 { void operator()(T* ptr) { if (ptr) { SHAKE_256_DestroyContext(ptr, PR_TRUE); } } }; typedef std::unique_ptr> ScopedSHAKE_128Context; typedef std::unique_ptr> ScopedSHAKE_256Context; class SHAKE_128Tests : public ::testing::Test {}; class SHAKE_256Tests : public ::testing::Test {}; TEST_F(SHAKE_128Tests, TestVector1) { ScopedSHAKE_128Context ctx(SHAKE_128_NewContext()); ASSERT_TRUE(ctx) << "SHAKE_128_NewContext failed!"; std::vector digest(16); SECStatus rv = SHAKE_128_Hash(digest.data(), 16, "abc"); std::vector expected = {0x58, 0x81, 0x09, 0x2d, 0xd8, 0x18, 0xbf, 0x5c, 0xf8, 0xa3, 0xdd, 0xb7, 0x93, 0xfb, 0xcb, 0xa7}; ASSERT_EQ(SECSuccess, rv); EXPECT_EQ(expected, digest); } TEST_F(SHAKE_128Tests, TestVector2) { ScopedSHAKE_128Context ctx(SHAKE_128_NewContext()); ASSERT_TRUE(ctx) << "SHAKE_128_NewContext failed!"; std::vector digest(8); SECStatus rv = SHAKE_128_Hash(digest.data(), 8, "hello123"); std::vector expected = {0x1b, 0x85, 0x86, 0x15, 0x10, 0xbc, 0x4d, 0x8e}; ASSERT_EQ(SECSuccess, rv); EXPECT_EQ(expected, digest); } TEST_F(SHAKE_256Tests, TestVector1) { ScopedSHAKE_256Context ctx(SHAKE_256_NewContext()); ASSERT_TRUE(ctx) << "SHAKE_256_NewContext failed!"; std::vector digest(16); SECStatus rv = SHAKE_256_Hash(digest.data(), 16, "abc"); std::vector expected = {0x48, 0x33, 0x66, 0x60, 0x13, 0x60, 0xa8, 0x77, 0x1c, 0x68, 0x63, 0x08, 0x0c, 0xc4, 0x11, 0x4d}; ASSERT_EQ(SECSuccess, rv); EXPECT_EQ(expected, digest); } TEST_F(SHAKE_256Tests, TestVector2) { ScopedSHAKE_256Context ctx(SHAKE_256_NewContext()); ASSERT_TRUE(ctx) << "SHAKE_256_NewContext failed!"; std::vector digest(8); SECStatus rv = SHAKE_256_Hash(digest.data(), 8, "hello123"); std::vector expected = {0xad, 0xe6, 0x12, 0xba, 0x26, 0x5f, 0x92, 0xde}; ASSERT_EQ(SECSuccess, rv); EXPECT_EQ(expected, digest); }