1a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker/* 2a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker * Copyright (C) 2017 The Android Open Source Project 3a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker * 4a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker * Licensed under the Apache License, Version 2.0 (the "License"); 5a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker * you may not use this file except in compliance with the License. 6a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker * You may obtain a copy of the License at 7a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker * 8a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker * http://www.apache.org/licenses/LICENSE-2.0 9a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker * 10a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker * Unless required by applicable law or agreed to in writing, software 11a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker * distributed under the License is distributed on an "AS IS" BASIS, 12a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker * See the License for the specific language governing permissions and 14a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker * limitations under the License. 15a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker */ 16a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 17a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker//#define LOG_NDEBUG 0 18a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#define LOG_TAG "DrmHal" 19fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone#include <iomanip> 20fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone 21a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#include <utils/Log.h> 22a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 23a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#include <binder/IPCThreadState.h> 24a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#include <binder/IServiceManager.h> 25a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 26a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#include <android/hardware/drm/1.0/types.h> 27abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker#include <android/hidl/manager/1.0/IServiceManager.h> 28593111f4460f2b2e8f541e936670e3577d45fff6Jeff Tinker#include <hidl/ServiceManagement.h> 29a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 30f0e618d0ee16c63f918c7bb87ec1ff264d177746Adam Stone#include <media/EventMetric.h> 3133ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce#include <media/PluginMetricsReporting.h> 32a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#include <media/drm/DrmAPI.h> 33a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#include <media/stagefright/foundation/ADebug.h> 34a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#include <media/stagefright/foundation/AString.h> 3532494f5438db362e96b69e5fda7b2fd34633b562Adam Stone#include <media/stagefright/foundation/base64.h> 36a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#include <media/stagefright/foundation/hexdump.h> 37a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#include <media/stagefright/MediaErrors.h> 387d2c6e8be2c9a4f3c1364d243856a345f17f851eJeff Tinker#include <mediadrm/DrmHal.h> 397d2c6e8be2c9a4f3c1364d243856a345f17f851eJeff Tinker#include <mediadrm/DrmSessionClientInterface.h> 407d2c6e8be2c9a4f3c1364d243856a345f17f851eJeff Tinker#include <mediadrm/DrmSessionManager.h> 41a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 426d998b67be330843f633a563c23c606593060165Jeff Tinkerusing drm::V1_0::KeyedVector; 436d998b67be330843f633a563c23c606593060165Jeff Tinkerusing drm::V1_0::KeyStatusType; 446d998b67be330843f633a563c23c606593060165Jeff Tinkerusing drm::V1_0::KeyType; 456d998b67be330843f633a563c23c606593060165Jeff Tinkerusing drm::V1_0::KeyValue; 466d998b67be330843f633a563c23c606593060165Jeff Tinkerusing drm::V1_1::HdcpLevel;; 476d998b67be330843f633a563c23c606593060165Jeff Tinkerusing drm::V1_0::SecureStop; 4815177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinkerusing drm::V1_1::SecureStopRelease; 4915177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinkerusing drm::V1_0::SecureStopId; 506d998b67be330843f633a563c23c606593060165Jeff Tinkerusing drm::V1_1::SecurityLevel; 516d998b67be330843f633a563c23c606593060165Jeff Tinkerusing drm::V1_0::Status; 5228f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stoneusing ::android::hardware::drm::V1_1::DrmMetricGroup; 53a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerusing ::android::hardware::hidl_array; 54a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerusing ::android::hardware::hidl_string; 55a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerusing ::android::hardware::hidl_vec; 56a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerusing ::android::hardware::Return; 57a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerusing ::android::hardware::Void; 58abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinkerusing ::android::hidl::manager::V1_0::IServiceManager; 59637b7855829920114a8863b93fe52203b7471eeaAdam Stoneusing ::android::os::PersistableBundle; 60a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerusing ::android::sp; 61a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 62cea91ce60260d7ebb94449ad7674150fdc227886Adam Stonenamespace { 63cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone 64cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone// This constant corresponds to the PROPERTY_DEVICE_UNIQUE_ID constant 65cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone// in the MediaDrm API. 66cea91ce60260d7ebb94449ad7674150fdc227886Adam Stoneconstexpr char kPropertyDeviceUniqueId[] = "deviceUniqueId"; 6732494f5438db362e96b69e5fda7b2fd34633b562Adam Stoneconstexpr char kEqualsSign[] = "="; 68cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone 6932494f5438db362e96b69e5fda7b2fd34633b562Adam Stonetemplate<typename T> 7032494f5438db362e96b69e5fda7b2fd34633b562Adam Stonestd::string toBase64StringNoPad(const T* data, size_t size) { 71630092e11dcff57a3a70e2fe1935bf58c5331e2fAdam Stone // Note that the base 64 conversion only works with arrays of single-byte 72630092e11dcff57a3a70e2fe1935bf58c5331e2fAdam Stone // values. If the source is empty or is not an array of single-byte values, 73630092e11dcff57a3a70e2fe1935bf58c5331e2fAdam Stone // return empty string. 74630092e11dcff57a3a70e2fe1935bf58c5331e2fAdam Stone if (size == 0 || sizeof(data[0]) != 1) { 7532494f5438db362e96b69e5fda7b2fd34633b562Adam Stone return ""; 7632494f5438db362e96b69e5fda7b2fd34633b562Adam Stone } 7732494f5438db362e96b69e5fda7b2fd34633b562Adam Stone 7832494f5438db362e96b69e5fda7b2fd34633b562Adam Stone android::AString outputString; 7932494f5438db362e96b69e5fda7b2fd34633b562Adam Stone encodeBase64(data, size, &outputString); 8032494f5438db362e96b69e5fda7b2fd34633b562Adam Stone // Remove trailing equals padding if it exists. 8132494f5438db362e96b69e5fda7b2fd34633b562Adam Stone while (outputString.size() > 0 && outputString.endsWith(kEqualsSign)) { 8232494f5438db362e96b69e5fda7b2fd34633b562Adam Stone outputString.erase(outputString.size() - 1, 1); 8332494f5438db362e96b69e5fda7b2fd34633b562Adam Stone } 8432494f5438db362e96b69e5fda7b2fd34633b562Adam Stone 8532494f5438db362e96b69e5fda7b2fd34633b562Adam Stone return std::string(outputString.c_str(), outputString.size()); 86cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone} 87cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone 8832494f5438db362e96b69e5fda7b2fd34633b562Adam Stone} // anonymous namespace 8932494f5438db362e96b69e5fda7b2fd34633b562Adam Stone 90a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkernamespace android { 91a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 926d998b67be330843f633a563c23c606593060165Jeff Tinker#define INIT_CHECK() {if (mInitCheck != OK) return mInitCheck;} 936d998b67be330843f633a563c23c606593060165Jeff Tinker 94a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic inline int getCallingPid() { 95a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return IPCThreadState::self()->getCallingPid(); 96a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 97a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 98a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic bool checkPermission(const char* permissionString) { 99a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (getpid() == IPCThreadState::self()->getCallingPid()) return true; 100a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker bool ok = checkCallingPermission(String16(permissionString)); 101a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (!ok) ALOGE("Request requires %s", permissionString); 102a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return ok; 103a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 104a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 105a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic const Vector<uint8_t> toVector(const hidl_vec<uint8_t> &vec) { 106a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Vector<uint8_t> vector; 107a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker vector.appendArray(vec.data(), vec.size()); 108a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return *const_cast<const Vector<uint8_t> *>(&vector); 109a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 110a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 111a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic hidl_vec<uint8_t> toHidlVec(const Vector<uint8_t> &vector) { 112a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker hidl_vec<uint8_t> vec; 113a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker vec.setToExternal(const_cast<uint8_t *>(vector.array()), vector.size()); 114a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return vec; 115a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 116a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 117a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic String8 toString8(const hidl_string &string) { 118a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return String8(string.c_str()); 119a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 120a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 121a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic hidl_string toHidlString(const String8& string) { 122a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hidl_string(string.string()); 123a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 124a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1256d998b67be330843f633a563c23c606593060165Jeff Tinkerstatic DrmPlugin::SecurityLevel toSecurityLevel(SecurityLevel level) { 1266d998b67be330843f633a563c23c606593060165Jeff Tinker switch(level) { 1276d998b67be330843f633a563c23c606593060165Jeff Tinker case SecurityLevel::SW_SECURE_CRYPTO: 1286d998b67be330843f633a563c23c606593060165Jeff Tinker return DrmPlugin::kSecurityLevelSwSecureCrypto; 1296d998b67be330843f633a563c23c606593060165Jeff Tinker case SecurityLevel::SW_SECURE_DECODE: 1306d998b67be330843f633a563c23c606593060165Jeff Tinker return DrmPlugin::kSecurityLevelSwSecureDecode; 1316d998b67be330843f633a563c23c606593060165Jeff Tinker case SecurityLevel::HW_SECURE_CRYPTO: 1326d998b67be330843f633a563c23c606593060165Jeff Tinker return DrmPlugin::kSecurityLevelHwSecureCrypto; 1336d998b67be330843f633a563c23c606593060165Jeff Tinker case SecurityLevel::HW_SECURE_DECODE: 1346d998b67be330843f633a563c23c606593060165Jeff Tinker return DrmPlugin::kSecurityLevelHwSecureDecode; 1356d998b67be330843f633a563c23c606593060165Jeff Tinker case SecurityLevel::HW_SECURE_ALL: 1366d998b67be330843f633a563c23c606593060165Jeff Tinker return DrmPlugin::kSecurityLevelHwSecureAll; 1376d998b67be330843f633a563c23c606593060165Jeff Tinker default: 1386d998b67be330843f633a563c23c606593060165Jeff Tinker return DrmPlugin::kSecurityLevelUnknown; 1396d998b67be330843f633a563c23c606593060165Jeff Tinker } 1406d998b67be330843f633a563c23c606593060165Jeff Tinker} 1416d998b67be330843f633a563c23c606593060165Jeff Tinker 1426d998b67be330843f633a563c23c606593060165Jeff Tinkerstatic DrmPlugin::HdcpLevel toHdcpLevel(HdcpLevel level) { 1436d998b67be330843f633a563c23c606593060165Jeff Tinker switch(level) { 1446d998b67be330843f633a563c23c606593060165Jeff Tinker case HdcpLevel::HDCP_NONE: 1456d998b67be330843f633a563c23c606593060165Jeff Tinker return DrmPlugin::kHdcpNone; 1466d998b67be330843f633a563c23c606593060165Jeff Tinker case HdcpLevel::HDCP_V1: 1476d998b67be330843f633a563c23c606593060165Jeff Tinker return DrmPlugin::kHdcpV1; 1486d998b67be330843f633a563c23c606593060165Jeff Tinker case HdcpLevel::HDCP_V2: 1496d998b67be330843f633a563c23c606593060165Jeff Tinker return DrmPlugin::kHdcpV2; 1506d998b67be330843f633a563c23c606593060165Jeff Tinker case HdcpLevel::HDCP_V2_1: 1516d998b67be330843f633a563c23c606593060165Jeff Tinker return DrmPlugin::kHdcpV2_1; 1526d998b67be330843f633a563c23c606593060165Jeff Tinker case HdcpLevel::HDCP_V2_2: 1536d998b67be330843f633a563c23c606593060165Jeff Tinker return DrmPlugin::kHdcpV2_2; 1546d998b67be330843f633a563c23c606593060165Jeff Tinker case HdcpLevel::HDCP_NO_OUTPUT: 1556d998b67be330843f633a563c23c606593060165Jeff Tinker return DrmPlugin::kHdcpNoOutput; 1566d998b67be330843f633a563c23c606593060165Jeff Tinker default: 1576d998b67be330843f633a563c23c606593060165Jeff Tinker return DrmPlugin::kHdcpLevelUnknown; 1586d998b67be330843f633a563c23c606593060165Jeff Tinker } 1596d998b67be330843f633a563c23c606593060165Jeff Tinker} 1606d998b67be330843f633a563c23c606593060165Jeff Tinker 161a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 162a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic ::KeyedVector toHidlKeyedVector(const KeyedVector<String8, String8>& 163a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker keyedVector) { 164a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker std::vector<KeyValue> stdKeyedVector; 165a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker for (size_t i = 0; i < keyedVector.size(); i++) { 166a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker KeyValue keyValue; 167a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker keyValue.key = toHidlString(keyedVector.keyAt(i)); 168a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker keyValue.value = toHidlString(keyedVector.valueAt(i)); 169a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker stdKeyedVector.push_back(keyValue); 170a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 171a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return ::KeyedVector(stdKeyedVector); 172a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 173a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 174a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic KeyedVector<String8, String8> toKeyedVector(const ::KeyedVector& 175a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker hKeyedVector) { 176a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker KeyedVector<String8, String8> keyedVector; 177a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker for (size_t i = 0; i < hKeyedVector.size(); i++) { 178a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker keyedVector.add(toString8(hKeyedVector[i].key), 179a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toString8(hKeyedVector[i].value)); 180a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 181a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return keyedVector; 182a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 183a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 184abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinkerstatic List<Vector<uint8_t>> toSecureStops(const hidl_vec<SecureStop>& 185a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker hSecureStops) { 186abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker List<Vector<uint8_t>> secureStops; 187a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker for (size_t i = 0; i < hSecureStops.size(); i++) { 188a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker secureStops.push_back(toVector(hSecureStops[i].opaqueData)); 189a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 190a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return secureStops; 191a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 192a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 19315177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinkerstatic List<Vector<uint8_t>> toSecureStopIds(const hidl_vec<SecureStopId>& 19415177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker hSecureStopIds) { 19515177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker List<Vector<uint8_t>> secureStopIds; 19615177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker for (size_t i = 0; i < hSecureStopIds.size(); i++) { 19715177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker secureStopIds.push_back(toVector(hSecureStopIds[i])); 19815177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker } 19915177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker return secureStopIds; 20015177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker} 20115177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker 202a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic status_t toStatusT(Status status) { 203a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker switch (status) { 204a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case Status::OK: 205a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return OK; 206a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 207a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case Status::ERROR_DRM_NO_LICENSE: 208a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return ERROR_DRM_NO_LICENSE; 209a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 210a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case Status::ERROR_DRM_LICENSE_EXPIRED: 211a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return ERROR_DRM_LICENSE_EXPIRED; 212a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 213a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case Status::ERROR_DRM_SESSION_NOT_OPENED: 214a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return ERROR_DRM_SESSION_NOT_OPENED; 215a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 216a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case Status::ERROR_DRM_CANNOT_HANDLE: 217a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return ERROR_DRM_CANNOT_HANDLE; 218a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 219a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case Status::ERROR_DRM_INVALID_STATE: 220a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return ERROR_DRM_TAMPER_DETECTED; 221a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 222a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case Status::BAD_VALUE: 223a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return BAD_VALUE; 224a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 225a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case Status::ERROR_DRM_NOT_PROVISIONED: 226a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return ERROR_DRM_NOT_PROVISIONED; 227a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 228a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case Status::ERROR_DRM_RESOURCE_BUSY: 229a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return ERROR_DRM_RESOURCE_BUSY; 230a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 231a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case Status::ERROR_DRM_DEVICE_REVOKED: 232a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return ERROR_DRM_DEVICE_REVOKED; 233a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 234a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case Status::ERROR_DRM_UNKNOWN: 235a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker default: 236a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return ERROR_DRM_UNKNOWN; 237a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 238a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 239a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 240a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 241a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 242a53d6553fce1818bdf87833f93633c93ad1b5915Jeff TinkerMutex DrmHal::mLock; 243a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 244a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstruct DrmSessionClient : public DrmSessionClientInterface { 245a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker explicit DrmSessionClient(DrmHal* drm) : mDrm(drm) {} 246a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 247a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker virtual bool reclaimSession(const Vector<uint8_t>& sessionId) { 248a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker sp<DrmHal> drm = mDrm.promote(); 249a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (drm == NULL) { 250a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return true; 251a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 252a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = drm->closeSession(sessionId); 253a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (err != OK) { 254a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return false; 255a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 256a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker drm->sendEvent(EventType::SESSION_RECLAIMED, 257a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlVec(sessionId), hidl_vec<uint8_t>()); 258a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return true; 259a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 260a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 261a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerprotected: 262a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker virtual ~DrmSessionClient() {} 263a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 264a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerprivate: 265a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker wp<DrmHal> mDrm; 266a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 267a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DISALLOW_EVIL_CONSTRUCTORS(DrmSessionClient); 268a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}; 269a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 270a53d6553fce1818bdf87833f93633c93ad1b5915Jeff TinkerDrmHal::DrmHal() 271a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker : mDrmSessionClient(new DrmSessionClient(this)), 272abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker mFactories(makeDrmFactories()), 273abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker mInitCheck((mFactories.size() == 0) ? ERROR_UNSUPPORTED : NO_INIT) { 274a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 275a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 2766133281c9b06c1d1176eca7f07401bba1067081eJeff Tinkervoid DrmHal::closeOpenSessions() { 2777dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker Mutex::Autolock autoLock(mLock); 2787dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker auto openSessions = mOpenSessions; 2797dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker for (size_t i = 0; i < openSessions.size(); i++) { 2807dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker mLock.unlock(); 2817dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker closeSession(openSessions[i]); 2827dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker mLock.lock(); 2836133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker } 2846133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker mOpenSessions.clear(); 2856133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker} 2866133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker 287a53d6553fce1818bdf87833f93633c93ad1b5915Jeff TinkerDrmHal::~DrmHal() { 288a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->removeDrm(mDrmSessionClient); 289a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 290a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 2917dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinkervoid DrmHal::cleanup() { 2927dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker closeOpenSessions(); 2937dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker 2947dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker Mutex::Autolock autoLock(mLock); 2957dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker reportPluginMetrics(); 2967dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker reportFrameworkMetrics(); 2977dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker 2987dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker setListener(NULL); 2997dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker mInitCheck = NO_INIT; 3007dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker 3017dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker if (mPlugin != NULL) { 3027dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker if (!mPlugin->setListener(NULL).isOk()) { 3037dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker mInitCheck = DEAD_OBJECT; 3047dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker } 3057dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker } 3067dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker mPlugin.clear(); 3077dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker mPluginV1_1.clear(); 3087dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker} 3097dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker 310abeb36a8c2f044772297536e70340c3b245863e4Jeff TinkerVector<sp<IDrmFactory>> DrmHal::makeDrmFactories() { 311abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker Vector<sp<IDrmFactory>> factories; 312c82b9c335e69b617817dace0ef64ad3df3f5080fJeff Tinker 313593111f4460f2b2e8f541e936670e3577d45fff6Jeff Tinker auto manager = hardware::defaultServiceManager(); 314c82b9c335e69b617817dace0ef64ad3df3f5080fJeff Tinker 315abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker if (manager != NULL) { 316e307dc4e7b2c9d3c4018a755db687309cf590369Jeff Tinker manager->listByInterface(drm::V1_0::IDrmFactory::descriptor, 317abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker [&factories](const hidl_vec<hidl_string> ®istered) { 318abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker for (const auto &instance : registered) { 319e307dc4e7b2c9d3c4018a755db687309cf590369Jeff Tinker auto factory = drm::V1_0::IDrmFactory::getService(instance); 320abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker if (factory != NULL) { 321e307dc4e7b2c9d3c4018a755db687309cf590369Jeff Tinker ALOGD("found drm@1.0 IDrmFactory %s", instance.c_str()); 322e307dc4e7b2c9d3c4018a755db687309cf590369Jeff Tinker factories.push_back(factory); 323e307dc4e7b2c9d3c4018a755db687309cf590369Jeff Tinker } 324e307dc4e7b2c9d3c4018a755db687309cf590369Jeff Tinker } 325e307dc4e7b2c9d3c4018a755db687309cf590369Jeff Tinker } 326e307dc4e7b2c9d3c4018a755db687309cf590369Jeff Tinker ); 327e307dc4e7b2c9d3c4018a755db687309cf590369Jeff Tinker manager->listByInterface(drm::V1_1::IDrmFactory::descriptor, 328e307dc4e7b2c9d3c4018a755db687309cf590369Jeff Tinker [&factories](const hidl_vec<hidl_string> ®istered) { 329e307dc4e7b2c9d3c4018a755db687309cf590369Jeff Tinker for (const auto &instance : registered) { 330e307dc4e7b2c9d3c4018a755db687309cf590369Jeff Tinker auto factory = drm::V1_1::IDrmFactory::getService(instance); 331e307dc4e7b2c9d3c4018a755db687309cf590369Jeff Tinker if (factory != NULL) { 332e307dc4e7b2c9d3c4018a755db687309cf590369Jeff Tinker ALOGD("found drm@1.1 IDrmFactory %s", instance.c_str()); 333abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker factories.push_back(factory); 334abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } 335abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } 336abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } 337abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker ); 338abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } 339a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 340abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker if (factories.size() == 0) { 341abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker // must be in passthrough mode, load the default passthrough service 342e309b22bff1719f1fea84b247e4b2bc4c5f09eb5Jeff Tinker auto passthrough = IDrmFactory::getService(); 343abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker if (passthrough != NULL) { 344e307dc4e7b2c9d3c4018a755db687309cf590369Jeff Tinker ALOGI("makeDrmFactories: using default passthrough drm instance"); 345abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker factories.push_back(passthrough); 346abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } else { 347abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker ALOGE("Failed to find any drm factories"); 348abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } 349a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 350abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker return factories; 351abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker} 352abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker 353abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinkersp<IDrmPlugin> DrmHal::makeDrmPlugin(const sp<IDrmFactory>& factory, 354abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker const uint8_t uuid[16], const String8& appPackageName) { 35532494f5438db362e96b69e5fda7b2fd34633b562Adam Stone mAppPackageName = appPackageName; 356fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone mMetrics.SetAppPackageName(appPackageName); 357a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 358a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker sp<IDrmPlugin> plugin; 359abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker Return<void> hResult = factory->createPlugin(uuid, appPackageName.string(), 360a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const sp<IDrmPlugin>& hPlugin) { 361abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker if (status != Status::OK) { 362abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker ALOGE("Failed to make drm plugin"); 363abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker return; 364abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } 365abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker plugin = hPlugin; 366abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } 367abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker ); 368f0e89b0b248976f622fc41da4f678955399def08Jeff Tinker 369f0e89b0b248976f622fc41da4f678955399def08Jeff Tinker if (!hResult.isOk()) { 370f0e89b0b248976f622fc41da4f678955399def08Jeff Tinker ALOGE("createPlugin remote call failed"); 371f0e89b0b248976f622fc41da4f678955399def08Jeff Tinker } 372f0e89b0b248976f622fc41da4f678955399def08Jeff Tinker 373a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return plugin; 374a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 375a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 376a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::initCheck() const { 377a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return mInitCheck; 378a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 379a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 380a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::setListener(const sp<IDrmClient>& listener) 381a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker{ 382a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock lock(mEventLock); 383a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (mListener != NULL){ 384a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker IInterface::asBinder(mListener)->unlinkToDeath(this); 385a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 386a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (listener != NULL) { 387a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker IInterface::asBinder(listener)->linkToDeath(this); 388a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 389a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mListener = listener; 390a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return NO_ERROR; 391a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 392a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 393a53d6553fce1818bdf87833f93633c93ad1b5915Jeff TinkerReturn<void> DrmHal::sendEvent(EventType hEventType, 394a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker const hidl_vec<uint8_t>& sessionId, const hidl_vec<uint8_t>& data) { 395cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone mMetrics.mEventCounter.Increment(hEventType); 396a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 397a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mEventLock.lock(); 398a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker sp<IDrmClient> listener = mListener; 399a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mEventLock.unlock(); 400a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 401a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (listener != NULL) { 402a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Parcel obj; 403a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker writeByteArray(obj, sessionId); 404a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker writeByteArray(obj, data); 405a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 406a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock lock(mNotifyLock); 407a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmPlugin::EventType eventType; 408a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker switch(hEventType) { 409a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case EventType::PROVISION_REQUIRED: 410a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker eventType = DrmPlugin::kDrmPluginEventProvisionRequired; 411a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 412a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case EventType::KEY_NEEDED: 413a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker eventType = DrmPlugin::kDrmPluginEventKeyNeeded; 414a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 415a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case EventType::KEY_EXPIRED: 416a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker eventType = DrmPlugin::kDrmPluginEventKeyExpired; 417a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 418a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case EventType::VENDOR_DEFINED: 419a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker eventType = DrmPlugin::kDrmPluginEventVendorDefined; 420a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 421b86f4b3ce066eadbfe9c2f420b16aaf2de741edbRahul Frias case EventType::SESSION_RECLAIMED: 422b86f4b3ce066eadbfe9c2f420b16aaf2de741edbRahul Frias eventType = DrmPlugin::kDrmPluginEventSessionReclaimed; 423b86f4b3ce066eadbfe9c2f420b16aaf2de741edbRahul Frias break; 424a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker default: 425a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return Void(); 426a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 427a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker listener->notify(eventType, 0, &obj); 428a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 429a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return Void(); 430a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 431a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 432a53d6553fce1818bdf87833f93633c93ad1b5915Jeff TinkerReturn<void> DrmHal::sendExpirationUpdate(const hidl_vec<uint8_t>& sessionId, 433a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker int64_t expiryTimeInMS) { 434a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 435a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mEventLock.lock(); 436a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker sp<IDrmClient> listener = mListener; 437a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mEventLock.unlock(); 438a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 439a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (listener != NULL) { 440a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Parcel obj; 441a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker writeByteArray(obj, sessionId); 442a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker obj.writeInt64(expiryTimeInMS); 443a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 444a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock lock(mNotifyLock); 445a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker listener->notify(DrmPlugin::kDrmPluginEventExpirationUpdate, 0, &obj); 446a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 447a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return Void(); 448a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 449a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 450a53d6553fce1818bdf87833f93633c93ad1b5915Jeff TinkerReturn<void> DrmHal::sendKeysChange(const hidl_vec<uint8_t>& sessionId, 451a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker const hidl_vec<KeyStatus>& keyStatusList, bool hasNewUsableKey) { 452a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 453a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mEventLock.lock(); 454a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker sp<IDrmClient> listener = mListener; 455a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mEventLock.unlock(); 456a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 457a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (listener != NULL) { 458a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Parcel obj; 459a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker writeByteArray(obj, sessionId); 460a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 461a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker size_t nKeys = keyStatusList.size(); 462a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker obj.writeInt32(nKeys); 463a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker for (size_t i = 0; i < nKeys; ++i) { 464a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker const KeyStatus &keyStatus = keyStatusList[i]; 465a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker writeByteArray(obj, keyStatus.keyId); 466a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker uint32_t type; 467a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker switch(keyStatus.type) { 468a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case KeyStatusType::USABLE: 469a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker type = DrmPlugin::kKeyStatusType_Usable; 470a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 471a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case KeyStatusType::EXPIRED: 472a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker type = DrmPlugin::kKeyStatusType_Expired; 473a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 474a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case KeyStatusType::OUTPUTNOTALLOWED: 475a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker type = DrmPlugin::kKeyStatusType_OutputNotAllowed; 476a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 477a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case KeyStatusType::STATUSPENDING: 478a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker type = DrmPlugin::kKeyStatusType_StatusPending; 479a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 480a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case KeyStatusType::INTERNALERROR: 481a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker default: 482a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker type = DrmPlugin::kKeyStatusType_InternalError; 483a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 484a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 485a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker obj.writeInt32(type); 486cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone mMetrics.mKeyStatusChangeCounter.Increment(keyStatus.type); 487a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 488a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker obj.writeInt32(hasNewUsableKey); 489a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 490a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock lock(mNotifyLock); 491a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker listener->notify(DrmPlugin::kDrmPluginEventKeysChange, 0, &obj); 492cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone } else { 493cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone // There's no listener. But we still want to count the key change 494cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone // events. 495cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone size_t nKeys = keyStatusList.size(); 496cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone for (size_t i = 0; i < nKeys; i++) { 497cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone mMetrics.mKeyStatusChangeCounter.Increment(keyStatusList[i].type); 498cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone } 499a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 500cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone 501a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return Void(); 502a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 503a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 504a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerbool DrmHal::isCryptoSchemeSupported(const uint8_t uuid[16], const String8 &mimeType) { 505a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 506a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 507abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker for (size_t i = 0; i < mFactories.size(); i++) { 508abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker if (mFactories[i]->isCryptoSchemeSupported(uuid)) { 509abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker if (mimeType != "") { 510abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker if (mFactories[i]->isContentTypeSupported(mimeType.string())) { 511abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker return true; 512abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } 513abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } else { 514abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker return true; 515abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } 516a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 517a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 518abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker return false; 519a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 520a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 52168b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wongstatus_t DrmHal::createPlugin(const uint8_t uuid[16], 52268b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong const String8& appPackageName) { 523a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 524a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 525abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker for (size_t i = 0; i < mFactories.size(); i++) { 526abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker if (mFactories[i]->isCryptoSchemeSupported(uuid)) { 527abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker mPlugin = makeDrmPlugin(mFactories[i], uuid, appPackageName); 5285641aa251bf9a6e7b6bf8a73214f92e42c393a2fEdwin Wong if (mPlugin != NULL) { 5295641aa251bf9a6e7b6bf8a73214f92e42c393a2fEdwin Wong mPluginV1_1 = drm::V1_1::IDrmPlugin::castFrom(mPlugin); 5305641aa251bf9a6e7b6bf8a73214f92e42c393a2fEdwin Wong } 531abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } 532abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } 533a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 534a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (mPlugin == NULL) { 535a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mInitCheck = ERROR_UNSUPPORTED; 536a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } else { 537319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker if (!mPlugin->setListener(this).isOk()) { 538319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker mInitCheck = DEAD_OBJECT; 539319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker } else { 540319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker mInitCheck = OK; 541319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker } 542a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 543a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 544a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return mInitCheck; 545a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 546a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 547a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::destroyPlugin() { 5487dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker cleanup(); 549a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return OK; 550a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 551a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 55241d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinkerstatus_t DrmHal::openSession(DrmPlugin::SecurityLevel level, 55341d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker Vector<uint8_t> &sessionId) { 554a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 5556d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 556a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 55741d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker SecurityLevel hSecurityLevel; 55841d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker bool setSecurityLevel = true; 55941d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker 56041d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker switch(level) { 56141d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker case DrmPlugin::kSecurityLevelSwSecureCrypto: 56241d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker hSecurityLevel = SecurityLevel::SW_SECURE_CRYPTO; 56341d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker break; 56441d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker case DrmPlugin::kSecurityLevelSwSecureDecode: 56541d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker hSecurityLevel = SecurityLevel::SW_SECURE_DECODE; 56641d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker break; 56741d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker case DrmPlugin::kSecurityLevelHwSecureCrypto: 56841d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker hSecurityLevel = SecurityLevel::HW_SECURE_CRYPTO; 56941d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker break; 57041d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker case DrmPlugin::kSecurityLevelHwSecureDecode: 57141d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker hSecurityLevel = SecurityLevel::HW_SECURE_DECODE; 57241d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker break; 57341d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker case DrmPlugin::kSecurityLevelHwSecureAll: 57441d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker hSecurityLevel = SecurityLevel::HW_SECURE_ALL; 57541d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker break; 57641d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker case DrmPlugin::kSecurityLevelMax: 57741d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker setSecurityLevel = false; 57841d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker break; 57941d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker default: 58041d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker return ERROR_DRM_CANNOT_HANDLE; 58141d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker } 5825f5e43fa83551a3636b92871bd2ad6b260a8815bTobias Thierer 58341d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker status_t err = UNKNOWN_ERROR; 584a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker bool retry = true; 585a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker do { 586a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker hidl_vec<uint8_t> hSessionId; 587a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 58841d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker Return<void> hResult; 58941d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker if (mPluginV1_1 == NULL || !setSecurityLevel) { 59041d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker hResult = mPlugin->openSession( 59141d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker [&](Status status,const hidl_vec<uint8_t>& id) { 59241d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker if (status == Status::OK) { 59341d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker sessionId = toVector(id); 59441d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker } 59541d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker err = toStatusT(status); 59656134cc9e790f39b3b10a18b701b0607c20b6154Jeff Tinker } 59741d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker ); 59841d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker } else { 59941d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker hResult = mPluginV1_1->openSession_1_1(hSecurityLevel, 60041d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& id) { 60141d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker if (status == Status::OK) { 60241d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker sessionId = toVector(id); 60341d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker } 60441d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker err = toStatusT(status); 60541d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker } 60641d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker ); 60741d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker } 608a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 609a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (!hResult.isOk()) { 610a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = DEAD_OBJECT; 611a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 612a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 613a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (err == ERROR_DRM_RESOURCE_BUSY && retry) { 614a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mLock.unlock(); 615a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker // reclaimSession may call back to closeSession, since mLock is 616a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker // shared between Drm instances, we should unlock here to avoid 617a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker // deadlock. 618a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker retry = DrmSessionManager::Instance()->reclaimSession(getCallingPid()); 619a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mLock.lock(); 620a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } else { 621a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker retry = false; 622a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 623a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } while (retry); 624a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 625a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (err == OK) { 626a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->addSession(getCallingPid(), 627a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mDrmSessionClient, sessionId); 6286133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker mOpenSessions.push(sessionId); 629568b3c45d48fab64c80b2780e8547564d35722e9Adam Stone mMetrics.SetSessionStart(sessionId); 630a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 631aaf87dd09686bdb47df0a638b622a4c2ea37a331Adam Stone 632f0e618d0ee16c63f918c7bb87ec1ff264d177746Adam Stone mMetrics.mOpenSessionCounter.Increment(err); 633a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return err; 634a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 635a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 636a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::closeSession(Vector<uint8_t> const &sessionId) { 637a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 6386d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 639a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 640319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker Return<Status> status = mPlugin->closeSession(toHidlVec(sessionId)); 641319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker if (status.isOk()) { 642319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker if (status == Status::OK) { 643319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker DrmSessionManager::Instance()->removeSession(sessionId); 644319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker for (size_t i = 0; i < mOpenSessions.size(); i++) { 645319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker if (mOpenSessions[i] == sessionId) { 646319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker mOpenSessions.removeAt(i); 647319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker break; 648319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker } 6496133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker } 6506133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker } 651cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone status_t response = toStatusT(status); 652568b3c45d48fab64c80b2780e8547564d35722e9Adam Stone mMetrics.SetSessionEnd(sessionId); 653cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone mMetrics.mCloseSessionCounter.Increment(response); 654cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone return response; 655a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 656cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone mMetrics.mCloseSessionCounter.Increment(DEAD_OBJECT); 657319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker return DEAD_OBJECT; 658a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 659a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 660a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::getKeyRequest(Vector<uint8_t> const &sessionId, 661a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Vector<uint8_t> const &initData, String8 const &mimeType, 662a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmPlugin::KeyType keyType, KeyedVector<String8, 663a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker String8> const &optionalParameters, Vector<uint8_t> &request, 664a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker String8 &defaultUrl, DrmPlugin::KeyRequestType *keyRequestType) { 665a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 6666d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 667fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone EventTimer<status_t> keyRequestTimer(&mMetrics.mGetKeyRequestTimeUs); 668a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 669a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 670a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 671a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker KeyType hKeyType; 672a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (keyType == DrmPlugin::kKeyType_Streaming) { 673a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker hKeyType = KeyType::STREAMING; 674a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } else if (keyType == DrmPlugin::kKeyType_Offline) { 675a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker hKeyType = KeyType::OFFLINE; 676a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } else if (keyType == DrmPlugin::kKeyType_Release) { 677a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker hKeyType = KeyType::RELEASE; 678a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } else { 679f0e618d0ee16c63f918c7bb87ec1ff264d177746Adam Stone keyRequestTimer.SetAttribute(BAD_VALUE); 680a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return BAD_VALUE; 681a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 682a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 683a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ::KeyedVector hOptionalParameters = toHidlKeyedVector(optionalParameters); 684a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 685a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 686a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 68759bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias if (mPluginV1_1 != NULL) { 68859bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias Return<void> hResult = 68959bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias mPluginV1_1->getKeyRequest_1_1( 69059bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias toHidlVec(sessionId), toHidlVec(initData), 69159bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias toHidlString(mimeType), hKeyType, hOptionalParameters, 69259bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias [&](Status status, const hidl_vec<uint8_t>& hRequest, 69359bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias drm::V1_1::KeyRequestType hKeyRequestType, 69459bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias const hidl_string& hDefaultUrl) { 69559bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias 69659bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias if (status == Status::OK) { 69759bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias request = toVector(hRequest); 69859bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias defaultUrl = toString8(hDefaultUrl); 69959bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias 70059bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias switch (hKeyRequestType) { 70159bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias case drm::V1_1::KeyRequestType::INITIAL: 70259bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias *keyRequestType = DrmPlugin::kKeyRequestType_Initial; 70359bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias break; 70459bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias case drm::V1_1::KeyRequestType::RENEWAL: 70559bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias *keyRequestType = DrmPlugin::kKeyRequestType_Renewal; 70659bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias break; 70759bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias case drm::V1_1::KeyRequestType::RELEASE: 70859bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias *keyRequestType = DrmPlugin::kKeyRequestType_Release; 70959bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias break; 71059bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias case drm::V1_1::KeyRequestType::NONE: 71159bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias *keyRequestType = DrmPlugin::kKeyRequestType_None; 71259bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias break; 71359bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias case drm::V1_1::KeyRequestType::UPDATE: 71459bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias *keyRequestType = DrmPlugin::kKeyRequestType_Update; 71559bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias break; 71659bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias default: 71759bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias *keyRequestType = DrmPlugin::kKeyRequestType_Unknown; 71859bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias break; 71959bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias } 72059bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias err = toStatusT(status); 72159bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias } 72259bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias }); 72359bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias return hResult.isOk() ? err : DEAD_OBJECT; 72459bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias } 72559bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias 726a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->getKeyRequest(toHidlVec(sessionId), 727a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlVec(initData), toHidlString(mimeType), hKeyType, hOptionalParameters, 728a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& hRequest, 72959bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias drm::V1_0::KeyRequestType hKeyRequestType, 73059bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias const hidl_string& hDefaultUrl) { 731a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 732a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 733a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker request = toVector(hRequest); 734a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker defaultUrl = toString8(hDefaultUrl); 735a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 736a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker switch (hKeyRequestType) { 73759bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias case drm::V1_0::KeyRequestType::INITIAL: 738a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker *keyRequestType = DrmPlugin::kKeyRequestType_Initial; 739a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 74059bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias case drm::V1_0::KeyRequestType::RENEWAL: 741a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker *keyRequestType = DrmPlugin::kKeyRequestType_Renewal; 742a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 74359bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias case drm::V1_0::KeyRequestType::RELEASE: 744a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker *keyRequestType = DrmPlugin::kKeyRequestType_Release; 745a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 746a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker default: 747a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker *keyRequestType = DrmPlugin::kKeyRequestType_Unknown; 748a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 749a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 750a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 751a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 752a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker }); 753a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 754f0e618d0ee16c63f918c7bb87ec1ff264d177746Adam Stone err = hResult.isOk() ? err : DEAD_OBJECT; 755f0e618d0ee16c63f918c7bb87ec1ff264d177746Adam Stone keyRequestTimer.SetAttribute(err); 756f0e618d0ee16c63f918c7bb87ec1ff264d177746Adam Stone return err; 757a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 758a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 759a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::provideKeyResponse(Vector<uint8_t> const &sessionId, 760a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Vector<uint8_t> const &response, Vector<uint8_t> &keySetId) { 761a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 762fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone EventTimer<status_t> keyResponseTimer(&mMetrics.mProvideKeyResponseTimeUs); 763cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone 7646d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 765a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 766a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 767a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 768a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 769a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 770a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->provideKeyResponse(toHidlVec(sessionId), 771a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlVec(response), 772a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& hKeySetId) { 773a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 774a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker keySetId = toVector(hKeySetId); 775a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 776a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 777a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 778a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 779cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone err = hResult.isOk() ? err : DEAD_OBJECT; 780cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone keyResponseTimer.SetAttribute(err); 781cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone return err; 782a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 783a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 784a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::removeKeys(Vector<uint8_t> const &keySetId) { 785a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 7866d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 787a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 78858ad475e3aa567bec63108970855e6518c90d42eJeff Tinker Return<Status> status = mPlugin->removeKeys(toHidlVec(keySetId)); 78958ad475e3aa567bec63108970855e6518c90d42eJeff Tinker return status.isOk() ? toStatusT(status) : DEAD_OBJECT; 790a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 791a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 792a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::restoreKeys(Vector<uint8_t> const &sessionId, 793a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Vector<uint8_t> const &keySetId) { 794a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 7956d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 796a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 797a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 798a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 79958ad475e3aa567bec63108970855e6518c90d42eJeff Tinker Return<Status> status = mPlugin->restoreKeys(toHidlVec(sessionId), 80058ad475e3aa567bec63108970855e6518c90d42eJeff Tinker toHidlVec(keySetId)); 80158ad475e3aa567bec63108970855e6518c90d42eJeff Tinker return status.isOk() ? toStatusT(status) : DEAD_OBJECT; 802a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 803a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 804a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::queryKeyStatus(Vector<uint8_t> const &sessionId, 805a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker KeyedVector<String8, String8> &infoMap) const { 806a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 8076d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 808a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 809a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 810a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 811a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ::KeyedVector hInfoMap; 812a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 813a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 814a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 815a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->queryKeyStatus(toHidlVec(sessionId), 816a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<KeyValue>& map) { 817a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 818a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker infoMap = toKeyedVector(map); 819a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 820a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 821a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 822a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 823a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 824a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 825a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 826a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 827a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::getProvisionRequest(String8 const &certType, 828a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker String8 const &certAuthority, Vector<uint8_t> &request, 829a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker String8 &defaultUrl) { 830a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 8316d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 832a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 833a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 834a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 835a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->getProvisionRequest( 836a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlString(certType), toHidlString(certAuthority), 837a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& hRequest, 838a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker const hidl_string& hDefaultUrl) { 839a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 840a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker request = toVector(hRequest); 841a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker defaultUrl = toString8(hDefaultUrl); 842a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 843a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 844a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 845a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 846a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 847cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone err = hResult.isOk() ? err : DEAD_OBJECT; 848cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone mMetrics.mGetProvisionRequestCounter.Increment(err); 849cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone return err; 850a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 851a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 852a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::provideProvisionResponse(Vector<uint8_t> const &response, 85368b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong Vector<uint8_t> &certificate, Vector<uint8_t> &wrappedKey) { 854a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 8556d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 856a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 857a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 858a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 859a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->provideProvisionResponse(toHidlVec(response), 860a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& hCertificate, 861a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker const hidl_vec<uint8_t>& hWrappedKey) { 862a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 863a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker certificate = toVector(hCertificate); 864a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker wrappedKey = toVector(hWrappedKey); 865a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 866a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 867a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 868a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 869a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 870cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone err = hResult.isOk() ? err : DEAD_OBJECT; 871cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone mMetrics.mProvideProvisionResponseCounter.Increment(err); 872cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone return err; 873a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 874a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 875abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinkerstatus_t DrmHal::getSecureStops(List<Vector<uint8_t>> &secureStops) { 876a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 8776d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 878a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 879a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 880a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 881a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->getSecureStops( 882a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<SecureStop>& hSecureStops) { 883a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 884a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker secureStops = toSecureStops(hSecureStops); 885a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 886a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 887a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 888a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 889a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 890a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 891a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 892a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 893a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 89415177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinkerstatus_t DrmHal::getSecureStopIds(List<Vector<uint8_t>> &secureStopIds) { 89515177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker Mutex::Autolock autoLock(mLock); 89615177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker 89715177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker if (mInitCheck != OK) { 89815177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker return mInitCheck; 89915177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker } 90015177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker 90115177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker if (mPluginV1_1 == NULL) { 90215177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker return ERROR_DRM_CANNOT_HANDLE; 90315177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker } 90415177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker 90515177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker status_t err = UNKNOWN_ERROR; 90615177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker 90715177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker Return<void> hResult = mPluginV1_1->getSecureStopIds( 90815177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker [&](Status status, const hidl_vec<SecureStopId>& hSecureStopIds) { 90915177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker if (status == Status::OK) { 91015177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker secureStopIds = toSecureStopIds(hSecureStopIds); 91115177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker } 91215177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker err = toStatusT(status); 91315177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker } 91415177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker ); 91515177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker 91615177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 91715177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker} 91815177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker 91915177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker 920a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::getSecureStop(Vector<uint8_t> const &ssid, Vector<uint8_t> &secureStop) { 921a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 9226d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 923a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 924a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 925a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 926a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->getSecureStop(toHidlVec(ssid), 927a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const SecureStop& hSecureStop) { 928a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 929a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker secureStop = toVector(hSecureStop.opaqueData); 930a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 931a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 932a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 933a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 934a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 935a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 936a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 937a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 938a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::releaseSecureStops(Vector<uint8_t> const &ssRelease) { 939a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 9406d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 941a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 94258ad475e3aa567bec63108970855e6518c90d42eJeff Tinker Return<Status> status(Status::ERROR_DRM_UNKNOWN); 94315177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker if (mPluginV1_1 != NULL) { 94415177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker SecureStopRelease secureStopRelease; 94515177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker secureStopRelease.opaqueData = toHidlVec(ssRelease); 94658ad475e3aa567bec63108970855e6518c90d42eJeff Tinker status = mPluginV1_1->releaseSecureStops(secureStopRelease); 94758ad475e3aa567bec63108970855e6518c90d42eJeff Tinker } else { 94858ad475e3aa567bec63108970855e6518c90d42eJeff Tinker status = mPlugin->releaseSecureStop(toHidlVec(ssRelease)); 94915177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker } 95058ad475e3aa567bec63108970855e6518c90d42eJeff Tinker return status.isOk() ? toStatusT(status) : DEAD_OBJECT; 951a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 952a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 95315177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinkerstatus_t DrmHal::removeSecureStop(Vector<uint8_t> const &ssid) { 95415177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker Mutex::Autolock autoLock(mLock); 95515177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker 95615177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker if (mInitCheck != OK) { 95715177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker return mInitCheck; 95815177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker } 95915177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker 96015177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker if (mPluginV1_1 == NULL) { 96115177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker return ERROR_DRM_CANNOT_HANDLE; 96215177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker } 96315177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker 96458ad475e3aa567bec63108970855e6518c90d42eJeff Tinker Return<Status> status = mPluginV1_1->removeSecureStop(toHidlVec(ssid)); 96558ad475e3aa567bec63108970855e6518c90d42eJeff Tinker return status.isOk() ? toStatusT(status) : DEAD_OBJECT; 96615177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker} 96715177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker 96815177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinkerstatus_t DrmHal::removeAllSecureStops() { 969a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 9706d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 971a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 97258ad475e3aa567bec63108970855e6518c90d42eJeff Tinker Return<Status> status(Status::ERROR_DRM_UNKNOWN); 97315177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker if (mPluginV1_1 != NULL) { 97458ad475e3aa567bec63108970855e6518c90d42eJeff Tinker status = mPluginV1_1->removeAllSecureStops(); 97558ad475e3aa567bec63108970855e6518c90d42eJeff Tinker } else { 97658ad475e3aa567bec63108970855e6518c90d42eJeff Tinker status = mPlugin->releaseAllSecureStops(); 97715177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker } 97858ad475e3aa567bec63108970855e6518c90d42eJeff Tinker return status.isOk() ? toStatusT(status) : DEAD_OBJECT; 9796d998b67be330843f633a563c23c606593060165Jeff Tinker} 9806d998b67be330843f633a563c23c606593060165Jeff Tinker 9816d998b67be330843f633a563c23c606593060165Jeff Tinkerstatus_t DrmHal::getHdcpLevels(DrmPlugin::HdcpLevel *connected, 9826d998b67be330843f633a563c23c606593060165Jeff Tinker DrmPlugin::HdcpLevel *max) const { 9836d998b67be330843f633a563c23c606593060165Jeff Tinker Mutex::Autolock autoLock(mLock); 9846d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 9856d998b67be330843f633a563c23c606593060165Jeff Tinker 9866d998b67be330843f633a563c23c606593060165Jeff Tinker if (connected == NULL || max == NULL) { 9876d998b67be330843f633a563c23c606593060165Jeff Tinker return BAD_VALUE; 988a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 9896d998b67be330843f633a563c23c606593060165Jeff Tinker status_t err = UNKNOWN_ERROR; 990a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 9916d998b67be330843f633a563c23c606593060165Jeff Tinker if (mPluginV1_1 == NULL) { 9926d998b67be330843f633a563c23c606593060165Jeff Tinker return ERROR_DRM_CANNOT_HANDLE; 9936d998b67be330843f633a563c23c606593060165Jeff Tinker } 9946d998b67be330843f633a563c23c606593060165Jeff Tinker 9956d998b67be330843f633a563c23c606593060165Jeff Tinker *connected = DrmPlugin::kHdcpLevelUnknown; 9966d998b67be330843f633a563c23c606593060165Jeff Tinker *max = DrmPlugin::kHdcpLevelUnknown; 9976d998b67be330843f633a563c23c606593060165Jeff Tinker 9986d998b67be330843f633a563c23c606593060165Jeff Tinker Return<void> hResult = mPluginV1_1->getHdcpLevels( 9996d998b67be330843f633a563c23c606593060165Jeff Tinker [&](Status status, const HdcpLevel& hConnected, const HdcpLevel& hMax) { 10006d998b67be330843f633a563c23c606593060165Jeff Tinker if (status == Status::OK) { 10016d998b67be330843f633a563c23c606593060165Jeff Tinker *connected = toHdcpLevel(hConnected); 10026d998b67be330843f633a563c23c606593060165Jeff Tinker *max = toHdcpLevel(hMax); 10036d998b67be330843f633a563c23c606593060165Jeff Tinker } 10046d998b67be330843f633a563c23c606593060165Jeff Tinker err = toStatusT(status); 10056d998b67be330843f633a563c23c606593060165Jeff Tinker } 10066d998b67be330843f633a563c23c606593060165Jeff Tinker ); 10076d998b67be330843f633a563c23c606593060165Jeff Tinker 10086d998b67be330843f633a563c23c606593060165Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 10096d998b67be330843f633a563c23c606593060165Jeff Tinker} 10106d998b67be330843f633a563c23c606593060165Jeff Tinker 10116d998b67be330843f633a563c23c606593060165Jeff Tinkerstatus_t DrmHal::getNumberOfSessions(uint32_t *open, uint32_t *max) const { 10126d998b67be330843f633a563c23c606593060165Jeff Tinker Mutex::Autolock autoLock(mLock); 10136d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 10146d998b67be330843f633a563c23c606593060165Jeff Tinker 10156d998b67be330843f633a563c23c606593060165Jeff Tinker if (open == NULL || max == NULL) { 10166d998b67be330843f633a563c23c606593060165Jeff Tinker return BAD_VALUE; 10176d998b67be330843f633a563c23c606593060165Jeff Tinker } 10186d998b67be330843f633a563c23c606593060165Jeff Tinker status_t err = UNKNOWN_ERROR; 10196d998b67be330843f633a563c23c606593060165Jeff Tinker 10206d998b67be330843f633a563c23c606593060165Jeff Tinker *open = 0; 10216d998b67be330843f633a563c23c606593060165Jeff Tinker *max = 0; 10226d998b67be330843f633a563c23c606593060165Jeff Tinker 10236d998b67be330843f633a563c23c606593060165Jeff Tinker if (mPluginV1_1 == NULL) { 10246d998b67be330843f633a563c23c606593060165Jeff Tinker return ERROR_DRM_CANNOT_HANDLE; 10256d998b67be330843f633a563c23c606593060165Jeff Tinker } 10266d998b67be330843f633a563c23c606593060165Jeff Tinker 10276d998b67be330843f633a563c23c606593060165Jeff Tinker Return<void> hResult = mPluginV1_1->getNumberOfSessions( 10286d998b67be330843f633a563c23c606593060165Jeff Tinker [&](Status status, uint32_t hOpen, uint32_t hMax) { 10296d998b67be330843f633a563c23c606593060165Jeff Tinker if (status == Status::OK) { 10306d998b67be330843f633a563c23c606593060165Jeff Tinker *open = hOpen; 10316d998b67be330843f633a563c23c606593060165Jeff Tinker *max = hMax; 10326d998b67be330843f633a563c23c606593060165Jeff Tinker } 10336d998b67be330843f633a563c23c606593060165Jeff Tinker err = toStatusT(status); 10346d998b67be330843f633a563c23c606593060165Jeff Tinker } 10356d998b67be330843f633a563c23c606593060165Jeff Tinker ); 10366d998b67be330843f633a563c23c606593060165Jeff Tinker 10376d998b67be330843f633a563c23c606593060165Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 10386d998b67be330843f633a563c23c606593060165Jeff Tinker} 10396d998b67be330843f633a563c23c606593060165Jeff Tinker 10406d998b67be330843f633a563c23c606593060165Jeff Tinkerstatus_t DrmHal::getSecurityLevel(Vector<uint8_t> const &sessionId, 10416d998b67be330843f633a563c23c606593060165Jeff Tinker DrmPlugin::SecurityLevel *level) const { 10426d998b67be330843f633a563c23c606593060165Jeff Tinker Mutex::Autolock autoLock(mLock); 10436d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 10446d998b67be330843f633a563c23c606593060165Jeff Tinker 10456d998b67be330843f633a563c23c606593060165Jeff Tinker if (level == NULL) { 10466d998b67be330843f633a563c23c606593060165Jeff Tinker return BAD_VALUE; 10476d998b67be330843f633a563c23c606593060165Jeff Tinker } 10486d998b67be330843f633a563c23c606593060165Jeff Tinker status_t err = UNKNOWN_ERROR; 10496d998b67be330843f633a563c23c606593060165Jeff Tinker 10506d998b67be330843f633a563c23c606593060165Jeff Tinker if (mPluginV1_1 == NULL) { 10516d998b67be330843f633a563c23c606593060165Jeff Tinker return ERROR_DRM_CANNOT_HANDLE; 10526d998b67be330843f633a563c23c606593060165Jeff Tinker } 10536d998b67be330843f633a563c23c606593060165Jeff Tinker 10546d998b67be330843f633a563c23c606593060165Jeff Tinker *level = DrmPlugin::kSecurityLevelUnknown; 10556d998b67be330843f633a563c23c606593060165Jeff Tinker 10566d998b67be330843f633a563c23c606593060165Jeff Tinker Return<void> hResult = mPluginV1_1->getSecurityLevel(toHidlVec(sessionId), 10576d998b67be330843f633a563c23c606593060165Jeff Tinker [&](Status status, SecurityLevel hLevel) { 10586d998b67be330843f633a563c23c606593060165Jeff Tinker if (status == Status::OK) { 10596d998b67be330843f633a563c23c606593060165Jeff Tinker *level = toSecurityLevel(hLevel); 10606d998b67be330843f633a563c23c606593060165Jeff Tinker } 10616d998b67be330843f633a563c23c606593060165Jeff Tinker err = toStatusT(status); 10626d998b67be330843f633a563c23c606593060165Jeff Tinker } 10636d998b67be330843f633a563c23c606593060165Jeff Tinker ); 10646d998b67be330843f633a563c23c606593060165Jeff Tinker 10656d998b67be330843f633a563c23c606593060165Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 10666d998b67be330843f633a563c23c606593060165Jeff Tinker} 10676d998b67be330843f633a563c23c606593060165Jeff Tinker 1068a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::getPropertyString(String8 const &name, String8 &value ) const { 1069a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 107033ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce return getPropertyStringInternal(name, value); 107133ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce} 107233ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce 107333ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Brucestatus_t DrmHal::getPropertyStringInternal(String8 const &name, String8 &value) const { 107433ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce // This function is internal to the class and should only be called while 107533ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce // mLock is already held. 10766d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 1077a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1078a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 1079a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1080a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->getPropertyString(toHidlString(name), 1081a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_string& hValue) { 1082a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 1083a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker value = toString8(hValue); 1084a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1085a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 1086a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1087a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 1088a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1089a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 1090a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 1091a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1092a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::getPropertyByteArray(String8 const &name, Vector<uint8_t> &value ) const { 1093a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 109433ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce return getPropertyByteArrayInternal(name, value); 109533ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce} 109633ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce 109733ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Brucestatus_t DrmHal::getPropertyByteArrayInternal(String8 const &name, Vector<uint8_t> &value ) const { 109833ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce // This function is internal to the class and should only be called while 109933ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce // mLock is already held. 11006d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 1101a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1102a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 1103a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1104a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->getPropertyByteArray(toHidlString(name), 1105a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& hValue) { 1106a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 1107a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker value = toVector(hValue); 1108a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1109a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 1110a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1111a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 1112a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1113cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone err = hResult.isOk() ? err : DEAD_OBJECT; 1114cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone if (name == kPropertyDeviceUniqueId) { 1115cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone mMetrics.mGetDeviceUniqueIdCounter.Increment(err); 1116cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone } 1117cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone return err; 1118a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 1119a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1120a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::setPropertyString(String8 const &name, String8 const &value ) const { 1121a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 11226d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 1123a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 112458ad475e3aa567bec63108970855e6518c90d42eJeff Tinker Return<Status> status = mPlugin->setPropertyString(toHidlString(name), 1125a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlString(value)); 112658ad475e3aa567bec63108970855e6518c90d42eJeff Tinker return status.isOk() ? toStatusT(status) : DEAD_OBJECT; 1127a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 1128a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1129a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::setPropertyByteArray(String8 const &name, 1130a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Vector<uint8_t> const &value ) const { 1131a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 11326d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 1133a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 113458ad475e3aa567bec63108970855e6518c90d42eJeff Tinker Return<Status> status = mPlugin->setPropertyByteArray(toHidlString(name), 1135a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlVec(value)); 113658ad475e3aa567bec63108970855e6518c90d42eJeff Tinker return status.isOk() ? toStatusT(status) : DEAD_OBJECT; 1137a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 1138a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 113928f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stonestatus_t DrmHal::getMetrics(PersistableBundle* metrics) { 114028f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone if (metrics == nullptr) { 114128f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone return UNEXPECTED_NULL; 114228f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone } 114328f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone mMetrics.Export(metrics); 114428f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone 114528f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone // Append vendor metrics if they are supported. 114628f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone if (mPluginV1_1 != NULL) { 114728f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone String8 vendor; 114828f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone String8 description; 114928f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone if (getPropertyStringInternal(String8("vendor"), vendor) != OK 115028f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone || vendor.isEmpty()) { 115128f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone ALOGE("Get vendor failed or is empty"); 115228f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone vendor = "NONE"; 115328f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone } 115428f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone if (getPropertyStringInternal(String8("description"), description) != OK 115528f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone || description.isEmpty()) { 115628f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone ALOGE("Get description failed or is empty."); 115728f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone description = "NONE"; 115828f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone } 115928f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone vendor += "."; 116028f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone vendor += description; 116128f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone 116228f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone hidl_vec<DrmMetricGroup> pluginMetrics; 116328f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone status_t err = UNKNOWN_ERROR; 116428f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone 116528f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone Return<void> status = mPluginV1_1->getMetrics( 116628f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone [&](Status status, hidl_vec<DrmMetricGroup> pluginMetrics) { 116728f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone if (status != Status::OK) { 116828f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone ALOGV("Error getting plugin metrics: %d", status); 116928f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone } else { 117028f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone PersistableBundle pluginBundle; 117128f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone if (MediaDrmMetrics::HidlMetricsToBundle( 117228f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone pluginMetrics, &pluginBundle) == OK) { 117328f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone metrics->putPersistableBundle(String16(vendor), pluginBundle); 117428f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone } 117528f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone } 117628f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone err = toStatusT(status); 117728f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone }); 117828f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone return status.isOk() ? err : DEAD_OBJECT; 1179f0e618d0ee16c63f918c7bb87ec1ff264d177746Adam Stone } 1180f0e618d0ee16c63f918c7bb87ec1ff264d177746Adam Stone 1181ab394d13bab3a84f23677357576cee7a6f0c7899Adam Stone return OK; 1182ab394d13bab3a84f23677357576cee7a6f0c7899Adam Stone} 1183a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1184a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::setCipherAlgorithm(Vector<uint8_t> const &sessionId, 1185a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker String8 const &algorithm) { 1186a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 11876d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 1188a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1189a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 1190a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1191e641294b59e2a0792d894139d739228f182409b4Jeff Tinker Return<Status> status = mPlugin->setCipherAlgorithm(toHidlVec(sessionId), 1192a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlString(algorithm)); 1193e641294b59e2a0792d894139d739228f182409b4Jeff Tinker return status.isOk() ? toStatusT(status) : DEAD_OBJECT; 1194a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 1195a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1196a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::setMacAlgorithm(Vector<uint8_t> const &sessionId, 1197a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker String8 const &algorithm) { 1198a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 11996d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 1200a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1201a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 1202a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1203e641294b59e2a0792d894139d739228f182409b4Jeff Tinker Return<Status> status = mPlugin->setMacAlgorithm(toHidlVec(sessionId), 1204a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlString(algorithm)); 1205e641294b59e2a0792d894139d739228f182409b4Jeff Tinker return status.isOk() ? toStatusT(status) : DEAD_OBJECT; 1206a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 1207a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1208a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::encrypt(Vector<uint8_t> const &sessionId, 120968b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong Vector<uint8_t> const &keyId, Vector<uint8_t> const &input, 121068b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong Vector<uint8_t> const &iv, Vector<uint8_t> &output) { 1211a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 12126d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 1213a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1214a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 1215a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1216a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 1217a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1218a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->encrypt(toHidlVec(sessionId), 1219a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlVec(keyId), toHidlVec(input), toHidlVec(iv), 1220a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& hOutput) { 1221a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 1222a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker output = toVector(hOutput); 1223a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1224a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 1225a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1226a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 1227a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1228a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 1229a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 1230a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1231a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::decrypt(Vector<uint8_t> const &sessionId, 123268b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong Vector<uint8_t> const &keyId, Vector<uint8_t> const &input, 123368b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong Vector<uint8_t> const &iv, Vector<uint8_t> &output) { 1234a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 12356d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 1236a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1237a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 1238a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1239a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 1240a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1241a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->decrypt(toHidlVec(sessionId), 1242a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlVec(keyId), toHidlVec(input), toHidlVec(iv), 1243a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& hOutput) { 1244a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 1245a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker output = toVector(hOutput); 1246a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1247a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 1248a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1249a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 1250a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1251a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 1252a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 1253a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1254a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::sign(Vector<uint8_t> const &sessionId, 125568b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong Vector<uint8_t> const &keyId, Vector<uint8_t> const &message, 125668b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong Vector<uint8_t> &signature) { 1257a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 12586d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 1259a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1260a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 1261a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1262a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 1263a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1264a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->sign(toHidlVec(sessionId), 1265a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlVec(keyId), toHidlVec(message), 1266a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& hSignature) { 1267a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 1268a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker signature = toVector(hSignature); 1269a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1270a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 1271a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1272a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 1273a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1274a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 1275a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 1276a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1277a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::verify(Vector<uint8_t> const &sessionId, 127868b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong Vector<uint8_t> const &keyId, Vector<uint8_t> const &message, 127968b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong Vector<uint8_t> const &signature, bool &match) { 1280a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 12816d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 1282a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1283a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 1284a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1285a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 1286a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1287a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->verify(toHidlVec(sessionId),toHidlVec(keyId), 1288a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlVec(message), toHidlVec(signature), 1289a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, bool hMatch) { 1290a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 1291a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker match = hMatch; 1292a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } else { 1293a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker match = false; 1294a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1295a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 1296a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1297a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 1298a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1299a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 1300a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 1301a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1302a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::signRSA(Vector<uint8_t> const &sessionId, 130368b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong String8 const &algorithm, Vector<uint8_t> const &message, 130468b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong Vector<uint8_t> const &wrappedKey, Vector<uint8_t> &signature) { 1305a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 13066d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 1307a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1308a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (!checkPermission("android.permission.ACCESS_DRM_CERTIFICATES")) { 1309a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return -EPERM; 1310a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1311a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1312a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 1313a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1314a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 1315a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1316a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->signRSA(toHidlVec(sessionId), 1317a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlString(algorithm), toHidlVec(message), toHidlVec(wrappedKey), 1318a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& hSignature) { 1319a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 1320a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker signature = toVector(hSignature); 1321a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1322a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 1323a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1324a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 1325a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1326a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 1327a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 1328a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1329a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkervoid DrmHal::binderDied(const wp<IBinder> &the_late_who __unused) 1330a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker{ 13317dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker cleanup(); 1332a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 1333a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1334a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkervoid DrmHal::writeByteArray(Parcel &obj, hidl_vec<uint8_t> const &vec) 1335a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker{ 1336a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (vec.size()) { 1337a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker obj.writeInt32(vec.size()); 1338a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker obj.write(vec.data(), vec.size()); 1339a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } else { 1340a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker obj.writeInt32(0); 1341a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1342a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 1343a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1344fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stonevoid DrmHal::reportFrameworkMetrics() const 1345fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone{ 1346fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone MediaAnalyticsItem item("mediadrm"); 1347fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone item.generateSessionID(); 1348fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone item.setPkgName(mMetrics.GetAppPackageName().c_str()); 1349fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone String8 vendor; 1350fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone String8 description; 1351fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone status_t result = getPropertyStringInternal(String8("vendor"), vendor); 1352fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone if (result != OK) { 1353987ac7056040ed1594dc975c8a9d7cee463fa834Jeff Tinker ALOGE("Failed to get vendor from drm plugin: %d", result); 1354fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone } else { 1355fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone item.setCString("vendor", vendor.c_str()); 1356fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone } 1357fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone result = getPropertyStringInternal(String8("description"), description); 1358fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone if (result != OK) { 1359987ac7056040ed1594dc975c8a9d7cee463fa834Jeff Tinker ALOGE("Failed to get description from drm plugin: %d", result); 1360fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone } else { 1361fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone item.setCString("description", description.c_str()); 1362fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone } 1363fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone 1364fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone std::string serializedMetrics; 1365fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone result = mMetrics.GetSerializedMetrics(&serializedMetrics); 1366fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone if (result != OK) { 1367987ac7056040ed1594dc975c8a9d7cee463fa834Jeff Tinker ALOGE("Failed to serialize framework metrics: %d", result); 1368fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone } 136932494f5438db362e96b69e5fda7b2fd34633b562Adam Stone std::string b64EncodedMetrics = toBase64StringNoPad(serializedMetrics.data(), 137032494f5438db362e96b69e5fda7b2fd34633b562Adam Stone serializedMetrics.size()); 137132494f5438db362e96b69e5fda7b2fd34633b562Adam Stone if (!b64EncodedMetrics.empty()) { 137232494f5438db362e96b69e5fda7b2fd34633b562Adam Stone item.setCString("serialized_metrics", b64EncodedMetrics.c_str()); 1373fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone } 1374fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone if (!item.selfrecord()) { 1375987ac7056040ed1594dc975c8a9d7cee463fa834Jeff Tinker ALOGE("Failed to self record framework metrics"); 1376fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone } 1377fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone} 1378ab394d13bab3a84f23677357576cee7a6f0c7899Adam Stone 1379fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stonevoid DrmHal::reportPluginMetrics() const 138033ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce{ 138132494f5438db362e96b69e5fda7b2fd34633b562Adam Stone Vector<uint8_t> metricsVector; 138233ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce String8 vendor; 138333ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce String8 description; 138433ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce if (getPropertyStringInternal(String8("vendor"), vendor) == OK && 138533ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce getPropertyStringInternal(String8("description"), description) == OK && 138632494f5438db362e96b69e5fda7b2fd34633b562Adam Stone getPropertyByteArrayInternal(String8("metrics"), metricsVector) == OK) { 138732494f5438db362e96b69e5fda7b2fd34633b562Adam Stone std::string metricsString = toBase64StringNoPad(metricsVector.array(), 138832494f5438db362e96b69e5fda7b2fd34633b562Adam Stone metricsVector.size()); 138932494f5438db362e96b69e5fda7b2fd34633b562Adam Stone status_t res = android::reportDrmPluginMetrics(metricsString, vendor, 139032494f5438db362e96b69e5fda7b2fd34633b562Adam Stone description, mAppPackageName); 139133ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce if (res != OK) { 1392987ac7056040ed1594dc975c8a9d7cee463fa834Jeff Tinker ALOGE("Metrics were retrieved but could not be reported: %d", res); 139333ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce } 139433ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce } 139533ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce} 139633ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce 1397a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} // namespace android 1398