DrmHal.cpp revision 6d998b67be330843f633a563c23c606593060165
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> 3333ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce#include <media/PluginMetricsReporting.h> 34a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#include <media/drm/DrmAPI.h> 35a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#include <media/stagefright/foundation/ADebug.h> 36a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#include <media/stagefright/foundation/AString.h> 37a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#include <media/stagefright/foundation/hexdump.h> 38a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#include <media/stagefright/MediaErrors.h> 39a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 406d998b67be330843f633a563c23c606593060165Jeff Tinkerusing drm::V1_0::KeyedVector; 416d998b67be330843f633a563c23c606593060165Jeff Tinkerusing drm::V1_0::KeyRequestType; 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; 476d998b67be330843f633a563c23c606593060165Jeff Tinkerusing drm::V1_1::SecurityLevel; 486d998b67be330843f633a563c23c606593060165Jeff Tinkerusing drm::V1_0::Status; 49a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerusing ::android::hardware::hidl_array; 50a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerusing ::android::hardware::hidl_string; 51a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerusing ::android::hardware::hidl_vec; 52a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerusing ::android::hardware::Return; 53a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerusing ::android::hardware::Void; 54abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinkerusing ::android::hidl::manager::V1_0::IServiceManager; 55a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerusing ::android::sp; 56a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 57a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkernamespace android { 58a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 596d998b67be330843f633a563c23c606593060165Jeff Tinker#define INIT_CHECK() {if (mInitCheck != OK) return mInitCheck;} 606d998b67be330843f633a563c23c606593060165Jeff Tinker 61a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic inline int getCallingPid() { 62a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return IPCThreadState::self()->getCallingPid(); 63a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 64a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 65a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic bool checkPermission(const char* permissionString) { 66a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (getpid() == IPCThreadState::self()->getCallingPid()) return true; 67a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker bool ok = checkCallingPermission(String16(permissionString)); 68a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (!ok) ALOGE("Request requires %s", permissionString); 69a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return ok; 70a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 71a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 72a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic const Vector<uint8_t> toVector(const hidl_vec<uint8_t> &vec) { 73a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Vector<uint8_t> vector; 74a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker vector.appendArray(vec.data(), vec.size()); 75a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return *const_cast<const Vector<uint8_t> *>(&vector); 76a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 77a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 78a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic hidl_vec<uint8_t> toHidlVec(const Vector<uint8_t> &vector) { 79a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker hidl_vec<uint8_t> vec; 80a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker vec.setToExternal(const_cast<uint8_t *>(vector.array()), vector.size()); 81a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return vec; 82a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 83a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 84a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic String8 toString8(const hidl_string &string) { 85a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return String8(string.c_str()); 86a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 87a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 88a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic hidl_string toHidlString(const String8& string) { 89a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hidl_string(string.string()); 90a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 91a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 926d998b67be330843f633a563c23c606593060165Jeff Tinkerstatic DrmPlugin::SecurityLevel toSecurityLevel(SecurityLevel level) { 936d998b67be330843f633a563c23c606593060165Jeff Tinker switch(level) { 946d998b67be330843f633a563c23c606593060165Jeff Tinker case SecurityLevel::SW_SECURE_CRYPTO: 956d998b67be330843f633a563c23c606593060165Jeff Tinker return DrmPlugin::kSecurityLevelSwSecureCrypto; 966d998b67be330843f633a563c23c606593060165Jeff Tinker case SecurityLevel::SW_SECURE_DECODE: 976d998b67be330843f633a563c23c606593060165Jeff Tinker return DrmPlugin::kSecurityLevelSwSecureDecode; 986d998b67be330843f633a563c23c606593060165Jeff Tinker case SecurityLevel::HW_SECURE_CRYPTO: 996d998b67be330843f633a563c23c606593060165Jeff Tinker return DrmPlugin::kSecurityLevelHwSecureCrypto; 1006d998b67be330843f633a563c23c606593060165Jeff Tinker case SecurityLevel::HW_SECURE_DECODE: 1016d998b67be330843f633a563c23c606593060165Jeff Tinker return DrmPlugin::kSecurityLevelHwSecureDecode; 1026d998b67be330843f633a563c23c606593060165Jeff Tinker case SecurityLevel::HW_SECURE_ALL: 1036d998b67be330843f633a563c23c606593060165Jeff Tinker return DrmPlugin::kSecurityLevelHwSecureAll; 1046d998b67be330843f633a563c23c606593060165Jeff Tinker default: 1056d998b67be330843f633a563c23c606593060165Jeff Tinker return DrmPlugin::kSecurityLevelUnknown; 1066d998b67be330843f633a563c23c606593060165Jeff Tinker } 1076d998b67be330843f633a563c23c606593060165Jeff Tinker} 1086d998b67be330843f633a563c23c606593060165Jeff Tinker 1096d998b67be330843f633a563c23c606593060165Jeff Tinkerstatic DrmPlugin::HdcpLevel toHdcpLevel(HdcpLevel level) { 1106d998b67be330843f633a563c23c606593060165Jeff Tinker switch(level) { 1116d998b67be330843f633a563c23c606593060165Jeff Tinker case HdcpLevel::HDCP_NONE: 1126d998b67be330843f633a563c23c606593060165Jeff Tinker return DrmPlugin::kHdcpNone; 1136d998b67be330843f633a563c23c606593060165Jeff Tinker case HdcpLevel::HDCP_V1: 1146d998b67be330843f633a563c23c606593060165Jeff Tinker return DrmPlugin::kHdcpV1; 1156d998b67be330843f633a563c23c606593060165Jeff Tinker case HdcpLevel::HDCP_V2: 1166d998b67be330843f633a563c23c606593060165Jeff Tinker return DrmPlugin::kHdcpV2; 1176d998b67be330843f633a563c23c606593060165Jeff Tinker case HdcpLevel::HDCP_V2_1: 1186d998b67be330843f633a563c23c606593060165Jeff Tinker return DrmPlugin::kHdcpV2_1; 1196d998b67be330843f633a563c23c606593060165Jeff Tinker case HdcpLevel::HDCP_V2_2: 1206d998b67be330843f633a563c23c606593060165Jeff Tinker return DrmPlugin::kHdcpV2_2; 1216d998b67be330843f633a563c23c606593060165Jeff Tinker case HdcpLevel::HDCP_NO_OUTPUT: 1226d998b67be330843f633a563c23c606593060165Jeff Tinker return DrmPlugin::kHdcpNoOutput; 1236d998b67be330843f633a563c23c606593060165Jeff Tinker default: 1246d998b67be330843f633a563c23c606593060165Jeff Tinker return DrmPlugin::kHdcpLevelUnknown; 1256d998b67be330843f633a563c23c606593060165Jeff Tinker } 1266d998b67be330843f633a563c23c606593060165Jeff Tinker} 1276d998b67be330843f633a563c23c606593060165Jeff Tinker 128a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 129a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic ::KeyedVector toHidlKeyedVector(const KeyedVector<String8, String8>& 130a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker keyedVector) { 131a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker std::vector<KeyValue> stdKeyedVector; 132a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker for (size_t i = 0; i < keyedVector.size(); i++) { 133a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker KeyValue keyValue; 134a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker keyValue.key = toHidlString(keyedVector.keyAt(i)); 135a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker keyValue.value = toHidlString(keyedVector.valueAt(i)); 136a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker stdKeyedVector.push_back(keyValue); 137a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 138a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return ::KeyedVector(stdKeyedVector); 139a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 140a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 141a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic KeyedVector<String8, String8> toKeyedVector(const ::KeyedVector& 142a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker hKeyedVector) { 143a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker KeyedVector<String8, String8> keyedVector; 144a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker for (size_t i = 0; i < hKeyedVector.size(); i++) { 145a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker keyedVector.add(toString8(hKeyedVector[i].key), 146a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toString8(hKeyedVector[i].value)); 147a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 148a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return keyedVector; 149a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 150a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 151abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinkerstatic List<Vector<uint8_t>> toSecureStops(const hidl_vec<SecureStop>& 152a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker hSecureStops) { 153abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker List<Vector<uint8_t>> secureStops; 154a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker for (size_t i = 0; i < hSecureStops.size(); i++) { 155a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker secureStops.push_back(toVector(hSecureStops[i].opaqueData)); 156a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 157a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return secureStops; 158a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 159a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 160a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic status_t toStatusT(Status status) { 161a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker switch (status) { 162a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case Status::OK: 163a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return OK; 164a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 165a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case Status::ERROR_DRM_NO_LICENSE: 166a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return ERROR_DRM_NO_LICENSE; 167a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 168a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case Status::ERROR_DRM_LICENSE_EXPIRED: 169a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return ERROR_DRM_LICENSE_EXPIRED; 170a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 171a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case Status::ERROR_DRM_SESSION_NOT_OPENED: 172a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return ERROR_DRM_SESSION_NOT_OPENED; 173a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 174a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case Status::ERROR_DRM_CANNOT_HANDLE: 175a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return ERROR_DRM_CANNOT_HANDLE; 176a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 177a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case Status::ERROR_DRM_INVALID_STATE: 178a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return ERROR_DRM_TAMPER_DETECTED; 179a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 180a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case Status::BAD_VALUE: 181a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return BAD_VALUE; 182a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 183a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case Status::ERROR_DRM_NOT_PROVISIONED: 184a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return ERROR_DRM_NOT_PROVISIONED; 185a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 186a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case Status::ERROR_DRM_RESOURCE_BUSY: 187a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return ERROR_DRM_RESOURCE_BUSY; 188a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 189a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case Status::ERROR_DRM_DEVICE_REVOKED: 190a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return ERROR_DRM_DEVICE_REVOKED; 191a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 192a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case Status::ERROR_DRM_UNKNOWN: 193a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker default: 194a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return ERROR_DRM_UNKNOWN; 195a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 196a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 197a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 198a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 199a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 200a53d6553fce1818bdf87833f93633c93ad1b5915Jeff TinkerMutex DrmHal::mLock; 201a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 202a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstruct DrmSessionClient : public DrmSessionClientInterface { 203a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker explicit DrmSessionClient(DrmHal* drm) : mDrm(drm) {} 204a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 205a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker virtual bool reclaimSession(const Vector<uint8_t>& sessionId) { 206a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker sp<DrmHal> drm = mDrm.promote(); 207a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (drm == NULL) { 208a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return true; 209a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 210a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = drm->closeSession(sessionId); 211a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (err != OK) { 212a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return false; 213a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 214a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker drm->sendEvent(EventType::SESSION_RECLAIMED, 215a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlVec(sessionId), hidl_vec<uint8_t>()); 216a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return true; 217a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 218a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 219a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerprotected: 220a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker virtual ~DrmSessionClient() {} 221a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 222a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerprivate: 223a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker wp<DrmHal> mDrm; 224a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 225a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DISALLOW_EVIL_CONSTRUCTORS(DrmSessionClient); 226a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}; 227a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 228a53d6553fce1818bdf87833f93633c93ad1b5915Jeff TinkerDrmHal::DrmHal() 229a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker : mDrmSessionClient(new DrmSessionClient(this)), 230abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker mFactories(makeDrmFactories()), 231abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker mInitCheck((mFactories.size() == 0) ? ERROR_UNSUPPORTED : NO_INIT) { 232a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 233a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 2346133281c9b06c1d1176eca7f07401bba1067081eJeff Tinkervoid DrmHal::closeOpenSessions() { 2356133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker if (mPlugin != NULL) { 2366133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker for (size_t i = 0; i < mOpenSessions.size(); i++) { 2376133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker mPlugin->closeSession(toHidlVec(mOpenSessions[i])); 2386133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker DrmSessionManager::Instance()->removeSession(mOpenSessions[i]); 2396133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker } 2406133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker } 2416133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker mOpenSessions.clear(); 2426133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker} 2436133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker 244a53d6553fce1818bdf87833f93633c93ad1b5915Jeff TinkerDrmHal::~DrmHal() { 2456133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker closeOpenSessions(); 246a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->removeDrm(mDrmSessionClient); 247a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 248a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 249abeb36a8c2f044772297536e70340c3b245863e4Jeff TinkerVector<sp<IDrmFactory>> DrmHal::makeDrmFactories() { 250abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker Vector<sp<IDrmFactory>> factories; 251c82b9c335e69b617817dace0ef64ad3df3f5080fJeff Tinker 252593111f4460f2b2e8f541e936670e3577d45fff6Jeff Tinker auto manager = hardware::defaultServiceManager(); 253c82b9c335e69b617817dace0ef64ad3df3f5080fJeff Tinker 254abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker if (manager != NULL) { 255abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker manager->listByInterface(IDrmFactory::descriptor, 256abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker [&factories](const hidl_vec<hidl_string> ®istered) { 257abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker for (const auto &instance : registered) { 258abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker auto factory = IDrmFactory::getService(instance); 259abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker if (factory != NULL) { 260abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker factories.push_back(factory); 261abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker ALOGI("makeDrmFactories: factory instance %s is %s", 262abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker instance.c_str(), 263abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker factory->isRemote() ? "Remote" : "Not Remote"); 264abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } 265abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } 266abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } 267abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker ); 268abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } 269a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 270abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker if (factories.size() == 0) { 271abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker // must be in passthrough mode, load the default passthrough service 272e309b22bff1719f1fea84b247e4b2bc4c5f09eb5Jeff Tinker auto passthrough = IDrmFactory::getService(); 273abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker if (passthrough != NULL) { 274abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker ALOGI("makeDrmFactories: using default drm instance"); 275abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker factories.push_back(passthrough); 276abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } else { 277abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker ALOGE("Failed to find any drm factories"); 278abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } 279a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 280abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker return factories; 281abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker} 282abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker 283abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinkersp<IDrmPlugin> DrmHal::makeDrmPlugin(const sp<IDrmFactory>& factory, 284abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker const uint8_t uuid[16], const String8& appPackageName) { 285a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 286a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker sp<IDrmPlugin> plugin; 287abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker Return<void> hResult = factory->createPlugin(uuid, appPackageName.string(), 288a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const sp<IDrmPlugin>& hPlugin) { 289abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker if (status != Status::OK) { 290abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker ALOGE("Failed to make drm plugin"); 291abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker return; 292abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } 293abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker plugin = hPlugin; 294abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } 295abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker ); 296f0e89b0b248976f622fc41da4f678955399def08Jeff Tinker 297f0e89b0b248976f622fc41da4f678955399def08Jeff Tinker if (!hResult.isOk()) { 298f0e89b0b248976f622fc41da4f678955399def08Jeff Tinker ALOGE("createPlugin remote call failed"); 299f0e89b0b248976f622fc41da4f678955399def08Jeff Tinker } 300f0e89b0b248976f622fc41da4f678955399def08Jeff Tinker 301a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return plugin; 302a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 303a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 304a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::initCheck() const { 305a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return mInitCheck; 306a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 307a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 308a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::setListener(const sp<IDrmClient>& listener) 309a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker{ 310a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock lock(mEventLock); 311a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (mListener != NULL){ 312a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker IInterface::asBinder(mListener)->unlinkToDeath(this); 313a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 314a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (listener != NULL) { 315a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker IInterface::asBinder(listener)->linkToDeath(this); 316a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 317a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mListener = listener; 318a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return NO_ERROR; 319a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 320a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 321a53d6553fce1818bdf87833f93633c93ad1b5915Jeff TinkerReturn<void> DrmHal::sendEvent(EventType hEventType, 322a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker const hidl_vec<uint8_t>& sessionId, const hidl_vec<uint8_t>& data) { 323a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 324a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mEventLock.lock(); 325a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker sp<IDrmClient> listener = mListener; 326a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mEventLock.unlock(); 327a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 328a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (listener != NULL) { 329a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Parcel obj; 330a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker writeByteArray(obj, sessionId); 331a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker writeByteArray(obj, data); 332a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 333a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock lock(mNotifyLock); 334a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmPlugin::EventType eventType; 335a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker switch(hEventType) { 336a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case EventType::PROVISION_REQUIRED: 337a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker eventType = DrmPlugin::kDrmPluginEventProvisionRequired; 338a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 339a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case EventType::KEY_NEEDED: 340a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker eventType = DrmPlugin::kDrmPluginEventKeyNeeded; 341a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 342a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case EventType::KEY_EXPIRED: 343a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker eventType = DrmPlugin::kDrmPluginEventKeyExpired; 344a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 345a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case EventType::VENDOR_DEFINED: 346a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker eventType = DrmPlugin::kDrmPluginEventVendorDefined; 347a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 348b86f4b3ce066eadbfe9c2f420b16aaf2de741edbRahul Frias case EventType::SESSION_RECLAIMED: 349b86f4b3ce066eadbfe9c2f420b16aaf2de741edbRahul Frias eventType = DrmPlugin::kDrmPluginEventSessionReclaimed; 350b86f4b3ce066eadbfe9c2f420b16aaf2de741edbRahul Frias break; 351a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker default: 352a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return Void(); 353a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 354a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker listener->notify(eventType, 0, &obj); 355a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 356a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return Void(); 357a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 358a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 359a53d6553fce1818bdf87833f93633c93ad1b5915Jeff TinkerReturn<void> DrmHal::sendExpirationUpdate(const hidl_vec<uint8_t>& sessionId, 360a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker int64_t expiryTimeInMS) { 361a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 362a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mEventLock.lock(); 363a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker sp<IDrmClient> listener = mListener; 364a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mEventLock.unlock(); 365a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 366a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (listener != NULL) { 367a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Parcel obj; 368a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker writeByteArray(obj, sessionId); 369a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker obj.writeInt64(expiryTimeInMS); 370a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 371a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock lock(mNotifyLock); 372a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker listener->notify(DrmPlugin::kDrmPluginEventExpirationUpdate, 0, &obj); 373a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 374a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return Void(); 375a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 376a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 377a53d6553fce1818bdf87833f93633c93ad1b5915Jeff TinkerReturn<void> DrmHal::sendKeysChange(const hidl_vec<uint8_t>& sessionId, 378a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker const hidl_vec<KeyStatus>& keyStatusList, bool hasNewUsableKey) { 379a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 380a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mEventLock.lock(); 381a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker sp<IDrmClient> listener = mListener; 382a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mEventLock.unlock(); 383a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 384a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (listener != NULL) { 385a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Parcel obj; 386a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker writeByteArray(obj, sessionId); 387a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 388a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker size_t nKeys = keyStatusList.size(); 389a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker obj.writeInt32(nKeys); 390a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker for (size_t i = 0; i < nKeys; ++i) { 391a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker const KeyStatus &keyStatus = keyStatusList[i]; 392a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker writeByteArray(obj, keyStatus.keyId); 393a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker uint32_t type; 394a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker switch(keyStatus.type) { 395a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case KeyStatusType::USABLE: 396a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker type = DrmPlugin::kKeyStatusType_Usable; 397a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 398a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case KeyStatusType::EXPIRED: 399a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker type = DrmPlugin::kKeyStatusType_Expired; 400a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 401a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case KeyStatusType::OUTPUTNOTALLOWED: 402a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker type = DrmPlugin::kKeyStatusType_OutputNotAllowed; 403a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 404a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case KeyStatusType::STATUSPENDING: 405a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker type = DrmPlugin::kKeyStatusType_StatusPending; 406a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 407a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case KeyStatusType::INTERNALERROR: 408a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker default: 409a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker type = DrmPlugin::kKeyStatusType_InternalError; 410a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 411a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 412a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker obj.writeInt32(type); 413a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 414a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker obj.writeInt32(hasNewUsableKey); 415a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 416a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock lock(mNotifyLock); 417a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker listener->notify(DrmPlugin::kDrmPluginEventKeysChange, 0, &obj); 418a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 419a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return Void(); 420a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 421a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 422a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerbool DrmHal::isCryptoSchemeSupported(const uint8_t uuid[16], const String8 &mimeType) { 423a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 424a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 425abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker for (size_t i = 0; i < mFactories.size(); i++) { 426abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker if (mFactories[i]->isCryptoSchemeSupported(uuid)) { 427abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker if (mimeType != "") { 428abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker if (mFactories[i]->isContentTypeSupported(mimeType.string())) { 429abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker return true; 430abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } 431abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } else { 432abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker return true; 433abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } 434a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 435a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 436abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker return false; 437a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 438a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 43968b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wongstatus_t DrmHal::createPlugin(const uint8_t uuid[16], 44068b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong const String8& appPackageName) { 441a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 442a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 443abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker for (size_t i = 0; i < mFactories.size(); i++) { 444abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker if (mFactories[i]->isCryptoSchemeSupported(uuid)) { 445abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker mPlugin = makeDrmPlugin(mFactories[i], uuid, appPackageName); 4466d998b67be330843f633a563c23c606593060165Jeff Tinker mPluginV1_1 = drm::V1_1::IDrmPlugin::castFrom(mPlugin); 447abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } 448abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } 449a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 450a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (mPlugin == NULL) { 451a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mInitCheck = ERROR_UNSUPPORTED; 452a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } else { 453319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker if (!mPlugin->setListener(this).isOk()) { 454319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker mInitCheck = DEAD_OBJECT; 455319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker } else { 456319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker mInitCheck = OK; 457319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker } 458a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 459a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 460a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return mInitCheck; 461a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 462a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 463a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::destroyPlugin() { 464a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 4656d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 466a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 4676133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker closeOpenSessions(); 46833ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce reportMetrics(); 469a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker setListener(NULL); 470319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker mInitCheck = NO_INIT; 471319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker 47270367f525a7bf5be52115608d190d72756e972eaJeff Tinker if (mPlugin != NULL) { 473319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker if (!mPlugin->setListener(NULL).isOk()) { 474319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker mInitCheck = DEAD_OBJECT; 475319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker } 47670367f525a7bf5be52115608d190d72756e972eaJeff Tinker } 477a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mPlugin.clear(); 478a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return OK; 479a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 480a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 481a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::openSession(Vector<uint8_t> &sessionId) { 482a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 4836d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 484a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 485a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 486a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 487a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker bool retry = true; 488a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker do { 489a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker hidl_vec<uint8_t> hSessionId; 490a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 491a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->openSession( 492a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& id) { 493a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 494a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker sessionId = toVector(id); 495a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 496a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 497a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 498a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 499a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 500a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (!hResult.isOk()) { 501a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = DEAD_OBJECT; 502a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 503a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 504a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (err == ERROR_DRM_RESOURCE_BUSY && retry) { 505a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mLock.unlock(); 506a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker // reclaimSession may call back to closeSession, since mLock is 507a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker // shared between Drm instances, we should unlock here to avoid 508a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker // deadlock. 509a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker retry = DrmSessionManager::Instance()->reclaimSession(getCallingPid()); 510a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mLock.lock(); 511a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } else { 512a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker retry = false; 513a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 514a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } while (retry); 515a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 516a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (err == OK) { 517a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->addSession(getCallingPid(), 518a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mDrmSessionClient, sessionId); 5196133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker mOpenSessions.push(sessionId); 520a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 521a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return err; 522a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 523a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 524a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::closeSession(Vector<uint8_t> const &sessionId) { 525a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 5266d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 527a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 528319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker Return<Status> status = mPlugin->closeSession(toHidlVec(sessionId)); 529319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker if (status.isOk()) { 530319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker if (status == Status::OK) { 531319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker DrmSessionManager::Instance()->removeSession(sessionId); 532319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker for (size_t i = 0; i < mOpenSessions.size(); i++) { 533319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker if (mOpenSessions[i] == sessionId) { 534319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker mOpenSessions.removeAt(i); 535319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker break; 536319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker } 5376133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker } 5386133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker } 539319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker reportMetrics(); 540319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker return toStatusT(status); 541a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 542319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker return DEAD_OBJECT; 543a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 544a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 545a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::getKeyRequest(Vector<uint8_t> const &sessionId, 546a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Vector<uint8_t> const &initData, String8 const &mimeType, 547a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmPlugin::KeyType keyType, KeyedVector<String8, 548a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker String8> const &optionalParameters, Vector<uint8_t> &request, 549a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker String8 &defaultUrl, DrmPlugin::KeyRequestType *keyRequestType) { 550a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 5516d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 552a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 553a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 554a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 555a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker KeyType hKeyType; 556a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (keyType == DrmPlugin::kKeyType_Streaming) { 557a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker hKeyType = KeyType::STREAMING; 558a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } else if (keyType == DrmPlugin::kKeyType_Offline) { 559a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker hKeyType = KeyType::OFFLINE; 560a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } else if (keyType == DrmPlugin::kKeyType_Release) { 561a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker hKeyType = KeyType::RELEASE; 562a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } else { 563a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return BAD_VALUE; 564a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 565a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 566a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ::KeyedVector hOptionalParameters = toHidlKeyedVector(optionalParameters); 567a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 568a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 569a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 570a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->getKeyRequest(toHidlVec(sessionId), 571a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlVec(initData), toHidlString(mimeType), hKeyType, hOptionalParameters, 572a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& hRequest, 573a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker KeyRequestType hKeyRequestType, const hidl_string& hDefaultUrl) { 574a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 575a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 576a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker request = toVector(hRequest); 577a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker defaultUrl = toString8(hDefaultUrl); 578a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 579a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker switch (hKeyRequestType) { 580a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case KeyRequestType::INITIAL: 581a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker *keyRequestType = DrmPlugin::kKeyRequestType_Initial; 582a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 583a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case KeyRequestType::RENEWAL: 584a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker *keyRequestType = DrmPlugin::kKeyRequestType_Renewal; 585a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 586a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case KeyRequestType::RELEASE: 587a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker *keyRequestType = DrmPlugin::kKeyRequestType_Release; 588a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 589a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker default: 590a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker *keyRequestType = DrmPlugin::kKeyRequestType_Unknown; 591a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 592a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 593a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 594a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 595a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker }); 596a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 597a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 598a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 599a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 600a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::provideKeyResponse(Vector<uint8_t> const &sessionId, 601a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Vector<uint8_t> const &response, Vector<uint8_t> &keySetId) { 602a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 6036d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 604a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 605a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 606a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 607a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 608a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 609a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->provideKeyResponse(toHidlVec(sessionId), 610a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlVec(response), 611a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& hKeySetId) { 612a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 613a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker keySetId = toVector(hKeySetId); 614a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 615a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 616a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 617a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 618a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 619a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 620a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 621a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 622a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::removeKeys(Vector<uint8_t> const &keySetId) { 623a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 6246d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 625a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 626a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return toStatusT(mPlugin->removeKeys(toHidlVec(keySetId))); 627a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 628a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 629a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::restoreKeys(Vector<uint8_t> const &sessionId, 630a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Vector<uint8_t> const &keySetId) { 631a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 6326d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 633a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 634a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 635a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 636a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return toStatusT(mPlugin->restoreKeys(toHidlVec(sessionId), 637a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlVec(keySetId))); 638a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 639a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 640a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::queryKeyStatus(Vector<uint8_t> const &sessionId, 641a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker KeyedVector<String8, String8> &infoMap) const { 642a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 6436d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 644a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 645a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 646a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 647a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ::KeyedVector hInfoMap; 648a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 649a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 650a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 651a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->queryKeyStatus(toHidlVec(sessionId), 652a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<KeyValue>& map) { 653a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 654a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker infoMap = toKeyedVector(map); 655a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 656a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 657a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 658a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 659a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 660a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 661a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 662a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 663a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::getProvisionRequest(String8 const &certType, 664a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker String8 const &certAuthority, Vector<uint8_t> &request, 665a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker String8 &defaultUrl) { 666a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 6676d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 668a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 669a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 670a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 671a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->getProvisionRequest( 672a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlString(certType), toHidlString(certAuthority), 673a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& hRequest, 674a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker const hidl_string& hDefaultUrl) { 675a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 676a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker request = toVector(hRequest); 677a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker defaultUrl = toString8(hDefaultUrl); 678a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 679a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 680a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 681a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 682a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 683a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 684a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 685a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 686a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::provideProvisionResponse(Vector<uint8_t> const &response, 68768b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong Vector<uint8_t> &certificate, Vector<uint8_t> &wrappedKey) { 688a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 6896d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 690a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 691a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 692a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 693a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->provideProvisionResponse(toHidlVec(response), 694a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& hCertificate, 695a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker const hidl_vec<uint8_t>& hWrappedKey) { 696a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 697a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker certificate = toVector(hCertificate); 698a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker wrappedKey = toVector(hWrappedKey); 699a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 700a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 701a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 702a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 703a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 704a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 705a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 706a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 707abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinkerstatus_t DrmHal::getSecureStops(List<Vector<uint8_t>> &secureStops) { 708a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 7096d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 710a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 711a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 712a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 713a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->getSecureStops( 714a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<SecureStop>& hSecureStops) { 715a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 716a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker secureStops = toSecureStops(hSecureStops); 717a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 718a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 719a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 720a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 721a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 722a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 723a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 724a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 725a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 726a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::getSecureStop(Vector<uint8_t> const &ssid, Vector<uint8_t> &secureStop) { 727a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 7286d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 729a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 730a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 731a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 732a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->getSecureStop(toHidlVec(ssid), 733a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const SecureStop& hSecureStop) { 734a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 735a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker secureStop = toVector(hSecureStop.opaqueData); 736a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 737a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 738a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 739a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 740a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 741a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 742a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 743a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 744a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::releaseSecureStops(Vector<uint8_t> const &ssRelease) { 745a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 7466d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 747a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 748a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return toStatusT(mPlugin->releaseSecureStop(toHidlVec(ssRelease))); 749a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 750a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 751a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::releaseAllSecureStops() { 752a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 7536d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 754a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 7556d998b67be330843f633a563c23c606593060165Jeff Tinker return toStatusT(mPlugin->releaseAllSecureStops()); 7566d998b67be330843f633a563c23c606593060165Jeff Tinker} 7576d998b67be330843f633a563c23c606593060165Jeff Tinker 7586d998b67be330843f633a563c23c606593060165Jeff Tinkerstatus_t DrmHal::getHdcpLevels(DrmPlugin::HdcpLevel *connected, 7596d998b67be330843f633a563c23c606593060165Jeff Tinker DrmPlugin::HdcpLevel *max) const { 7606d998b67be330843f633a563c23c606593060165Jeff Tinker Mutex::Autolock autoLock(mLock); 7616d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 7626d998b67be330843f633a563c23c606593060165Jeff Tinker 7636d998b67be330843f633a563c23c606593060165Jeff Tinker if (connected == NULL || max == NULL) { 7646d998b67be330843f633a563c23c606593060165Jeff Tinker return BAD_VALUE; 765a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 7666d998b67be330843f633a563c23c606593060165Jeff Tinker status_t err = UNKNOWN_ERROR; 767a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 7686d998b67be330843f633a563c23c606593060165Jeff Tinker if (mPluginV1_1 == NULL) { 7696d998b67be330843f633a563c23c606593060165Jeff Tinker return ERROR_DRM_CANNOT_HANDLE; 7706d998b67be330843f633a563c23c606593060165Jeff Tinker } 7716d998b67be330843f633a563c23c606593060165Jeff Tinker 7726d998b67be330843f633a563c23c606593060165Jeff Tinker *connected = DrmPlugin::kHdcpLevelUnknown; 7736d998b67be330843f633a563c23c606593060165Jeff Tinker *max = DrmPlugin::kHdcpLevelUnknown; 7746d998b67be330843f633a563c23c606593060165Jeff Tinker 7756d998b67be330843f633a563c23c606593060165Jeff Tinker Return<void> hResult = mPluginV1_1->getHdcpLevels( 7766d998b67be330843f633a563c23c606593060165Jeff Tinker [&](Status status, const HdcpLevel& hConnected, const HdcpLevel& hMax) { 7776d998b67be330843f633a563c23c606593060165Jeff Tinker if (status == Status::OK) { 7786d998b67be330843f633a563c23c606593060165Jeff Tinker *connected = toHdcpLevel(hConnected); 7796d998b67be330843f633a563c23c606593060165Jeff Tinker *max = toHdcpLevel(hMax); 7806d998b67be330843f633a563c23c606593060165Jeff Tinker } 7816d998b67be330843f633a563c23c606593060165Jeff Tinker err = toStatusT(status); 7826d998b67be330843f633a563c23c606593060165Jeff Tinker } 7836d998b67be330843f633a563c23c606593060165Jeff Tinker ); 7846d998b67be330843f633a563c23c606593060165Jeff Tinker 7856d998b67be330843f633a563c23c606593060165Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 7866d998b67be330843f633a563c23c606593060165Jeff Tinker} 7876d998b67be330843f633a563c23c606593060165Jeff Tinker 7886d998b67be330843f633a563c23c606593060165Jeff Tinkerstatus_t DrmHal::getNumberOfSessions(uint32_t *open, uint32_t *max) const { 7896d998b67be330843f633a563c23c606593060165Jeff Tinker Mutex::Autolock autoLock(mLock); 7906d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 7916d998b67be330843f633a563c23c606593060165Jeff Tinker 7926d998b67be330843f633a563c23c606593060165Jeff Tinker if (open == NULL || max == NULL) { 7936d998b67be330843f633a563c23c606593060165Jeff Tinker return BAD_VALUE; 7946d998b67be330843f633a563c23c606593060165Jeff Tinker } 7956d998b67be330843f633a563c23c606593060165Jeff Tinker status_t err = UNKNOWN_ERROR; 7966d998b67be330843f633a563c23c606593060165Jeff Tinker 7976d998b67be330843f633a563c23c606593060165Jeff Tinker *open = 0; 7986d998b67be330843f633a563c23c606593060165Jeff Tinker *max = 0; 7996d998b67be330843f633a563c23c606593060165Jeff Tinker 8006d998b67be330843f633a563c23c606593060165Jeff Tinker if (mPluginV1_1 == NULL) { 8016d998b67be330843f633a563c23c606593060165Jeff Tinker return ERROR_DRM_CANNOT_HANDLE; 8026d998b67be330843f633a563c23c606593060165Jeff Tinker } 8036d998b67be330843f633a563c23c606593060165Jeff Tinker 8046d998b67be330843f633a563c23c606593060165Jeff Tinker Return<void> hResult = mPluginV1_1->getNumberOfSessions( 8056d998b67be330843f633a563c23c606593060165Jeff Tinker [&](Status status, uint32_t hOpen, uint32_t hMax) { 8066d998b67be330843f633a563c23c606593060165Jeff Tinker if (status == Status::OK) { 8076d998b67be330843f633a563c23c606593060165Jeff Tinker *open = hOpen; 8086d998b67be330843f633a563c23c606593060165Jeff Tinker *max = hMax; 8096d998b67be330843f633a563c23c606593060165Jeff Tinker } 8106d998b67be330843f633a563c23c606593060165Jeff Tinker err = toStatusT(status); 8116d998b67be330843f633a563c23c606593060165Jeff Tinker } 8126d998b67be330843f633a563c23c606593060165Jeff Tinker ); 8136d998b67be330843f633a563c23c606593060165Jeff Tinker 8146d998b67be330843f633a563c23c606593060165Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 8156d998b67be330843f633a563c23c606593060165Jeff Tinker} 8166d998b67be330843f633a563c23c606593060165Jeff Tinker 8176d998b67be330843f633a563c23c606593060165Jeff Tinkerstatus_t DrmHal::getSecurityLevel(Vector<uint8_t> const &sessionId, 8186d998b67be330843f633a563c23c606593060165Jeff Tinker DrmPlugin::SecurityLevel *level) const { 8196d998b67be330843f633a563c23c606593060165Jeff Tinker Mutex::Autolock autoLock(mLock); 8206d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 8216d998b67be330843f633a563c23c606593060165Jeff Tinker 8226d998b67be330843f633a563c23c606593060165Jeff Tinker if (level == NULL) { 8236d998b67be330843f633a563c23c606593060165Jeff Tinker return BAD_VALUE; 8246d998b67be330843f633a563c23c606593060165Jeff Tinker } 8256d998b67be330843f633a563c23c606593060165Jeff Tinker status_t err = UNKNOWN_ERROR; 8266d998b67be330843f633a563c23c606593060165Jeff Tinker 8276d998b67be330843f633a563c23c606593060165Jeff Tinker if (mPluginV1_1 == NULL) { 8286d998b67be330843f633a563c23c606593060165Jeff Tinker return ERROR_DRM_CANNOT_HANDLE; 8296d998b67be330843f633a563c23c606593060165Jeff Tinker } 8306d998b67be330843f633a563c23c606593060165Jeff Tinker 8316d998b67be330843f633a563c23c606593060165Jeff Tinker *level = DrmPlugin::kSecurityLevelUnknown; 8326d998b67be330843f633a563c23c606593060165Jeff Tinker 8336d998b67be330843f633a563c23c606593060165Jeff Tinker Return<void> hResult = mPluginV1_1->getSecurityLevel(toHidlVec(sessionId), 8346d998b67be330843f633a563c23c606593060165Jeff Tinker [&](Status status, SecurityLevel hLevel) { 8356d998b67be330843f633a563c23c606593060165Jeff Tinker if (status == Status::OK) { 8366d998b67be330843f633a563c23c606593060165Jeff Tinker *level = toSecurityLevel(hLevel); 8376d998b67be330843f633a563c23c606593060165Jeff Tinker } 8386d998b67be330843f633a563c23c606593060165Jeff Tinker err = toStatusT(status); 8396d998b67be330843f633a563c23c606593060165Jeff Tinker } 8406d998b67be330843f633a563c23c606593060165Jeff Tinker ); 8416d998b67be330843f633a563c23c606593060165Jeff Tinker 8426d998b67be330843f633a563c23c606593060165Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 8436d998b67be330843f633a563c23c606593060165Jeff Tinker} 8446d998b67be330843f633a563c23c606593060165Jeff Tinker 8456d998b67be330843f633a563c23c606593060165Jeff Tinkerstatus_t DrmHal::setSecurityLevel(Vector<uint8_t> const &sessionId, 8466d998b67be330843f633a563c23c606593060165Jeff Tinker const DrmPlugin::SecurityLevel& level) { 8476d998b67be330843f633a563c23c606593060165Jeff Tinker Mutex::Autolock autoLock(mLock); 8486d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 8496d998b67be330843f633a563c23c606593060165Jeff Tinker 8506d998b67be330843f633a563c23c606593060165Jeff Tinker if (mPluginV1_1 == NULL) { 8516d998b67be330843f633a563c23c606593060165Jeff Tinker return ERROR_DRM_CANNOT_HANDLE; 8526d998b67be330843f633a563c23c606593060165Jeff Tinker } 8536d998b67be330843f633a563c23c606593060165Jeff Tinker 8546d998b67be330843f633a563c23c606593060165Jeff Tinker SecurityLevel hSecurityLevel; 8556d998b67be330843f633a563c23c606593060165Jeff Tinker 8566d998b67be330843f633a563c23c606593060165Jeff Tinker switch(level) { 8576d998b67be330843f633a563c23c606593060165Jeff Tinker case DrmPlugin::kSecurityLevelSwSecureCrypto: 8586d998b67be330843f633a563c23c606593060165Jeff Tinker hSecurityLevel = SecurityLevel::SW_SECURE_CRYPTO; 8596d998b67be330843f633a563c23c606593060165Jeff Tinker break; 8606d998b67be330843f633a563c23c606593060165Jeff Tinker case DrmPlugin::kSecurityLevelSwSecureDecode: 8616d998b67be330843f633a563c23c606593060165Jeff Tinker hSecurityLevel = SecurityLevel::SW_SECURE_DECODE; 8626d998b67be330843f633a563c23c606593060165Jeff Tinker break; 8636d998b67be330843f633a563c23c606593060165Jeff Tinker case DrmPlugin::kSecurityLevelHwSecureCrypto: 8646d998b67be330843f633a563c23c606593060165Jeff Tinker hSecurityLevel = SecurityLevel::HW_SECURE_CRYPTO; 8656d998b67be330843f633a563c23c606593060165Jeff Tinker break; 8666d998b67be330843f633a563c23c606593060165Jeff Tinker case DrmPlugin::kSecurityLevelHwSecureDecode: 8676d998b67be330843f633a563c23c606593060165Jeff Tinker hSecurityLevel = SecurityLevel::HW_SECURE_DECODE; 8686d998b67be330843f633a563c23c606593060165Jeff Tinker break; 8696d998b67be330843f633a563c23c606593060165Jeff Tinker case DrmPlugin::kSecurityLevelHwSecureAll: 8706d998b67be330843f633a563c23c606593060165Jeff Tinker hSecurityLevel = SecurityLevel::HW_SECURE_ALL; 8716d998b67be330843f633a563c23c606593060165Jeff Tinker break; 8726d998b67be330843f633a563c23c606593060165Jeff Tinker default: 8736d998b67be330843f633a563c23c606593060165Jeff Tinker return ERROR_DRM_CANNOT_HANDLE; 8746d998b67be330843f633a563c23c606593060165Jeff Tinker } 8756d998b67be330843f633a563c23c606593060165Jeff Tinker 8766d998b67be330843f633a563c23c606593060165Jeff Tinker Status status = mPluginV1_1->setSecurityLevel(toHidlVec(sessionId), 8776d998b67be330843f633a563c23c606593060165Jeff Tinker hSecurityLevel); 8786d998b67be330843f633a563c23c606593060165Jeff Tinker return toStatusT(status); 879a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 880a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 881a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::getPropertyString(String8 const &name, String8 &value ) const { 882a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 88333ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce return getPropertyStringInternal(name, value); 88433ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce} 88533ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce 88633ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Brucestatus_t DrmHal::getPropertyStringInternal(String8 const &name, String8 &value) const { 88733ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce // This function is internal to the class and should only be called while 88833ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce // mLock is already held. 8896d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 890a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 891a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 892a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 893a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->getPropertyString(toHidlString(name), 894a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_string& hValue) { 895a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 896a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker value = toString8(hValue); 897a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 898a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 899a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 900a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 901a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 902a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 903a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 904a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 905a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::getPropertyByteArray(String8 const &name, Vector<uint8_t> &value ) const { 906a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 90733ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce return getPropertyByteArrayInternal(name, value); 90833ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce} 90933ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce 91033ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Brucestatus_t DrmHal::getPropertyByteArrayInternal(String8 const &name, Vector<uint8_t> &value ) const { 91133ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce // This function is internal to the class and should only be called while 91233ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce // mLock is already held. 9136d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 914a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 915a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 916a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 917a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->getPropertyByteArray(toHidlString(name), 918a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& hValue) { 919a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 920a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker value = toVector(hValue); 921a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 922a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 923a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 924a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 925a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 926a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 927a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 928a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 929a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::setPropertyString(String8 const &name, String8 const &value ) const { 930a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 9316d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 932a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 9336d998b67be330843f633a563c23c606593060165Jeff Tinker Status status = mPlugin->setPropertyString(toHidlString(name), 934a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlString(value)); 935a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return toStatusT(status); 936a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 937a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 938a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::setPropertyByteArray(String8 const &name, 939a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Vector<uint8_t> const &value ) const { 940a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 9416d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 942a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 943a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Status status = mPlugin->setPropertyByteArray(toHidlString(name), 944a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlVec(value)); 945a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return toStatusT(status); 946a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 947a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 948a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 949a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::setCipherAlgorithm(Vector<uint8_t> const &sessionId, 950a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker String8 const &algorithm) { 951a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 9526d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 953a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 954a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 955a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 956a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Status status = mPlugin->setCipherAlgorithm(toHidlVec(sessionId), 957a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlString(algorithm)); 958a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return toStatusT(status); 959a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 960a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 961a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::setMacAlgorithm(Vector<uint8_t> const &sessionId, 962a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker String8 const &algorithm) { 963a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 9646d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 965a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 966a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 967a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 968a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Status status = mPlugin->setMacAlgorithm(toHidlVec(sessionId), 969a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlString(algorithm)); 970a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return toStatusT(status); 971a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 972a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 973a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::encrypt(Vector<uint8_t> const &sessionId, 97468b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong Vector<uint8_t> const &keyId, Vector<uint8_t> const &input, 97568b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong Vector<uint8_t> const &iv, Vector<uint8_t> &output) { 976a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 9776d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 978a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 979a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 980a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 981a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 982a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 983a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->encrypt(toHidlVec(sessionId), 984a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlVec(keyId), toHidlVec(input), toHidlVec(iv), 985a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& hOutput) { 986a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 987a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker output = toVector(hOutput); 988a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 989a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 990a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 991a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 992a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 993a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 994a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 995a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 996a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::decrypt(Vector<uint8_t> const &sessionId, 99768b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong Vector<uint8_t> const &keyId, Vector<uint8_t> const &input, 99868b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong Vector<uint8_t> const &iv, Vector<uint8_t> &output) { 999a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 10006d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 1001a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1002a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 1003a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1004a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 1005a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1006a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->decrypt(toHidlVec(sessionId), 1007a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlVec(keyId), toHidlVec(input), toHidlVec(iv), 1008a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& hOutput) { 1009a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 1010a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker output = toVector(hOutput); 1011a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1012a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 1013a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1014a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 1015a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1016a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 1017a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 1018a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1019a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::sign(Vector<uint8_t> const &sessionId, 102068b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong Vector<uint8_t> const &keyId, Vector<uint8_t> const &message, 102168b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong Vector<uint8_t> &signature) { 1022a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 10236d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 1024a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1025a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 1026a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1027a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 1028a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1029a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->sign(toHidlVec(sessionId), 1030a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlVec(keyId), toHidlVec(message), 1031a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& hSignature) { 1032a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 1033a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker signature = toVector(hSignature); 1034a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1035a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 1036a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1037a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 1038a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1039a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 1040a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 1041a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1042a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::verify(Vector<uint8_t> const &sessionId, 104368b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong Vector<uint8_t> const &keyId, Vector<uint8_t> const &message, 104468b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong Vector<uint8_t> const &signature, bool &match) { 1045a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 10466d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 1047a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1048a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 1049a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1050a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 1051a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1052a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->verify(toHidlVec(sessionId),toHidlVec(keyId), 1053a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlVec(message), toHidlVec(signature), 1054a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, bool hMatch) { 1055a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 1056a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker match = hMatch; 1057a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } else { 1058a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker match = false; 1059a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1060a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 1061a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1062a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 1063a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1064a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 1065a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 1066a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1067a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::signRSA(Vector<uint8_t> const &sessionId, 106868b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong String8 const &algorithm, Vector<uint8_t> const &message, 106968b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong Vector<uint8_t> const &wrappedKey, Vector<uint8_t> &signature) { 1070a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 10716d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 1072a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1073a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (!checkPermission("android.permission.ACCESS_DRM_CERTIFICATES")) { 1074a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return -EPERM; 1075a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1076a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1077a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 1078a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1079a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 1080a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1081a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->signRSA(toHidlVec(sessionId), 1082a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlString(algorithm), toHidlVec(message), toHidlVec(wrappedKey), 1083a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& hSignature) { 1084a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 1085a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker signature = toVector(hSignature); 1086a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1087a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 1088a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1089a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 1090a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1091a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 1092a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 1093a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1094a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkervoid DrmHal::binderDied(const wp<IBinder> &the_late_who __unused) 1095a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker{ 1096a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 10976133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker closeOpenSessions(); 10983e2891674ef57a74e59ca5e27f89647b3f06861bJeff Tinker setListener(NULL); 1099319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker mInitCheck = NO_INIT; 1100319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker 110170367f525a7bf5be52115608d190d72756e972eaJeff Tinker if (mPlugin != NULL) { 1102319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker if (!mPlugin->setListener(NULL).isOk()) { 1103319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker mInitCheck = DEAD_OBJECT; 1104319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker } 110570367f525a7bf5be52115608d190d72756e972eaJeff Tinker } 1106a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mPlugin.clear(); 1107a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 1108a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1109a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkervoid DrmHal::writeByteArray(Parcel &obj, hidl_vec<uint8_t> const &vec) 1110a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker{ 1111a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (vec.size()) { 1112a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker obj.writeInt32(vec.size()); 1113a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker obj.write(vec.data(), vec.size()); 1114a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } else { 1115a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker obj.writeInt32(0); 1116a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1117a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 1118a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 111933ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Brucevoid DrmHal::reportMetrics() const 112033ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce{ 112133ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce Vector<uint8_t> metrics; 112233ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce String8 vendor; 112333ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce String8 description; 112433ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce if (getPropertyStringInternal(String8("vendor"), vendor) == OK && 112533ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce getPropertyStringInternal(String8("description"), description) == OK && 112633ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce getPropertyByteArrayInternal(String8("metrics"), metrics) == OK) { 112733ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce status_t res = android::reportDrmPluginMetrics( 112833ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce metrics, vendor, description); 112933ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce if (res != OK) { 113033ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce ALOGE("Metrics were retrieved but could not be reported: %i", res); 113133ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce } 113233ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce } 113333ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce} 113433ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce 1135a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} // namespace android 1136