aes_decryptor_unittest.cc revision 68043e1e95eeb07d5cae7aca370b26518b0867d6
1ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/decoder_buffer.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/decrypt_config.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/mock_filters.h"
13ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "media/cdm/aes_decryptor.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/webm/webm_constants.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::_;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Gt;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::IsNull;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::NotNull;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::SaveArg;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::StrNe;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochMATCHER(IsEmpty, "") { return arg.empty(); }
26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace media {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const uint8 kOriginalData[] = "Original subsample data.";
3068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const int kOriginalDataSize = 24;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const uint8 kKeyId[] = {
3358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // base64 equivalent is AAECAw==
3458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    0x00, 0x01, 0x02, 0x03
3558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)};
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const uint8 kKey[] = {
3858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // base64 equivalent is BAUGBwgJCgsMDQ4PEBESEw==
3958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
4058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char kKeyAsJWK[] =
4458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "{"
4558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "  \"keys\": ["
4658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "    {"
4758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "      \"kty\": \"oct\","
4858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "      \"kid\": \"AAECAw==\","
4958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "      \"k\": \"BAUGBwgJCgsMDQ4PEBESEw==\""
5058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "    }"
5158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "  ]"
5258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "}";
5358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
5468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char kWrongKeyAsJWK[] =
5558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "{"
5658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "  \"keys\": ["
5758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "    {"
5858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "      \"kty\": \"oct\","
5958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "      \"kid\": \"AAECAw==\","
6058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "      \"k\": \"7u7u7u7u7u7u7u7u7u7u7g==\""
6158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "    }"
6258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "  ]"
6358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "}";
6458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
6568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char kWrongSizedKeyAsJWK[] =
6658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "{"
6758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "  \"keys\": ["
6858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "    {"
6958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "      \"kty\": \"oct\","
7058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "      \"kid\": \"AAECAw==\","
7158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "      \"k\": \"AAECAw==\""
7258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "    }"
7358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "  ]"
7458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "}";
7558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
7668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const uint8 kIv[] = {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// kOriginalData encrypted with kKey and kIv but without any subsamples (or
8258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// equivalently using kSubsampleEntriesCypherOnly).
8368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const uint8 kEncryptedData[] = {
8458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  0x2f, 0x03, 0x09, 0xef, 0x71, 0xaf, 0x31, 0x16,
8558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  0xfa, 0x9d, 0x18, 0x43, 0x1e, 0x96, 0x71, 0xb5,
8658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  0xbf, 0xf5, 0x30, 0x53, 0x9a, 0x20, 0xdf, 0x95
8758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)};
8858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
8958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// kOriginalData encrypted with kSubsampleKey and kSubsampleIv using
90a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// kSubsampleEntriesNormal.
9168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const uint8 kSubsampleEncryptedData[] = {
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x4f, 0x72, 0x09, 0x16, 0x09, 0xe6, 0x79, 0xad,
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x70, 0x73, 0x75, 0x62, 0x09, 0xbb, 0x83, 0x1d,
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x4d, 0x08, 0xd7, 0x78, 0xa4, 0xa7, 0xf1, 0x2e
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const uint8 kOriginalData2[] = "Changed Original data.";
9858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
9968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const uint8 kIv2[] = {
10058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
10158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const uint8 kKeyId2[] = {
10558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // base64 equivalent is AAECAwQFBgcICQoLDA0ODxAREhM=
10658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
10758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
10858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    0x10, 0x11, 0x12, 0x13
10958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)};
11058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
11168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char kKey2AsJWK[] =
11258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "{"
11358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "  \"keys\": ["
11458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "    {"
11558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "      \"kty\": \"oct\","
11658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "      \"kid\": \"AAECAwQFBgcICQoLDA0ODxAREhM=\","
11758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "      \"k\": \"FBUWFxgZGhscHR4fICEiIw==\""
11858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "    }"
11958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "  ]"
12058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "}";
12158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
12258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// 'k' in bytes is x14x15x16x17x18x19x1ax1bx1cx1dx1ex1fx20x21x22x23
12358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
12468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const uint8 kEncryptedData2[] = {
12558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  0x57, 0x66, 0xf4, 0x12, 0x1a, 0xed, 0xb5, 0x79,
12658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  0x1c, 0x8e, 0x25, 0xd7, 0x17, 0xe7, 0x5e, 0x16,
12758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  0xe3, 0x40, 0x08, 0x27, 0x11, 0xe9
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
130a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Subsample entries for testing. The sum of |cypher_bytes| and |clear_bytes| of
13158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// all entries must be equal to kOriginalDataSize to make the subsample entries
13258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// valid.
133a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
13468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const SubsampleEntry kSubsampleEntriesNormal[] = {
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { 2, 7 },
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { 3, 11 },
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { 1, 0 }
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const SubsampleEntry kSubsampleEntriesWrongSize[] = {
14158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  { 3, 6 }, // This entry doesn't match the correct entry.
14258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  { 3, 11 },
14358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  { 1, 0 }
14458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)};
14558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
14668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const SubsampleEntry kSubsampleEntriesInvalidTotalSize[] = {
14758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  { 1, 1000 }, // This entry is too large.
14858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  { 3, 11 },
14958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  { 1, 0 }
15058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)};
15158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
15268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const SubsampleEntry kSubsampleEntriesClearOnly[] = {
153a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  { 7, 0 },
154a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  { 8, 0 },
155a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  { 9, 0 }
156a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)};
157a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
15868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const SubsampleEntry kSubsampleEntriesCypherOnly[] = {
159a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  { 0, 6 },
160a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  { 0, 8 },
161a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  { 0, 10 }
162a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)};
163a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
16458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)static scoped_refptr<DecoderBuffer> CreateEncryptedBuffer(
16558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const std::vector<uint8>& data,
16658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const std::vector<uint8>& key_id,
16758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const std::vector<uint8>& iv,
16858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    int offset,
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::vector<SubsampleEntry>& subsample_entries) {
17058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DCHECK(!data.empty());
17158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  int padded_size = offset + data.size();
17258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_refptr<DecoderBuffer> encrypted_buffer(new DecoderBuffer(padded_size));
17358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  memcpy(encrypted_buffer->writable_data() + offset, &data[0], data.size());
174868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  CHECK(encrypted_buffer.get());
17558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  std::string key_id_string(
17658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      reinterpret_cast<const char*>(key_id.empty() ? NULL : &key_id[0]),
17758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      key_id.size());
17858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  std::string iv_string(
17958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      reinterpret_cast<const char*>(iv.empty() ? NULL : &iv[0]), iv.size());
18058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  encrypted_buffer->set_decrypt_config(scoped_ptr<DecryptConfig>(
18158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      new DecryptConfig(key_id_string, iv_string, offset, subsample_entries)));
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return encrypted_buffer;
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AesDecryptorTest : public testing::Test {
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AesDecryptorTest()
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : decryptor_(
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            base::Bind(&AesDecryptorTest::KeyAdded, base::Unretained(this)),
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            base::Bind(&AesDecryptorTest::KeyError, base::Unretained(this)),
191eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            base::Bind(&AesDecryptorTest::KeyMessage, base::Unretained(this))),
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        decrypt_cb_(base::Bind(&AesDecryptorTest::BufferDecrypted,
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               base::Unretained(this))),
19458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        original_data_(kOriginalData, kOriginalData + kOriginalDataSize),
19558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        encrypted_data_(kEncryptedData,
19658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                        kEncryptedData + arraysize(kEncryptedData)),
19758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        subsample_encrypted_data_(
19858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            kSubsampleEncryptedData,
19958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            kSubsampleEncryptedData + arraysize(kSubsampleEncryptedData)),
20058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        key_id_(kKeyId, kKeyId + arraysize(kKeyId)),
20158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        iv_(kIv, kIv + arraysize(kIv)),
20258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        normal_subsample_entries_(
203a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)            kSubsampleEntriesNormal,
204a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)            kSubsampleEntriesNormal + arraysize(kSubsampleEntriesNormal)) {
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
20858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void GenerateKeyRequest(const std::vector<uint8>& key_id) {
20958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    DCHECK(!key_id.empty());
21058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_CALL(*this, KeyMessage(StrNe(std::string()), key_id, ""))
211eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        .WillOnce(SaveArg<0>(&session_id_string_));
212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(decryptor_.GenerateKeyRequest(
21358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        std::string(), &key_id[0], key_id.size()));
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  enum AddKeyExpectation {
21758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    KEY_ADDED,
21858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    KEY_ERROR
21958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  };
22058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
22158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void AddRawKeyAndExpect(const std::vector<uint8>& key_id,
22258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                          const std::vector<uint8>& key,
22358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                          AddKeyExpectation result) {
22458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // TODO(jrummell): Remove once raw keys no longer supported.
22558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    DCHECK(!key_id.empty());
22658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    DCHECK(!key.empty());
22758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
22858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if (result == KEY_ADDED) {
22958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      EXPECT_CALL(*this, KeyAdded(session_id_string_));
23058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    } else if (result == KEY_ERROR) {
23158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      EXPECT_CALL(*this, KeyError(session_id_string_,
23258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                  MediaKeys::kUnknownError, 0));
23358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    } else {
23458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      NOTREACHED();
23558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
23658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
23758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    decryptor_.AddKey(&key[0], key.size(), &key_id[0], key_id.size(),
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      session_id_string_);
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void AddKeyAndExpect(const std::string& key, AddKeyExpectation result) {
24258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    DCHECK(!key.empty());
24358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
24458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if (result == KEY_ADDED) {
24558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      EXPECT_CALL(*this, KeyAdded(session_id_string_));
24658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    } else if (result == KEY_ERROR) {
24758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      EXPECT_CALL(*this,
24858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                  KeyError(session_id_string_, MediaKeys::kUnknownError, 0));
24958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    } else {
25058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      NOTREACHED();
25158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
25258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
25358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    decryptor_.AddKey(reinterpret_cast<const uint8*>(key.c_str()), key.length(),
25458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                      NULL, 0,
25558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                      session_id_string_);
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD2(BufferDecrypted, void(Decryptor::Status,
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     const scoped_refptr<DecoderBuffer>&));
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  enum DecryptExpectation {
26258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    SUCCESS,
26358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    DATA_MISMATCH,
26458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    DATA_AND_SIZE_MISMATCH,
26558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    DECRYPT_ERROR
26658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  };
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void DecryptAndExpect(const scoped_refptr<DecoderBuffer>& encrypted,
26958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                        const std::vector<uint8>& plain_text,
27058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                        DecryptExpectation result) {
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<DecoderBuffer> decrypted;
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if (result != DECRYPT_ERROR) {
27458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      EXPECT_CALL(*this, BufferDecrypted(Decryptor::kSuccess, NotNull()))
27558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          .WillOnce(SaveArg<1>(&decrypted));
27658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    } else {
27758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      EXPECT_CALL(*this, BufferDecrypted(Decryptor::kError, IsNull()))
27858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          .WillOnce(SaveArg<1>(&decrypted));
27958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    decryptor_.Decrypt(Decryptor::kVideo, encrypted, decrypt_cb_);
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    std::vector<uint8> decrypted_text;
28458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if (decrypted && decrypted->data_size()) {
28558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      decrypted_text.assign(
28658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        decrypted->data(), decrypted->data() + decrypted->data_size());
28758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
28858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
28958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    switch (result) {
29058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      case SUCCESS:
29158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_EQ(plain_text, decrypted_text);
29258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        break;
29358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      case DATA_MISMATCH:
29458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_EQ(plain_text.size(), decrypted_text.size());
29558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_NE(plain_text, decrypted_text);
29658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        break;
29758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      case DATA_AND_SIZE_MISMATCH:
29858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_NE(plain_text.size(), decrypted_text.size());
29958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        break;
30058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      case DECRYPT_ERROR:
30158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_TRUE(decrypted_text.empty());
30258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        break;
30358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MOCK_METHOD1(KeyAdded, void(const std::string&));
3077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MOCK_METHOD3(KeyError, void(const std::string&,
308868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                              MediaKeys::KeyError, int));
3097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MOCK_METHOD3(KeyMessage, void(const std::string& session_id,
310eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                const std::vector<uint8>& message,
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                const std::string& default_url));
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AesDecryptor decryptor_;
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string session_id_string_;
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AesDecryptor::DecryptCB decrypt_cb_;
31658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
31758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Constants for testing.
31858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const std::vector<uint8> original_data_;
31958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const std::vector<uint8> encrypted_data_;
32058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const std::vector<uint8> subsample_encrypted_data_;
32158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const std::vector<uint8> key_id_;
32258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const std::vector<uint8> iv_;
32358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const std::vector<SubsampleEntry> normal_subsample_entries_;
32458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const std::vector<SubsampleEntry> no_subsample_entries_;
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(AesDecryptorTest, GenerateKeyRequestWithNullInitData) {
328eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_CALL(*this, KeyMessage(StrNe(std::string()), IsEmpty(), ""));
3297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(decryptor_.GenerateKeyRequest(std::string(), NULL, 0));
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
33258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(AesDecryptorTest, NormalDecryption) {
33358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  GenerateKeyRequest(key_id_);
33458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  AddKeyAndExpect(kKeyAsJWK, KEY_ADDED);
33558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
33658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      encrypted_data_, key_id_, iv_, 0, no_subsample_entries_);
33758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS);
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(AesDecryptorTest, DecryptionWithOffset) {
34158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  GenerateKeyRequest(key_id_);
34258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  AddKeyAndExpect(kKeyAsJWK, KEY_ADDED);
34358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
34458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      encrypted_data_, key_id_, iv_, 23, no_subsample_entries_);
34558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS);
34658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
34758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
34858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(AesDecryptorTest, UnencryptedFrame) {
34958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // An empty iv string signals that the frame is unencrypted.
35058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
35158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      original_data_, key_id_, std::vector<uint8>(), 0, no_subsample_entries_);
35258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS);
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AesDecryptorTest, WrongKey) {
35658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  GenerateKeyRequest(key_id_);
35758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  AddKeyAndExpect(kWrongKeyAsJWK, KEY_ADDED);
35858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
35958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      encrypted_data_, key_id_, iv_, 0, no_subsample_entries_);
36058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DecryptAndExpect(encrypted_buffer, original_data_, DATA_MISMATCH);
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AesDecryptorTest, NoKey) {
36458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
36558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      encrypted_data_, key_id_, iv_, 0, no_subsample_entries_);
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*this, BufferDecrypted(AesDecryptor::kNoKey, IsNull()));
36758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  decryptor_.Decrypt(Decryptor::kVideo, encrypted_buffer, decrypt_cb_);
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AesDecryptorTest, KeyReplacement) {
37158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  GenerateKeyRequest(key_id_);
37258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
37358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      encrypted_data_, key_id_, iv_, 0, no_subsample_entries_);
37458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
37558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  AddKeyAndExpect(kWrongKeyAsJWK, KEY_ADDED);
37658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(DecryptAndExpect(
37758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      encrypted_buffer, original_data_, DATA_MISMATCH));
37858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
37958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  AddKeyAndExpect(kKeyAsJWK, KEY_ADDED);
38058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(
38158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS));
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AesDecryptorTest, WrongSizedKey) {
38558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  GenerateKeyRequest(key_id_);
38658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  AddKeyAndExpect(kWrongSizedKeyAsJWK, KEY_ERROR);
38758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
38858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Repeat for a raw key. Use "-1" to create a wrong sized key.
38958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  std::vector<uint8> wrong_sized_key(kKey, kKey + arraysize(kKey) - 1);
39058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  AddRawKeyAndExpect(key_id_, wrong_sized_key, KEY_ERROR);
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AesDecryptorTest, MultipleKeysAndFrames) {
39458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  GenerateKeyRequest(key_id_);
39558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  AddKeyAndExpect(kKeyAsJWK, KEY_ADDED);
39658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
39758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      encrypted_data_, key_id_, iv_, 10, no_subsample_entries_);
39858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(
39958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS));
40058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
40158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  AddKeyAndExpect(kKey2AsJWK, KEY_ADDED);
40258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
40358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // The first key is still available after we added a second key.
40458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(
40558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS));
40658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
40758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // The second key is also available.
40858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  encrypted_buffer = CreateEncryptedBuffer(
40958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      std::vector<uint8>(kEncryptedData2,
41058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                         kEncryptedData2 + arraysize(kEncryptedData2)),
41158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      std::vector<uint8>(kKeyId2, kKeyId2 + arraysize(kKeyId2)),
41258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      std::vector<uint8>(kIv2, kIv2 + arraysize(kIv2)),
41358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      30,
41458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      no_subsample_entries_);
41558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(DecryptAndExpect(
41658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      encrypted_buffer,
41758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      std::vector<uint8>(kOriginalData2,
41858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                         kOriginalData2 + arraysize(kOriginalData2) - 1),
41958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      SUCCESS));
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AesDecryptorTest, CorruptedIv) {
42358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  GenerateKeyRequest(key_id_);
42458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  AddKeyAndExpect(kKeyAsJWK, KEY_ADDED);
42558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
42658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  std::vector<uint8> bad_iv = iv_;
42758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  bad_iv[1]++;
42858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
42958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
43058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      encrypted_data_, key_id_, bad_iv, 0, no_subsample_entries_);
43158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
43258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DecryptAndExpect(encrypted_buffer, original_data_, DATA_MISMATCH);
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AesDecryptorTest, CorruptedData) {
43658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  GenerateKeyRequest(key_id_);
43758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  AddKeyAndExpect(kKeyAsJWK, KEY_ADDED);
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  std::vector<uint8> bad_data = encrypted_data_;
44058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  bad_data[1]++;
44158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
44258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
44358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      bad_data, key_id_, iv_, 0, no_subsample_entries_);
44458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DecryptAndExpect(encrypted_buffer, original_data_, DATA_MISMATCH);
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(AesDecryptorTest, EncryptedAsUnencryptedFailure) {
44858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  GenerateKeyRequest(key_id_);
44958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  AddKeyAndExpect(kKeyAsJWK, KEY_ADDED);
45058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
45158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      encrypted_data_, key_id_, std::vector<uint8>(), 0, no_subsample_entries_);
45258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DecryptAndExpect(encrypted_buffer, original_data_, DATA_MISMATCH);
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AesDecryptorTest, SubsampleDecryption) {
45658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  GenerateKeyRequest(key_id_);
45758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  AddKeyAndExpect(kKeyAsJWK, KEY_ADDED);
45858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
45958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      subsample_encrypted_data_, key_id_, iv_, 0, normal_subsample_entries_);
46058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS);
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Ensures noninterference of data offset and subsample mechanisms. We never
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// expect to encounter this in the wild, but since the DecryptConfig doesn't
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// disallow such a configuration, it should be covered.
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AesDecryptorTest, SubsampleDecryptionWithOffset) {
46758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  GenerateKeyRequest(key_id_);
46858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  AddKeyAndExpect(kKeyAsJWK, KEY_ADDED);
46958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
47058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      subsample_encrypted_data_, key_id_, iv_, 23, normal_subsample_entries_);
47158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS);
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(AesDecryptorTest, SubsampleWrongSize) {
47558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  GenerateKeyRequest(key_id_);
47658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  AddKeyAndExpect(kKeyAsJWK, KEY_ADDED);
47758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
47858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  std::vector<SubsampleEntry> subsample_entries_wrong_size(
47958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      kSubsampleEntriesWrongSize,
48058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      kSubsampleEntriesWrongSize + arraysize(kSubsampleEntriesWrongSize));
48158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
48258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
48358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      subsample_encrypted_data_, key_id_, iv_, 0, subsample_entries_wrong_size);
48458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DecryptAndExpect(encrypted_buffer, original_data_, DATA_MISMATCH);
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(AesDecryptorTest, SubsampleInvalidTotalSize) {
48858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  GenerateKeyRequest(key_id_);
48958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  AddKeyAndExpect(kKeyAsJWK, KEY_ADDED);
49058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
49158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  std::vector<SubsampleEntry> subsample_entries_invalid_total_size(
49258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      kSubsampleEntriesInvalidTotalSize,
49358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      kSubsampleEntriesInvalidTotalSize +
49458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          arraysize(kSubsampleEntriesInvalidTotalSize));
49558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
49658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
49758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      subsample_encrypted_data_, key_id_, iv_, 0,
49858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      subsample_entries_invalid_total_size);
49958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DecryptAndExpect(encrypted_buffer, original_data_, DECRYPT_ERROR);
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
502a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// No cypher bytes in any of the subsamples.
503a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(AesDecryptorTest, SubsampleClearBytesOnly) {
50458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  GenerateKeyRequest(key_id_);
50558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  AddKeyAndExpect(kKeyAsJWK, KEY_ADDED);
50658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
50758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  std::vector<SubsampleEntry> clear_only_subsample_entries(
508a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      kSubsampleEntriesClearOnly,
509a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      kSubsampleEntriesClearOnly + arraysize(kSubsampleEntriesClearOnly));
51058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
51158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
51258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      original_data_, key_id_, iv_, 0, clear_only_subsample_entries);
51358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS);
514a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
515a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
516a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// No clear bytes in any of the subsamples.
517a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(AesDecryptorTest, SubsampleCypherBytesOnly) {
51858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  GenerateKeyRequest(key_id_);
51958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  AddKeyAndExpect(kKeyAsJWK, KEY_ADDED);
52058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
52158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  std::vector<SubsampleEntry> cypher_only_subsample_entries(
522a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      kSubsampleEntriesCypherOnly,
523a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      kSubsampleEntriesCypherOnly + arraysize(kSubsampleEntriesCypherOnly));
52458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
52558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
52658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      encrypted_data_, key_id_, iv_, 0, cypher_only_subsample_entries);
52758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS);
52858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
52958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
53058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(AesDecryptorTest, JWKKey) {
53158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Try a simple JWK key (i.e. not in a set)
53258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const std::string key1 =
53358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "{"
53458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "  \"kty\": \"oct\","
53558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "  \"kid\": \"AAECAwQFBgcICQoLDA0ODxAREhM=\","
53658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "  \"k\": \"FBUWFxgZGhscHR4fICEiIw==\""
53758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "}";
53858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  AddKeyAndExpect(key1, KEY_ERROR);
53958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
54058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Try a key list with multiple entries.
54158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const std::string key2 =
54258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "{"
54358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "  \"keys\": ["
54458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "    {"
54558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "      \"kty\": \"oct\","
54658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "      \"kid\": \"AAECAwQFBgcICQoLDA0ODxAREhM=\","
54758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "      \"k\": \"FBUWFxgZGhscHR4fICEiIw==\""
54858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "    },"
54958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "    {"
55058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "      \"kty\": \"oct\","
55158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "      \"kid\": \"JCUmJygpKissLS4vMA==\","
55258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "      \"k\":\"MTIzNDU2Nzg5Ojs8PT4/QA==\""
55358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "    }"
55458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "  ]"
55558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "}";
55658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  AddKeyAndExpect(key2, KEY_ADDED);
55758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
55858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Try a key with no spaces and some \n plus additional fields.
55958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const std::string key3 =
56058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "\n\n{\"something\":1,\"keys\":[{\n\n\"kty\":\"oct\",\"alg\":\"A128KW\","
56158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "\"kid\":\"AAECAwQFBgcICQoLDA0ODxAREhM=\",\"k\":\"GawgguFyGrWKav7AX4VKUg="
56258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "=\",\"foo\":\"bar\"}]}\n\n";
56358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  AddKeyAndExpect(key3, KEY_ADDED);
56458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
56558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Try some non-ASCII characters.
56658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  AddKeyAndExpect("This is not ASCII due to \xff\xfe\xfd in it.", KEY_ERROR);
56758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
56858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Try a badly formatted key. Assume that the JSON parser is fully tested,
56958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // so we won't try a lot of combinations. However, need a test to ensure
57058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // that the code doesn't crash if invalid JSON received.
57158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  AddKeyAndExpect("This is not a JSON key.", KEY_ERROR);
57258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
57358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Try passing some valid JSON that is not a dictionary at the top level.
57458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  AddKeyAndExpect("40", KEY_ERROR);
57558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
57658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Try an empty dictionary.
57758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  AddKeyAndExpect("{ }", KEY_ERROR);
57858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
57958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Try an empty 'keys' dictionary.
58058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  AddKeyAndExpect("{ \"keys\": [] }", KEY_ERROR);
58158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
58258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Try with 'keys' not a dictionary.
58358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  AddKeyAndExpect("{ \"keys\":\"1\" }", KEY_ERROR);
58458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
58558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Try with 'keys' a list of integers.
58658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  AddKeyAndExpect("{ \"keys\": [ 1, 2, 3 ] }", KEY_ERROR);
58758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
58858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Try a key missing padding(=) at end of base64 string.
58958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const std::string key4 =
59058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "{"
59158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "  \"keys\": ["
59258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "    {"
59358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "      \"kty\": \"oct\","
59458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "      \"kid\": \"AAECAw==\","
59558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "      \"k\": \"BAUGBwgJCgsMDQ4PEBESEw\""
59658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "    }"
59758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "  ]"
59858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "}";
59958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  AddKeyAndExpect(key4, KEY_ERROR);
60058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
60158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Try a key ID missing padding(=) at end of base64 string.
60258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const std::string key5 =
60358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "{"
60458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "  \"keys\": ["
60558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "    {"
60658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "      \"kty\": \"oct\","
60758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "      \"kid\": \"AAECAw\","
60858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "      \"k\": \"BAUGBwgJCgsMDQ4PEBESEw==\""
60958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "    }"
61058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "  ]"
61158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "}";
61258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  AddKeyAndExpect(key5, KEY_ERROR);
61358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
61458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Try a key with invalid base64 encoding.
61558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const std::string key6 =
61658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "{"
61758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "  \"keys\": ["
61858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "    {"
61958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "      \"kty\": \"oct\","
62058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "      \"kid\": \"!@#$%^&*()==\","
62158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "      \"k\": \"BAUGBwgJCgsMDQ4PEBESEw==\""
62258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "    }"
62358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "  ]"
62458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "}";
62558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  AddKeyAndExpect(key6, KEY_ERROR);
62658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
62758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
62858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(AesDecryptorTest, RawKey) {
62958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Verify that v0.1b keys (raw key) is still supported. Raw keys are
63058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // 16 bytes long. Use the undecoded value of |kKey|.
63158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  GenerateKeyRequest(key_id_);
63258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  AddRawKeyAndExpect(
63358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      key_id_, std::vector<uint8>(kKey, kKey + arraysize(kKey)), KEY_ADDED);
63458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
63558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      encrypted_data_, key_id_, iv_, 0, no_subsample_entries_);
63658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS);
637a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
638a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace media
640