aes_decryptor_unittest.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
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 "testing/gmock/include/gmock/gmock.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::_;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Gt;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::IsNull;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::NotNull;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::SaveArg;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::StrNe;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochMATCHER(IsEmpty, "") { return arg.empty(); }
25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace media {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const uint8 kOriginalData[] = "Original subsample data.";
2968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const int kOriginalDataSize = 24;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// In the examples below, 'k'(key) has to be 16 bytes, and will always require
328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// 2 bytes of padding. 'kid'(keyid) is variable length, and may require 0, 1,
338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// or 2 bytes of padding.
348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
3568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const uint8 kKeyId[] = {
368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    // base64 equivalent is AAECAw
3758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    0x00, 0x01, 0x02, 0x03
3858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)};
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Key is 0x0405060708090a0b0c0d0e0f10111213,
41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// base64 equivalent is BAUGBwgJCgsMDQ4PEBESEw.
4268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char kKeyAsJWK[] =
4358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "{"
4458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "  \"keys\": ["
4558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "    {"
4658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "      \"kty\": \"oct\","
478bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    "      \"kid\": \"AAECAw\","
488bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    "      \"k\": \"BAUGBwgJCgsMDQ4PEBESEw\""
4958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "    }"
5058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "  ]"
5158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "}";
5258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
53a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Same kid as kKeyAsJWK, key to decrypt kEncryptedData2
54a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)const char kKeyAlternateAsJWK[] =
55a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    "{"
56a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    "  \"keys\": ["
57a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    "    {"
58a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    "      \"kty\": \"oct\","
59a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    "      \"kid\": \"AAECAw\","
60a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    "      \"k\": \"FBUWFxgZGhscHR4fICEiIw\""
61a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    "    }"
62a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    "  ]"
63a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    "}";
64a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
6568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char kWrongKeyAsJWK[] =
6658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "{"
6758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "  \"keys\": ["
6858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "    {"
6958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "      \"kty\": \"oct\","
708bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    "      \"kid\": \"AAECAw\","
718bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    "      \"k\": \"7u7u7u7u7u7u7u7u7u7u7g\""
7258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "    }"
7358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "  ]"
7458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "}";
7558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
7668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char kWrongSizedKeyAsJWK[] =
7758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "{"
7858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "  \"keys\": ["
7958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "    {"
8058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "      \"kty\": \"oct\","
818bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    "      \"kid\": \"AAECAw\","
828bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    "      \"k\": \"AAECAw\""
8358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "    }"
8458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "  ]"
8558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "}";
8658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
8768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const uint8 kIv[] = {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// kOriginalData encrypted with kKey and kIv but without any subsamples (or
9358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// equivalently using kSubsampleEntriesCypherOnly).
9468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const uint8 kEncryptedData[] = {
9558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  0x2f, 0x03, 0x09, 0xef, 0x71, 0xaf, 0x31, 0x16,
9658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  0xfa, 0x9d, 0x18, 0x43, 0x1e, 0x96, 0x71, 0xb5,
9758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  0xbf, 0xf5, 0x30, 0x53, 0x9a, 0x20, 0xdf, 0x95
9858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)};
9958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
10058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// kOriginalData encrypted with kSubsampleKey and kSubsampleIv using
101a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// kSubsampleEntriesNormal.
10268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const uint8 kSubsampleEncryptedData[] = {
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x4f, 0x72, 0x09, 0x16, 0x09, 0xe6, 0x79, 0xad,
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x70, 0x73, 0x75, 0x62, 0x09, 0xbb, 0x83, 0x1d,
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x4d, 0x08, 0xd7, 0x78, 0xa4, 0xa7, 0xf1, 0x2e
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const uint8 kOriginalData2[] = "Changed Original data.";
10958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
11068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const uint8 kIv2[] = {
11158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
11258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const uint8 kKeyId2[] = {
11658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // base64 equivalent is AAECAwQFBgcICQoLDA0ODxAREhM=
11758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
11858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
11958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    0x10, 0x11, 0x12, 0x13
12058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)};
12158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
12268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char kKey2AsJWK[] =
12358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "{"
12458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "  \"keys\": ["
12558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "    {"
12658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "      \"kty\": \"oct\","
1278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    "      \"kid\": \"AAECAwQFBgcICQoLDA0ODxAREhM\","
1288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    "      \"k\": \"FBUWFxgZGhscHR4fICEiIw\""
12958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "    }"
13058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "  ]"
13158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "}";
13258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
13358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// 'k' in bytes is x14x15x16x17x18x19x1ax1bx1cx1dx1ex1fx20x21x22x23
13458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
13568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const uint8 kEncryptedData2[] = {
13658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  0x57, 0x66, 0xf4, 0x12, 0x1a, 0xed, 0xb5, 0x79,
13758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  0x1c, 0x8e, 0x25, 0xd7, 0x17, 0xe7, 0x5e, 0x16,
13858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  0xe3, 0x40, 0x08, 0x27, 0x11, 0xe9
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
141a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Subsample entries for testing. The sum of |cypher_bytes| and |clear_bytes| of
14258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// all entries must be equal to kOriginalDataSize to make the subsample entries
14358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// valid.
144a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
14568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const SubsampleEntry kSubsampleEntriesNormal[] = {
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { 2, 7 },
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { 3, 11 },
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { 1, 0 }
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const SubsampleEntry kSubsampleEntriesWrongSize[] = {
15258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  { 3, 6 }, // This entry doesn't match the correct entry.
15358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  { 3, 11 },
15458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  { 1, 0 }
15558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)};
15658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
15768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const SubsampleEntry kSubsampleEntriesInvalidTotalSize[] = {
15858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  { 1, 1000 }, // This entry is too large.
15958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  { 3, 11 },
16058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  { 1, 0 }
16158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)};
16258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
16368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const SubsampleEntry kSubsampleEntriesClearOnly[] = {
164a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  { 7, 0 },
165a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  { 8, 0 },
166a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  { 9, 0 }
167a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)};
168a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
16968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const SubsampleEntry kSubsampleEntriesCypherOnly[] = {
170a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  { 0, 6 },
171a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  { 0, 8 },
172a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  { 0, 10 }
173a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)};
174a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
17558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)static scoped_refptr<DecoderBuffer> CreateEncryptedBuffer(
17658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const std::vector<uint8>& data,
17758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const std::vector<uint8>& key_id,
17858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const std::vector<uint8>& iv,
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::vector<SubsampleEntry>& subsample_entries) {
18058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DCHECK(!data.empty());
1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_refptr<DecoderBuffer> encrypted_buffer(new DecoderBuffer(data.size()));
1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  memcpy(encrypted_buffer->writable_data(), &data[0], data.size());
183868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  CHECK(encrypted_buffer.get());
18458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  std::string key_id_string(
18558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      reinterpret_cast<const char*>(key_id.empty() ? NULL : &key_id[0]),
18658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      key_id.size());
18758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  std::string iv_string(
18858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      reinterpret_cast<const char*>(iv.empty() ? NULL : &iv[0]), iv.size());
18958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  encrypted_buffer->set_decrypt_config(scoped_ptr<DecryptConfig>(
1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      new DecryptConfig(key_id_string, iv_string, subsample_entries)));
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return encrypted_buffer;
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AesDecryptorTest : public testing::Test {
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AesDecryptorTest()
197a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      : decryptor_(base::Bind(&AesDecryptorTest::OnSessionCreated,
198a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                              base::Unretained(this)),
199a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                   base::Bind(&AesDecryptorTest::OnSessionMessage,
200a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                              base::Unretained(this)),
201a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                   base::Bind(&AesDecryptorTest::OnSessionReady,
202a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                              base::Unretained(this)),
203a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                   base::Bind(&AesDecryptorTest::OnSessionClosed,
204a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                              base::Unretained(this)),
205a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                   base::Bind(&AesDecryptorTest::OnSessionError,
206a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                              base::Unretained(this))),
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        decrypt_cb_(base::Bind(&AesDecryptorTest::BufferDecrypted,
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               base::Unretained(this))),
20958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        original_data_(kOriginalData, kOriginalData + kOriginalDataSize),
21058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        encrypted_data_(kEncryptedData,
21158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                        kEncryptedData + arraysize(kEncryptedData)),
21258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        subsample_encrypted_data_(
21358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            kSubsampleEncryptedData,
21458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            kSubsampleEncryptedData + arraysize(kSubsampleEncryptedData)),
21558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        key_id_(kKeyId, kKeyId + arraysize(kKeyId)),
21658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        iv_(kIv, kIv + arraysize(kIv)),
21758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        normal_subsample_entries_(
218a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)            kSubsampleEntriesNormal,
219a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            kSubsampleEntriesNormal + arraysize(kSubsampleEntriesNormal)),
220a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        next_session_id_(1) {
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
224a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Creates a new session using |key_id|. Returns the session ID.
225a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  uint32 CreateSession(const std::vector<uint8>& key_id) {
22658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    DCHECK(!key_id.empty());
227a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    uint32 session_id = next_session_id_++;
228a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_CALL(*this, OnSessionCreated(session_id, StrNe(std::string())));
229a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_CALL(*this, OnSessionMessage(session_id, key_id, ""));
230a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_TRUE(decryptor_.CreateSession(
231a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        session_id, std::string(), &key_id[0], key_id.size()));
232a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return session_id;
233a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
234a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
235a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Releases the session specified by |session_id|.
236a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void ReleaseSession(uint32 session_id) {
237a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_CALL(*this, OnSessionClosed(session_id));
238a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    decryptor_.ReleaseSession(session_id);
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  enum UpdateSessionExpectation {
2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    SESSION_READY,
2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    SESSION_ERROR
24458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  };
24558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
246a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Updates the session specified by |session_id| with |key|. |result|
247a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // tests that the update succeeds or generates an error.
248a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void UpdateSessionAndExpect(uint32 session_id,
249a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                              const std::string& key,
2505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                              UpdateSessionExpectation result) {
25158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    DCHECK(!key.empty());
25258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    switch (result) {
2545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case SESSION_READY:
2555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        EXPECT_CALL(*this, OnSessionReady(session_id));
2565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break;
2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case SESSION_ERROR:
2585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        EXPECT_CALL(*this,
2595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                    OnSessionError(session_id, MediaKeys::kUnknownError, 0));
2605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break;
26158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
26258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
263a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    decryptor_.UpdateSession(
264a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        session_id, reinterpret_cast<const uint8*>(key.c_str()), key.length());
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD2(BufferDecrypted, void(Decryptor::Status,
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     const scoped_refptr<DecoderBuffer>&));
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  enum DecryptExpectation {
27158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    SUCCESS,
27258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    DATA_MISMATCH,
27358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    DATA_AND_SIZE_MISMATCH,
274a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    DECRYPT_ERROR,
275a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    NO_KEY
27658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  };
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void DecryptAndExpect(const scoped_refptr<DecoderBuffer>& encrypted,
27958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                        const std::vector<uint8>& plain_text,
28058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                        DecryptExpectation result) {
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<DecoderBuffer> decrypted;
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    switch (result) {
2845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case SUCCESS:
2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case DATA_MISMATCH:
2865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case DATA_AND_SIZE_MISMATCH:
2875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        EXPECT_CALL(*this, BufferDecrypted(Decryptor::kSuccess, NotNull()))
2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            .WillOnce(SaveArg<1>(&decrypted));
2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break;
2905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case DECRYPT_ERROR:
2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        EXPECT_CALL(*this, BufferDecrypted(Decryptor::kError, IsNull()))
2925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            .WillOnce(SaveArg<1>(&decrypted));
2935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break;
2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case NO_KEY:
2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        EXPECT_CALL(*this, BufferDecrypted(Decryptor::kNoKey, IsNull()))
2965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            .WillOnce(SaveArg<1>(&decrypted));
2975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break;
29858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    decryptor_.Decrypt(Decryptor::kVideo, encrypted, decrypt_cb_);
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    std::vector<uint8> decrypted_text;
30358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if (decrypted && decrypted->data_size()) {
30458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      decrypted_text.assign(
30558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        decrypted->data(), decrypted->data() + decrypted->data_size());
30658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
30758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
30858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    switch (result) {
30958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      case SUCCESS:
31058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_EQ(plain_text, decrypted_text);
31158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        break;
31258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      case DATA_MISMATCH:
31358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_EQ(plain_text.size(), decrypted_text.size());
31458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_NE(plain_text, decrypted_text);
31558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        break;
31658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      case DATA_AND_SIZE_MISMATCH:
31758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_NE(plain_text.size(), decrypted_text.size());
31858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        break;
31958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      case DECRYPT_ERROR:
320a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      case NO_KEY:
32158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_TRUE(decrypted_text.empty());
32258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        break;
32358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
326a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  MOCK_METHOD2(OnSessionCreated,
327a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)               void(uint32 session_id, const std::string& web_session_id));
328a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  MOCK_METHOD3(OnSessionMessage,
329a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)               void(uint32 session_id,
330f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                    const std::vector<uint8>& message,
331f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                    const std::string& default_url));
332a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  MOCK_METHOD1(OnSessionReady, void(uint32 session_id));
333a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  MOCK_METHOD1(OnSessionClosed, void(uint32 session_id));
334a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  MOCK_METHOD3(OnSessionError,
335a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)               void(uint32 session_id, MediaKeys::KeyError, int system_code));
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AesDecryptor decryptor_;
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AesDecryptor::DecryptCB decrypt_cb_;
33958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
34058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Constants for testing.
34158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const std::vector<uint8> original_data_;
34258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const std::vector<uint8> encrypted_data_;
34358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const std::vector<uint8> subsample_encrypted_data_;
34458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const std::vector<uint8> key_id_;
34558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const std::vector<uint8> iv_;
34658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const std::vector<SubsampleEntry> normal_subsample_entries_;
34758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const std::vector<SubsampleEntry> no_subsample_entries_;
348a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
349a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Generate new session ID every time
350a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  uint32 next_session_id_;
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
353a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(AesDecryptorTest, CreateSessionWithNullInitData) {
354a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  uint32 session_id = 8;
355a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_CALL(*this, OnSessionMessage(session_id, IsEmpty(), ""));
356a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_CALL(*this, OnSessionCreated(session_id, StrNe(std::string())));
357a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_TRUE(decryptor_.CreateSession(session_id, std::string(), NULL, 0));
358f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
359f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
360a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(AesDecryptorTest, MultipleCreateSession) {
361a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  uint32 session_id1 = 10;
362a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_CALL(*this, OnSessionMessage(session_id1, IsEmpty(), ""));
363a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_CALL(*this, OnSessionCreated(session_id1, StrNe(std::string())));
364a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_TRUE(decryptor_.CreateSession(session_id1, std::string(), NULL, 0));
365a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
366a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  uint32 session_id2 = 11;
367a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_CALL(*this, OnSessionMessage(session_id2, IsEmpty(), ""));
368a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_CALL(*this, OnSessionCreated(session_id2, StrNe(std::string())));
369a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_TRUE(decryptor_.CreateSession(session_id2, std::string(), NULL, 0));
370a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
371a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  uint32 session_id3 = 23;
372a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_CALL(*this, OnSessionMessage(session_id3, IsEmpty(), ""));
373a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_CALL(*this, OnSessionCreated(session_id3, StrNe(std::string())));
374a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_TRUE(decryptor_.CreateSession(session_id3, std::string(), NULL, 0));
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
37758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(AesDecryptorTest, NormalDecryption) {
378a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  uint32 session_id = CreateSession(key_id_);
3795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UpdateSessionAndExpect(session_id, kKeyAsJWK, SESSION_READY);
38058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
3815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      encrypted_data_, key_id_, iv_, no_subsample_entries_);
38258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS);
38358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
38458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
38558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(AesDecryptorTest, UnencryptedFrame) {
38658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // An empty iv string signals that the frame is unencrypted.
38758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
3885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      original_data_, key_id_, std::vector<uint8>(), no_subsample_entries_);
38958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS);
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AesDecryptorTest, WrongKey) {
393a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  uint32 session_id = CreateSession(key_id_);
3945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UpdateSessionAndExpect(session_id, kWrongKeyAsJWK, SESSION_READY);
39558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
3965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      encrypted_data_, key_id_, iv_, no_subsample_entries_);
39758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DecryptAndExpect(encrypted_buffer, original_data_, DATA_MISMATCH);
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AesDecryptorTest, NoKey) {
40158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
4025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      encrypted_data_, key_id_, iv_, no_subsample_entries_);
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*this, BufferDecrypted(AesDecryptor::kNoKey, IsNull()));
40458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  decryptor_.Decrypt(Decryptor::kVideo, encrypted_buffer, decrypt_cb_);
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AesDecryptorTest, KeyReplacement) {
408a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  uint32 session_id = CreateSession(key_id_);
40958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
4105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      encrypted_data_, key_id_, iv_, no_subsample_entries_);
41158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
4125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UpdateSessionAndExpect(session_id, kWrongKeyAsJWK, SESSION_READY);
41358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(DecryptAndExpect(
41458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      encrypted_buffer, original_data_, DATA_MISMATCH));
41558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
4165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UpdateSessionAndExpect(session_id, kKeyAsJWK, SESSION_READY);
41758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(
41858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS));
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AesDecryptorTest, WrongSizedKey) {
422a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  uint32 session_id = CreateSession(key_id_);
4235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UpdateSessionAndExpect(session_id, kWrongSizedKeyAsJWK, SESSION_ERROR);
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AesDecryptorTest, MultipleKeysAndFrames) {
427a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  uint32 session_id = CreateSession(key_id_);
4285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UpdateSessionAndExpect(session_id, kKeyAsJWK, SESSION_READY);
42958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
4305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      encrypted_data_, key_id_, iv_, no_subsample_entries_);
43158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(
43258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS));
43358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
4345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UpdateSessionAndExpect(session_id, kKey2AsJWK, SESSION_READY);
43558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
43658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // The first key is still available after we added a second key.
43758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(
43858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS));
43958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
44058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // The second key is also available.
44158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  encrypted_buffer = CreateEncryptedBuffer(
44258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      std::vector<uint8>(kEncryptedData2,
44358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                         kEncryptedData2 + arraysize(kEncryptedData2)),
44458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      std::vector<uint8>(kKeyId2, kKeyId2 + arraysize(kKeyId2)),
44558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      std::vector<uint8>(kIv2, kIv2 + arraysize(kIv2)),
44658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      no_subsample_entries_);
44758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(DecryptAndExpect(
44858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      encrypted_buffer,
44958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      std::vector<uint8>(kOriginalData2,
45058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                         kOriginalData2 + arraysize(kOriginalData2) - 1),
45158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      SUCCESS));
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AesDecryptorTest, CorruptedIv) {
455a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  uint32 session_id = CreateSession(key_id_);
4565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UpdateSessionAndExpect(session_id, kKeyAsJWK, SESSION_READY);
45758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
45858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  std::vector<uint8> bad_iv = iv_;
45958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  bad_iv[1]++;
46058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
46158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
4625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      encrypted_data_, key_id_, bad_iv, no_subsample_entries_);
46358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
46458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DecryptAndExpect(encrypted_buffer, original_data_, DATA_MISMATCH);
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AesDecryptorTest, CorruptedData) {
468a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  uint32 session_id = CreateSession(key_id_);
4695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UpdateSessionAndExpect(session_id, kKeyAsJWK, SESSION_READY);
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  std::vector<uint8> bad_data = encrypted_data_;
47258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  bad_data[1]++;
47358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
47458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
4755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      bad_data, key_id_, iv_, no_subsample_entries_);
47658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DecryptAndExpect(encrypted_buffer, original_data_, DATA_MISMATCH);
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(AesDecryptorTest, EncryptedAsUnencryptedFailure) {
480a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  uint32 session_id = CreateSession(key_id_);
4815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UpdateSessionAndExpect(session_id, kKeyAsJWK, SESSION_READY);
48258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
4835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      encrypted_data_, key_id_, std::vector<uint8>(), no_subsample_entries_);
48458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DecryptAndExpect(encrypted_buffer, original_data_, DATA_MISMATCH);
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AesDecryptorTest, SubsampleDecryption) {
488a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  uint32 session_id = CreateSession(key_id_);
4895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UpdateSessionAndExpect(session_id, kKeyAsJWK, SESSION_READY);
49058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
4915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      subsample_encrypted_data_, key_id_, iv_, normal_subsample_entries_);
49258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS);
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Ensures noninterference of data offset and subsample mechanisms. We never
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// expect to encounter this in the wild, but since the DecryptConfig doesn't
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// disallow such a configuration, it should be covered.
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AesDecryptorTest, SubsampleDecryptionWithOffset) {
499a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  uint32 session_id = CreateSession(key_id_);
5005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UpdateSessionAndExpect(session_id, kKeyAsJWK, SESSION_READY);
50158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
5025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      subsample_encrypted_data_, key_id_, iv_, normal_subsample_entries_);
50358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS);
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(AesDecryptorTest, SubsampleWrongSize) {
507a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  uint32 session_id = CreateSession(key_id_);
5085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UpdateSessionAndExpect(session_id, kKeyAsJWK, SESSION_READY);
50958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
51058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  std::vector<SubsampleEntry> subsample_entries_wrong_size(
51158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      kSubsampleEntriesWrongSize,
51258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      kSubsampleEntriesWrongSize + arraysize(kSubsampleEntriesWrongSize));
51358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
51458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
5155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      subsample_encrypted_data_, key_id_, iv_, subsample_entries_wrong_size);
51658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DecryptAndExpect(encrypted_buffer, original_data_, DATA_MISMATCH);
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(AesDecryptorTest, SubsampleInvalidTotalSize) {
520a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  uint32 session_id = CreateSession(key_id_);
5215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UpdateSessionAndExpect(session_id, kKeyAsJWK, SESSION_READY);
52258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
52358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  std::vector<SubsampleEntry> subsample_entries_invalid_total_size(
52458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      kSubsampleEntriesInvalidTotalSize,
52558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      kSubsampleEntriesInvalidTotalSize +
52658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          arraysize(kSubsampleEntriesInvalidTotalSize));
52758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
52858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
5295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      subsample_encrypted_data_, key_id_, iv_,
53058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      subsample_entries_invalid_total_size);
53158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DecryptAndExpect(encrypted_buffer, original_data_, DECRYPT_ERROR);
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
534a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// No cypher bytes in any of the subsamples.
535a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(AesDecryptorTest, SubsampleClearBytesOnly) {
536a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  uint32 session_id = CreateSession(key_id_);
5375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UpdateSessionAndExpect(session_id, kKeyAsJWK, SESSION_READY);
53858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
53958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  std::vector<SubsampleEntry> clear_only_subsample_entries(
540a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      kSubsampleEntriesClearOnly,
541a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      kSubsampleEntriesClearOnly + arraysize(kSubsampleEntriesClearOnly));
54258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
54358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
5445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      original_data_, key_id_, iv_, clear_only_subsample_entries);
54558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS);
546a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
547a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
548a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// No clear bytes in any of the subsamples.
549a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(AesDecryptorTest, SubsampleCypherBytesOnly) {
550a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  uint32 session_id = CreateSession(key_id_);
5515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UpdateSessionAndExpect(session_id, kKeyAsJWK, SESSION_READY);
55258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
55358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  std::vector<SubsampleEntry> cypher_only_subsample_entries(
554a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      kSubsampleEntriesCypherOnly,
555a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      kSubsampleEntriesCypherOnly + arraysize(kSubsampleEntriesCypherOnly));
55658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
55758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
5585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      encrypted_data_, key_id_, iv_, cypher_only_subsample_entries);
55958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS);
56058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
56158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
562a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(AesDecryptorTest, ReleaseSession) {
563a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  uint32 session_id = CreateSession(key_id_);
564a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
5655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      encrypted_data_, key_id_, iv_, no_subsample_entries_);
566a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
5675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UpdateSessionAndExpect(session_id, kKeyAsJWK, SESSION_READY);
568a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(
569a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS));
570a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
571a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ReleaseSession(session_id);
572a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
573a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
574a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(AesDecryptorTest, NoKeyAfterReleaseSession) {
575a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  uint32 session_id = CreateSession(key_id_);
576a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
5775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      encrypted_data_, key_id_, iv_, no_subsample_entries_);
578a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
5795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UpdateSessionAndExpect(session_id, kKeyAsJWK, SESSION_READY);
580a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(
581a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS));
582a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
583a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ReleaseSession(session_id);
584a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(
585a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      DecryptAndExpect(encrypted_buffer, original_data_, NO_KEY));
586a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
587a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
588a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(AesDecryptorTest, LatestKeyUsed) {
589a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  uint32 session_id1 = CreateSession(key_id_);
590a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
5915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      encrypted_data_, key_id_, iv_, no_subsample_entries_);
592a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
593a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Add alternate key, buffer should not be decoded properly.
5945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UpdateSessionAndExpect(session_id1, kKeyAlternateAsJWK, SESSION_READY);
595a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(
596a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      DecryptAndExpect(encrypted_buffer, original_data_, DATA_MISMATCH));
597a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
598a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Create a second session with a correct key value for key_id_.
599a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  uint32 session_id2 = CreateSession(key_id_);
6005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UpdateSessionAndExpect(session_id2, kKeyAsJWK, SESSION_READY);
601a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
602a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Should be able to decode with latest key.
603a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(
604a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS));
605a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
606a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
607a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(AesDecryptorTest, LatestKeyUsedAfterReleaseSession) {
608a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  uint32 session_id1 = CreateSession(key_id_);
609a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
6105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      encrypted_data_, key_id_, iv_, no_subsample_entries_);
6115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UpdateSessionAndExpect(session_id1, kKeyAsJWK, SESSION_READY);
612a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(
613a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS));
614a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
615a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Create a second session with a different key value for key_id_.
616a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  uint32 session_id2 = CreateSession(key_id_);
6175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UpdateSessionAndExpect(session_id2, kKeyAlternateAsJWK, SESSION_READY);
618a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
619a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Should not be able to decode with new key.
620a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(
621a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      DecryptAndExpect(encrypted_buffer, original_data_, DATA_MISMATCH));
622a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
623a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Close second session, should revert to original key.
624a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ReleaseSession(session_id2);
625a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(
626a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS));
627a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
628a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
62958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(AesDecryptorTest, JWKKey) {
630a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  uint32 session_id = CreateSession(key_id_);
631a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
63258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Try a simple JWK key (i.e. not in a set)
633f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const std::string kJwkSimple =
63458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "{"
63558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "  \"kty\": \"oct\","
6368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      "  \"kid\": \"AAECAwQFBgcICQoLDA0ODxAREhM\","
6378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      "  \"k\": \"FBUWFxgZGhscHR4fICEiIw\""
63858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "}";
6395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UpdateSessionAndExpect(session_id, kJwkSimple, SESSION_ERROR);
64058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
64158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Try a key list with multiple entries.
642f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const std::string kJwksMultipleEntries =
64358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "{"
64458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "  \"keys\": ["
64558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "    {"
64658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "      \"kty\": \"oct\","
6478bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      "      \"kid\": \"AAECAwQFBgcICQoLDA0ODxAREhM\","
6488bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      "      \"k\": \"FBUWFxgZGhscHR4fICEiIw\""
64958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "    },"
65058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "    {"
65158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "      \"kty\": \"oct\","
6528bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      "      \"kid\": \"JCUmJygpKissLS4vMA\","
6538bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      "      \"k\":\"MTIzNDU2Nzg5Ojs8PT4/QA\""
65458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "    }"
65558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "  ]"
65658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "}";
6575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UpdateSessionAndExpect(session_id, kJwksMultipleEntries, SESSION_READY);
65858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
65958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Try a key with no spaces and some \n plus additional fields.
660f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const std::string kJwksNoSpaces =
66158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "\n\n{\"something\":1,\"keys\":[{\n\n\"kty\":\"oct\",\"alg\":\"A128KW\","
6628bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      "\"kid\":\"AAECAwQFBgcICQoLDA0ODxAREhM\",\"k\":\"GawgguFyGrWKav7AX4VKUg"
6638bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      "\",\"foo\":\"bar\"}]}\n\n";
6645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UpdateSessionAndExpect(session_id, kJwksNoSpaces, SESSION_READY);
66558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
66658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Try some non-ASCII characters.
6675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UpdateSessionAndExpect(session_id,
6685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                         "This is not ASCII due to \xff\xfe\xfd in it.",
6695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                         SESSION_ERROR);
67058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
67158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Try a badly formatted key. Assume that the JSON parser is fully tested,
67258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // so we won't try a lot of combinations. However, need a test to ensure
67358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // that the code doesn't crash if invalid JSON received.
6745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UpdateSessionAndExpect(session_id, "This is not a JSON key.", SESSION_ERROR);
67558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
67658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Try passing some valid JSON that is not a dictionary at the top level.
6775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UpdateSessionAndExpect(session_id, "40", SESSION_ERROR);
67858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
67958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Try an empty dictionary.
6805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UpdateSessionAndExpect(session_id, "{ }", SESSION_ERROR);
68158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
68258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Try an empty 'keys' dictionary.
6835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UpdateSessionAndExpect(session_id, "{ \"keys\": [] }", SESSION_ERROR);
68458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
68558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Try with 'keys' not a dictionary.
6865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UpdateSessionAndExpect(session_id, "{ \"keys\":\"1\" }", SESSION_ERROR);
68758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
68858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Try with 'keys' a list of integers.
6895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UpdateSessionAndExpect(
6905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      session_id, "{ \"keys\": [ 1, 2, 3 ] }", SESSION_ERROR);
69158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
692f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Try padding(=) at end of 'k' base64 string.
693f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const std::string kJwksWithPaddedKey =
69458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "{"
69558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "  \"keys\": ["
69658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "    {"
69758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "      \"kty\": \"oct\","
6988bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      "      \"kid\": \"AAECAw\","
6998bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      "      \"k\": \"BAUGBwgJCgsMDQ4PEBESEw==\""
70058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "    }"
70158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "  ]"
70258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "}";
7035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UpdateSessionAndExpect(session_id, kJwksWithPaddedKey, SESSION_ERROR);
70458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
705f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Try padding(=) at end of 'kid' base64 string.
706f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const std::string kJwksWithPaddedKeyId =
70758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "{"
70858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "  \"keys\": ["
70958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "    {"
71058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "      \"kty\": \"oct\","
7118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      "      \"kid\": \"AAECAw==\","
7128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      "      \"k\": \"BAUGBwgJCgsMDQ4PEBESEw\""
71358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "    }"
71458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "  ]"
71558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "}";
7165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UpdateSessionAndExpect(session_id, kJwksWithPaddedKeyId, SESSION_ERROR);
71758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
71858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Try a key with invalid base64 encoding.
719f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const std::string kJwksWithInvalidBase64 =
72058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "{"
72158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "  \"keys\": ["
72258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "    {"
72358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "      \"kty\": \"oct\","
7248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      "      \"kid\": \"!@#$%^&*()\","
7258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      "      \"k\": \"BAUGBwgJCgsMDQ4PEBESEw\""
72658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "    }"
72758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "  ]"
72858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "}";
7295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UpdateSessionAndExpect(session_id, kJwksWithInvalidBase64, SESSION_ERROR);
7308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
731f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Try a 3-byte 'kid' where no base64 padding is required.
732f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // |kJwksMultipleEntries| above has 2 'kid's that require 1 and 2 padding
733f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // bytes. Note that 'k' has to be 16 bytes, so it will always require padding.
734f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const std::string kJwksWithNoPadding =
7358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      "{"
7368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      "  \"keys\": ["
7378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      "    {"
7388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      "      \"kty\": \"oct\","
7398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      "      \"kid\": \"Kiss\","
7408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      "      \"k\": \"BAUGBwgJCgsMDQ4PEBESEw\""
7418bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      "    }"
7428bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      "  ]"
7438bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      "}";
7445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UpdateSessionAndExpect(session_id, kJwksWithNoPadding, SESSION_READY);
7458bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
7468bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // Empty key id.
747f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const std::string kJwksWithEmptyKeyId =
7488bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      "{"
7498bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      "  \"keys\": ["
7508bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      "    {"
7518bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      "      \"kty\": \"oct\","
7528bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      "      \"kid\": \"\","
7538bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      "      \"k\": \"BAUGBwgJCgsMDQ4PEBESEw\""
7548bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      "    }"
7558bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      "  ]"
7568bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      "}";
7575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UpdateSessionAndExpect(session_id, kJwksWithEmptyKeyId, SESSION_ERROR);
7585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ReleaseSession(session_id);
759a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
760a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace media
762