| 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 "media/cdm/aes_decryptor.h" | 5 #include "media/cdm/aes_decryptor.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 #include <memory> | 8 #include <memory> |
| 9 #include <string> | 9 #include <string> |
| 10 #include <vector> | 10 #include <vector> |
| (...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 250 helper_.reset(new ExternalClearKeyTestHelper()); | 250 helper_.reset(new ExternalClearKeyTestHelper()); |
| 251 std::unique_ptr<CdmAllocator> allocator(new SimpleCdmAllocator()); | 251 std::unique_ptr<CdmAllocator> allocator(new SimpleCdmAllocator()); |
| 252 CdmAdapter::Create( | 252 CdmAdapter::Create( |
| 253 helper_->KeySystemName(), helper_->LibraryPath(), cdm_config, | 253 helper_->KeySystemName(), helper_->LibraryPath(), cdm_config, |
| 254 std::move(allocator), base::Bind(&AesDecryptorTest::CreateCdmFileIO, | 254 std::move(allocator), base::Bind(&AesDecryptorTest::CreateCdmFileIO, |
| 255 base::Unretained(this)), | 255 base::Unretained(this)), |
| 256 base::Bind(&AesDecryptorTest::OnSessionMessage, | 256 base::Bind(&AesDecryptorTest::OnSessionMessage, |
| 257 base::Unretained(this)), | 257 base::Unretained(this)), |
| 258 base::Bind(&AesDecryptorTest::OnSessionClosed, | 258 base::Bind(&AesDecryptorTest::OnSessionClosed, |
| 259 base::Unretained(this)), | 259 base::Unretained(this)), |
| 260 base::Bind(&AesDecryptorTest::OnLegacySessionError, | |
| 261 base::Unretained(this)), | |
| 262 base::Bind(&AesDecryptorTest::OnSessionKeysChange, | 260 base::Bind(&AesDecryptorTest::OnSessionKeysChange, |
| 263 base::Unretained(this)), | 261 base::Unretained(this)), |
| 264 base::Bind(&AesDecryptorTest::OnSessionExpirationUpdate, | 262 base::Bind(&AesDecryptorTest::OnSessionExpirationUpdate, |
| 265 base::Unretained(this)), | 263 base::Unretained(this)), |
| 266 base::Bind(&AesDecryptorTest::OnCdmCreated, base::Unretained(this))); | 264 base::Bind(&AesDecryptorTest::OnCdmCreated, base::Unretained(this))); |
| 267 | 265 |
| 268 base::RunLoop().RunUntilIdle(); | 266 base::RunLoop().RunUntilIdle(); |
| 269 } | 267 } |
| 270 } | 268 } |
| 271 | 269 |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 317 base::Bind(&AesDecryptorTest::OnResolveWithSession, | 315 base::Bind(&AesDecryptorTest::OnResolveWithSession, |
| 318 base::Unretained(this), expected_result), | 316 base::Unretained(this), expected_result), |
| 319 base::Bind(&AesDecryptorTest::OnReject, base::Unretained(this), | 317 base::Bind(&AesDecryptorTest::OnReject, base::Unretained(this), |
| 320 expected_result))); | 318 expected_result))); |
| 321 return promise; | 319 return promise; |
| 322 } | 320 } |
| 323 | 321 |
| 324 // Creates a new session using |key_id|. Returns the session ID. | 322 // Creates a new session using |key_id|. Returns the session ID. |
| 325 std::string CreateSession(const std::vector<uint8_t>& key_id) { | 323 std::string CreateSession(const std::vector<uint8_t>& key_id) { |
| 326 DCHECK(!key_id.empty()); | 324 DCHECK(!key_id.empty()); |
| 327 EXPECT_CALL(*this, OnSessionMessage(IsNotEmpty(), _, IsJSONDictionary(), | 325 EXPECT_CALL(*this, OnSessionMessage(IsNotEmpty(), _, IsJSONDictionary())); |
| 328 GURL::EmptyGURL())); | |
| 329 cdm_->CreateSessionAndGenerateRequest(MediaKeys::TEMPORARY_SESSION, | 326 cdm_->CreateSessionAndGenerateRequest(MediaKeys::TEMPORARY_SESSION, |
| 330 EmeInitDataType::WEBM, key_id, | 327 EmeInitDataType::WEBM, key_id, |
| 331 CreateSessionPromise(RESOLVED)); | 328 CreateSessionPromise(RESOLVED)); |
| 332 // This expects the promise to be called synchronously, which is the case | 329 // This expects the promise to be called synchronously, which is the case |
| 333 // for AesDecryptor. | 330 // for AesDecryptor. |
| 334 return session_id_; | 331 return session_id_; |
| 335 } | 332 } |
| 336 | 333 |
| 337 // Closes the session specified by |session_id|. | 334 // Closes the session specified by |session_id|. |
| 338 void CloseSession(const std::string& session_id) { | 335 void CloseSession(const std::string& session_id) { |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 448 EXPECT_TRUE(decrypted_text.empty()); | 445 EXPECT_TRUE(decrypted_text.empty()); |
| 449 break; | 446 break; |
| 450 } | 447 } |
| 451 } | 448 } |
| 452 | 449 |
| 453 std::unique_ptr<CdmFileIO> CreateCdmFileIO(cdm::FileIOClient* client) { | 450 std::unique_ptr<CdmFileIO> CreateCdmFileIO(cdm::FileIOClient* client) { |
| 454 ADD_FAILURE() << "Should never be called"; | 451 ADD_FAILURE() << "Should never be called"; |
| 455 return nullptr; | 452 return nullptr; |
| 456 } | 453 } |
| 457 | 454 |
| 458 MOCK_METHOD4(OnSessionMessage, | 455 MOCK_METHOD3(OnSessionMessage, |
| 459 void(const std::string& session_id, | 456 void(const std::string& session_id, |
| 460 MediaKeys::MessageType message_type, | 457 MediaKeys::MessageType message_type, |
| 461 const std::vector<uint8_t>& message, | 458 const std::vector<uint8_t>& message)); |
| 462 const GURL& legacy_destination_url)); | |
| 463 MOCK_METHOD1(OnSessionClosed, void(const std::string& session_id)); | 459 MOCK_METHOD1(OnSessionClosed, void(const std::string& session_id)); |
| 464 MOCK_METHOD4(OnLegacySessionError, | |
| 465 void(const std::string& session_id, | |
| 466 MediaKeys::Exception exception, | |
| 467 uint32_t system_code, | |
| 468 const std::string& error_message)); | |
| 469 MOCK_METHOD2(OnSessionExpirationUpdate, | 460 MOCK_METHOD2(OnSessionExpirationUpdate, |
| 470 void(const std::string& session_id, | 461 void(const std::string& session_id, |
| 471 const base::Time& new_expiry_time)); | 462 const base::Time& new_expiry_time)); |
| 472 | 463 |
| 473 scoped_refptr<MediaKeys> cdm_; | 464 scoped_refptr<MediaKeys> cdm_; |
| 474 Decryptor* decryptor_; | 465 Decryptor* decryptor_; |
| 475 Decryptor::DecryptCB decrypt_cb_; | 466 Decryptor::DecryptCB decrypt_cb_; |
| 476 std::string session_id_; | 467 std::string session_id_; |
| 477 CdmKeysInfo keys_info_; | 468 CdmKeysInfo keys_info_; |
| 478 | 469 |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 520 MediaKeys::TEMPORARY_SESSION, EmeInitDataType::WEBM, | 511 MediaKeys::TEMPORARY_SESSION, EmeInitDataType::WEBM, |
| 521 std::vector<uint8_t>(init_data), CreateSessionPromise(RESOLVED)); | 512 std::vector<uint8_t>(init_data), CreateSessionPromise(RESOLVED)); |
| 522 | 513 |
| 523 init_data.resize(513); | 514 init_data.resize(513); |
| 524 cdm_->CreateSessionAndGenerateRequest( | 515 cdm_->CreateSessionAndGenerateRequest( |
| 525 MediaKeys::TEMPORARY_SESSION, EmeInitDataType::WEBM, | 516 MediaKeys::TEMPORARY_SESSION, EmeInitDataType::WEBM, |
| 526 std::vector<uint8_t>(init_data), CreateSessionPromise(REJECTED)); | 517 std::vector<uint8_t>(init_data), CreateSessionPromise(REJECTED)); |
| 527 } | 518 } |
| 528 | 519 |
| 529 TEST_P(AesDecryptorTest, MultipleCreateSession) { | 520 TEST_P(AesDecryptorTest, MultipleCreateSession) { |
| 530 EXPECT_CALL(*this, OnSessionMessage(IsNotEmpty(), _, IsNotEmpty(), | 521 EXPECT_CALL(*this, OnSessionMessage(IsNotEmpty(), _, IsNotEmpty())); |
| 531 GURL::EmptyGURL())); | |
| 532 cdm_->CreateSessionAndGenerateRequest( | 522 cdm_->CreateSessionAndGenerateRequest( |
| 533 MediaKeys::TEMPORARY_SESSION, EmeInitDataType::WEBM, | 523 MediaKeys::TEMPORARY_SESSION, EmeInitDataType::WEBM, |
| 534 std::vector<uint8_t>(1), CreateSessionPromise(RESOLVED)); | 524 std::vector<uint8_t>(1), CreateSessionPromise(RESOLVED)); |
| 535 | 525 |
| 536 EXPECT_CALL(*this, OnSessionMessage(IsNotEmpty(), _, IsNotEmpty(), | 526 EXPECT_CALL(*this, OnSessionMessage(IsNotEmpty(), _, IsNotEmpty())); |
| 537 GURL::EmptyGURL())); | |
| 538 cdm_->CreateSessionAndGenerateRequest( | 527 cdm_->CreateSessionAndGenerateRequest( |
| 539 MediaKeys::TEMPORARY_SESSION, EmeInitDataType::WEBM, | 528 MediaKeys::TEMPORARY_SESSION, EmeInitDataType::WEBM, |
| 540 std::vector<uint8_t>(1), CreateSessionPromise(RESOLVED)); | 529 std::vector<uint8_t>(1), CreateSessionPromise(RESOLVED)); |
| 541 | 530 |
| 542 EXPECT_CALL(*this, OnSessionMessage(IsNotEmpty(), _, IsNotEmpty(), | 531 EXPECT_CALL(*this, OnSessionMessage(IsNotEmpty(), _, IsNotEmpty())); |
| 543 GURL::EmptyGURL())); | |
| 544 cdm_->CreateSessionAndGenerateRequest( | 532 cdm_->CreateSessionAndGenerateRequest( |
| 545 MediaKeys::TEMPORARY_SESSION, EmeInitDataType::WEBM, | 533 MediaKeys::TEMPORARY_SESSION, EmeInitDataType::WEBM, |
| 546 std::vector<uint8_t>(1), CreateSessionPromise(RESOLVED)); | 534 std::vector<uint8_t>(1), CreateSessionPromise(RESOLVED)); |
| 547 } | 535 } |
| 548 | 536 |
| 549 TEST_P(AesDecryptorTest, CreateSessionWithCencInitData) { | 537 TEST_P(AesDecryptorTest, CreateSessionWithCencInitData) { |
| 550 const uint8_t init_data[] = { | 538 const uint8_t init_data[] = { |
| 551 0x00, 0x00, 0x00, 0x44, // size = 68 | 539 0x00, 0x00, 0x00, 0x44, // size = 68 |
| 552 0x70, 0x73, 0x73, 0x68, // 'pssh' | 540 0x70, 0x73, 0x73, 0x68, // 'pssh' |
| 553 0x01, // version | 541 0x01, // version |
| 554 0x00, 0x00, 0x00, // flags | 542 0x00, 0x00, 0x00, // flags |
| 555 0x10, 0x77, 0xEF, 0xEC, 0xC0, 0xB2, 0x4D, 0x02, // SystemID | 543 0x10, 0x77, 0xEF, 0xEC, 0xC0, 0xB2, 0x4D, 0x02, // SystemID |
| 556 0xAC, 0xE3, 0x3C, 0x1E, 0x52, 0xE2, 0xFB, 0x4B, | 544 0xAC, 0xE3, 0x3C, 0x1E, 0x52, 0xE2, 0xFB, 0x4B, |
| 557 0x00, 0x00, 0x00, 0x02, // key count | 545 0x00, 0x00, 0x00, 0x02, // key count |
| 558 0x7E, 0x57, 0x1D, 0x03, 0x7E, 0x57, 0x1D, 0x03, // key1 | 546 0x7E, 0x57, 0x1D, 0x03, 0x7E, 0x57, 0x1D, 0x03, // key1 |
| 559 0x7E, 0x57, 0x1D, 0x03, 0x7E, 0x57, 0x1D, 0x03, | 547 0x7E, 0x57, 0x1D, 0x03, 0x7E, 0x57, 0x1D, 0x03, |
| 560 0x7E, 0x57, 0x1D, 0x04, 0x7E, 0x57, 0x1D, 0x04, // key2 | 548 0x7E, 0x57, 0x1D, 0x04, 0x7E, 0x57, 0x1D, 0x04, // key2 |
| 561 0x7E, 0x57, 0x1D, 0x04, 0x7E, 0x57, 0x1D, 0x04, | 549 0x7E, 0x57, 0x1D, 0x04, 0x7E, 0x57, 0x1D, 0x04, |
| 562 0x00, 0x00, 0x00, 0x00 // datasize | 550 0x00, 0x00, 0x00, 0x00 // datasize |
| 563 }; | 551 }; |
| 564 | 552 |
| 565 #if defined(USE_PROPRIETARY_CODECS) | 553 #if defined(USE_PROPRIETARY_CODECS) |
| 566 EXPECT_CALL(*this, OnSessionMessage(IsNotEmpty(), _, IsJSONDictionary(), | 554 EXPECT_CALL(*this, OnSessionMessage(IsNotEmpty(), _, IsJSONDictionary())); |
| 567 GURL::EmptyGURL())); | |
| 568 cdm_->CreateSessionAndGenerateRequest( | 555 cdm_->CreateSessionAndGenerateRequest( |
| 569 MediaKeys::TEMPORARY_SESSION, EmeInitDataType::CENC, | 556 MediaKeys::TEMPORARY_SESSION, EmeInitDataType::CENC, |
| 570 std::vector<uint8_t>(init_data, init_data + arraysize(init_data)), | 557 std::vector<uint8_t>(init_data, init_data + arraysize(init_data)), |
| 571 CreateSessionPromise(RESOLVED)); | 558 CreateSessionPromise(RESOLVED)); |
| 572 #else | 559 #else |
| 573 cdm_->CreateSessionAndGenerateRequest( | 560 cdm_->CreateSessionAndGenerateRequest( |
| 574 MediaKeys::TEMPORARY_SESSION, EmeInitDataType::CENC, | 561 MediaKeys::TEMPORARY_SESSION, EmeInitDataType::CENC, |
| 575 std::vector<uint8_t>(init_data, init_data + arraysize(init_data)), | 562 std::vector<uint8_t>(init_data, init_data + arraysize(init_data)), |
| 576 CreateSessionPromise(REJECTED)); | 563 CreateSessionPromise(REJECTED)); |
| 577 #endif | 564 #endif |
| 578 } | 565 } |
| 579 | 566 |
| 580 TEST_P(AesDecryptorTest, CreateSessionWithKeyIdsInitData) { | 567 TEST_P(AesDecryptorTest, CreateSessionWithKeyIdsInitData) { |
| 581 const char init_data[] = | 568 const char init_data[] = |
| 582 "{\"kids\":[\"AQI\",\"AQIDBA\",\"AQIDBAUGBwgJCgsMDQ4PEA\"]}"; | 569 "{\"kids\":[\"AQI\",\"AQIDBA\",\"AQIDBAUGBwgJCgsMDQ4PEA\"]}"; |
| 583 | 570 |
| 584 EXPECT_CALL(*this, OnSessionMessage(IsNotEmpty(), _, IsJSONDictionary(), | 571 EXPECT_CALL(*this, OnSessionMessage(IsNotEmpty(), _, IsJSONDictionary())); |
| 585 GURL::EmptyGURL())); | |
| 586 cdm_->CreateSessionAndGenerateRequest( | 572 cdm_->CreateSessionAndGenerateRequest( |
| 587 MediaKeys::TEMPORARY_SESSION, EmeInitDataType::KEYIDS, | 573 MediaKeys::TEMPORARY_SESSION, EmeInitDataType::KEYIDS, |
| 588 std::vector<uint8_t>(init_data, init_data + arraysize(init_data) - 1), | 574 std::vector<uint8_t>(init_data, init_data + arraysize(init_data) - 1), |
| 589 CreateSessionPromise(RESOLVED)); | 575 CreateSessionPromise(RESOLVED)); |
| 590 } | 576 } |
| 591 | 577 |
| 592 TEST_P(AesDecryptorTest, NormalDecryption) { | 578 TEST_P(AesDecryptorTest, NormalDecryption) { |
| 593 std::string session_id = CreateSession(key_id_); | 579 std::string session_id = CreateSession(key_id_); |
| 594 UpdateSessionAndExpect(session_id, kKeyAsJWK, RESOLVED, true); | 580 UpdateSessionAndExpect(session_id, kKeyAsJWK, RESOLVED, true); |
| 595 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( | 581 scoped_refptr<DecoderBuffer> encrypted_buffer = CreateEncryptedBuffer( |
| (...skipping 443 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1039 INSTANTIATE_TEST_CASE_P(CdmAdapter, | 1025 INSTANTIATE_TEST_CASE_P(CdmAdapter, |
| 1040 AesDecryptorTest, | 1026 AesDecryptorTest, |
| 1041 testing::Values("CdmAdapter")); | 1027 testing::Values("CdmAdapter")); |
| 1042 #endif | 1028 #endif |
| 1043 | 1029 |
| 1044 // TODO(jrummell): Once MojoCdm/MojoCdmService/MojoDecryptor/ | 1030 // TODO(jrummell): Once MojoCdm/MojoCdmService/MojoDecryptor/ |
| 1045 // MojoDecryptorService are implemented, add a third version that tests the | 1031 // MojoDecryptorService are implemented, add a third version that tests the |
| 1046 // CDM via mojo. | 1032 // CDM via mojo. |
| 1047 | 1033 |
| 1048 } // namespace media | 1034 } // namespace media |
| OLD | NEW |