DrmHal.cpp revision 7d2c6e8be2c9a4f3c1364d243856a345f17f851e
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> 35a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#include <media/stagefright/foundation/hexdump.h> 36a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#include <media/stagefright/MediaErrors.h> 377d2c6e8be2c9a4f3c1364d243856a345f17f851eJeff Tinker#include <mediadrm/DrmHal.h> 387d2c6e8be2c9a4f3c1364d243856a345f17f851eJeff Tinker#include <mediadrm/DrmSessionClientInterface.h> 397d2c6e8be2c9a4f3c1364d243856a345f17f851eJeff Tinker#include <mediadrm/DrmSessionManager.h> 40a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 416d998b67be330843f633a563c23c606593060165Jeff Tinkerusing drm::V1_0::KeyedVector; 426d998b67be330843f633a563c23c606593060165Jeff Tinkerusing drm::V1_0::KeyStatusType; 436d998b67be330843f633a563c23c606593060165Jeff Tinkerusing drm::V1_0::KeyType; 446d998b67be330843f633a563c23c606593060165Jeff Tinkerusing drm::V1_0::KeyValue; 456d998b67be330843f633a563c23c606593060165Jeff Tinkerusing drm::V1_1::HdcpLevel;; 466d998b67be330843f633a563c23c606593060165Jeff Tinkerusing drm::V1_0::SecureStop; 4715177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinkerusing drm::V1_1::SecureStopRelease; 4815177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinkerusing drm::V1_0::SecureStopId; 496d998b67be330843f633a563c23c606593060165Jeff Tinkerusing drm::V1_1::SecurityLevel; 506d998b67be330843f633a563c23c606593060165Jeff Tinkerusing drm::V1_0::Status; 51a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerusing ::android::hardware::hidl_array; 52a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerusing ::android::hardware::hidl_string; 53a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerusing ::android::hardware::hidl_vec; 54a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerusing ::android::hardware::Return; 55a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerusing ::android::hardware::Void; 56abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinkerusing ::android::hidl::manager::V1_0::IServiceManager; 57637b7855829920114a8863b93fe52203b7471eeaAdam Stoneusing ::android::os::PersistableBundle; 58a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerusing ::android::sp; 59a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 60cea91ce60260d7ebb94449ad7674150fdc227886Adam Stonenamespace { 61cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone 62cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone// This constant corresponds to the PROPERTY_DEVICE_UNIQUE_ID constant 63cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone// in the MediaDrm API. 64cea91ce60260d7ebb94449ad7674150fdc227886Adam Stoneconstexpr char kPropertyDeviceUniqueId[] = "deviceUniqueId"; 65cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone 66cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone} 67cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone 68a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkernamespace android { 69a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 706d998b67be330843f633a563c23c606593060165Jeff Tinker#define INIT_CHECK() {if (mInitCheck != OK) return mInitCheck;} 716d998b67be330843f633a563c23c606593060165Jeff Tinker 72a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic inline int getCallingPid() { 73a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return IPCThreadState::self()->getCallingPid(); 74a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 75a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 76a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic bool checkPermission(const char* permissionString) { 77a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (getpid() == IPCThreadState::self()->getCallingPid()) return true; 78a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker bool ok = checkCallingPermission(String16(permissionString)); 79a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (!ok) ALOGE("Request requires %s", permissionString); 80a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return ok; 81a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 82a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 83a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic const Vector<uint8_t> toVector(const hidl_vec<uint8_t> &vec) { 84a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Vector<uint8_t> vector; 85a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker vector.appendArray(vec.data(), vec.size()); 86a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return *const_cast<const Vector<uint8_t> *>(&vector); 87a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 88a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 89a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic hidl_vec<uint8_t> toHidlVec(const Vector<uint8_t> &vector) { 90a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker hidl_vec<uint8_t> vec; 91a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker vec.setToExternal(const_cast<uint8_t *>(vector.array()), vector.size()); 92a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return vec; 93a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 94a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 95a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic String8 toString8(const hidl_string &string) { 96a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return String8(string.c_str()); 97a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 98a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 99a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic hidl_string toHidlString(const String8& string) { 100a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hidl_string(string.string()); 101a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 102a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 103987ac7056040ed1594dc975c8a9d7cee463fa834Jeff Tinkerstd::string toHexString(const std::string& str) { 104fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone std::ostringstream out; 105fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone out << std::hex << std::setfill('0'); 106fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone for (size_t i = 0; i < str.size(); i++) { 107fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone out << std::setw(2) << (int)(str[i]); 108fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone } 109fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone return out.str(); 110fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone} 111fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone 1126d998b67be330843f633a563c23c606593060165Jeff Tinkerstatic DrmPlugin::SecurityLevel toSecurityLevel(SecurityLevel level) { 1136d998b67be330843f633a563c23c606593060165Jeff Tinker switch(level) { 1146d998b67be330843f633a563c23c606593060165Jeff Tinker case SecurityLevel::SW_SECURE_CRYPTO: 1156d998b67be330843f633a563c23c606593060165Jeff Tinker return DrmPlugin::kSecurityLevelSwSecureCrypto; 1166d998b67be330843f633a563c23c606593060165Jeff Tinker case SecurityLevel::SW_SECURE_DECODE: 1176d998b67be330843f633a563c23c606593060165Jeff Tinker return DrmPlugin::kSecurityLevelSwSecureDecode; 1186d998b67be330843f633a563c23c606593060165Jeff Tinker case SecurityLevel::HW_SECURE_CRYPTO: 1196d998b67be330843f633a563c23c606593060165Jeff Tinker return DrmPlugin::kSecurityLevelHwSecureCrypto; 1206d998b67be330843f633a563c23c606593060165Jeff Tinker case SecurityLevel::HW_SECURE_DECODE: 1216d998b67be330843f633a563c23c606593060165Jeff Tinker return DrmPlugin::kSecurityLevelHwSecureDecode; 1226d998b67be330843f633a563c23c606593060165Jeff Tinker case SecurityLevel::HW_SECURE_ALL: 1236d998b67be330843f633a563c23c606593060165Jeff Tinker return DrmPlugin::kSecurityLevelHwSecureAll; 1246d998b67be330843f633a563c23c606593060165Jeff Tinker default: 1256d998b67be330843f633a563c23c606593060165Jeff Tinker return DrmPlugin::kSecurityLevelUnknown; 1266d998b67be330843f633a563c23c606593060165Jeff Tinker } 1276d998b67be330843f633a563c23c606593060165Jeff Tinker} 1286d998b67be330843f633a563c23c606593060165Jeff Tinker 1296d998b67be330843f633a563c23c606593060165Jeff Tinkerstatic DrmPlugin::HdcpLevel toHdcpLevel(HdcpLevel level) { 1306d998b67be330843f633a563c23c606593060165Jeff Tinker switch(level) { 1316d998b67be330843f633a563c23c606593060165Jeff Tinker case HdcpLevel::HDCP_NONE: 1326d998b67be330843f633a563c23c606593060165Jeff Tinker return DrmPlugin::kHdcpNone; 1336d998b67be330843f633a563c23c606593060165Jeff Tinker case HdcpLevel::HDCP_V1: 1346d998b67be330843f633a563c23c606593060165Jeff Tinker return DrmPlugin::kHdcpV1; 1356d998b67be330843f633a563c23c606593060165Jeff Tinker case HdcpLevel::HDCP_V2: 1366d998b67be330843f633a563c23c606593060165Jeff Tinker return DrmPlugin::kHdcpV2; 1376d998b67be330843f633a563c23c606593060165Jeff Tinker case HdcpLevel::HDCP_V2_1: 1386d998b67be330843f633a563c23c606593060165Jeff Tinker return DrmPlugin::kHdcpV2_1; 1396d998b67be330843f633a563c23c606593060165Jeff Tinker case HdcpLevel::HDCP_V2_2: 1406d998b67be330843f633a563c23c606593060165Jeff Tinker return DrmPlugin::kHdcpV2_2; 1416d998b67be330843f633a563c23c606593060165Jeff Tinker case HdcpLevel::HDCP_NO_OUTPUT: 1426d998b67be330843f633a563c23c606593060165Jeff Tinker return DrmPlugin::kHdcpNoOutput; 1436d998b67be330843f633a563c23c606593060165Jeff Tinker default: 1446d998b67be330843f633a563c23c606593060165Jeff Tinker return DrmPlugin::kHdcpLevelUnknown; 1456d998b67be330843f633a563c23c606593060165Jeff Tinker } 1466d998b67be330843f633a563c23c606593060165Jeff Tinker} 1476d998b67be330843f633a563c23c606593060165Jeff Tinker 148a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 149a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic ::KeyedVector toHidlKeyedVector(const KeyedVector<String8, String8>& 150a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker keyedVector) { 151a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker std::vector<KeyValue> stdKeyedVector; 152a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker for (size_t i = 0; i < keyedVector.size(); i++) { 153a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker KeyValue keyValue; 154a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker keyValue.key = toHidlString(keyedVector.keyAt(i)); 155a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker keyValue.value = toHidlString(keyedVector.valueAt(i)); 156a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker stdKeyedVector.push_back(keyValue); 157a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 158a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return ::KeyedVector(stdKeyedVector); 159a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 160a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 161a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic KeyedVector<String8, String8> toKeyedVector(const ::KeyedVector& 162a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker hKeyedVector) { 163a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker KeyedVector<String8, String8> keyedVector; 164a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker for (size_t i = 0; i < hKeyedVector.size(); i++) { 165a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker keyedVector.add(toString8(hKeyedVector[i].key), 166a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toString8(hKeyedVector[i].value)); 167a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 168a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return keyedVector; 169a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 170a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 171abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinkerstatic List<Vector<uint8_t>> toSecureStops(const hidl_vec<SecureStop>& 172a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker hSecureStops) { 173abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker List<Vector<uint8_t>> secureStops; 174a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker for (size_t i = 0; i < hSecureStops.size(); i++) { 175a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker secureStops.push_back(toVector(hSecureStops[i].opaqueData)); 176a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 177a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return secureStops; 178a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 179a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 18015177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinkerstatic List<Vector<uint8_t>> toSecureStopIds(const hidl_vec<SecureStopId>& 18115177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker hSecureStopIds) { 18215177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker List<Vector<uint8_t>> secureStopIds; 18315177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker for (size_t i = 0; i < hSecureStopIds.size(); i++) { 18415177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker secureStopIds.push_back(toVector(hSecureStopIds[i])); 18515177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker } 18615177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker return secureStopIds; 18715177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker} 18815177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker 189a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic status_t toStatusT(Status status) { 190a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker switch (status) { 191a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case Status::OK: 192a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return OK; 193a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 194a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case Status::ERROR_DRM_NO_LICENSE: 195a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return ERROR_DRM_NO_LICENSE; 196a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 197a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case Status::ERROR_DRM_LICENSE_EXPIRED: 198a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return ERROR_DRM_LICENSE_EXPIRED; 199a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 200a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case Status::ERROR_DRM_SESSION_NOT_OPENED: 201a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return ERROR_DRM_SESSION_NOT_OPENED; 202a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 203a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case Status::ERROR_DRM_CANNOT_HANDLE: 204a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return ERROR_DRM_CANNOT_HANDLE; 205a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 206a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case Status::ERROR_DRM_INVALID_STATE: 207a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return ERROR_DRM_TAMPER_DETECTED; 208a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 209a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case Status::BAD_VALUE: 210a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return BAD_VALUE; 211a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 212a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case Status::ERROR_DRM_NOT_PROVISIONED: 213a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return ERROR_DRM_NOT_PROVISIONED; 214a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 215a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case Status::ERROR_DRM_RESOURCE_BUSY: 216a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return ERROR_DRM_RESOURCE_BUSY; 217a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 218a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case Status::ERROR_DRM_DEVICE_REVOKED: 219a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return ERROR_DRM_DEVICE_REVOKED; 220a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 221a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case Status::ERROR_DRM_UNKNOWN: 222a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker default: 223a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return ERROR_DRM_UNKNOWN; 224a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 225a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 226a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 227a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 228a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 229a53d6553fce1818bdf87833f93633c93ad1b5915Jeff TinkerMutex DrmHal::mLock; 230a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 231a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstruct DrmSessionClient : public DrmSessionClientInterface { 232a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker explicit DrmSessionClient(DrmHal* drm) : mDrm(drm) {} 233a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 234a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker virtual bool reclaimSession(const Vector<uint8_t>& sessionId) { 235a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker sp<DrmHal> drm = mDrm.promote(); 236a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (drm == NULL) { 237a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return true; 238a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 239a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = drm->closeSession(sessionId); 240a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (err != OK) { 241a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return false; 242a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 243a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker drm->sendEvent(EventType::SESSION_RECLAIMED, 244a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlVec(sessionId), hidl_vec<uint8_t>()); 245a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return true; 246a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 247a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 248a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerprotected: 249a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker virtual ~DrmSessionClient() {} 250a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 251a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerprivate: 252a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker wp<DrmHal> mDrm; 253a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 254a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DISALLOW_EVIL_CONSTRUCTORS(DrmSessionClient); 255a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}; 256a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 257a53d6553fce1818bdf87833f93633c93ad1b5915Jeff TinkerDrmHal::DrmHal() 258a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker : mDrmSessionClient(new DrmSessionClient(this)), 259abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker mFactories(makeDrmFactories()), 260abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker mInitCheck((mFactories.size() == 0) ? ERROR_UNSUPPORTED : NO_INIT) { 261a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 262a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 2636133281c9b06c1d1176eca7f07401bba1067081eJeff Tinkervoid DrmHal::closeOpenSessions() { 2646133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker if (mPlugin != NULL) { 265b2b66fa4da5528cf9cdfc32f619e81e4d97ca654Jeff Tinker for (size_t i = 0; i < mOpenSessions.size(); i++) { 266b2b66fa4da5528cf9cdfc32f619e81e4d97ca654Jeff Tinker mPlugin->closeSession(toHidlVec(mOpenSessions[i])); 267b2b66fa4da5528cf9cdfc32f619e81e4d97ca654Jeff Tinker DrmSessionManager::Instance()->removeSession(mOpenSessions[i]); 2686133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker } 2696133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker } 2706133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker mOpenSessions.clear(); 2716133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker} 2726133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker 273a53d6553fce1818bdf87833f93633c93ad1b5915Jeff TinkerDrmHal::~DrmHal() { 2746133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker closeOpenSessions(); 275a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->removeDrm(mDrmSessionClient); 276a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 277a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 278abeb36a8c2f044772297536e70340c3b245863e4Jeff TinkerVector<sp<IDrmFactory>> DrmHal::makeDrmFactories() { 279abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker Vector<sp<IDrmFactory>> factories; 280c82b9c335e69b617817dace0ef64ad3df3f5080fJeff Tinker 281593111f4460f2b2e8f541e936670e3577d45fff6Jeff Tinker auto manager = hardware::defaultServiceManager(); 282c82b9c335e69b617817dace0ef64ad3df3f5080fJeff Tinker 283abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker if (manager != NULL) { 284e307dc4e7b2c9d3c4018a755db687309cf590369Jeff Tinker manager->listByInterface(drm::V1_0::IDrmFactory::descriptor, 285abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker [&factories](const hidl_vec<hidl_string> ®istered) { 286abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker for (const auto &instance : registered) { 287e307dc4e7b2c9d3c4018a755db687309cf590369Jeff Tinker auto factory = drm::V1_0::IDrmFactory::getService(instance); 288abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker if (factory != NULL) { 289e307dc4e7b2c9d3c4018a755db687309cf590369Jeff Tinker ALOGD("found drm@1.0 IDrmFactory %s", instance.c_str()); 290e307dc4e7b2c9d3c4018a755db687309cf590369Jeff Tinker factories.push_back(factory); 291e307dc4e7b2c9d3c4018a755db687309cf590369Jeff Tinker } 292e307dc4e7b2c9d3c4018a755db687309cf590369Jeff Tinker } 293e307dc4e7b2c9d3c4018a755db687309cf590369Jeff Tinker } 294e307dc4e7b2c9d3c4018a755db687309cf590369Jeff Tinker ); 295e307dc4e7b2c9d3c4018a755db687309cf590369Jeff Tinker manager->listByInterface(drm::V1_1::IDrmFactory::descriptor, 296e307dc4e7b2c9d3c4018a755db687309cf590369Jeff Tinker [&factories](const hidl_vec<hidl_string> ®istered) { 297e307dc4e7b2c9d3c4018a755db687309cf590369Jeff Tinker for (const auto &instance : registered) { 298e307dc4e7b2c9d3c4018a755db687309cf590369Jeff Tinker auto factory = drm::V1_1::IDrmFactory::getService(instance); 299e307dc4e7b2c9d3c4018a755db687309cf590369Jeff Tinker if (factory != NULL) { 300e307dc4e7b2c9d3c4018a755db687309cf590369Jeff Tinker ALOGD("found drm@1.1 IDrmFactory %s", instance.c_str()); 301abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker factories.push_back(factory); 302abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } 303abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } 304abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } 305abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker ); 306abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } 307a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 308abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker if (factories.size() == 0) { 309abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker // must be in passthrough mode, load the default passthrough service 310e309b22bff1719f1fea84b247e4b2bc4c5f09eb5Jeff Tinker auto passthrough = IDrmFactory::getService(); 311abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker if (passthrough != NULL) { 312e307dc4e7b2c9d3c4018a755db687309cf590369Jeff Tinker ALOGI("makeDrmFactories: using default passthrough drm instance"); 313abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker factories.push_back(passthrough); 314abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } else { 315abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker ALOGE("Failed to find any drm factories"); 316abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } 317a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 318abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker return factories; 319abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker} 320abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker 321abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinkersp<IDrmPlugin> DrmHal::makeDrmPlugin(const sp<IDrmFactory>& factory, 322abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker const uint8_t uuid[16], const String8& appPackageName) { 323fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone mMetrics.SetAppPackageName(appPackageName); 324a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 325a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker sp<IDrmPlugin> plugin; 326abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker Return<void> hResult = factory->createPlugin(uuid, appPackageName.string(), 327a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const sp<IDrmPlugin>& hPlugin) { 328abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker if (status != Status::OK) { 329abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker ALOGE("Failed to make drm plugin"); 330abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker return; 331abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } 332abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker plugin = hPlugin; 333abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } 334abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker ); 335f0e89b0b248976f622fc41da4f678955399def08Jeff Tinker 336f0e89b0b248976f622fc41da4f678955399def08Jeff Tinker if (!hResult.isOk()) { 337f0e89b0b248976f622fc41da4f678955399def08Jeff Tinker ALOGE("createPlugin remote call failed"); 338f0e89b0b248976f622fc41da4f678955399def08Jeff Tinker } 339f0e89b0b248976f622fc41da4f678955399def08Jeff Tinker 340a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return plugin; 341a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 342a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 343a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::initCheck() const { 344a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return mInitCheck; 345a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 346a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 347a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::setListener(const sp<IDrmClient>& listener) 348a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker{ 349a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock lock(mEventLock); 350a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (mListener != NULL){ 351a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker IInterface::asBinder(mListener)->unlinkToDeath(this); 352a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 353a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (listener != NULL) { 354a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker IInterface::asBinder(listener)->linkToDeath(this); 355a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 356a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mListener = listener; 357a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return NO_ERROR; 358a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 359a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 360a53d6553fce1818bdf87833f93633c93ad1b5915Jeff TinkerReturn<void> DrmHal::sendEvent(EventType hEventType, 361a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker const hidl_vec<uint8_t>& sessionId, const hidl_vec<uint8_t>& data) { 362cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone mMetrics.mEventCounter.Increment(hEventType); 363a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 364a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mEventLock.lock(); 365a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker sp<IDrmClient> listener = mListener; 366a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mEventLock.unlock(); 367a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 368a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (listener != NULL) { 369a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Parcel obj; 370a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker writeByteArray(obj, sessionId); 371a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker writeByteArray(obj, data); 372a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 373a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock lock(mNotifyLock); 374a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmPlugin::EventType eventType; 375a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker switch(hEventType) { 376a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case EventType::PROVISION_REQUIRED: 377a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker eventType = DrmPlugin::kDrmPluginEventProvisionRequired; 378a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 379a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case EventType::KEY_NEEDED: 380a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker eventType = DrmPlugin::kDrmPluginEventKeyNeeded; 381a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 382a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case EventType::KEY_EXPIRED: 383a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker eventType = DrmPlugin::kDrmPluginEventKeyExpired; 384a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 385a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case EventType::VENDOR_DEFINED: 386a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker eventType = DrmPlugin::kDrmPluginEventVendorDefined; 387a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 388b86f4b3ce066eadbfe9c2f420b16aaf2de741edbRahul Frias case EventType::SESSION_RECLAIMED: 389b86f4b3ce066eadbfe9c2f420b16aaf2de741edbRahul Frias eventType = DrmPlugin::kDrmPluginEventSessionReclaimed; 390b86f4b3ce066eadbfe9c2f420b16aaf2de741edbRahul Frias break; 391a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker default: 392a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return Void(); 393a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 394a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker listener->notify(eventType, 0, &obj); 395a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 396a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return Void(); 397a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 398a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 399a53d6553fce1818bdf87833f93633c93ad1b5915Jeff TinkerReturn<void> DrmHal::sendExpirationUpdate(const hidl_vec<uint8_t>& sessionId, 400a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker int64_t expiryTimeInMS) { 401a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 402a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mEventLock.lock(); 403a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker sp<IDrmClient> listener = mListener; 404a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mEventLock.unlock(); 405a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 406a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (listener != NULL) { 407a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Parcel obj; 408a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker writeByteArray(obj, sessionId); 409a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker obj.writeInt64(expiryTimeInMS); 410a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 411a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock lock(mNotifyLock); 412a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker listener->notify(DrmPlugin::kDrmPluginEventExpirationUpdate, 0, &obj); 413a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 414a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return Void(); 415a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 416a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 417a53d6553fce1818bdf87833f93633c93ad1b5915Jeff TinkerReturn<void> DrmHal::sendKeysChange(const hidl_vec<uint8_t>& sessionId, 418a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker const hidl_vec<KeyStatus>& keyStatusList, bool hasNewUsableKey) { 419a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 420a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mEventLock.lock(); 421a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker sp<IDrmClient> listener = mListener; 422a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mEventLock.unlock(); 423a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 424a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (listener != NULL) { 425a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Parcel obj; 426a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker writeByteArray(obj, sessionId); 427a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 428a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker size_t nKeys = keyStatusList.size(); 429a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker obj.writeInt32(nKeys); 430a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker for (size_t i = 0; i < nKeys; ++i) { 431a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker const KeyStatus &keyStatus = keyStatusList[i]; 432a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker writeByteArray(obj, keyStatus.keyId); 433a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker uint32_t type; 434a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker switch(keyStatus.type) { 435a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case KeyStatusType::USABLE: 436a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker type = DrmPlugin::kKeyStatusType_Usable; 437a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 438a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case KeyStatusType::EXPIRED: 439a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker type = DrmPlugin::kKeyStatusType_Expired; 440a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 441a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case KeyStatusType::OUTPUTNOTALLOWED: 442a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker type = DrmPlugin::kKeyStatusType_OutputNotAllowed; 443a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 444a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case KeyStatusType::STATUSPENDING: 445a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker type = DrmPlugin::kKeyStatusType_StatusPending; 446a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 447a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case KeyStatusType::INTERNALERROR: 448a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker default: 449a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker type = DrmPlugin::kKeyStatusType_InternalError; 450a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 451a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 452a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker obj.writeInt32(type); 453cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone mMetrics.mKeyStatusChangeCounter.Increment(keyStatus.type); 454a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 455a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker obj.writeInt32(hasNewUsableKey); 456a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 457a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock lock(mNotifyLock); 458a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker listener->notify(DrmPlugin::kDrmPluginEventKeysChange, 0, &obj); 459cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone } else { 460cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone // There's no listener. But we still want to count the key change 461cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone // events. 462cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone size_t nKeys = keyStatusList.size(); 463cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone for (size_t i = 0; i < nKeys; i++) { 464cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone mMetrics.mKeyStatusChangeCounter.Increment(keyStatusList[i].type); 465cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone } 466a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 467cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone 468a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return Void(); 469a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 470a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 471a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerbool DrmHal::isCryptoSchemeSupported(const uint8_t uuid[16], const String8 &mimeType) { 472a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 473a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 474abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker for (size_t i = 0; i < mFactories.size(); i++) { 475abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker if (mFactories[i]->isCryptoSchemeSupported(uuid)) { 476abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker if (mimeType != "") { 477abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker if (mFactories[i]->isContentTypeSupported(mimeType.string())) { 478abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker return true; 479abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } 480abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } else { 481abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker return true; 482abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } 483a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 484a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 485abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker return false; 486a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 487a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 48868b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wongstatus_t DrmHal::createPlugin(const uint8_t uuid[16], 48968b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong const String8& appPackageName) { 490a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 491a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 492abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker for (size_t i = 0; i < mFactories.size(); i++) { 493abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker if (mFactories[i]->isCryptoSchemeSupported(uuid)) { 494abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker mPlugin = makeDrmPlugin(mFactories[i], uuid, appPackageName); 4955641aa251bf9a6e7b6bf8a73214f92e42c393a2fEdwin Wong if (mPlugin != NULL) { 4965641aa251bf9a6e7b6bf8a73214f92e42c393a2fEdwin Wong mPluginV1_1 = drm::V1_1::IDrmPlugin::castFrom(mPlugin); 4975641aa251bf9a6e7b6bf8a73214f92e42c393a2fEdwin Wong } 498abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } 499abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } 500a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 501a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (mPlugin == NULL) { 502a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mInitCheck = ERROR_UNSUPPORTED; 503a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } else { 504319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker if (!mPlugin->setListener(this).isOk()) { 505319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker mInitCheck = DEAD_OBJECT; 506319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker } else { 507319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker mInitCheck = OK; 508319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker } 509a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 510a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 511a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return mInitCheck; 512a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 513a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 514a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::destroyPlugin() { 515a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 5166d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 517a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 5186133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker closeOpenSessions(); 519fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone reportPluginMetrics(); 520fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone reportFrameworkMetrics(); 521a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker setListener(NULL); 522319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker mInitCheck = NO_INIT; 523319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker 52470367f525a7bf5be52115608d190d72756e972eaJeff Tinker if (mPlugin != NULL) { 525319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker if (!mPlugin->setListener(NULL).isOk()) { 526319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker mInitCheck = DEAD_OBJECT; 527319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker } 52870367f525a7bf5be52115608d190d72756e972eaJeff Tinker } 529a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mPlugin.clear(); 5305641aa251bf9a6e7b6bf8a73214f92e42c393a2fEdwin Wong mPluginV1_1.clear(); 531a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return OK; 532a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 533a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 53441d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinkerstatus_t DrmHal::openSession(DrmPlugin::SecurityLevel level, 53541d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker Vector<uint8_t> &sessionId) { 536a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 5376d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 538a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 53941d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker SecurityLevel hSecurityLevel; 54041d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker bool setSecurityLevel = true; 54141d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker 54241d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker switch(level) { 54341d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker case DrmPlugin::kSecurityLevelSwSecureCrypto: 54441d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker hSecurityLevel = SecurityLevel::SW_SECURE_CRYPTO; 54541d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker break; 54641d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker case DrmPlugin::kSecurityLevelSwSecureDecode: 54741d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker hSecurityLevel = SecurityLevel::SW_SECURE_DECODE; 54841d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker break; 54941d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker case DrmPlugin::kSecurityLevelHwSecureCrypto: 55041d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker hSecurityLevel = SecurityLevel::HW_SECURE_CRYPTO; 55141d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker break; 55241d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker case DrmPlugin::kSecurityLevelHwSecureDecode: 55341d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker hSecurityLevel = SecurityLevel::HW_SECURE_DECODE; 55441d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker break; 55541d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker case DrmPlugin::kSecurityLevelHwSecureAll: 55641d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker hSecurityLevel = SecurityLevel::HW_SECURE_ALL; 55741d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker break; 55841d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker case DrmPlugin::kSecurityLevelMax: 55941d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker setSecurityLevel = false; 56041d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker break; 56141d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker default: 56241d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker return ERROR_DRM_CANNOT_HANDLE; 56341d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker } 5645f5e43fa83551a3636b92871bd2ad6b260a8815bTobias Thierer 56541d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker status_t err = UNKNOWN_ERROR; 566a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker bool retry = true; 567a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker do { 568a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker hidl_vec<uint8_t> hSessionId; 569a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 57041d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker Return<void> hResult; 57141d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker if (mPluginV1_1 == NULL || !setSecurityLevel) { 57241d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker hResult = mPlugin->openSession( 57341d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker [&](Status status,const hidl_vec<uint8_t>& id) { 57441d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker if (status == Status::OK) { 57541d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker sessionId = toVector(id); 57641d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker } 57741d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker err = toStatusT(status); 57856134cc9e790f39b3b10a18b701b0607c20b6154Jeff Tinker } 57941d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker ); 58041d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker } else { 58141d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker hResult = mPluginV1_1->openSession_1_1(hSecurityLevel, 58241d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& id) { 58341d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker if (status == Status::OK) { 58441d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker sessionId = toVector(id); 58541d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker } 58641d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker err = toStatusT(status); 58741d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker } 58841d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker ); 58941d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker } 590a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 591a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (!hResult.isOk()) { 592a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = DEAD_OBJECT; 593a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 594a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 595a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (err == ERROR_DRM_RESOURCE_BUSY && retry) { 596a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mLock.unlock(); 597a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker // reclaimSession may call back to closeSession, since mLock is 598a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker // shared between Drm instances, we should unlock here to avoid 599a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker // deadlock. 600a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker retry = DrmSessionManager::Instance()->reclaimSession(getCallingPid()); 601a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mLock.lock(); 602a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } else { 603a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker retry = false; 604a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 605a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } while (retry); 606a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 607a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (err == OK) { 608a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->addSession(getCallingPid(), 609a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mDrmSessionClient, sessionId); 6106133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker mOpenSessions.push(sessionId); 611568b3c45d48fab64c80b2780e8547564d35722e9Adam Stone mMetrics.SetSessionStart(sessionId); 612a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 613aaf87dd09686bdb47df0a638b622a4c2ea37a331Adam Stone 614f0e618d0ee16c63f918c7bb87ec1ff264d177746Adam Stone mMetrics.mOpenSessionCounter.Increment(err); 615a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return err; 616a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 617a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 618a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::closeSession(Vector<uint8_t> const &sessionId) { 619a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 6206d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 621a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 622319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker Return<Status> status = mPlugin->closeSession(toHidlVec(sessionId)); 623319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker if (status.isOk()) { 624319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker if (status == Status::OK) { 625319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker DrmSessionManager::Instance()->removeSession(sessionId); 626319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker for (size_t i = 0; i < mOpenSessions.size(); i++) { 627319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker if (mOpenSessions[i] == sessionId) { 628319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker mOpenSessions.removeAt(i); 629319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker break; 630319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker } 6316133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker } 6326133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker } 633cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone status_t response = toStatusT(status); 634568b3c45d48fab64c80b2780e8547564d35722e9Adam Stone mMetrics.SetSessionEnd(sessionId); 635cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone mMetrics.mCloseSessionCounter.Increment(response); 636fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone reportPluginMetrics(); 637cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone return response; 638a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 639cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone mMetrics.mCloseSessionCounter.Increment(DEAD_OBJECT); 640319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker return DEAD_OBJECT; 641a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 642a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 643a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::getKeyRequest(Vector<uint8_t> const &sessionId, 644a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Vector<uint8_t> const &initData, String8 const &mimeType, 645a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmPlugin::KeyType keyType, KeyedVector<String8, 646a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker String8> const &optionalParameters, Vector<uint8_t> &request, 647a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker String8 &defaultUrl, DrmPlugin::KeyRequestType *keyRequestType) { 648a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 6496d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 650fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone EventTimer<status_t> keyRequestTimer(&mMetrics.mGetKeyRequestTimeUs); 651a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 652a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 653a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 654a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker KeyType hKeyType; 655a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (keyType == DrmPlugin::kKeyType_Streaming) { 656a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker hKeyType = KeyType::STREAMING; 657a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } else if (keyType == DrmPlugin::kKeyType_Offline) { 658a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker hKeyType = KeyType::OFFLINE; 659a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } else if (keyType == DrmPlugin::kKeyType_Release) { 660a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker hKeyType = KeyType::RELEASE; 661a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } else { 662f0e618d0ee16c63f918c7bb87ec1ff264d177746Adam Stone keyRequestTimer.SetAttribute(BAD_VALUE); 663a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return BAD_VALUE; 664a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 665a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 666a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ::KeyedVector hOptionalParameters = toHidlKeyedVector(optionalParameters); 667a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 668a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 669a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 67059bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias if (mPluginV1_1 != NULL) { 67159bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias Return<void> hResult = 67259bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias mPluginV1_1->getKeyRequest_1_1( 67359bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias toHidlVec(sessionId), toHidlVec(initData), 67459bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias toHidlString(mimeType), hKeyType, hOptionalParameters, 67559bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias [&](Status status, const hidl_vec<uint8_t>& hRequest, 67659bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias drm::V1_1::KeyRequestType hKeyRequestType, 67759bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias const hidl_string& hDefaultUrl) { 67859bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias 67959bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias if (status == Status::OK) { 68059bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias request = toVector(hRequest); 68159bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias defaultUrl = toString8(hDefaultUrl); 68259bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias 68359bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias switch (hKeyRequestType) { 68459bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias case drm::V1_1::KeyRequestType::INITIAL: 68559bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias *keyRequestType = DrmPlugin::kKeyRequestType_Initial; 68659bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias break; 68759bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias case drm::V1_1::KeyRequestType::RENEWAL: 68859bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias *keyRequestType = DrmPlugin::kKeyRequestType_Renewal; 68959bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias break; 69059bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias case drm::V1_1::KeyRequestType::RELEASE: 69159bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias *keyRequestType = DrmPlugin::kKeyRequestType_Release; 69259bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias break; 69359bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias case drm::V1_1::KeyRequestType::NONE: 69459bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias *keyRequestType = DrmPlugin::kKeyRequestType_None; 69559bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias break; 69659bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias case drm::V1_1::KeyRequestType::UPDATE: 69759bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias *keyRequestType = DrmPlugin::kKeyRequestType_Update; 69859bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias break; 69959bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias default: 70059bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias *keyRequestType = DrmPlugin::kKeyRequestType_Unknown; 70159bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias break; 70259bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias } 70359bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias err = toStatusT(status); 70459bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias } 70559bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias }); 70659bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias return hResult.isOk() ? err : DEAD_OBJECT; 70759bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias } 70859bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias 709a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->getKeyRequest(toHidlVec(sessionId), 710a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlVec(initData), toHidlString(mimeType), hKeyType, hOptionalParameters, 711a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& hRequest, 71259bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias drm::V1_0::KeyRequestType hKeyRequestType, 71359bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias const hidl_string& hDefaultUrl) { 714a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 715a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 716a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker request = toVector(hRequest); 717a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker defaultUrl = toString8(hDefaultUrl); 718a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 719a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker switch (hKeyRequestType) { 72059bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias case drm::V1_0::KeyRequestType::INITIAL: 721a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker *keyRequestType = DrmPlugin::kKeyRequestType_Initial; 722a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 72359bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias case drm::V1_0::KeyRequestType::RENEWAL: 724a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker *keyRequestType = DrmPlugin::kKeyRequestType_Renewal; 725a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 72659bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias case drm::V1_0::KeyRequestType::RELEASE: 727a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker *keyRequestType = DrmPlugin::kKeyRequestType_Release; 728a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 729a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker default: 730a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker *keyRequestType = DrmPlugin::kKeyRequestType_Unknown; 731a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 732a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 733a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 734a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 735a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker }); 736a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 737f0e618d0ee16c63f918c7bb87ec1ff264d177746Adam Stone err = hResult.isOk() ? err : DEAD_OBJECT; 738f0e618d0ee16c63f918c7bb87ec1ff264d177746Adam Stone keyRequestTimer.SetAttribute(err); 739f0e618d0ee16c63f918c7bb87ec1ff264d177746Adam Stone return err; 740a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 741a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 742a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::provideKeyResponse(Vector<uint8_t> const &sessionId, 743a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Vector<uint8_t> const &response, Vector<uint8_t> &keySetId) { 744a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 745fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone EventTimer<status_t> keyResponseTimer(&mMetrics.mProvideKeyResponseTimeUs); 746cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone 7476d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 748a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 749a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 750a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 751a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 752a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 753a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->provideKeyResponse(toHidlVec(sessionId), 754a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlVec(response), 755a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& hKeySetId) { 756a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 757a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker keySetId = toVector(hKeySetId); 758a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 759a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 760a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 761a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 762cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone err = hResult.isOk() ? err : DEAD_OBJECT; 763cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone keyResponseTimer.SetAttribute(err); 764cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone return err; 765a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 766a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 767a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::removeKeys(Vector<uint8_t> const &keySetId) { 768a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 7696d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 770a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 771a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return toStatusT(mPlugin->removeKeys(toHidlVec(keySetId))); 772a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 773a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 774a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::restoreKeys(Vector<uint8_t> const &sessionId, 775a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Vector<uint8_t> const &keySetId) { 776a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 7776d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 778a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 779a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 780a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 781a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return toStatusT(mPlugin->restoreKeys(toHidlVec(sessionId), 782a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlVec(keySetId))); 783a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 784a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 785a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::queryKeyStatus(Vector<uint8_t> const &sessionId, 786a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker KeyedVector<String8, String8> &infoMap) const { 787a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 7886d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 789a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 790a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 791a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 792a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ::KeyedVector hInfoMap; 793a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 794a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 795a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 796a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->queryKeyStatus(toHidlVec(sessionId), 797a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<KeyValue>& map) { 798a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 799a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker infoMap = toKeyedVector(map); 800a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 801a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 802a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 803a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 804a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 805a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 806a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 807a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 808a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::getProvisionRequest(String8 const &certType, 809a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker String8 const &certAuthority, Vector<uint8_t> &request, 810a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker String8 &defaultUrl) { 811a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 8126d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 813a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 814a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 815a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 816a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->getProvisionRequest( 817a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlString(certType), toHidlString(certAuthority), 818a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& hRequest, 819a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker const hidl_string& hDefaultUrl) { 820a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 821a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker request = toVector(hRequest); 822a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker defaultUrl = toString8(hDefaultUrl); 823a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 824a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 825a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 826a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 827a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 828cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone err = hResult.isOk() ? err : DEAD_OBJECT; 829cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone mMetrics.mGetProvisionRequestCounter.Increment(err); 830cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone return err; 831a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 832a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 833a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::provideProvisionResponse(Vector<uint8_t> const &response, 83468b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong Vector<uint8_t> &certificate, Vector<uint8_t> &wrappedKey) { 835a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 8366d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 837a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 838a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 839a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 840a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->provideProvisionResponse(toHidlVec(response), 841a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& hCertificate, 842a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker const hidl_vec<uint8_t>& hWrappedKey) { 843a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 844a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker certificate = toVector(hCertificate); 845a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker wrappedKey = toVector(hWrappedKey); 846a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 847a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 848a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 849a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 850a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 851cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone err = hResult.isOk() ? err : DEAD_OBJECT; 852cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone mMetrics.mProvideProvisionResponseCounter.Increment(err); 853cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone return err; 854a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 855a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 856abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinkerstatus_t DrmHal::getSecureStops(List<Vector<uint8_t>> &secureStops) { 857a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 8586d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 859a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 860a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 861a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 862a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->getSecureStops( 863a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<SecureStop>& hSecureStops) { 864a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 865a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker secureStops = toSecureStops(hSecureStops); 866a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 867a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 868a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 869a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 870a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 871a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 872a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 873a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 874a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 87515177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinkerstatus_t DrmHal::getSecureStopIds(List<Vector<uint8_t>> &secureStopIds) { 87615177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker Mutex::Autolock autoLock(mLock); 87715177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker 87815177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker if (mInitCheck != OK) { 87915177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker return mInitCheck; 88015177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker } 88115177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker 88215177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker if (mPluginV1_1 == NULL) { 88315177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker return ERROR_DRM_CANNOT_HANDLE; 88415177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker } 88515177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker 88615177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker status_t err = UNKNOWN_ERROR; 88715177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker 88815177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker Return<void> hResult = mPluginV1_1->getSecureStopIds( 88915177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker [&](Status status, const hidl_vec<SecureStopId>& hSecureStopIds) { 89015177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker if (status == Status::OK) { 89115177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker secureStopIds = toSecureStopIds(hSecureStopIds); 89215177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker } 89315177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker err = toStatusT(status); 89415177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker } 89515177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker ); 89615177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker 89715177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 89815177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker} 89915177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker 90015177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker 901a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::getSecureStop(Vector<uint8_t> const &ssid, Vector<uint8_t> &secureStop) { 902a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 9036d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 904a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 905a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 906a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 907a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->getSecureStop(toHidlVec(ssid), 908a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const SecureStop& hSecureStop) { 909a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 910a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker secureStop = toVector(hSecureStop.opaqueData); 911a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 912a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 913a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 914a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 915a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 916a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 917a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 918a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 919a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::releaseSecureStops(Vector<uint8_t> const &ssRelease) { 920a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 9216d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 922a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 92315177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker if (mPluginV1_1 != NULL) { 92415177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker SecureStopRelease secureStopRelease; 92515177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker secureStopRelease.opaqueData = toHidlVec(ssRelease); 92615177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker return toStatusT(mPluginV1_1->releaseSecureStops(secureStopRelease)); 92715177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker } 92815177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker 929a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return toStatusT(mPlugin->releaseSecureStop(toHidlVec(ssRelease))); 930a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 931a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 93215177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinkerstatus_t DrmHal::removeSecureStop(Vector<uint8_t> const &ssid) { 93315177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker Mutex::Autolock autoLock(mLock); 93415177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker 93515177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker if (mInitCheck != OK) { 93615177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker return mInitCheck; 93715177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker } 93815177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker 93915177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker if (mPluginV1_1 == NULL) { 94015177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker return ERROR_DRM_CANNOT_HANDLE; 94115177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker } 94215177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker 94315177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker return toStatusT(mPluginV1_1->removeSecureStop(toHidlVec(ssid))); 94415177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker} 94515177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker 94615177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinkerstatus_t DrmHal::removeAllSecureStops() { 947a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 9486d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 949a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 95015177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker if (mPluginV1_1 != NULL) { 95115177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker return toStatusT(mPluginV1_1->removeAllSecureStops()); 95215177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker } 9536d998b67be330843f633a563c23c606593060165Jeff Tinker return toStatusT(mPlugin->releaseAllSecureStops()); 9546d998b67be330843f633a563c23c606593060165Jeff Tinker} 9556d998b67be330843f633a563c23c606593060165Jeff Tinker 9566d998b67be330843f633a563c23c606593060165Jeff Tinkerstatus_t DrmHal::getHdcpLevels(DrmPlugin::HdcpLevel *connected, 9576d998b67be330843f633a563c23c606593060165Jeff Tinker DrmPlugin::HdcpLevel *max) const { 9586d998b67be330843f633a563c23c606593060165Jeff Tinker Mutex::Autolock autoLock(mLock); 9596d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 9606d998b67be330843f633a563c23c606593060165Jeff Tinker 9616d998b67be330843f633a563c23c606593060165Jeff Tinker if (connected == NULL || max == NULL) { 9626d998b67be330843f633a563c23c606593060165Jeff Tinker return BAD_VALUE; 963a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 9646d998b67be330843f633a563c23c606593060165Jeff Tinker status_t err = UNKNOWN_ERROR; 965a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 9666d998b67be330843f633a563c23c606593060165Jeff Tinker if (mPluginV1_1 == NULL) { 9676d998b67be330843f633a563c23c606593060165Jeff Tinker return ERROR_DRM_CANNOT_HANDLE; 9686d998b67be330843f633a563c23c606593060165Jeff Tinker } 9696d998b67be330843f633a563c23c606593060165Jeff Tinker 9706d998b67be330843f633a563c23c606593060165Jeff Tinker *connected = DrmPlugin::kHdcpLevelUnknown; 9716d998b67be330843f633a563c23c606593060165Jeff Tinker *max = DrmPlugin::kHdcpLevelUnknown; 9726d998b67be330843f633a563c23c606593060165Jeff Tinker 9736d998b67be330843f633a563c23c606593060165Jeff Tinker Return<void> hResult = mPluginV1_1->getHdcpLevels( 9746d998b67be330843f633a563c23c606593060165Jeff Tinker [&](Status status, const HdcpLevel& hConnected, const HdcpLevel& hMax) { 9756d998b67be330843f633a563c23c606593060165Jeff Tinker if (status == Status::OK) { 9766d998b67be330843f633a563c23c606593060165Jeff Tinker *connected = toHdcpLevel(hConnected); 9776d998b67be330843f633a563c23c606593060165Jeff Tinker *max = toHdcpLevel(hMax); 9786d998b67be330843f633a563c23c606593060165Jeff Tinker } 9796d998b67be330843f633a563c23c606593060165Jeff Tinker err = toStatusT(status); 9806d998b67be330843f633a563c23c606593060165Jeff Tinker } 9816d998b67be330843f633a563c23c606593060165Jeff Tinker ); 9826d998b67be330843f633a563c23c606593060165Jeff Tinker 9836d998b67be330843f633a563c23c606593060165Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 9846d998b67be330843f633a563c23c606593060165Jeff Tinker} 9856d998b67be330843f633a563c23c606593060165Jeff Tinker 9866d998b67be330843f633a563c23c606593060165Jeff Tinkerstatus_t DrmHal::getNumberOfSessions(uint32_t *open, uint32_t *max) const { 9876d998b67be330843f633a563c23c606593060165Jeff Tinker Mutex::Autolock autoLock(mLock); 9886d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 9896d998b67be330843f633a563c23c606593060165Jeff Tinker 9906d998b67be330843f633a563c23c606593060165Jeff Tinker if (open == NULL || max == NULL) { 9916d998b67be330843f633a563c23c606593060165Jeff Tinker return BAD_VALUE; 9926d998b67be330843f633a563c23c606593060165Jeff Tinker } 9936d998b67be330843f633a563c23c606593060165Jeff Tinker status_t err = UNKNOWN_ERROR; 9946d998b67be330843f633a563c23c606593060165Jeff Tinker 9956d998b67be330843f633a563c23c606593060165Jeff Tinker *open = 0; 9966d998b67be330843f633a563c23c606593060165Jeff Tinker *max = 0; 9976d998b67be330843f633a563c23c606593060165Jeff Tinker 9986d998b67be330843f633a563c23c606593060165Jeff Tinker if (mPluginV1_1 == NULL) { 9996d998b67be330843f633a563c23c606593060165Jeff Tinker return ERROR_DRM_CANNOT_HANDLE; 10006d998b67be330843f633a563c23c606593060165Jeff Tinker } 10016d998b67be330843f633a563c23c606593060165Jeff Tinker 10026d998b67be330843f633a563c23c606593060165Jeff Tinker Return<void> hResult = mPluginV1_1->getNumberOfSessions( 10036d998b67be330843f633a563c23c606593060165Jeff Tinker [&](Status status, uint32_t hOpen, uint32_t hMax) { 10046d998b67be330843f633a563c23c606593060165Jeff Tinker if (status == Status::OK) { 10056d998b67be330843f633a563c23c606593060165Jeff Tinker *open = hOpen; 10066d998b67be330843f633a563c23c606593060165Jeff Tinker *max = hMax; 10076d998b67be330843f633a563c23c606593060165Jeff Tinker } 10086d998b67be330843f633a563c23c606593060165Jeff Tinker err = toStatusT(status); 10096d998b67be330843f633a563c23c606593060165Jeff Tinker } 10106d998b67be330843f633a563c23c606593060165Jeff Tinker ); 10116d998b67be330843f633a563c23c606593060165Jeff Tinker 10126d998b67be330843f633a563c23c606593060165Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 10136d998b67be330843f633a563c23c606593060165Jeff Tinker} 10146d998b67be330843f633a563c23c606593060165Jeff Tinker 10156d998b67be330843f633a563c23c606593060165Jeff Tinkerstatus_t DrmHal::getSecurityLevel(Vector<uint8_t> const &sessionId, 10166d998b67be330843f633a563c23c606593060165Jeff Tinker DrmPlugin::SecurityLevel *level) const { 10176d998b67be330843f633a563c23c606593060165Jeff Tinker Mutex::Autolock autoLock(mLock); 10186d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 10196d998b67be330843f633a563c23c606593060165Jeff Tinker 10206d998b67be330843f633a563c23c606593060165Jeff Tinker if (level == NULL) { 10216d998b67be330843f633a563c23c606593060165Jeff Tinker return BAD_VALUE; 10226d998b67be330843f633a563c23c606593060165Jeff Tinker } 10236d998b67be330843f633a563c23c606593060165Jeff Tinker status_t err = UNKNOWN_ERROR; 10246d998b67be330843f633a563c23c606593060165Jeff Tinker 10256d998b67be330843f633a563c23c606593060165Jeff Tinker if (mPluginV1_1 == NULL) { 10266d998b67be330843f633a563c23c606593060165Jeff Tinker return ERROR_DRM_CANNOT_HANDLE; 10276d998b67be330843f633a563c23c606593060165Jeff Tinker } 10286d998b67be330843f633a563c23c606593060165Jeff Tinker 10296d998b67be330843f633a563c23c606593060165Jeff Tinker *level = DrmPlugin::kSecurityLevelUnknown; 10306d998b67be330843f633a563c23c606593060165Jeff Tinker 10316d998b67be330843f633a563c23c606593060165Jeff Tinker Return<void> hResult = mPluginV1_1->getSecurityLevel(toHidlVec(sessionId), 10326d998b67be330843f633a563c23c606593060165Jeff Tinker [&](Status status, SecurityLevel hLevel) { 10336d998b67be330843f633a563c23c606593060165Jeff Tinker if (status == Status::OK) { 10346d998b67be330843f633a563c23c606593060165Jeff Tinker *level = toSecurityLevel(hLevel); 10356d998b67be330843f633a563c23c606593060165Jeff Tinker } 10366d998b67be330843f633a563c23c606593060165Jeff Tinker err = toStatusT(status); 10376d998b67be330843f633a563c23c606593060165Jeff Tinker } 10386d998b67be330843f633a563c23c606593060165Jeff Tinker ); 10396d998b67be330843f633a563c23c606593060165Jeff Tinker 10406d998b67be330843f633a563c23c606593060165Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 10416d998b67be330843f633a563c23c606593060165Jeff Tinker} 10426d998b67be330843f633a563c23c606593060165Jeff Tinker 1043a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::getPropertyString(String8 const &name, String8 &value ) const { 1044a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 104533ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce return getPropertyStringInternal(name, value); 104633ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce} 104733ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce 104833ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Brucestatus_t DrmHal::getPropertyStringInternal(String8 const &name, String8 &value) const { 104933ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce // This function is internal to the class and should only be called while 105033ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce // mLock is already held. 10516d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 1052a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1053a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 1054a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1055a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->getPropertyString(toHidlString(name), 1056a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_string& hValue) { 1057a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 1058a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker value = toString8(hValue); 1059a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1060a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 1061a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1062a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 1063a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1064a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 1065a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 1066a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1067a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::getPropertyByteArray(String8 const &name, Vector<uint8_t> &value ) const { 1068a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 106933ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce return getPropertyByteArrayInternal(name, value); 107033ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce} 107133ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce 107233ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Brucestatus_t DrmHal::getPropertyByteArrayInternal(String8 const &name, Vector<uint8_t> &value ) const { 107333ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce // This function is internal to the class and should only be called while 107433ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce // mLock is already held. 10756d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 1076a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1077a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 1078a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1079a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->getPropertyByteArray(toHidlString(name), 1080a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& hValue) { 1081a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 1082a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker value = toVector(hValue); 1083a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1084a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 1085a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1086a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 1087a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1088cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone err = hResult.isOk() ? err : DEAD_OBJECT; 1089cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone if (name == kPropertyDeviceUniqueId) { 1090cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone mMetrics.mGetDeviceUniqueIdCounter.Increment(err); 1091cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone } 1092cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone return err; 1093a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 1094a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1095a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::setPropertyString(String8 const &name, String8 const &value ) const { 1096a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 10976d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 1098a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 10996d998b67be330843f633a563c23c606593060165Jeff Tinker Status status = mPlugin->setPropertyString(toHidlString(name), 1100a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlString(value)); 1101a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return toStatusT(status); 1102a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 1103a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1104a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::setPropertyByteArray(String8 const &name, 1105a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Vector<uint8_t> const &value ) const { 1106a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 11076d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 1108a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1109a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Status status = mPlugin->setPropertyByteArray(toHidlString(name), 1110a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlVec(value)); 1111a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return toStatusT(status); 1112a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 1113a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1114637b7855829920114a8863b93fe52203b7471eeaAdam Stonestatus_t DrmHal::getMetrics(PersistableBundle* item) { 1115f0e618d0ee16c63f918c7bb87ec1ff264d177746Adam Stone if (item == nullptr) { 1116f0e618d0ee16c63f918c7bb87ec1ff264d177746Adam Stone return UNEXPECTED_NULL; 1117f0e618d0ee16c63f918c7bb87ec1ff264d177746Adam Stone } 1118f0e618d0ee16c63f918c7bb87ec1ff264d177746Adam Stone 1119f0e618d0ee16c63f918c7bb87ec1ff264d177746Adam Stone mMetrics.Export(item); 1120ab394d13bab3a84f23677357576cee7a6f0c7899Adam Stone return OK; 1121ab394d13bab3a84f23677357576cee7a6f0c7899Adam Stone} 1122a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1123a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::setCipherAlgorithm(Vector<uint8_t> const &sessionId, 1124a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker String8 const &algorithm) { 1125a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 11266d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 1127a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1128a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 1129a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1130a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Status status = mPlugin->setCipherAlgorithm(toHidlVec(sessionId), 1131a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlString(algorithm)); 1132a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return toStatusT(status); 1133a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 1134a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1135a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::setMacAlgorithm(Vector<uint8_t> const &sessionId, 1136a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker String8 const &algorithm) { 1137a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 11386d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 1139a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1140a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 1141a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1142a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Status status = mPlugin->setMacAlgorithm(toHidlVec(sessionId), 1143a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlString(algorithm)); 1144a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return toStatusT(status); 1145a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 1146a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1147a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::encrypt(Vector<uint8_t> const &sessionId, 114868b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong Vector<uint8_t> const &keyId, Vector<uint8_t> const &input, 114968b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong Vector<uint8_t> const &iv, Vector<uint8_t> &output) { 1150a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 11516d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 1152a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1153a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 1154a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1155a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 1156a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1157a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->encrypt(toHidlVec(sessionId), 1158a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlVec(keyId), toHidlVec(input), toHidlVec(iv), 1159a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& hOutput) { 1160a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 1161a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker output = toVector(hOutput); 1162a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1163a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 1164a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1165a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 1166a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1167a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 1168a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 1169a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1170a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::decrypt(Vector<uint8_t> const &sessionId, 117168b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong Vector<uint8_t> const &keyId, Vector<uint8_t> const &input, 117268b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong Vector<uint8_t> const &iv, Vector<uint8_t> &output) { 1173a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 11746d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 1175a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1176a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 1177a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1178a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 1179a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1180a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->decrypt(toHidlVec(sessionId), 1181a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlVec(keyId), toHidlVec(input), toHidlVec(iv), 1182a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& hOutput) { 1183a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 1184a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker output = toVector(hOutput); 1185a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1186a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 1187a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1188a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 1189a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1190a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 1191a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 1192a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1193a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::sign(Vector<uint8_t> const &sessionId, 119468b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong Vector<uint8_t> const &keyId, Vector<uint8_t> const &message, 119568b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong Vector<uint8_t> &signature) { 1196a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 11976d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 1198a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1199a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 1200a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1201a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 1202a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1203a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->sign(toHidlVec(sessionId), 1204a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlVec(keyId), toHidlVec(message), 1205a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& hSignature) { 1206a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 1207a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker signature = toVector(hSignature); 1208a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1209a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 1210a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1211a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 1212a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1213a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 1214a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 1215a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1216a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::verify(Vector<uint8_t> const &sessionId, 121768b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong Vector<uint8_t> const &keyId, Vector<uint8_t> const &message, 121868b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong Vector<uint8_t> const &signature, bool &match) { 1219a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 12206d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 1221a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1222a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 1223a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1224a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 1225a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1226a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->verify(toHidlVec(sessionId),toHidlVec(keyId), 1227a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlVec(message), toHidlVec(signature), 1228a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, bool hMatch) { 1229a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 1230a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker match = hMatch; 1231a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } else { 1232a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker match = false; 1233a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1234a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 1235a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1236a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 1237a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1238a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 1239a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 1240a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1241a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::signRSA(Vector<uint8_t> const &sessionId, 124268b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong String8 const &algorithm, Vector<uint8_t> const &message, 124368b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong Vector<uint8_t> const &wrappedKey, Vector<uint8_t> &signature) { 1244a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 12456d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 1246a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1247a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (!checkPermission("android.permission.ACCESS_DRM_CERTIFICATES")) { 1248a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return -EPERM; 1249a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1250a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1251a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 1252a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1253a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 1254a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1255a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->signRSA(toHidlVec(sessionId), 1256a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlString(algorithm), toHidlVec(message), toHidlVec(wrappedKey), 1257a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& hSignature) { 1258a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 1259a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker signature = toVector(hSignature); 1260a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1261a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 1262a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1263a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 1264a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1265a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 1266a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 1267a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1268a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkervoid DrmHal::binderDied(const wp<IBinder> &the_late_who __unused) 1269a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker{ 1270a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 12716133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker closeOpenSessions(); 12723e2891674ef57a74e59ca5e27f89647b3f06861bJeff Tinker setListener(NULL); 1273319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker mInitCheck = NO_INIT; 1274319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker 127570367f525a7bf5be52115608d190d72756e972eaJeff Tinker if (mPlugin != NULL) { 1276319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker if (!mPlugin->setListener(NULL).isOk()) { 1277319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker mInitCheck = DEAD_OBJECT; 1278319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker } 127970367f525a7bf5be52115608d190d72756e972eaJeff Tinker } 1280a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mPlugin.clear(); 1281a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 1282a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1283a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkervoid DrmHal::writeByteArray(Parcel &obj, hidl_vec<uint8_t> const &vec) 1284a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker{ 1285a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (vec.size()) { 1286a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker obj.writeInt32(vec.size()); 1287a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker obj.write(vec.data(), vec.size()); 1288a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } else { 1289a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker obj.writeInt32(0); 1290a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1291a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 1292a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1293fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stonevoid DrmHal::reportFrameworkMetrics() const 1294fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone{ 1295fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone MediaAnalyticsItem item("mediadrm"); 1296fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone item.generateSessionID(); 1297fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone item.setPkgName(mMetrics.GetAppPackageName().c_str()); 1298fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone String8 vendor; 1299fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone String8 description; 1300fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone status_t result = getPropertyStringInternal(String8("vendor"), vendor); 1301fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone if (result != OK) { 1302987ac7056040ed1594dc975c8a9d7cee463fa834Jeff Tinker ALOGE("Failed to get vendor from drm plugin: %d", result); 1303fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone } else { 1304fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone item.setCString("vendor", vendor.c_str()); 1305fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone } 1306fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone result = getPropertyStringInternal(String8("description"), description); 1307fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone if (result != OK) { 1308987ac7056040ed1594dc975c8a9d7cee463fa834Jeff Tinker ALOGE("Failed to get description from drm plugin: %d", result); 1309fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone } else { 1310fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone item.setCString("description", description.c_str()); 1311fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone } 1312fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone 1313fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone std::string serializedMetrics; 1314fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone result = mMetrics.GetSerializedMetrics(&serializedMetrics); 1315fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone if (result != OK) { 1316987ac7056040ed1594dc975c8a9d7cee463fa834Jeff Tinker ALOGE("Failed to serialize framework metrics: %d", result); 1317fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone } 1318987ac7056040ed1594dc975c8a9d7cee463fa834Jeff Tinker serializedMetrics = toHexString(serializedMetrics); 1319fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone if (!serializedMetrics.empty()) { 1320fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone item.setCString("serialized_metrics", serializedMetrics.c_str()); 1321fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone } 1322fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone if (!item.selfrecord()) { 1323987ac7056040ed1594dc975c8a9d7cee463fa834Jeff Tinker ALOGE("Failed to self record framework metrics"); 1324fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone } 1325fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone} 1326ab394d13bab3a84f23677357576cee7a6f0c7899Adam Stone 1327fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stonevoid DrmHal::reportPluginMetrics() const 132833ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce{ 132933ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce Vector<uint8_t> metrics; 133033ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce String8 vendor; 133133ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce String8 description; 133233ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce if (getPropertyStringInternal(String8("vendor"), vendor) == OK && 133333ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce getPropertyStringInternal(String8("description"), description) == OK && 133433ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce getPropertyByteArrayInternal(String8("metrics"), metrics) == OK) { 133533ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce status_t res = android::reportDrmPluginMetrics( 133633ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce metrics, vendor, description); 133733ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce if (res != OK) { 1338987ac7056040ed1594dc975c8a9d7cee463fa834Jeff Tinker ALOGE("Metrics were retrieved but could not be reported: %d", res); 133933ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce } 134033ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce } 134133ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce} 134233ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce 1343a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} // namespace android 1344