// Copyright 2018 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "cryptohome/cryptolib.h"

#include <openssl/rsa.h>

#include <base/base64.h>
#include <brillo/secure_blob.h>
#include <crypto/scoped_openssl_types.h>
#include <gtest/gtest.h>

using brillo::SecureBlob;

namespace cryptohome {

namespace {

void CheckBlob(const brillo::SecureBlob& original_blob,
               const brillo::SecureBlob& key,
               const brillo::SecureBlob& wrapped_blob,
               const std::string& original_str) {
  brillo::SecureBlob decrypted_blob(wrapped_blob.size());
  CryptoError error;
  EXPECT_TRUE(
      CryptoLib::DecryptScryptBlob(wrapped_blob, key, &decrypted_blob, &error));

  const std::string decrypted_str(decrypted_blob.begin(), decrypted_blob.end());
  EXPECT_EQ(original_str, decrypted_str);
}

}  // namespace

TEST(CryptoLibTest, RsaOaepDecrypt) {
  // Generate the input data.
  constexpr int kKeySizeBits = 1024;
  constexpr int kKeySizeBytes = kKeySizeBits / 8;
  constexpr int kPlaintextSize = 32;
  crypto::ScopedRSA rsa(RSA_new());
  CHECK(rsa);
  crypto::ScopedBIGNUM e(BN_new());
  CHECK(e);
  EXPECT_TRUE(BN_set_word(e.get(), kWellKnownExponent));
  EXPECT_TRUE(RSA_generate_key_ex(rsa.get(), kKeySizeBits, e.get(), nullptr));
  const auto plaintext = CryptoLib::CreateSecureRandomBlob(kPlaintextSize);
  // Test decryption when a non-empty label is used.
  const SecureBlob kFirstOaepLabel("foo");
  SecureBlob first_padded_data(kKeySizeBytes);
  ASSERT_EQ(
      1, RSA_padding_add_PKCS1_OAEP(
             first_padded_data.data(), kKeySizeBytes, plaintext.data(),
             plaintext.size(), kFirstOaepLabel.data(), kFirstOaepLabel.size()));
  SecureBlob first_ciphertext(kKeySizeBytes);
  ASSERT_NE(-1, RSA_public_encrypt(kKeySizeBytes, first_padded_data.data(),
                                   first_ciphertext.data(), rsa.get(),
                                   RSA_NO_PADDING));
  SecureBlob first_decrypt_result;
  EXPECT_TRUE(CryptoLib::RsaOaepDecrypt(first_ciphertext, kFirstOaepLabel,
                                        rsa.get(), &first_decrypt_result));
  EXPECT_EQ(plaintext, first_decrypt_result);
  // Test the empty label case in which the encryption is done by a single call
  // to OpenSSL.
  SecureBlob second_ciphertext(kKeySizeBytes);
  ASSERT_NE(-1, RSA_public_encrypt(kPlaintextSize, plaintext.data(),
                                   second_ciphertext.data(), rsa.get(),
                                   RSA_PKCS1_OAEP_PADDING));
  SecureBlob second_decrypt_result;
  EXPECT_TRUE(CryptoLib::RsaOaepDecrypt(second_ciphertext, SecureBlob(),
                                        rsa.get(), &second_decrypt_result));
  EXPECT_EQ(plaintext, second_decrypt_result);
}

TEST(CryptoLibTest, TestRocaVulnerable) {
  // This is a modulus from key generated by a TPM running vulnerable firmware.
  const uint8_t vulnerable_modulus[] = {
      0x00, 0x9e, 0x31, 0xea, 0x73, 0xed, 0x06, 0x22, 0x52, 0x30, 0x85, 0x22,
      0x75, 0xa8, 0x60, 0x6e, 0x08, 0x56, 0xbc, 0xee, 0xb1, 0xba, 0xd5, 0x62,
      0xe0, 0x3b, 0x03, 0xc4, 0x68, 0x2a, 0x20, 0x72, 0xa2, 0x5c, 0x7a, 0xd8,
      0x9d, 0x00, 0xf8, 0xb3, 0xf8, 0x83, 0xc3, 0x97, 0xaa, 0x5d, 0x55, 0xfe,
      0x75, 0x1f, 0x0a, 0x25, 0xbf, 0xe0, 0x89, 0x0c, 0x02, 0x30, 0x6b, 0x5f,
      0xfa, 0x0f, 0x6c, 0xc6, 0x20, 0x79, 0xc9, 0x6a, 0x32, 0x4a, 0x15, 0xf3,
      0x87, 0xf8, 0x24, 0x0b, 0x1b, 0x62, 0x9d, 0xcc, 0xe5, 0xc5, 0x14, 0x5d,
      0x69, 0xcc, 0x2f, 0x97, 0x3f, 0x40, 0x51, 0xe3, 0x35, 0x38, 0x99, 0x14,
      0xcc, 0x45, 0x91, 0x93, 0x65, 0x31, 0x98, 0x03, 0x80, 0x2a, 0x13, 0x37,
      0x89, 0x0b, 0xfb, 0x87, 0xae, 0x99, 0xa1, 0x75, 0x72, 0xdc, 0x53, 0x64,
      0x71, 0x6f, 0xdc, 0x13, 0x91, 0xf8, 0x16, 0x5c, 0xdc, 0xb9, 0x07, 0x9c,
      0xc2, 0x0e, 0x5b, 0x71, 0xf7, 0x6d, 0x70, 0xba, 0x05, 0x1a, 0x47, 0x06,
      0xb2, 0x7e, 0x65, 0xdf, 0xae, 0x8f, 0x49, 0xb5, 0x4e, 0x5e, 0x7a, 0x8d,
      0x1e, 0x81, 0x6f, 0x2e, 0x31, 0x35, 0x88, 0x03, 0x1d, 0xe7, 0xe0, 0x87,
      0x7a, 0x87, 0xc0, 0x8b, 0xe0, 0xbb, 0x9c, 0x05, 0x68, 0x89, 0xe8, 0x04,
      0x69, 0xc1, 0x33, 0xec, 0x14, 0xe0, 0x11, 0xd1, 0xae, 0x4a, 0xd0, 0xd9,
      0x3a, 0x5b, 0x79, 0xc7, 0x12, 0x78, 0x2d, 0x8a, 0x8f, 0x2d, 0x00, 0xf7,
      0x0d, 0x5e, 0x00, 0xa0, 0x35, 0x9a, 0x02, 0xb0, 0x73, 0xad, 0xbc, 0x44,
      0xd2, 0x67, 0x73, 0x64, 0x08, 0xc8, 0x60, 0x58, 0x04, 0xf1, 0xa5, 0xd2,
      0xd5, 0x18, 0x4e, 0x39, 0x3e, 0x68, 0xe6, 0xfa, 0xa7, 0x55, 0xd9, 0xeb,
      0xd8, 0x5f, 0xe7, 0xde, 0xab, 0x2e, 0x8b, 0x17, 0x5d, 0x08, 0x79, 0x6b,
      0x7a, 0x7e, 0xf0, 0x06, 0x61,
  };
  crypto::ScopedBIGNUM vulnerable_modulus_bn(
      BN_bin2bn(vulnerable_modulus, sizeof(vulnerable_modulus), nullptr));
  EXPECT_TRUE(CryptoLib::TestRocaVulnerable(vulnerable_modulus_bn.get()));

  // A key generated by a non-vulnerable TPM.
  const uint8_t good_modulus[] = {
      0x00, 0xcc, 0xe8, 0xcf, 0xb5, 0x6e, 0x36, 0x99, 0x21, 0x7b, 0x95, 0xb9,
      0x75, 0xa6, 0x80, 0x12, 0xb0, 0x54, 0x1c, 0x62, 0x10, 0x77, 0x06, 0xbf,
      0x2c, 0xad, 0xa6, 0x5a, 0x79, 0x6a, 0x23, 0x06, 0x87, 0x2a, 0xf8, 0x37,
      0x4c, 0x47, 0xa7, 0xcf, 0x82, 0x7e, 0xa1, 0xd5, 0x73, 0x56, 0x04, 0xc4,
      0x60, 0xd7, 0x43, 0x5d, 0xa6, 0x6b, 0x44, 0x83, 0x77, 0xf9, 0x72, 0xff,
      0x7d, 0xc4, 0x5c, 0x74, 0x3a, 0x43, 0x97, 0x68, 0xa1, 0x01, 0x57, 0x94,
      0x22, 0xd8, 0xea, 0x19, 0x50, 0xf0, 0x4d, 0x29, 0x59, 0x04, 0xca, 0x92,
      0x64, 0xb1, 0x3e, 0x13, 0x9e, 0x38, 0x82, 0xbf, 0xaa, 0xb5, 0x25, 0x57,
      0xa1, 0xe0, 0x46, 0x89, 0x7f, 0x5d, 0x22, 0x03, 0x82, 0x89, 0x93, 0xa7,
      0x6f, 0xb9, 0xb5, 0x2f, 0x51, 0x98, 0xa1, 0x8a, 0xae, 0xca, 0x97, 0x6b,
      0x1d, 0x33, 0xbf, 0xc0, 0x04, 0x63, 0x47, 0x04, 0x5c, 0xfc, 0x98, 0x88,
      0x6c, 0xb1, 0x05, 0x9b, 0xab, 0x69, 0x91, 0xca, 0xab, 0xa0, 0x39, 0x62,
      0xcd, 0x0e, 0xa2, 0xb0, 0x04, 0x36, 0xa3, 0x1f, 0x08, 0x82, 0xf0, 0x16,
      0xd9, 0xf8, 0xdf, 0x08, 0xaa, 0xa6, 0xac, 0x2e, 0x60, 0x77, 0xb3, 0xbb,
      0x17, 0x71, 0x60, 0x7e, 0xb1, 0x46, 0x0d, 0x7b, 0xf2, 0x81, 0xef, 0x45,
      0xb0, 0xa5, 0xbd, 0x3f, 0x8a, 0xe4, 0x3d, 0x81, 0x51, 0x3b, 0xbe, 0xc4,
      0x84, 0x5d, 0x82, 0xba, 0xff, 0xca, 0x6c, 0x21, 0x90, 0x9c, 0x94, 0x3f,
      0x1e, 0x34, 0x41, 0x02, 0x87, 0xcb, 0xa9, 0xd8, 0x01, 0x48, 0xe5, 0x8b,
      0x7f, 0x38, 0xd4, 0x6e, 0xf3, 0xf8, 0x7b, 0xd8, 0xa3, 0x8e, 0x3d, 0xb9,
      0x58, 0x8c, 0xab, 0x57, 0x03, 0x3b, 0xff, 0x94, 0x0b, 0x8b, 0x94, 0xf4,
      0x36, 0xd7, 0x7f, 0x4f, 0xf6, 0x56, 0x3f, 0x80, 0x2a, 0x4a, 0xea, 0xfd,
      0x74, 0x20, 0x5f, 0x90, 0xa3,
  };
  crypto::ScopedBIGNUM good_modulus_bn(
      BN_bin2bn(good_modulus, sizeof(good_modulus), nullptr));
  EXPECT_FALSE(CryptoLib::TestRocaVulnerable(good_modulus_bn.get()));
}

// This is not a known vector but a very simple test against the API.
TEST(CryptoLibTest, AesGcmTestSimple) {
  brillo::SecureBlob key(kAesGcm256KeySize);
  brillo::SecureBlob iv(kAesGcmIVSize);
  brillo::SecureBlob tag(kAesGcmTagSize);

  brillo::SecureBlob ciphertext(4096, '\0');

  std::string message = "I am encrypting this message.";
  brillo::SecureBlob plaintext(message.begin(), message.end());

  CryptoLib::GetSecureRandom(key.data(), key.size());

  EXPECT_TRUE(CryptoLib::AesGcmEncrypt(plaintext, key, &iv, &tag, &ciphertext));

  // Sanity check that the encryption actually did something.
  EXPECT_NE(ciphertext, plaintext);
  EXPECT_EQ(ciphertext.size(), plaintext.size());

  brillo::SecureBlob decrypted_plaintext(4096);
  EXPECT_TRUE(
      CryptoLib::AesGcmDecrypt(ciphertext, tag, key, iv, &decrypted_plaintext));

  EXPECT_EQ(plaintext, decrypted_plaintext);
}

TEST(CryptoLibTest, AesGcmTestWrongKey) {
  brillo::SecureBlob key(kAesGcm256KeySize);
  brillo::SecureBlob iv(kAesGcmIVSize);
  brillo::SecureBlob tag(kAesGcmTagSize);

  brillo::SecureBlob ciphertext(4096, '\0');

  std::string message = "I am encrypting this message.";
  brillo::SecureBlob plaintext(message.begin(), message.end());

  CryptoLib::GetSecureRandom(key.data(), key.size());

  EXPECT_TRUE(CryptoLib::AesGcmEncrypt(plaintext, key, &iv, &tag, &ciphertext));

  // Sanity check that the encryption actually did something.
  EXPECT_NE(ciphertext, plaintext);
  EXPECT_EQ(ciphertext.size(), plaintext.size());

  brillo::SecureBlob wrong_key(kAesGcm256KeySize);
  CryptoLib::GetSecureRandom(wrong_key.data(), wrong_key.size());

  brillo::SecureBlob decrypted_plaintext(4096);
  EXPECT_FALSE(CryptoLib::AesGcmDecrypt(ciphertext, tag, wrong_key, iv,
                                        &decrypted_plaintext));
  EXPECT_NE(plaintext, decrypted_plaintext);
}

TEST(CryptoLibTest, AesGcmTestWrongIV) {
  brillo::SecureBlob key(kAesGcm256KeySize);
  brillo::SecureBlob iv(kAesGcmIVSize);
  brillo::SecureBlob tag(kAesGcmTagSize);

  brillo::SecureBlob ciphertext(4096, '\0');

  std::string message = "I am encrypting this message.";
  brillo::SecureBlob plaintext(message.begin(), message.end());

  CryptoLib::GetSecureRandom(key.data(), key.size());

  EXPECT_TRUE(CryptoLib::AesGcmEncrypt(plaintext, key, &iv, &tag, &ciphertext));

  // Sanity check that the encryption actually did something.
  EXPECT_NE(ciphertext, plaintext);
  EXPECT_EQ(ciphertext.size(), plaintext.size());

  brillo::SecureBlob wrong_iv(kAesGcmIVSize);
  CryptoLib::GetSecureRandom(wrong_iv.data(), wrong_iv.size());

  brillo::SecureBlob decrypted_plaintext(4096);
  EXPECT_FALSE(CryptoLib::AesGcmDecrypt(ciphertext, tag, key, wrong_iv,
                                        &decrypted_plaintext));
  EXPECT_NE(plaintext, decrypted_plaintext);
}

TEST(CryptoLibTest, AesGcmTestWrongTag) {
  brillo::SecureBlob key(kAesGcm256KeySize);
  brillo::SecureBlob iv(kAesGcmIVSize);
  brillo::SecureBlob tag(kAesGcmTagSize);

  brillo::SecureBlob ciphertext(4096, '\0');

  std::string message = "I am encrypting this message.";
  brillo::SecureBlob plaintext(message.begin(), message.end());

  CryptoLib::GetSecureRandom(key.data(), key.size());

  EXPECT_TRUE(CryptoLib::AesGcmEncrypt(plaintext, key, &iv, &tag, &ciphertext));

  // Sanity check that the encryption actually did something.
  EXPECT_NE(ciphertext, plaintext);
  EXPECT_EQ(ciphertext.size(), plaintext.size());

  brillo::SecureBlob wrong_tag(kAesGcmTagSize);
  CryptoLib::GetSecureRandom(wrong_tag.data(), wrong_tag.size());

  brillo::SecureBlob decrypted_plaintext(4096);
  EXPECT_FALSE(CryptoLib::AesGcmDecrypt(ciphertext, wrong_tag, key, iv,
                                        &decrypted_plaintext));
}

// This tests that AesGcmEncrypt produces a different IV on subsequent runs.
// Note that this is in no way a mathematical test of secure randomness. It
// makes sure nobody in the future, for some reason, changes AesGcmEncrypt to
// use a fixed IV without tests failing, at which point they will find this
// test, and see that AesGcmEncrypt *must* return random IVs.
TEST(CryptoLibTest, AesGcmTestUniqueIVs) {
  brillo::SecureBlob key(kAesGcm256KeySize);
  brillo::SecureBlob tag(kAesGcmTagSize);

  brillo::SecureBlob ciphertext(4096, '\0');

  std::string message = "I am encrypting this message.";
  brillo::SecureBlob plaintext(message.begin(), message.end());

  CryptoLib::GetSecureRandom(key.data(), key.size());

  brillo::SecureBlob iv(kAesGcmIVSize);
  EXPECT_TRUE(CryptoLib::AesGcmEncrypt(plaintext, key, &iv, &tag, &ciphertext));

  brillo::SecureBlob iv2(kAesGcmIVSize);
  EXPECT_TRUE(
      CryptoLib::AesGcmEncrypt(plaintext, key, &iv2, &tag, &ciphertext));

  brillo::SecureBlob iv3(kAesGcmIVSize);
  EXPECT_TRUE(
      CryptoLib::AesGcmEncrypt(plaintext, key, &iv3, &tag, &ciphertext));

  EXPECT_NE(iv, iv2);
  EXPECT_NE(iv, iv3);
}

// These tests check that EncryptScryptBlob and DecryptScryptBlob continue to
// perform the same function, and interoperate correctly, as they are re-written
// and re-factored. These do not prove cryptographic properties of the
// functions, or formal verification. They are sanity checks for compatibility.
TEST(CryptoLibTest, EncryptScryptTest1) {
  const std::string blob_str = "nOaVD3qRNqWhqQTDgyGb";
  brillo::SecureBlob blob(blob_str.begin(), blob_str.end());
  const std::string key_source_str = "UNdGe2HbyyXqIzpuxhVn";
  brillo::SecureBlob key_source(key_source_str.begin(), key_source_str.end());

  brillo::SecureBlob wrapped_blob;
  EXPECT_TRUE(CryptoLib::EncryptScryptBlob(blob, key_source, &wrapped_blob));

  CheckBlob(blob, key_source, wrapped_blob, blob_str);

  brillo::SecureBlob fixed_bytes_blob = {
      0x73, 0x63, 0x72, 0x79, 0x70, 0x74, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x08,
      0x00, 0x00, 0x00, 0x02, 0x96, 0x22, 0x20, 0xd6, 0x95, 0x85, 0x9c, 0x3e,
      0xf0, 0xd4, 0x8f, 0x75, 0x64, 0x67, 0xa5, 0xd3, 0x0a, 0x67, 0xb7, 0xb8,
      0xa1, 0xcf, 0x97, 0xec, 0x6a, 0x34, 0xf5, 0xa6, 0x7e, 0x76, 0x2d, 0xa8,
      0x4f, 0xea, 0x98, 0x03, 0x46, 0xaf, 0x54, 0x1c, 0x1a, 0x5a, 0x65, 0x0b,
      0x65, 0x84, 0xcb, 0x96, 0x4b, 0x81, 0x3f, 0x3d, 0x4a, 0xf6, 0xfe, 0xac,
      0xa2, 0xd0, 0xb4, 0x3f, 0xe7, 0xef, 0x87, 0x00, 0x95, 0x60, 0xb7, 0x92,
      0x4e, 0x44, 0x11, 0x0b, 0xb6, 0xdc, 0x7c, 0x7e, 0x14, 0xa4, 0x59, 0x2d,
      0x24, 0xe7, 0x00, 0x72, 0x2b, 0x35, 0xd3, 0xd2, 0x06, 0xfe, 0xc7, 0x61,
      0x65, 0xfd, 0xa3, 0xe5, 0x7a, 0xed, 0xfd, 0x13, 0x2f, 0x32, 0x4f, 0xa4,
      0x0c, 0x51, 0x40, 0xf4, 0xc5, 0x89, 0x46, 0x79, 0x2c, 0xdb, 0xb8, 0x19,
      0xa3, 0x49, 0x4e, 0x31, 0xd2, 0x09, 0xe8, 0x63, 0x01, 0xdb, 0x7d, 0x43,
      0x54, 0xaa, 0x1e, 0xb3};
  CheckBlob(blob, key_source, fixed_bytes_blob, blob_str);
}

// This is a sanity check that AES-CTR-256 encryption encrypts and returns the
// same message.
TEST(CryptoLibTest, SimpleAesCtrEncryption) {
  std::string message = "ENCRYPT ME";
  brillo::SecureBlob key(32, 'A');
  brillo::SecureBlob iv(16, 'B');
  brillo::SecureBlob ciphertext;

  EXPECT_TRUE(CryptoLib::AesEncryptSpecifyBlockMode(
      brillo::SecureBlob(message.begin(), message.end()), 0, message.size(),
      key, iv, CryptoLib::kPaddingStandard, CryptoLib::kCtr, &ciphertext));

  brillo::SecureBlob decrypted;
  EXPECT_TRUE(CryptoLib::AesDecryptSpecifyBlockMode(
      ciphertext, 0, ciphertext.size(), key, iv, CryptoLib::kPaddingStandard,
      CryptoLib::kCtr, &decrypted));

  std::string decrypted_str(decrypted.begin(), decrypted.end());
  EXPECT_EQ(message, decrypted_str);
}

// Known test vectors for AES-256-CTR from
// https://boringssl.googlesource.com/boringssl/+/2490/crypto/cipher/test/cipher_test.txt#180
TEST(CryptoLibTest, AesCTRKnownVector1) {
  brillo::SecureBlob key = {
      0x77, 0x6B, 0xEF, 0xF2, 0x85, 0x1D, 0xB0, 0x6F, 0x4C, 0x8A, 0x05,
      0x42, 0xC8, 0x69, 0x6F, 0x6C, 0x6A, 0x81, 0xAF, 0x1E, 0xEC, 0x96,
      0xB4, 0xD3, 0x7F, 0xC1, 0xD6, 0x89, 0xE6, 0xC1, 0xC1, 0x04,
  };
  brillo::SecureBlob iv = {
      0x00, 0x00, 0x00, 0x60, 0xDB, 0x56, 0x72, 0xC9,
      0x7A, 0xA8, 0xF0, 0xB2, 0x00, 0x00, 0x00, 0x01,
  };
  brillo::SecureBlob plaintext = {
      0x53, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x62,
      0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x6D, 0x73, 0x67,
  };
  brillo::SecureBlob expected_ciphertext = {
      0x14, 0x5A, 0xD0, 0x1D, 0xBF, 0x82, 0x4E, 0xC7,
      0x56, 0x08, 0x63, 0xDC, 0x71, 0xE3, 0xE0, 0xC0,
  };
  brillo::SecureBlob ciphertext;

  EXPECT_TRUE(CryptoLib::AesEncryptSpecifyBlockMode(
      plaintext, 0, plaintext.size(), key, iv, CryptoLib::kPaddingStandard,
      CryptoLib::kCtr, &ciphertext));

  EXPECT_EQ(expected_ciphertext, ciphertext);

  brillo::SecureBlob resulting_plaintext;
  EXPECT_TRUE(CryptoLib::AesDecryptSpecifyBlockMode(
      expected_ciphertext, 0, expected_ciphertext.size(), key, iv,
      CryptoLib::kPaddingStandard, CryptoLib::kCtr, &resulting_plaintext));
  EXPECT_EQ(plaintext, resulting_plaintext);
}

TEST(CryptoLibTest, AesCTRKnownVector2) {
  brillo::SecureBlob key = {
      0xF6, 0xD6, 0x6D, 0x6B, 0xD5, 0x2D, 0x59, 0xBB, 0x07, 0x96, 0x36,
      0x58, 0x79, 0xEF, 0xF8, 0x86, 0xC6, 0x6D, 0xD5, 0x1A, 0x5B, 0x6A,
      0x99, 0x74, 0x4B, 0x50, 0x59, 0x0C, 0x87, 0xA2, 0x38, 0x84,
  };
  brillo::SecureBlob iv = {
      0x00, 0xFA, 0xAC, 0x24, 0xC1, 0x58, 0x5E, 0xF1,
      0x5A, 0x43, 0xD8, 0x75, 0x00, 0x00, 0x00, 0x01,
  };
  brillo::SecureBlob plaintext = {
      0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A,
      0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15,
      0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
  };
  brillo::SecureBlob expected_ciphertext = {
      0xF0, 0x5E, 0x23, 0x1B, 0x38, 0x94, 0x61, 0x2C, 0x49, 0xEE, 0x00,
      0x0B, 0x80, 0x4E, 0xB2, 0xA9, 0xB8, 0x30, 0x6B, 0x50, 0x8F, 0x83,
      0x9D, 0x6A, 0x55, 0x30, 0x83, 0x1D, 0x93, 0x44, 0xAF, 0x1C,
  };
  brillo::SecureBlob ciphertext;

  EXPECT_TRUE(CryptoLib::AesEncryptSpecifyBlockMode(
      plaintext, 0, plaintext.size(), key, iv, CryptoLib::kPaddingStandard,
      CryptoLib::kCtr, &ciphertext));

  EXPECT_EQ(expected_ciphertext, ciphertext);

  brillo::SecureBlob resulting_plaintext;
  EXPECT_TRUE(CryptoLib::AesDecryptSpecifyBlockMode(
      expected_ciphertext, 0, expected_ciphertext.size(), key, iv,
      CryptoLib::kPaddingStandard, CryptoLib::kCtr, &resulting_plaintext));
  EXPECT_EQ(plaintext, resulting_plaintext);
}

TEST(CryptoLibTest, AesCTRKnownVector3) {
  brillo::SecureBlob key = {
      0xFF, 0x7A, 0x61, 0x7C, 0xE6, 0x91, 0x48, 0xE4, 0xF1, 0x72, 0x6E,
      0x2F, 0x43, 0x58, 0x1D, 0xE2, 0xAA, 0x62, 0xD9, 0xF8, 0x05, 0x53,
      0x2E, 0xDF, 0xF1, 0xEE, 0xD6, 0x87, 0xFB, 0x54, 0x15, 0x3D,
  };
  brillo::SecureBlob iv = {
      0x00, 0x1C, 0xC5, 0xB7, 0x51, 0xA5, 0x1D, 0x70,
      0xA1, 0xC1, 0x11, 0x48, 0x00, 0x00, 0x00, 0x01,
  };
  brillo::SecureBlob plaintext = {
      0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B,
      0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
      0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23,
  };
  brillo::SecureBlob expected_ciphertext = {
      0xEB, 0x6C, 0x52, 0x82, 0x1D, 0x0B, 0xBB, 0xF7, 0xCE, 0x75, 0x94, 0x46,
      0x2A, 0xCA, 0x4F, 0xAA, 0xB4, 0x07, 0xDF, 0x86, 0x65, 0x69, 0xFD, 0x07,
      0xF4, 0x8C, 0xC0, 0xB5, 0x83, 0xD6, 0x07, 0x1F, 0x1E, 0xC0, 0xE6, 0xB8,
  };
  brillo::SecureBlob ciphertext;

  EXPECT_TRUE(CryptoLib::AesEncryptSpecifyBlockMode(
      plaintext, 0, plaintext.size(), key, iv, CryptoLib::kPaddingStandard,
      CryptoLib::kCtr, &ciphertext));

  EXPECT_EQ(expected_ciphertext, ciphertext);

  brillo::SecureBlob resulting_plaintext;
  EXPECT_TRUE(CryptoLib::AesDecryptSpecifyBlockMode(
      expected_ciphertext, 0, expected_ciphertext.size(), key, iv,
      CryptoLib::kPaddingStandard, CryptoLib::kCtr, &resulting_plaintext));
  EXPECT_EQ(plaintext, resulting_plaintext);
}

}  // namespace cryptohome
