diff --git a/libwvdrmengine/cdm/core/include/cdm_session.h b/libwvdrmengine/cdm/core/include/cdm_session.h index 3ed656a7..37a30055 100644 --- a/libwvdrmengine/cdm/core/include/cdm_session.h +++ b/libwvdrmengine/cdm/core/include/cdm_session.h @@ -312,6 +312,9 @@ class CdmSession { // license type release and offline related information CdmKeySetId key_set_id_; + bool has_license_been_loaded_ = false; + bool has_license_been_restored_ = false; + bool mock_license_parser_in_use_; bool mock_policy_engine_in_use_; diff --git a/libwvdrmengine/cdm/core/include/wv_cdm_types.h b/libwvdrmengine/cdm/core/include/wv_cdm_types.h index 3779a087..08b7163c 100644 --- a/libwvdrmengine/cdm/core/include/wv_cdm_types.h +++ b/libwvdrmengine/cdm/core/include/wv_cdm_types.h @@ -414,7 +414,7 @@ enum CdmResponseType : int32_t { SHRINK_USAGE_TABLE_HEADER_ENTRY_IN_USE = 359, LICENSE_USAGE_ENTRY_MISSING = 360, LOAD_USAGE_ENTRY_INVALID_SESSION = 361, - // previously RESTORE_OFFLINE_LICENSE_ERROR_3 = 362, + RESTORE_OFFLINE_LICENSE_ERROR_3 = 362, NO_SRM_VERSION = 363, SESSION_NOT_FOUND_23 = 364, CERT_PROVISIONING_RESPONSE_ERROR_9 = 365, diff --git a/libwvdrmengine/cdm/core/src/cdm_session.cpp b/libwvdrmengine/cdm/core/src/cdm_session.cpp index ae705518..783aa6e3 100644 --- a/libwvdrmengine/cdm/core/src/cdm_session.cpp +++ b/libwvdrmengine/cdm/core/src/cdm_session.cpp @@ -215,6 +215,12 @@ CdmResponseType CdmSession::RestoreOfflineSession(const CdmKeySetId& key_set_id, if (!key_set_id_.empty()) { file_handle_->UnreserveLicenseId(key_set_id_); } + if (has_license_been_loaded_ || has_license_been_restored_) { + LOGE( + "Disallow multiple offline license restores or restoring a license if " + "a license has already been loaded"); + return RESTORE_OFFLINE_LICENSE_ERROR_3; + } key_set_id_ = key_set_id; @@ -338,6 +344,7 @@ CdmResponseType CdmSession::RestoreOfflineSession(const CdmKeySetId& key_set_id, license_received_ = true; is_offline_ = true; is_release_ = license_type == kLicenseTypeRelease; + has_license_been_restored_ = true; return KEY_ADDED; } @@ -582,6 +589,7 @@ CdmResponseType CdmSession::AddKeyInternal(const CdmKeyResponse& key_response) { if (sts != NO_ERROR) return sts; } + has_license_been_loaded_ = true; return KEY_ADDED; } diff --git a/libwvdrmengine/include/mapErrors-inl.h b/libwvdrmengine/include/mapErrors-inl.h index 218bcee1..ab35381c 100644 --- a/libwvdrmengine/include/mapErrors-inl.h +++ b/libwvdrmengine/include/mapErrors-inl.h @@ -477,6 +477,8 @@ static android::status_t mapCdmResponseType(wvcdm::CdmResponseType res) { return kRenewKeyError2; case wvcdm::RESTORE_OFFLINE_LICENSE_ERROR_2: return kRestoreOfflineLicenseError2; + case wvcdm::RESTORE_OFFLINE_LICENSE_ERROR_3: + return kRestoreOfflineLicenseError3; case wvcdm::SAMPLE_AND_SUBSAMPLE_SIZE_MISMATCH: return kSampleAndSubsampleSizeMismatch; case wvcdm::SESSION_FILE_HANDLE_INIT_ERROR: diff --git a/libwvdrmengine/include_hidl/mapErrors-inl.h b/libwvdrmengine/include_hidl/mapErrors-inl.h index 11d91c99..60e83548 100644 --- a/libwvdrmengine/include_hidl/mapErrors-inl.h +++ b/libwvdrmengine/include_hidl/mapErrors-inl.h @@ -167,6 +167,7 @@ static Status mapCdmResponseType_1_0(wvcdm::CdmResponseType res) { case wvcdm::RENEW_KEY_ERROR_1: case wvcdm::RENEW_KEY_ERROR_2: case wvcdm::RESTORE_OFFLINE_LICENSE_ERROR_2: + case wvcdm::RESTORE_OFFLINE_LICENSE_ERROR_3: case wvcdm::NOT_INITIALIZED_ERROR: case wvcdm::REINIT_ERROR: case wvcdm::SESSION_KEYS_NOT_FOUND: @@ -615,6 +616,7 @@ static S mapCdmResponseType(wvcdm::CdmResponseType res) { err = ::drm::V1_4::Status::LICENSE_RESTORE_ERROR; break; case wvcdm::GET_RELEASED_LICENSE_ERROR: + case wvcdm::RESTORE_OFFLINE_LICENSE_ERROR_3: err = ::drm::V1_4::Status::LICENSE_STATE_ERROR; break; case wvcdm::DEVICE_CERTIFICATE_ERROR_2: