// Copyright 2024 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "crypto/hash.h" #include #include "base/strings/string_number_conversions.h" #include "testing/gtest/include/gtest/gtest.h" struct TestCase { const char* message; const char* digest; }; void PrepareTestCase(const TestCase& c, std::vector* message, base::span digest) { CHECK(base::HexStringToBytes(c.message, message)); CHECK(base::HexStringToSpan(c.digest, digest)); } TEST(HashTest, Sha1) { const auto cases = std::to_array( {// FIPS 180-4 "SHA1ShortMsg" test vector: { .message = "3552694cdf663fd94b224747ac406aaf", .digest = "a150de927454202d94e656de4c7c0ca691de955d", }}); for (const auto& c : cases) { std::vector message; std::array digest; PrepareTestCase(c, &message, digest); auto computed_digest = crypto::hash::Sha1(base::as_byte_span(message)); EXPECT_EQ(digest, computed_digest); } } TEST(HashTest, Sha256) { const auto cases = std::to_array( {// FIPS 180-4 "SHA256ShortMsg" test vector: { .message = "0a27847cdc98bd6f62220b046edd762b", .digest = "80c25ec1600587e7f28b18b1b18e3cdc89928e39cab3bc25e4d4a4c13" "9bcedc4", }}); for (const auto& c : cases) { std::vector message; std::array digest; PrepareTestCase(c, &message, digest); auto computed_digest = crypto::hash::Sha256(base::as_byte_span(message)); EXPECT_EQ(digest, computed_digest); } } TEST(HashTest, Sha512) { const auto cases = std::to_array( {// FIPS 180-4 "SHA512ShortMsg" test vector: { .message = "cd67bd4054aaa3baa0db178ce232fd5a", .digest = "0d8521f8f2f3900332d1a1a55c60ba81d04d28dfe8c504b6328ae7879" "25fe018" "8f2ba91c3a9f0c1653c4bf0ada356455ea36fd31f8e73e3951cad4ebb" "a8c6e04", }}); for (const auto& c : cases) { std::vector message; std::array digest; PrepareTestCase(c, &message, digest); auto computed_digest = crypto::hash::Sha512(base::as_byte_span(message)); EXPECT_EQ(digest, computed_digest); } } TEST(HashTest, WrongDigestSizeDies) { std::array small_digest; std::array big_digest; std::array input; EXPECT_DEATH_IF_SUPPORTED( crypto::hash::Hash(crypto::hash::HashKind::kSha256, input, small_digest), ""); EXPECT_DEATH_IF_SUPPORTED( crypto::hash::Hash(crypto::hash::HashKind::kSha256, input, big_digest), ""); }