aes_decryptor_unittest.cc revision f8ee788a64d60abd8f2d742a5fdedde054ecd910
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"
10f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "media/base/cdm_promise.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/decoder_buffer.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/decrypt_config.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/mock_filters.h"
14ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "media/cdm/aes_decryptor.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(); }
26f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)MATCHER(IsNotEmpty, "") { return !arg.empty(); }
27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class GURL;
29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace media {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const uint8 kOriginalData[] = "Original subsample data.";
3368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const int kOriginalDataSize = 24;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// In the examples below, 'k'(key) has to be 16 bytes, and will always require
368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// 2 bytes of padding. 'kid'(keyid) is variable length, and may require 0, 1,
378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// or 2 bytes of padding.
388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
3968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const uint8 kKeyId[] = {
408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    // base64 equivalent is AAECAw
4158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    0x00, 0x01, 0x02, 0x03
4258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)};
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Key is 0x0405060708090a0b0c0d0e0f10111213,
45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// base64 equivalent is BAUGBwgJCgsMDQ4PEBESEw.
4668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char kKeyAsJWK[] =
4758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "{"
4858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "  \"keys\": ["
4958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "    {"
5058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "      \"kty\": \"oct\","
518bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    "      \"kid\": \"AAECAw\","
528bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    "      \"k\": \"BAUGBwgJCgsMDQ4PEBESEw\""
5358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "    }"
5458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "  ]"
5558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "}";
5658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
57a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Same kid as kKeyAsJWK, key to decrypt kEncryptedData2
58a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)const char kKeyAlternateAsJWK[] =
59a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    "{"
60a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    "  \"keys\": ["
61a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    "    {"
62a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    "      \"kty\": \"oct\","
63a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    "      \"kid\": \"AAECAw\","
64a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    "      \"k\": \"FBUWFxgZGhscHR4fICEiIw\""
65a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    "    }"
66a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    "  ]"
67a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    "}";
68a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
6968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char kWrongKeyAsJWK[] =
7058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "{"
7158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "  \"keys\": ["
7258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "    {"
7358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "      \"kty\": \"oct\","
748bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    "      \"kid\": \"AAECAw\","
758bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    "      \"k\": \"7u7u7u7u7u7u7u7u7u7u7g\""
7658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "    }"
7758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "  ]"
7858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "}";
7958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
8068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char kWrongSizedKeyAsJWK[] =
8158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "{"
8258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "  \"keys\": ["
8358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "    {"
8458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "      \"kty\": \"oct\","
858bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    "      \"kid\": \"AAECAw\","
868bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    "      \"k\": \"AAECAw\""
8758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "    }"
8858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "  ]"
8958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "}";
9058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
9168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const uint8 kIv[] = {
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// kOriginalData encrypted with kKey and kIv but without any subsamples (or
9758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// equivalently using kSubsampleEntriesCypherOnly).
9868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const uint8 kEncryptedData[] = {
9958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  0x2f, 0x03, 0x09, 0xef, 0x71, 0xaf, 0x31, 0x16,
10058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  0xfa, 0x9d, 0x18, 0x43, 0x1e, 0x96, 0x71, 0xb5,
10158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  0xbf, 0xf5, 0x30, 0x53, 0x9a, 0x20, 0xdf, 0x95
10258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)};
10358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
10458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// kOriginalData encrypted with kSubsampleKey and kSubsampleIv using
105a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// kSubsampleEntriesNormal.
10668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const uint8 kSubsampleEncryptedData[] = {
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x4f, 0x72, 0x09, 0x16, 0x09, 0xe6, 0x79, 0xad,
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x70, 0x73, 0x75, 0x62, 0x09, 0xbb, 0x83, 0x1d,
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x4d, 0x08, 0xd7, 0x78, 0xa4, 0xa7, 0xf1, 0x2e
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const uint8 kOriginalData2[] = "Changed Original data.";
11358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
11468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const uint8 kIv2[] = {
11558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
11658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const uint8 kKeyId2[] = {
12058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // base64 equivalent is AAECAwQFBgcICQoLDA0ODxAREhM=
12158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
12258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
12358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    0x10, 0x11, 0x12, 0x13
12458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)};
12558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
12668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char kKey2AsJWK[] =
12758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "{"
12858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "  \"keys\": ["
12958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "    {"
13058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "      \"kty\": \"oct\","
1318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    "      \"kid\": \"AAECAwQFBgcICQoLDA0ODxAREhM\","
1328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    "      \"k\": \"FBUWFxgZGhscHR4fICEiIw\""
13358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "    }"
13458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "  ]"
13558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "}";
13658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
13758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// 'k' in bytes is x14x15x16x17x18x19x1ax1bx1cx1dx1ex1fx20x21x22x23
13858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
13968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const uint8 kEncryptedData2[] = {
14058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  0x57, 0x66, 0xf4, 0x12, 0x1a, 0xed, 0xb5, 0x79,
14158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  0x1c, 0x8e, 0x25, 0xd7, 0x17, 0xe7, 0x5e, 0x16,
14258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  0xe3, 0x40, 0x08, 0x27, 0x11, 0xe9
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Subsample entries for testing. The sum of |cypher_bytes| and |clear_bytes| of
14658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// all entries must be equal to kOriginalDataSize to make the subsample entries
14758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// valid.
148a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
14968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const SubsampleEntry kSubsampleEntriesNormal[] = {
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { 2, 7 },
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { 3, 11 },
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { 1, 0 }
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const SubsampleEntry kSubsampleEntriesWrongSize[] = {
15658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  { 3, 6 }, // This entry doesn't match the correct entry.
15758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  { 3, 11 },
15858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  { 1, 0 }
15958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)};
16058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
16168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const SubsampleEntry kSubsampleEntriesInvalidTotalSize[] = {
16258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  { 1, 1000 }, // This entry is too large.
16358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  { 3, 11 },
16458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  { 1, 0 }
16558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)};
16658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
16768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const SubsampleEntry kSubsampleEntriesClearOnly[] = {
168a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  { 7, 0 },
169a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  { 8, 0 },
170a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  { 9, 0 }
171a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)};
172a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
17368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const SubsampleEntry kSubsampleEntriesCypherOnly[] = {
174a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  { 0, 6 },
175a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  { 0, 8 },
176a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  { 0, 10 }
177a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)};
178a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
17958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)static scoped_refptr<DecoderBuffer> CreateEncryptedBuffer(
18058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const std::vector<uint8>& data,
18158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const std::vector<uint8>& key_id,
18258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const std::vector<uint8>& iv,
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::vector<SubsampleEntry>& subsample_entries) {
18458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DCHECK(!data.empty());
1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_refptr<DecoderBuffer> encrypted_buffer(new DecoderBuffer(data.size()));
1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  memcpy(encrypted_buffer->writable_data(), &data[0], data.size());
187868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  CHECK(encrypted_buffer.get());
18858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  std::string key_id_string(
18958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      reinterpret_cast<const char*>(key_id.empty() ? NULL : &key_id[0]),
19058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      key_id.size());
19158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  std::string iv_string(
19258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      reinterpret_cast<const char*>(iv.empty() ? NULL : &iv[0]), iv.size());
19358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  encrypted_buffer->set_decrypt_config(scoped_ptr<DecryptConfig>(
1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      new DecryptConfig(key_id_string, iv_string, subsample_entries)));
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return encrypted_buffer;
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
198f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)enum PromiseResult { RESOLVED, REJECTED };
199f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AesDecryptorTest : public testing::Test {
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AesDecryptorTest()
203f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      : decryptor_(base::Bind(&AesDecryptorTest::OnSessionMessage,
204a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                              base::Unretained(this)),
205a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                   base::Bind(&AesDecryptorTest::OnSessionClosed,
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,
219f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)            kSubsampleEntriesNormal + arraysize(kSubsampleEntriesNormal)) {
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
223f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void OnResolveWithSession(PromiseResult expected,
224f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                            const std::string& web_session_id) {
225f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    EXPECT_EQ(expected, RESOLVED);
226f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    EXPECT_GT(web_session_id.length(), 0ul);
227f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    web_session_id_ = web_session_id;
228f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
229f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
230f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void OnResolve(PromiseResult expected) {
231f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    EXPECT_EQ(expected, RESOLVED);
232f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
233f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
234f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void OnReject(PromiseResult expected,
235f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                MediaKeys::Exception exception_code,
236f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                uint32 system_code,
237f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                const std::string& error_message) {
238f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    EXPECT_EQ(expected, REJECTED);
239f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
240f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
241f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  scoped_ptr<SimpleCdmPromise> CreatePromise(PromiseResult expected) {
242f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    scoped_ptr<SimpleCdmPromise> promise(new SimpleCdmPromise(
243f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        base::Bind(
244f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)            &AesDecryptorTest::OnResolve, base::Unretained(this), expected),
245f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        base::Bind(
246f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)            &AesDecryptorTest::OnReject, base::Unretained(this), expected)));
247f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return promise.Pass();
248f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
249f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
250f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  scoped_ptr<NewSessionCdmPromise> CreateSessionPromise(
251f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      PromiseResult expected) {
252f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    scoped_ptr<NewSessionCdmPromise> promise(new NewSessionCdmPromise(
253f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        base::Bind(&AesDecryptorTest::OnResolveWithSession,
254f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                   base::Unretained(this),
255f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                   expected),
256f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        base::Bind(
257f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)            &AesDecryptorTest::OnReject, base::Unretained(this), expected)));
258f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return promise.Pass();
259f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
260f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
261a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Creates a new session using |key_id|. Returns the session ID.
262f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  std::string CreateSession(const std::vector<uint8>& key_id) {
26358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    DCHECK(!key_id.empty());
264f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    EXPECT_CALL(*this,
265f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                OnSessionMessage(IsNotEmpty(), key_id, GURL::EmptyGURL()));
266f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    decryptor_.CreateSession(std::string(),
267f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                             &key_id[0],
268f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                             key_id.size(),
269f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                             MediaKeys::TEMPORARY_SESSION,
270f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                             CreateSessionPromise(RESOLVED));
271f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    // This expects the promise to be called synchronously, which is the case
272f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    // for AesDecryptor.
273f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return web_session_id_;
274a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
275a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
276a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Releases the session specified by |session_id|.
277f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void ReleaseSession(const std::string& session_id) {
278a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_CALL(*this, OnSessionClosed(session_id));
279f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    decryptor_.ReleaseSession(session_id, CreatePromise(RESOLVED));
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
282a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Updates the session specified by |session_id| with |key|. |result|
283a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // tests that the update succeeds or generates an error.
284f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void UpdateSessionAndExpect(std::string session_id,
285a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                              const std::string& key,
286f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                              PromiseResult result) {
28758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    DCHECK(!key.empty());
28858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
289f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    decryptor_.UpdateSession(session_id,
290f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                             reinterpret_cast<const uint8*>(key.c_str()),
291f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                             key.length(),
292f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                             CreatePromise(result));
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD2(BufferDecrypted, void(Decryptor::Status,
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     const scoped_refptr<DecoderBuffer>&));
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  enum DecryptExpectation {
29958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    SUCCESS,
30058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    DATA_MISMATCH,
30158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    DATA_AND_SIZE_MISMATCH,
302a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    DECRYPT_ERROR,
303a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    NO_KEY
30458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  };
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void DecryptAndExpect(const scoped_refptr<DecoderBuffer>& encrypted,
30758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                        const std::vector<uint8>& plain_text,
30858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                        DecryptExpectation result) {
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<DecoderBuffer> decrypted;
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    switch (result) {
3125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case SUCCESS:
3135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case DATA_MISMATCH:
3145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case DATA_AND_SIZE_MISMATCH:
3155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        EXPECT_CALL(*this, BufferDecrypted(Decryptor::kSuccess, NotNull()))
3165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            .WillOnce(SaveArg<1>(&decrypted));
3175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break;
3185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case DECRYPT_ERROR:
3195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        EXPECT_CALL(*this, BufferDecrypted(Decryptor::kError, IsNull()))
3205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            .WillOnce(SaveArg<1>(&decrypted));
3215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break;
3225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case NO_KEY:
3235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        EXPECT_CALL(*this, BufferDecrypted(Decryptor::kNoKey, IsNull()))
3245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            .WillOnce(SaveArg<1>(&decrypted));
3255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break;
32658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    decryptor_.Decrypt(Decryptor::kVideo, encrypted, decrypt_cb_);
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    std::vector<uint8> decrypted_text;
33158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if (decrypted && decrypted->data_size()) {
33258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      decrypted_text.assign(
33358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        decrypted->data(), decrypted->data() + decrypted->data_size());
33458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
33558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
33658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    switch (result) {
33758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      case SUCCESS:
33858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_EQ(plain_text, decrypted_text);
33958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        break;
34058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      case DATA_MISMATCH:
34158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_EQ(plain_text.size(), decrypted_text.size());
34258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_NE(plain_text, decrypted_text);
34358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        break;
34458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      case DATA_AND_SIZE_MISMATCH:
34558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_NE(plain_text.size(), decrypted_text.size());
34658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        break;
34758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      case DECRYPT_ERROR:
348a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      case NO_KEY:
34958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        EXPECT_TRUE(decrypted_text.empty());
35058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        break;
35158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
354a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  MOCK_METHOD3(OnSessionMessage,
355f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)               void(const std::string& web_session_id,
356f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                    const std::vector<uint8>& message,
35746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                    const GURL& destination_url));
358f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  MOCK_METHOD1(OnSessionClosed, void(const std::string& web_session_id));
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AesDecryptor decryptor_;
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AesDecryptor::DecryptCB decrypt_cb_;
362f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  std::string web_session_id_;
36358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
36458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Constants for testing.
36558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const std::vector<uint8> original_data_;
36658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const std::vector<uint8> encrypted_data_;
36758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const std::vector<uint8> subsample_encrypted_data_;
36858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const std::vector<uint8> key_id_;
36958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const std::vector<uint8> iv_;
37058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const std::vector<SubsampleEntry> normal_subsample_entries_;
37158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const std::vector<SubsampleEntry> no_subsample_entries_;
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
374a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(AesDecryptorTest, CreateSessionWithNullInitData) {
375cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_CALL(*this,
376f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)              OnSessionMessage(IsNotEmpty(), IsEmpty(), GURL::EmptyGURL()));
377f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  decryptor_.CreateSession(std::string(),
378f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                           NULL,
379f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                           0,
380f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                           MediaKeys::TEMPORARY_SESSION,
381f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                           CreateSessionPromise(RESOLVED));
382f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
383f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
384a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(AesDecryptorTest, MultipleCreateSession) {
385cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_CALL(*this,
386f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)              OnSessionMessage(IsNotEmpty(), IsEmpty(), GURL::EmptyGURL()));
387f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  decryptor_.CreateSession(std::string(),
388f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                           NULL,
389f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                           0,
390f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                           MediaKeys::TEMPORARY_SESSION,
391f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                           CreateSessionPromise(RESOLVED));
392a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
393cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_CALL(*this,
394f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)              OnSessionMessage(IsNotEmpty(), IsEmpty(), GURL::EmptyGURL()));
395f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  decryptor_.CreateSession(std::string(),
396f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                           NULL,
397f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                           0,
398f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                           MediaKeys::TEMPORARY_SESSION,
399f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                           CreateSessionPromise(RESOLVED));
400a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
401cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_CALL(*this,
402f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)              OnSessionMessage(IsNotEmpty(), IsEmpty(), GURL::EmptyGURL()));
403f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  decryptor_.CreateSession(std::string(),
404f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                           NULL,
405f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                           0,
406f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                           MediaKeys::TEMPORARY_SESSION,
407f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                           CreateSessionPromise(RESOLVED));
4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
41058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(AesDecryptorTest, NormalDecryption) {
411f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  std::string session_id = CreateSession(key_id_);
412f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  UpdateSessionAndExpect(session_id, kKeyAsJWK, RESOLVED);
41358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
4145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      encrypted_data_, key_id_, iv_, no_subsample_entries_);
41558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS);
41658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
41758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
41858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(AesDecryptorTest, UnencryptedFrame) {
41958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // An empty iv string signals that the frame is unencrypted.
42058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
4215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      original_data_, key_id_, std::vector<uint8>(), no_subsample_entries_);
42258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS);
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AesDecryptorTest, WrongKey) {
426f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  std::string session_id = CreateSession(key_id_);
427f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  UpdateSessionAndExpect(session_id, kWrongKeyAsJWK, RESOLVED);
42858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
4295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      encrypted_data_, key_id_, iv_, no_subsample_entries_);
43058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DecryptAndExpect(encrypted_buffer, original_data_, DATA_MISMATCH);
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AesDecryptorTest, NoKey) {
43458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
4355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      encrypted_data_, key_id_, iv_, no_subsample_entries_);
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*this, BufferDecrypted(AesDecryptor::kNoKey, IsNull()));
43758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  decryptor_.Decrypt(Decryptor::kVideo, encrypted_buffer, decrypt_cb_);
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AesDecryptorTest, KeyReplacement) {
441f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  std::string session_id = CreateSession(key_id_);
44258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
4435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      encrypted_data_, key_id_, iv_, no_subsample_entries_);
44458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
445f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  UpdateSessionAndExpect(session_id, kWrongKeyAsJWK, RESOLVED);
44658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(DecryptAndExpect(
44758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      encrypted_buffer, original_data_, DATA_MISMATCH));
44858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
449f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  UpdateSessionAndExpect(session_id, kKeyAsJWK, RESOLVED);
45058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(
45158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS));
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AesDecryptorTest, WrongSizedKey) {
455f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  std::string session_id = CreateSession(key_id_);
456f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  UpdateSessionAndExpect(session_id, kWrongSizedKeyAsJWK, REJECTED);
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AesDecryptorTest, MultipleKeysAndFrames) {
460f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  std::string session_id = CreateSession(key_id_);
461f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  UpdateSessionAndExpect(session_id, kKeyAsJWK, RESOLVED);
46258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
4635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      encrypted_data_, key_id_, iv_, no_subsample_entries_);
46458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(
46558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS));
46658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
467f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  UpdateSessionAndExpect(session_id, kKey2AsJWK, RESOLVED);
46858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
46958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // The first key is still available after we added a second key.
47058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(
47158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS));
47258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
47358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // The second key is also available.
47458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  encrypted_buffer = CreateEncryptedBuffer(
47558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      std::vector<uint8>(kEncryptedData2,
47658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                         kEncryptedData2 + arraysize(kEncryptedData2)),
47758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      std::vector<uint8>(kKeyId2, kKeyId2 + arraysize(kKeyId2)),
47858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      std::vector<uint8>(kIv2, kIv2 + arraysize(kIv2)),
47958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      no_subsample_entries_);
48058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(DecryptAndExpect(
48158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      encrypted_buffer,
48258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      std::vector<uint8>(kOriginalData2,
48358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                         kOriginalData2 + arraysize(kOriginalData2) - 1),
48458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      SUCCESS));
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AesDecryptorTest, CorruptedIv) {
488f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  std::string session_id = CreateSession(key_id_);
489f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  UpdateSessionAndExpect(session_id, kKeyAsJWK, RESOLVED);
49058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
49158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  std::vector<uint8> bad_iv = iv_;
49258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  bad_iv[1]++;
49358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
49458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
4955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      encrypted_data_, key_id_, bad_iv, no_subsample_entries_);
49658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
49758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DecryptAndExpect(encrypted_buffer, original_data_, DATA_MISMATCH);
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AesDecryptorTest, CorruptedData) {
501f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  std::string session_id = CreateSession(key_id_);
502f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  UpdateSessionAndExpect(session_id, kKeyAsJWK, RESOLVED);
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  std::vector<uint8> bad_data = encrypted_data_;
50558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  bad_data[1]++;
50658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
50758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
5085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      bad_data, key_id_, iv_, no_subsample_entries_);
50958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DecryptAndExpect(encrypted_buffer, original_data_, DATA_MISMATCH);
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(AesDecryptorTest, EncryptedAsUnencryptedFailure) {
513f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  std::string session_id = CreateSession(key_id_);
514f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  UpdateSessionAndExpect(session_id, kKeyAsJWK, RESOLVED);
51558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
5165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      encrypted_data_, key_id_, std::vector<uint8>(), no_subsample_entries_);
51758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DecryptAndExpect(encrypted_buffer, original_data_, DATA_MISMATCH);
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AesDecryptorTest, SubsampleDecryption) {
521f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  std::string session_id = CreateSession(key_id_);
522f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  UpdateSessionAndExpect(session_id, kKeyAsJWK, RESOLVED);
52358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
5245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      subsample_encrypted_data_, key_id_, iv_, normal_subsample_entries_);
52558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS);
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Ensures noninterference of data offset and subsample mechanisms. We never
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// expect to encounter this in the wild, but since the DecryptConfig doesn't
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// disallow such a configuration, it should be covered.
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AesDecryptorTest, SubsampleDecryptionWithOffset) {
532f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  std::string session_id = CreateSession(key_id_);
533f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  UpdateSessionAndExpect(session_id, kKeyAsJWK, RESOLVED);
53458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
5355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      subsample_encrypted_data_, key_id_, iv_, normal_subsample_entries_);
53658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS);
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(AesDecryptorTest, SubsampleWrongSize) {
540f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  std::string session_id = CreateSession(key_id_);
541f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  UpdateSessionAndExpect(session_id, kKeyAsJWK, RESOLVED);
54258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
54358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  std::vector<SubsampleEntry> subsample_entries_wrong_size(
54458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      kSubsampleEntriesWrongSize,
54558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      kSubsampleEntriesWrongSize + arraysize(kSubsampleEntriesWrongSize));
54658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
54758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
5485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      subsample_encrypted_data_, key_id_, iv_, subsample_entries_wrong_size);
54958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DecryptAndExpect(encrypted_buffer, original_data_, DATA_MISMATCH);
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(AesDecryptorTest, SubsampleInvalidTotalSize) {
553f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  std::string session_id = CreateSession(key_id_);
554f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  UpdateSessionAndExpect(session_id, kKeyAsJWK, RESOLVED);
55558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
55658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  std::vector<SubsampleEntry> subsample_entries_invalid_total_size(
55758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      kSubsampleEntriesInvalidTotalSize,
55858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      kSubsampleEntriesInvalidTotalSize +
55958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          arraysize(kSubsampleEntriesInvalidTotalSize));
56058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
56158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
5625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      subsample_encrypted_data_, key_id_, iv_,
56358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      subsample_entries_invalid_total_size);
56458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DecryptAndExpect(encrypted_buffer, original_data_, DECRYPT_ERROR);
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
567a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// No cypher bytes in any of the subsamples.
568a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(AesDecryptorTest, SubsampleClearBytesOnly) {
569f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  std::string session_id = CreateSession(key_id_);
570f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  UpdateSessionAndExpect(session_id, kKeyAsJWK, RESOLVED);
57158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
57258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  std::vector<SubsampleEntry> clear_only_subsample_entries(
573a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      kSubsampleEntriesClearOnly,
574a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      kSubsampleEntriesClearOnly + arraysize(kSubsampleEntriesClearOnly));
57558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
57658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
5775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      original_data_, key_id_, iv_, clear_only_subsample_entries);
57858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS);
579a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
580a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
581a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// No clear bytes in any of the subsamples.
582a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(AesDecryptorTest, SubsampleCypherBytesOnly) {
583f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  std::string session_id = CreateSession(key_id_);
584f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  UpdateSessionAndExpect(session_id, kKeyAsJWK, RESOLVED);
58558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
58658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  std::vector<SubsampleEntry> cypher_only_subsample_entries(
587a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      kSubsampleEntriesCypherOnly,
588a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      kSubsampleEntriesCypherOnly + arraysize(kSubsampleEntriesCypherOnly));
58958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
59058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
5915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      encrypted_data_, key_id_, iv_, cypher_only_subsample_entries);
59258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS);
59358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
59458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
595a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(AesDecryptorTest, ReleaseSession) {
596f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  std::string session_id = CreateSession(key_id_);
597a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
5985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      encrypted_data_, key_id_, iv_, no_subsample_entries_);
599a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
600f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  UpdateSessionAndExpect(session_id, kKeyAsJWK, RESOLVED);
601a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(
602a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS));
603a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
604a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ReleaseSession(session_id);
605a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
606a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
607a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(AesDecryptorTest, NoKeyAfterReleaseSession) {
608f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  std::string session_id = CreateSession(key_id_);
609a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
6105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      encrypted_data_, key_id_, iv_, no_subsample_entries_);
611a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
612f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  UpdateSessionAndExpect(session_id, kKeyAsJWK, RESOLVED);
613a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(
614a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS));
615a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
616a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ReleaseSession(session_id);
617a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(
618a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      DecryptAndExpect(encrypted_buffer, original_data_, NO_KEY));
619a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
620a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
621a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(AesDecryptorTest, LatestKeyUsed) {
622f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  std::string session_id1 = CreateSession(key_id_);
623a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
6245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      encrypted_data_, key_id_, iv_, no_subsample_entries_);
625a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
626a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Add alternate key, buffer should not be decoded properly.
627f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  UpdateSessionAndExpect(session_id1, kKeyAlternateAsJWK, RESOLVED);
628a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(
629a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      DecryptAndExpect(encrypted_buffer, original_data_, DATA_MISMATCH));
630a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
631a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Create a second session with a correct key value for key_id_.
632f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  std::string session_id2 = CreateSession(key_id_);
633f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  UpdateSessionAndExpect(session_id2, kKeyAsJWK, RESOLVED);
634a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
635a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Should be able to decode with latest key.
636a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(
637a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS));
638a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
639a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
640a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(AesDecryptorTest, LatestKeyUsedAfterReleaseSession) {
641f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  std::string session_id1 = CreateSession(key_id_);
642a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
6435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      encrypted_data_, key_id_, iv_, no_subsample_entries_);
644f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  UpdateSessionAndExpect(session_id1, kKeyAsJWK, RESOLVED);
645a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(
646a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS));
647a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
648a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Create a second session with a different key value for key_id_.
649f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  std::string session_id2 = CreateSession(key_id_);
650f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  UpdateSessionAndExpect(session_id2, kKeyAlternateAsJWK, RESOLVED);
651a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
652a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Should not be able to decode with new key.
653a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(
654a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      DecryptAndExpect(encrypted_buffer, original_data_, DATA_MISMATCH));
655a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
656a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Close second session, should revert to original key.
657a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ReleaseSession(session_id2);
658a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(
659a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS));
660a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
661a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
66258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(AesDecryptorTest, JWKKey) {
663f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  std::string session_id = CreateSession(key_id_);
664a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
66558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Try a simple JWK key (i.e. not in a set)
666f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const std::string kJwkSimple =
66758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "{"
66858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "  \"kty\": \"oct\","
6698bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      "  \"kid\": \"AAECAwQFBgcICQoLDA0ODxAREhM\","
6708bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      "  \"k\": \"FBUWFxgZGhscHR4fICEiIw\""
67158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "}";
672f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  UpdateSessionAndExpect(session_id, kJwkSimple, REJECTED);
67358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
67458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Try a key list with multiple entries.
675f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const std::string kJwksMultipleEntries =
67658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "{"
67758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "  \"keys\": ["
67858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "    {"
67958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "      \"kty\": \"oct\","
6808bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      "      \"kid\": \"AAECAwQFBgcICQoLDA0ODxAREhM\","
6818bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      "      \"k\": \"FBUWFxgZGhscHR4fICEiIw\""
68258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "    },"
68358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "    {"
68458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "      \"kty\": \"oct\","
6858bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      "      \"kid\": \"JCUmJygpKissLS4vMA\","
6868bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      "      \"k\":\"MTIzNDU2Nzg5Ojs8PT4/QA\""
68758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "    }"
68858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "  ]"
68958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "}";
690f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  UpdateSessionAndExpect(session_id, kJwksMultipleEntries, RESOLVED);
69158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
69258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Try a key with no spaces and some \n plus additional fields.
693f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const std::string kJwksNoSpaces =
69458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "\n\n{\"something\":1,\"keys\":[{\n\n\"kty\":\"oct\",\"alg\":\"A128KW\","
6958bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      "\"kid\":\"AAECAwQFBgcICQoLDA0ODxAREhM\",\"k\":\"GawgguFyGrWKav7AX4VKUg"
6968bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      "\",\"foo\":\"bar\"}]}\n\n";
697f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  UpdateSessionAndExpect(session_id, kJwksNoSpaces, RESOLVED);
69858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
69958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Try some non-ASCII characters.
700f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  UpdateSessionAndExpect(
701f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      session_id, "This is not ASCII due to \xff\xfe\xfd in it.", REJECTED);
70258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
70358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Try a badly formatted key. Assume that the JSON parser is fully tested,
70458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // so we won't try a lot of combinations. However, need a test to ensure
70558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // that the code doesn't crash if invalid JSON received.
706f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  UpdateSessionAndExpect(session_id, "This is not a JSON key.", REJECTED);
70758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
70858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Try passing some valid JSON that is not a dictionary at the top level.
709f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  UpdateSessionAndExpect(session_id, "40", REJECTED);
71058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
71158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Try an empty dictionary.
712f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  UpdateSessionAndExpect(session_id, "{ }", REJECTED);
71358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
71458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Try an empty 'keys' dictionary.
715f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  UpdateSessionAndExpect(session_id, "{ \"keys\": [] }", REJECTED);
71658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
71758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Try with 'keys' not a dictionary.
718f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  UpdateSessionAndExpect(session_id, "{ \"keys\":\"1\" }", REJECTED);
71958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
72058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Try with 'keys' a list of integers.
721f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  UpdateSessionAndExpect(session_id, "{ \"keys\": [ 1, 2, 3 ] }", REJECTED);
72258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
723f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Try padding(=) at end of 'k' base64 string.
724f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const std::string kJwksWithPaddedKey =
72558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "{"
72658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "  \"keys\": ["
72758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "    {"
72858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "      \"kty\": \"oct\","
7298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      "      \"kid\": \"AAECAw\","
7308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      "      \"k\": \"BAUGBwgJCgsMDQ4PEBESEw==\""
73158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "    }"
73258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "  ]"
73358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "}";
734f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  UpdateSessionAndExpect(session_id, kJwksWithPaddedKey, REJECTED);
73558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
736f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Try padding(=) at end of 'kid' base64 string.
737f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const std::string kJwksWithPaddedKeyId =
73858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "{"
73958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "  \"keys\": ["
74058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "    {"
74158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "      \"kty\": \"oct\","
7428bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      "      \"kid\": \"AAECAw==\","
7438bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      "      \"k\": \"BAUGBwgJCgsMDQ4PEBESEw\""
74458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "    }"
74558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "  ]"
74658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "}";
747f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  UpdateSessionAndExpect(session_id, kJwksWithPaddedKeyId, REJECTED);
74858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
74958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Try a key with invalid base64 encoding.
750f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const std::string kJwksWithInvalidBase64 =
75158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "{"
75258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "  \"keys\": ["
75358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "    {"
75458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "      \"kty\": \"oct\","
7558bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      "      \"kid\": \"!@#$%^&*()\","
7568bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      "      \"k\": \"BAUGBwgJCgsMDQ4PEBESEw\""
75758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "    }"
75858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "  ]"
75958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "}";
760f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  UpdateSessionAndExpect(session_id, kJwksWithInvalidBase64, REJECTED);
7618bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
762f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Try a 3-byte 'kid' where no base64 padding is required.
763f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // |kJwksMultipleEntries| above has 2 'kid's that require 1 and 2 padding
764f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // bytes. Note that 'k' has to be 16 bytes, so it will always require padding.
765f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const std::string kJwksWithNoPadding =
7668bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      "{"
7678bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      "  \"keys\": ["
7688bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      "    {"
7698bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      "      \"kty\": \"oct\","
7708bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      "      \"kid\": \"Kiss\","
7718bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      "      \"k\": \"BAUGBwgJCgsMDQ4PEBESEw\""
7728bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      "    }"
7738bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      "  ]"
7748bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      "}";
775f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  UpdateSessionAndExpect(session_id, kJwksWithNoPadding, RESOLVED);
7768bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
7778bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // Empty key id.
778f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const std::string kJwksWithEmptyKeyId =
7798bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      "{"
7808bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      "  \"keys\": ["
7818bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      "    {"
7828bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      "      \"kty\": \"oct\","
7838bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      "      \"kid\": \"\","
7848bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      "      \"k\": \"BAUGBwgJCgsMDQ4PEBESEw\""
7858bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      "    }"
7868bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      "  ]"
7878bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      "}";
788f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  UpdateSessionAndExpect(session_id, kJwksWithEmptyKeyId, REJECTED);
7895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ReleaseSession(session_id);
790a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
791a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace media
793