| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <string> | 5 #include <string> |
| 6 #include <vector> | 6 #include <vector> |
| 7 | 7 |
| 8 #include "base/basictypes.h" | 8 #include "base/basictypes.h" |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "media/base/decoder_buffer.h" | 10 #include "media/base/decoder_buffer.h" |
| (...skipping 20 matching lines...) Expand all Loading... |
| 31 | 31 |
| 32 // In the examples below, 'k'(key) has to be 16 bytes, and will always require | 32 // In the examples below, 'k'(key) has to be 16 bytes, and will always require |
| 33 // 2 bytes of padding. 'kid'(keyid) is variable length, and may require 0, 1, | 33 // 2 bytes of padding. 'kid'(keyid) is variable length, and may require 0, 1, |
| 34 // or 2 bytes of padding. | 34 // or 2 bytes of padding. |
| 35 | 35 |
| 36 const uint8 kKeyId[] = { | 36 const uint8 kKeyId[] = { |
| 37 // base64 equivalent is AAECAw | 37 // base64 equivalent is AAECAw |
| 38 0x00, 0x01, 0x02, 0x03 | 38 0x00, 0x01, 0x02, 0x03 |
| 39 }; | 39 }; |
| 40 | 40 |
| 41 const uint8 kKey[] = { | 41 // Key is 0x0405060708090a0b0c0d0e0f10111213, |
| 42 // base64 equivalent is BAUGBwgJCgsMDQ4PEBESEw | 42 // base64 equivalent is BAUGBwgJCgsMDQ4PEBESEw. |
| 43 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, | |
| 44 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13 | |
| 45 }; | |
| 46 | |
| 47 const char kKeyAsJWK[] = | 43 const char kKeyAsJWK[] = |
| 48 "{" | 44 "{" |
| 49 " \"keys\": [" | 45 " \"keys\": [" |
| 50 " {" | 46 " {" |
| 51 " \"kty\": \"oct\"," | 47 " \"kty\": \"oct\"," |
| 52 " \"kid\": \"AAECAw\"," | 48 " \"kid\": \"AAECAw\"," |
| 53 " \"k\": \"BAUGBwgJCgsMDQ4PEBESEw\"" | 49 " \"k\": \"BAUGBwgJCgsMDQ4PEBESEw\"" |
| 54 " }" | 50 " }" |
| 55 " ]" | 51 " ]" |
| 56 "}"; | 52 "}"; |
| (...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 218 EXPECT_CALL(*this, KeyMessage(reference_id_, key_id, "")); | 214 EXPECT_CALL(*this, KeyMessage(reference_id_, key_id, "")); |
| 219 EXPECT_TRUE(decryptor_.GenerateKeyRequest( | 215 EXPECT_TRUE(decryptor_.GenerateKeyRequest( |
| 220 reference_id_, std::string(), &key_id[0], key_id.size())); | 216 reference_id_, std::string(), &key_id[0], key_id.size())); |
| 221 } | 217 } |
| 222 | 218 |
| 223 enum AddKeyExpectation { | 219 enum AddKeyExpectation { |
| 224 KEY_ADDED, | 220 KEY_ADDED, |
| 225 KEY_ERROR | 221 KEY_ERROR |
| 226 }; | 222 }; |
| 227 | 223 |
| 228 void AddRawKeyAndExpect(const std::vector<uint8>& key_id, | |
| 229 const std::vector<uint8>& key, | |
| 230 AddKeyExpectation result) { | |
| 231 // TODO(jrummell): Remove once raw keys no longer supported. | |
| 232 DCHECK(!key_id.empty()); | |
| 233 DCHECK(!key.empty()); | |
| 234 | |
| 235 if (result == KEY_ADDED) { | |
| 236 EXPECT_CALL(*this, KeyAdded(reference_id_)); | |
| 237 } else if (result == KEY_ERROR) { | |
| 238 EXPECT_CALL(*this, KeyError(reference_id_, MediaKeys::kUnknownError, 0)); | |
| 239 } else { | |
| 240 NOTREACHED(); | |
| 241 } | |
| 242 | |
| 243 decryptor_.AddKey( | |
| 244 reference_id_, &key[0], key.size(), &key_id[0], key_id.size()); | |
| 245 } | |
| 246 | |
| 247 void AddKeyAndExpect(const std::string& key, AddKeyExpectation result) { | 224 void AddKeyAndExpect(const std::string& key, AddKeyExpectation result) { |
| 248 DCHECK(!key.empty()); | 225 DCHECK(!key.empty()); |
| 249 | 226 |
| 250 if (result == KEY_ADDED) { | 227 if (result == KEY_ADDED) { |
| 251 EXPECT_CALL(*this, KeyAdded(reference_id_)); | 228 EXPECT_CALL(*this, KeyAdded(reference_id_)); |
| 252 } else if (result == KEY_ERROR) { | 229 } else if (result == KEY_ERROR) { |
| 253 EXPECT_CALL(*this, KeyError(reference_id_, MediaKeys::kUnknownError, 0)); | 230 EXPECT_CALL(*this, KeyError(reference_id_, MediaKeys::kUnknownError, 0)); |
| 254 } else { | 231 } else { |
| 255 NOTREACHED(); | 232 NOTREACHED(); |
| 256 } | 233 } |
| (...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 409 encrypted_buffer, original_data_, DATA_MISMATCH)); | 386 encrypted_buffer, original_data_, DATA_MISMATCH)); |
| 410 | 387 |
| 411 AddKeyAndExpect(kKeyAsJWK, KEY_ADDED); | 388 AddKeyAndExpect(kKeyAsJWK, KEY_ADDED); |
| 412 ASSERT_NO_FATAL_FAILURE( | 389 ASSERT_NO_FATAL_FAILURE( |
| 413 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS)); | 390 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS)); |
| 414 } | 391 } |
| 415 | 392 |
| 416 TEST_F(AesDecryptorTest, WrongSizedKey) { | 393 TEST_F(AesDecryptorTest, WrongSizedKey) { |
| 417 GenerateKeyRequest(key_id_); | 394 GenerateKeyRequest(key_id_); |
| 418 AddKeyAndExpect(kWrongSizedKeyAsJWK, KEY_ERROR); | 395 AddKeyAndExpect(kWrongSizedKeyAsJWK, KEY_ERROR); |
| 419 | |
| 420 // Repeat for a raw key. Use "-1" to create a wrong sized key. | |
| 421 std::vector<uint8> wrong_sized_key(kKey, kKey + arraysize(kKey) - 1); | |
| 422 AddRawKeyAndExpect(key_id_, wrong_sized_key, KEY_ERROR); | |
| 423 } | 396 } |
| 424 | 397 |
| 425 TEST_F(AesDecryptorTest, MultipleKeysAndFrames) { | 398 TEST_F(AesDecryptorTest, MultipleKeysAndFrames) { |
| 426 GenerateKeyRequest(key_id_); | 399 GenerateKeyRequest(key_id_); |
| 427 AddKeyAndExpect(kKeyAsJWK, KEY_ADDED); | 400 AddKeyAndExpect(kKeyAsJWK, KEY_ADDED); |
| 428 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( | 401 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( |
| 429 encrypted_data_, key_id_, iv_, 10, no_subsample_entries_); | 402 encrypted_data_, key_id_, iv_, 10, no_subsample_entries_); |
| 430 ASSERT_NO_FATAL_FAILURE( | 403 ASSERT_NO_FATAL_FAILURE( |
| 431 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS)); | 404 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS)); |
| 432 | 405 |
| (...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 680 " {" | 653 " {" |
| 681 " \"kty\": \"oct\"," | 654 " \"kty\": \"oct\"," |
| 682 " \"kid\": \"\"," | 655 " \"kid\": \"\"," |
| 683 " \"k\": \"BAUGBwgJCgsMDQ4PEBESEw\"" | 656 " \"k\": \"BAUGBwgJCgsMDQ4PEBESEw\"" |
| 684 " }" | 657 " }" |
| 685 " ]" | 658 " ]" |
| 686 "}"; | 659 "}"; |
| 687 AddKeyAndExpect(key8, KEY_ERROR); | 660 AddKeyAndExpect(key8, KEY_ERROR); |
| 688 } | 661 } |
| 689 | 662 |
| 690 TEST_F(AesDecryptorTest, RawKey) { | |
| 691 // Verify that v0.1b keys (raw key) is still supported. Raw keys are | |
| 692 // 16 bytes long. Use the undecoded value of |kKey|. | |
| 693 GenerateKeyRequest(key_id_); | |
| 694 AddRawKeyAndExpect( | |
| 695 key_id_, std::vector<uint8>(kKey, kKey + arraysize(kKey)), KEY_ADDED); | |
| 696 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( | |
| 697 encrypted_data_, key_id_, iv_, 0, no_subsample_entries_); | |
| 698 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS); | |
| 699 } | |
| 700 | |
| 701 } // namespace media | 663 } // namespace media |
| OLD | NEW |