1f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko// Use of this source code is governed by a BSD-style license that can be
3f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko// found in the LICENSE file.
4f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko
5f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko#include "crypto/sha2.h"
6f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko
724854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko#include <stddef.h>
824854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko#include <stdint.h>
924854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko
10f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko#include "testing/gtest/include/gtest/gtest.h"
11f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko
12f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex VakulenkoTEST(Sha256Test, Test1) {
13f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko  // Example B.1 from FIPS 180-2: one-block message.
14f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko  std::string input1 = "abc";
15f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko  int expected1[] = { 0xba, 0x78, 0x16, 0xbf,
16f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko                      0x8f, 0x01, 0xcf, 0xea,
17f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko                      0x41, 0x41, 0x40, 0xde,
18f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko                      0x5d, 0xae, 0x22, 0x23,
19f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko                      0xb0, 0x03, 0x61, 0xa3,
20f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko                      0x96, 0x17, 0x7a, 0x9c,
21f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko                      0xb4, 0x10, 0xff, 0x61,
22f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko                      0xf2, 0x00, 0x15, 0xad };
23f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko
2424854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko  uint8_t output1[crypto::kSHA256Length];
25f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko  crypto::SHA256HashString(input1, output1, sizeof(output1));
26f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko  for (size_t i = 0; i < crypto::kSHA256Length; i++)
27f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko    EXPECT_EQ(expected1[i], static_cast<int>(output1[i]));
28f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko
2924854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko  uint8_t output_truncated1[4];  // 4 bytes == 32 bits
30f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko  crypto::SHA256HashString(input1,
31f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko                           output_truncated1, sizeof(output_truncated1));
32f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko  for (size_t i = 0; i < sizeof(output_truncated1); i++)
33f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko    EXPECT_EQ(expected1[i], static_cast<int>(output_truncated1[i]));
34f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko}
35f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko
36f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex VakulenkoTEST(Sha256Test, Test1_String) {
37f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko  // Same as the above, but using the wrapper that returns a std::string.
38f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko  // Example B.1 from FIPS 180-2: one-block message.
39f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko  std::string input1 = "abc";
40f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko  int expected1[] = { 0xba, 0x78, 0x16, 0xbf,
41f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko                      0x8f, 0x01, 0xcf, 0xea,
42f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko                      0x41, 0x41, 0x40, 0xde,
43f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko                      0x5d, 0xae, 0x22, 0x23,
44f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko                      0xb0, 0x03, 0x61, 0xa3,
45f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko                      0x96, 0x17, 0x7a, 0x9c,
46f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko                      0xb4, 0x10, 0xff, 0x61,
47f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko                      0xf2, 0x00, 0x15, 0xad };
48f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko
49f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko  std::string output1 = crypto::SHA256HashString(input1);
50f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko  ASSERT_EQ(crypto::kSHA256Length, output1.size());
51f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko  for (size_t i = 0; i < crypto::kSHA256Length; i++)
5224854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko    EXPECT_EQ(expected1[i], static_cast<uint8_t>(output1[i]));
53f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko}
54f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko
55f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex VakulenkoTEST(Sha256Test, Test2) {
56f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko  // Example B.2 from FIPS 180-2: multi-block message.
57f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko  std::string input2 =
58f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko      "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq";
59f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko  int expected2[] = { 0x24, 0x8d, 0x6a, 0x61,
60f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko                      0xd2, 0x06, 0x38, 0xb8,
61f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko                      0xe5, 0xc0, 0x26, 0x93,
62f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko                      0x0c, 0x3e, 0x60, 0x39,
63f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko                      0xa3, 0x3c, 0xe4, 0x59,
64f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko                      0x64, 0xff, 0x21, 0x67,
65f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko                      0xf6, 0xec, 0xed, 0xd4,
66f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko                      0x19, 0xdb, 0x06, 0xc1 };
67f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko
6824854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko  uint8_t output2[crypto::kSHA256Length];
69f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko  crypto::SHA256HashString(input2, output2, sizeof(output2));
70f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko  for (size_t i = 0; i < crypto::kSHA256Length; i++)
71f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko    EXPECT_EQ(expected2[i], static_cast<int>(output2[i]));
72f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko
7324854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko  uint8_t output_truncated2[6];
74f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko  crypto::SHA256HashString(input2,
75f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko                           output_truncated2, sizeof(output_truncated2));
76f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko  for (size_t i = 0; i < sizeof(output_truncated2); i++)
77f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko    EXPECT_EQ(expected2[i], static_cast<int>(output_truncated2[i]));
78f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko}
79f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko
80f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex VakulenkoTEST(Sha256Test, Test3) {
81f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko  // Example B.3 from FIPS 180-2: long message.
82f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko  std::string input3(1000000, 'a');  // 'a' repeated a million times
83f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko  int expected3[] = { 0xcd, 0xc7, 0x6e, 0x5c,
84f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko                      0x99, 0x14, 0xfb, 0x92,
85f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko                      0x81, 0xa1, 0xc7, 0xe2,
86f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko                      0x84, 0xd7, 0x3e, 0x67,
87f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko                      0xf1, 0x80, 0x9a, 0x48,
88f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko                      0xa4, 0x97, 0x20, 0x0e,
89f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko                      0x04, 0x6d, 0x39, 0xcc,
90f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko                      0xc7, 0x11, 0x2c, 0xd0 };
91f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko
9224854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko  uint8_t output3[crypto::kSHA256Length];
93f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko  crypto::SHA256HashString(input3, output3, sizeof(output3));
94f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko  for (size_t i = 0; i < crypto::kSHA256Length; i++)
95f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko    EXPECT_EQ(expected3[i], static_cast<int>(output3[i]));
96f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko
9724854748fba09df2a29f0d08d558c3acea70e7a1Alex Vakulenko  uint8_t output_truncated3[12];
98f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko  crypto::SHA256HashString(input3,
99f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko                           output_truncated3, sizeof(output_truncated3));
100f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko  for (size_t i = 0; i < sizeof(output_truncated3); i++)
101f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko    EXPECT_EQ(expected3[i], static_cast<int>(output_truncated3[i]));
102f6024733c0d1eed88f68520b5e6a20b96e212ad6Alex Vakulenko}
103