diff --git a/libwvdrmengine/cdm/core/include/wv_cdm_types.h b/libwvdrmengine/cdm/core/include/wv_cdm_types.h index 041baa72..5d6f8b9a 100644 --- a/libwvdrmengine/cdm/core/include/wv_cdm_types.h +++ b/libwvdrmengine/cdm/core/include/wv_cdm_types.h @@ -415,6 +415,7 @@ enum CdmResponseType : int32_t { LICENSE_USAGE_ENTRY_MISSING = 360, LOAD_USAGE_ENTRY_INVALID_SESSION = 361, RESTORE_OFFLINE_LICENSE_ERROR_3 = 362, + NO_SRM_VERSION = 363, // Don't forget to add new values to // * core/test/test_printers.cpp. // * android/include/mapErrors-inl.h diff --git a/libwvdrmengine/cdm/core/src/cdm_engine.cpp b/libwvdrmengine/cdm/core/src/cdm_engine.cpp index e9f4bd09..ec6fdc78 100644 --- a/libwvdrmengine/cdm/core/src/cdm_engine.cpp +++ b/libwvdrmengine/cdm/core/src/cdm_engine.cpp @@ -617,17 +617,22 @@ CdmResponseType CdmEngine::QueryStatus(SecurityLevel security_level, } else if (query_token == QUERY_KEY_CURRENT_SRM_VERSION) { uint16_t current_srm_version; status = crypto_session->GetSrmVersion(¤t_srm_version); - if (status == NOT_IMPLEMENTED_ERROR) { - *query_response = QUERY_VALUE_NONE; - return NO_ERROR; - } else if (status != NO_ERROR) { - LOGW("GetCurrentSRMVersion failed: status = %d", - static_cast(status)); - return status; + switch (status) { + case NO_ERROR: { + *query_response = std::to_string(current_srm_version); + return NO_ERROR; + } + case NO_SRM_VERSION: { + // SRM is not supported or not applicable (ex. local display only). + *query_response = QUERY_VALUE_NONE; + return NO_ERROR; + } + default: { + LOGW("GetCurrentSRMVersion failed: status = %d", + static_cast(status)); + return status; + } } - - *query_response = std::to_string(current_srm_version); - return NO_ERROR; } else if (query_token == QUERY_KEY_SRM_UPDATE_SUPPORT) { bool is_srm_update_supported = crypto_session->IsSrmUpdateSupported(); *query_response = diff --git a/libwvdrmengine/cdm/core/src/crypto_session.cpp b/libwvdrmengine/cdm/core/src/crypto_session.cpp index 86f6721a..ba939545 100644 --- a/libwvdrmengine/cdm/core/src/crypto_session.cpp +++ b/libwvdrmengine/cdm/core/src/crypto_session.cpp @@ -1913,25 +1913,33 @@ CdmResponseType CryptoSession::GetSrmVersion(uint16_t* srm_version) { RETURN_IF_UNINITIALIZED(CRYPTO_SESSION_NOT_INITIALIZED); RETURN_IF_NULL(srm_version, PARAMETER_NULL); - OEMCryptoResult status; - WithOecReadLock("GetSrmVersion", [&] { - status = OEMCrypto_GetCurrentSRMVersion(srm_version); + const OEMCryptoResult status = WithOecReadLock("GetSrmVersion", [&] { + return OEMCrypto_GetCurrentSRMVersion(srm_version); }); // SRM is an optional feature. Whether it is implemented is up to the - // discretion of OEMs - if (status == OEMCrypto_ERROR_NOT_IMPLEMENTED) { - LOGV("OEMCrypto_GetCurrentSRMVersion not implemented"); - return NOT_IMPLEMENTED_ERROR; + // discretion of OEMs. OEMs may implement this method, but SRM is not + // required if there is only a local display, as such no SRM version + // is available/reportable. |srm_version| is only set if SUCCESS is + // returned. + switch (status) { + case OEMCrypto_SUCCESS: + return NO_ERROR; + case OEMCrypto_LOCAL_DISPLAY_ONLY: + LOGD("No SRM: Local display only"); + return NO_SRM_VERSION; + case OEMCrypto_ERROR_NOT_IMPLEMENTED: + LOGD("No SRM: Not implemented"); + return NO_SRM_VERSION; + default: + return MapOEMCryptoResult(status, GET_SRM_VERSION_ERROR, + "GetCurrentSRMVersion"); } - - return MapOEMCryptoResult(status, GET_SRM_VERSION_ERROR, - "GetCurrentSRMVersion"); } bool CryptoSession::IsSrmUpdateSupported() { LOGV("Checking if SRM update is supported"); - if (!IsInitialized()) return false; + RETURN_IF_UNINITIALIZED(false); return WithOecReadLock("IsSrmUpdateSupported", [&] { return OEMCrypto_IsSRMUpdateSupported(); }); } @@ -1944,10 +1952,9 @@ CdmResponseType CryptoSession::LoadSrm(const std::string& srm) { return INVALID_SRM_LIST; } - OEMCryptoResult status; - WithOecWriteLock("LoadSrm", [&] { - status = OEMCrypto_LoadSRM(reinterpret_cast(srm.data()), - srm.size()); + const OEMCryptoResult status = WithOecWriteLock("LoadSrm", [&] { + return OEMCrypto_LoadSRM(reinterpret_cast(srm.data()), + srm.size()); }); return MapOEMCryptoResult(status, LOAD_SRM_ERROR, "LoadSRM"); diff --git a/libwvdrmengine/cdm/core/test/test_printers.cpp b/libwvdrmengine/cdm/core/test/test_printers.cpp index 909ccdd7..05ea0660 100644 --- a/libwvdrmengine/cdm/core/test/test_printers.cpp +++ b/libwvdrmengine/cdm/core/test/test_printers.cpp @@ -596,6 +596,9 @@ void PrintTo(const enum CdmResponseType& value, ::std::ostream* os) { case NO_MATCHING_ENTITLEMENT_KEY: *os << "NO_MATCHING_ENTITLEMENT_KEY"; break; + case NO_SRM_VERSION: + *os << "NO_SRM_VERSION"; + break; case NONCE_GENERATION_ERROR: *os << "NONCE_GENERATION_ERROR"; break; diff --git a/libwvdrmengine/include/WVErrors.h b/libwvdrmengine/include/WVErrors.h index c495e083..59c1463b 100644 --- a/libwvdrmengine/include/WVErrors.h +++ b/libwvdrmengine/include/WVErrors.h @@ -297,10 +297,11 @@ enum { kLicenseUsageEntryMissing = ERROR_DRM_VENDOR_MIN + 312, kLoadUsageEntryInvalidSession = ERROR_DRM_VENDOR_MIN + 313, kRestoreOfflineLicenseError3 = ERROR_DRM_VENDOR_MIN + 314, + kNoSrmVersion = ERROR_DRM_VENDOR_MIN + 315, // This should always follow the last error code. // The offset value should be updated each time a new error code is added. - kErrorWVDrmMaxErrorUsed = ERROR_DRM_VENDOR_MIN + 314, + kErrorWVDrmMaxErrorUsed = ERROR_DRM_VENDOR_MIN + 315, // Used by crypto test mode kErrorTestMode = ERROR_DRM_VENDOR_MAX, diff --git a/libwvdrmengine/include/mapErrors-inl.h b/libwvdrmengine/include/mapErrors-inl.h index 45825189..72b375cf 100644 --- a/libwvdrmengine/include/mapErrors-inl.h +++ b/libwvdrmengine/include/mapErrors-inl.h @@ -402,6 +402,8 @@ static android::status_t mapCdmResponseType(wvcdm::CdmResponseType res) { return kNoContentKey2; case wvcdm::NO_DEVICE_KEY_1: return kNoDeviceKey1; + case wvcdm::NO_SRM_VERSION: + return kNoSrmVersion; case wvcdm::NO_USAGE_ENTRIES: return kNoUsageEntries; case wvcdm::OFFLINE_LICENSE_PROHIBITED: diff --git a/libwvdrmengine/include_hidl/mapErrors-inl.h b/libwvdrmengine/include_hidl/mapErrors-inl.h index ea14e1b5..92a0dddd 100644 --- a/libwvdrmengine/include_hidl/mapErrors-inl.h +++ b/libwvdrmengine/include_hidl/mapErrors-inl.h @@ -356,6 +356,7 @@ static Status mapCdmResponseType(wvcdm::CdmResponseType res) { case wvcdm::SHRINK_USAGE_TABLE_HEADER_ENTRY_IN_USE: case wvcdm::LICENSE_USAGE_ENTRY_MISSING: case wvcdm::PROVISIONING_NOT_ALLOWED_FOR_ATSC: + case wvcdm::NO_SRM_VERSION: ALOGW("Returns UNKNOWN error for legacy status: %d", res); return Status::ERROR_DRM_UNKNOWN;