| 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 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 170 const SubsampleEntry kSubsampleEntriesCypherOnly[] = { | 170 const SubsampleEntry kSubsampleEntriesCypherOnly[] = { |
| 171 { 0, 6 }, | 171 { 0, 6 }, |
| 172 { 0, 8 }, | 172 { 0, 8 }, |
| 173 { 0, 10 } | 173 { 0, 10 } |
| 174 }; | 174 }; |
| 175 | 175 |
| 176 static scoped_refptr<DecoderBuffer> CreateEncryptedBuffer( | 176 static scoped_refptr<DecoderBuffer> CreateEncryptedBuffer( |
| 177 const std::vector<uint8>& data, | 177 const std::vector<uint8>& data, |
| 178 const std::vector<uint8>& key_id, | 178 const std::vector<uint8>& key_id, |
| 179 const std::vector<uint8>& iv, | 179 const std::vector<uint8>& iv, |
| 180 int offset, | |
| 181 const std::vector<SubsampleEntry>& subsample_entries) { | 180 const std::vector<SubsampleEntry>& subsample_entries) { |
| 182 DCHECK(!data.empty()); | 181 DCHECK(!data.empty()); |
| 183 int padded_size = offset + data.size(); | 182 scoped_refptr<DecoderBuffer> encrypted_buffer(new DecoderBuffer(data.size())); |
| 184 scoped_refptr<DecoderBuffer> encrypted_buffer(new DecoderBuffer(padded_size)); | 183 memcpy(encrypted_buffer->writable_data(), &data[0], data.size()); |
| 185 memcpy(encrypted_buffer->writable_data() + offset, &data[0], data.size()); | |
| 186 CHECK(encrypted_buffer.get()); | 184 CHECK(encrypted_buffer.get()); |
| 187 std::string key_id_string( | 185 std::string key_id_string( |
| 188 reinterpret_cast<const char*>(key_id.empty() ? NULL : &key_id[0]), | 186 reinterpret_cast<const char*>(key_id.empty() ? NULL : &key_id[0]), |
| 189 key_id.size()); | 187 key_id.size()); |
| 190 std::string iv_string( | 188 std::string iv_string( |
| 191 reinterpret_cast<const char*>(iv.empty() ? NULL : &iv[0]), iv.size()); | 189 reinterpret_cast<const char*>(iv.empty() ? NULL : &iv[0]), iv.size()); |
| 192 encrypted_buffer->set_decrypt_config(scoped_ptr<DecryptConfig>( | 190 encrypted_buffer->set_decrypt_config(scoped_ptr<DecryptConfig>( |
| 193 new DecryptConfig(key_id_string, iv_string, offset, subsample_entries))); | 191 new DecryptConfig(key_id_string, iv_string, subsample_entries))); |
| 194 return encrypted_buffer; | 192 return encrypted_buffer; |
| 195 } | 193 } |
| 196 | 194 |
| 197 class AesDecryptorTest : public testing::Test { | 195 class AesDecryptorTest : public testing::Test { |
| 198 public: | 196 public: |
| 199 AesDecryptorTest() | 197 AesDecryptorTest() |
| 200 : decryptor_(base::Bind(&AesDecryptorTest::OnSessionCreated, | 198 : decryptor_(base::Bind(&AesDecryptorTest::OnSessionCreated, |
| 201 base::Unretained(this)), | 199 base::Unretained(this)), |
| 202 base::Bind(&AesDecryptorTest::OnSessionMessage, | 200 base::Bind(&AesDecryptorTest::OnSessionMessage, |
| 203 base::Unretained(this)), | 201 base::Unretained(this)), |
| (...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 374 uint32 session_id3 = 23; | 372 uint32 session_id3 = 23; |
| 375 EXPECT_CALL(*this, OnSessionMessage(session_id3, IsEmpty(), "")); | 373 EXPECT_CALL(*this, OnSessionMessage(session_id3, IsEmpty(), "")); |
| 376 EXPECT_CALL(*this, OnSessionCreated(session_id3, StrNe(std::string()))); | 374 EXPECT_CALL(*this, OnSessionCreated(session_id3, StrNe(std::string()))); |
| 377 EXPECT_TRUE(decryptor_.CreateSession(session_id3, std::string(), NULL, 0)); | 375 EXPECT_TRUE(decryptor_.CreateSession(session_id3, std::string(), NULL, 0)); |
| 378 } | 376 } |
| 379 | 377 |
| 380 TEST_F(AesDecryptorTest, NormalDecryption) { | 378 TEST_F(AesDecryptorTest, NormalDecryption) { |
| 381 uint32 session_id = CreateSession(key_id_); | 379 uint32 session_id = CreateSession(key_id_); |
| 382 UpdateSessionAndExpect(session_id, kKeyAsJWK, SESSION_READY); | 380 UpdateSessionAndExpect(session_id, kKeyAsJWK, SESSION_READY); |
| 383 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( | 381 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( |
| 384 encrypted_data_, key_id_, iv_, 0, no_subsample_entries_); | 382 encrypted_data_, key_id_, iv_, no_subsample_entries_); |
| 385 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS); | |
| 386 } | |
| 387 | |
| 388 TEST_F(AesDecryptorTest, DecryptionWithOffset) { | |
| 389 uint32 session_id = CreateSession(key_id_); | |
| 390 UpdateSessionAndExpect(session_id, kKeyAsJWK, SESSION_READY); | |
| 391 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( | |
| 392 encrypted_data_, key_id_, iv_, 23, no_subsample_entries_); | |
| 393 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS); | 383 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS); |
| 394 } | 384 } |
| 395 | 385 |
| 396 TEST_F(AesDecryptorTest, UnencryptedFrame) { | 386 TEST_F(AesDecryptorTest, UnencryptedFrame) { |
| 397 // An empty iv string signals that the frame is unencrypted. | 387 // An empty iv string signals that the frame is unencrypted. |
| 398 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( | 388 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( |
| 399 original_data_, key_id_, std::vector<uint8>(), 0, no_subsample_entries_); | 389 original_data_, key_id_, std::vector<uint8>(), no_subsample_entries_); |
| 400 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS); | 390 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS); |
| 401 } | 391 } |
| 402 | 392 |
| 403 TEST_F(AesDecryptorTest, WrongKey) { | 393 TEST_F(AesDecryptorTest, WrongKey) { |
| 404 uint32 session_id = CreateSession(key_id_); | 394 uint32 session_id = CreateSession(key_id_); |
| 405 UpdateSessionAndExpect(session_id, kWrongKeyAsJWK, SESSION_READY); | 395 UpdateSessionAndExpect(session_id, kWrongKeyAsJWK, SESSION_READY); |
| 406 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( | 396 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( |
| 407 encrypted_data_, key_id_, iv_, 0, no_subsample_entries_); | 397 encrypted_data_, key_id_, iv_, no_subsample_entries_); |
| 408 DecryptAndExpect(encrypted_buffer, original_data_, DATA_MISMATCH); | 398 DecryptAndExpect(encrypted_buffer, original_data_, DATA_MISMATCH); |
| 409 } | 399 } |
| 410 | 400 |
| 411 TEST_F(AesDecryptorTest, NoKey) { | 401 TEST_F(AesDecryptorTest, NoKey) { |
| 412 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( | 402 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( |
| 413 encrypted_data_, key_id_, iv_, 0, no_subsample_entries_); | 403 encrypted_data_, key_id_, iv_, no_subsample_entries_); |
| 414 EXPECT_CALL(*this, BufferDecrypted(AesDecryptor::kNoKey, IsNull())); | 404 EXPECT_CALL(*this, BufferDecrypted(AesDecryptor::kNoKey, IsNull())); |
| 415 decryptor_.Decrypt(Decryptor::kVideo, encrypted_buffer, decrypt_cb_); | 405 decryptor_.Decrypt(Decryptor::kVideo, encrypted_buffer, decrypt_cb_); |
| 416 } | 406 } |
| 417 | 407 |
| 418 TEST_F(AesDecryptorTest, KeyReplacement) { | 408 TEST_F(AesDecryptorTest, KeyReplacement) { |
| 419 uint32 session_id = CreateSession(key_id_); | 409 uint32 session_id = CreateSession(key_id_); |
| 420 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( | 410 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( |
| 421 encrypted_data_, key_id_, iv_, 0, no_subsample_entries_); | 411 encrypted_data_, key_id_, iv_, no_subsample_entries_); |
| 422 | 412 |
| 423 UpdateSessionAndExpect(session_id, kWrongKeyAsJWK, SESSION_READY); | 413 UpdateSessionAndExpect(session_id, kWrongKeyAsJWK, SESSION_READY); |
| 424 ASSERT_NO_FATAL_FAILURE(DecryptAndExpect( | 414 ASSERT_NO_FATAL_FAILURE(DecryptAndExpect( |
| 425 encrypted_buffer, original_data_, DATA_MISMATCH)); | 415 encrypted_buffer, original_data_, DATA_MISMATCH)); |
| 426 | 416 |
| 427 UpdateSessionAndExpect(session_id, kKeyAsJWK, SESSION_READY); | 417 UpdateSessionAndExpect(session_id, kKeyAsJWK, SESSION_READY); |
| 428 ASSERT_NO_FATAL_FAILURE( | 418 ASSERT_NO_FATAL_FAILURE( |
| 429 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS)); | 419 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS)); |
| 430 } | 420 } |
| 431 | 421 |
| 432 TEST_F(AesDecryptorTest, WrongSizedKey) { | 422 TEST_F(AesDecryptorTest, WrongSizedKey) { |
| 433 uint32 session_id = CreateSession(key_id_); | 423 uint32 session_id = CreateSession(key_id_); |
| 434 UpdateSessionAndExpect(session_id, kWrongSizedKeyAsJWK, SESSION_ERROR); | 424 UpdateSessionAndExpect(session_id, kWrongSizedKeyAsJWK, SESSION_ERROR); |
| 435 } | 425 } |
| 436 | 426 |
| 437 TEST_F(AesDecryptorTest, MultipleKeysAndFrames) { | 427 TEST_F(AesDecryptorTest, MultipleKeysAndFrames) { |
| 438 uint32 session_id = CreateSession(key_id_); | 428 uint32 session_id = CreateSession(key_id_); |
| 439 UpdateSessionAndExpect(session_id, kKeyAsJWK, SESSION_READY); | 429 UpdateSessionAndExpect(session_id, kKeyAsJWK, SESSION_READY); |
| 440 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( | 430 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( |
| 441 encrypted_data_, key_id_, iv_, 10, no_subsample_entries_); | 431 encrypted_data_, key_id_, iv_, no_subsample_entries_); |
| 442 ASSERT_NO_FATAL_FAILURE( | 432 ASSERT_NO_FATAL_FAILURE( |
| 443 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS)); | 433 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS)); |
| 444 | 434 |
| 445 UpdateSessionAndExpect(session_id, kKey2AsJWK, SESSION_READY); | 435 UpdateSessionAndExpect(session_id, kKey2AsJWK, SESSION_READY); |
| 446 | 436 |
| 447 // The first key is still available after we added a second key. | 437 // The first key is still available after we added a second key. |
| 448 ASSERT_NO_FATAL_FAILURE( | 438 ASSERT_NO_FATAL_FAILURE( |
| 449 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS)); | 439 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS)); |
| 450 | 440 |
| 451 // The second key is also available. | 441 // The second key is also available. |
| 452 encrypted_buffer = CreateEncryptedBuffer( | 442 encrypted_buffer = CreateEncryptedBuffer( |
| 453 std::vector<uint8>(kEncryptedData2, | 443 std::vector<uint8>(kEncryptedData2, |
| 454 kEncryptedData2 + arraysize(kEncryptedData2)), | 444 kEncryptedData2 + arraysize(kEncryptedData2)), |
| 455 std::vector<uint8>(kKeyId2, kKeyId2 + arraysize(kKeyId2)), | 445 std::vector<uint8>(kKeyId2, kKeyId2 + arraysize(kKeyId2)), |
| 456 std::vector<uint8>(kIv2, kIv2 + arraysize(kIv2)), | 446 std::vector<uint8>(kIv2, kIv2 + arraysize(kIv2)), |
| 457 30, | |
| 458 no_subsample_entries_); | 447 no_subsample_entries_); |
| 459 ASSERT_NO_FATAL_FAILURE(DecryptAndExpect( | 448 ASSERT_NO_FATAL_FAILURE(DecryptAndExpect( |
| 460 encrypted_buffer, | 449 encrypted_buffer, |
| 461 std::vector<uint8>(kOriginalData2, | 450 std::vector<uint8>(kOriginalData2, |
| 462 kOriginalData2 + arraysize(kOriginalData2) - 1), | 451 kOriginalData2 + arraysize(kOriginalData2) - 1), |
| 463 SUCCESS)); | 452 SUCCESS)); |
| 464 } | 453 } |
| 465 | 454 |
| 466 TEST_F(AesDecryptorTest, CorruptedIv) { | 455 TEST_F(AesDecryptorTest, CorruptedIv) { |
| 467 uint32 session_id = CreateSession(key_id_); | 456 uint32 session_id = CreateSession(key_id_); |
| 468 UpdateSessionAndExpect(session_id, kKeyAsJWK, SESSION_READY); | 457 UpdateSessionAndExpect(session_id, kKeyAsJWK, SESSION_READY); |
| 469 | 458 |
| 470 std::vector<uint8> bad_iv = iv_; | 459 std::vector<uint8> bad_iv = iv_; |
| 471 bad_iv[1]++; | 460 bad_iv[1]++; |
| 472 | 461 |
| 473 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( | 462 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( |
| 474 encrypted_data_, key_id_, bad_iv, 0, no_subsample_entries_); | 463 encrypted_data_, key_id_, bad_iv, no_subsample_entries_); |
| 475 | 464 |
| 476 DecryptAndExpect(encrypted_buffer, original_data_, DATA_MISMATCH); | 465 DecryptAndExpect(encrypted_buffer, original_data_, DATA_MISMATCH); |
| 477 } | 466 } |
| 478 | 467 |
| 479 TEST_F(AesDecryptorTest, CorruptedData) { | 468 TEST_F(AesDecryptorTest, CorruptedData) { |
| 480 uint32 session_id = CreateSession(key_id_); | 469 uint32 session_id = CreateSession(key_id_); |
| 481 UpdateSessionAndExpect(session_id, kKeyAsJWK, SESSION_READY); | 470 UpdateSessionAndExpect(session_id, kKeyAsJWK, SESSION_READY); |
| 482 | 471 |
| 483 std::vector<uint8> bad_data = encrypted_data_; | 472 std::vector<uint8> bad_data = encrypted_data_; |
| 484 bad_data[1]++; | 473 bad_data[1]++; |
| 485 | 474 |
| 486 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( | 475 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( |
| 487 bad_data, key_id_, iv_, 0, no_subsample_entries_); | 476 bad_data, key_id_, iv_, no_subsample_entries_); |
| 488 DecryptAndExpect(encrypted_buffer, original_data_, DATA_MISMATCH); | 477 DecryptAndExpect(encrypted_buffer, original_data_, DATA_MISMATCH); |
| 489 } | 478 } |
| 490 | 479 |
| 491 TEST_F(AesDecryptorTest, EncryptedAsUnencryptedFailure) { | 480 TEST_F(AesDecryptorTest, EncryptedAsUnencryptedFailure) { |
| 492 uint32 session_id = CreateSession(key_id_); | 481 uint32 session_id = CreateSession(key_id_); |
| 493 UpdateSessionAndExpect(session_id, kKeyAsJWK, SESSION_READY); | 482 UpdateSessionAndExpect(session_id, kKeyAsJWK, SESSION_READY); |
| 494 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( | 483 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( |
| 495 encrypted_data_, key_id_, std::vector<uint8>(), 0, no_subsample_entries_); | 484 encrypted_data_, key_id_, std::vector<uint8>(), no_subsample_entries_); |
| 496 DecryptAndExpect(encrypted_buffer, original_data_, DATA_MISMATCH); | 485 DecryptAndExpect(encrypted_buffer, original_data_, DATA_MISMATCH); |
| 497 } | 486 } |
| 498 | 487 |
| 499 TEST_F(AesDecryptorTest, SubsampleDecryption) { | 488 TEST_F(AesDecryptorTest, SubsampleDecryption) { |
| 500 uint32 session_id = CreateSession(key_id_); | 489 uint32 session_id = CreateSession(key_id_); |
| 501 UpdateSessionAndExpect(session_id, kKeyAsJWK, SESSION_READY); | 490 UpdateSessionAndExpect(session_id, kKeyAsJWK, SESSION_READY); |
| 502 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( | 491 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( |
| 503 subsample_encrypted_data_, key_id_, iv_, 0, normal_subsample_entries_); | 492 subsample_encrypted_data_, key_id_, iv_, normal_subsample_entries_); |
| 504 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS); | 493 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS); |
| 505 } | 494 } |
| 506 | 495 |
| 507 // Ensures noninterference of data offset and subsample mechanisms. We never | 496 // Ensures noninterference of data offset and subsample mechanisms. We never |
| 508 // expect to encounter this in the wild, but since the DecryptConfig doesn't | 497 // expect to encounter this in the wild, but since the DecryptConfig doesn't |
| 509 // disallow such a configuration, it should be covered. | 498 // disallow such a configuration, it should be covered. |
| 510 TEST_F(AesDecryptorTest, SubsampleDecryptionWithOffset) { | 499 TEST_F(AesDecryptorTest, SubsampleDecryptionWithOffset) { |
| 511 uint32 session_id = CreateSession(key_id_); | 500 uint32 session_id = CreateSession(key_id_); |
| 512 UpdateSessionAndExpect(session_id, kKeyAsJWK, SESSION_READY); | 501 UpdateSessionAndExpect(session_id, kKeyAsJWK, SESSION_READY); |
| 513 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( | 502 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( |
| 514 subsample_encrypted_data_, key_id_, iv_, 23, normal_subsample_entries_); | 503 subsample_encrypted_data_, key_id_, iv_, normal_subsample_entries_); |
| 515 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS); | 504 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS); |
| 516 } | 505 } |
| 517 | 506 |
| 518 TEST_F(AesDecryptorTest, SubsampleWrongSize) { | 507 TEST_F(AesDecryptorTest, SubsampleWrongSize) { |
| 519 uint32 session_id = CreateSession(key_id_); | 508 uint32 session_id = CreateSession(key_id_); |
| 520 UpdateSessionAndExpect(session_id, kKeyAsJWK, SESSION_READY); | 509 UpdateSessionAndExpect(session_id, kKeyAsJWK, SESSION_READY); |
| 521 | 510 |
| 522 std::vector<SubsampleEntry> subsample_entries_wrong_size( | 511 std::vector<SubsampleEntry> subsample_entries_wrong_size( |
| 523 kSubsampleEntriesWrongSize, | 512 kSubsampleEntriesWrongSize, |
| 524 kSubsampleEntriesWrongSize + arraysize(kSubsampleEntriesWrongSize)); | 513 kSubsampleEntriesWrongSize + arraysize(kSubsampleEntriesWrongSize)); |
| 525 | 514 |
| 526 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( | 515 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( |
| 527 subsample_encrypted_data_, key_id_, iv_, 0, subsample_entries_wrong_size); | 516 subsample_encrypted_data_, key_id_, iv_, subsample_entries_wrong_size); |
| 528 DecryptAndExpect(encrypted_buffer, original_data_, DATA_MISMATCH); | 517 DecryptAndExpect(encrypted_buffer, original_data_, DATA_MISMATCH); |
| 529 } | 518 } |
| 530 | 519 |
| 531 TEST_F(AesDecryptorTest, SubsampleInvalidTotalSize) { | 520 TEST_F(AesDecryptorTest, SubsampleInvalidTotalSize) { |
| 532 uint32 session_id = CreateSession(key_id_); | 521 uint32 session_id = CreateSession(key_id_); |
| 533 UpdateSessionAndExpect(session_id, kKeyAsJWK, SESSION_READY); | 522 UpdateSessionAndExpect(session_id, kKeyAsJWK, SESSION_READY); |
| 534 | 523 |
| 535 std::vector<SubsampleEntry> subsample_entries_invalid_total_size( | 524 std::vector<SubsampleEntry> subsample_entries_invalid_total_size( |
| 536 kSubsampleEntriesInvalidTotalSize, | 525 kSubsampleEntriesInvalidTotalSize, |
| 537 kSubsampleEntriesInvalidTotalSize + | 526 kSubsampleEntriesInvalidTotalSize + |
| 538 arraysize(kSubsampleEntriesInvalidTotalSize)); | 527 arraysize(kSubsampleEntriesInvalidTotalSize)); |
| 539 | 528 |
| 540 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( | 529 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( |
| 541 subsample_encrypted_data_, key_id_, iv_, 0, | 530 subsample_encrypted_data_, key_id_, iv_, |
| 542 subsample_entries_invalid_total_size); | 531 subsample_entries_invalid_total_size); |
| 543 DecryptAndExpect(encrypted_buffer, original_data_, DECRYPT_ERROR); | 532 DecryptAndExpect(encrypted_buffer, original_data_, DECRYPT_ERROR); |
| 544 } | 533 } |
| 545 | 534 |
| 546 // No cypher bytes in any of the subsamples. | 535 // No cypher bytes in any of the subsamples. |
| 547 TEST_F(AesDecryptorTest, SubsampleClearBytesOnly) { | 536 TEST_F(AesDecryptorTest, SubsampleClearBytesOnly) { |
| 548 uint32 session_id = CreateSession(key_id_); | 537 uint32 session_id = CreateSession(key_id_); |
| 549 UpdateSessionAndExpect(session_id, kKeyAsJWK, SESSION_READY); | 538 UpdateSessionAndExpect(session_id, kKeyAsJWK, SESSION_READY); |
| 550 | 539 |
| 551 std::vector<SubsampleEntry> clear_only_subsample_entries( | 540 std::vector<SubsampleEntry> clear_only_subsample_entries( |
| 552 kSubsampleEntriesClearOnly, | 541 kSubsampleEntriesClearOnly, |
| 553 kSubsampleEntriesClearOnly + arraysize(kSubsampleEntriesClearOnly)); | 542 kSubsampleEntriesClearOnly + arraysize(kSubsampleEntriesClearOnly)); |
| 554 | 543 |
| 555 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( | 544 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( |
| 556 original_data_, key_id_, iv_, 0, clear_only_subsample_entries); | 545 original_data_, key_id_, iv_, clear_only_subsample_entries); |
| 557 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS); | 546 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS); |
| 558 } | 547 } |
| 559 | 548 |
| 560 // No clear bytes in any of the subsamples. | 549 // No clear bytes in any of the subsamples. |
| 561 TEST_F(AesDecryptorTest, SubsampleCypherBytesOnly) { | 550 TEST_F(AesDecryptorTest, SubsampleCypherBytesOnly) { |
| 562 uint32 session_id = CreateSession(key_id_); | 551 uint32 session_id = CreateSession(key_id_); |
| 563 UpdateSessionAndExpect(session_id, kKeyAsJWK, SESSION_READY); | 552 UpdateSessionAndExpect(session_id, kKeyAsJWK, SESSION_READY); |
| 564 | 553 |
| 565 std::vector<SubsampleEntry> cypher_only_subsample_entries( | 554 std::vector<SubsampleEntry> cypher_only_subsample_entries( |
| 566 kSubsampleEntriesCypherOnly, | 555 kSubsampleEntriesCypherOnly, |
| 567 kSubsampleEntriesCypherOnly + arraysize(kSubsampleEntriesCypherOnly)); | 556 kSubsampleEntriesCypherOnly + arraysize(kSubsampleEntriesCypherOnly)); |
| 568 | 557 |
| 569 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( | 558 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( |
| 570 encrypted_data_, key_id_, iv_, 0, cypher_only_subsample_entries); | 559 encrypted_data_, key_id_, iv_, cypher_only_subsample_entries); |
| 571 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS); | 560 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS); |
| 572 } | 561 } |
| 573 | 562 |
| 574 TEST_F(AesDecryptorTest, ReleaseSession) { | 563 TEST_F(AesDecryptorTest, ReleaseSession) { |
| 575 uint32 session_id = CreateSession(key_id_); | 564 uint32 session_id = CreateSession(key_id_); |
| 576 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( | 565 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( |
| 577 encrypted_data_, key_id_, iv_, 0, no_subsample_entries_); | 566 encrypted_data_, key_id_, iv_, no_subsample_entries_); |
| 578 | 567 |
| 579 UpdateSessionAndExpect(session_id, kKeyAsJWK, SESSION_READY); | 568 UpdateSessionAndExpect(session_id, kKeyAsJWK, SESSION_READY); |
| 580 ASSERT_NO_FATAL_FAILURE( | 569 ASSERT_NO_FATAL_FAILURE( |
| 581 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS)); | 570 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS)); |
| 582 | 571 |
| 583 ReleaseSession(session_id); | 572 ReleaseSession(session_id); |
| 584 } | 573 } |
| 585 | 574 |
| 586 TEST_F(AesDecryptorTest, NoKeyAfterReleaseSession) { | 575 TEST_F(AesDecryptorTest, NoKeyAfterReleaseSession) { |
| 587 uint32 session_id = CreateSession(key_id_); | 576 uint32 session_id = CreateSession(key_id_); |
| 588 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( | 577 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( |
| 589 encrypted_data_, key_id_, iv_, 0, no_subsample_entries_); | 578 encrypted_data_, key_id_, iv_, no_subsample_entries_); |
| 590 | 579 |
| 591 UpdateSessionAndExpect(session_id, kKeyAsJWK, SESSION_READY); | 580 UpdateSessionAndExpect(session_id, kKeyAsJWK, SESSION_READY); |
| 592 ASSERT_NO_FATAL_FAILURE( | 581 ASSERT_NO_FATAL_FAILURE( |
| 593 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS)); | 582 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS)); |
| 594 | 583 |
| 595 ReleaseSession(session_id); | 584 ReleaseSession(session_id); |
| 596 ASSERT_NO_FATAL_FAILURE( | 585 ASSERT_NO_FATAL_FAILURE( |
| 597 DecryptAndExpect(encrypted_buffer, original_data_, NO_KEY)); | 586 DecryptAndExpect(encrypted_buffer, original_data_, NO_KEY)); |
| 598 } | 587 } |
| 599 | 588 |
| 600 TEST_F(AesDecryptorTest, LatestKeyUsed) { | 589 TEST_F(AesDecryptorTest, LatestKeyUsed) { |
| 601 uint32 session_id1 = CreateSession(key_id_); | 590 uint32 session_id1 = CreateSession(key_id_); |
| 602 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( | 591 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( |
| 603 encrypted_data_, key_id_, iv_, 0, no_subsample_entries_); | 592 encrypted_data_, key_id_, iv_, no_subsample_entries_); |
| 604 | 593 |
| 605 // Add alternate key, buffer should not be decoded properly. | 594 // Add alternate key, buffer should not be decoded properly. |
| 606 UpdateSessionAndExpect(session_id1, kKeyAlternateAsJWK, SESSION_READY); | 595 UpdateSessionAndExpect(session_id1, kKeyAlternateAsJWK, SESSION_READY); |
| 607 ASSERT_NO_FATAL_FAILURE( | 596 ASSERT_NO_FATAL_FAILURE( |
| 608 DecryptAndExpect(encrypted_buffer, original_data_, DATA_MISMATCH)); | 597 DecryptAndExpect(encrypted_buffer, original_data_, DATA_MISMATCH)); |
| 609 | 598 |
| 610 // Create a second session with a correct key value for key_id_. | 599 // Create a second session with a correct key value for key_id_. |
| 611 uint32 session_id2 = CreateSession(key_id_); | 600 uint32 session_id2 = CreateSession(key_id_); |
| 612 UpdateSessionAndExpect(session_id2, kKeyAsJWK, SESSION_READY); | 601 UpdateSessionAndExpect(session_id2, kKeyAsJWK, SESSION_READY); |
| 613 | 602 |
| 614 // Should be able to decode with latest key. | 603 // Should be able to decode with latest key. |
| 615 ASSERT_NO_FATAL_FAILURE( | 604 ASSERT_NO_FATAL_FAILURE( |
| 616 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS)); | 605 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS)); |
| 617 } | 606 } |
| 618 | 607 |
| 619 TEST_F(AesDecryptorTest, LatestKeyUsedAfterReleaseSession) { | 608 TEST_F(AesDecryptorTest, LatestKeyUsedAfterReleaseSession) { |
| 620 uint32 session_id1 = CreateSession(key_id_); | 609 uint32 session_id1 = CreateSession(key_id_); |
| 621 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( | 610 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( |
| 622 encrypted_data_, key_id_, iv_, 0, no_subsample_entries_); | 611 encrypted_data_, key_id_, iv_, no_subsample_entries_); |
| 623 UpdateSessionAndExpect(session_id1, kKeyAsJWK, SESSION_READY); | 612 UpdateSessionAndExpect(session_id1, kKeyAsJWK, SESSION_READY); |
| 624 ASSERT_NO_FATAL_FAILURE( | 613 ASSERT_NO_FATAL_FAILURE( |
| 625 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS)); | 614 DecryptAndExpect(encrypted_buffer, original_data_, SUCCESS)); |
| 626 | 615 |
| 627 // Create a second session with a different key value for key_id_. | 616 // Create a second session with a different key value for key_id_. |
| 628 uint32 session_id2 = CreateSession(key_id_); | 617 uint32 session_id2 = CreateSession(key_id_); |
| 629 UpdateSessionAndExpect(session_id2, kKeyAlternateAsJWK, SESSION_READY); | 618 UpdateSessionAndExpect(session_id2, kKeyAlternateAsJWK, SESSION_READY); |
| 630 | 619 |
| 631 // Should not be able to decode with new key. | 620 // Should not be able to decode with new key. |
| 632 ASSERT_NO_FATAL_FAILURE( | 621 ASSERT_NO_FATAL_FAILURE( |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 764 " \"kid\": \"\"," | 753 " \"kid\": \"\"," |
| 765 " \"k\": \"BAUGBwgJCgsMDQ4PEBESEw\"" | 754 " \"k\": \"BAUGBwgJCgsMDQ4PEBESEw\"" |
| 766 " }" | 755 " }" |
| 767 " ]" | 756 " ]" |
| 768 "}"; | 757 "}"; |
| 769 UpdateSessionAndExpect(session_id, kJwksWithEmptyKeyId, SESSION_ERROR); | 758 UpdateSessionAndExpect(session_id, kJwksWithEmptyKeyId, SESSION_ERROR); |
| 770 ReleaseSession(session_id); | 759 ReleaseSession(session_id); |
| 771 } | 760 } |
| 772 | 761 |
| 773 } // namespace media | 762 } // namespace media |
| OLD | NEW |