diff --git a/libwvdrmengine/cdm/core/include/wv_cdm_constants.h b/libwvdrmengine/cdm/core/include/wv_cdm_constants.h index 8249782a..c04e2149 100644 --- a/libwvdrmengine/cdm/core/include/wv_cdm_constants.h +++ b/libwvdrmengine/cdm/core/include/wv_cdm_constants.h @@ -87,6 +87,7 @@ static const std::string QUERY_KEY_DECRYPT_HASH_SUPPORT = static const std::string QUERY_VALUE_TRUE = "True"; static const std::string QUERY_VALUE_FALSE = "False"; +static const std::string QUERY_VALUE_NONE = "None"; static const std::string QUERY_VALUE_STREAMING = "Streaming"; static const std::string QUERY_VALUE_OFFLINE = "Offline"; static const std::string QUERY_VALUE_SECURITY_LEVEL_L1 = "L1"; diff --git a/libwvdrmengine/cdm/core/src/cdm_engine.cpp b/libwvdrmengine/cdm/core/src/cdm_engine.cpp index 8f2a6a30..ed1b4ee4 100644 --- a/libwvdrmengine/cdm/core/src/cdm_engine.cpp +++ b/libwvdrmengine/cdm/core/src/cdm_engine.cpp @@ -631,7 +631,10 @@ 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 != NO_ERROR) { + if (status == NOT_IMPLEMENTED_ERROR) { + *query_response = QUERY_VALUE_NONE; + return NO_ERROR; + } else if (status != NO_ERROR) { LOGW("CdmEngine::QueryStatus: GetCurrentSRMVersion failed: %d", status); return status; } diff --git a/libwvdrmengine/cdm/core/src/crypto_session.cpp b/libwvdrmengine/cdm/core/src/crypto_session.cpp index 6b4a8c04..8b383945 100644 --- a/libwvdrmengine/cdm/core/src/crypto_session.cpp +++ b/libwvdrmengine/cdm/core/src/crypto_session.cpp @@ -1856,6 +1856,14 @@ CdmResponseType CryptoSession::GetSrmVersion(uint16_t* srm_version) { OEMCryptoResult status = 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("CryptoSession::GetSrmVersion: OEMCrypto_GetCurrentSRMVersion not " + "implemented"); + return NOT_IMPLEMENTED_ERROR; + } + return MapOEMCryptoResult( status, GET_SRM_VERSION_ERROR, "GetCurrentSRMVersion"); } diff --git a/libwvdrmengine/cdm/test/request_license_test.cpp b/libwvdrmengine/cdm/test/request_license_test.cpp index e6794f6a..ad089154 100644 --- a/libwvdrmengine/cdm/test/request_license_test.cpp +++ b/libwvdrmengine/cdm/test/request_license_test.cpp @@ -4380,6 +4380,11 @@ TEST_F(WvCdmRequestLicenseTest, QueryStatus) { wvcdm::QUERY_KEY_OEMCRYPTO_BUILD_INFORMATION, &value)); EXPECT_TRUE(!value.empty()); + + EXPECT_EQ(wvcdm::NO_ERROR, + decryptor_.QueryStatus(kLevelDefault, + wvcdm::QUERY_KEY_CURRENT_SRM_VERSION, + &value)); } TEST_F(WvCdmRequestLicenseTest, QueryStatusL3) {