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