| // Copyright 2020 The Cobalt Authors. All Rights Reserved. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| #include "cobalt/subtlecrypto/crypto_impl.h" |
| #include "testing/gmock/include/gmock/gmock.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| namespace cobalt { |
| namespace subtlecrypto { |
| namespace { |
| |
| ByteVector empty_ref{218, 57, 163, 238, 94, 107, 75, 13, 50, 85, |
| 191, 239, 149, 96, 24, 144, 175, 216, 7, 9}; |
| |
| using testing::ContainerEq; |
| |
| TEST(HashImplTest, CreateByName) { |
| EXPECT_TRUE(Hash::CreateByName("SHA-1")); |
| EXPECT_TRUE(Hash::CreateByName("sha-1")); |
| EXPECT_TRUE(Hash::CreateByName("SHA-256")); |
| EXPECT_TRUE(Hash::CreateByName("sha-512")); |
| EXPECT_FALSE(Hash::CreateByName("md5")); |
| EXPECT_FALSE(Hash::CreateByName("SHA1")); |
| EXPECT_FALSE(Hash::CreateByName("BlowFish")); |
| } |
| |
| TEST(HashImplTest, NullHash) { |
| auto hash = Hash::CreateByName("SHA-1"); |
| auto out = hash->Finish(); |
| EXPECT_THAT(out, ContainerEq(empty_ref)); |
| } |
| |
| TEST(HashImplTest, EmptyHash) { |
| auto hash = Hash::CreateByName("SHA-1"); |
| hash->Update({}); |
| auto out = hash->Finish(); |
| EXPECT_THAT(out, ContainerEq(empty_ref)); |
| } |
| |
| TEST(HashImplTest, BasicHash) { |
| auto hash = Hash::CreateByName("SHA-1"); |
| hash->Update({1, 2, 3}); |
| auto out = hash->Finish(); |
| EXPECT_THAT(out, testing::ContainerEq(ByteVector{ |
| 112, 55, 128, 113, 152, 194, 42, 125, 43, 8, |
| 7, 55, 29, 118, 55, 121, 168, 79, 223, 207})); |
| } |
| |
| TEST(HashImplTest, LongHash) { |
| auto hash = Hash::CreateByName("SHA-512"); |
| hash->Update({'c', 'o', 'b', 'a', 'l', 't'}); |
| auto out = hash->Finish(); |
| EXPECT_THAT( |
| out, ContainerEq(ByteVector{ |
| 151, 169, 180, 36, 213, 102, 227, 224, 165, 138, 100, 210, 91, |
| 158, 228, 19, 41, 40, 161, 153, 173, 66, 171, 83, 20, 245, |
| 230, 110, 197, 4, 211, 110, 253, 105, 233, 138, 42, 70, 242, |
| 210, 45, 70, 247, 103, 5, 145, 228, 142, 197, 56, 73, 160, |
| 210, 95, 81, 144, 51, 173, 207, 21, 183, 234, 15, 226})); |
| } |
| |
| TEST(HMACImplTest, SimpleHmac) { |
| auto hash = Hash::CreateByName("SHA-1"); |
| auto out = hash->CalculateHMAC({1, 2, 3}, {3, 4, 5}); |
| EXPECT_THAT(out, ContainerEq(ByteVector{253, 95, 161, 139, 138, 122, 106, |
| 143, 19, 9, 188, 104, 215, 248, |
| 12, 112, 14, 38, 175, 198})); |
| } |
| |
| TEST(HMACImplTest, LongHmac) { |
| auto hash = Hash::CreateByName("SHA-256"); |
| auto out = hash->CalculateHMAC({1, 2, 3}, {3, 4, 5}); |
| EXPECT_THAT(out, ContainerEq(ByteVector{ |
| 12, 25, 8, 57, 149, 183, 80, 251, 83, 218, 165, |
| 55, 132, 139, 243, 70, 107, 18, 185, 64, 103, 13, |
| 251, 57, 248, 156, 237, 253, 103, 133, 26, 39})); |
| } |
| |
| TEST(HMACImplTest, EmptyHmac) { |
| auto hash = Hash::CreateByName("SHA-1"); |
| auto out = hash->CalculateHMAC({}, {3, 4, 5}); |
| EXPECT_THAT(out, ContainerEq(ByteVector{137, 104, 209, 15, 163, 43, 226, |
| 236, 10, 29, 196, 233, 152, 219, |
| 179, 217, 186, 247, 111, 43})); |
| } |
| |
| TEST(HMACImplTest, EmptyHmacKey) { |
| auto hash = Hash::CreateByName("SHA-1"); |
| auto out = hash->CalculateHMAC({1, 2, 3}, {}); |
| EXPECT_THAT(out, ContainerEq(ByteVector{104, 1, 10, 108, 24, 33, 145, |
| 220, 224, 70, 243, 58, 196, 6, |
| 109, 163, 178, 181, 185, 37})); |
| } |
| |
| ByteVector key_128 = {0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7}; |
| ByteVector key_192 = {0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, |
| 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7}; |
| ByteVector key_256 = {0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, |
| 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7}; |
| |
| ByteVector iv_128 = {7, 6, 5, 4, 3, 2, 1, 0, 0, 1, 2, 3, 4, 5, 6, 7}; |
| |
| TEST(AESImplTest, Simple) { |
| auto out = CalculateAES_CTR({1, 2}, key_128, iv_128); |
| EXPECT_THAT(out, ContainerEq(ByteVector{76, 8})); |
| |
| auto modified_key{key_128}; |
| modified_key[0] = 42; |
| out = CalculateAES_CTR({1, 2}, modified_key, iv_128); |
| EXPECT_THAT(out, ContainerEq(ByteVector{185, 59})); |
| |
| auto modified_iv{key_128}; |
| modified_iv[0] = 42; |
| out = CalculateAES_CTR({1, 2}, key_128, modified_iv); |
| EXPECT_THAT(out, ContainerEq(ByteVector{249, 68})); |
| |
| out = CalculateAES_CTR({1, 2}, key_192, iv_128); |
| EXPECT_THAT(out, ContainerEq(ByteVector{225, 207})); |
| |
| out = CalculateAES_CTR({1, 2}, key_256, iv_128); |
| EXPECT_THAT(out, ContainerEq(ByteVector{18, 233})); |
| } |
| |
| TEST(AESImplTest, Long) { |
| auto sizes = {1, 2, 16, 17, 31, 32, 33, 1025, 16385, 1028 * 1024 + 1}; |
| for (auto& size : sizes) { |
| ByteVector data(size, 1); |
| auto out = CalculateAES_CTR(data, key_128, iv_128); |
| EXPECT_EQ(out.size(), size); |
| } |
| } |
| |
| TEST(AESImplTest, InvalidParams) { |
| auto out = CalculateAES_CTR({1, 2}, {1}, iv_128); |
| EXPECT_TRUE(out.empty()); |
| |
| out = CalculateAES_CTR({1, 2}, key_128, {1, 2}); |
| EXPECT_TRUE(out.empty()); |
| } |
| |
| } // namespace |
| } // namespace subtlecrypto |
| } // namespace cobalt |