diff --git a/libwvdrmengine/cdm/core/include/license.h b/libwvdrmengine/cdm/core/include/license.h index 9d566803..e8120fb5 100644 --- a/libwvdrmengine/cdm/core/include/license.h +++ b/libwvdrmengine/cdm/core/include/license.h @@ -123,6 +123,11 @@ class CdmLicense { const std::string& mac_key, const std::vector& key_array, const video_widevine::License& license); + // Prepare to reload a key update message. Some special code is needed to work + // around b/166010609. + // TODO(b/166007195): Remove this. + CdmResponseType PrepareKeyUpdateReload(CdmSession* cdm_session); + CdmResponseType HandleNewEntitledKeys( const std::vector& wrapped_keys); diff --git a/libwvdrmengine/cdm/core/src/license.cpp b/libwvdrmengine/cdm/core/src/license.cpp index a934571c..8800c5ca 100644 --- a/libwvdrmengine/cdm/core/src/license.cpp +++ b/libwvdrmengine/cdm/core/src/license.cpp @@ -367,6 +367,25 @@ CdmResponseType CdmLicense::PrepareKeyRequest( return KEY_MESSAGE; } +// TODO(b/166007195): Remove this. +CdmResponseType CdmLicense::PrepareKeyUpdateReload(CdmSession* cdm_session) { + uint32_t api_version = 0; + if (!crypto_session_->GetApiVersion(&api_version)) { + LOGW("Unknown API Version"); + api_version = 15; + } + if (api_version != 16) return NO_ERROR; + // To work around b/166010609, we ask OEMCrypto to prepare an unused renewal + // request. This lets the ODK library update its clock saying when the renewal + // was signed. + constexpr bool is_renewal = true; + const CdmAppParameterMap unused_app_parameters; + CdmKeyMessage unused_request; + std::string unused_url; + return PrepareKeyUpdateRequest(is_renewal, unused_app_parameters, cdm_session, + &unused_request, &unused_url); +} + CdmResponseType CdmLicense::PrepareKeyUpdateRequest( bool is_renewal, const CdmAppParameterMap& app_parameters, CdmSession* cdm_session, CdmKeyMessage* signed_request, @@ -822,6 +841,8 @@ CdmResponseType CdmLicense::RestoreOfflineLicense( if (sts != KEY_ADDED) return sts; if (!license_renewal_response.empty()) { + sts = PrepareKeyUpdateReload(cdm_session); + if (sts != KEY_MESSAGE) return sts; sts = HandleKeyUpdateResponse(true, license_renewal_response); if (sts != KEY_ADDED) return sts; }