DrmHal.cpp revision 637b7855829920114a8863b93fe52203b7471eea
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" 19a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#include <utils/Log.h> 20a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 21a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#include <binder/IPCThreadState.h> 22a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#include <binder/IServiceManager.h> 23a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 24a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#include <android/hardware/drm/1.0/IDrmFactory.h> 25a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#include <android/hardware/drm/1.0/IDrmPlugin.h> 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 30a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#include <media/DrmHal.h> 31a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#include <media/DrmSessionClientInterface.h> 32a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#include <media/DrmSessionManager.h> 33f0e618d0ee16c63f918c7bb87ec1ff264d177746Adam Stone#include <media/EventMetric.h> 3433ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce#include <media/PluginMetricsReporting.h> 35a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#include <media/drm/DrmAPI.h> 36a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#include <media/stagefright/foundation/ADebug.h> 37a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#include <media/stagefright/foundation/AString.h> 38a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#include <media/stagefright/foundation/hexdump.h> 39a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#include <media/stagefright/MediaErrors.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 1036d998b67be330843f633a563c23c606593060165Jeff Tinkerstatic DrmPlugin::SecurityLevel toSecurityLevel(SecurityLevel level) { 1046d998b67be330843f633a563c23c606593060165Jeff Tinker switch(level) { 1056d998b67be330843f633a563c23c606593060165Jeff Tinker case SecurityLevel::SW_SECURE_CRYPTO: 1066d998b67be330843f633a563c23c606593060165Jeff Tinker return DrmPlugin::kSecurityLevelSwSecureCrypto; 1076d998b67be330843f633a563c23c606593060165Jeff Tinker case SecurityLevel::SW_SECURE_DECODE: 1086d998b67be330843f633a563c23c606593060165Jeff Tinker return DrmPlugin::kSecurityLevelSwSecureDecode; 1096d998b67be330843f633a563c23c606593060165Jeff Tinker case SecurityLevel::HW_SECURE_CRYPTO: 1106d998b67be330843f633a563c23c606593060165Jeff Tinker return DrmPlugin::kSecurityLevelHwSecureCrypto; 1116d998b67be330843f633a563c23c606593060165Jeff Tinker case SecurityLevel::HW_SECURE_DECODE: 1126d998b67be330843f633a563c23c606593060165Jeff Tinker return DrmPlugin::kSecurityLevelHwSecureDecode; 1136d998b67be330843f633a563c23c606593060165Jeff Tinker case SecurityLevel::HW_SECURE_ALL: 1146d998b67be330843f633a563c23c606593060165Jeff Tinker return DrmPlugin::kSecurityLevelHwSecureAll; 1156d998b67be330843f633a563c23c606593060165Jeff Tinker default: 1166d998b67be330843f633a563c23c606593060165Jeff Tinker return DrmPlugin::kSecurityLevelUnknown; 1176d998b67be330843f633a563c23c606593060165Jeff Tinker } 1186d998b67be330843f633a563c23c606593060165Jeff Tinker} 1196d998b67be330843f633a563c23c606593060165Jeff Tinker 1206d998b67be330843f633a563c23c606593060165Jeff Tinkerstatic DrmPlugin::HdcpLevel toHdcpLevel(HdcpLevel level) { 1216d998b67be330843f633a563c23c606593060165Jeff Tinker switch(level) { 1226d998b67be330843f633a563c23c606593060165Jeff Tinker case HdcpLevel::HDCP_NONE: 1236d998b67be330843f633a563c23c606593060165Jeff Tinker return DrmPlugin::kHdcpNone; 1246d998b67be330843f633a563c23c606593060165Jeff Tinker case HdcpLevel::HDCP_V1: 1256d998b67be330843f633a563c23c606593060165Jeff Tinker return DrmPlugin::kHdcpV1; 1266d998b67be330843f633a563c23c606593060165Jeff Tinker case HdcpLevel::HDCP_V2: 1276d998b67be330843f633a563c23c606593060165Jeff Tinker return DrmPlugin::kHdcpV2; 1286d998b67be330843f633a563c23c606593060165Jeff Tinker case HdcpLevel::HDCP_V2_1: 1296d998b67be330843f633a563c23c606593060165Jeff Tinker return DrmPlugin::kHdcpV2_1; 1306d998b67be330843f633a563c23c606593060165Jeff Tinker case HdcpLevel::HDCP_V2_2: 1316d998b67be330843f633a563c23c606593060165Jeff Tinker return DrmPlugin::kHdcpV2_2; 1326d998b67be330843f633a563c23c606593060165Jeff Tinker case HdcpLevel::HDCP_NO_OUTPUT: 1336d998b67be330843f633a563c23c606593060165Jeff Tinker return DrmPlugin::kHdcpNoOutput; 1346d998b67be330843f633a563c23c606593060165Jeff Tinker default: 1356d998b67be330843f633a563c23c606593060165Jeff Tinker return DrmPlugin::kHdcpLevelUnknown; 1366d998b67be330843f633a563c23c606593060165Jeff Tinker } 1376d998b67be330843f633a563c23c606593060165Jeff Tinker} 1386d998b67be330843f633a563c23c606593060165Jeff Tinker 139a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 140a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic ::KeyedVector toHidlKeyedVector(const KeyedVector<String8, String8>& 141a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker keyedVector) { 142a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker std::vector<KeyValue> stdKeyedVector; 143a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker for (size_t i = 0; i < keyedVector.size(); i++) { 144a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker KeyValue keyValue; 145a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker keyValue.key = toHidlString(keyedVector.keyAt(i)); 146a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker keyValue.value = toHidlString(keyedVector.valueAt(i)); 147a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker stdKeyedVector.push_back(keyValue); 148a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 149a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return ::KeyedVector(stdKeyedVector); 150a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 151a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 152a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic KeyedVector<String8, String8> toKeyedVector(const ::KeyedVector& 153a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker hKeyedVector) { 154a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker KeyedVector<String8, String8> keyedVector; 155a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker for (size_t i = 0; i < hKeyedVector.size(); i++) { 156a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker keyedVector.add(toString8(hKeyedVector[i].key), 157a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toString8(hKeyedVector[i].value)); 158a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 159a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return keyedVector; 160a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 161a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 162abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinkerstatic List<Vector<uint8_t>> toSecureStops(const hidl_vec<SecureStop>& 163a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker hSecureStops) { 164abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker List<Vector<uint8_t>> secureStops; 165a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker for (size_t i = 0; i < hSecureStops.size(); i++) { 166a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker secureStops.push_back(toVector(hSecureStops[i].opaqueData)); 167a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 168a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return secureStops; 169a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 170a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 17115177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinkerstatic List<Vector<uint8_t>> toSecureStopIds(const hidl_vec<SecureStopId>& 17215177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker hSecureStopIds) { 17315177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker List<Vector<uint8_t>> secureStopIds; 17415177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker for (size_t i = 0; i < hSecureStopIds.size(); i++) { 17515177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker secureStopIds.push_back(toVector(hSecureStopIds[i])); 17615177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker } 17715177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker return secureStopIds; 17815177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker} 17915177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker 180a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic status_t toStatusT(Status status) { 181a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker switch (status) { 182a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case Status::OK: 183a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return OK; 184a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 185a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case Status::ERROR_DRM_NO_LICENSE: 186a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return ERROR_DRM_NO_LICENSE; 187a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 188a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case Status::ERROR_DRM_LICENSE_EXPIRED: 189a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return ERROR_DRM_LICENSE_EXPIRED; 190a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 191a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case Status::ERROR_DRM_SESSION_NOT_OPENED: 192a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return ERROR_DRM_SESSION_NOT_OPENED; 193a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 194a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case Status::ERROR_DRM_CANNOT_HANDLE: 195a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return ERROR_DRM_CANNOT_HANDLE; 196a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 197a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case Status::ERROR_DRM_INVALID_STATE: 198a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return ERROR_DRM_TAMPER_DETECTED; 199a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 200a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case Status::BAD_VALUE: 201a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return BAD_VALUE; 202a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 203a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case Status::ERROR_DRM_NOT_PROVISIONED: 204a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return ERROR_DRM_NOT_PROVISIONED; 205a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 206a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case Status::ERROR_DRM_RESOURCE_BUSY: 207a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return ERROR_DRM_RESOURCE_BUSY; 208a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 209a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case Status::ERROR_DRM_DEVICE_REVOKED: 210a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return ERROR_DRM_DEVICE_REVOKED; 211a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 212a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case Status::ERROR_DRM_UNKNOWN: 213a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker default: 214a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return ERROR_DRM_UNKNOWN; 215a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 216a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 217a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 218a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 219a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 220a53d6553fce1818bdf87833f93633c93ad1b5915Jeff TinkerMutex DrmHal::mLock; 221a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 222a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstruct DrmSessionClient : public DrmSessionClientInterface { 223a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker explicit DrmSessionClient(DrmHal* drm) : mDrm(drm) {} 224a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 225a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker virtual bool reclaimSession(const Vector<uint8_t>& sessionId) { 226a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker sp<DrmHal> drm = mDrm.promote(); 227a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (drm == NULL) { 228a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return true; 229a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 230a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = drm->closeSession(sessionId); 231a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (err != OK) { 232a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return false; 233a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 234a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker drm->sendEvent(EventType::SESSION_RECLAIMED, 235a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlVec(sessionId), hidl_vec<uint8_t>()); 236a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return true; 237a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 238a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 239a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerprotected: 240a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker virtual ~DrmSessionClient() {} 241a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 242a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerprivate: 243a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker wp<DrmHal> mDrm; 244a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 245a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DISALLOW_EVIL_CONSTRUCTORS(DrmSessionClient); 246a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}; 247a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 248a53d6553fce1818bdf87833f93633c93ad1b5915Jeff TinkerDrmHal::DrmHal() 249a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker : mDrmSessionClient(new DrmSessionClient(this)), 250abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker mFactories(makeDrmFactories()), 251abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker mInitCheck((mFactories.size() == 0) ? ERROR_UNSUPPORTED : NO_INIT) { 252a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 253a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 2546133281c9b06c1d1176eca7f07401bba1067081eJeff Tinkervoid DrmHal::closeOpenSessions() { 2556133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker if (mPlugin != NULL) { 256b2b66fa4da5528cf9cdfc32f619e81e4d97ca654Jeff Tinker for (size_t i = 0; i < mOpenSessions.size(); i++) { 257b2b66fa4da5528cf9cdfc32f619e81e4d97ca654Jeff Tinker mPlugin->closeSession(toHidlVec(mOpenSessions[i])); 258b2b66fa4da5528cf9cdfc32f619e81e4d97ca654Jeff Tinker DrmSessionManager::Instance()->removeSession(mOpenSessions[i]); 2596133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker } 2606133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker } 2616133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker mOpenSessions.clear(); 2626133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker} 2636133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker 264a53d6553fce1818bdf87833f93633c93ad1b5915Jeff TinkerDrmHal::~DrmHal() { 2656133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker closeOpenSessions(); 266a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->removeDrm(mDrmSessionClient); 267a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 268a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 269abeb36a8c2f044772297536e70340c3b245863e4Jeff TinkerVector<sp<IDrmFactory>> DrmHal::makeDrmFactories() { 270abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker Vector<sp<IDrmFactory>> factories; 271c82b9c335e69b617817dace0ef64ad3df3f5080fJeff Tinker 272593111f4460f2b2e8f541e936670e3577d45fff6Jeff Tinker auto manager = hardware::defaultServiceManager(); 273c82b9c335e69b617817dace0ef64ad3df3f5080fJeff Tinker 274abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker if (manager != NULL) { 275abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker manager->listByInterface(IDrmFactory::descriptor, 276abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker [&factories](const hidl_vec<hidl_string> ®istered) { 277abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker for (const auto &instance : registered) { 278abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker auto factory = IDrmFactory::getService(instance); 279abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker if (factory != NULL) { 280abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker factories.push_back(factory); 281abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker ALOGI("makeDrmFactories: factory instance %s is %s", 282abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker instance.c_str(), 283abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker factory->isRemote() ? "Remote" : "Not Remote"); 284abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } 285abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } 286abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } 287abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker ); 288abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } 289a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 290abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker if (factories.size() == 0) { 291abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker // must be in passthrough mode, load the default passthrough service 292e309b22bff1719f1fea84b247e4b2bc4c5f09eb5Jeff Tinker auto passthrough = IDrmFactory::getService(); 293abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker if (passthrough != NULL) { 294abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker ALOGI("makeDrmFactories: using default drm instance"); 295abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker factories.push_back(passthrough); 296abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } else { 297abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker ALOGE("Failed to find any drm factories"); 298abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } 299a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 300abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker return factories; 301abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker} 302abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker 303abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinkersp<IDrmPlugin> DrmHal::makeDrmPlugin(const sp<IDrmFactory>& factory, 304abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker const uint8_t uuid[16], const String8& appPackageName) { 305a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 306a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker sp<IDrmPlugin> plugin; 307abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker Return<void> hResult = factory->createPlugin(uuid, appPackageName.string(), 308a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const sp<IDrmPlugin>& hPlugin) { 309abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker if (status != Status::OK) { 310abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker ALOGE("Failed to make drm plugin"); 311abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker return; 312abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } 313abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker plugin = hPlugin; 314abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } 315abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker ); 316f0e89b0b248976f622fc41da4f678955399def08Jeff Tinker 317f0e89b0b248976f622fc41da4f678955399def08Jeff Tinker if (!hResult.isOk()) { 318f0e89b0b248976f622fc41da4f678955399def08Jeff Tinker ALOGE("createPlugin remote call failed"); 319f0e89b0b248976f622fc41da4f678955399def08Jeff Tinker } 320f0e89b0b248976f622fc41da4f678955399def08Jeff Tinker 321a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return plugin; 322a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 323a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 324a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::initCheck() const { 325a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return mInitCheck; 326a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 327a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 328a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::setListener(const sp<IDrmClient>& listener) 329a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker{ 330a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock lock(mEventLock); 331a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (mListener != NULL){ 332a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker IInterface::asBinder(mListener)->unlinkToDeath(this); 333a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 334a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (listener != NULL) { 335a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker IInterface::asBinder(listener)->linkToDeath(this); 336a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 337a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mListener = listener; 338a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return NO_ERROR; 339a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 340a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 341a53d6553fce1818bdf87833f93633c93ad1b5915Jeff TinkerReturn<void> DrmHal::sendEvent(EventType hEventType, 342a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker const hidl_vec<uint8_t>& sessionId, const hidl_vec<uint8_t>& data) { 343cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone mMetrics.mEventCounter.Increment(hEventType); 344a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 345a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mEventLock.lock(); 346a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker sp<IDrmClient> listener = mListener; 347a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mEventLock.unlock(); 348a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 349a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (listener != NULL) { 350a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Parcel obj; 351a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker writeByteArray(obj, sessionId); 352a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker writeByteArray(obj, data); 353a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 354a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock lock(mNotifyLock); 355a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmPlugin::EventType eventType; 356a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker switch(hEventType) { 357a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case EventType::PROVISION_REQUIRED: 358a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker eventType = DrmPlugin::kDrmPluginEventProvisionRequired; 359a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 360a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case EventType::KEY_NEEDED: 361a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker eventType = DrmPlugin::kDrmPluginEventKeyNeeded; 362a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 363a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case EventType::KEY_EXPIRED: 364a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker eventType = DrmPlugin::kDrmPluginEventKeyExpired; 365a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 366a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case EventType::VENDOR_DEFINED: 367a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker eventType = DrmPlugin::kDrmPluginEventVendorDefined; 368a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 369b86f4b3ce066eadbfe9c2f420b16aaf2de741edbRahul Frias case EventType::SESSION_RECLAIMED: 370b86f4b3ce066eadbfe9c2f420b16aaf2de741edbRahul Frias eventType = DrmPlugin::kDrmPluginEventSessionReclaimed; 371b86f4b3ce066eadbfe9c2f420b16aaf2de741edbRahul Frias break; 372a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker default: 373a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return Void(); 374a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 375a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker listener->notify(eventType, 0, &obj); 376a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 377a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return Void(); 378a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 379a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 380a53d6553fce1818bdf87833f93633c93ad1b5915Jeff TinkerReturn<void> DrmHal::sendExpirationUpdate(const hidl_vec<uint8_t>& sessionId, 381a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker int64_t expiryTimeInMS) { 382a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 383a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mEventLock.lock(); 384a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker sp<IDrmClient> listener = mListener; 385a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mEventLock.unlock(); 386a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 387a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (listener != NULL) { 388a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Parcel obj; 389a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker writeByteArray(obj, sessionId); 390a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker obj.writeInt64(expiryTimeInMS); 391a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 392a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock lock(mNotifyLock); 393a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker listener->notify(DrmPlugin::kDrmPluginEventExpirationUpdate, 0, &obj); 394a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 395a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return Void(); 396a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 397a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 398a53d6553fce1818bdf87833f93633c93ad1b5915Jeff TinkerReturn<void> DrmHal::sendKeysChange(const hidl_vec<uint8_t>& sessionId, 399a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker const hidl_vec<KeyStatus>& keyStatusList, bool hasNewUsableKey) { 400a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 401a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mEventLock.lock(); 402a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker sp<IDrmClient> listener = mListener; 403a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mEventLock.unlock(); 404a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 405a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (listener != NULL) { 406a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Parcel obj; 407a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker writeByteArray(obj, sessionId); 408a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 409a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker size_t nKeys = keyStatusList.size(); 410a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker obj.writeInt32(nKeys); 411a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker for (size_t i = 0; i < nKeys; ++i) { 412a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker const KeyStatus &keyStatus = keyStatusList[i]; 413a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker writeByteArray(obj, keyStatus.keyId); 414a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker uint32_t type; 415a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker switch(keyStatus.type) { 416a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case KeyStatusType::USABLE: 417a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker type = DrmPlugin::kKeyStatusType_Usable; 418a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 419a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case KeyStatusType::EXPIRED: 420a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker type = DrmPlugin::kKeyStatusType_Expired; 421a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 422a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case KeyStatusType::OUTPUTNOTALLOWED: 423a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker type = DrmPlugin::kKeyStatusType_OutputNotAllowed; 424a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 425a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case KeyStatusType::STATUSPENDING: 426a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker type = DrmPlugin::kKeyStatusType_StatusPending; 427a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 428a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case KeyStatusType::INTERNALERROR: 429a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker default: 430a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker type = DrmPlugin::kKeyStatusType_InternalError; 431a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 432a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 433a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker obj.writeInt32(type); 434cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone mMetrics.mKeyStatusChangeCounter.Increment(keyStatus.type); 435a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 436a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker obj.writeInt32(hasNewUsableKey); 437a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 438a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock lock(mNotifyLock); 439a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker listener->notify(DrmPlugin::kDrmPluginEventKeysChange, 0, &obj); 440cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone } else { 441cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone // There's no listener. But we still want to count the key change 442cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone // events. 443cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone size_t nKeys = keyStatusList.size(); 444cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone for (size_t i = 0; i < nKeys; i++) { 445cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone mMetrics.mKeyStatusChangeCounter.Increment(keyStatusList[i].type); 446cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone } 447a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 448cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone 449a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return Void(); 450a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 451a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 452a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerbool DrmHal::isCryptoSchemeSupported(const uint8_t uuid[16], const String8 &mimeType) { 453a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 454a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 455abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker for (size_t i = 0; i < mFactories.size(); i++) { 456abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker if (mFactories[i]->isCryptoSchemeSupported(uuid)) { 457abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker if (mimeType != "") { 458abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker if (mFactories[i]->isContentTypeSupported(mimeType.string())) { 459abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker return true; 460abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } 461abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } else { 462abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker return true; 463abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } 464a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 465a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 466abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker return false; 467a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 468a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 46968b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wongstatus_t DrmHal::createPlugin(const uint8_t uuid[16], 47068b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong const String8& appPackageName) { 471a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 472a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 473abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker for (size_t i = 0; i < mFactories.size(); i++) { 474abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker if (mFactories[i]->isCryptoSchemeSupported(uuid)) { 475abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker mPlugin = makeDrmPlugin(mFactories[i], uuid, appPackageName); 4765641aa251bf9a6e7b6bf8a73214f92e42c393a2fEdwin Wong if (mPlugin != NULL) { 4775641aa251bf9a6e7b6bf8a73214f92e42c393a2fEdwin Wong mPluginV1_1 = drm::V1_1::IDrmPlugin::castFrom(mPlugin); 4785641aa251bf9a6e7b6bf8a73214f92e42c393a2fEdwin Wong } 479abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } 480abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } 481a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 482a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (mPlugin == NULL) { 483a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mInitCheck = ERROR_UNSUPPORTED; 484a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } else { 485319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker if (!mPlugin->setListener(this).isOk()) { 486319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker mInitCheck = DEAD_OBJECT; 487319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker } else { 488319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker mInitCheck = OK; 489319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker } 490a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 491a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 492a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return mInitCheck; 493a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 494a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 495a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::destroyPlugin() { 496a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 4976d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 498a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 4996133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker closeOpenSessions(); 50033ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce reportMetrics(); 501a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker setListener(NULL); 502319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker mInitCheck = NO_INIT; 503319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker 50470367f525a7bf5be52115608d190d72756e972eaJeff Tinker if (mPlugin != NULL) { 505319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker if (!mPlugin->setListener(NULL).isOk()) { 506319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker mInitCheck = DEAD_OBJECT; 507319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker } 50870367f525a7bf5be52115608d190d72756e972eaJeff Tinker } 509a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mPlugin.clear(); 5105641aa251bf9a6e7b6bf8a73214f92e42c393a2fEdwin Wong mPluginV1_1.clear(); 511a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return OK; 512a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 513a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 514a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::openSession(Vector<uint8_t> &sessionId) { 515a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 5166d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 517a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 518a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 519a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 520a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker bool retry = true; 521a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker do { 522a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker hidl_vec<uint8_t> hSessionId; 523a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 524a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->openSession( 525a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& id) { 526a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 527a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker sessionId = toVector(id); 528a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 529a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 530a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 531a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 532a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 533a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (!hResult.isOk()) { 534a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = DEAD_OBJECT; 535a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 536a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 537a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (err == ERROR_DRM_RESOURCE_BUSY && retry) { 538a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mLock.unlock(); 539a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker // reclaimSession may call back to closeSession, since mLock is 540a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker // shared between Drm instances, we should unlock here to avoid 541a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker // deadlock. 542a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker retry = DrmSessionManager::Instance()->reclaimSession(getCallingPid()); 543a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mLock.lock(); 544a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } else { 545a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker retry = false; 546a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 547a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } while (retry); 548a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 549a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (err == OK) { 550a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->addSession(getCallingPid(), 551a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mDrmSessionClient, sessionId); 5526133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker mOpenSessions.push(sessionId); 553a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 554aaf87dd09686bdb47df0a638b622a4c2ea37a331Adam Stone 555f0e618d0ee16c63f918c7bb87ec1ff264d177746Adam Stone mMetrics.mOpenSessionCounter.Increment(err); 556a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return err; 557a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 558a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 559a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::closeSession(Vector<uint8_t> const &sessionId) { 560a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 5616d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 562a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 563319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker Return<Status> status = mPlugin->closeSession(toHidlVec(sessionId)); 564319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker if (status.isOk()) { 565319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker if (status == Status::OK) { 566319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker DrmSessionManager::Instance()->removeSession(sessionId); 567319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker for (size_t i = 0; i < mOpenSessions.size(); i++) { 568319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker if (mOpenSessions[i] == sessionId) { 569319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker mOpenSessions.removeAt(i); 570319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker break; 571319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker } 5726133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker } 5736133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker } 574319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker reportMetrics(); 575cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone status_t response = toStatusT(status); 576cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone mMetrics.mCloseSessionCounter.Increment(response); 577cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone return response; 578a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 579cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone mMetrics.mCloseSessionCounter.Increment(DEAD_OBJECT); 580319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker return DEAD_OBJECT; 581a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 582a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 583a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::getKeyRequest(Vector<uint8_t> const &sessionId, 584a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Vector<uint8_t> const &initData, String8 const &mimeType, 585a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmPlugin::KeyType keyType, KeyedVector<String8, 586a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker String8> const &optionalParameters, Vector<uint8_t> &request, 587a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker String8 &defaultUrl, DrmPlugin::KeyRequestType *keyRequestType) { 588a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 5896d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 590f0e618d0ee16c63f918c7bb87ec1ff264d177746Adam Stone EventTimer<status_t> keyRequestTimer(&mMetrics.mGetKeyRequestTiming); 591a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 592a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 593a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 594a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker KeyType hKeyType; 595a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (keyType == DrmPlugin::kKeyType_Streaming) { 596a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker hKeyType = KeyType::STREAMING; 597a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } else if (keyType == DrmPlugin::kKeyType_Offline) { 598a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker hKeyType = KeyType::OFFLINE; 599a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } else if (keyType == DrmPlugin::kKeyType_Release) { 600a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker hKeyType = KeyType::RELEASE; 601a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } else { 602f0e618d0ee16c63f918c7bb87ec1ff264d177746Adam Stone keyRequestTimer.SetAttribute(BAD_VALUE); 603a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return BAD_VALUE; 604a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 605a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 606a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ::KeyedVector hOptionalParameters = toHidlKeyedVector(optionalParameters); 607a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 608a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 609a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 61059bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias if (mPluginV1_1 != NULL) { 61159bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias Return<void> hResult = 61259bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias mPluginV1_1->getKeyRequest_1_1( 61359bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias toHidlVec(sessionId), toHidlVec(initData), 61459bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias toHidlString(mimeType), hKeyType, hOptionalParameters, 61559bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias [&](Status status, const hidl_vec<uint8_t>& hRequest, 61659bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias drm::V1_1::KeyRequestType hKeyRequestType, 61759bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias const hidl_string& hDefaultUrl) { 61859bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias 61959bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias if (status == Status::OK) { 62059bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias request = toVector(hRequest); 62159bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias defaultUrl = toString8(hDefaultUrl); 62259bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias 62359bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias switch (hKeyRequestType) { 62459bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias case drm::V1_1::KeyRequestType::INITIAL: 62559bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias *keyRequestType = DrmPlugin::kKeyRequestType_Initial; 62659bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias break; 62759bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias case drm::V1_1::KeyRequestType::RENEWAL: 62859bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias *keyRequestType = DrmPlugin::kKeyRequestType_Renewal; 62959bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias break; 63059bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias case drm::V1_1::KeyRequestType::RELEASE: 63159bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias *keyRequestType = DrmPlugin::kKeyRequestType_Release; 63259bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias break; 63359bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias case drm::V1_1::KeyRequestType::NONE: 63459bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias *keyRequestType = DrmPlugin::kKeyRequestType_None; 63559bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias break; 63659bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias case drm::V1_1::KeyRequestType::UPDATE: 63759bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias *keyRequestType = DrmPlugin::kKeyRequestType_Update; 63859bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias break; 63959bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias default: 64059bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias *keyRequestType = DrmPlugin::kKeyRequestType_Unknown; 64159bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias break; 64259bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias } 64359bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias err = toStatusT(status); 64459bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias } 64559bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias }); 64659bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias return hResult.isOk() ? err : DEAD_OBJECT; 64759bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias } 64859bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias 649a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->getKeyRequest(toHidlVec(sessionId), 650a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlVec(initData), toHidlString(mimeType), hKeyType, hOptionalParameters, 651a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& hRequest, 65259bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias drm::V1_0::KeyRequestType hKeyRequestType, 65359bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias const hidl_string& hDefaultUrl) { 654a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 655a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 656a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker request = toVector(hRequest); 657a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker defaultUrl = toString8(hDefaultUrl); 658a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 659a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker switch (hKeyRequestType) { 66059bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias case drm::V1_0::KeyRequestType::INITIAL: 661a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker *keyRequestType = DrmPlugin::kKeyRequestType_Initial; 662a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 66359bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias case drm::V1_0::KeyRequestType::RENEWAL: 664a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker *keyRequestType = DrmPlugin::kKeyRequestType_Renewal; 665a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 66659bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias case drm::V1_0::KeyRequestType::RELEASE: 667a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker *keyRequestType = DrmPlugin::kKeyRequestType_Release; 668a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 669a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker default: 670a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker *keyRequestType = DrmPlugin::kKeyRequestType_Unknown; 671a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 672a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 673a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 674a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 675a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker }); 676a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 677f0e618d0ee16c63f918c7bb87ec1ff264d177746Adam Stone err = hResult.isOk() ? err : DEAD_OBJECT; 678f0e618d0ee16c63f918c7bb87ec1ff264d177746Adam Stone keyRequestTimer.SetAttribute(err); 679f0e618d0ee16c63f918c7bb87ec1ff264d177746Adam Stone return err; 680a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 681a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 682a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::provideKeyResponse(Vector<uint8_t> const &sessionId, 683a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Vector<uint8_t> const &response, Vector<uint8_t> &keySetId) { 684a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 685cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone EventTimer<status_t> keyResponseTimer(&mMetrics.mProvideKeyResponseTiming); 686cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone 6876d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 688a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 689a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 690a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 691a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 692a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 693a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->provideKeyResponse(toHidlVec(sessionId), 694a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlVec(response), 695a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& hKeySetId) { 696a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 697a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker keySetId = toVector(hKeySetId); 698a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 699a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 700a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 701a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 702cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone err = hResult.isOk() ? err : DEAD_OBJECT; 703cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone keyResponseTimer.SetAttribute(err); 704cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone return err; 705a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 706a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 707a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::removeKeys(Vector<uint8_t> const &keySetId) { 708a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 7096d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 710a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 711a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return toStatusT(mPlugin->removeKeys(toHidlVec(keySetId))); 712a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 713a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 714a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::restoreKeys(Vector<uint8_t> const &sessionId, 715a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Vector<uint8_t> const &keySetId) { 716a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 7176d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 718a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 719a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 720a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 721a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return toStatusT(mPlugin->restoreKeys(toHidlVec(sessionId), 722a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlVec(keySetId))); 723a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 724a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 725a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::queryKeyStatus(Vector<uint8_t> const &sessionId, 726a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker KeyedVector<String8, String8> &infoMap) const { 727a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 7286d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 729a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 730a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 731a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 732a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ::KeyedVector hInfoMap; 733a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 734a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 735a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 736a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->queryKeyStatus(toHidlVec(sessionId), 737a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<KeyValue>& map) { 738a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 739a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker infoMap = toKeyedVector(map); 740a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 741a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 742a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 743a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 744a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 745a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 746a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 747a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 748a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::getProvisionRequest(String8 const &certType, 749a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker String8 const &certAuthority, Vector<uint8_t> &request, 750a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker String8 &defaultUrl) { 751a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 7526d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 753a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 754a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 755a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 756a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->getProvisionRequest( 757a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlString(certType), toHidlString(certAuthority), 758a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& hRequest, 759a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker const hidl_string& hDefaultUrl) { 760a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 761a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker request = toVector(hRequest); 762a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker defaultUrl = toString8(hDefaultUrl); 763a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 764a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 765a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 766a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 767a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 768cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone err = hResult.isOk() ? err : DEAD_OBJECT; 769cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone mMetrics.mGetProvisionRequestCounter.Increment(err); 770cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone return err; 771a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 772a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 773a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::provideProvisionResponse(Vector<uint8_t> const &response, 77468b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong Vector<uint8_t> &certificate, Vector<uint8_t> &wrappedKey) { 775a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 7766d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 777a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 778a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 779a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 780a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->provideProvisionResponse(toHidlVec(response), 781a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& hCertificate, 782a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker const hidl_vec<uint8_t>& hWrappedKey) { 783a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 784a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker certificate = toVector(hCertificate); 785a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker wrappedKey = toVector(hWrappedKey); 786a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 787a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 788a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 789a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 790a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 791cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone err = hResult.isOk() ? err : DEAD_OBJECT; 792cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone mMetrics.mProvideProvisionResponseCounter.Increment(err); 793cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone return err; 794a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 795a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 796abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinkerstatus_t DrmHal::getSecureStops(List<Vector<uint8_t>> &secureStops) { 797a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 7986d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 799a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 800a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 801a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 802a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->getSecureStops( 803a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<SecureStop>& hSecureStops) { 804a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 805a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker secureStops = toSecureStops(hSecureStops); 806a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 807a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 808a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 809a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 810a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 811a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 812a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 813a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 814a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 81515177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinkerstatus_t DrmHal::getSecureStopIds(List<Vector<uint8_t>> &secureStopIds) { 81615177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker Mutex::Autolock autoLock(mLock); 81715177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker 81815177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker if (mInitCheck != OK) { 81915177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker return mInitCheck; 82015177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker } 82115177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker 82215177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker if (mPluginV1_1 == NULL) { 82315177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker return ERROR_DRM_CANNOT_HANDLE; 82415177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker } 82515177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker 82615177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker status_t err = UNKNOWN_ERROR; 82715177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker 82815177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker Return<void> hResult = mPluginV1_1->getSecureStopIds( 82915177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker [&](Status status, const hidl_vec<SecureStopId>& hSecureStopIds) { 83015177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker if (status == Status::OK) { 83115177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker secureStopIds = toSecureStopIds(hSecureStopIds); 83215177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker } 83315177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker err = toStatusT(status); 83415177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker } 83515177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker ); 83615177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker 83715177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 83815177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker} 83915177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker 84015177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker 841a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::getSecureStop(Vector<uint8_t> const &ssid, Vector<uint8_t> &secureStop) { 842a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 8436d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 844a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 845a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 846a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 847a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->getSecureStop(toHidlVec(ssid), 848a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const SecureStop& hSecureStop) { 849a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 850a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker secureStop = toVector(hSecureStop.opaqueData); 851a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 852a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 853a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 854a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 855a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 856a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 857a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 858a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 859a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::releaseSecureStops(Vector<uint8_t> const &ssRelease) { 860a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 8616d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 862a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 86315177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker if (mPluginV1_1 != NULL) { 86415177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker SecureStopRelease secureStopRelease; 86515177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker secureStopRelease.opaqueData = toHidlVec(ssRelease); 86615177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker return toStatusT(mPluginV1_1->releaseSecureStops(secureStopRelease)); 86715177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker } 86815177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker 869a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return toStatusT(mPlugin->releaseSecureStop(toHidlVec(ssRelease))); 870a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 871a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 87215177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinkerstatus_t DrmHal::removeSecureStop(Vector<uint8_t> const &ssid) { 87315177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker Mutex::Autolock autoLock(mLock); 87415177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker 87515177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker if (mInitCheck != OK) { 87615177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker return mInitCheck; 87715177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker } 87815177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker 87915177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker if (mPluginV1_1 == NULL) { 88015177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker return ERROR_DRM_CANNOT_HANDLE; 88115177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker } 88215177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker 88315177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker return toStatusT(mPluginV1_1->removeSecureStop(toHidlVec(ssid))); 88415177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker} 88515177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker 88615177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinkerstatus_t DrmHal::removeAllSecureStops() { 887a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 8886d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 889a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 89015177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker if (mPluginV1_1 != NULL) { 89115177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker return toStatusT(mPluginV1_1->removeAllSecureStops()); 89215177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker } 8936d998b67be330843f633a563c23c606593060165Jeff Tinker return toStatusT(mPlugin->releaseAllSecureStops()); 8946d998b67be330843f633a563c23c606593060165Jeff Tinker} 8956d998b67be330843f633a563c23c606593060165Jeff Tinker 8966d998b67be330843f633a563c23c606593060165Jeff Tinkerstatus_t DrmHal::getHdcpLevels(DrmPlugin::HdcpLevel *connected, 8976d998b67be330843f633a563c23c606593060165Jeff Tinker DrmPlugin::HdcpLevel *max) const { 8986d998b67be330843f633a563c23c606593060165Jeff Tinker Mutex::Autolock autoLock(mLock); 8996d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 9006d998b67be330843f633a563c23c606593060165Jeff Tinker 9016d998b67be330843f633a563c23c606593060165Jeff Tinker if (connected == NULL || max == NULL) { 9026d998b67be330843f633a563c23c606593060165Jeff Tinker return BAD_VALUE; 903a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 9046d998b67be330843f633a563c23c606593060165Jeff Tinker status_t err = UNKNOWN_ERROR; 905a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 9066d998b67be330843f633a563c23c606593060165Jeff Tinker if (mPluginV1_1 == NULL) { 9076d998b67be330843f633a563c23c606593060165Jeff Tinker return ERROR_DRM_CANNOT_HANDLE; 9086d998b67be330843f633a563c23c606593060165Jeff Tinker } 9096d998b67be330843f633a563c23c606593060165Jeff Tinker 9106d998b67be330843f633a563c23c606593060165Jeff Tinker *connected = DrmPlugin::kHdcpLevelUnknown; 9116d998b67be330843f633a563c23c606593060165Jeff Tinker *max = DrmPlugin::kHdcpLevelUnknown; 9126d998b67be330843f633a563c23c606593060165Jeff Tinker 9136d998b67be330843f633a563c23c606593060165Jeff Tinker Return<void> hResult = mPluginV1_1->getHdcpLevels( 9146d998b67be330843f633a563c23c606593060165Jeff Tinker [&](Status status, const HdcpLevel& hConnected, const HdcpLevel& hMax) { 9156d998b67be330843f633a563c23c606593060165Jeff Tinker if (status == Status::OK) { 9166d998b67be330843f633a563c23c606593060165Jeff Tinker *connected = toHdcpLevel(hConnected); 9176d998b67be330843f633a563c23c606593060165Jeff Tinker *max = toHdcpLevel(hMax); 9186d998b67be330843f633a563c23c606593060165Jeff Tinker } 9196d998b67be330843f633a563c23c606593060165Jeff Tinker err = toStatusT(status); 9206d998b67be330843f633a563c23c606593060165Jeff Tinker } 9216d998b67be330843f633a563c23c606593060165Jeff Tinker ); 9226d998b67be330843f633a563c23c606593060165Jeff Tinker 9236d998b67be330843f633a563c23c606593060165Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 9246d998b67be330843f633a563c23c606593060165Jeff Tinker} 9256d998b67be330843f633a563c23c606593060165Jeff Tinker 9266d998b67be330843f633a563c23c606593060165Jeff Tinkerstatus_t DrmHal::getNumberOfSessions(uint32_t *open, uint32_t *max) const { 9276d998b67be330843f633a563c23c606593060165Jeff Tinker Mutex::Autolock autoLock(mLock); 9286d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 9296d998b67be330843f633a563c23c606593060165Jeff Tinker 9306d998b67be330843f633a563c23c606593060165Jeff Tinker if (open == NULL || max == NULL) { 9316d998b67be330843f633a563c23c606593060165Jeff Tinker return BAD_VALUE; 9326d998b67be330843f633a563c23c606593060165Jeff Tinker } 9336d998b67be330843f633a563c23c606593060165Jeff Tinker status_t err = UNKNOWN_ERROR; 9346d998b67be330843f633a563c23c606593060165Jeff Tinker 9356d998b67be330843f633a563c23c606593060165Jeff Tinker *open = 0; 9366d998b67be330843f633a563c23c606593060165Jeff Tinker *max = 0; 9376d998b67be330843f633a563c23c606593060165Jeff Tinker 9386d998b67be330843f633a563c23c606593060165Jeff Tinker if (mPluginV1_1 == NULL) { 9396d998b67be330843f633a563c23c606593060165Jeff Tinker return ERROR_DRM_CANNOT_HANDLE; 9406d998b67be330843f633a563c23c606593060165Jeff Tinker } 9416d998b67be330843f633a563c23c606593060165Jeff Tinker 9426d998b67be330843f633a563c23c606593060165Jeff Tinker Return<void> hResult = mPluginV1_1->getNumberOfSessions( 9436d998b67be330843f633a563c23c606593060165Jeff Tinker [&](Status status, uint32_t hOpen, uint32_t hMax) { 9446d998b67be330843f633a563c23c606593060165Jeff Tinker if (status == Status::OK) { 9456d998b67be330843f633a563c23c606593060165Jeff Tinker *open = hOpen; 9466d998b67be330843f633a563c23c606593060165Jeff Tinker *max = hMax; 9476d998b67be330843f633a563c23c606593060165Jeff Tinker } 9486d998b67be330843f633a563c23c606593060165Jeff Tinker err = toStatusT(status); 9496d998b67be330843f633a563c23c606593060165Jeff Tinker } 9506d998b67be330843f633a563c23c606593060165Jeff Tinker ); 9516d998b67be330843f633a563c23c606593060165Jeff Tinker 9526d998b67be330843f633a563c23c606593060165Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 9536d998b67be330843f633a563c23c606593060165Jeff Tinker} 9546d998b67be330843f633a563c23c606593060165Jeff Tinker 9556d998b67be330843f633a563c23c606593060165Jeff Tinkerstatus_t DrmHal::getSecurityLevel(Vector<uint8_t> const &sessionId, 9566d998b67be330843f633a563c23c606593060165Jeff Tinker DrmPlugin::SecurityLevel *level) const { 9576d998b67be330843f633a563c23c606593060165Jeff Tinker Mutex::Autolock autoLock(mLock); 9586d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 9596d998b67be330843f633a563c23c606593060165Jeff Tinker 9606d998b67be330843f633a563c23c606593060165Jeff Tinker if (level == NULL) { 9616d998b67be330843f633a563c23c606593060165Jeff Tinker return BAD_VALUE; 9626d998b67be330843f633a563c23c606593060165Jeff Tinker } 9636d998b67be330843f633a563c23c606593060165Jeff Tinker status_t err = UNKNOWN_ERROR; 9646d998b67be330843f633a563c23c606593060165Jeff Tinker 9656d998b67be330843f633a563c23c606593060165Jeff Tinker if (mPluginV1_1 == NULL) { 9666d998b67be330843f633a563c23c606593060165Jeff Tinker return ERROR_DRM_CANNOT_HANDLE; 9676d998b67be330843f633a563c23c606593060165Jeff Tinker } 9686d998b67be330843f633a563c23c606593060165Jeff Tinker 9696d998b67be330843f633a563c23c606593060165Jeff Tinker *level = DrmPlugin::kSecurityLevelUnknown; 9706d998b67be330843f633a563c23c606593060165Jeff Tinker 9716d998b67be330843f633a563c23c606593060165Jeff Tinker Return<void> hResult = mPluginV1_1->getSecurityLevel(toHidlVec(sessionId), 9726d998b67be330843f633a563c23c606593060165Jeff Tinker [&](Status status, SecurityLevel hLevel) { 9736d998b67be330843f633a563c23c606593060165Jeff Tinker if (status == Status::OK) { 9746d998b67be330843f633a563c23c606593060165Jeff Tinker *level = toSecurityLevel(hLevel); 9756d998b67be330843f633a563c23c606593060165Jeff Tinker } 9766d998b67be330843f633a563c23c606593060165Jeff Tinker err = toStatusT(status); 9776d998b67be330843f633a563c23c606593060165Jeff Tinker } 9786d998b67be330843f633a563c23c606593060165Jeff Tinker ); 9796d998b67be330843f633a563c23c606593060165Jeff Tinker 9806d998b67be330843f633a563c23c606593060165Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 9816d998b67be330843f633a563c23c606593060165Jeff Tinker} 9826d998b67be330843f633a563c23c606593060165Jeff Tinker 9836d998b67be330843f633a563c23c606593060165Jeff Tinkerstatus_t DrmHal::setSecurityLevel(Vector<uint8_t> const &sessionId, 9846d998b67be330843f633a563c23c606593060165Jeff Tinker const DrmPlugin::SecurityLevel& level) { 9856d998b67be330843f633a563c23c606593060165Jeff Tinker Mutex::Autolock autoLock(mLock); 9866d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 9876d998b67be330843f633a563c23c606593060165Jeff Tinker 9886d998b67be330843f633a563c23c606593060165Jeff Tinker if (mPluginV1_1 == NULL) { 9896d998b67be330843f633a563c23c606593060165Jeff Tinker return ERROR_DRM_CANNOT_HANDLE; 9906d998b67be330843f633a563c23c606593060165Jeff Tinker } 9916d998b67be330843f633a563c23c606593060165Jeff Tinker 9926d998b67be330843f633a563c23c606593060165Jeff Tinker SecurityLevel hSecurityLevel; 9936d998b67be330843f633a563c23c606593060165Jeff Tinker 9946d998b67be330843f633a563c23c606593060165Jeff Tinker switch(level) { 9956d998b67be330843f633a563c23c606593060165Jeff Tinker case DrmPlugin::kSecurityLevelSwSecureCrypto: 9966d998b67be330843f633a563c23c606593060165Jeff Tinker hSecurityLevel = SecurityLevel::SW_SECURE_CRYPTO; 9976d998b67be330843f633a563c23c606593060165Jeff Tinker break; 9986d998b67be330843f633a563c23c606593060165Jeff Tinker case DrmPlugin::kSecurityLevelSwSecureDecode: 9996d998b67be330843f633a563c23c606593060165Jeff Tinker hSecurityLevel = SecurityLevel::SW_SECURE_DECODE; 10006d998b67be330843f633a563c23c606593060165Jeff Tinker break; 10016d998b67be330843f633a563c23c606593060165Jeff Tinker case DrmPlugin::kSecurityLevelHwSecureCrypto: 10026d998b67be330843f633a563c23c606593060165Jeff Tinker hSecurityLevel = SecurityLevel::HW_SECURE_CRYPTO; 10036d998b67be330843f633a563c23c606593060165Jeff Tinker break; 10046d998b67be330843f633a563c23c606593060165Jeff Tinker case DrmPlugin::kSecurityLevelHwSecureDecode: 10056d998b67be330843f633a563c23c606593060165Jeff Tinker hSecurityLevel = SecurityLevel::HW_SECURE_DECODE; 10066d998b67be330843f633a563c23c606593060165Jeff Tinker break; 10076d998b67be330843f633a563c23c606593060165Jeff Tinker case DrmPlugin::kSecurityLevelHwSecureAll: 10086d998b67be330843f633a563c23c606593060165Jeff Tinker hSecurityLevel = SecurityLevel::HW_SECURE_ALL; 10096d998b67be330843f633a563c23c606593060165Jeff Tinker break; 10106d998b67be330843f633a563c23c606593060165Jeff Tinker default: 10116d998b67be330843f633a563c23c606593060165Jeff Tinker return ERROR_DRM_CANNOT_HANDLE; 10126d998b67be330843f633a563c23c606593060165Jeff Tinker } 10136d998b67be330843f633a563c23c606593060165Jeff Tinker 10146d998b67be330843f633a563c23c606593060165Jeff Tinker Status status = mPluginV1_1->setSecurityLevel(toHidlVec(sessionId), 10156d998b67be330843f633a563c23c606593060165Jeff Tinker hSecurityLevel); 10166d998b67be330843f633a563c23c606593060165Jeff Tinker return toStatusT(status); 1017a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 1018a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1019a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::getPropertyString(String8 const &name, String8 &value ) const { 1020a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 102133ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce return getPropertyStringInternal(name, value); 102233ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce} 102333ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce 102433ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Brucestatus_t DrmHal::getPropertyStringInternal(String8 const &name, String8 &value) const { 102533ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce // This function is internal to the class and should only be called while 102633ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce // mLock is already held. 10276d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 1028a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1029a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 1030a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1031a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->getPropertyString(toHidlString(name), 1032a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_string& hValue) { 1033a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 1034a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker value = toString8(hValue); 1035a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1036a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 1037a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1038a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 1039a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1040a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 1041a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 1042a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1043a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::getPropertyByteArray(String8 const &name, Vector<uint8_t> &value ) const { 1044a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 104533ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce return getPropertyByteArrayInternal(name, value); 104633ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce} 104733ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce 104833ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Brucestatus_t DrmHal::getPropertyByteArrayInternal(String8 const &name, Vector<uint8_t> &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->getPropertyByteArray(toHidlString(name), 1056a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& hValue) { 1057a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 1058a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker value = toVector(hValue); 1059a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1060a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 1061a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1062a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 1063a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1064cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone err = hResult.isOk() ? err : DEAD_OBJECT; 1065cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone if (name == kPropertyDeviceUniqueId) { 1066cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone mMetrics.mGetDeviceUniqueIdCounter.Increment(err); 1067cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone } 1068cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone return err; 1069a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 1070a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1071a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::setPropertyString(String8 const &name, String8 const &value ) const { 1072a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 10736d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 1074a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 10756d998b67be330843f633a563c23c606593060165Jeff Tinker Status status = mPlugin->setPropertyString(toHidlString(name), 1076a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlString(value)); 1077a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return toStatusT(status); 1078a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 1079a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1080a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::setPropertyByteArray(String8 const &name, 1081a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Vector<uint8_t> const &value ) const { 1082a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 10836d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 1084a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1085a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Status status = mPlugin->setPropertyByteArray(toHidlString(name), 1086a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlVec(value)); 1087a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return toStatusT(status); 1088a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 1089a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1090637b7855829920114a8863b93fe52203b7471eeaAdam Stonestatus_t DrmHal::getMetrics(PersistableBundle* item) { 1091f0e618d0ee16c63f918c7bb87ec1ff264d177746Adam Stone if (item == nullptr) { 1092f0e618d0ee16c63f918c7bb87ec1ff264d177746Adam Stone return UNEXPECTED_NULL; 1093f0e618d0ee16c63f918c7bb87ec1ff264d177746Adam Stone } 1094f0e618d0ee16c63f918c7bb87ec1ff264d177746Adam Stone 1095f0e618d0ee16c63f918c7bb87ec1ff264d177746Adam Stone mMetrics.Export(item); 1096ab394d13bab3a84f23677357576cee7a6f0c7899Adam Stone return OK; 1097ab394d13bab3a84f23677357576cee7a6f0c7899Adam Stone} 1098a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1099a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::setCipherAlgorithm(Vector<uint8_t> const &sessionId, 1100a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker String8 const &algorithm) { 1101a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 11026d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 1103a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1104a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 1105a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1106a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Status status = mPlugin->setCipherAlgorithm(toHidlVec(sessionId), 1107a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlString(algorithm)); 1108a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return toStatusT(status); 1109a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 1110a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1111a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::setMacAlgorithm(Vector<uint8_t> const &sessionId, 1112a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker String8 const &algorithm) { 1113a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 11146d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 1115a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1116a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 1117a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1118a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Status status = mPlugin->setMacAlgorithm(toHidlVec(sessionId), 1119a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlString(algorithm)); 1120a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return toStatusT(status); 1121a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 1122a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1123a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::encrypt(Vector<uint8_t> const &sessionId, 112468b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong Vector<uint8_t> const &keyId, Vector<uint8_t> const &input, 112568b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong Vector<uint8_t> const &iv, Vector<uint8_t> &output) { 1126a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 11276d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 1128a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1129a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 1130a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1131a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 1132a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1133a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->encrypt(toHidlVec(sessionId), 1134a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlVec(keyId), toHidlVec(input), toHidlVec(iv), 1135a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& hOutput) { 1136a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 1137a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker output = toVector(hOutput); 1138a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1139a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 1140a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1141a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 1142a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1143a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 1144a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 1145a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1146a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::decrypt(Vector<uint8_t> const &sessionId, 114768b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong Vector<uint8_t> const &keyId, Vector<uint8_t> const &input, 114868b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong Vector<uint8_t> const &iv, Vector<uint8_t> &output) { 1149a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 11506d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 1151a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1152a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 1153a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1154a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 1155a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1156a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->decrypt(toHidlVec(sessionId), 1157a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlVec(keyId), toHidlVec(input), toHidlVec(iv), 1158a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& hOutput) { 1159a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 1160a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker output = toVector(hOutput); 1161a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1162a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 1163a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1164a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 1165a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1166a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 1167a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 1168a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1169a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::sign(Vector<uint8_t> const &sessionId, 117068b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong Vector<uint8_t> const &keyId, Vector<uint8_t> const &message, 117168b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong Vector<uint8_t> &signature) { 1172a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 11736d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 1174a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1175a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 1176a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1177a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 1178a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1179a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->sign(toHidlVec(sessionId), 1180a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlVec(keyId), toHidlVec(message), 1181a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& hSignature) { 1182a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 1183a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker signature = toVector(hSignature); 1184a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1185a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 1186a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1187a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 1188a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1189a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 1190a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 1191a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1192a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::verify(Vector<uint8_t> const &sessionId, 119368b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong Vector<uint8_t> const &keyId, Vector<uint8_t> const &message, 119468b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong Vector<uint8_t> const &signature, bool &match) { 1195a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 11966d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 1197a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1198a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 1199a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1200a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 1201a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1202a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->verify(toHidlVec(sessionId),toHidlVec(keyId), 1203a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlVec(message), toHidlVec(signature), 1204a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, bool hMatch) { 1205a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 1206a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker match = hMatch; 1207a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } else { 1208a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker match = false; 1209a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1210a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 1211a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1212a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 1213a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1214a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 1215a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 1216a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1217a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::signRSA(Vector<uint8_t> const &sessionId, 121868b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong String8 const &algorithm, Vector<uint8_t> const &message, 121968b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong Vector<uint8_t> const &wrappedKey, Vector<uint8_t> &signature) { 1220a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 12216d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 1222a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1223a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (!checkPermission("android.permission.ACCESS_DRM_CERTIFICATES")) { 1224a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return -EPERM; 1225a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1226a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1227a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 1228a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1229a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 1230a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1231a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->signRSA(toHidlVec(sessionId), 1232a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlString(algorithm), toHidlVec(message), toHidlVec(wrappedKey), 1233a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& hSignature) { 1234a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 1235a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker signature = toVector(hSignature); 1236a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1237a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 1238a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1239a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 1240a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1241a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 1242a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 1243a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1244a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkervoid DrmHal::binderDied(const wp<IBinder> &the_late_who __unused) 1245a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker{ 1246a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 12476133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker closeOpenSessions(); 12483e2891674ef57a74e59ca5e27f89647b3f06861bJeff Tinker setListener(NULL); 1249319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker mInitCheck = NO_INIT; 1250319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker 125170367f525a7bf5be52115608d190d72756e972eaJeff Tinker if (mPlugin != NULL) { 1252319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker if (!mPlugin->setListener(NULL).isOk()) { 1253319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker mInitCheck = DEAD_OBJECT; 1254319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker } 125570367f525a7bf5be52115608d190d72756e972eaJeff Tinker } 1256a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mPlugin.clear(); 1257a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 1258a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1259a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkervoid DrmHal::writeByteArray(Parcel &obj, hidl_vec<uint8_t> const &vec) 1260a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker{ 1261a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (vec.size()) { 1262a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker obj.writeInt32(vec.size()); 1263a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker obj.write(vec.data(), vec.size()); 1264a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } else { 1265a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker obj.writeInt32(0); 1266a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1267a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 1268a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1269ab394d13bab3a84f23677357576cee7a6f0c7899Adam Stone 127033ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Brucevoid DrmHal::reportMetrics() const 127133ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce{ 127233ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce Vector<uint8_t> metrics; 127333ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce String8 vendor; 127433ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce String8 description; 127533ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce if (getPropertyStringInternal(String8("vendor"), vendor) == OK && 127633ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce getPropertyStringInternal(String8("description"), description) == OK && 127733ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce getPropertyByteArrayInternal(String8("metrics"), metrics) == OK) { 127833ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce status_t res = android::reportDrmPluginMetrics( 127933ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce metrics, vendor, description); 128033ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce if (res != OK) { 128133ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce ALOGE("Metrics were retrieved but could not be reported: %i", res); 128233ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce } 128333ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce } 128433ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce} 128533ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce 1286a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} // namespace android 1287