1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "crypto/encryptor.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <string>
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h"
104a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "base/string_number_conversions.h"
11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "crypto/symmetric_key.h"
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "testing/gtest/include/gtest/gtest.h"
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(EncryptorTest, EncryptDecrypt) {
15ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  scoped_ptr<crypto::SymmetricKey> key(
16ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      crypto::SymmetricKey::DeriveKeyFromPassword(
17ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          crypto::SymmetricKey::AES, "password", "saltiest", 1000, 256));
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(NULL != key.get());
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
20ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  crypto::Encryptor encryptor;
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The IV must be exactly as long as the cipher block size.
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string iv("the iv: 16 bytes");
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(16U, iv.size());
24ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(encryptor.Init(key.get(), crypto::Encryptor::CBC, iv));
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string plaintext("this is the plaintext");
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string ciphertext;
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(encryptor.Encrypt(plaintext, &ciphertext));
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_LT(0U, ciphertext.size());
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string decypted;
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(encryptor.Decrypt(ciphertext, &decypted));
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(plaintext, decypted);
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// TODO(wtc): add more known-answer tests.  Test vectors are available from
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// http://www.ietf.org/rfc/rfc3602
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// http://gladman.plushost.co.uk/oldsite/AES/index.php
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// http://csrc.nist.gov/groups/STM/cavp/documents/aes/KAT_AES.zip
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// NIST SP 800-38A test vector F.2.5 CBC-AES256.Encrypt.
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(EncryptorTest, EncryptAES256CBC) {
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // From NIST SP 800-38a test cast F.2.5 CBC-AES256.Encrypt.
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static const unsigned char raw_key[] = {
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    0x60, 0x3d, 0xeb, 0x10, 0x15, 0xca, 0x71, 0xbe,
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    0x2b, 0x73, 0xae, 0xf0, 0x85, 0x7d, 0x77, 0x81,
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    0x1f, 0x35, 0x2c, 0x07, 0x3b, 0x61, 0x08, 0xd7,
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    0x2d, 0x98, 0x10, 0xa3, 0x09, 0x14, 0xdf, 0xf4
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static const unsigned char raw_iv[] = {
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static const unsigned char raw_plaintext[] = {
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Block #1
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96,
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a,
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Block #2
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c,
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51,
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Block #3
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11,
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    0xe5, 0xfb, 0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef,
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Block #4
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    0xf6, 0x9f, 0x24, 0x45, 0xdf, 0x4f, 0x9b, 0x17,
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    0xad, 0x2b, 0x41, 0x7b, 0xe6, 0x6c, 0x37, 0x10,
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static const unsigned char raw_ciphertext[] = {
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Block #1
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    0xf5, 0x8c, 0x4c, 0x04, 0xd6, 0xe5, 0xf1, 0xba,
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    0x77, 0x9e, 0xab, 0xfb, 0x5f, 0x7b, 0xfb, 0xd6,
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Block #2
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    0x9c, 0xfc, 0x4e, 0x96, 0x7e, 0xdb, 0x80, 0x8d,
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    0x67, 0x9f, 0x77, 0x7b, 0xc6, 0x70, 0x2c, 0x7d,
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Block #3
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    0x39, 0xf2, 0x33, 0x69, 0xa9, 0xd9, 0xba, 0xcf,
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    0xa5, 0x30, 0xe2, 0x63, 0x04, 0x23, 0x14, 0x61,
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Block #4
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    0xb2, 0xeb, 0x05, 0xe2, 0xc3, 0x9b, 0xe9, 0xfc,
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    0xda, 0x6c, 0x19, 0x07, 0x8c, 0x6a, 0x9d, 0x1b,
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // PKCS #5 padding, encrypted.
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    0x3f, 0x46, 0x17, 0x96, 0xd6, 0xb0, 0xd6, 0xb2,
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    0xe0, 0xc2, 0xa7, 0x2b, 0x4d, 0x80, 0xe6, 0x44
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string key(reinterpret_cast<const char*>(raw_key), sizeof(raw_key));
90ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  scoped_ptr<crypto::SymmetricKey> sym_key(crypto::SymmetricKey::Import(
91ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      crypto::SymmetricKey::AES, key));
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(NULL != sym_key.get());
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
94ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  crypto::Encryptor encryptor;
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The IV must be exactly as long a the cipher block size.
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string iv(reinterpret_cast<const char*>(raw_iv), sizeof(raw_iv));
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(16U, iv.size());
98ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(encryptor.Init(sym_key.get(), crypto::Encryptor::CBC, iv));
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string plaintext(reinterpret_cast<const char*>(raw_plaintext),
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        sizeof(raw_plaintext));
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string ciphertext;
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(encryptor.Encrypt(plaintext, &ciphertext));
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(sizeof(raw_ciphertext), ciphertext.size());
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(0, memcmp(ciphertext.data(), raw_ciphertext, ciphertext.size()));
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string decypted;
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(encryptor.Decrypt(ciphertext, &decypted));
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(plaintext, decypted);
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
1134a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1144a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// Expected output derived from the NSS implementation.
1154a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben MurdochTEST(EncryptorTest, EncryptAES128CBCRegression) {
1164a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  std::string key = "128=SixteenBytes";
1174a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  std::string iv = "Sweet Sixteen IV";
1184a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  std::string plaintext = "Plain text with a g-clef U+1D11E \360\235\204\236";
1194a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  std::string expected_ciphertext_hex =
1204a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      "D4A67A0BA33C30F207344D81D1E944BBE65587C3D7D9939A"
1214a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      "C070C62B9C15A3EA312EA4AD1BC7929F4D3C16B03AD5ADA8";
1224a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
123ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  scoped_ptr<crypto::SymmetricKey> sym_key(crypto::SymmetricKey::Import(
124ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      crypto::SymmetricKey::AES, key));
1254a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  ASSERT_TRUE(NULL != sym_key.get());
1264a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
127ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  crypto::Encryptor encryptor;
1284a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // The IV must be exactly as long a the cipher block size.
1294a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  EXPECT_EQ(16U, iv.size());
130ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(encryptor.Init(sym_key.get(), crypto::Encryptor::CBC, iv));
1314a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1324a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  std::string ciphertext;
1334a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  EXPECT_TRUE(encryptor.Encrypt(plaintext, &ciphertext));
1344a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  EXPECT_EQ(expected_ciphertext_hex, base::HexEncode(ciphertext.data(),
1354a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                                                     ciphertext.size()));
1364a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1374a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  std::string decypted;
1384a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  EXPECT_TRUE(encryptor.Decrypt(ciphertext, &decypted));
1394a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  EXPECT_EQ(plaintext, decypted);
1404a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}
1414a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1424a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// Expected output derived from the NSS implementation.
1434a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben MurdochTEST(EncryptorTest, EncryptAES192CBCRegression) {
1444a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  std::string key = "192bitsIsTwentyFourByte!";
1454a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  std::string iv = "Sweet Sixteen IV";
1464a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  std::string plaintext = "Small text";
1474a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  std::string expected_ciphertext_hex = "78DE5D7C2714FC5C61346C5416F6C89A";
1484a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
149ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  scoped_ptr<crypto::SymmetricKey> sym_key(crypto::SymmetricKey::Import(
150ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      crypto::SymmetricKey::AES, key));
1514a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  ASSERT_TRUE(NULL != sym_key.get());
1524a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
153ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  crypto::Encryptor encryptor;
1544a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // The IV must be exactly as long a the cipher block size.
1554a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  EXPECT_EQ(16U, iv.size());
156ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(encryptor.Init(sym_key.get(), crypto::Encryptor::CBC, iv));
1574a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1584a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  std::string ciphertext;
1594a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  EXPECT_TRUE(encryptor.Encrypt(plaintext, &ciphertext));
1604a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  EXPECT_EQ(expected_ciphertext_hex, base::HexEncode(ciphertext.data(),
1614a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                                                     ciphertext.size()));
1624a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1634a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  std::string decypted;
1644a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  EXPECT_TRUE(encryptor.Decrypt(ciphertext, &decypted));
1654a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  EXPECT_EQ(plaintext, decypted);
1664a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}
1674a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1684a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// Not all platforms allow import/generation of symmetric keys with an
1694a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// unsupported size.
1704a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#if !defined(OS_WIN) && !defined(USE_NSS)
1714a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben MurdochTEST(EncryptorTest, UnsupportedKeySize) {
1724a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  std::string key = "7 = bad";
1734a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  std::string iv = "Sweet Sixteen IV";
174ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  scoped_ptr<crypto::SymmetricKey> sym_key(crypto::SymmetricKey::Import(
175ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      crypto::SymmetricKey::AES, key));
1764a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  ASSERT_TRUE(NULL != sym_key.get());
1774a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
178ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  crypto::Encryptor encryptor;
1794a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // The IV must be exactly as long a the cipher block size.
1804a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  EXPECT_EQ(16U, iv.size());
181ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_FALSE(encryptor.Init(sym_key.get(), crypto::Encryptor::CBC, iv));
1824a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}
1834a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#endif  // unsupported platforms.
1844a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1854a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben MurdochTEST(EncryptorTest, UnsupportedIV) {
1864a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  std::string key = "128=SixteenBytes";
1874a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  std::string iv = "OnlyForteen :(";
188ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  scoped_ptr<crypto::SymmetricKey> sym_key(crypto::SymmetricKey::Import(
189ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      crypto::SymmetricKey::AES, key));
1904a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  ASSERT_TRUE(NULL != sym_key.get());
1914a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
192ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  crypto::Encryptor encryptor;
193ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_FALSE(encryptor.Init(sym_key.get(), crypto::Encryptor::CBC, iv));
1944a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}
1954a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1964a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben MurdochTEST(EncryptorTest, EmptyEncrypt) {
1974a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  std::string key = "128=SixteenBytes";
1984a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  std::string iv = "Sweet Sixteen IV";
1994a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  std::string plaintext;
2004a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  std::string expected_ciphertext_hex = "8518B8878D34E7185E300D0FCC426396";
2014a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
202ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  scoped_ptr<crypto::SymmetricKey> sym_key(crypto::SymmetricKey::Import(
203ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      crypto::SymmetricKey::AES, key));
2044a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  ASSERT_TRUE(NULL != sym_key.get());
2054a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
206ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  crypto::Encryptor encryptor;
2074a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // The IV must be exactly as long a the cipher block size.
2084a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  EXPECT_EQ(16U, iv.size());
209ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(encryptor.Init(sym_key.get(), crypto::Encryptor::CBC, iv));
2104a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
2114a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  std::string ciphertext;
2124a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  EXPECT_TRUE(encryptor.Encrypt(plaintext, &ciphertext));
2134a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  EXPECT_EQ(expected_ciphertext_hex, base::HexEncode(ciphertext.data(),
2144a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                                                     ciphertext.size()));
2154a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}
2164a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
2174a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben MurdochTEST(EncryptorTest, EmptyDecrypt) {
2184a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  std::string key = "128=SixteenBytes";
2194a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  std::string iv = "Sweet Sixteen IV";
2204a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
221ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  scoped_ptr<crypto::SymmetricKey> sym_key(crypto::SymmetricKey::Import(
222ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      crypto::SymmetricKey::AES, key));
2234a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  ASSERT_TRUE(NULL != sym_key.get());
2244a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
225ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  crypto::Encryptor encryptor;
2264a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // The IV must be exactly as long a the cipher block size.
2274a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  EXPECT_EQ(16U, iv.size());
228ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(encryptor.Init(sym_key.get(), crypto::Encryptor::CBC, iv));
2294a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
2304a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  std::string decrypted;
2314a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  EXPECT_FALSE(encryptor.Decrypt("", &decrypted));
2324a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  EXPECT_EQ("", decrypted);
2334a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}
234