From 97bbc071741422668fc3dce584f181f019a744a4 Mon Sep 17 00:00:00 2001 From: Edwin Wong Date: Wed, 4 Jan 2023 01:56:05 +0000 Subject: [PATCH] Fixed race condition in closeSession Merged from http://go/wvgerrit/165059 poc: http://go/ag/20978761 Fix race that corrupts mCryptoSessions std::map, and race that occurs when CryptoSessions are used after free. Test: poc Test: atest MediaDrmParameterizedTests Test: atest GtsMediaTestCases Bug: 258189255 Change-Id: I298d3e0770ace9cd590dfaacaa4c52a0732c2fe3 Merged-In: I298d3e0770ace9cd590dfaacaa4c52a0732c2fe3 --- libwvdrmengine/mediadrm/include/WVDrmPlugin.h | 48 +++++++++- .../mediadrm/include_hidl/WVDrmPlugin.h | 40 +++++++- libwvdrmengine/mediadrm/src/WVDrmPlugin.cpp | 93 +++++++++--------- .../mediadrm/src_hidl/WVDrmPlugin.cpp | 94 +++++++++---------- 4 files changed, 173 insertions(+), 102 deletions(-) diff --git a/libwvdrmengine/mediadrm/include/WVDrmPlugin.h b/libwvdrmengine/mediadrm/include/WVDrmPlugin.h index 3284a901..55acd025 100644 --- a/libwvdrmengine/mediadrm/include/WVDrmPlugin.h +++ b/libwvdrmengine/mediadrm/include/WVDrmPlugin.h @@ -7,15 +7,17 @@ #ifndef WV_DRM_PLUGIN_H_ #define WV_DRM_PLUGIN_H_ -#include #include +#include +#include +#include "OEMCryptoCENC.h" +#include "WVGenericCryptoInterface.h" #include "cdm_client_property_set.h" #include "cdm_identifier.h" #include "media/drm/DrmAPI.h" #include "media/stagefright/foundation/ABase.h" #include "media/stagefright/foundation/AString.h" -#include "OEMCryptoCENC.h" #include "utils/Errors.h" #include "utils/KeyedVector.h" #include "utils/List.h" @@ -24,7 +26,6 @@ #include "utils/Vector.h" #include "wv_cdm_event_listener.h" #include "wv_content_decryption_module.h" -#include "WVGenericCryptoInterface.h" namespace wvdrm { @@ -36,8 +37,8 @@ using android::Vector; using std::map; using wvcdm::CdmIdentifier; using wvcdm::CdmKeyStatusMap; -using wvcdm::CdmSessionId; using wvcdm::CdmResponseType; +using wvcdm::CdmSessionId; using wvcdm::WvContentDecryptionModule; const OEMCrypto_Algorithm kInvalidCryptoAlgorithm = @@ -265,9 +266,46 @@ class WVDrmPlugin : public android::DrmPlugin, const std::string mEmptyString; } mPropertySet; + class CryptoSessionMap { + public: + std::map> clear() { + std::unique_lock auto_lock(mLock); + auto copy = mMap; + mMap.clear(); + return copy; + } + + std::shared_ptr get(const CdmSessionId& sid) { + std::unique_lock auto_lock(mLock); + if (mMap.count(sid)) { + return mMap[sid]; + } + return nullptr; + } + + bool empty() { + std::unique_lock auto_lock(mLock); + return mMap.empty(); + } + + void erase(const CdmSessionId& sid) { + std::unique_lock auto_lock(mLock); + mMap.erase(sid); + } + + void insert(const CdmSessionId& sid, OEMCrypto_SESSION osid) { + std::unique_lock auto_lock(mLock); + mMap[sid] = std::make_shared(osid); + } + + private: + std::mutex mLock; + std::map> mMap; + }; + android::sp const mCDM; WVGenericCryptoInterface* mCrypto; - map mCryptoSessions; + CryptoSessionMap mCryptoSessions; CdmIdentifier mCdmIdentifier; diff --git a/libwvdrmengine/mediadrm/include_hidl/WVDrmPlugin.h b/libwvdrmengine/mediadrm/include_hidl/WVDrmPlugin.h index 2b697e1e..0f83aa81 100644 --- a/libwvdrmengine/mediadrm/include_hidl/WVDrmPlugin.h +++ b/libwvdrmengine/mediadrm/include_hidl/WVDrmPlugin.h @@ -8,6 +8,7 @@ #define WV_DRM_PLUGIN_H_ #include +#include #include "cdm_client_property_set.h" #include "cdm_identifier.h" @@ -431,9 +432,46 @@ struct WVDrmPlugin : public IDrmPlugin, IDrmPluginListener, uint32_t getNextUniqueId(); } mCdmIdentifierBuilder; + class CryptoSessionMap { + public: + std::map> clear() { + std::unique_lock auto_lock(mLock); + auto copy = mMap; + mMap.clear(); + return copy; + } + + std::shared_ptr get(const CdmSessionId& sid) { + std::unique_lock auto_lock(mLock); + if (mMap.count(sid)) { + return mMap[sid]; + } + return nullptr; + } + + bool empty() { + std::unique_lock auto_lock(mLock); + return mMap.empty(); + } + + void erase(const CdmSessionId& sid) { + std::unique_lock auto_lock(mLock); + mMap.erase(sid); + } + + void insert(const CdmSessionId& sid, OEMCrypto_SESSION osid) { + std::unique_lock auto_lock(mLock); + mMap[sid] = std::make_shared(osid); + } + + private: + std::mutex mLock; + std::map> mMap; + }; + sp const mCDM; WVGenericCryptoInterface* mCrypto; - map mCryptoSessions; + CryptoSessionMap mCryptoSessions; sp mListener; sp mListenerV1_2; diff --git a/libwvdrmengine/mediadrm/src/WVDrmPlugin.cpp b/libwvdrmengine/mediadrm/src/WVDrmPlugin.cpp index 70164ae4..8a19878c 100644 --- a/libwvdrmengine/mediadrm/src/WVDrmPlugin.cpp +++ b/libwvdrmengine/mediadrm/src/WVDrmPlugin.cpp @@ -31,6 +31,8 @@ namespace { namespace wvdrm { +using std::shared_ptr; + using namespace android; using namespace std; using namespace wvcdm; @@ -85,16 +87,17 @@ WVDrmPlugin::WVDrmPlugin(const sp& cdm, mCdmIdentifier(kDefaultCdmIdentifier) {} WVDrmPlugin::~WVDrmPlugin() { - typedef map::iterator mapIterator; - for (mapIterator iter = mCryptoSessions.begin(); - iter != mCryptoSessions.end(); - ++iter) { + typedef map>::iterator mapIterator; + auto cryptoSessions = mCryptoSessions.clear(); + for (mapIterator iter = cryptoSessions.begin(); + iter != cryptoSessions.end(); ++iter) { CdmResponseType res = mCDM->CloseSession(iter->first); if (!isCdmResponseTypeSuccess(res)) { ALOGE("Failed to close session while destroying WVDrmPlugin"); } } - mCryptoSessions.clear(); + // clear local copy of cryptoSessions map + cryptoSessions.clear(); } status_t WVDrmPlugin::openSession(Vector& sessionId) { @@ -117,7 +120,7 @@ status_t WVDrmPlugin::openSession(Vector& sessionId) { info.count(QUERY_KEY_OEMCRYPTO_SESSION_ID)) { OEMCrypto_SESSION oecSessionId = std::stoul(info[QUERY_KEY_OEMCRYPTO_SESSION_ID]); - mCryptoSessions[cdmSessionId] = CryptoSession(oecSessionId); + mCryptoSessions.insert(cdmSessionId, oecSessionId); success = true; } else { ALOGE("Unable to query key control info."); @@ -599,7 +602,7 @@ status_t WVDrmPlugin::getPropertyByteArray(const String8& name, status_t WVDrmPlugin::setPropertyString(const String8& name, const String8& value) { if (name == "securityLevel") { - if (mCryptoSessions.size() == 0) { + if (mCryptoSessions.empty()) { if (value == QUERY_VALUE_SECURITY_LEVEL_L3.c_str()) { mPropertySet.set_security_level(QUERY_VALUE_SECURITY_LEVEL_L3); } else if (value == QUERY_VALUE_SECURITY_LEVEL_L1.c_str()) { @@ -636,7 +639,7 @@ status_t WVDrmPlugin::setPropertyString(const String8& name, return android::BAD_VALUE; } } else if (name == "sessionSharing") { - if (mCryptoSessions.size() == 0) { + if (mCryptoSessions.empty()) { if (value == kEnable) { mPropertySet.set_is_session_sharing_enabled(true); } else if (value == kDisable) { @@ -650,14 +653,14 @@ status_t WVDrmPlugin::setPropertyString(const String8& name, return kErrorSessionIsOpen; } } else if (name == "appId") { - if (mCryptoSessions.size() == 0) { + if (mCryptoSessions.empty()) { mPropertySet.set_app_id(value.string()); } else { ALOGE("App tried to set the application id while sessions are opened."); return kErrorSessionIsOpen; } } else if (name == "origin") { - if (mCryptoSessions.size() != 0) { + if (!mCryptoSessions.empty()) { ALOGE("App tried to set the origin while sessions are opened."); return kErrorSessionIsOpen; } else { @@ -720,14 +723,13 @@ status_t WVDrmPlugin::setCipherAlgorithm(const Vector& sessionId, return android::BAD_VALUE; } CdmSessionId cdmSessionId(sessionId.begin(), sessionId.end()); - if (!mCryptoSessions.count(cdmSessionId)) { + shared_ptr cryptoSession = mCryptoSessions.get(cdmSessionId); + if (cryptoSession == nullptr) { return android::ERROR_DRM_SESSION_NOT_OPENED; } - CryptoSession& cryptoSession = mCryptoSessions[cdmSessionId]; - if (algorithm == "AES/CBC/NoPadding") { - cryptoSession.setCipherAlgorithm(OEMCrypto_AES_CBC_128_NO_PADDING); + cryptoSession->setCipherAlgorithm(OEMCrypto_AES_CBC_128_NO_PADDING); } else { return android::ERROR_DRM_CANNOT_HANDLE; } @@ -741,14 +743,13 @@ status_t WVDrmPlugin::setMacAlgorithm(const Vector& sessionId, return android::BAD_VALUE; } CdmSessionId cdmSessionId(sessionId.begin(), sessionId.end()); - if (!mCryptoSessions.count(cdmSessionId)) { + shared_ptr cryptoSession = mCryptoSessions.get(cdmSessionId); + if (cryptoSession == nullptr) { return android::ERROR_DRM_SESSION_NOT_OPENED; } - CryptoSession& cryptoSession = mCryptoSessions[cdmSessionId]; - if (algorithm == "HmacSHA256") { - cryptoSession.setMacAlgorithm(OEMCrypto_HMAC_SHA256); + cryptoSession->setMacAlgorithm(OEMCrypto_HMAC_SHA256); } else { return android::ERROR_DRM_CANNOT_HANDLE; } @@ -762,17 +763,16 @@ status_t WVDrmPlugin::encrypt(const Vector& sessionId, const Vector& iv, Vector& output) { CdmSessionId cdmSessionId(sessionId.begin(), sessionId.end()); - if (!mCryptoSessions.count(cdmSessionId)) { + const shared_ptr cryptoSession = mCryptoSessions.get(cdmSessionId); + if (cryptoSession == nullptr) { return android::ERROR_DRM_SESSION_NOT_OPENED; } - const CryptoSession& cryptoSession = mCryptoSessions[cdmSessionId]; - - if (cryptoSession.cipherAlgorithm() == kInvalidCryptoAlgorithm) { + if (cryptoSession->cipherAlgorithm() == kInvalidCryptoAlgorithm) { return android::NO_INIT; } - OEMCryptoResult res = mCrypto->selectKey(cryptoSession.oecSessionId(), + OEMCryptoResult res = mCrypto->selectKey(cryptoSession->oecSessionId(), keyId.array(), keyId.size()); if (res != OEMCrypto_SUCCESS) { @@ -782,9 +782,9 @@ status_t WVDrmPlugin::encrypt(const Vector& sessionId, output.resize(input.size()); - res = mCrypto->encrypt(cryptoSession.oecSessionId(), input.array(), + res = mCrypto->encrypt(cryptoSession->oecSessionId(), input.array(), input.size(), iv.array(), - cryptoSession.cipherAlgorithm(), output.editArray()); + cryptoSession->cipherAlgorithm(), output.editArray()); if (res == OEMCrypto_SUCCESS) { return android::OK; @@ -800,17 +800,16 @@ status_t WVDrmPlugin::decrypt(const Vector& sessionId, const Vector& iv, Vector& output) { CdmSessionId cdmSessionId(sessionId.begin(), sessionId.end()); - if (!mCryptoSessions.count(cdmSessionId)) { + const shared_ptr cryptoSession = mCryptoSessions.get(cdmSessionId); + if (cryptoSession == nullptr) { return android::ERROR_DRM_SESSION_NOT_OPENED; } - const CryptoSession& cryptoSession = mCryptoSessions[cdmSessionId]; - - if (cryptoSession.cipherAlgorithm() == kInvalidCryptoAlgorithm) { + if (cryptoSession->cipherAlgorithm() == kInvalidCryptoAlgorithm) { return android::NO_INIT; } - OEMCryptoResult res = mCrypto->selectKey(cryptoSession.oecSessionId(), + OEMCryptoResult res = mCrypto->selectKey(cryptoSession->oecSessionId(), keyId.array(), keyId.size()); if (res != OEMCrypto_SUCCESS) { @@ -820,9 +819,9 @@ status_t WVDrmPlugin::decrypt(const Vector& sessionId, output.resize(input.size()); - res = mCrypto->decrypt(cryptoSession.oecSessionId(), input.array(), + res = mCrypto->decrypt(cryptoSession->oecSessionId(), input.array(), input.size(), iv.array(), - cryptoSession.cipherAlgorithm(), output.editArray()); + cryptoSession->cipherAlgorithm(), output.editArray()); if (res == OEMCrypto_SUCCESS) { return android::OK; @@ -837,17 +836,16 @@ status_t WVDrmPlugin::sign(const Vector& sessionId, const Vector& message, Vector& signature) { CdmSessionId cdmSessionId(sessionId.begin(), sessionId.end()); - if (!mCryptoSessions.count(cdmSessionId)) { + const shared_ptr cryptoSession = mCryptoSessions.get(cdmSessionId); + if (cryptoSession == nullptr) { return android::ERROR_DRM_SESSION_NOT_OPENED; } - const CryptoSession& cryptoSession = mCryptoSessions[cdmSessionId]; - - if (cryptoSession.macAlgorithm() == kInvalidCryptoAlgorithm) { + if (cryptoSession->macAlgorithm() == kInvalidCryptoAlgorithm) { return android::NO_INIT; } - OEMCryptoResult res = mCrypto->selectKey(cryptoSession.oecSessionId(), + OEMCryptoResult res = mCrypto->selectKey(cryptoSession->oecSessionId(), keyId.array(), keyId.size()); if (res != OEMCrypto_SUCCESS) { @@ -857,8 +855,8 @@ status_t WVDrmPlugin::sign(const Vector& sessionId, size_t signatureSize = 0; - res = mCrypto->sign(cryptoSession.oecSessionId(), message.array(), - message.size(), cryptoSession.macAlgorithm(), + res = mCrypto->sign(cryptoSession->oecSessionId(), message.array(), + message.size(), cryptoSession->macAlgorithm(), NULL, &signatureSize); if (res != OEMCrypto_ERROR_SHORT_BUFFER) { @@ -873,8 +871,8 @@ status_t WVDrmPlugin::sign(const Vector& sessionId, signature.resize(signatureSize); - res = mCrypto->sign(cryptoSession.oecSessionId(), message.array(), - message.size(), cryptoSession.macAlgorithm(), + res = mCrypto->sign(cryptoSession->oecSessionId(), message.array(), + message.size(), cryptoSession->macAlgorithm(), signature.editArray(), &signatureSize); if (res == OEMCrypto_SUCCESS) { @@ -891,17 +889,16 @@ status_t WVDrmPlugin::verify(const Vector& sessionId, const Vector& signature, bool& match) { CdmSessionId cdmSessionId(sessionId.begin(), sessionId.end()); - if (!mCryptoSessions.count(cdmSessionId)) { + const shared_ptr cryptoSession = mCryptoSessions.get(cdmSessionId); + if (cryptoSession == nullptr) { return android::ERROR_DRM_SESSION_NOT_OPENED; } - const CryptoSession& cryptoSession = mCryptoSessions[cdmSessionId]; - - if (cryptoSession.macAlgorithm() == kInvalidCryptoAlgorithm) { + if (cryptoSession->macAlgorithm() == kInvalidCryptoAlgorithm) { return android::NO_INIT; } - OEMCryptoResult res = mCrypto->selectKey(cryptoSession.oecSessionId(), + OEMCryptoResult res = mCrypto->selectKey(cryptoSession->oecSessionId(), keyId.array(), keyId.size()); if (res != OEMCrypto_SUCCESS) { @@ -909,8 +906,8 @@ status_t WVDrmPlugin::verify(const Vector& sessionId, return mapAndNotifyOfOEMCryptoResult(sessionId, res); } - res = mCrypto->verify(cryptoSession.oecSessionId(), message.array(), - message.size(), cryptoSession.macAlgorithm(), + res = mCrypto->verify(cryptoSession->oecSessionId(), message.array(), + message.size(), cryptoSession->macAlgorithm(), signature.array(), signature.size()); if (res == OEMCrypto_SUCCESS) { diff --git a/libwvdrmengine/mediadrm/src_hidl/WVDrmPlugin.cpp b/libwvdrmengine/mediadrm/src_hidl/WVDrmPlugin.cpp index 0801829b..2014fc95 100644 --- a/libwvdrmengine/mediadrm/src_hidl/WVDrmPlugin.cpp +++ b/libwvdrmengine/mediadrm/src_hidl/WVDrmPlugin.cpp @@ -43,6 +43,8 @@ namespace drm { namespace V1_2 { namespace widevine { +using std::shared_ptr; + using android::hardware::drm::V1_2::widevine::toHidlVec; using android::hardware::drm::V1_2::widevine::toVector; using wvcdm::kDefaultCdmIdentifier; @@ -197,16 +199,18 @@ WVDrmPlugin::WVDrmPlugin(const sp& cdm, mAppPackageName(appPackageName) {} WVDrmPlugin::~WVDrmPlugin() { - typedef map::iterator mapIterator; - for (mapIterator iter = mCryptoSessions.begin(); - iter != mCryptoSessions.end(); - ++iter) { + typedef map>::iterator mapIterator; + auto cryptoSessions = mCryptoSessions.clear(); + for (mapIterator iter = cryptoSessions.begin(); + iter != cryptoSessions.end(); ++iter) { CdmResponseType res = mCDM->CloseSession(iter->first); if (!isCdmResponseTypeSuccess(res)) { ALOGE("Failed to close session while destroying WVDrmPlugin"); } } - mCryptoSessions.clear(); + // clear local copy of cryptoSessions map + cryptoSessions.clear(); + if (mCdmIdentifierBuilder.is_sealed()) { CdmIdentifier identifier; Status status = mCdmIdentifierBuilder.getCdmIdentifier(&identifier); @@ -250,7 +254,7 @@ Status WVDrmPlugin::openSessionCommon(std::vector& sessionId) { info.count(wvcdm::QUERY_KEY_OEMCRYPTO_SESSION_ID)) { OEMCrypto_SESSION oecSessionId = std::stoul(info[wvcdm::QUERY_KEY_OEMCRYPTO_SESSION_ID]); - mCryptoSessions[cdmSessionId] = CryptoSession(oecSessionId); + mCryptoSessions.insert(cdmSessionId, oecSessionId); success = true; } else { ALOGE("Unable to query key control info."); @@ -1343,7 +1347,7 @@ Return WVDrmPlugin::setPropertyString(const hidl_string& propertyName, std::string _value(value.c_str()); if (name == "securityLevel") { - if (mCryptoSessions.size() == 0) { + if (mCryptoSessions.empty()) { if (_value == wvcdm::QUERY_VALUE_SECURITY_LEVEL_L3.c_str()) { mPropertySet.set_security_level(wvcdm::QUERY_VALUE_SECURITY_LEVEL_L3); } else if (_value == wvcdm::QUERY_VALUE_SECURITY_LEVEL_L1.c_str()) { @@ -1383,7 +1387,7 @@ Return WVDrmPlugin::setPropertyString(const hidl_string& propertyName, return Status::BAD_VALUE; } } else if (name == "sessionSharing") { - if (mCryptoSessions.size() == 0) { + if (mCryptoSessions.empty()) { if (_value == kEnable) { mPropertySet.set_is_session_sharing_enabled(true); } else if (_value == kDisable) { @@ -1398,7 +1402,7 @@ Return WVDrmPlugin::setPropertyString(const hidl_string& propertyName, return Status::ERROR_DRM_UNKNOWN; } } else if (name == "appId") { - if (mCryptoSessions.size() == 0) { + if (mCryptoSessions.empty()) { mPropertySet.set_app_id(_value.c_str()); } else { ALOGE("App tried to set the application id while sessions are opened."); @@ -1406,7 +1410,7 @@ Return WVDrmPlugin::setPropertyString(const hidl_string& propertyName, return Status::ERROR_DRM_UNKNOWN; } } else if (name == "origin") { - if (mCryptoSessions.size() != 0) { + if (!mCryptoSessions.empty()) { ALOGE("App tried to set the origin while sessions are opened."); ALOGW("Returns UNKNOWN error for legacy status kErrorSessionIsOpen"); return Status::ERROR_DRM_UNKNOWN; @@ -1488,14 +1492,13 @@ Return WVDrmPlugin::setCipherAlgorithm( std::vector sId = toVector(sessionId); CdmSessionId cdmSessionId(sId.begin(), sId.end()); - if (!mCryptoSessions.count(cdmSessionId)) { + shared_ptr cryptoSession = mCryptoSessions.get(cdmSessionId); + if (cryptoSession == nullptr) { return Status::ERROR_DRM_SESSION_NOT_OPENED; } - CryptoSession& cryptoSession = mCryptoSessions[cdmSessionId]; - if (algo == "AES/CBC/NoPadding") { - cryptoSession.setCipherAlgorithm(OEMCrypto_AES_CBC_128_NO_PADDING); + cryptoSession->setCipherAlgorithm(OEMCrypto_AES_CBC_128_NO_PADDING); } else { return Status::ERROR_DRM_CANNOT_HANDLE; } @@ -1513,14 +1516,13 @@ Return WVDrmPlugin::setMacAlgorithm( std::vector sId = toVector(sessionId); CdmSessionId cdmSessionId(sId.begin(), sId.end()); - if (!mCryptoSessions.count(cdmSessionId)) { + shared_ptr cryptoSession = mCryptoSessions.get(cdmSessionId); + if (cryptoSession == nullptr) { return Status::ERROR_DRM_SESSION_NOT_OPENED; } - CryptoSession& cryptoSession = mCryptoSessions[cdmSessionId]; - if (algo == "HmacSHA256") { - cryptoSession.setMacAlgorithm(OEMCrypto_HMAC_SHA256); + cryptoSession->setMacAlgorithm(OEMCrypto_HMAC_SHA256); } else { return Status::ERROR_DRM_CANNOT_HANDLE; } @@ -1539,21 +1541,20 @@ Return WVDrmPlugin::encrypt( std::vector output; CdmSessionId cdmSessionId(sId.begin(), sId.end()); - if (!mCryptoSessions.count(cdmSessionId)) { + const shared_ptr cryptoSession = mCryptoSessions.get(cdmSessionId); + if (cryptoSession == nullptr) { _hidl_cb(Status::ERROR_DRM_SESSION_NOT_OPENED, toHidlVec(output)); return Void(); } - const CryptoSession& cryptoSession = mCryptoSessions[cdmSessionId]; - - if (cryptoSession.cipherAlgorithm() == kInvalidCryptoAlgorithm) { + if (cryptoSession->cipherAlgorithm() == kInvalidCryptoAlgorithm) { ALOGW("Returns UNKNOWN error for legacy status NO_INIT"); _hidl_cb(Status::ERROR_DRM_UNKNOWN, toHidlVec(output)); return Void(); } const std::vector _keyId = toVector(keyId); - OEMCryptoResult res = mCrypto->selectKey(cryptoSession.oecSessionId(), + OEMCryptoResult res = mCrypto->selectKey(cryptoSession->oecSessionId(), _keyId.data(), _keyId.size()); if (res != OEMCrypto_SUCCESS) { @@ -1567,9 +1568,9 @@ Return WVDrmPlugin::encrypt( const std::vector _iv = toVector(iv); output.resize(_input.size()); - res = mCrypto->encrypt(cryptoSession.oecSessionId(), _input.data(), + res = mCrypto->encrypt(cryptoSession->oecSessionId(), _input.data(), _input.size(), _iv.data(), - cryptoSession.cipherAlgorithm(), output.data()); + cryptoSession->cipherAlgorithm(), output.data()); if (res == OEMCrypto_SUCCESS) { _hidl_cb(Status::OK, toHidlVec(output)); @@ -1592,21 +1593,20 @@ Return WVDrmPlugin::decrypt( std::vector output; CdmSessionId cdmSessionId(sId.begin(), sId.end()); - if (!mCryptoSessions.count(cdmSessionId)) { + const shared_ptr cryptoSession = mCryptoSessions.get(cdmSessionId); + if (cryptoSession == nullptr) { _hidl_cb(Status::ERROR_DRM_SESSION_NOT_OPENED, toHidlVec(output)); return Void(); } - const CryptoSession& cryptoSession = mCryptoSessions[cdmSessionId]; - - if (cryptoSession.cipherAlgorithm() == kInvalidCryptoAlgorithm) { + if (cryptoSession->cipherAlgorithm() == kInvalidCryptoAlgorithm) { ALOGW("Returns UNKNOWN error for legacy status NO_INIT"); _hidl_cb(Status::ERROR_DRM_UNKNOWN, toHidlVec(output)); return Void(); } const std::vector _keyId = toVector(keyId); - OEMCryptoResult res = mCrypto->selectKey(cryptoSession.oecSessionId(), + OEMCryptoResult res = mCrypto->selectKey(cryptoSession->oecSessionId(), _keyId.data(), _keyId.size()); if (res != OEMCrypto_SUCCESS) { @@ -1620,9 +1620,9 @@ Return WVDrmPlugin::decrypt( const std::vector _iv = toVector(iv); output.resize(_input.size()); - res = mCrypto->decrypt(cryptoSession.oecSessionId(), _input.data(), + res = mCrypto->decrypt(cryptoSession->oecSessionId(), _input.data(), _input.size(), _iv.data(), - cryptoSession.cipherAlgorithm(), output.data()); + cryptoSession->cipherAlgorithm(), output.data()); if (res == OEMCrypto_SUCCESS) { _hidl_cb(Status::OK, toHidlVec(output)); @@ -1644,21 +1644,20 @@ Return WVDrmPlugin::sign( std::vector signature; CdmSessionId cdmSessionId(sId.begin(), sId.end()); - if (!mCryptoSessions.count(cdmSessionId)) { + const shared_ptr cryptoSession = mCryptoSessions.get(cdmSessionId); + if (cryptoSession == nullptr) { _hidl_cb(Status::ERROR_DRM_SESSION_NOT_OPENED, toHidlVec(signature)); return Void(); } - const CryptoSession& cryptoSession = mCryptoSessions[cdmSessionId]; - - if (cryptoSession.macAlgorithm() == kInvalidCryptoAlgorithm) { + if (cryptoSession->macAlgorithm() == kInvalidCryptoAlgorithm) { ALOGW("Returns UNKNOWN error for legacy status NO_INIT"); _hidl_cb(Status::ERROR_DRM_UNKNOWN, toHidlVec(signature)); return Void(); } const std::vector _keyId = toVector(keyId); - OEMCryptoResult res = mCrypto->selectKey(cryptoSession.oecSessionId(), + OEMCryptoResult res = mCrypto->selectKey(cryptoSession->oecSessionId(), _keyId.data(), _keyId.size()); if (res != OEMCrypto_SUCCESS) { @@ -1671,8 +1670,8 @@ Return WVDrmPlugin::sign( size_t signatureSize = 0; const std::vector msg = toVector(message); - res = mCrypto->sign(cryptoSession.oecSessionId(), msg.data(), - msg.size(), cryptoSession.macAlgorithm(), + res = mCrypto->sign(cryptoSession->oecSessionId(), msg.data(), + msg.size(), cryptoSession->macAlgorithm(), NULL, &signatureSize); if (res != OEMCrypto_ERROR_SHORT_BUFFER) { @@ -1689,8 +1688,8 @@ Return WVDrmPlugin::sign( signature.resize(signatureSize); - res = mCrypto->sign(cryptoSession.oecSessionId(), msg.data(), - msg.size(), cryptoSession.macAlgorithm(), + res = mCrypto->sign(cryptoSession->oecSessionId(), msg.data(), + msg.size(), cryptoSession->macAlgorithm(), signature.data(), &signatureSize); if (res == OEMCrypto_SUCCESS) { @@ -1714,21 +1713,20 @@ Return WVDrmPlugin::verify( const std::vector sId = toVector(sessionId); CdmSessionId cdmSessionId(sId.begin(), sId.end()); - if (!mCryptoSessions.count(cdmSessionId)) { + const shared_ptr cryptoSession = mCryptoSessions.get(cdmSessionId); + if (cryptoSession == nullptr) { _hidl_cb(Status::ERROR_DRM_SESSION_NOT_OPENED, match); return Void(); } - const CryptoSession& cryptoSession = mCryptoSessions[cdmSessionId]; - - if (cryptoSession.macAlgorithm() == kInvalidCryptoAlgorithm) { + if (cryptoSession->macAlgorithm() == kInvalidCryptoAlgorithm) { ALOGW("Returns UNKNOWN error for legacy status NO_INIT"); _hidl_cb(Status::ERROR_DRM_UNKNOWN, match); return Void(); } const std::vector _keyId = toVector(keyId); - OEMCryptoResult res = mCrypto->selectKey(cryptoSession.oecSessionId(), + OEMCryptoResult res = mCrypto->selectKey(cryptoSession->oecSessionId(), _keyId.data(), _keyId.size()); if (res != OEMCrypto_SUCCESS) { @@ -1739,8 +1737,8 @@ Return WVDrmPlugin::verify( const std::vector _message = toVector(message); const std::vector _signature = toVector(signature); - res = mCrypto->verify(cryptoSession.oecSessionId(), _message.data(), - _message.size(), cryptoSession.macAlgorithm(), + res = mCrypto->verify(cryptoSession->oecSessionId(), _message.data(), + _message.size(), cryptoSession->macAlgorithm(), _signature.data(), _signature.size()); if (res == OEMCrypto_SUCCESS) {