// 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
