• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2024 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "crypto/hash.h"
6 
7 #include <array>
8 
9 #include "base/strings/string_number_conversions.h"
10 #include "testing/gtest/include/gtest/gtest.h"
11 
12 struct TestCase {
13   const char* message;
14   const char* digest;
15 };
16 
PrepareTestCase(const TestCase & c,std::vector<uint8_t> * message,base::span<uint8_t> digest)17 void PrepareTestCase(const TestCase& c,
18                      std::vector<uint8_t>* message,
19                      base::span<uint8_t> digest) {
20   CHECK(base::HexStringToBytes(c.message, message));
21   CHECK(base::HexStringToSpan(c.digest, digest));
22 }
23 
TEST(HashTest,Sha1)24 TEST(HashTest, Sha1) {
25   const auto cases = std::to_array<TestCase>(
26       {// FIPS 180-4 "SHA1ShortMsg" test vector:
27        {
28            .message = "3552694cdf663fd94b224747ac406aaf",
29            .digest = "a150de927454202d94e656de4c7c0ca691de955d",
30        }});
31 
32   for (const auto& c : cases) {
33     std::vector<uint8_t> message;
34     std::array<uint8_t, 20> digest;
35 
36     PrepareTestCase(c, &message, digest);
37     auto computed_digest = crypto::hash::Sha1(base::as_byte_span(message));
38     EXPECT_EQ(digest, computed_digest);
39   }
40 }
41 
TEST(HashTest,Sha256)42 TEST(HashTest, Sha256) {
43   const auto cases = std::to_array<TestCase>(
44       {// FIPS 180-4 "SHA256ShortMsg" test vector:
45        {
46            .message = "0a27847cdc98bd6f62220b046edd762b",
47            .digest = "80c25ec1600587e7f28b18b1b18e3cdc89928e39cab3bc25e4d4a4c13"
48                      "9bcedc4",
49        }});
50 
51   for (const auto& c : cases) {
52     std::vector<uint8_t> message;
53     std::array<uint8_t, 32> digest;
54 
55     PrepareTestCase(c, &message, digest);
56     auto computed_digest = crypto::hash::Sha256(base::as_byte_span(message));
57     EXPECT_EQ(digest, computed_digest);
58   }
59 }
60 
TEST(HashTest,Sha512)61 TEST(HashTest, Sha512) {
62   const auto cases = std::to_array<TestCase>(
63       {// FIPS 180-4 "SHA512ShortMsg" test vector:
64        {
65            .message = "cd67bd4054aaa3baa0db178ce232fd5a",
66            .digest = "0d8521f8f2f3900332d1a1a55c60ba81d04d28dfe8c504b6328ae7879"
67                      "25fe018"
68                      "8f2ba91c3a9f0c1653c4bf0ada356455ea36fd31f8e73e3951cad4ebb"
69                      "a8c6e04",
70        }});
71 
72   for (const auto& c : cases) {
73     std::vector<uint8_t> message;
74     std::array<uint8_t, 64> digest;
75 
76     PrepareTestCase(c, &message, digest);
77     auto computed_digest = crypto::hash::Sha512(base::as_byte_span(message));
78     EXPECT_EQ(digest, computed_digest);
79   }
80 }
81 
TEST(HashTest,WrongDigestSizeDies)82 TEST(HashTest, WrongDigestSizeDies) {
83   std::array<uint8_t, 16> small_digest;
84   std::array<uint8_t, 128> big_digest;
85   std::array<uint8_t, 16> input;
86 
87   EXPECT_DEATH_IF_SUPPORTED(
88       crypto::hash::Hash(crypto::hash::HashKind::kSha256, input, small_digest),
89       "");
90   EXPECT_DEATH_IF_SUPPORTED(
91       crypto::hash::Hash(crypto::hash::HashKind::kSha256, input, big_digest),
92       "");
93 }
94