1*6777b538SAndroid Build Coastguard Worker // Copyright 2011 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker
5*6777b538SAndroid Build Coastguard Worker #include "base/hash/sha1.h"
6*6777b538SAndroid Build Coastguard Worker
7*6777b538SAndroid Build Coastguard Worker #include <stddef.h>
8*6777b538SAndroid Build Coastguard Worker
9*6777b538SAndroid Build Coastguard Worker #include <string>
10*6777b538SAndroid Build Coastguard Worker
11*6777b538SAndroid Build Coastguard Worker #include "base/base64.h"
12*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
13*6777b538SAndroid Build Coastguard Worker
TEST(SHA1Test,Test1)14*6777b538SAndroid Build Coastguard Worker TEST(SHA1Test, Test1) {
15*6777b538SAndroid Build Coastguard Worker // Example A.1 from FIPS 180-2: one-block message.
16*6777b538SAndroid Build Coastguard Worker std::string input = "abc";
17*6777b538SAndroid Build Coastguard Worker
18*6777b538SAndroid Build Coastguard Worker static constexpr int kExpected[] = {0xa9, 0x99, 0x3e, 0x36, 0x47, 0x06, 0x81,
19*6777b538SAndroid Build Coastguard Worker 0x6a, 0xba, 0x3e, 0x25, 0x71, 0x78, 0x50,
20*6777b538SAndroid Build Coastguard Worker 0xc2, 0x6c, 0x9c, 0xd0, 0xd8, 0x9d};
21*6777b538SAndroid Build Coastguard Worker
22*6777b538SAndroid Build Coastguard Worker std::string output = base::SHA1HashString(input);
23*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(base::kSHA1Length, output.size());
24*6777b538SAndroid Build Coastguard Worker for (size_t i = 0; i < base::kSHA1Length; i++)
25*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(kExpected[i], output[i] & 0xFF);
26*6777b538SAndroid Build Coastguard Worker }
27*6777b538SAndroid Build Coastguard Worker
TEST(SHA1Test,Test2)28*6777b538SAndroid Build Coastguard Worker TEST(SHA1Test, Test2) {
29*6777b538SAndroid Build Coastguard Worker // Example A.2 from FIPS 180-2: multi-block message.
30*6777b538SAndroid Build Coastguard Worker std::string input =
31*6777b538SAndroid Build Coastguard Worker "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq";
32*6777b538SAndroid Build Coastguard Worker
33*6777b538SAndroid Build Coastguard Worker static constexpr int kExpected[] = {0x84, 0x98, 0x3e, 0x44, 0x1c, 0x3b, 0xd2,
34*6777b538SAndroid Build Coastguard Worker 0x6e, 0xba, 0xae, 0x4a, 0xa1, 0xf9, 0x51,
35*6777b538SAndroid Build Coastguard Worker 0x29, 0xe5, 0xe5, 0x46, 0x70, 0xf1};
36*6777b538SAndroid Build Coastguard Worker
37*6777b538SAndroid Build Coastguard Worker std::string output = base::SHA1HashString(input);
38*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(base::kSHA1Length, output.size());
39*6777b538SAndroid Build Coastguard Worker for (size_t i = 0; i < base::kSHA1Length; i++)
40*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(kExpected[i], output[i] & 0xFF);
41*6777b538SAndroid Build Coastguard Worker }
42*6777b538SAndroid Build Coastguard Worker
TEST(SHA1Test,Test3)43*6777b538SAndroid Build Coastguard Worker TEST(SHA1Test, Test3) {
44*6777b538SAndroid Build Coastguard Worker // Example A.3 from FIPS 180-2: long message.
45*6777b538SAndroid Build Coastguard Worker std::string input(1000000, 'a');
46*6777b538SAndroid Build Coastguard Worker
47*6777b538SAndroid Build Coastguard Worker static constexpr int kExpected[] = {0x34, 0xaa, 0x97, 0x3c, 0xd4, 0xc4, 0xda,
48*6777b538SAndroid Build Coastguard Worker 0xa4, 0xf6, 0x1e, 0xeb, 0x2b, 0xdb, 0xad,
49*6777b538SAndroid Build Coastguard Worker 0x27, 0x31, 0x65, 0x34, 0x01, 0x6f};
50*6777b538SAndroid Build Coastguard Worker
51*6777b538SAndroid Build Coastguard Worker std::string output = base::SHA1HashString(input);
52*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(base::kSHA1Length, output.size());
53*6777b538SAndroid Build Coastguard Worker for (size_t i = 0; i < base::kSHA1Length; i++)
54*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(kExpected[i], output[i] & 0xFF);
55*6777b538SAndroid Build Coastguard Worker }
56*6777b538SAndroid Build Coastguard Worker
TEST(SHA1Test,Test1BytesAndSpan)57*6777b538SAndroid Build Coastguard Worker TEST(SHA1Test, Test1BytesAndSpan) {
58*6777b538SAndroid Build Coastguard Worker // Example A.1 from FIPS 180-2: one-block message.
59*6777b538SAndroid Build Coastguard Worker std::string input = "abc";
60*6777b538SAndroid Build Coastguard Worker unsigned char output[base::kSHA1Length];
61*6777b538SAndroid Build Coastguard Worker
62*6777b538SAndroid Build Coastguard Worker static constexpr unsigned char kExpected[] = {
63*6777b538SAndroid Build Coastguard Worker 0xa9, 0x99, 0x3e, 0x36, 0x47, 0x06, 0x81, 0x6a, 0xba, 0x3e,
64*6777b538SAndroid Build Coastguard Worker 0x25, 0x71, 0x78, 0x50, 0xc2, 0x6c, 0x9c, 0xd0, 0xd8, 0x9d};
65*6777b538SAndroid Build Coastguard Worker
66*6777b538SAndroid Build Coastguard Worker base::SHA1HashBytes(reinterpret_cast<const unsigned char*>(input.c_str()),
67*6777b538SAndroid Build Coastguard Worker input.size(), output);
68*6777b538SAndroid Build Coastguard Worker for (size_t i = 0; i < base::kSHA1Length; i++)
69*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(kExpected[i], output[i]);
70*6777b538SAndroid Build Coastguard Worker
71*6777b538SAndroid Build Coastguard Worker base::SHA1Digest output_array = base::SHA1HashSpan(base::as_byte_span(input));
72*6777b538SAndroid Build Coastguard Worker for (size_t i = 0; i < base::kSHA1Length; i++)
73*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(kExpected[i], output_array[i]);
74*6777b538SAndroid Build Coastguard Worker }
75*6777b538SAndroid Build Coastguard Worker
TEST(SHA1Test,Test2BytesAndSpan)76*6777b538SAndroid Build Coastguard Worker TEST(SHA1Test, Test2BytesAndSpan) {
77*6777b538SAndroid Build Coastguard Worker // Example A.2 from FIPS 180-2: multi-block message.
78*6777b538SAndroid Build Coastguard Worker std::string input =
79*6777b538SAndroid Build Coastguard Worker "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq";
80*6777b538SAndroid Build Coastguard Worker unsigned char output[base::kSHA1Length];
81*6777b538SAndroid Build Coastguard Worker
82*6777b538SAndroid Build Coastguard Worker static constexpr unsigned char kExpected[] = {
83*6777b538SAndroid Build Coastguard Worker 0x84, 0x98, 0x3e, 0x44, 0x1c, 0x3b, 0xd2, 0x6e, 0xba, 0xae,
84*6777b538SAndroid Build Coastguard Worker 0x4a, 0xa1, 0xf9, 0x51, 0x29, 0xe5, 0xe5, 0x46, 0x70, 0xf1};
85*6777b538SAndroid Build Coastguard Worker
86*6777b538SAndroid Build Coastguard Worker base::SHA1HashBytes(reinterpret_cast<const unsigned char*>(input.c_str()),
87*6777b538SAndroid Build Coastguard Worker input.size(), output);
88*6777b538SAndroid Build Coastguard Worker for (size_t i = 0; i < base::kSHA1Length; i++)
89*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(kExpected[i], output[i]);
90*6777b538SAndroid Build Coastguard Worker
91*6777b538SAndroid Build Coastguard Worker base::SHA1Digest output_array = base::SHA1HashSpan(base::as_byte_span(input));
92*6777b538SAndroid Build Coastguard Worker for (size_t i = 0; i < base::kSHA1Length; i++)
93*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(kExpected[i], output_array[i]);
94*6777b538SAndroid Build Coastguard Worker }
95*6777b538SAndroid Build Coastguard Worker
TEST(SHA1Test,Test3BytesAndSpan)96*6777b538SAndroid Build Coastguard Worker TEST(SHA1Test, Test3BytesAndSpan) {
97*6777b538SAndroid Build Coastguard Worker // Example A.3 from FIPS 180-2: long message.
98*6777b538SAndroid Build Coastguard Worker std::string input(1000000, 'a');
99*6777b538SAndroid Build Coastguard Worker unsigned char output[base::kSHA1Length];
100*6777b538SAndroid Build Coastguard Worker
101*6777b538SAndroid Build Coastguard Worker static constexpr unsigned char kExpected[] = {
102*6777b538SAndroid Build Coastguard Worker 0x34, 0xaa, 0x97, 0x3c, 0xd4, 0xc4, 0xda, 0xa4, 0xf6, 0x1e,
103*6777b538SAndroid Build Coastguard Worker 0xeb, 0x2b, 0xdb, 0xad, 0x27, 0x31, 0x65, 0x34, 0x01, 0x6f};
104*6777b538SAndroid Build Coastguard Worker
105*6777b538SAndroid Build Coastguard Worker base::SHA1HashBytes(reinterpret_cast<const unsigned char*>(input.c_str()),
106*6777b538SAndroid Build Coastguard Worker input.size(), output);
107*6777b538SAndroid Build Coastguard Worker for (size_t i = 0; i < base::kSHA1Length; i++)
108*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(kExpected[i], output[i]);
109*6777b538SAndroid Build Coastguard Worker
110*6777b538SAndroid Build Coastguard Worker base::SHA1Digest output_array = base::SHA1HashSpan(base::as_byte_span(input));
111*6777b538SAndroid Build Coastguard Worker for (size_t i = 0; i < base::kSHA1Length; i++)
112*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(kExpected[i], output_array[i]);
113*6777b538SAndroid Build Coastguard Worker }
114*6777b538SAndroid Build Coastguard Worker
TEST(SHA1Test,StreamingSHA1WithWholeInput)115*6777b538SAndroid Build Coastguard Worker TEST(SHA1Test, StreamingSHA1WithWholeInput) {
116*6777b538SAndroid Build Coastguard Worker // Example A.1 from FIPS 180-2: one-block message.
117*6777b538SAndroid Build Coastguard Worker std::string input = "abc";
118*6777b538SAndroid Build Coastguard Worker static constexpr unsigned char kExpected[] = {
119*6777b538SAndroid Build Coastguard Worker 0xa9, 0x99, 0x3e, 0x36, 0x47, 0x06, 0x81, 0x6a, 0xba, 0x3e,
120*6777b538SAndroid Build Coastguard Worker 0x25, 0x71, 0x78, 0x50, 0xc2, 0x6c, 0x9c, 0xd0, 0xd8, 0x9d};
121*6777b538SAndroid Build Coastguard Worker
122*6777b538SAndroid Build Coastguard Worker base::SHA1Context context;
123*6777b538SAndroid Build Coastguard Worker base::SHA1Digest digest;
124*6777b538SAndroid Build Coastguard Worker base::SHA1Init(context);
125*6777b538SAndroid Build Coastguard Worker base::SHA1Update(input, context);
126*6777b538SAndroid Build Coastguard Worker base::SHA1Final(context, digest);
127*6777b538SAndroid Build Coastguard Worker
128*6777b538SAndroid Build Coastguard Worker unsigned char* digest_array = digest.data();
129*6777b538SAndroid Build Coastguard Worker for (size_t i = 0; i < base::kSHA1Length; ++i) {
130*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(kExpected[i], digest_array[i]);
131*6777b538SAndroid Build Coastguard Worker }
132*6777b538SAndroid Build Coastguard Worker }
133*6777b538SAndroid Build Coastguard Worker
TEST(SHA1Test,StreamingSHA1WithChunkedInput)134*6777b538SAndroid Build Coastguard Worker TEST(SHA1Test, StreamingSHA1WithChunkedInput) {
135*6777b538SAndroid Build Coastguard Worker // Example A.3 from FIPS 180-2: long message, split into 2 updates.
136*6777b538SAndroid Build Coastguard Worker std::string input1(500000, 'a');
137*6777b538SAndroid Build Coastguard Worker std::string input2(500000, 'a');
138*6777b538SAndroid Build Coastguard Worker std::string input = input1 + input2;
139*6777b538SAndroid Build Coastguard Worker static constexpr unsigned char kExpected[] = {
140*6777b538SAndroid Build Coastguard Worker 0x34, 0xaa, 0x97, 0x3c, 0xd4, 0xc4, 0xda, 0xa4, 0xf6, 0x1e,
141*6777b538SAndroid Build Coastguard Worker 0xeb, 0x2b, 0xdb, 0xad, 0x27, 0x31, 0x65, 0x34, 0x01, 0x6f};
142*6777b538SAndroid Build Coastguard Worker
143*6777b538SAndroid Build Coastguard Worker base::SHA1Context context;
144*6777b538SAndroid Build Coastguard Worker base::SHA1Digest digest;
145*6777b538SAndroid Build Coastguard Worker
146*6777b538SAndroid Build Coastguard Worker base::SHA1Init(context);
147*6777b538SAndroid Build Coastguard Worker base::SHA1Update(input1, context);
148*6777b538SAndroid Build Coastguard Worker base::SHA1Update(input2, context);
149*6777b538SAndroid Build Coastguard Worker base::SHA1Final(context, digest);
150*6777b538SAndroid Build Coastguard Worker
151*6777b538SAndroid Build Coastguard Worker unsigned char* digest_array = digest.data();
152*6777b538SAndroid Build Coastguard Worker for (size_t i = 0; i < base::kSHA1Length; ++i) {
153*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(kExpected[i], digest_array[i]);
154*6777b538SAndroid Build Coastguard Worker }
155*6777b538SAndroid Build Coastguard Worker }
156