1c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Copyright (c) 2009 The Chromium Authors. All rights reserved. 2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be 3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file. 4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/sha1.h" 6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <string> 8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/basictypes.h" 10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "testing/gtest/include/gtest/gtest.h" 11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(SHA1Test, Test1) { 13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Example A.1 from FIPS 180-2: one-block message. 14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string input = "abc"; 15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int expected[] = { 0xa9, 0x99, 0x3e, 0x36, 17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x47, 0x06, 0x81, 0x6a, 18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0xba, 0x3e, 0x25, 0x71, 19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x78, 0x50, 0xc2, 0x6c, 20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x9c, 0xd0, 0xd8, 0x9d }; 21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string output = base::SHA1HashString(input); 23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (size_t i = 0; i < base::SHA1_LENGTH; i++) 24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(expected[i], output[i] & 0xFF); 25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(SHA1Test, Test2) { 28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Example A.2 from FIPS 180-2: multi-block message. 29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string input = 30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"; 31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int expected[] = { 0x84, 0x98, 0x3e, 0x44, 33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x1c, 0x3b, 0xd2, 0x6e, 34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0xba, 0xae, 0x4a, 0xa1, 35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0xf9, 0x51, 0x29, 0xe5, 36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0xe5, 0x46, 0x70, 0xf1 }; 37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string output = base::SHA1HashString(input); 39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (size_t i = 0; i < base::SHA1_LENGTH; i++) 40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(expected[i], output[i] & 0xFF); 41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(SHA1Test, Test3) { 44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Example A.3 from FIPS 180-2: long message. 45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string input(1000000, 'a'); 46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int expected[] = { 0x34, 0xaa, 0x97, 0x3c, 48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0xd4, 0xc4, 0xda, 0xa4, 49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0xf6, 0x1e, 0xeb, 0x2b, 50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0xdb, 0xad, 0x27, 0x31, 51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x65, 0x34, 0x01, 0x6f }; 52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string output = base::SHA1HashString(input); 54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (size_t i = 0; i < base::SHA1_LENGTH; i++) 55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(expected[i], output[i] & 0xFF); 56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 57ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 58ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST(SHA1Test, Test1Bytes) { 59ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Example A.1 from FIPS 180-2: one-block message. 60ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::string input = "abc"; 61ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen unsigned char output[base::SHA1_LENGTH]; 62ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 63ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen unsigned char expected[] = { 0xa9, 0x99, 0x3e, 0x36, 64ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 0x47, 0x06, 0x81, 0x6a, 65ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 0xba, 0x3e, 0x25, 0x71, 66ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 0x78, 0x50, 0xc2, 0x6c, 67ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 0x9c, 0xd0, 0xd8, 0x9d }; 68ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 69ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen base::SHA1HashBytes(reinterpret_cast<const unsigned char*>(input.c_str()), 70ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen input.length(), output); 71ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen for (size_t i = 0; i < base::SHA1_LENGTH; i++) 72ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(expected[i], output[i]); 73ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 74ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 75ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST(SHA1Test, Test2Bytes) { 76ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Example A.2 from FIPS 180-2: multi-block message. 77ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::string input = 78ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"; 79ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen unsigned char output[base::SHA1_LENGTH]; 80ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 81ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen unsigned char expected[] = { 0x84, 0x98, 0x3e, 0x44, 82ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 0x1c, 0x3b, 0xd2, 0x6e, 83ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 0xba, 0xae, 0x4a, 0xa1, 84ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 0xf9, 0x51, 0x29, 0xe5, 85ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 0xe5, 0x46, 0x70, 0xf1 }; 86ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 87ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen base::SHA1HashBytes(reinterpret_cast<const unsigned char*>(input.c_str()), 88ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen input.length(), output); 89ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen for (size_t i = 0; i < base::SHA1_LENGTH; i++) 90ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(expected[i], output[i]); 91ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 92ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 93ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST(SHA1Test, Test3Bytes) { 94ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Example A.3 from FIPS 180-2: long message. 95ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::string input(1000000, 'a'); 96ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen unsigned char output[base::SHA1_LENGTH]; 97ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 98ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen unsigned char expected[] = { 0x34, 0xaa, 0x97, 0x3c, 99ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 0xd4, 0xc4, 0xda, 0xa4, 100ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 0xf6, 0x1e, 0xeb, 0x2b, 101ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 0xdb, 0xad, 0x27, 0x31, 102ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 0x65, 0x34, 0x01, 0x6f }; 103ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 104ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen base::SHA1HashBytes(reinterpret_cast<const unsigned char*>(input.c_str()), 105ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen input.length(), output); 106ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen for (size_t i = 0; i < base::SHA1_LENGTH; i++) 107ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(expected[i], output[i]); 108ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 109