diff --git a/libwvdrmengine/cdm/core/src/crypto_session.cpp b/libwvdrmengine/cdm/core/src/crypto_session.cpp index 426c3399..8cd99493 100644 --- a/libwvdrmengine/cdm/core/src/crypto_session.cpp +++ b/libwvdrmengine/cdm/core/src/crypto_session.cpp @@ -710,6 +710,10 @@ CdmResponseType CryptoSession::LoadKeys( } else if (OEMCrypto_ERROR_TOO_MANY_KEYS == sts) { LOGE("CryptoSession::LoadKeys: OEMCrypto_LoadKeys error=%d", sts); result = INSUFFICIENT_CRYPTO_RESOURCES; + } else if (OEMCrypto_ERROR_USAGE_TABLE_UNRECOVERABLE == sts) { + // Handle vendor specific error + LOGE("CryptoSession::LoadKeys: OEMCrypto_LoadKeys error=%d", sts); + result = NEED_PROVISIONING; } else { LOGE("CryptoSession::LoadKeys: OEMCrypto_LoadKeys error=%d", sts); result = LOAD_KEY_ERROR; diff --git a/libwvdrmengine/cdm/core/src/oemcrypto_adapter_dynamic.cpp b/libwvdrmengine/cdm/core/src/oemcrypto_adapter_dynamic.cpp index 50d12393..5cc3027e 100644 --- a/libwvdrmengine/cdm/core/src/oemcrypto_adapter_dynamic.cpp +++ b/libwvdrmengine/cdm/core/src/oemcrypto_adapter_dynamic.cpp @@ -41,6 +41,8 @@ using wvcdm::kLevel3; namespace { static const size_t kMaxGenericEncryptChunkSize = 100*1024; +OEMCryptoResult kOemCryptoResultVendorSpecificError1 = + static_cast(10008); typedef struct { const uint8_t* key_id; @@ -1156,18 +1158,26 @@ extern "C" OEMCryptoResult OEMCrypto_LoadKeys( } else { if (pair.fcn->LoadKeys_V9_or_V10 == NULL) return OEMCrypto_ERROR_NOT_IMPLEMENTED; - return pair.fcn->LoadKeys_V9_or_V10(pair.session, message, message_length, - signature, signature_length, - enc_mac_key_iv, enc_mac_key, num_keys, - &key_array_v10[0], pst, pst_length); + OEMCryptoResult result = pair.fcn->LoadKeys_V9_or_V10( + pair.session, message, message_length, signature, signature_length, + enc_mac_key_iv, enc_mac_key, num_keys, &key_array_v10[0], pst, + pst_length); + // Convert a vendor specific error, to make it actionable + if (result == kOemCryptoResultVendorSpecificError1) + result = OEMCrypto_ERROR_USAGE_TABLE_UNRECOVERABLE; + return result; } } else { if (pair.fcn->version < 13) { if (pair.fcn->LoadKeys_V11_or_V12 == NULL) return OEMCrypto_ERROR_NOT_IMPLEMENTED; - return pair.fcn->LoadKeys_V11_or_V12( + OEMCryptoResult result = pair.fcn->LoadKeys_V11_or_V12( pair.session, message, message_length, signature, signature_length, enc_mac_key_iv, enc_mac_key, num_keys, key_array, pst, pst_length); + // Convert a vendor specific error, to make it actionable + if (result == kOemCryptoResultVendorSpecificError1) + result = OEMCrypto_ERROR_USAGE_TABLE_UNRECOVERABLE; + return result; } else { if (pair.fcn->LoadKeys == NULL) return OEMCrypto_ERROR_NOT_IMPLEMENTED; return pair.fcn->LoadKeys(pair.session, message, message_length, diff --git a/libwvdrmengine/oemcrypto/include/OEMCryptoCENC.h b/libwvdrmengine/oemcrypto/include/OEMCryptoCENC.h index 79fc2e0d..8fca7c9b 100644 --- a/libwvdrmengine/oemcrypto/include/OEMCryptoCENC.h +++ b/libwvdrmengine/oemcrypto/include/OEMCryptoCENC.h @@ -78,6 +78,7 @@ typedef enum OEMCryptoResult { OEMCrypto_ERROR_LICENSE_INACTIVE = 47, OEMCrypto_ERROR_ENTRY_NEEDS_UPDATE = 48, OEMCrypto_ERROR_ENTRY_IN_USE = 49, + OEMCrypto_ERROR_USAGE_TABLE_UNRECOVERABLE = 50, // Reserved. Do not use. } OEMCryptoResult; /*