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