From 37f125a4912b50a8e251c2fa4e1532cd753bab15 Mon Sep 17 00:00:00 2001 From: Alex Dale Date: Mon, 24 Apr 2023 14:21:23 -0700 Subject: [PATCH] Piped CdmEngine's generic crypto operations to Android CDM. [ Merge of http://go/wvgerrit/172010 ] The CdmEngine provides an API for generic crypto operations that are already used for the CE CDM. This API is being exposed in the Android CDM. The parameter order of the Android CDM is modified to match the existing generic crypto parameters used in the media DRM plugin. Bug: 274984456 Bug: 29400687 Test: build x86-64 and Android Change-Id: I3b286ebb011bd58754b7b8ea814ed46daf1f62f9 --- .../cdm/core/include/wv_cdm_types.h | 1 + libwvdrmengine/cdm/core/src/wv_cdm_types.cpp | 2 + .../include/wv_content_decryption_module.h | 27 ++++++++ .../cdm/src/wv_content_decryption_module.cpp | 64 +++++++++++++++++++ libwvdrmengine/include/mapErrors-inl.h | 1 + 5 files changed, 95 insertions(+) diff --git a/libwvdrmengine/cdm/core/include/wv_cdm_types.h b/libwvdrmengine/cdm/core/include/wv_cdm_types.h index ce9c4905..6a9fcfe0 100644 --- a/libwvdrmengine/cdm/core/include/wv_cdm_types.h +++ b/libwvdrmengine/cdm/core/include/wv_cdm_types.h @@ -459,6 +459,7 @@ enum CdmResponseEnum : int32_t { UNSUPPORTED_SIGNATURE_HASH_ALGORITHM_4 = 393, STORE_ATSC_LICENSE_DEVICE_FILES_INIT_ERROR = 394, STORE_ATSC_LICENSE_ERROR = 395, + SESSION_NOT_FOUND_GENERIC_CRYPTO = 396, // Don't forget to add new values to // * core/src/wv_cdm_types.cpp // * android/include/mapErrors-inl.h diff --git a/libwvdrmengine/cdm/core/src/wv_cdm_types.cpp b/libwvdrmengine/cdm/core/src/wv_cdm_types.cpp index cca231e8..adfed848 100644 --- a/libwvdrmengine/cdm/core/src/wv_cdm_types.cpp +++ b/libwvdrmengine/cdm/core/src/wv_cdm_types.cpp @@ -865,6 +865,8 @@ const char* CdmResponseEnumToString(CdmResponseEnum cdm_response_enum) { return "STORE_ATSC_LICENSE_DEVICE_FILES_INIT_ERROR"; case STORE_ATSC_LICENSE_ERROR: return "STORE_ATSC_LICENSE_ERROR"; + case SESSION_NOT_FOUND_GENERIC_CRYPTO: + return "SESSION_NOT_FOUND_GENERIC_CRYPTO"; } return UnknownValueRep(cdm_response_enum); } diff --git a/libwvdrmengine/cdm/include/wv_content_decryption_module.h b/libwvdrmengine/cdm/include/wv_content_decryption_module.h index d6f6a5ab..1fda7669 100644 --- a/libwvdrmengine/cdm/include/wv_content_decryption_module.h +++ b/libwvdrmengine/cdm/include/wv_content_decryption_module.h @@ -270,6 +270,33 @@ class WvContentDecryptionModule : public android::RefBase, public TimerHandler { virtual bool SetDefaultOtaKeyboxFallbackDurationRules(); virtual bool SetFastOtaKeyboxFallbackDurationRules(); + // Generic crypto API. + virtual CdmResponseType GenericEncrypt(const CdmSessionId& session_id, + const KeyId& key_id, + const std::string& input, + const std::string& iv, + CdmEncryptionAlgorithm algorithm, + std::string* output); + + virtual CdmResponseType GenericDecrypt(const CdmSessionId& session_id, + const KeyId& key_id, + const std::string& input, + const std::string& iv, + CdmEncryptionAlgorithm algorithm, + std::string* output); + + virtual CdmResponseType GenericSign(const CdmSessionId& session_id, + const KeyId& key_id, + const std::string& input, + CdmSigningAlgorithm algorithm, + std::string* signature); + + virtual CdmResponseType GenericVerify(const CdmSessionId& session_id, + const KeyId& key_id, + const std::string& input, + CdmSigningAlgorithm algorithm, + const std::string& signature); + private: struct CdmInfo { CdmInfo(); diff --git a/libwvdrmengine/cdm/src/wv_content_decryption_module.cpp b/libwvdrmengine/cdm/src/wv_content_decryption_module.cpp index 9ce0108f..f66996cf 100644 --- a/libwvdrmengine/cdm/src/wv_content_decryption_module.cpp +++ b/libwvdrmengine/cdm/src/wv_content_decryption_module.cpp @@ -832,4 +832,68 @@ bool WvContentDecryptionModule::SetFastOtaKeyboxFallbackDurationRules() { return true; } +CdmResponseType WvContentDecryptionModule::GenericEncrypt( + const CdmSessionId& session_id, const KeyId& key_id, + const std::string& input, const std::string& iv, + CdmEncryptionAlgorithm algorithm, std::string* output) { + if (output == nullptr) { + LOGE("Output parameter |output| is null"); + return CdmResponseType(PARAMETER_NULL); + } + CdmEngine* cdm_engine = GetCdmForSessionId(session_id); + if (cdm_engine == nullptr) { + LOGW("Could not find session: sid = %s", wvcdm::IdToString(session_id)); + return CdmResponseType(SESSION_NOT_FOUND_GENERIC_CRYPTO); + } + return cdm_engine->GenericEncrypt(session_id, input, key_id, iv, algorithm, + output); +} + +CdmResponseType WvContentDecryptionModule::GenericDecrypt( + const CdmSessionId& session_id, const KeyId& key_id, + const std::string& input, const std::string& iv, + CdmEncryptionAlgorithm algorithm, std::string* output) { + if (output == nullptr) { + LOGE("Output parameter |output| is null"); + return CdmResponseType(PARAMETER_NULL); + } + CdmEngine* cdm_engine = GetCdmForSessionId(session_id); + if (cdm_engine == nullptr) { + LOGW("Could not find session: sid = %s", wvcdm::IdToString(session_id)); + return CdmResponseType(SESSION_NOT_FOUND_GENERIC_CRYPTO); + } + return cdm_engine->GenericDecrypt(session_id, input, key_id, iv, algorithm, + output); +} + +CdmResponseType WvContentDecryptionModule::GenericSign( + const CdmSessionId& session_id, const KeyId& key_id, + const std::string& input, CdmSigningAlgorithm algorithm, + std::string* signature) { + if (signature == nullptr) { + LOGE("Output parameter |signature| is null"); + return CdmResponseType(PARAMETER_NULL); + } + CdmEngine* cdm_engine = GetCdmForSessionId(session_id); + if (cdm_engine == nullptr) { + LOGW("Could not find session: sid = %s", wvcdm::IdToString(session_id)); + return CdmResponseType(SESSION_NOT_FOUND_GENERIC_CRYPTO); + } + return cdm_engine->GenericSign(session_id, input, key_id, algorithm, + signature); +} + +CdmResponseType WvContentDecryptionModule::GenericVerify( + const CdmSessionId& session_id, const KeyId& key_id, + const std::string& input, CdmSigningAlgorithm algorithm, + const std::string& signature) { + CdmEngine* cdm_engine = GetCdmForSessionId(session_id); + if (cdm_engine == nullptr) { + LOGW("Could not find session: sid = %s", wvcdm::IdToString(session_id)); + return CdmResponseType(SESSION_NOT_FOUND_GENERIC_CRYPTO); + } + return cdm_engine->GenericVerify(session_id, input, key_id, algorithm, + signature); +} + } // namespace wvcdm diff --git a/libwvdrmengine/include/mapErrors-inl.h b/libwvdrmengine/include/mapErrors-inl.h index 776f14d1..62b5cc4d 100644 --- a/libwvdrmengine/include/mapErrors-inl.h +++ b/libwvdrmengine/include/mapErrors-inl.h @@ -75,6 +75,7 @@ static inline WvStatus mapCdmResponseType(wvcdm::CdmResponseType res) { case wvcdm::SESSION_NOT_FOUND_21: case wvcdm::SESSION_NOT_FOUND_22: case wvcdm::SESSION_NOT_FOUND_23: + case wvcdm::SESSION_NOT_FOUND_GENERIC_CRYPTO: err = Status::ERROR_DRM_SESSION_NOT_OPENED; break;