DrmHal.cpp revision 593111f4460f2b2e8f541e936670e3577d45fff6
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> 33a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#include <media/drm/DrmAPI.h> 34a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#include <media/stagefright/foundation/ADebug.h> 35a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#include <media/stagefright/foundation/AString.h> 36a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#include <media/stagefright/foundation/hexdump.h> 37a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#include <media/stagefright/MediaErrors.h> 38a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 39a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerusing ::android::hardware::drm::V1_0::EventType; 40a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerusing ::android::hardware::drm::V1_0::IDrmFactory; 41a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerusing ::android::hardware::drm::V1_0::IDrmPlugin; 42a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerusing ::android::hardware::drm::V1_0::KeyedVector; 43a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerusing ::android::hardware::drm::V1_0::KeyRequestType; 44a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerusing ::android::hardware::drm::V1_0::KeyStatus; 45a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerusing ::android::hardware::drm::V1_0::KeyStatusType; 46a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerusing ::android::hardware::drm::V1_0::KeyType; 47a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerusing ::android::hardware::drm::V1_0::KeyValue; 48a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerusing ::android::hardware::drm::V1_0::SecureStop; 49a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerusing ::android::hardware::drm::V1_0::Status; 50a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerusing ::android::hardware::hidl_array; 51a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerusing ::android::hardware::hidl_string; 52a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerusing ::android::hardware::hidl_vec; 53a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerusing ::android::hardware::Return; 54a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerusing ::android::hardware::Void; 55abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinkerusing ::android::hidl::manager::V1_0::IServiceManager; 56a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerusing ::android::sp; 57a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 58a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkernamespace android { 59a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 60a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic inline int getCallingPid() { 61a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return IPCThreadState::self()->getCallingPid(); 62a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 63a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 64a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic bool checkPermission(const char* permissionString) { 65a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (getpid() == IPCThreadState::self()->getCallingPid()) return true; 66a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker bool ok = checkCallingPermission(String16(permissionString)); 67a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (!ok) ALOGE("Request requires %s", permissionString); 68a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return ok; 69a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 70a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 71a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic const Vector<uint8_t> toVector(const hidl_vec<uint8_t> &vec) { 72a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Vector<uint8_t> vector; 73a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker vector.appendArray(vec.data(), vec.size()); 74a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return *const_cast<const Vector<uint8_t> *>(&vector); 75a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 76a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 77a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic hidl_vec<uint8_t> toHidlVec(const Vector<uint8_t> &vector) { 78a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker hidl_vec<uint8_t> vec; 79a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker vec.setToExternal(const_cast<uint8_t *>(vector.array()), vector.size()); 80a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return vec; 81a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 82a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 83a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic String8 toString8(const hidl_string &string) { 84a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return String8(string.c_str()); 85a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 86a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 87a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic hidl_string toHidlString(const String8& string) { 88a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hidl_string(string.string()); 89a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 90a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 91a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 92a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic ::KeyedVector toHidlKeyedVector(const KeyedVector<String8, String8>& 93a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker keyedVector) { 94a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker std::vector<KeyValue> stdKeyedVector; 95a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker for (size_t i = 0; i < keyedVector.size(); i++) { 96a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker KeyValue keyValue; 97a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker keyValue.key = toHidlString(keyedVector.keyAt(i)); 98a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker keyValue.value = toHidlString(keyedVector.valueAt(i)); 99a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker stdKeyedVector.push_back(keyValue); 100a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 101a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return ::KeyedVector(stdKeyedVector); 102a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 103a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 104a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic KeyedVector<String8, String8> toKeyedVector(const ::KeyedVector& 105a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker hKeyedVector) { 106a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker KeyedVector<String8, String8> keyedVector; 107a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker for (size_t i = 0; i < hKeyedVector.size(); i++) { 108a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker keyedVector.add(toString8(hKeyedVector[i].key), 109a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toString8(hKeyedVector[i].value)); 110a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 111a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return keyedVector; 112a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 113a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 114abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinkerstatic List<Vector<uint8_t>> toSecureStops(const hidl_vec<SecureStop>& 115a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker hSecureStops) { 116abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker List<Vector<uint8_t>> secureStops; 117a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker for (size_t i = 0; i < hSecureStops.size(); i++) { 118a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker secureStops.push_back(toVector(hSecureStops[i].opaqueData)); 119a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 120a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return secureStops; 121a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 122a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 123a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic status_t toStatusT(Status status) { 124a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker switch (status) { 125a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case Status::OK: 126a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return OK; 127a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 128a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case Status::ERROR_DRM_NO_LICENSE: 129a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return ERROR_DRM_NO_LICENSE; 130a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 131a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case Status::ERROR_DRM_LICENSE_EXPIRED: 132a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return ERROR_DRM_LICENSE_EXPIRED; 133a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 134a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case Status::ERROR_DRM_SESSION_NOT_OPENED: 135a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return ERROR_DRM_SESSION_NOT_OPENED; 136a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 137a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case Status::ERROR_DRM_CANNOT_HANDLE: 138a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return ERROR_DRM_CANNOT_HANDLE; 139a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 140a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case Status::ERROR_DRM_INVALID_STATE: 141a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return ERROR_DRM_TAMPER_DETECTED; 142a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 143a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case Status::BAD_VALUE: 144a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return BAD_VALUE; 145a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 146a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case Status::ERROR_DRM_NOT_PROVISIONED: 147a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return ERROR_DRM_NOT_PROVISIONED; 148a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 149a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case Status::ERROR_DRM_RESOURCE_BUSY: 150a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return ERROR_DRM_RESOURCE_BUSY; 151a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 152a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case Status::ERROR_DRM_DEVICE_REVOKED: 153a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return ERROR_DRM_DEVICE_REVOKED; 154a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 155a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case Status::ERROR_DRM_UNKNOWN: 156a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker default: 157a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return ERROR_DRM_UNKNOWN; 158a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 159a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 160a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 161a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 162a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 163a53d6553fce1818bdf87833f93633c93ad1b5915Jeff TinkerMutex DrmHal::mLock; 164a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 165a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstruct DrmSessionClient : public DrmSessionClientInterface { 166a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker explicit DrmSessionClient(DrmHal* drm) : mDrm(drm) {} 167a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 168a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker virtual bool reclaimSession(const Vector<uint8_t>& sessionId) { 169a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker sp<DrmHal> drm = mDrm.promote(); 170a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (drm == NULL) { 171a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return true; 172a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 173a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = drm->closeSession(sessionId); 174a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (err != OK) { 175a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return false; 176a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 177a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker drm->sendEvent(EventType::SESSION_RECLAIMED, 178a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlVec(sessionId), hidl_vec<uint8_t>()); 179a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return true; 180a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 181a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 182a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerprotected: 183a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker virtual ~DrmSessionClient() {} 184a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 185a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerprivate: 186a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker wp<DrmHal> mDrm; 187a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 188a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DISALLOW_EVIL_CONSTRUCTORS(DrmSessionClient); 189a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}; 190a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 191a53d6553fce1818bdf87833f93633c93ad1b5915Jeff TinkerDrmHal::DrmHal() 192a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker : mDrmSessionClient(new DrmSessionClient(this)), 193abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker mFactories(makeDrmFactories()), 194abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker mInitCheck((mFactories.size() == 0) ? ERROR_UNSUPPORTED : NO_INIT) { 195a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 196a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 197a53d6553fce1818bdf87833f93633c93ad1b5915Jeff TinkerDrmHal::~DrmHal() { 198a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->removeDrm(mDrmSessionClient); 199a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 200a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 201abeb36a8c2f044772297536e70340c3b245863e4Jeff TinkerVector<sp<IDrmFactory>> DrmHal::makeDrmFactories() { 202abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker Vector<sp<IDrmFactory>> factories; 203c82b9c335e69b617817dace0ef64ad3df3f5080fJeff Tinker 204593111f4460f2b2e8f541e936670e3577d45fff6Jeff Tinker auto manager = hardware::defaultServiceManager(); 205c82b9c335e69b617817dace0ef64ad3df3f5080fJeff Tinker 206abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker if (manager != NULL) { 207abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker manager->listByInterface(IDrmFactory::descriptor, 208abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker [&factories](const hidl_vec<hidl_string> ®istered) { 209abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker for (const auto &instance : registered) { 210abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker auto factory = IDrmFactory::getService(instance); 211abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker if (factory != NULL) { 212abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker factories.push_back(factory); 213abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker ALOGI("makeDrmFactories: factory instance %s is %s", 214abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker instance.c_str(), 215abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker factory->isRemote() ? "Remote" : "Not Remote"); 216abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } 217abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } 218abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } 219abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker ); 220abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } 221a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 222abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker if (factories.size() == 0) { 223abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker // must be in passthrough mode, load the default passthrough service 224e309b22bff1719f1fea84b247e4b2bc4c5f09eb5Jeff Tinker auto passthrough = IDrmFactory::getService(); 225abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker if (passthrough != NULL) { 226abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker ALOGI("makeDrmFactories: using default drm instance"); 227abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker factories.push_back(passthrough); 228abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } else { 229abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker ALOGE("Failed to find any drm factories"); 230abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } 231a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 232abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker return factories; 233abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker} 234abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker 235abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinkersp<IDrmPlugin> DrmHal::makeDrmPlugin(const sp<IDrmFactory>& factory, 236abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker const uint8_t uuid[16], const String8& appPackageName) { 237a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 238a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker sp<IDrmPlugin> plugin; 239abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker Return<void> hResult = factory->createPlugin(uuid, appPackageName.string(), 240a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const sp<IDrmPlugin>& hPlugin) { 241abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker if (status != Status::OK) { 242abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker ALOGE("Failed to make drm plugin"); 243abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker return; 244abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } 245abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker plugin = hPlugin; 246abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } 247abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker ); 248a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return plugin; 249a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 250a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 251a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::initCheck() const { 252a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return mInitCheck; 253a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 254a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 255a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::setListener(const sp<IDrmClient>& listener) 256a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker{ 257a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock lock(mEventLock); 258a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (mListener != NULL){ 259a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker IInterface::asBinder(mListener)->unlinkToDeath(this); 260a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 261a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (listener != NULL) { 262a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker IInterface::asBinder(listener)->linkToDeath(this); 263a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 264a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mListener = listener; 265a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return NO_ERROR; 266a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 267a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 268a53d6553fce1818bdf87833f93633c93ad1b5915Jeff TinkerReturn<void> DrmHal::sendEvent(EventType hEventType, 269a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker const hidl_vec<uint8_t>& sessionId, const hidl_vec<uint8_t>& data) { 270a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 271a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mEventLock.lock(); 272a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker sp<IDrmClient> listener = mListener; 273a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mEventLock.unlock(); 274a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 275a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (listener != NULL) { 276a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Parcel obj; 277a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker writeByteArray(obj, sessionId); 278a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker writeByteArray(obj, data); 279a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 280a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock lock(mNotifyLock); 281a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmPlugin::EventType eventType; 282a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker switch(hEventType) { 283a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case EventType::PROVISION_REQUIRED: 284a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker eventType = DrmPlugin::kDrmPluginEventProvisionRequired; 285a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 286a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case EventType::KEY_NEEDED: 287a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker eventType = DrmPlugin::kDrmPluginEventKeyNeeded; 288a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 289a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case EventType::KEY_EXPIRED: 290a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker eventType = DrmPlugin::kDrmPluginEventKeyExpired; 291a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 292a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case EventType::VENDOR_DEFINED: 293a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker eventType = DrmPlugin::kDrmPluginEventVendorDefined; 294a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 295b86f4b3ce066eadbfe9c2f420b16aaf2de741edbRahul Frias case EventType::SESSION_RECLAIMED: 296b86f4b3ce066eadbfe9c2f420b16aaf2de741edbRahul Frias eventType = DrmPlugin::kDrmPluginEventSessionReclaimed; 297b86f4b3ce066eadbfe9c2f420b16aaf2de741edbRahul Frias break; 298a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker default: 299a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return Void(); 300a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 301a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker listener->notify(eventType, 0, &obj); 302a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 303a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return Void(); 304a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 305a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 306a53d6553fce1818bdf87833f93633c93ad1b5915Jeff TinkerReturn<void> DrmHal::sendExpirationUpdate(const hidl_vec<uint8_t>& sessionId, 307a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker int64_t expiryTimeInMS) { 308a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 309a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mEventLock.lock(); 310a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker sp<IDrmClient> listener = mListener; 311a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mEventLock.unlock(); 312a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 313a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (listener != NULL) { 314a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Parcel obj; 315a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker writeByteArray(obj, sessionId); 316a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker obj.writeInt64(expiryTimeInMS); 317a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 318a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock lock(mNotifyLock); 319a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker listener->notify(DrmPlugin::kDrmPluginEventExpirationUpdate, 0, &obj); 320a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 321a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return Void(); 322a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 323a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 324a53d6553fce1818bdf87833f93633c93ad1b5915Jeff TinkerReturn<void> DrmHal::sendKeysChange(const hidl_vec<uint8_t>& sessionId, 325a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker const hidl_vec<KeyStatus>& keyStatusList, bool hasNewUsableKey) { 326a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 327a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mEventLock.lock(); 328a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker sp<IDrmClient> listener = mListener; 329a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mEventLock.unlock(); 330a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 331a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (listener != NULL) { 332a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Parcel obj; 333a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker writeByteArray(obj, sessionId); 334a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 335a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker size_t nKeys = keyStatusList.size(); 336a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker obj.writeInt32(nKeys); 337a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker for (size_t i = 0; i < nKeys; ++i) { 338a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker const KeyStatus &keyStatus = keyStatusList[i]; 339a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker writeByteArray(obj, keyStatus.keyId); 340a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker uint32_t type; 341a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker switch(keyStatus.type) { 342a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case KeyStatusType::USABLE: 343a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker type = DrmPlugin::kKeyStatusType_Usable; 344a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 345a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case KeyStatusType::EXPIRED: 346a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker type = DrmPlugin::kKeyStatusType_Expired; 347a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 348a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case KeyStatusType::OUTPUTNOTALLOWED: 349a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker type = DrmPlugin::kKeyStatusType_OutputNotAllowed; 350a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 351a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case KeyStatusType::STATUSPENDING: 352a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker type = DrmPlugin::kKeyStatusType_StatusPending; 353a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 354a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case KeyStatusType::INTERNALERROR: 355a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker default: 356a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker type = DrmPlugin::kKeyStatusType_InternalError; 357a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 358a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 359a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker obj.writeInt32(type); 360a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 361a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker obj.writeInt32(hasNewUsableKey); 362a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 363a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock lock(mNotifyLock); 364a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker listener->notify(DrmPlugin::kDrmPluginEventKeysChange, 0, &obj); 365a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 366a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return Void(); 367a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 368a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 369a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerbool DrmHal::isCryptoSchemeSupported(const uint8_t uuid[16], const String8 &mimeType) { 370a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 371a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 372abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker for (size_t i = 0; i < mFactories.size(); i++) { 373abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker if (mFactories[i]->isCryptoSchemeSupported(uuid)) { 374abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker if (mimeType != "") { 375abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker if (mFactories[i]->isContentTypeSupported(mimeType.string())) { 376abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker return true; 377abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } 378abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } else { 379abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker return true; 380abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } 381a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 382a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 383abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker return false; 384a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 385a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 38668b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wongstatus_t DrmHal::createPlugin(const uint8_t uuid[16], 38768b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong const String8& appPackageName) { 388a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 389a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 390abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker for (size_t i = 0; i < mFactories.size(); i++) { 391abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker if (mFactories[i]->isCryptoSchemeSupported(uuid)) { 392abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker mPlugin = makeDrmPlugin(mFactories[i], uuid, appPackageName); 393abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } 394abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } 395a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 396a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (mPlugin == NULL) { 397a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mInitCheck = ERROR_UNSUPPORTED; 398a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } else { 399a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mInitCheck = OK; 400a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mPlugin->setListener(this); 401a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 402a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 403a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return mInitCheck; 404a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 405a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 406a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::destroyPlugin() { 407a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 408a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 409a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (mInitCheck != OK) { 410a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return mInitCheck; 411a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 412a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 413a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker setListener(NULL); 414f53d96676da2d672d03e35fa0894cb299ac9e318Jeff Tinker mPlugin->setListener(NULL); 415a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mPlugin.clear(); 416a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 417a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return OK; 418a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 419a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 420a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::openSession(Vector<uint8_t> &sessionId) { 421a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 422a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 423a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (mInitCheck != OK) { 424a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return mInitCheck; 425a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 426a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 427a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 428a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 429a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker bool retry = true; 430a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker do { 431a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker hidl_vec<uint8_t> hSessionId; 432a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 433a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->openSession( 434a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& id) { 435a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 436a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker sessionId = toVector(id); 437a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 438a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 439a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 440a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 441a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 442a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (!hResult.isOk()) { 443a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = DEAD_OBJECT; 444a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 445a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 446a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (err == ERROR_DRM_RESOURCE_BUSY && retry) { 447a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mLock.unlock(); 448a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker // reclaimSession may call back to closeSession, since mLock is 449a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker // shared between Drm instances, we should unlock here to avoid 450a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker // deadlock. 451a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker retry = DrmSessionManager::Instance()->reclaimSession(getCallingPid()); 452a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mLock.lock(); 453a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } else { 454a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker retry = false; 455a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 456a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } while (retry); 457a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 458a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (err == OK) { 459a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->addSession(getCallingPid(), 460a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mDrmSessionClient, sessionId); 461a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 462a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return err; 463a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 464a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 465a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::closeSession(Vector<uint8_t> const &sessionId) { 466a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 467a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 468a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (mInitCheck != OK) { 469a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return mInitCheck; 470a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 471a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 472a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Status status = mPlugin->closeSession(toHidlVec(sessionId)); 473a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 474a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->removeSession(sessionId); 475a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 476a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return toStatusT(status); 477a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 478a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 479a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::getKeyRequest(Vector<uint8_t> const &sessionId, 480a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Vector<uint8_t> const &initData, String8 const &mimeType, 481a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmPlugin::KeyType keyType, KeyedVector<String8, 482a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker String8> const &optionalParameters, Vector<uint8_t> &request, 483a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker String8 &defaultUrl, DrmPlugin::KeyRequestType *keyRequestType) { 484a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 485a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 486a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (mInitCheck != OK) { 487a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return mInitCheck; 488a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 489a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 490a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 491a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 492a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker KeyType hKeyType; 493a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (keyType == DrmPlugin::kKeyType_Streaming) { 494a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker hKeyType = KeyType::STREAMING; 495a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } else if (keyType == DrmPlugin::kKeyType_Offline) { 496a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker hKeyType = KeyType::OFFLINE; 497a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } else if (keyType == DrmPlugin::kKeyType_Release) { 498a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker hKeyType = KeyType::RELEASE; 499a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } else { 500a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return BAD_VALUE; 501a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 502a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 503a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ::KeyedVector hOptionalParameters = toHidlKeyedVector(optionalParameters); 504a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 505a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 506a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 507a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->getKeyRequest(toHidlVec(sessionId), 508a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlVec(initData), toHidlString(mimeType), hKeyType, hOptionalParameters, 509a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& hRequest, 510a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker KeyRequestType hKeyRequestType, const hidl_string& hDefaultUrl) { 511a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 512a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 513a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker request = toVector(hRequest); 514a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker defaultUrl = toString8(hDefaultUrl); 515a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 516a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker switch (hKeyRequestType) { 517a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case KeyRequestType::INITIAL: 518a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker *keyRequestType = DrmPlugin::kKeyRequestType_Initial; 519a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 520a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case KeyRequestType::RENEWAL: 521a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker *keyRequestType = DrmPlugin::kKeyRequestType_Renewal; 522a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 523a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case KeyRequestType::RELEASE: 524a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker *keyRequestType = DrmPlugin::kKeyRequestType_Release; 525a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 526a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker default: 527a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker *keyRequestType = DrmPlugin::kKeyRequestType_Unknown; 528a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 529a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 530a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 531a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 532a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker }); 533a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 534a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 535a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 536a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 537a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::provideKeyResponse(Vector<uint8_t> const &sessionId, 538a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Vector<uint8_t> const &response, Vector<uint8_t> &keySetId) { 539a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 540a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 541a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (mInitCheck != OK) { 542a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return mInitCheck; 543a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 544a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 545a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 546a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 547a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 548a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 549a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->provideKeyResponse(toHidlVec(sessionId), 550a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlVec(response), 551a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& hKeySetId) { 552a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 553a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker keySetId = toVector(hKeySetId); 554a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 555a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 556a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 557a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 558a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 559a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 560a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 561a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 562a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::removeKeys(Vector<uint8_t> const &keySetId) { 563a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 564a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 565a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (mInitCheck != OK) { 566a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return mInitCheck; 567a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 568a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 569a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return toStatusT(mPlugin->removeKeys(toHidlVec(keySetId))); 570a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 571a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 572a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::restoreKeys(Vector<uint8_t> const &sessionId, 573a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Vector<uint8_t> const &keySetId) { 574a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 575a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 576a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (mInitCheck != OK) { 577a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return mInitCheck; 578a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 579a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 580a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 581a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 582a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return toStatusT(mPlugin->restoreKeys(toHidlVec(sessionId), 583a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlVec(keySetId))); 584a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 585a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 586a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::queryKeyStatus(Vector<uint8_t> const &sessionId, 587a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker KeyedVector<String8, String8> &infoMap) const { 588a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 589a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 590a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (mInitCheck != OK) { 591a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return mInitCheck; 592a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 593a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 594a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 595a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 596a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ::KeyedVector hInfoMap; 597a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 598a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 599a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 600a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->queryKeyStatus(toHidlVec(sessionId), 601a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<KeyValue>& map) { 602a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 603a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker infoMap = toKeyedVector(map); 604a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 605a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 606a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 607a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 608a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 609a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 610a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 611a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 612a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::getProvisionRequest(String8 const &certType, 613a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker String8 const &certAuthority, Vector<uint8_t> &request, 614a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker String8 &defaultUrl) { 615a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 616a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 617a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (mInitCheck != OK) { 618a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return mInitCheck; 619a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 620a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 621a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 622a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 623a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->getProvisionRequest( 624a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlString(certType), toHidlString(certAuthority), 625a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& hRequest, 626a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker const hidl_string& hDefaultUrl) { 627a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 628a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker request = toVector(hRequest); 629a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker defaultUrl = toString8(hDefaultUrl); 630a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 631a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 632a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 633a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 634a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 635a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 636a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 637a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 638a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::provideProvisionResponse(Vector<uint8_t> const &response, 63968b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong Vector<uint8_t> &certificate, Vector<uint8_t> &wrappedKey) { 640a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 641a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 642a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (mInitCheck != OK) { 643a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return mInitCheck; 644a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 645a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 646a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 647a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 648a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->provideProvisionResponse(toHidlVec(response), 649a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& hCertificate, 650a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker const hidl_vec<uint8_t>& hWrappedKey) { 651a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 652a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker certificate = toVector(hCertificate); 653a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker wrappedKey = toVector(hWrappedKey); 654a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 655a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 656a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 657a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 658a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 659a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 660a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 661a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 662abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinkerstatus_t DrmHal::getSecureStops(List<Vector<uint8_t>> &secureStops) { 663a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 664a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 665a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (mInitCheck != OK) { 666a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return mInitCheck; 667a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 668a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 669a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 670a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 671a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->getSecureStops( 672a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<SecureStop>& hSecureStops) { 673a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 674a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker secureStops = toSecureStops(hSecureStops); 675a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 676a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 677a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 678a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 679a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 680a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 681a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 682a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 683a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 684a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::getSecureStop(Vector<uint8_t> const &ssid, Vector<uint8_t> &secureStop) { 685a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 686a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 687a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (mInitCheck != OK) { 688a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return mInitCheck; 689a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 690a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 691a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 692a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 693a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->getSecureStop(toHidlVec(ssid), 694a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const SecureStop& hSecureStop) { 695a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 696a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker secureStop = toVector(hSecureStop.opaqueData); 697a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 698a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 699a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 700a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 701a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 702a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 703a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 704a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 705a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::releaseSecureStops(Vector<uint8_t> const &ssRelease) { 706a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 707a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 708a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (mInitCheck != OK) { 709a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return mInitCheck; 710a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 711a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 712a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return toStatusT(mPlugin->releaseSecureStop(toHidlVec(ssRelease))); 713a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 714a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 715a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::releaseAllSecureStops() { 716a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 717a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 718a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (mInitCheck != OK) { 719a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return mInitCheck; 720a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 721a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 722a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return toStatusT(mPlugin->releaseAllSecureStops()); 723a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 724a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 725a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::getPropertyString(String8 const &name, String8 &value ) const { 726a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 727a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 728a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (mInitCheck != OK) { 729a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return mInitCheck; 730a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 731a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 732a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 733a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 734a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->getPropertyString(toHidlString(name), 735a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_string& hValue) { 736a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 737a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker value = toString8(hValue); 738a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 739a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 740a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 741a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 742a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 743a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 744a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 745a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 746a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::getPropertyByteArray(String8 const &name, Vector<uint8_t> &value ) const { 747a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 748a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 749a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (mInitCheck != OK) { 750a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return mInitCheck; 751a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 752a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 753a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 754a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 755a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->getPropertyByteArray(toHidlString(name), 756a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& hValue) { 757a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 758a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker value = toVector(hValue); 759a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 760a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 761a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 762a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 763a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 764a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 765a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 766a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 767a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::setPropertyString(String8 const &name, String8 const &value ) const { 768a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 769a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 770a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (mInitCheck != OK) { 771a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return mInitCheck; 772a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 773a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 774a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Status status = mPlugin->setPropertyString(toHidlString(name), 775a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlString(value)); 776a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return toStatusT(status); 777a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 778a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 779a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::setPropertyByteArray(String8 const &name, 780a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Vector<uint8_t> const &value ) const { 781a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 782a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 783a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (mInitCheck != OK) { 784a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return mInitCheck; 785a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 786a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 787a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Status status = mPlugin->setPropertyByteArray(toHidlString(name), 788a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlVec(value)); 789a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return toStatusT(status); 790a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 791a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 792a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 793a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::setCipherAlgorithm(Vector<uint8_t> const &sessionId, 794a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker String8 const &algorithm) { 795a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 796a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 797a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (mInitCheck != OK) { 798a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return mInitCheck; 799a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 800a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 801a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 802a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 803a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Status status = mPlugin->setCipherAlgorithm(toHidlVec(sessionId), 804a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlString(algorithm)); 805a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return toStatusT(status); 806a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 807a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 808a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::setMacAlgorithm(Vector<uint8_t> const &sessionId, 809a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker String8 const &algorithm) { 810a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 811a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 812a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (mInitCheck != OK) { 813a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return mInitCheck; 814a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 815a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 816a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 817a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 818a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Status status = mPlugin->setMacAlgorithm(toHidlVec(sessionId), 819a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlString(algorithm)); 820a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return toStatusT(status); 821a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 822a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 823a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::encrypt(Vector<uint8_t> const &sessionId, 82468b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong Vector<uint8_t> const &keyId, Vector<uint8_t> const &input, 82568b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong Vector<uint8_t> const &iv, Vector<uint8_t> &output) { 826a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 827a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 828a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (mInitCheck != OK) { 829a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return mInitCheck; 830a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 831a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 832a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 833a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 834a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 835a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 836a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->encrypt(toHidlVec(sessionId), 837a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlVec(keyId), toHidlVec(input), toHidlVec(iv), 838a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& hOutput) { 839a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 840a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker output = toVector(hOutput); 841a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 842a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 843a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 844a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 845a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 846a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 847a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 848a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 849a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::decrypt(Vector<uint8_t> const &sessionId, 85068b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong Vector<uint8_t> const &keyId, Vector<uint8_t> const &input, 85168b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong Vector<uint8_t> const &iv, Vector<uint8_t> &output) { 852a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 853a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 854a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (mInitCheck != OK) { 855a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return mInitCheck; 856a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 857a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 858a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 859a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 860a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 861a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 862a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->decrypt(toHidlVec(sessionId), 863a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlVec(keyId), toHidlVec(input), toHidlVec(iv), 864a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& hOutput) { 865a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 866a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker output = toVector(hOutput); 867a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 868a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 869a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 870a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 871a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 872a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 873a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 874a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 875a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::sign(Vector<uint8_t> const &sessionId, 87668b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong Vector<uint8_t> const &keyId, Vector<uint8_t> const &message, 87768b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong Vector<uint8_t> &signature) { 878a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 879a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 880a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (mInitCheck != OK) { 881a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return mInitCheck; 882a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 883a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 884a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 885a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 886a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 887a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 888a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->sign(toHidlVec(sessionId), 889a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlVec(keyId), toHidlVec(message), 890a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& hSignature) { 891a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 892a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker signature = toVector(hSignature); 893a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 894a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 895a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 896a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 897a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 898a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 899a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 900a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 901a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::verify(Vector<uint8_t> const &sessionId, 90268b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong Vector<uint8_t> const &keyId, Vector<uint8_t> const &message, 90368b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong Vector<uint8_t> const &signature, bool &match) { 904a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 905a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 906a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (mInitCheck != OK) { 907a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return mInitCheck; 908a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 909a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 910a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 911a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 912a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 913a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 914a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->verify(toHidlVec(sessionId),toHidlVec(keyId), 915a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlVec(message), toHidlVec(signature), 916a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, bool hMatch) { 917a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 918a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker match = hMatch; 919a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } else { 920a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker match = false; 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::signRSA(Vector<uint8_t> const &sessionId, 93068b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong String8 const &algorithm, Vector<uint8_t> const &message, 93168b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong Vector<uint8_t> const &wrappedKey, Vector<uint8_t> &signature) { 932a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 933a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 934a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (mInitCheck != OK) { 935a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return mInitCheck; 936a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 937a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 938a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (!checkPermission("android.permission.ACCESS_DRM_CERTIFICATES")) { 939a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return -EPERM; 940a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 941a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 942a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 943a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 944a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 945a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 946a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->signRSA(toHidlVec(sessionId), 947a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlString(algorithm), toHidlVec(message), toHidlVec(wrappedKey), 948a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& hSignature) { 949a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 950a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker signature = toVector(hSignature); 951a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 952a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 953a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 954a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 955a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 956a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 957a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 958a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 959a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkervoid DrmHal::binderDied(const wp<IBinder> &the_late_who __unused) 960a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker{ 961a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mEventLock.lock(); 962a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mListener.clear(); 963a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mEventLock.unlock(); 964a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 965a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 966a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mPlugin.clear(); 967a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 968a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 969a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkervoid DrmHal::writeByteArray(Parcel &obj, hidl_vec<uint8_t> const &vec) 970a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker{ 971a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (vec.size()) { 972a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker obj.writeInt32(vec.size()); 973a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker obj.write(vec.data(), vec.size()); 974a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } else { 975a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker obj.writeInt32(0); 976a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 977a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 978a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 979a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} // namespace android 980