OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "crypto/secure_hash.h" | 5 #include "crypto/secure_hash.h" |
6 | 6 |
| 7 #include <stddef.h> |
| 8 #include <stdint.h> |
| 9 |
7 #include <string> | 10 #include <string> |
8 | 11 |
9 #include "base/basictypes.h" | |
10 #include "base/memory/scoped_ptr.h" | 12 #include "base/memory/scoped_ptr.h" |
11 #include "base/pickle.h" | 13 #include "base/pickle.h" |
12 #include "crypto/sha2.h" | 14 #include "crypto/sha2.h" |
13 #include "testing/gtest/include/gtest/gtest.h" | 15 #include "testing/gtest/include/gtest/gtest.h" |
14 | 16 |
15 TEST(SecureHashTest, TestUpdate) { | 17 TEST(SecureHashTest, TestUpdate) { |
16 // Example B.3 from FIPS 180-2: long message. | 18 // Example B.3 from FIPS 180-2: long message. |
17 std::string input3(500000, 'a'); // 'a' repeated half a million times | 19 std::string input3(500000, 'a'); // 'a' repeated half a million times |
18 int expected3[] = { 0xcd, 0xc7, 0x6e, 0x5c, | 20 int expected3[] = { 0xcd, 0xc7, 0x6e, 0x5c, |
19 0x99, 0x14, 0xfb, 0x92, | 21 0x99, 0x14, 0xfb, 0x92, |
20 0x81, 0xa1, 0xc7, 0xe2, | 22 0x81, 0xa1, 0xc7, 0xe2, |
21 0x84, 0xd7, 0x3e, 0x67, | 23 0x84, 0xd7, 0x3e, 0x67, |
22 0xf1, 0x80, 0x9a, 0x48, | 24 0xf1, 0x80, 0x9a, 0x48, |
23 0xa4, 0x97, 0x20, 0x0e, | 25 0xa4, 0x97, 0x20, 0x0e, |
24 0x04, 0x6d, 0x39, 0xcc, | 26 0x04, 0x6d, 0x39, 0xcc, |
25 0xc7, 0x11, 0x2c, 0xd0 }; | 27 0xc7, 0x11, 0x2c, 0xd0 }; |
26 | 28 |
27 uint8 output3[crypto::kSHA256Length]; | 29 uint8_t output3[crypto::kSHA256Length]; |
28 | 30 |
29 scoped_ptr<crypto::SecureHash> ctx(crypto::SecureHash::Create( | 31 scoped_ptr<crypto::SecureHash> ctx(crypto::SecureHash::Create( |
30 crypto::SecureHash::SHA256)); | 32 crypto::SecureHash::SHA256)); |
31 ctx->Update(input3.data(), input3.size()); | 33 ctx->Update(input3.data(), input3.size()); |
32 ctx->Update(input3.data(), input3.size()); | 34 ctx->Update(input3.data(), input3.size()); |
33 | 35 |
34 ctx->Finish(output3, sizeof(output3)); | 36 ctx->Finish(output3, sizeof(output3)); |
35 for (size_t i = 0; i < crypto::kSHA256Length; i++) | 37 for (size_t i = 0; i < crypto::kSHA256Length; i++) |
36 EXPECT_EQ(expected3[i], static_cast<int>(output3[i])); | 38 EXPECT_EQ(expected3[i], static_cast<int>(output3[i])); |
37 } | 39 } |
38 | 40 |
39 // Save the crypto state mid-stream, and create another instance with the | 41 // Save the crypto state mid-stream, and create another instance with the |
40 // saved state. Then feed the same data afterwards to both. | 42 // saved state. Then feed the same data afterwards to both. |
41 // When done, both should have the same hash value. | 43 // When done, both should have the same hash value. |
42 TEST(SecureHashTest, TestSerialization) { | 44 TEST(SecureHashTest, TestSerialization) { |
43 std::string input1(10001, 'a'); // 'a' repeated 10001 times | 45 std::string input1(10001, 'a'); // 'a' repeated 10001 times |
44 std::string input2(10001, 'b'); // 'b' repeated 10001 times | 46 std::string input2(10001, 'b'); // 'b' repeated 10001 times |
45 std::string input3(10001, 'c'); // 'c' repeated 10001 times | 47 std::string input3(10001, 'c'); // 'c' repeated 10001 times |
46 std::string input4(10001, 'd'); // 'd' repeated 10001 times | 48 std::string input4(10001, 'd'); // 'd' repeated 10001 times |
47 std::string input5(10001, 'e'); // 'e' repeated 10001 times | 49 std::string input5(10001, 'e'); // 'e' repeated 10001 times |
48 | 50 |
49 uint8 output1[crypto::kSHA256Length]; | 51 uint8_t output1[crypto::kSHA256Length]; |
50 uint8 output2[crypto::kSHA256Length]; | 52 uint8_t output2[crypto::kSHA256Length]; |
51 | 53 |
52 scoped_ptr<crypto::SecureHash> ctx1(crypto::SecureHash::Create( | 54 scoped_ptr<crypto::SecureHash> ctx1(crypto::SecureHash::Create( |
53 crypto::SecureHash::SHA256)); | 55 crypto::SecureHash::SHA256)); |
54 scoped_ptr<crypto::SecureHash> ctx2(crypto::SecureHash::Create( | 56 scoped_ptr<crypto::SecureHash> ctx2(crypto::SecureHash::Create( |
55 crypto::SecureHash::SHA256)); | 57 crypto::SecureHash::SHA256)); |
56 base::Pickle pickle; | 58 base::Pickle pickle; |
57 ctx1->Update(input1.data(), input1.size()); | 59 ctx1->Update(input1.data(), input1.size()); |
58 ctx1->Update(input2.data(), input2.size()); | 60 ctx1->Update(input2.data(), input2.size()); |
59 ctx1->Update(input3.data(), input3.size()); | 61 ctx1->Update(input3.data(), input3.size()); |
60 | 62 |
61 EXPECT_TRUE(ctx1->Serialize(&pickle)); | 63 EXPECT_TRUE(ctx1->Serialize(&pickle)); |
62 ctx1->Update(input4.data(), input4.size()); | 64 ctx1->Update(input4.data(), input4.size()); |
63 ctx1->Update(input5.data(), input5.size()); | 65 ctx1->Update(input5.data(), input5.size()); |
64 | 66 |
65 ctx1->Finish(output1, sizeof(output1)); | 67 ctx1->Finish(output1, sizeof(output1)); |
66 | 68 |
67 base::PickleIterator data_iterator(pickle); | 69 base::PickleIterator data_iterator(pickle); |
68 EXPECT_TRUE(ctx2->Deserialize(&data_iterator)); | 70 EXPECT_TRUE(ctx2->Deserialize(&data_iterator)); |
69 ctx2->Update(input4.data(), input4.size()); | 71 ctx2->Update(input4.data(), input4.size()); |
70 ctx2->Update(input5.data(), input5.size()); | 72 ctx2->Update(input5.data(), input5.size()); |
71 | 73 |
72 ctx2->Finish(output2, sizeof(output2)); | 74 ctx2->Finish(output2, sizeof(output2)); |
73 | 75 |
74 EXPECT_EQ(0, memcmp(output1, output2, crypto::kSHA256Length)); | 76 EXPECT_EQ(0, memcmp(output1, output2, crypto::kSHA256Length)); |
75 } | 77 } |
OLD | NEW |