From 66cadaa9fafbede2a91fe5f530eeae51d3dc447b Mon Sep 17 00:00:00 2001 From: Jeff Tinker Date: Sat, 29 Mar 2014 17:09:28 +0000 Subject: [PATCH] Revert "Add Support for WebM" This reverts commit ab95cf27f15fbc7bbd271c6613eccb6128313be3. Change-Id: Ie78c2c14fa9b598b5ea67d6e9e60479e652b0b06 --- libwvdrmengine/cdm/core/include/cdm_engine.h | 1 - libwvdrmengine/cdm/core/include/cdm_session.h | 5 +- libwvdrmengine/cdm/core/include/license.h | 11 +- .../cdm/core/include/wv_cdm_constants.h | 2 - libwvdrmengine/cdm/core/src/cdm_engine.cpp | 3 +- libwvdrmengine/cdm/core/src/cdm_session.cpp | 29 ++-- libwvdrmengine/cdm/core/src/license.cpp | 90 ++++--------- .../cdm/core/test/cdm_engine_test.cpp | 35 ++--- .../cdm/core/test/license_unittest.cpp | 27 +--- .../include/wv_content_decryption_module.h | 1 - .../cdm/src/wv_content_decryption_module.cpp | 3 +- .../cdm/test/request_license_test.cpp | 20 ++- libwvdrmengine/mediadrm/src/WVDrmPlugin.cpp | 53 +++----- .../mediadrm/test/WVDrmPlugin_test.cpp | 127 ++---------------- libwvdrmengine/src/WVDrmFactory.cpp | 6 +- .../test/unit/WVDrmFactory_test.cpp | 6 +- 16 files changed, 105 insertions(+), 314 deletions(-) diff --git a/libwvdrmengine/cdm/core/include/cdm_engine.h b/libwvdrmengine/cdm/core/include/cdm_engine.h index 03f8d244..aa4900f7 100644 --- a/libwvdrmengine/cdm/core/include/cdm_engine.h +++ b/libwvdrmengine/cdm/core/include/cdm_engine.h @@ -37,7 +37,6 @@ class CdmEngine : public TimerHandler { // Construct a valid license request virtual CdmResponseType GenerateKeyRequest(const CdmSessionId& session_id, const CdmKeySetId& key_set_id, - const std::string& mime_type, const CdmInitData& init_data, const CdmLicenseType license_type, CdmAppParameterMap& app_parameters, diff --git a/libwvdrmengine/cdm/core/include/cdm_session.h b/libwvdrmengine/cdm/core/include/cdm_session.h index ac57f844..6cc5920d 100644 --- a/libwvdrmengine/cdm/core/include/cdm_session.h +++ b/libwvdrmengine/cdm/core/include/cdm_session.h @@ -36,8 +36,7 @@ class CdmSession { bool VerifySession(const CdmKeySystem& key_system, const CdmInitData& init_data); - CdmResponseType GenerateKeyRequest(const std::string& mime_type, - const CdmInitData& init_data, + CdmResponseType GenerateKeyRequest(const CdmInitData& init_data, const CdmLicenseType license_type, const CdmAppParameterMap& app_parameters, CdmKeyMessage* key_request, @@ -110,7 +109,7 @@ class CdmSession { CdmLicenseType license_type_; // license type offline related information - CdmInitData offline_init_data_; + CdmInitData offline_pssh_data_; CdmKeyMessage offline_key_request_; CdmKeyResponse offline_key_response_; CdmKeyMessage offline_key_renewal_request_; diff --git a/libwvdrmengine/cdm/core/include/license.h b/libwvdrmengine/cdm/core/include/license.h index f888c9a0..6e4534df 100644 --- a/libwvdrmengine/cdm/core/include/license.h +++ b/libwvdrmengine/cdm/core/include/license.h @@ -27,8 +27,7 @@ class CdmLicense { bool Init(const std::string& token, CryptoSession* session, PolicyEngine* policy_engine); - bool PrepareKeyRequest(const std::string& mime_type, - const CdmInitData& init_data, + bool PrepareKeyRequest(const CdmInitData& pssh_data, const CdmLicenseType license_type, const CdmAppParameterMap& app_parameters, const CdmSessionId& session_id, @@ -43,7 +42,7 @@ class CdmLicense { bool RestoreOfflineLicense(CdmKeyMessage& license_request, CdmKeyResponse& license_response, CdmKeyResponse& license_renewal_response); - bool HasInitData() { return !stored_init_data_.empty(); } + bool HasInitData() { return !init_data_.empty(); } bool IsKeyLoaded(const KeyId& key_id); private: @@ -55,16 +54,12 @@ class CdmLicense { CdmResponseType HandleKeyErrorResponse( const video_widevine_server::sdk::SignedMessage& signed_message); - template bool PrepareContentId(const CdmLicenseType license_type, - const std::string& request_id, - T* content_id); - CryptoSession* session_; PolicyEngine* policy_engine_; std::string server_url_; std::string token_; std::string service_certificate_; - std::string stored_init_data_; + std::string init_data_; bool initialized_; std::set loaded_keys_; diff --git a/libwvdrmengine/cdm/core/include/wv_cdm_constants.h b/libwvdrmengine/cdm/core/include/wv_cdm_constants.h index 58cbdf38..1f5291d9 100644 --- a/libwvdrmengine/cdm/core/include/wv_cdm_constants.h +++ b/libwvdrmengine/cdm/core/include/wv_cdm_constants.h @@ -56,8 +56,6 @@ static const std::string QUERY_VALUE_SECURITY_LEVEL_L2 = "L2"; static const std::string QUERY_VALUE_SECURITY_LEVEL_L3 = "L3"; static const std::string QUERY_VALUE_SECURITY_LEVEL_Unknown = "Unknown"; -static const std::string ISO_BMFF_MIME_TYPE = "video/mp4"; -static const std::string WEBM_MIME_TYPE = "video/webm"; } // namespace wvcdm #endif // CDM_BASE_WV_CDM_CONSTANTS_H_ diff --git a/libwvdrmengine/cdm/core/src/cdm_engine.cpp b/libwvdrmengine/cdm/core/src/cdm_engine.cpp index de70bb89..ff1efe1f 100644 --- a/libwvdrmengine/cdm/core/src/cdm_engine.cpp +++ b/libwvdrmengine/cdm/core/src/cdm_engine.cpp @@ -124,7 +124,6 @@ CdmResponseType CdmEngine::CloseKeySetSession(const CdmKeySetId& key_set_id) { CdmResponseType CdmEngine::GenerateKeyRequest( const CdmSessionId& session_id, const CdmKeySetId& key_set_id, - const std::string& mime_type, const CdmInitData& init_data, const CdmLicenseType license_type, CdmAppParameterMap& app_parameters, @@ -180,7 +179,7 @@ CdmResponseType CdmEngine::GenerateKeyRequest( } } - sts = iter->second->GenerateKeyRequest(mime_type, init_data, license_type, + sts = iter->second->GenerateKeyRequest(init_data, license_type, app_parameters, key_request, server_url); diff --git a/libwvdrmengine/cdm/core/src/cdm_session.cpp b/libwvdrmengine/cdm/core/src/cdm_session.cpp index b88358c0..c3982a91 100644 --- a/libwvdrmengine/cdm/core/src/cdm_session.cpp +++ b/libwvdrmengine/cdm/core/src/cdm_session.cpp @@ -79,7 +79,7 @@ CdmResponseType CdmSession::RestoreOfflineSession( DeviceFiles::LicenseState license_state; - if (!handle.RetrieveLicense(key_set_id, &license_state, &offline_init_data_, + if (!handle.RetrieveLicense(key_set_id, &license_state, &offline_pssh_data_, &offline_key_request_, &offline_key_response_, &offline_key_renewal_request_, &offline_key_renewal_response_, @@ -119,9 +119,9 @@ bool CdmSession::VerifySession(const CdmKeySystem& key_system, } CdmResponseType CdmSession::GenerateKeyRequest( - const std::string& mime_type, const CdmInitData& init_data, - const CdmLicenseType license_type, const CdmAppParameterMap& app_parameters, - CdmKeyMessage* key_request, std::string* server_url) { + const CdmInitData& init_data, const CdmLicenseType license_type, + const CdmAppParameterMap& app_parameters, CdmKeyMessage* key_request, + std::string* server_url) { if (reinitialize_session_) { CdmResponseType sts = Init(); if (sts != NO_ERROR) { @@ -149,18 +149,14 @@ CdmResponseType CdmSession::GenerateKeyRequest( ? UNKNOWN_ERROR : GenerateRenewalRequest(key_request, server_url); } else { - if (mime_type != ISO_BMFF_MIME_TYPE && mime_type != WEBM_MIME_TYPE) { - LOGW("CdmSession::GenerateKeyRequest: unknown MIME type"); - return KEY_ERROR; - } if (init_data.empty() && !license_parser_.HasInitData()) { LOGW("CdmSession::GenerateKeyRequest: init data absent"); return KEY_ERROR; } - CdmInitData extracted_init_data = init_data; - if (Properties::extract_pssh_data() && mime_type == ISO_BMFF_MIME_TYPE) { - if (!CdmEngine::ExtractWidevinePssh(init_data, &extracted_init_data)) { + CdmInitData pssh_data = init_data; + if (Properties::extract_pssh_data()) { + if (!CdmEngine::ExtractWidevinePssh(init_data, &pssh_data)) { return KEY_ERROR; } } @@ -176,15 +172,14 @@ CdmResponseType CdmSession::GenerateKeyRequest( } } - if (!license_parser_.PrepareKeyRequest(mime_type, extracted_init_data, - license_type, app_parameters, - session_id_, key_request, - server_url)) { + if (!license_parser_.PrepareKeyRequest(pssh_data, license_type, + app_parameters, session_id_, + key_request, server_url)) { return KEY_ERROR; } if (license_type_ == kLicenseTypeOffline) { - offline_init_data_ = extracted_init_data; + offline_pssh_data_ = pssh_data; offline_key_request_ = *key_request; offline_release_server_url_ = *server_url; } @@ -415,7 +410,7 @@ bool CdmSession::StoreLicense(DeviceFiles::LicenseState state) { return false; return handle.StoreLicense( - key_set_id_, state, offline_init_data_, offline_key_request_, + key_set_id_, state, offline_pssh_data_, offline_key_request_, offline_key_response_, offline_key_renewal_request_, offline_key_renewal_response_, offline_release_server_url_); } diff --git a/libwvdrmengine/cdm/core/src/license.cpp b/libwvdrmengine/cdm/core/src/license.cpp index 3085a070..a0d99c75 100644 --- a/libwvdrmengine/cdm/core/src/license.cpp +++ b/libwvdrmengine/cdm/core/src/license.cpp @@ -84,7 +84,6 @@ using video_widevine_server::sdk::EncryptedClientIdentification; using video_widevine_server::sdk::LicenseRequest; using video_widevine_server::sdk::LicenseRequest_ContentIdentification; using video_widevine_server::sdk::LicenseRequest_ContentIdentification_CENC; -using video_widevine_server::sdk::LicenseRequest_ContentIdentification_WebM; using video_widevine_server::sdk:: LicenseRequest_ContentIdentification_ExistingLicense; using video_widevine_server::sdk::License; @@ -158,8 +157,7 @@ bool CdmLicense::Init(const std::string& token, CryptoSession* session, return true; } -bool CdmLicense::PrepareKeyRequest(const std::string& mime_type, - const CdmInitData& init_data, +bool CdmLicense::PrepareKeyRequest(const CdmInitData& init_data, const CdmLicenseType license_type, const CdmAppParameterMap& app_parameters, const CdmSessionId& session_id, @@ -169,12 +167,7 @@ bool CdmLicense::PrepareKeyRequest(const std::string& mime_type, LOGE("CdmLicense::PrepareKeyRequest: not initialized"); return false; } - if (mime_type != ISO_BMFF_MIME_TYPE && mime_type != WEBM_MIME_TYPE) { - LOGE("CdmLicense::PrepareKeyRequest: unsupported MIME type %s", - mime_type.c_str()); - return false; - } - if (init_data.empty() && stored_init_data_.empty()) { + if (init_data.empty() && init_data_.empty()) { LOGE("CdmLicense::PrepareKeyRequest: empty init data provided"); return false; } @@ -199,7 +192,7 @@ bool CdmLicense::PrepareKeyRequest(const std::string& mime_type, serialized_service_certificate = service_certificate_; if (privacy_mode_enabled && serialized_service_certificate.empty()) { - stored_init_data_ = init_data; + init_data_ = init_data; return PrepareServiceCertificateRequest(signed_request, server_url); } @@ -315,44 +308,33 @@ bool CdmLicense::PrepareKeyRequest(const std::string& mime_type, LicenseRequest_ContentIdentification* content_id = license_request.mutable_content_id(); - if (mime_type == ISO_BMFF_MIME_TYPE) { - LicenseRequest_ContentIdentification_CENC* cenc_content_id = - content_id->mutable_cenc_id(); + LicenseRequest_ContentIdentification_CENC* cenc_content_id = + content_id->mutable_cenc_id(); - if (!init_data.empty()) { - cenc_content_id->add_pssh(init_data); - } else if (privacy_mode_enabled && !stored_init_data_.empty()) { - cenc_content_id->add_pssh(stored_init_data_); - } else { - LOGE("CdmLicense::PrepareKeyRequest: ISO-CENC init data not available"); - return false; - } - - if (!PrepareContentId(license_type, request_id, cenc_content_id)) { - return false; - } - } else if (mime_type == WEBM_MIME_TYPE) { - LicenseRequest_ContentIdentification_WebM* webm_content_id = - content_id->mutable_webm_id(); - - if (!init_data.empty()) { - webm_content_id->set_header(init_data); - } else if (privacy_mode_enabled && !stored_init_data_.empty()) { - webm_content_id->set_header(stored_init_data_); - } else { - LOGE("CdmLicense::PrepareKeyRequest: WebM init data not available"); - return false; - } - - if (!PrepareContentId(license_type, request_id, webm_content_id)) { - return false; - } + if (!init_data.empty()) { + cenc_content_id->add_pssh(init_data); + } else if (privacy_mode_enabled && !init_data_.empty()) { + cenc_content_id->add_pssh(init_data_); } else { - LOGE("CdmLicense::PrepareKeyRequest: no support for MIME type %s", - mime_type.c_str()); + LOGD("CdmLicense::PrepareKeyRequest: init data not available"); return false; } + switch (license_type) { + case kLicenseTypeOffline: + cenc_content_id->set_license_type(video_widevine_server::sdk::OFFLINE); + break; + case kLicenseTypeStreaming: + cenc_content_id->set_license_type(video_widevine_server::sdk::STREAMING); + break; + default: + LOGD("CdmLicense::PrepareKeyRequest: Unknown license type = %d", + license_type); + return false; + break; + } + cenc_content_id->set_request_id(request_id); + // TODO(jfore): The time field will be updated once the cdm wrapper // has been updated to pass us in the time. license_request.set_request_time(0); @@ -784,28 +766,6 @@ CdmResponseType CdmLicense::HandleKeyErrorResponse( } } -template -bool CdmLicense::PrepareContentId(const CdmLicenseType license_type, - const std::string& request_id, - T* content_id) { - switch (license_type) { - case kLicenseTypeOffline: - content_id->set_license_type(video_widevine_server::sdk::OFFLINE); - break; - case kLicenseTypeStreaming: - content_id->set_license_type( - video_widevine_server::sdk::STREAMING); - break; - default: - LOGD("CdmLicense::PrepareKeyRequest: Unknown license type = %d", - license_type); - return false; - } - - content_id->set_request_id(request_id); - return true; -} - bool CdmLicense::IsKeyLoaded(const KeyId& key_id) { return loaded_keys_.find(key_id) != loaded_keys_.end(); } diff --git a/libwvdrmengine/cdm/core/test/cdm_engine_test.cpp b/libwvdrmengine/cdm/core/test/cdm_engine_test.cpp index 63c250bd..8343363c 100644 --- a/libwvdrmengine/cdm/core/test/cdm_engine_test.cpp +++ b/libwvdrmengine/cdm/core/test/cdm_engine_test.cpp @@ -16,7 +16,6 @@ #include "scoped_ptr.h" #include "string_conversions.h" #include "url_request.h" -#include "wv_cdm_constants.h" #include "wv_cdm_types.h" namespace { @@ -99,22 +98,20 @@ class WvCdmEngineTest : public testing::Test { protected: void GenerateKeyRequest(const std::string& key_system, - const std::string& key_id, - const std::string& mime_type) { + const std::string& key_id) { CdmAppParameterMap app_parameters; std::string server_url; std::string init_data = key_id; CdmKeySetId key_set_id; // TODO(rfrias): Temporary change till b/9465346 is addressed - if (!Properties::extract_pssh_data() || mime_type != ISO_BMFF_MIME_TYPE) { + if (!Properties::extract_pssh_data()) { EXPECT_TRUE(CdmEngine::ExtractWidevinePssh(key_id, &init_data)); } EXPECT_EQ(KEY_MESSAGE, cdm_engine_->GenerateKeyRequest(session_id_, key_set_id, - mime_type, init_data, kLicenseTypeStreaming, app_parameters, @@ -167,7 +164,7 @@ class WvCdmEngineTest : public testing::Test { std::string resp = GetKeyRequestResponse(server_url, client_auth); CdmKeySetId key_set_id; - EXPECT_EQ(KEY_ADDED, cdm_engine_->AddKey(session_id_, resp, &key_set_id)); + EXPECT_EQ(cdm_engine_->AddKey(session_id_, resp, &key_set_id), KEY_ADDED); } void VerifyRenewalKeyResponse(const std::string& server_url, @@ -175,7 +172,7 @@ class WvCdmEngineTest : public testing::Test { std::string& init_data){ std::string resp = GetKeyRequestResponse(server_url, client_auth); - EXPECT_EQ(KEY_ADDED, cdm_engine_->RenewKey(session_id_, resp)); + EXPECT_EQ(cdm_engine_->RenewKey(session_id_, resp), wvcdm::KEY_ADDED); } scoped_ptr cdm_engine_; @@ -193,36 +190,24 @@ TEST(WvCdmProvisioningTest, ProvisioningTest) { cdm_engine.HandleProvisioningResponse(kValidJsonProvisioningResponse); } -TEST_F(WvCdmEngineTest, BaseIsoBmffMessageTest) { - GenerateKeyRequest(g_key_system, g_key_id, "video/mp4"); - GetKeyRequestResponse(g_license_server, g_client_auth); -} - -// TODO(juce): Set up with correct test data. -TEST_F(WvCdmEngineTest, DISABLED_BaseWebmMessageTest) { - GenerateKeyRequest(g_key_system, g_key_id, "video/webm"); +TEST_F(WvCdmEngineTest, BaseMessageTest) { + GenerateKeyRequest(g_key_system, g_key_id); GetKeyRequestResponse(g_license_server, g_client_auth); } TEST_F(WvCdmEngineTest, WrongMessageTest) { std::string wrong_message = a2bs_hex(g_wrong_key_id); - GenerateKeyRequest(g_key_system, wrong_message, "video/mp4"); + GenerateKeyRequest(g_key_system, wrong_message); GetKeyRequestResponse(g_license_server, g_client_auth); } -TEST_F(WvCdmEngineTest, NormalDecryptionIsoBmff) { - GenerateKeyRequest(g_key_system, g_key_id, "video/mp4"); - VerifyNewKeyResponse(g_license_server, g_client_auth, g_key_id); -} - -// TODO(juce): Set up with correct test data. -TEST_F(WvCdmEngineTest, DISABLED_NormalDecryptionWebm) { - GenerateKeyRequest(g_key_system, g_key_id, "video/webm"); +TEST_F(WvCdmEngineTest, NormalDecryption) { + GenerateKeyRequest(g_key_system, g_key_id); VerifyNewKeyResponse(g_license_server, g_client_auth, g_key_id); } TEST_F(WvCdmEngineTest, LicenseRenewal) { - GenerateKeyRequest(g_key_system, g_key_id, "video/mp4"); + GenerateKeyRequest(g_key_system, g_key_id); VerifyNewKeyResponse(g_license_server, g_client_auth, g_key_id); GenerateRenewalRequest(g_key_system, g_key_id); diff --git a/libwvdrmengine/cdm/core/test/license_unittest.cpp b/libwvdrmengine/cdm/core/test/license_unittest.cpp index dbdae3a7..a8f71549 100644 --- a/libwvdrmengine/cdm/core/test/license_unittest.cpp +++ b/libwvdrmengine/cdm/core/test/license_unittest.cpp @@ -74,29 +74,12 @@ TEST(LicenseTestSession, InitNullSession) { } // TODO(rfrias): Fix or remove test. -TEST_F(LicenseTest, DISABLED_PrepareIsoBmffKeyRequest) { +TEST_F(LicenseTest, DISABLED_PrepareKeyRequest) { std::string signed_request; CdmAppParameterMap app_parameters; std::string server_url; CdmSessionId session_id; - license_.PrepareKeyRequest("video/mp4", - a2bs_hex(kInitData), - kLicenseTypeStreaming, - app_parameters, - session_id, - &signed_request, - &server_url); - EXPECT_EQ(signed_request, a2bs_hex(kSignedRequest)); -} - -// TODO(rfrias): Fix or remove test. -TEST_F(LicenseTest, DISABLED_PrepareWebmKeyRequest) { - std::string signed_request; - CdmAppParameterMap app_parameters; - std::string server_url; - CdmSessionId session_id; - license_.PrepareKeyRequest("video/webm", - a2bs_hex(kInitData), + license_.PrepareKeyRequest(a2bs_hex(kInitData), kLicenseTypeStreaming, app_parameters, session_id, @@ -111,8 +94,7 @@ TEST_F(LicenseTest, DISABLED_HandleKeyResponseValid) { CdmAppParameterMap app_parameters; CdmSessionId session_id; std::string server_url; - license_.PrepareKeyRequest("video/mp4", - a2bs_hex(kInitData), + license_.PrepareKeyRequest(a2bs_hex(kInitData), kLicenseTypeStreaming, app_parameters, session_id, @@ -128,8 +110,7 @@ TEST_F(LicenseTest, DISABLED_HandleKeyResponseInvalid) { CdmAppParameterMap app_parameters; CdmSessionId session_id; std::string server_url; - license_.PrepareKeyRequest("video/mp4", - a2bs_hex(kInitData), + license_.PrepareKeyRequest(a2bs_hex(kInitData), kLicenseTypeStreaming, app_parameters, session_id, diff --git a/libwvdrmengine/cdm/include/wv_content_decryption_module.h b/libwvdrmengine/cdm/include/wv_content_decryption_module.h index df8a558f..83edc51b 100644 --- a/libwvdrmengine/cdm/include/wv_content_decryption_module.h +++ b/libwvdrmengine/cdm/include/wv_content_decryption_module.h @@ -28,7 +28,6 @@ class WvContentDecryptionModule { // Construct a valid license request. virtual CdmResponseType GenerateKeyRequest(const CdmSessionId& session_id, const CdmKeySetId& key_set_id, - const std::string& mime_type, const CdmInitData& init_data, const CdmLicenseType license_type, CdmAppParameterMap& app_parameters, diff --git a/libwvdrmengine/cdm/src/wv_content_decryption_module.cpp b/libwvdrmengine/cdm/src/wv_content_decryption_module.cpp index 50afa2d8..27d68608 100644 --- a/libwvdrmengine/cdm/src/wv_content_decryption_module.cpp +++ b/libwvdrmengine/cdm/src/wv_content_decryption_module.cpp @@ -38,7 +38,6 @@ CdmResponseType WvContentDecryptionModule::CloseSession( CdmResponseType WvContentDecryptionModule::GenerateKeyRequest( const CdmSessionId& session_id, const CdmKeySetId& key_set_id, - const std::string& mime_type, const CdmInitData& init_data, const CdmLicenseType license_type, CdmAppParameterMap& app_parameters, @@ -50,7 +49,7 @@ CdmResponseType WvContentDecryptionModule::GenerateKeyRequest( if (sts != NO_ERROR) return sts; } - sts = cdm_engine_->GenerateKeyRequest(session_id, key_set_id, mime_type, + sts = cdm_engine_->GenerateKeyRequest(session_id, key_set_id, init_data, license_type, app_parameters, key_request, server_url); diff --git a/libwvdrmengine/cdm/test/request_license_test.cpp b/libwvdrmengine/cdm/test/request_license_test.cpp index 4e160dd1..d0ff5099 100644 --- a/libwvdrmengine/cdm/test/request_license_test.cpp +++ b/libwvdrmengine/cdm/test/request_license_test.cpp @@ -298,8 +298,7 @@ class WvCdmRequestLicenseTest : public testing::Test { std::string server_url; std::string key_set_id; EXPECT_EQ(wvcdm::KEY_MESSAGE, - decryptor_.GenerateKeyRequest(session_id_, key_set_id, - "video/mp4", init_data, + decryptor_.GenerateKeyRequest(session_id_, key_set_id, init_data, license_type, app_parameters, &key_msg_, &server_url)); EXPECT_EQ(0u, server_url.size()); @@ -313,8 +312,7 @@ class WvCdmRequestLicenseTest : public testing::Test { std::string init_data; wvcdm::CdmAppParameterMap app_parameters; EXPECT_EQ(wvcdm::KEY_MESSAGE, - decryptor_.GenerateKeyRequest(session_id_, key_set_id_, - "video/mp4", init_data, + decryptor_.GenerateKeyRequest(session_id_, key_set_id_, init_data, license_type, app_parameters, &key_msg_, server_url)); // TODO(edwinwong, rfrias): Add tests cases for when license server url @@ -328,10 +326,9 @@ class WvCdmRequestLicenseTest : public testing::Test { wvcdm::CdmAppParameterMap app_parameters; std::string server_url; EXPECT_EQ(wvcdm::KEY_MESSAGE, - decryptor_.GenerateKeyRequest(session_id, key_set_id, "video/mp4", - init_data, kLicenseTypeRelease, - app_parameters, &key_msg_, - &server_url)); + decryptor_.GenerateKeyRequest(session_id, key_set_id, init_data, + kLicenseTypeRelease, app_parameters, + &key_msg_, &server_url)); } // Post a request and extract the drm message from the response @@ -964,10 +961,9 @@ TEST_F(WvCdmRequestLicenseTest, SecurityLevelPathBackwardCompatibility) { wvcdm::CdmAppParameterMap app_parameters; std::string server_url; EXPECT_EQ(wvcdm::NEED_PROVISIONING, - decryptor_.GenerateKeyRequest(session_id_, key_set_id, "video/mp4", - g_key_id, kLicenseTypeStreaming, - app_parameters, &key_msg_, - &server_url)); + decryptor_.GenerateKeyRequest(session_id_, key_set_id, g_key_id, + kLicenseTypeStreaming, app_parameters, + &key_msg_, &server_url)); EXPECT_EQ(NO_ERROR, decryptor_.GetProvisioningRequest(&key_msg_, &provisioning_server_url)); diff --git a/libwvdrmengine/mediadrm/src/WVDrmPlugin.cpp b/libwvdrmengine/mediadrm/src/WVDrmPlugin.cpp index ad927bc2..83ea7855 100644 --- a/libwvdrmengine/mediadrm/src/WVDrmPlugin.cpp +++ b/libwvdrmengine/mediadrm/src/WVDrmPlugin.cpp @@ -149,36 +149,22 @@ status_t WVDrmPlugin::getKeyRequest( return android::ERROR_DRM_CANNOT_HANDLE; } - string cdmMimeType = mimeType.string(); - - CdmInitData processedInitData; - if (cdmMimeType == wvcdm::ISO_BMFF_MIME_TYPE) { - // For ISO-BMFF, we need to wrap the init data in a new PSSH header. - static const char psshPrefix[] = { - 0, 0, 0, 0, // Total size - 'p', 's', 's', 'h', // "PSSH" - 0, 0, 0, 0, // Flags - must be zero - 0xED, 0xEF, 0x8B, 0xA9, 0x79, 0xD6, 0x4A, 0xCE, // Widevine UUID - 0xA3, 0xC8, 0x27, 0xDC, 0xD5, 0x1D, 0x21, 0xED, - 0, 0, 0, 0 // Size of initData - }; - processedInitData.assign(psshPrefix, sizeof(psshPrefix) / sizeof(char)); - processedInitData.append(reinterpret_cast(initData.array()), - initData.size()); - const size_t kPsshBoxSizeLocation = 0; - const size_t kInitDataSizeLocation = - sizeof(psshPrefix) - sizeof(uint32_t); - uint32_t psshBoxSize = htonl(processedInitData.size()); - uint32_t initDataSize = htonl(initData.size()); - memcpy(&processedInitData[kPsshBoxSizeLocation], &psshBoxSize, - sizeof(uint32_t)); - memcpy(&processedInitData[kInitDataSizeLocation], &initDataSize, - sizeof(uint32_t)); - } else { - // For other formats, we can pass the init data through unmodified. - processedInitData.assign(reinterpret_cast(initData.array()), - initData.size()); - } + // Build PSSH box for PSSH data in initData. + static const char psshPrefix[] = { + 0, 0, 0, 0, // Total size + 'p', 's', 's', 'h', // "PSSH" + 0, 0, 0, 0, // Flags - must be zero + 0xED, 0xEF, 0x8B, 0xA9, 0x79, 0xD6, 0x4A, 0xCE, // Widevine UUID + 0xA3, 0xC8, 0x27, 0xDC, 0xD5, 0x1D, 0x21, 0xED, + 0, 0, 0, 0 // Size of initData + }; + CdmInitData psshBox(psshPrefix, sizeof(psshPrefix) / sizeof(uint8_t)); + psshBox.append(reinterpret_cast(initData.array()), + initData.size()); + uint32_t* psshBoxSize = reinterpret_cast(&psshBox[0]); + uint32_t* initDataSize = reinterpret_cast(&psshBox[28]); + *initDataSize = htonl(initData.size()); + *psshBoxSize = htonl(psshBox.size()); CdmAppParameterMap cdmParameters; for (size_t i = 0; i < optionalParameters.size(); ++i) { @@ -193,10 +179,11 @@ status_t WVDrmPlugin::getKeyRequest( CdmKeyMessage keyRequest; string cdmDefaultUrl; + CdmResponseType res = mCDM->GenerateKeyRequest(cdmSessionId, cdmKeySetId, - cdmMimeType, processedInitData, - cdmLicenseType, cdmParameters, - &keyRequest, &cdmDefaultUrl); + psshBox, cdmLicenseType, + cdmParameters, &keyRequest, + &cdmDefaultUrl); if (isCdmResponseTypeSuccess(res)) { defaultUrl.clear(); diff --git a/libwvdrmengine/mediadrm/test/WVDrmPlugin_test.cpp b/libwvdrmengine/mediadrm/test/WVDrmPlugin_test.cpp index 6b649cf5..ac2efb23 100644 --- a/libwvdrmengine/mediadrm/test/WVDrmPlugin_test.cpp +++ b/libwvdrmengine/mediadrm/test/WVDrmPlugin_test.cpp @@ -31,9 +31,8 @@ class MockCDM : public WvContentDecryptionModule { MOCK_METHOD1(CloseSession, CdmResponseType(const CdmSessionId&)); - MOCK_METHOD8(GenerateKeyRequest, CdmResponseType(const CdmSessionId&, + MOCK_METHOD7(GenerateKeyRequest, CdmResponseType(const CdmSessionId&, const CdmKeySetId&, - const std::string&, const CdmInitData&, const CdmLicenseType, CdmAppParameterMap&, @@ -175,7 +174,7 @@ TEST_F(WVDrmPluginTest, ClosesSessions) { ASSERT_EQ(OK, res); } -TEST_F(WVDrmPluginTest, GeneratesIsoBmffKeyRequests) { +TEST_F(WVDrmPluginTest, GeneratesKeyRequests) { StrictMock cdm; StrictMock crypto; WVDrmPlugin plugin(&cdm, &crypto); @@ -227,33 +226,32 @@ TEST_F(WVDrmPluginTest, GeneratesIsoBmffKeyRequests) { cdmParameters["answer"] = "42"; static const char* kDefaultUrl = "http://google.com/"; - static const char* kMimeType = "video/mp4"; { InSequence calls; - EXPECT_CALL(cdm, GenerateKeyRequest(cdmSessionId, "", kMimeType, + EXPECT_CALL(cdm, GenerateKeyRequest(cdmSessionId, "", ElementsAreArray(psshBox, kPsshBoxSize), kLicenseTypeOffline, cdmParameters, _, _)) - .WillOnce(DoAll(SetArgPointee<6>(cdmRequest), - SetArgPointee<7>(kDefaultUrl), + .WillOnce(DoAll(SetArgPointee<5>(cdmRequest), + SetArgPointee<6>(kDefaultUrl), Return(wvcdm::KEY_MESSAGE))); - EXPECT_CALL(cdm, GenerateKeyRequest(cdmSessionId, "", kMimeType, + EXPECT_CALL(cdm, GenerateKeyRequest(cdmSessionId, "", ElementsAreArray(psshBox, kPsshBoxSize), kLicenseTypeStreaming, cdmParameters, _, _)) - .WillOnce(DoAll(SetArgPointee<6>(cdmRequest), - SetArgPointee<7>(kDefaultUrl), + .WillOnce(DoAll(SetArgPointee<5>(cdmRequest), + SetArgPointee<6>(kDefaultUrl), Return(wvcdm::KEY_MESSAGE))); - EXPECT_CALL(cdm, GenerateKeyRequest("", cdmKeySetId, kMimeType, + EXPECT_CALL(cdm, GenerateKeyRequest("", cdmKeySetId, ElementsAreArray(psshBox, kPsshBoxSize), kLicenseTypeRelease, cdmParameters, _, _)) - .WillOnce(DoAll(SetArgPointee<6>(cdmRequest), - SetArgPointee<7>(kDefaultUrl), + .WillOnce(DoAll(SetArgPointee<5>(cdmRequest), + SetArgPointee<6>(kDefaultUrl), Return(wvcdm::KEY_MESSAGE))); } @@ -261,118 +259,21 @@ TEST_F(WVDrmPluginTest, GeneratesIsoBmffKeyRequests) { String8 defaultUrl; status_t res = plugin.getKeyRequest(sessionId, initData, - String8(kMimeType), + String8("video/h264"), DrmPlugin::kKeyType_Offline, parameters, request, defaultUrl); ASSERT_EQ(OK, res); EXPECT_THAT(request, ElementsAreArray(requestRaw, kRequestSize)); EXPECT_STREQ(kDefaultUrl, defaultUrl.string()); - res = plugin.getKeyRequest(sessionId, initData, String8(kMimeType), + res = plugin.getKeyRequest(sessionId, initData, String8("video/h264"), DrmPlugin::kKeyType_Streaming, parameters, request, defaultUrl); ASSERT_EQ(OK, res); EXPECT_THAT(request, ElementsAreArray(requestRaw, kRequestSize)); EXPECT_STREQ(kDefaultUrl, defaultUrl.string()); - res = plugin.getKeyRequest(keySetId, initData, String8(kMimeType), - DrmPlugin::kKeyType_Release, parameters, - request, defaultUrl); - ASSERT_EQ(OK, res); - EXPECT_THAT(request, ElementsAreArray(requestRaw, kRequestSize)); - EXPECT_STREQ(kDefaultUrl, defaultUrl.string()); -} - -TEST_F(WVDrmPluginTest, GeneratesWebmKeyRequests) { - StrictMock cdm; - StrictMock crypto; - WVDrmPlugin plugin(&cdm, &crypto); - - static const size_t kInitDataSize = 128; - uint8_t initDataRaw[kInitDataSize]; - static const size_t kRequestSize = 256; - uint8_t requestRaw[kRequestSize]; - static const uint32_t kKeySetIdSize = 32; - uint8_t keySetIdRaw[kKeySetIdSize]; - FILE* fp = fopen("/dev/urandom", "r"); - fread(initDataRaw, sizeof(uint8_t), kInitDataSize, fp); - fread(requestRaw, sizeof(uint8_t), kRequestSize, fp); - fread(keySetIdRaw, sizeof(uint8_t), kKeySetIdSize, fp); - fclose(fp); - - memcpy(keySetIdRaw, KEY_SET_ID_PREFIX, sizeof(KEY_SET_ID_PREFIX) - 1); - CdmKeySetId cdmKeySetId(reinterpret_cast(keySetIdRaw), kKeySetIdSize); - Vector keySetId; - keySetId.appendArray(keySetIdRaw, kKeySetIdSize); - - Vector initData; - initData.appendArray(initDataRaw, kInitDataSize); - - CdmKeyMessage cdmRequest(requestRaw, requestRaw + kRequestSize); - - KeyedVector parameters; - CdmAppParameterMap cdmParameters; - - parameters.add(String8("paddingScheme"), String8("BUBBLE WRAP")); - cdmParameters["paddingScheme"] = "BUBBLE WRAP"; - parameters.add(String8("favoriteParticle"), String8("higgs boson")); - cdmParameters["favoriteParticle"] = "higgs boson"; - parameters.add(String8("answer"), String8("6 * 9")); - cdmParameters["answer"] = "6 * 9"; - - static const char* kDefaultUrl = "http://google.com/"; - static const char* kMimeType = "video/webm"; - - { - InSequence calls; - - EXPECT_CALL(cdm, GenerateKeyRequest(cdmSessionId, "", kMimeType, - ElementsAreArray(initDataRaw, - kInitDataSize), - kLicenseTypeOffline, cdmParameters, _, - _)) - .WillOnce(DoAll(SetArgPointee<6>(cdmRequest), - SetArgPointee<7>(kDefaultUrl), - Return(wvcdm::KEY_MESSAGE))); - - EXPECT_CALL(cdm, GenerateKeyRequest(cdmSessionId, "", kMimeType, - ElementsAreArray(initDataRaw, - kInitDataSize), - kLicenseTypeStreaming, cdmParameters, _, - _)) - .WillOnce(DoAll(SetArgPointee<6>(cdmRequest), - SetArgPointee<7>(kDefaultUrl), - Return(wvcdm::KEY_MESSAGE))); - - EXPECT_CALL(cdm, GenerateKeyRequest("", cdmKeySetId, kMimeType, - ElementsAreArray(initDataRaw, - kInitDataSize), - kLicenseTypeRelease, cdmParameters, _, - _)) - .WillOnce(DoAll(SetArgPointee<6>(cdmRequest), - SetArgPointee<7>(kDefaultUrl), - Return(wvcdm::KEY_MESSAGE))); - } - - Vector request; - String8 defaultUrl; - - status_t res = plugin.getKeyRequest(sessionId, initData, - String8(kMimeType), - DrmPlugin::kKeyType_Offline, - parameters, request, defaultUrl); - ASSERT_EQ(OK, res); - EXPECT_THAT(request, ElementsAreArray(requestRaw, kRequestSize)); - EXPECT_STREQ(kDefaultUrl, defaultUrl.string()); - - res = plugin.getKeyRequest(sessionId, initData, String8(kMimeType), - DrmPlugin::kKeyType_Streaming, parameters, - request, defaultUrl); - ASSERT_EQ(OK, res); - EXPECT_THAT(request, ElementsAreArray(requestRaw, kRequestSize)); - EXPECT_STREQ(kDefaultUrl, defaultUrl.string()); - - res = plugin.getKeyRequest(keySetId, initData, String8(kMimeType), + res = plugin.getKeyRequest(keySetId, initData, String8("video/h264"), DrmPlugin::kKeyType_Release, parameters, request, defaultUrl); ASSERT_EQ(OK, res); diff --git a/libwvdrmengine/src/WVDrmFactory.cpp b/libwvdrmengine/src/WVDrmFactory.cpp index 50979e7d..addde4f6 100644 --- a/libwvdrmengine/src/WVDrmFactory.cpp +++ b/libwvdrmengine/src/WVDrmFactory.cpp @@ -9,7 +9,6 @@ #include "WVDrmFactory.h" #include "utils/Errors.h" -#include "wv_cdm_constants.h" #include "WVCDMSingleton.h" #include "WVDrmPlugin.h" #include "WVUUID.h" @@ -25,9 +24,8 @@ bool WVDrmFactory::isCryptoSchemeSupported(const uint8_t uuid[16]) { } bool WVDrmFactory::isContentTypeSupported(const String8 &mimeType) { - // Support ISO-BMFF (video/mp4) and WebM (video/webm). - return mimeType == wvcdm::ISO_BMFF_MIME_TYPE.c_str() || - mimeType == wvcdm::WEBM_MIME_TYPE.c_str(); + // For now, only ISO-BMFF is supported, which has MIME-type video/mp4 + return mimeType == "video/mp4"; } status_t WVDrmFactory::createDrmPlugin(const uint8_t uuid[16], diff --git a/libwvdrmengine/test/unit/WVDrmFactory_test.cpp b/libwvdrmengine/test/unit/WVDrmFactory_test.cpp index d6cfd1fa..8a812313 100644 --- a/libwvdrmengine/test/unit/WVDrmFactory_test.cpp +++ b/libwvdrmengine/test/unit/WVDrmFactory_test.cpp @@ -46,14 +46,14 @@ TEST(WVDrmFactoryTest, SupportsSupportedContainerFormats) { EXPECT_TRUE(factory.isContentTypeSupported(String8("video/mp4"))) << "WVPluginFactory does not support ISO-BMFF"; - - EXPECT_TRUE(factory.isContentTypeSupported(String8("video/webm"))) << - "WVPluginFactory does not support WebM"; } TEST(WVDrmFactoryTest, DoesNotSupportUnsupportedContainerFormats) { WVDrmFactory factory; + EXPECT_FALSE(factory.isContentTypeSupported(String8("video/webm"))) << + "WVPluginFactory incorrectly claims to support Web-M"; + // Taken from Encoding.com's list of the most common internet video MIME-types EXPECT_FALSE(factory.isContentTypeSupported(String8("video/x-matroska"))) << "WVPluginFactory incorrectly claims to support Matroska";