diff --git a/libwvdrmengine/cdm/core/include/license.h b/libwvdrmengine/cdm/core/include/license.h index 95c307e4..9d566803 100644 --- a/libwvdrmengine/cdm/core/include/license.h +++ b/libwvdrmengine/cdm/core/include/license.h @@ -176,6 +176,9 @@ class CdmLicense { // HandleKeyResponse VersionInfo latest_service_version_; + // The nonce used in the original license request. + uint32_t license_nonce_; + #if defined(UNIT_TEST) friend class CdmLicenseTestPeer; #endif diff --git a/libwvdrmengine/cdm/core/src/license.cpp b/libwvdrmengine/cdm/core/src/license.cpp index a6585d34..a934571c 100644 --- a/libwvdrmengine/cdm/core/src/license.cpp +++ b/libwvdrmengine/cdm/core/src/license.cpp @@ -237,6 +237,7 @@ bool CdmLicense::Init(const std::string& client_token, crypto_session_ = session; policy_engine_ = policy_engine; use_privacy_mode_ = use_privacy_mode; + license_nonce_ = 0; initialized_ = true; return true; } @@ -313,8 +314,7 @@ CdmResponseType CdmLicense::PrepareKeyRequest( // Get/set the nonce. This value will be reflected in the Key Control Block // of the license response. - uint32_t nonce; - status = crypto_session_->GenerateNonce(&nonce); + status = crypto_session_->GenerateNonce(&license_nonce_); switch (status) { case NO_ERROR: @@ -325,7 +325,7 @@ CdmResponseType CdmLicense::PrepareKeyRequest( default: return LICENSE_REQUEST_NONCE_GENERATION_ERROR; } - license_request.set_key_control_nonce(nonce); + license_request.set_key_control_nonce(license_nonce_); license_request.set_protocol_version(video_widevine::VERSION_2_1); // License request is complete. Serialize it. @@ -460,11 +460,11 @@ CdmResponseType CdmLicense::PrepareKeyUpdateRequest( LOGW("Unknown API Version"); api_version = 15; } - uint32_t nonce = 0; if (api_version < 16) { // For a pre-v16 license, get/set the nonce. This value will be reflected // in the Key Control Block of the license response. - const CdmResponseType status = crypto_session_->GenerateNonce(&nonce); + const CdmResponseType status = + crypto_session_->GenerateNonce(&license_nonce_); switch (status) { case NO_ERROR: break; @@ -475,7 +475,7 @@ CdmResponseType CdmLicense::PrepareKeyUpdateRequest( return LICENSE_RENEWAL_NONCE_GENERATION_ERROR; } } - license_request.set_key_control_nonce(nonce); + license_request.set_key_control_nonce(license_nonce_); license_request.set_protocol_version(video_widevine::VERSION_2_1); // License request is complete. Serialize it. @@ -810,6 +810,13 @@ CdmResponseType CdmLicense::RestoreOfflineLicense( } key_request_ = signed_request.msg(); + LicenseRequest original_license_request; + if (!original_license_request.ParseFromString(key_request_)) { + LOGW("Could not parse original request."); + } else { + license_nonce_ = original_license_request.key_control_nonce(); + } + CdmResponseType sts = HandleKeyResponse(license_response); if (sts != KEY_ADDED) return sts;