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;