From 4444ba3b47781b9212891f4c60730e44c9f2e9ef Mon Sep 17 00:00:00 2001 From: "John W. Bruce" Date: Tue, 31 Mar 2020 11:21:36 -0700 Subject: [PATCH] Fix Entitlement Licenses (This is a merge of http://go/wvgerrit/97083.) The switch from LoadKeys to LoadLicense broke entitlement licenses entirely because the LoadLicense path in CryptoSession didn't include any affordances for updating the KeySession, unlike the LoadKeys path. This patch adds code to handle this. Bug: 152814106 Test: CE CDM Unit Tests Test: Android Unit Tests Change-Id: Id0c33a566e17e6be8da04e12be4b0fc87559aa8f --- libwvdrmengine/cdm/core/include/crypto_session.h | 3 ++- libwvdrmengine/cdm/core/src/crypto_session.cpp | 8 +++++++- libwvdrmengine/cdm/core/src/license.cpp | 6 ++++-- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/libwvdrmengine/cdm/core/include/crypto_session.h b/libwvdrmengine/cdm/core/include/crypto_session.h index c26810fb..1e44b94a 100644 --- a/libwvdrmengine/cdm/core/include/crypto_session.h +++ b/libwvdrmengine/cdm/core/include/crypto_session.h @@ -135,7 +135,8 @@ class CryptoSession { // V16 licenses. virtual CdmResponseType LoadLicense(const std::string& signed_message, const std::string& core_message, - const std::string& signature); + const std::string& signature, + CdmLicenseKeyType key_type); // Renewal request/responses virtual CdmResponseType PrepareAndSignRenewalRequest( diff --git a/libwvdrmengine/cdm/core/src/crypto_session.cpp b/libwvdrmengine/cdm/core/src/crypto_session.cpp index 65c6cbb3..db7fa1c3 100644 --- a/libwvdrmengine/cdm/core/src/crypto_session.cpp +++ b/libwvdrmengine/cdm/core/src/crypto_session.cpp @@ -952,11 +952,17 @@ CdmResponseType CryptoSession::LoadKeys( CdmResponseType CryptoSession::LoadLicense(const std::string& signed_message, const std::string& core_message, - const std::string& signature) { + const std::string& signature, + CdmLicenseKeyType key_type) { LOGV("Loading license: id = %u", oec_session_id_); const std::string combined_message = core_message + signed_message; OEMCryptoResult sts; WithOecSessionLock("LoadLicense", [&] { + if (key_type == kLicenseKeyTypeEntitlement && + key_session_->Type() != KeySession::kEntitlement) { + key_session_.reset(new EntitlementKeySession(oec_session_id_, metrics_)); + } + M_TIME(sts = OEMCrypto_LoadLicense( oec_session_id_, reinterpret_cast(combined_message.data()), diff --git a/libwvdrmengine/cdm/core/src/license.cpp b/libwvdrmengine/cdm/core/src/license.cpp index d8c8c4a9..901d04f1 100644 --- a/libwvdrmengine/cdm/core/src/license.cpp +++ b/libwvdrmengine/cdm/core/src/license.cpp @@ -1099,7 +1099,8 @@ CdmResponseType CdmLicense::HandleContentKeyResponse( } CdmResponseType resp; if (supports_core_messages()) { - resp = crypto_session_->LoadLicense(msg, core_message, signature); + resp = crypto_session_->LoadLicense(msg, core_message, signature, + kLicenseKeyTypeContent); } else { resp = crypto_session_->LoadKeys( msg, signature, mac_key_iv, mac_key, key_array, provider_session_token_, @@ -1128,7 +1129,8 @@ CdmResponseType CdmLicense::HandleEntitlementKeyResponse( } CdmResponseType resp; if (supports_core_messages()) { - resp = crypto_session_->LoadLicense(msg, core_message, signature); + resp = crypto_session_->LoadLicense(msg, core_message, signature, + kLicenseKeyTypeEntitlement); } else { resp = crypto_session_->LoadKeys( msg, signature, mac_key_iv, mac_key, key_array, provider_session_token_,