aes_decryptor_unittest.cc revision 68043e1e95eeb07d5cae7aca370b26518b0867d6
1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include <string>
6#include <vector>
7
8#include "base/basictypes.h"
9#include "base/bind.h"
10#include "media/base/decoder_buffer.h"
11#include "media/base/decrypt_config.h"
12#include "media/base/mock_filters.h"
13#include "media/cdm/aes_decryptor.h"
14#include "media/webm/webm_constants.h"
15#include "testing/gmock/include/gmock/gmock.h"
16#include "testing/gtest/include/gtest/gtest.h"
17
18using ::testing::_;
19using ::testing::Gt;
20using ::testing::IsNull;
21using ::testing::NotNull;
22using ::testing::SaveArg;
23using ::testing::StrNe;
24
25MATCHER(IsEmpty, "") { return arg.empty(); }
26
27namespace media {
28
29const uint8 kOriginalData[] = "Original subsample data.";
30const int kOriginalDataSize = 24;
31
32const uint8 kKeyId[] = {
33    // base64 equivalent is AAECAw==
34    0x00, 0x01, 0x02, 0x03
35};
36
37const uint8 kKey[] = {
38    // base64 equivalent is BAUGBwgJCgsMDQ4PEBESEw==
39    0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
40    0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13
41};
42
43const char kKeyAsJWK[] =
44    "{"
45    "  \"keys\": ["
46    "    {"
47    "      \"kty\": \"oct\","
48    "      \"kid\": \"AAECAw==\","
49    "      \"k\": \"BAUGBwgJCgsMDQ4PEBESEw==\""
50    "    }"
51    "  ]"
52    "}";
53
54const char kWrongKeyAsJWK[] =
55    "{"
56    "  \"keys\": ["
57    "    {"
58    "      \"kty\": \"oct\","
59    "      \"kid\": \"AAECAw==\","
60    "      \"k\": \"7u7u7u7u7u7u7u7u7u7u7g==\""
61    "    }"
62    "  ]"
63    "}";
64
65const char kWrongSizedKeyAsJWK[] =
66    "{"
67    "  \"keys\": ["
68    "    {"
69    "      \"kty\": \"oct\","
70    "      \"kid\": \"AAECAw==\","
71    "      \"k\": \"AAECAw==\""
72    "    }"
73    "  ]"
74    "}";
75
76const uint8 kIv[] = {
77  0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
78  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
79};
80
81// kOriginalData encrypted with kKey and kIv but without any subsamples (or
82// equivalently using kSubsampleEntriesCypherOnly).
83const uint8 kEncryptedData[] = {
84  0x2f, 0x03, 0x09, 0xef, 0x71, 0xaf, 0x31, 0x16,
85  0xfa, 0x9d, 0x18, 0x43, 0x1e, 0x96, 0x71, 0xb5,
86  0xbf, 0xf5, 0x30, 0x53, 0x9a, 0x20, 0xdf, 0x95
87};
88
89// kOriginalData encrypted with kSubsampleKey and kSubsampleIv using
90// kSubsampleEntriesNormal.
91const uint8 kSubsampleEncryptedData[] = {
92  0x4f, 0x72, 0x09, 0x16, 0x09, 0xe6, 0x79, 0xad,
93  0x70, 0x73, 0x75, 0x62, 0x09, 0xbb, 0x83, 0x1d,
94  0x4d, 0x08, 0xd7, 0x78, 0xa4, 0xa7, 0xf1, 0x2e
95};
96
97const uint8 kOriginalData2[] = "Changed Original data.";
98
99const uint8 kIv2[] = {
100  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
101  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
102};
103
104const uint8 kKeyId2[] = {
105    // base64 equivalent is AAECAwQFBgcICQoLDA0ODxAREhM=
106    0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
107    0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
108    0x10, 0x11, 0x12, 0x13
109};
110
111const char kKey2AsJWK[] =
112    "{"
113    "  \"keys\": ["
114    "    {"
115    "      \"kty\": \"oct\","
116    "      \"kid\": \"AAECAwQFBgcICQoLDA0ODxAREhM=\","
117    "      \"k\": \"FBUWFxgZGhscHR4fICEiIw==\""
118    "    }"
119    "  ]"
120    "}";
121
122// 'k' in bytes is x14x15x16x17x18x19x1ax1bx1cx1dx1ex1fx20x21x22x23
123
124const uint8 kEncryptedData2[] = {
125  0x57, 0x66, 0xf4, 0x12, 0x1a, 0xed, 0xb5, 0x79,
126  0x1c, 0x8e, 0x25, 0xd7, 0x17, 0xe7, 0x5e, 0x16,
127  0xe3, 0x40, 0x08, 0x27, 0x11, 0xe9
128};
129
130// Subsample entries for testing. The sum of |cypher_bytes| and |clear_bytes| of
131// all entries must be equal to kOriginalDataSize to make the subsample entries
132// valid.
133
134const SubsampleEntry kSubsampleEntriesNormal[] = {
135  { 2, 7 },
136  { 3, 11 },
137  { 1, 0 }
138};
139
140const SubsampleEntry kSubsampleEntriesWrongSize[] = {
141  { 3, 6 }, // This entry doesn't match the correct entry.
142  { 3, 11 },
143  { 1, 0 }
144};
145
146const SubsampleEntry kSubsampleEntriesInvalidTotalSize[] = {
147  { 1, 1000 }, // This entry is too large.
148  { 3, 11 },
149  { 1, 0 }
150};
151
152const SubsampleEntry kSubsampleEntriesClearOnly[] = {
153  { 7, 0 },
154  { 8, 0 },
155  { 9, 0 }
156};
157
158const SubsampleEntry kSubsampleEntriesCypherOnly[] = {
159  { 0, 6 },
160  { 0, 8 },
161  { 0, 10 }
162};
163
164static scoped_refptr<DecoderBuffer> CreateEncryptedBuffer(
165    const std::vector<uint8>& data,
166    const std::vector<uint8>& key_id,
167    const std::vector<uint8>& iv,
168    int offset,
169    const std::vector<SubsampleEntry>& subsample_entries) {
170  DCHECK(!data.empty());
171  int padded_size = offset + data.size();
172  scoped_refptr<DecoderBuffer> encrypted_buffer(new DecoderBuffer(padded_size));
173  memcpy(encrypted_buffer->writable_data() + offset, &data[0], data.size());
174  CHECK(encrypted_buffer.get());
175  std::string key_id_string(
176      reinterpret_cast<const char*>(key_id.empty() ? NULL : &key_id[0]),
177      key_id.size());
178  std::string iv_string(
179      reinterpret_cast<const char*>(iv.empty() ? NULL : &iv[0]), iv.size());
180  encrypted_buffer->set_decrypt_config(scoped_ptr<DecryptConfig>(
181      new DecryptConfig(key_id_string, iv_string, offset, subsample_entries)));
182  return encrypted_buffer;
183}
184
185class AesDecryptorTest : public testing::Test {
186 public:
187  AesDecryptorTest()
188      : decryptor_(
189            base::Bind(&AesDecryptorTest::KeyAdded, base::Unretained(this)),
190            base::Bind(&AesDecryptorTest::KeyError, base::Unretained(this)),
191            base::Bind(&AesDecryptorTest::KeyMessage, base::Unretained(this))),
192        decrypt_cb_(base::Bind(&AesDecryptorTest::BufferDecrypted,
193                               base::Unretained(this))),
194        original_data_(kOriginalData, kOriginalData + kOriginalDataSize),
195        encrypted_data_(kEncryptedData,
196                        kEncryptedData + arraysize(kEncryptedData)),
197        subsample_encrypted_data_(
198            kSubsampleEncryptedData,
199            kSubsampleEncryptedData + arraysize(kSubsampleEncryptedData)),
200        key_id_(kKeyId, kKeyId + arraysize(kKeyId)),
201        iv_(kIv, kIv + arraysize(kIv)),
202        normal_subsample_entries_(
203            kSubsampleEntriesNormal,
204            kSubsampleEntriesNormal + arraysize(kSubsampleEntriesNormal)) {
205  }
206
207 protected:
208  void GenerateKeyRequest(const std::vector<uint8>& key_id) {
209    DCHECK(!key_id.empty());
210    EXPECT_CALL(*this, KeyMessage(StrNe(std::string()), key_id, ""))
211        .WillOnce(SaveArg<0>(&session_id_string_));
212    EXPECT_TRUE(decryptor_.GenerateKeyRequest(
213        std::string(), &key_id[0], key_id.size()));
214  }
215
216  enum AddKeyExpectation {
217    KEY_ADDED,
218    KEY_ERROR
219  };
220
221  void AddRawKeyAndExpect(const std::vector<uint8>& key_id,
222                          const std::vector<uint8>& key,
223                          AddKeyExpectation result) {
224    // TODO(jrummell): Remove once raw keys no longer supported.
225    DCHECK(!key_id.empty());
226    DCHECK(!key.empty());
227
228    if (result == KEY_ADDED) {
229      EXPECT_CALL(*this, KeyAdded(session_id_string_));
230    } else if (result == KEY_ERROR) {
231      EXPECT_CALL(*this, KeyError(session_id_string_,
232                                  MediaKeys::kUnknownError, 0));
233    } else {
234      NOTREACHED();
235    }
236
237    decryptor_.AddKey(&key[0], key.size(), &key_id[0], key_id.size(),
238                      session_id_string_);
239  }
240
241  void AddKeyAndExpect(const std::string& key, AddKeyExpectation result) {
242    DCHECK(!key.empty());
243
244    if (result == KEY_ADDED) {
245      EXPECT_CALL(*this, KeyAdded(session_id_string_));
246    } else if (result == KEY_ERROR) {
247      EXPECT_CALL(*this,
248                  KeyError(session_id_string_, MediaKeys::kUnknownError, 0));
249    } else {
250      NOTREACHED();
251    }
252
253    decryptor_.AddKey(reinterpret_cast<const uint8*>(key.c_str()), key.length(),
254                      NULL, 0,
255                      session_id_string_);
256  }
257
258  MOCK_METHOD2(BufferDecrypted, void(Decryptor::Status,
259                                     const scoped_refptr<DecoderBuffer>&));
260
261  enum DecryptExpectation {
262    SUCCESS,
263    DATA_MISMATCH,
264    DATA_AND_SIZE_MISMATCH,
265    DECRYPT_ERROR
266  };
267
268  void DecryptAndExpect(const scoped_refptr<DecoderBuffer>& encrypted,
269                        const std::vector<uint8>& plain_text,
270                        DecryptExpectation result) {
271    scoped_refptr<DecoderBuffer> decrypted;
272
273    if (result != DECRYPT_ERROR) {
274      EXPECT_CALL(*this, BufferDecrypted(Decryptor::kSuccess, NotNull()))
275          .WillOnce(SaveArg<1>(&decrypted));
276    } else {
277      EXPECT_CALL(*this, BufferDecrypted(Decryptor::kError, IsNull()))
278          .WillOnce(SaveArg<1>(&decrypted));
279    }
280
281    decryptor_.Decrypt(Decryptor::kVideo, encrypted, decrypt_cb_);
282
283    std::vector<uint8> decrypted_text;
284    if (decrypted && decrypted->data_size()) {
285      decrypted_text.assign(
286        decrypted->data(), decrypted->data() + decrypted->data_size());
287    }
288
289    switch (result) {
290      case SUCCESS:
291        EXPECT_EQ(plain_text, decrypted_text);
292        break;
293      case DATA_MISMATCH:
294        EXPECT_EQ(plain_text.size(), decrypted_text.size());
295        EXPECT_NE(plain_text, decrypted_text);
296        break;
297      case DATA_AND_SIZE_MISMATCH:
298        EXPECT_NE(plain_text.size(), decrypted_text.size());
299        break;
300      case DECRYPT_ERROR:
301        EXPECT_TRUE(decrypted_text.empty());
302        break;
303    }
304  }
305
306  MOCK_METHOD1(KeyAdded, void(const std::string&));
307  MOCK_METHOD3(KeyError, void(const std::string&,
308                              MediaKeys::KeyError, int));
309  MOCK_METHOD3(KeyMessage, void(const std::string& session_id,
310                                const std::vector<uint8>& message,
311                                const std::string& default_url));
312
313  AesDecryptor decryptor_;
314  std::string session_id_string_;
315  AesDecryptor::DecryptCB decrypt_cb_;
316
317  // Constants for testing.
318  const std::vector<uint8> original_data_;
319  const std::vector<uint8> encrypted_data_;
320  const std::vector<uint8> subsample_encrypted_data_;
321  const std::vector<uint8> key_id_;
322  const std::vector<uint8> iv_;
323  const std::vector<SubsampleEntry> normal_subsample_entries_;
324  const std::vector<SubsampleEntry> no_subsample_entries_;
325};
326
327TEST_F(AesDecryptorTest, GenerateKeyRequestWithNullInitData) {
328  EXPECT_CALL(*this, KeyMessage(StrNe(std::string()), IsEmpty(), ""));
329  EXPECT_TRUE(decryptor_.GenerateKeyRequest(std::string(), NULL, 0));
330}
331
332TEST_F(AesDecryptorTest, NormalDecryption) {
333  GenerateKeyRequest(key_id_);
334  AddKeyAndExpect(kKeyAsJWK, KEY_ADDED);
335  scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
336      encrypted_data_, key_id_, iv_, 0, no_subsample_entries_);
337  DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS);
338}
339
340TEST_F(AesDecryptorTest, DecryptionWithOffset) {
341  GenerateKeyRequest(key_id_);
342  AddKeyAndExpect(kKeyAsJWK, KEY_ADDED);
343  scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
344      encrypted_data_, key_id_, iv_, 23, no_subsample_entries_);
345  DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS);
346}
347
348TEST_F(AesDecryptorTest, UnencryptedFrame) {
349  // An empty iv string signals that the frame is unencrypted.
350  scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
351      original_data_, key_id_, std::vector<uint8>(), 0, no_subsample_entries_);
352  DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS);
353}
354
355TEST_F(AesDecryptorTest, WrongKey) {
356  GenerateKeyRequest(key_id_);
357  AddKeyAndExpect(kWrongKeyAsJWK, KEY_ADDED);
358  scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
359      encrypted_data_, key_id_, iv_, 0, no_subsample_entries_);
360  DecryptAndExpect(encrypted_buffer, original_data_, DATA_MISMATCH);
361}
362
363TEST_F(AesDecryptorTest, NoKey) {
364  scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
365      encrypted_data_, key_id_, iv_, 0, no_subsample_entries_);
366  EXPECT_CALL(*this, BufferDecrypted(AesDecryptor::kNoKey, IsNull()));
367  decryptor_.Decrypt(Decryptor::kVideo, encrypted_buffer, decrypt_cb_);
368}
369
370TEST_F(AesDecryptorTest, KeyReplacement) {
371  GenerateKeyRequest(key_id_);
372  scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
373      encrypted_data_, key_id_, iv_, 0, no_subsample_entries_);
374
375  AddKeyAndExpect(kWrongKeyAsJWK, KEY_ADDED);
376  ASSERT_NO_FATAL_FAILURE(DecryptAndExpect(
377      encrypted_buffer, original_data_, DATA_MISMATCH));
378
379  AddKeyAndExpect(kKeyAsJWK, KEY_ADDED);
380  ASSERT_NO_FATAL_FAILURE(
381      DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS));
382}
383
384TEST_F(AesDecryptorTest, WrongSizedKey) {
385  GenerateKeyRequest(key_id_);
386  AddKeyAndExpect(kWrongSizedKeyAsJWK, KEY_ERROR);
387
388  // Repeat for a raw key. Use "-1" to create a wrong sized key.
389  std::vector<uint8> wrong_sized_key(kKey, kKey + arraysize(kKey) - 1);
390  AddRawKeyAndExpect(key_id_, wrong_sized_key, KEY_ERROR);
391}
392
393TEST_F(AesDecryptorTest, MultipleKeysAndFrames) {
394  GenerateKeyRequest(key_id_);
395  AddKeyAndExpect(kKeyAsJWK, KEY_ADDED);
396  scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
397      encrypted_data_, key_id_, iv_, 10, no_subsample_entries_);
398  ASSERT_NO_FATAL_FAILURE(
399      DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS));
400
401  AddKeyAndExpect(kKey2AsJWK, KEY_ADDED);
402
403  // The first key is still available after we added a second key.
404  ASSERT_NO_FATAL_FAILURE(
405      DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS));
406
407  // The second key is also available.
408  encrypted_buffer = CreateEncryptedBuffer(
409      std::vector<uint8>(kEncryptedData2,
410                         kEncryptedData2 + arraysize(kEncryptedData2)),
411      std::vector<uint8>(kKeyId2, kKeyId2 + arraysize(kKeyId2)),
412      std::vector<uint8>(kIv2, kIv2 + arraysize(kIv2)),
413      30,
414      no_subsample_entries_);
415  ASSERT_NO_FATAL_FAILURE(DecryptAndExpect(
416      encrypted_buffer,
417      std::vector<uint8>(kOriginalData2,
418                         kOriginalData2 + arraysize(kOriginalData2) - 1),
419      SUCCESS));
420}
421
422TEST_F(AesDecryptorTest, CorruptedIv) {
423  GenerateKeyRequest(key_id_);
424  AddKeyAndExpect(kKeyAsJWK, KEY_ADDED);
425
426  std::vector<uint8> bad_iv = iv_;
427  bad_iv[1]++;
428
429  scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
430      encrypted_data_, key_id_, bad_iv, 0, no_subsample_entries_);
431
432  DecryptAndExpect(encrypted_buffer, original_data_, DATA_MISMATCH);
433}
434
435TEST_F(AesDecryptorTest, CorruptedData) {
436  GenerateKeyRequest(key_id_);
437  AddKeyAndExpect(kKeyAsJWK, KEY_ADDED);
438
439  std::vector<uint8> bad_data = encrypted_data_;
440  bad_data[1]++;
441
442  scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
443      bad_data, key_id_, iv_, 0, no_subsample_entries_);
444  DecryptAndExpect(encrypted_buffer, original_data_, DATA_MISMATCH);
445}
446
447TEST_F(AesDecryptorTest, EncryptedAsUnencryptedFailure) {
448  GenerateKeyRequest(key_id_);
449  AddKeyAndExpect(kKeyAsJWK, KEY_ADDED);
450  scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
451      encrypted_data_, key_id_, std::vector<uint8>(), 0, no_subsample_entries_);
452  DecryptAndExpect(encrypted_buffer, original_data_, DATA_MISMATCH);
453}
454
455TEST_F(AesDecryptorTest, SubsampleDecryption) {
456  GenerateKeyRequest(key_id_);
457  AddKeyAndExpect(kKeyAsJWK, KEY_ADDED);
458  scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
459      subsample_encrypted_data_, key_id_, iv_, 0, normal_subsample_entries_);
460  DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS);
461}
462
463// Ensures noninterference of data offset and subsample mechanisms. We never
464// expect to encounter this in the wild, but since the DecryptConfig doesn't
465// disallow such a configuration, it should be covered.
466TEST_F(AesDecryptorTest, SubsampleDecryptionWithOffset) {
467  GenerateKeyRequest(key_id_);
468  AddKeyAndExpect(kKeyAsJWK, KEY_ADDED);
469  scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
470      subsample_encrypted_data_, key_id_, iv_, 23, normal_subsample_entries_);
471  DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS);
472}
473
474TEST_F(AesDecryptorTest, SubsampleWrongSize) {
475  GenerateKeyRequest(key_id_);
476  AddKeyAndExpect(kKeyAsJWK, KEY_ADDED);
477
478  std::vector<SubsampleEntry> subsample_entries_wrong_size(
479      kSubsampleEntriesWrongSize,
480      kSubsampleEntriesWrongSize + arraysize(kSubsampleEntriesWrongSize));
481
482  scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
483      subsample_encrypted_data_, key_id_, iv_, 0, subsample_entries_wrong_size);
484  DecryptAndExpect(encrypted_buffer, original_data_, DATA_MISMATCH);
485}
486
487TEST_F(AesDecryptorTest, SubsampleInvalidTotalSize) {
488  GenerateKeyRequest(key_id_);
489  AddKeyAndExpect(kKeyAsJWK, KEY_ADDED);
490
491  std::vector<SubsampleEntry> subsample_entries_invalid_total_size(
492      kSubsampleEntriesInvalidTotalSize,
493      kSubsampleEntriesInvalidTotalSize +
494          arraysize(kSubsampleEntriesInvalidTotalSize));
495
496  scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
497      subsample_encrypted_data_, key_id_, iv_, 0,
498      subsample_entries_invalid_total_size);
499  DecryptAndExpect(encrypted_buffer, original_data_, DECRYPT_ERROR);
500}
501
502// No cypher bytes in any of the subsamples.
503TEST_F(AesDecryptorTest, SubsampleClearBytesOnly) {
504  GenerateKeyRequest(key_id_);
505  AddKeyAndExpect(kKeyAsJWK, KEY_ADDED);
506
507  std::vector<SubsampleEntry> clear_only_subsample_entries(
508      kSubsampleEntriesClearOnly,
509      kSubsampleEntriesClearOnly + arraysize(kSubsampleEntriesClearOnly));
510
511  scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
512      original_data_, key_id_, iv_, 0, clear_only_subsample_entries);
513  DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS);
514}
515
516// No clear bytes in any of the subsamples.
517TEST_F(AesDecryptorTest, SubsampleCypherBytesOnly) {
518  GenerateKeyRequest(key_id_);
519  AddKeyAndExpect(kKeyAsJWK, KEY_ADDED);
520
521  std::vector<SubsampleEntry> cypher_only_subsample_entries(
522      kSubsampleEntriesCypherOnly,
523      kSubsampleEntriesCypherOnly + arraysize(kSubsampleEntriesCypherOnly));
524
525  scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
526      encrypted_data_, key_id_, iv_, 0, cypher_only_subsample_entries);
527  DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS);
528}
529
530TEST_F(AesDecryptorTest, JWKKey) {
531  // Try a simple JWK key (i.e. not in a set)
532  const std::string key1 =
533      "{"
534      "  \"kty\": \"oct\","
535      "  \"kid\": \"AAECAwQFBgcICQoLDA0ODxAREhM=\","
536      "  \"k\": \"FBUWFxgZGhscHR4fICEiIw==\""
537      "}";
538  AddKeyAndExpect(key1, KEY_ERROR);
539
540  // Try a key list with multiple entries.
541  const std::string key2 =
542      "{"
543      "  \"keys\": ["
544      "    {"
545      "      \"kty\": \"oct\","
546      "      \"kid\": \"AAECAwQFBgcICQoLDA0ODxAREhM=\","
547      "      \"k\": \"FBUWFxgZGhscHR4fICEiIw==\""
548      "    },"
549      "    {"
550      "      \"kty\": \"oct\","
551      "      \"kid\": \"JCUmJygpKissLS4vMA==\","
552      "      \"k\":\"MTIzNDU2Nzg5Ojs8PT4/QA==\""
553      "    }"
554      "  ]"
555      "}";
556  AddKeyAndExpect(key2, KEY_ADDED);
557
558  // Try a key with no spaces and some \n plus additional fields.
559  const std::string key3 =
560      "\n\n{\"something\":1,\"keys\":[{\n\n\"kty\":\"oct\",\"alg\":\"A128KW\","
561      "\"kid\":\"AAECAwQFBgcICQoLDA0ODxAREhM=\",\"k\":\"GawgguFyGrWKav7AX4VKUg="
562      "=\",\"foo\":\"bar\"}]}\n\n";
563  AddKeyAndExpect(key3, KEY_ADDED);
564
565  // Try some non-ASCII characters.
566  AddKeyAndExpect("This is not ASCII due to \xff\xfe\xfd in it.", KEY_ERROR);
567
568  // Try a badly formatted key. Assume that the JSON parser is fully tested,
569  // so we won't try a lot of combinations. However, need a test to ensure
570  // that the code doesn't crash if invalid JSON received.
571  AddKeyAndExpect("This is not a JSON key.", KEY_ERROR);
572
573  // Try passing some valid JSON that is not a dictionary at the top level.
574  AddKeyAndExpect("40", KEY_ERROR);
575
576  // Try an empty dictionary.
577  AddKeyAndExpect("{ }", KEY_ERROR);
578
579  // Try an empty 'keys' dictionary.
580  AddKeyAndExpect("{ \"keys\": [] }", KEY_ERROR);
581
582  // Try with 'keys' not a dictionary.
583  AddKeyAndExpect("{ \"keys\":\"1\" }", KEY_ERROR);
584
585  // Try with 'keys' a list of integers.
586  AddKeyAndExpect("{ \"keys\": [ 1, 2, 3 ] }", KEY_ERROR);
587
588  // Try a key missing padding(=) at end of base64 string.
589  const std::string key4 =
590      "{"
591      "  \"keys\": ["
592      "    {"
593      "      \"kty\": \"oct\","
594      "      \"kid\": \"AAECAw==\","
595      "      \"k\": \"BAUGBwgJCgsMDQ4PEBESEw\""
596      "    }"
597      "  ]"
598      "}";
599  AddKeyAndExpect(key4, KEY_ERROR);
600
601  // Try a key ID missing padding(=) at end of base64 string.
602  const std::string key5 =
603      "{"
604      "  \"keys\": ["
605      "    {"
606      "      \"kty\": \"oct\","
607      "      \"kid\": \"AAECAw\","
608      "      \"k\": \"BAUGBwgJCgsMDQ4PEBESEw==\""
609      "    }"
610      "  ]"
611      "}";
612  AddKeyAndExpect(key5, KEY_ERROR);
613
614  // Try a key with invalid base64 encoding.
615  const std::string key6 =
616      "{"
617      "  \"keys\": ["
618      "    {"
619      "      \"kty\": \"oct\","
620      "      \"kid\": \"!@#$%^&*()==\","
621      "      \"k\": \"BAUGBwgJCgsMDQ4PEBESEw==\""
622      "    }"
623      "  ]"
624      "}";
625  AddKeyAndExpect(key6, KEY_ERROR);
626}
627
628TEST_F(AesDecryptorTest, RawKey) {
629  // Verify that v0.1b keys (raw key) is still supported. Raw keys are
630  // 16 bytes long. Use the undecoded value of |kKey|.
631  GenerateKeyRequest(key_id_);
632  AddRawKeyAndExpect(
633      key_id_, std::vector<uint8>(kKey, kKey + arraysize(kKey)), KEY_ADDED);
634  scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer(
635      encrypted_data_, key_id_, iv_, 0, no_subsample_entries_);
636  DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS);
637}
638
639}  // namespace media
640