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); 41470367f525a7bf5be52115608d190d72756e972eaJeff Tinker if (mPlugin != NULL) { 41570367f525a7bf5be52115608d190d72756e972eaJeff Tinker mPlugin->setListener(NULL); 41670367f525a7bf5be52115608d190d72756e972eaJeff Tinker } 417a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mPlugin.clear(); 41870367f525a7bf5be52115608d190d72756e972eaJeff Tinker mInitCheck = NO_INIT; 419a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 420a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return OK; 421a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 422a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 423a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::openSession(Vector<uint8_t> &sessionId) { 424a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 425a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 426a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (mInitCheck != OK) { 427a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return mInitCheck; 428a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 429a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 430a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 431a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 432a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker bool retry = true; 433a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker do { 434a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker hidl_vec<uint8_t> hSessionId; 435a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 436a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->openSession( 437a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& id) { 438a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 439a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker sessionId = toVector(id); 440a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 441a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 442a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 443a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 444a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 445a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (!hResult.isOk()) { 446a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = DEAD_OBJECT; 447a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 448a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 449a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (err == ERROR_DRM_RESOURCE_BUSY && retry) { 450a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mLock.unlock(); 451a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker // reclaimSession may call back to closeSession, since mLock is 452a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker // shared between Drm instances, we should unlock here to avoid 453a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker // deadlock. 454a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker retry = DrmSessionManager::Instance()->reclaimSession(getCallingPid()); 455a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mLock.lock(); 456a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } else { 457a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker retry = false; 458a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 459a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } while (retry); 460a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 461a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (err == OK) { 462a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->addSession(getCallingPid(), 463a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mDrmSessionClient, sessionId); 464a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 465a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return err; 466a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 467a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 468a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::closeSession(Vector<uint8_t> const &sessionId) { 469a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 470a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 471a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (mInitCheck != OK) { 472a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return mInitCheck; 473a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 474a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 475a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Status status = mPlugin->closeSession(toHidlVec(sessionId)); 476a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 477a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->removeSession(sessionId); 478a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 479a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return toStatusT(status); 480a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 481a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 482a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::getKeyRequest(Vector<uint8_t> const &sessionId, 483a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Vector<uint8_t> const &initData, String8 const &mimeType, 484a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmPlugin::KeyType keyType, KeyedVector<String8, 485a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker String8> const &optionalParameters, Vector<uint8_t> &request, 486a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker String8 &defaultUrl, DrmPlugin::KeyRequestType *keyRequestType) { 487a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 488a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 489a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (mInitCheck != OK) { 490a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return mInitCheck; 491a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 492a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 493a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 494a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 495a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker KeyType hKeyType; 496a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (keyType == DrmPlugin::kKeyType_Streaming) { 497a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker hKeyType = KeyType::STREAMING; 498a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } else if (keyType == DrmPlugin::kKeyType_Offline) { 499a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker hKeyType = KeyType::OFFLINE; 500a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } else if (keyType == DrmPlugin::kKeyType_Release) { 501a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker hKeyType = KeyType::RELEASE; 502a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } else { 503a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return BAD_VALUE; 504a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 505a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 506a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ::KeyedVector hOptionalParameters = toHidlKeyedVector(optionalParameters); 507a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 508a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 509a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 510a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->getKeyRequest(toHidlVec(sessionId), 511a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlVec(initData), toHidlString(mimeType), hKeyType, hOptionalParameters, 512a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& hRequest, 513a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker KeyRequestType hKeyRequestType, const hidl_string& hDefaultUrl) { 514a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 515a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 516a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker request = toVector(hRequest); 517a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker defaultUrl = toString8(hDefaultUrl); 518a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 519a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker switch (hKeyRequestType) { 520a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case KeyRequestType::INITIAL: 521a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker *keyRequestType = DrmPlugin::kKeyRequestType_Initial; 522a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 523a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case KeyRequestType::RENEWAL: 524a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker *keyRequestType = DrmPlugin::kKeyRequestType_Renewal; 525a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 526a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case KeyRequestType::RELEASE: 527a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker *keyRequestType = DrmPlugin::kKeyRequestType_Release; 528a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 529a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker default: 530a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker *keyRequestType = DrmPlugin::kKeyRequestType_Unknown; 531a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 532a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 533a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 534a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 535a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker }); 536a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 537a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 538a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 539a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 540a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::provideKeyResponse(Vector<uint8_t> const &sessionId, 541a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Vector<uint8_t> const &response, Vector<uint8_t> &keySetId) { 542a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 543a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 544a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (mInitCheck != OK) { 545a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return mInitCheck; 546a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 547a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 548a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 549a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 550a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 551a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 552a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->provideKeyResponse(toHidlVec(sessionId), 553a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlVec(response), 554a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& hKeySetId) { 555a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 556a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker keySetId = toVector(hKeySetId); 557a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 558a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 559a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 560a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 561a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 562a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 563a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 564a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 565a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::removeKeys(Vector<uint8_t> const &keySetId) { 566a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 567a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 568a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (mInitCheck != OK) { 569a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return mInitCheck; 570a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 571a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 572a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return toStatusT(mPlugin->removeKeys(toHidlVec(keySetId))); 573a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 574a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 575a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::restoreKeys(Vector<uint8_t> const &sessionId, 576a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Vector<uint8_t> const &keySetId) { 577a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 578a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 579a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (mInitCheck != OK) { 580a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return mInitCheck; 581a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 582a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 583a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 584a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 585a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return toStatusT(mPlugin->restoreKeys(toHidlVec(sessionId), 586a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlVec(keySetId))); 587a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 588a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 589a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::queryKeyStatus(Vector<uint8_t> const &sessionId, 590a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker KeyedVector<String8, String8> &infoMap) const { 591a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 592a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 593a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (mInitCheck != OK) { 594a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return mInitCheck; 595a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 596a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 597a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 598a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 599a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ::KeyedVector hInfoMap; 600a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 601a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 602a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 603a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->queryKeyStatus(toHidlVec(sessionId), 604a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<KeyValue>& map) { 605a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 606a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker infoMap = toKeyedVector(map); 607a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 608a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 609a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 610a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 611a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 612a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 613a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 614a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 615a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::getProvisionRequest(String8 const &certType, 616a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker String8 const &certAuthority, Vector<uint8_t> &request, 617a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker String8 &defaultUrl) { 618a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 619a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 620a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (mInitCheck != OK) { 621a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return mInitCheck; 622a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 623a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 624a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 625a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 626a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->getProvisionRequest( 627a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlString(certType), toHidlString(certAuthority), 628a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& hRequest, 629a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker const hidl_string& hDefaultUrl) { 630a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 631a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker request = toVector(hRequest); 632a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker defaultUrl = toString8(hDefaultUrl); 633a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 634a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 635a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 636a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 637a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 638a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 639a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 640a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 641a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::provideProvisionResponse(Vector<uint8_t> const &response, 64268b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong Vector<uint8_t> &certificate, Vector<uint8_t> &wrappedKey) { 643a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 644a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 645a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (mInitCheck != OK) { 646a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return mInitCheck; 647a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 648a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 649a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 650a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 651a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->provideProvisionResponse(toHidlVec(response), 652a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& hCertificate, 653a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker const hidl_vec<uint8_t>& hWrappedKey) { 654a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 655a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker certificate = toVector(hCertificate); 656a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker wrappedKey = toVector(hWrappedKey); 657a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 658a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 659a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 660a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 661a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 662a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 663a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 664a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 665abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinkerstatus_t DrmHal::getSecureStops(List<Vector<uint8_t>> &secureStops) { 666a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 667a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 668a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (mInitCheck != OK) { 669a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return mInitCheck; 670a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 671a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 672a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 673a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 674a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->getSecureStops( 675a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<SecureStop>& hSecureStops) { 676a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 677a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker secureStops = toSecureStops(hSecureStops); 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 Tinker 687a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::getSecureStop(Vector<uint8_t> const &ssid, Vector<uint8_t> &secureStop) { 688a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 689a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 690a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (mInitCheck != OK) { 691a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return mInitCheck; 692a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 693a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 694a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 695a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 696a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->getSecureStop(toHidlVec(ssid), 697a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const SecureStop& hSecureStop) { 698a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 699a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker secureStop = toVector(hSecureStop.opaqueData); 700a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 701a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 702a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 703a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 704a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 705a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 706a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 707a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 708a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::releaseSecureStops(Vector<uint8_t> const &ssRelease) { 709a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 710a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 711a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (mInitCheck != OK) { 712a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return mInitCheck; 713a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 714a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 715a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return toStatusT(mPlugin->releaseSecureStop(toHidlVec(ssRelease))); 716a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 717a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 718a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::releaseAllSecureStops() { 719a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 720a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 721a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (mInitCheck != OK) { 722a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return mInitCheck; 723a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 724a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 725a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return toStatusT(mPlugin->releaseAllSecureStops()); 726a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 727a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 728a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::getPropertyString(String8 const &name, String8 &value ) const { 729a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 730a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 731a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (mInitCheck != OK) { 732a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return mInitCheck; 733a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 734a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 735a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 736a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 737a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->getPropertyString(toHidlString(name), 738a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_string& hValue) { 739a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 740a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker value = toString8(hValue); 741a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 742a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 743a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 744a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 745a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 746a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 747a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 748a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 749a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::getPropertyByteArray(String8 const &name, Vector<uint8_t> &value ) const { 750a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 751a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 752a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (mInitCheck != OK) { 753a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return mInitCheck; 754a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 755a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 756a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 757a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 758a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->getPropertyByteArray(toHidlString(name), 759a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& hValue) { 760a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 761a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker value = toVector(hValue); 762a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 763a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 764a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 765a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 766a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 767a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 768a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 769a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 770a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::setPropertyString(String8 const &name, String8 const &value ) const { 771a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 772a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 773a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (mInitCheck != OK) { 774a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return mInitCheck; 775a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 776a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 777a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Status status = mPlugin->setPropertyString(toHidlString(name), 778a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlString(value)); 779a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return toStatusT(status); 780a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 781a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 782a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::setPropertyByteArray(String8 const &name, 783a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Vector<uint8_t> const &value ) const { 784a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 785a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 786a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (mInitCheck != OK) { 787a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return mInitCheck; 788a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 789a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 790a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Status status = mPlugin->setPropertyByteArray(toHidlString(name), 791a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlVec(value)); 792a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return toStatusT(status); 793a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 794a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 795a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 796a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::setCipherAlgorithm(Vector<uint8_t> const &sessionId, 797a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker String8 const &algorithm) { 798a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 799a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 800a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (mInitCheck != OK) { 801a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return mInitCheck; 802a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 803a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 804a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 805a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 806a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Status status = mPlugin->setCipherAlgorithm(toHidlVec(sessionId), 807a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlString(algorithm)); 808a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return toStatusT(status); 809a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 810a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 811a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::setMacAlgorithm(Vector<uint8_t> const &sessionId, 812a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker String8 const &algorithm) { 813a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 814a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 815a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (mInitCheck != OK) { 816a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return mInitCheck; 817a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 818a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 819a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 820a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 821a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Status status = mPlugin->setMacAlgorithm(toHidlVec(sessionId), 822a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlString(algorithm)); 823a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return toStatusT(status); 824a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 825a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 826a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::encrypt(Vector<uint8_t> const &sessionId, 82768b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong Vector<uint8_t> const &keyId, Vector<uint8_t> const &input, 82868b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong Vector<uint8_t> const &iv, Vector<uint8_t> &output) { 829a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 830a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 831a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (mInitCheck != OK) { 832a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return mInitCheck; 833a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 834a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 835a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 836a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 837a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 838a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 839a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->encrypt(toHidlVec(sessionId), 840a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlVec(keyId), toHidlVec(input), toHidlVec(iv), 841a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& hOutput) { 842a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 843a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker output = toVector(hOutput); 844a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 845a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 846a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 847a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 848a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 849a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 850a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 851a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 852a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::decrypt(Vector<uint8_t> const &sessionId, 85368b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong Vector<uint8_t> const &keyId, Vector<uint8_t> const &input, 85468b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong Vector<uint8_t> const &iv, Vector<uint8_t> &output) { 855a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 856a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 857a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (mInitCheck != OK) { 858a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return mInitCheck; 859a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 860a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 861a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 862a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 863a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 864a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 865a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->decrypt(toHidlVec(sessionId), 866a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlVec(keyId), toHidlVec(input), toHidlVec(iv), 867a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& hOutput) { 868a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 869a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker output = toVector(hOutput); 870a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 871a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 872a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 873a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 874a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 875a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 876a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 877a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 878a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::sign(Vector<uint8_t> const &sessionId, 87968b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong Vector<uint8_t> const &keyId, Vector<uint8_t> const &message, 88068b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong Vector<uint8_t> &signature) { 881a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 882a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 883a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (mInitCheck != OK) { 884a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return mInitCheck; 885a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 886a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 887a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 888a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 889a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 890a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 891a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->sign(toHidlVec(sessionId), 892a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlVec(keyId), toHidlVec(message), 893a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& hSignature) { 894a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 895a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker signature = toVector(hSignature); 896a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 897a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 898a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 899a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 900a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 901a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 902a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 903a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 904a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::verify(Vector<uint8_t> const &sessionId, 90568b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong Vector<uint8_t> const &keyId, Vector<uint8_t> const &message, 90668b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong Vector<uint8_t> const &signature, bool &match) { 907a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 908a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 909a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (mInitCheck != OK) { 910a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return mInitCheck; 911a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 912a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 913a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 914a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 915a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 916a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 917a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->verify(toHidlVec(sessionId),toHidlVec(keyId), 918a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlVec(message), toHidlVec(signature), 919a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, bool hMatch) { 920a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 921a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker match = hMatch; 922a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } else { 923a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker match = false; 924a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 925a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 926a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 927a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 928a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 929a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 930a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 931a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 932a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::signRSA(Vector<uint8_t> const &sessionId, 93368b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong String8 const &algorithm, Vector<uint8_t> const &message, 93468b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong Vector<uint8_t> const &wrappedKey, Vector<uint8_t> &signature) { 935a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 936a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 937a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (mInitCheck != OK) { 938a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return mInitCheck; 939a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 940a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 941a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (!checkPermission("android.permission.ACCESS_DRM_CERTIFICATES")) { 942a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return -EPERM; 943a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 944a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 945a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 946a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 947a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 948a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 949a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->signRSA(toHidlVec(sessionId), 950a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlString(algorithm), toHidlVec(message), toHidlVec(wrappedKey), 951a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& hSignature) { 952a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 953a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker signature = toVector(hSignature); 954a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 955a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 956a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 957a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 958a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 959a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 960a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 961a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 962a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkervoid DrmHal::binderDied(const wp<IBinder> &the_late_who __unused) 963a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker{ 964a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 9653e2891674ef57a74e59ca5e27f89647b3f06861bJeff Tinker setListener(NULL); 96670367f525a7bf5be52115608d190d72756e972eaJeff Tinker if (mPlugin != NULL) { 96770367f525a7bf5be52115608d190d72756e972eaJeff Tinker mPlugin->setListener(NULL); 96870367f525a7bf5be52115608d190d72756e972eaJeff Tinker } 969a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mPlugin.clear(); 97070367f525a7bf5be52115608d190d72756e972eaJeff Tinker mInitCheck = NO_INIT; 971a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 972a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 973a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkervoid DrmHal::writeByteArray(Parcel &obj, hidl_vec<uint8_t> const &vec) 974a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker{ 975a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (vec.size()) { 976a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker obj.writeInt32(vec.size()); 977a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker obj.write(vec.data(), vec.size()); 978a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } else { 979a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker obj.writeInt32(0); 980a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 981a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 982a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 983a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} // namespace android 984