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