Drm.cpp revision 3003807fcfa96c9cbfea18d643f47108aa116cd5
1cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker/* 2cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker * Copyright (C) 2013 The Android Open Source Project 3cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker * 4cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker * Licensed under the Apache License, Version 2.0 (the "License"); 5cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker * you may not use this file except in compliance with the License. 6cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker * You may obtain a copy of the License at 7cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker * 8cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker * http://www.apache.org/licenses/LICENSE-2.0 9cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker * 10cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker * Unless required by applicable law or agreed to in writing, software 11cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker * distributed under the License is distributed on an "AS IS" BASIS, 12cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker * See the License for the specific language governing permissions and 14cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker * limitations under the License. 15cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker */ 16cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 17cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker//#define LOG_NDEBUG 0 18cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker#define LOG_TAG "Drm" 19cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker#include <utils/Log.h> 20cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 21cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker#include <dirent.h> 22cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker#include <dlfcn.h> 23cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 243003807fcfa96c9cbfea18d643f47108aa116cd5Jeff Tinker#include <media/DrmSessionClientInterface.h> 253003807fcfa96c9cbfea18d643f47108aa116cd5Jeff Tinker#include <media/DrmSessionManager.h> 263003807fcfa96c9cbfea18d643f47108aa116cd5Jeff Tinker#include <media/Drm.h> 27cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker#include <media/drm/DrmAPI.h> 28cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker#include <media/stagefright/foundation/ADebug.h> 29cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker#include <media/stagefright/foundation/AString.h> 30cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker#include <media/stagefright/foundation/hexdump.h> 31cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker#include <media/stagefright/MediaErrors.h> 3281e0bd44a10e90778ab5b0a3babd4fc52cadedd8Jeff Tinker#include <binder/IServiceManager.h> 3381e0bd44a10e90778ab5b0a3babd4fc52cadedd8Jeff Tinker#include <binder/IPCThreadState.h> 34cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 35cc82dc6d500023eba6048616301a4b12682458dbJeff Tinkernamespace android { 36cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 375c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wustatic inline int getCallingPid() { 385c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu return IPCThreadState::self()->getCallingPid(); 395c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu} 405c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu 4181e0bd44a10e90778ab5b0a3babd4fc52cadedd8Jeff Tinkerstatic bool checkPermission(const char* permissionString) { 4281e0bd44a10e90778ab5b0a3babd4fc52cadedd8Jeff Tinker if (getpid() == IPCThreadState::self()->getCallingPid()) return true; 4381e0bd44a10e90778ab5b0a3babd4fc52cadedd8Jeff Tinker bool ok = checkCallingPermission(String16(permissionString)); 4481e0bd44a10e90778ab5b0a3babd4fc52cadedd8Jeff Tinker if (!ok) ALOGE("Request requires %s", permissionString); 4581e0bd44a10e90778ab5b0a3babd4fc52cadedd8Jeff Tinker return ok; 4681e0bd44a10e90778ab5b0a3babd4fc52cadedd8Jeff Tinker} 4781e0bd44a10e90778ab5b0a3babd4fc52cadedd8Jeff Tinker 48cc82dc6d500023eba6048616301a4b12682458dbJeff TinkerKeyedVector<Vector<uint8_t>, String8> Drm::mUUIDToLibraryPathMap; 49cc82dc6d500023eba6048616301a4b12682458dbJeff TinkerKeyedVector<String8, wp<SharedLibrary> > Drm::mLibraryPathToOpenLibraryMap; 50cc82dc6d500023eba6048616301a4b12682458dbJeff TinkerMutex Drm::mMapLock; 512fb561a6fe9bca79c50a81e90fc4bb4eb18af0beJeff TinkerMutex Drm::mLock; 52cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 53cc82dc6d500023eba6048616301a4b12682458dbJeff Tinkerstatic bool operator<(const Vector<uint8_t> &lhs, const Vector<uint8_t> &rhs) { 54cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker if (lhs.size() < rhs.size()) { 55cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker return true; 56cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker } else if (lhs.size() > rhs.size()) { 57cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker return false; 58cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker } 59cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 60cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker return memcmp((void *)lhs.array(), (void *)rhs.array(), rhs.size()) < 0; 61cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker} 62cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 635c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wustruct DrmSessionClient : public DrmSessionClientInterface { 645c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu DrmSessionClient(Drm* drm) : mDrm(drm) {} 655c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu 665c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu virtual bool reclaimSession(const Vector<uint8_t>& sessionId) { 675c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu sp<Drm> drm = mDrm.promote(); 685c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu if (drm == NULL) { 695c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu return true; 705c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu } 715c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu status_t err = drm->closeSession(sessionId); 725c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu if (err != OK) { 735c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu return false; 745c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu } 755c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu drm->sendEvent(DrmPlugin::kDrmPluginEventSessionReclaimed, 0, &sessionId, NULL); 765c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu return true; 775c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu } 785c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu 795c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wuprotected: 805c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu virtual ~DrmSessionClient() {} 815c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu 825c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wuprivate: 835c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu wp<Drm> mDrm; 845c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu 855c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu DISALLOW_EVIL_CONSTRUCTORS(DrmSessionClient); 865c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu}; 875c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu 88cc82dc6d500023eba6048616301a4b12682458dbJeff TinkerDrm::Drm() 89cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker : mInitCheck(NO_INIT), 905c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu mDrmSessionClient(new DrmSessionClient(this)), 910cb126a34fe32f81c830858102471e7be2ce85b1Jeff Tinker mListener(NULL), 92cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker mFactory(NULL), 93cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker mPlugin(NULL) { 94cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker} 95cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 96cc82dc6d500023eba6048616301a4b12682458dbJeff TinkerDrm::~Drm() { 975c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu DrmSessionManager::Instance()->removeDrm(mDrmSessionClient); 98cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker delete mPlugin; 99cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker mPlugin = NULL; 100cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker closeFactory(); 101cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker} 102cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 103cc82dc6d500023eba6048616301a4b12682458dbJeff Tinkervoid Drm::closeFactory() { 104cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker delete mFactory; 105cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker mFactory = NULL; 106cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker mLibrary.clear(); 107cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker} 108cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 109cc82dc6d500023eba6048616301a4b12682458dbJeff Tinkerstatus_t Drm::initCheck() const { 110cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker return mInitCheck; 111cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker} 112cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 1130cb126a34fe32f81c830858102471e7be2ce85b1Jeff Tinkerstatus_t Drm::setListener(const sp<IDrmClient>& listener) 1140cb126a34fe32f81c830858102471e7be2ce85b1Jeff Tinker{ 1150cb126a34fe32f81c830858102471e7be2ce85b1Jeff Tinker Mutex::Autolock lock(mEventLock); 1163d3f67f3afa45e6b49d85b20942ee8184a33c1a4Jeff Tinker if (mListener != NULL){ 117f888020c6e2735624f2b2a30e72aca24e17b8b4dMarco Nelissen IInterface::asBinder(mListener)->unlinkToDeath(this); 1183d3f67f3afa45e6b49d85b20942ee8184a33c1a4Jeff Tinker } 1193d3f67f3afa45e6b49d85b20942ee8184a33c1a4Jeff Tinker if (listener != NULL) { 120f888020c6e2735624f2b2a30e72aca24e17b8b4dMarco Nelissen IInterface::asBinder(listener)->linkToDeath(this); 1213d3f67f3afa45e6b49d85b20942ee8184a33c1a4Jeff Tinker } 1220cb126a34fe32f81c830858102471e7be2ce85b1Jeff Tinker mListener = listener; 1230cb126a34fe32f81c830858102471e7be2ce85b1Jeff Tinker return NO_ERROR; 1240cb126a34fe32f81c830858102471e7be2ce85b1Jeff Tinker} 1250cb126a34fe32f81c830858102471e7be2ce85b1Jeff Tinker 1260cb126a34fe32f81c830858102471e7be2ce85b1Jeff Tinkervoid Drm::sendEvent(DrmPlugin::EventType eventType, int extra, 1270cb126a34fe32f81c830858102471e7be2ce85b1Jeff Tinker Vector<uint8_t> const *sessionId, 1280cb126a34fe32f81c830858102471e7be2ce85b1Jeff Tinker Vector<uint8_t> const *data) 1290cb126a34fe32f81c830858102471e7be2ce85b1Jeff Tinker{ 1300cb126a34fe32f81c830858102471e7be2ce85b1Jeff Tinker mEventLock.lock(); 1310cb126a34fe32f81c830858102471e7be2ce85b1Jeff Tinker sp<IDrmClient> listener = mListener; 1320cb126a34fe32f81c830858102471e7be2ce85b1Jeff Tinker mEventLock.unlock(); 1330cb126a34fe32f81c830858102471e7be2ce85b1Jeff Tinker 1340cb126a34fe32f81c830858102471e7be2ce85b1Jeff Tinker if (listener != NULL) { 1350cb126a34fe32f81c830858102471e7be2ce85b1Jeff Tinker Parcel obj; 1362fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker writeByteArray(obj, sessionId); 1372fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker writeByteArray(obj, data); 1380cb126a34fe32f81c830858102471e7be2ce85b1Jeff Tinker 1392fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker Mutex::Autolock lock(mNotifyLock); 1402fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker listener->notify(eventType, extra, &obj); 1412fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker } 1422fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker} 1432fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker 1442fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinkervoid Drm::sendExpirationUpdate(Vector<uint8_t> const *sessionId, 1452fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker int64_t expiryTimeInMS) 1462fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker{ 1472fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker mEventLock.lock(); 1482fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker sp<IDrmClient> listener = mListener; 1492fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker mEventLock.unlock(); 1502fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker 1512fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker if (listener != NULL) { 1522fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker Parcel obj; 1532fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker writeByteArray(obj, sessionId); 1542fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker obj.writeInt64(expiryTimeInMS); 1552fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker 1562fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker Mutex::Autolock lock(mNotifyLock); 1572fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker listener->notify(DrmPlugin::kDrmPluginEventExpirationUpdate, 0, &obj); 1582fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker } 1592fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker} 1602fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker 1612fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinkervoid Drm::sendKeysChange(Vector<uint8_t> const *sessionId, 1622fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker Vector<DrmPlugin::KeyStatus> const *keyStatusList, 1632fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker bool hasNewUsableKey) 1642fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker{ 1652fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker mEventLock.lock(); 1662fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker sp<IDrmClient> listener = mListener; 1672fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker mEventLock.unlock(); 1682fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker 1692fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker if (listener != NULL) { 1702fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker Parcel obj; 1712fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker writeByteArray(obj, sessionId); 1722fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker 1732fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker size_t nkeys = keyStatusList->size(); 1742fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker obj.writeInt32(keyStatusList->size()); 1752fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker for (size_t i = 0; i < nkeys; ++i) { 1762fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker const DrmPlugin::KeyStatus *keyStatus = &keyStatusList->itemAt(i); 1772fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker writeByteArray(obj, &keyStatus->mKeyId); 1782fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker obj.writeInt32(keyStatus->mType); 1790cb126a34fe32f81c830858102471e7be2ce85b1Jeff Tinker } 1802fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker obj.writeInt32(hasNewUsableKey); 1810cb126a34fe32f81c830858102471e7be2ce85b1Jeff Tinker 1820cb126a34fe32f81c830858102471e7be2ce85b1Jeff Tinker Mutex::Autolock lock(mNotifyLock); 1832fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker listener->notify(DrmPlugin::kDrmPluginEventKeysChange, 0, &obj); 1840cb126a34fe32f81c830858102471e7be2ce85b1Jeff Tinker } 1850cb126a34fe32f81c830858102471e7be2ce85b1Jeff Tinker} 186cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 187cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker/* 188cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker * Search the plugins directory for a plugin that supports the scheme 189cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker * specified by uuid 190cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker * 191cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker * If found: 192cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker * mLibrary holds a strong pointer to the dlopen'd library 193cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker * mFactory is set to the library's factory method 194cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker * mInitCheck is set to OK 195cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker * 196cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker * If not found: 197cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker * mLibrary is cleared and mFactory are set to NULL 198cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker * mInitCheck is set to an error (!OK) 199cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker */ 200cc82dc6d500023eba6048616301a4b12682458dbJeff Tinkervoid Drm::findFactoryForScheme(const uint8_t uuid[16]) { 201cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 202cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker closeFactory(); 203cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 204cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker // lock static maps 205cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker Mutex::Autolock autoLock(mMapLock); 206cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 207cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker // first check cache 208cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker Vector<uint8_t> uuidVector; 2096d339f1f764bbd32e3381dae7bfa7c6c575bb493Lajos Molnar uuidVector.appendArray(uuid, sizeof(uuid[0]) * 16); 210cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker ssize_t index = mUUIDToLibraryPathMap.indexOfKey(uuidVector); 211cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker if (index >= 0) { 212cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker if (loadLibraryForScheme(mUUIDToLibraryPathMap[index], uuid)) { 213cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker mInitCheck = OK; 214cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker return; 215cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker } else { 216cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker ALOGE("Failed to load from cached library path!"); 217cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker mInitCheck = ERROR_UNSUPPORTED; 218cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker return; 219cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker } 220cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker } 221cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 222cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker // no luck, have to search 223cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker String8 dirPath("/vendor/lib/mediadrm"); 224cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker DIR* pDir = opendir(dirPath.string()); 225cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 226cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker if (pDir == NULL) { 227cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker mInitCheck = ERROR_UNSUPPORTED; 228cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker ALOGE("Failed to open plugin directory %s", dirPath.string()); 229cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker return; 230cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker } 231cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 232cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 233cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker struct dirent* pEntry; 234cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker while ((pEntry = readdir(pDir))) { 235cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 236cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker String8 pluginPath = dirPath + "/" + pEntry->d_name; 237cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 238cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker if (pluginPath.getPathExtension() == ".so") { 239cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 240cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker if (loadLibraryForScheme(pluginPath, uuid)) { 241cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker mUUIDToLibraryPathMap.add(uuidVector, pluginPath); 242cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker mInitCheck = OK; 243cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker closedir(pDir); 244cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker return; 245cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker } 246cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker } 247cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker } 248cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 249cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker closedir(pDir); 250cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 251cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker ALOGE("Failed to find drm plugin"); 252cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker mInitCheck = ERROR_UNSUPPORTED; 253cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker} 254cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 255cc82dc6d500023eba6048616301a4b12682458dbJeff Tinkerbool Drm::loadLibraryForScheme(const String8 &path, const uint8_t uuid[16]) { 256cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 257cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker // get strong pointer to open shared library 258cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker ssize_t index = mLibraryPathToOpenLibraryMap.indexOfKey(path); 259cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker if (index >= 0) { 260cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker mLibrary = mLibraryPathToOpenLibraryMap[index].promote(); 261cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker } else { 262cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker index = mLibraryPathToOpenLibraryMap.add(path, NULL); 263cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker } 264cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 265cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker if (!mLibrary.get()) { 266cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker mLibrary = new SharedLibrary(path); 267cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker if (!*mLibrary) { 268cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker return false; 269cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker } 270cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 271cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker mLibraryPathToOpenLibraryMap.replaceValueAt(index, mLibrary); 272cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker } 273cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 274cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker typedef DrmFactory *(*CreateDrmFactoryFunc)(); 275cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 276cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker CreateDrmFactoryFunc createDrmFactory = 277cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker (CreateDrmFactoryFunc)mLibrary->lookup("createDrmFactory"); 278cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 279cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker if (createDrmFactory == NULL || 280cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker (mFactory = createDrmFactory()) == NULL || 281cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker !mFactory->isCryptoSchemeSupported(uuid)) { 282cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker closeFactory(); 283cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker return false; 284cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker } 285cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker return true; 286cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker} 287cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 2889cf69e0fc110f17c28e988ed0f9bf91abfaf710dJeff Tinkerbool Drm::isCryptoSchemeSupported(const uint8_t uuid[16], const String8 &mimeType) { 2899cf69e0fc110f17c28e988ed0f9bf91abfaf710dJeff Tinker 290cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker Mutex::Autolock autoLock(mLock); 291cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 2929cf69e0fc110f17c28e988ed0f9bf91abfaf710dJeff Tinker if (!mFactory || !mFactory->isCryptoSchemeSupported(uuid)) { 2939cf69e0fc110f17c28e988ed0f9bf91abfaf710dJeff Tinker findFactoryForScheme(uuid); 2949cf69e0fc110f17c28e988ed0f9bf91abfaf710dJeff Tinker if (mInitCheck != OK) { 2959cf69e0fc110f17c28e988ed0f9bf91abfaf710dJeff Tinker return false; 2969cf69e0fc110f17c28e988ed0f9bf91abfaf710dJeff Tinker } 297cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker } 298cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 299ee7e77d55d510725a314d8ed36dc730c21af6173Jeff Tinker if (mimeType != "") { 300ee7e77d55d510725a314d8ed36dc730c21af6173Jeff Tinker return mFactory->isContentTypeSupported(mimeType); 301ee7e77d55d510725a314d8ed36dc730c21af6173Jeff Tinker } 302ee7e77d55d510725a314d8ed36dc730c21af6173Jeff Tinker 303ee7e77d55d510725a314d8ed36dc730c21af6173Jeff Tinker return true; 304cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker} 305cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 306cc82dc6d500023eba6048616301a4b12682458dbJeff Tinkerstatus_t Drm::createPlugin(const uint8_t uuid[16]) { 307cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker Mutex::Autolock autoLock(mLock); 308cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 309cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker if (mPlugin != NULL) { 310cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker return -EINVAL; 311cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker } 312cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 313cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker if (!mFactory || !mFactory->isCryptoSchemeSupported(uuid)) { 314cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker findFactoryForScheme(uuid); 315cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker } 316cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 317cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker if (mInitCheck != OK) { 318cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker return mInitCheck; 319cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker } 320cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 3210cb126a34fe32f81c830858102471e7be2ce85b1Jeff Tinker status_t result = mFactory->createDrmPlugin(uuid, &mPlugin); 3220cb126a34fe32f81c830858102471e7be2ce85b1Jeff Tinker mPlugin->setListener(this); 3230cb126a34fe32f81c830858102471e7be2ce85b1Jeff Tinker return result; 324cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker} 325cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 326cc82dc6d500023eba6048616301a4b12682458dbJeff Tinkerstatus_t Drm::destroyPlugin() { 327cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker Mutex::Autolock autoLock(mLock); 328cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 329cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker if (mInitCheck != OK) { 330cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker return mInitCheck; 331cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker } 332cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 333cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker if (mPlugin == NULL) { 334cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker return -EINVAL; 335cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker } 336cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 337cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker delete mPlugin; 338cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker mPlugin = NULL; 339cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 340cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker return OK; 341cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker} 342cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 343cc82dc6d500023eba6048616301a4b12682458dbJeff Tinkerstatus_t Drm::openSession(Vector<uint8_t> &sessionId) { 344cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker Mutex::Autolock autoLock(mLock); 345cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 346cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker if (mInitCheck != OK) { 347cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker return mInitCheck; 348cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker } 349cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 350cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker if (mPlugin == NULL) { 351cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker return -EINVAL; 352cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker } 353cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 3545c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu status_t err = mPlugin->openSession(sessionId); 3555c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu if (err == ERROR_DRM_RESOURCE_BUSY) { 3565c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu bool retry = false; 357f35f6be32fb9e3ea040bb190b5414c7a5b988a6cRonghua Wu mLock.unlock(); 358f35f6be32fb9e3ea040bb190b5414c7a5b988a6cRonghua Wu // reclaimSession may call back to closeSession, since mLock is shared between Drm 359f35f6be32fb9e3ea040bb190b5414c7a5b988a6cRonghua Wu // instances, we should unlock here to avoid deadlock. 3605c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu retry = DrmSessionManager::Instance()->reclaimSession(getCallingPid()); 361f35f6be32fb9e3ea040bb190b5414c7a5b988a6cRonghua Wu mLock.lock(); 362f35f6be32fb9e3ea040bb190b5414c7a5b988a6cRonghua Wu if (mInitCheck != OK) { 363f35f6be32fb9e3ea040bb190b5414c7a5b988a6cRonghua Wu return mInitCheck; 364f35f6be32fb9e3ea040bb190b5414c7a5b988a6cRonghua Wu } 365f35f6be32fb9e3ea040bb190b5414c7a5b988a6cRonghua Wu 366f35f6be32fb9e3ea040bb190b5414c7a5b988a6cRonghua Wu if (mPlugin == NULL) { 367f35f6be32fb9e3ea040bb190b5414c7a5b988a6cRonghua Wu return -EINVAL; 368f35f6be32fb9e3ea040bb190b5414c7a5b988a6cRonghua Wu } 3695c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu if (retry) { 3705c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu err = mPlugin->openSession(sessionId); 3715c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu } 3725c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu } 3735c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu if (err == OK) { 3745c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu DrmSessionManager::Instance()->addSession(getCallingPid(), mDrmSessionClient, sessionId); 3755c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu } 3765c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu return err; 377cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker} 378cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 379cc82dc6d500023eba6048616301a4b12682458dbJeff Tinkerstatus_t Drm::closeSession(Vector<uint8_t> const &sessionId) { 380cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker Mutex::Autolock autoLock(mLock); 381cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 382cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker if (mInitCheck != OK) { 383cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker return mInitCheck; 384cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker } 385cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 386cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker if (mPlugin == NULL) { 387cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker return -EINVAL; 388cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker } 389cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 3905c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu status_t err = mPlugin->closeSession(sessionId); 3915c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu if (err == OK) { 3925c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu DrmSessionManager::Instance()->removeSession(sessionId); 3935c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu } 3945c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu return err; 395cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker} 396cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 3978856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinkerstatus_t Drm::getKeyRequest(Vector<uint8_t> const &sessionId, 3988856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker Vector<uint8_t> const &initData, 3998856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker String8 const &mimeType, DrmPlugin::KeyType keyType, 4008856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker KeyedVector<String8, String8> const &optionalParameters, 401d072c909d87f8150433860f6de4c11df6e09e2f9Jeff Tinker Vector<uint8_t> &request, String8 &defaultUrl, 402d072c909d87f8150433860f6de4c11df6e09e2f9Jeff Tinker DrmPlugin::KeyRequestType *keyRequestType) { 403cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker Mutex::Autolock autoLock(mLock); 404cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 405cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker if (mInitCheck != OK) { 406cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker return mInitCheck; 407cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker } 408cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 409cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker if (mPlugin == NULL) { 410cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker return -EINVAL; 411cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker } 412cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 4135c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu DrmSessionManager::Instance()->useSession(sessionId); 4145c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu 4158856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker return mPlugin->getKeyRequest(sessionId, initData, mimeType, keyType, 416d072c909d87f8150433860f6de4c11df6e09e2f9Jeff Tinker optionalParameters, request, defaultUrl, 417d072c909d87f8150433860f6de4c11df6e09e2f9Jeff Tinker keyRequestType); 418cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker} 419cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 4208856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinkerstatus_t Drm::provideKeyResponse(Vector<uint8_t> const &sessionId, 4218856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker Vector<uint8_t> const &response, 4228856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker Vector<uint8_t> &keySetId) { 423cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker Mutex::Autolock autoLock(mLock); 424cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 425cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker if (mInitCheck != OK) { 426cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker return mInitCheck; 427cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker } 428cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 429cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker if (mPlugin == NULL) { 430cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker return -EINVAL; 431cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker } 432cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 4335c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu DrmSessionManager::Instance()->useSession(sessionId); 4345c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu 4358856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker return mPlugin->provideKeyResponse(sessionId, response, keySetId); 436cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker} 437cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 4388856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinkerstatus_t Drm::removeKeys(Vector<uint8_t> const &keySetId) { 439cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker Mutex::Autolock autoLock(mLock); 440cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 441cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker if (mInitCheck != OK) { 442cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker return mInitCheck; 443cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker } 444cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 445cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker if (mPlugin == NULL) { 446cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker return -EINVAL; 447cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker } 448cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 4498856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker return mPlugin->removeKeys(keySetId); 450cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker} 451cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 4528856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinkerstatus_t Drm::restoreKeys(Vector<uint8_t> const &sessionId, 4538856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker Vector<uint8_t> const &keySetId) { 454cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker Mutex::Autolock autoLock(mLock); 455cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 456cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker if (mInitCheck != OK) { 457cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker return mInitCheck; 458cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker } 459cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 460cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker if (mPlugin == NULL) { 461cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker return -EINVAL; 462cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker } 463cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 4645c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu DrmSessionManager::Instance()->useSession(sessionId); 4655c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu 4668856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker return mPlugin->restoreKeys(sessionId, keySetId); 4678856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker} 4688856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker 4698856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinkerstatus_t Drm::queryKeyStatus(Vector<uint8_t> const &sessionId, 4708856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker KeyedVector<String8, String8> &infoMap) const { 4718856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker Mutex::Autolock autoLock(mLock); 4728856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker 4738856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker if (mInitCheck != OK) { 4748856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker return mInitCheck; 4758856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker } 4768856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker 4778856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker if (mPlugin == NULL) { 4788856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker return -EINVAL; 4798856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker } 4808856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker 4815c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu DrmSessionManager::Instance()->useSession(sessionId); 4825c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu 4838856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker return mPlugin->queryKeyStatus(sessionId, infoMap); 484cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker} 485cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 48668d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinkerstatus_t Drm::getProvisionRequest(String8 const &certType, String8 const &certAuthority, 48768d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker Vector<uint8_t> &request, String8 &defaultUrl) { 488cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker Mutex::Autolock autoLock(mLock); 489cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 490cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker if (mInitCheck != OK) { 491cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker return mInitCheck; 492cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker } 493cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 494cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker if (mPlugin == NULL) { 495cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker return -EINVAL; 496cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker } 497cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 49868d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker return mPlugin->getProvisionRequest(certType, certAuthority, 49968d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker request, defaultUrl); 500cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker} 501cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 50268d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinkerstatus_t Drm::provideProvisionResponse(Vector<uint8_t> const &response, 50368d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker Vector<uint8_t> &certificate, 50468d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker Vector<uint8_t> &wrappedKey) { 505cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker Mutex::Autolock autoLock(mLock); 506cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 507cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker if (mInitCheck != OK) { 508cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker return mInitCheck; 509cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker } 510cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 511cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker if (mPlugin == NULL) { 512cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker return -EINVAL; 513cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker } 514cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 51568d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker return mPlugin->provideProvisionResponse(response, certificate, wrappedKey); 516cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker} 517cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 518cc82dc6d500023eba6048616301a4b12682458dbJeff Tinkerstatus_t Drm::getSecureStops(List<Vector<uint8_t> > &secureStops) { 519cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker Mutex::Autolock autoLock(mLock); 520cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 521cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker if (mInitCheck != OK) { 522cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker return mInitCheck; 523cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker } 524cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 525cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker if (mPlugin == NULL) { 526cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker return -EINVAL; 527cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker } 528cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 529cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker return mPlugin->getSecureStops(secureStops); 530cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker} 531cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 5323c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinkerstatus_t Drm::getSecureStop(Vector<uint8_t> const &ssid, Vector<uint8_t> &secureStop) { 5333c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker Mutex::Autolock autoLock(mLock); 5343c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker 5353c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker if (mInitCheck != OK) { 5363c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker return mInitCheck; 5373c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker } 5383c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker 5393c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker if (mPlugin == NULL) { 5403c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker return -EINVAL; 5413c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker } 5423c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker 5433c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker return mPlugin->getSecureStop(ssid, secureStop); 5443c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker} 5453c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker 546cc82dc6d500023eba6048616301a4b12682458dbJeff Tinkerstatus_t Drm::releaseSecureStops(Vector<uint8_t> const &ssRelease) { 547cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker Mutex::Autolock autoLock(mLock); 548cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 549cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker if (mInitCheck != OK) { 550cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker return mInitCheck; 551cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker } 552cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 553cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker if (mPlugin == NULL) { 554cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker return -EINVAL; 555cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker } 556cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 557cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker return mPlugin->releaseSecureStops(ssRelease); 558cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker} 559cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 5603c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinkerstatus_t Drm::releaseAllSecureStops() { 5613c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker Mutex::Autolock autoLock(mLock); 5623c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker 5633c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker if (mInitCheck != OK) { 5643c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker return mInitCheck; 5653c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker } 5663c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker 5673c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker if (mPlugin == NULL) { 5683c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker return -EINVAL; 5693c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker } 5703c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker 5713c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker return mPlugin->releaseAllSecureStops(); 5723c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker} 5733c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker 574cc82dc6d500023eba6048616301a4b12682458dbJeff Tinkerstatus_t Drm::getPropertyString(String8 const &name, String8 &value ) const { 575cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker Mutex::Autolock autoLock(mLock); 576cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 577cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker if (mInitCheck != OK) { 578cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker return mInitCheck; 579cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker } 580cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 581cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker if (mPlugin == NULL) { 582cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker return -EINVAL; 583cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker } 584cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 585cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker return mPlugin->getPropertyString(name, value); 586cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker} 587cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 588cc82dc6d500023eba6048616301a4b12682458dbJeff Tinkerstatus_t Drm::getPropertyByteArray(String8 const &name, Vector<uint8_t> &value ) const { 589cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker Mutex::Autolock autoLock(mLock); 590cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 591cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker if (mInitCheck != OK) { 592cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker return mInitCheck; 593cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker } 594cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 595cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker if (mPlugin == NULL) { 596cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker return -EINVAL; 597cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker } 598cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 599cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker return mPlugin->getPropertyByteArray(name, value); 600cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker} 601cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 602cc82dc6d500023eba6048616301a4b12682458dbJeff Tinkerstatus_t Drm::setPropertyString(String8 const &name, String8 const &value ) const { 603cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker Mutex::Autolock autoLock(mLock); 604cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 605cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker if (mInitCheck != OK) { 606cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker return mInitCheck; 607cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker } 608cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 609cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker if (mPlugin == NULL) { 610cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker return -EINVAL; 611cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker } 612cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 613cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker return mPlugin->setPropertyString(name, value); 614cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker} 615cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 616cc82dc6d500023eba6048616301a4b12682458dbJeff Tinkerstatus_t Drm::setPropertyByteArray(String8 const &name, 617cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker Vector<uint8_t> const &value ) const { 618cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker Mutex::Autolock autoLock(mLock); 619cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 620cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker if (mInitCheck != OK) { 621cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker return mInitCheck; 622cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker } 623cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 624cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker if (mPlugin == NULL) { 625cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker return -EINVAL; 626cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker } 627cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 628cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker return mPlugin->setPropertyByteArray(name, value); 629cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker} 630cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker 6318856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker 6328856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinkerstatus_t Drm::setCipherAlgorithm(Vector<uint8_t> const &sessionId, 6338856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker String8 const &algorithm) { 6348856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker Mutex::Autolock autoLock(mLock); 6358856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker 6368856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker if (mInitCheck != OK) { 6378856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker return mInitCheck; 6388856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker } 6398856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker 6408856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker if (mPlugin == NULL) { 6418856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker return -EINVAL; 6428856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker } 6438856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker 6445c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu DrmSessionManager::Instance()->useSession(sessionId); 6455c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu 6468856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker return mPlugin->setCipherAlgorithm(sessionId, algorithm); 6478856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker} 6488856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker 6498856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinkerstatus_t Drm::setMacAlgorithm(Vector<uint8_t> const &sessionId, 6508856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker String8 const &algorithm) { 6518856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker Mutex::Autolock autoLock(mLock); 6528856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker 6538856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker if (mInitCheck != OK) { 6548856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker return mInitCheck; 6558856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker } 6568856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker 6578856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker if (mPlugin == NULL) { 6588856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker return -EINVAL; 6598856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker } 6608856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker 6615c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu DrmSessionManager::Instance()->useSession(sessionId); 6625c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu 6638856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker return mPlugin->setMacAlgorithm(sessionId, algorithm); 6648856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker} 6658856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker 6668856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinkerstatus_t Drm::encrypt(Vector<uint8_t> const &sessionId, 6678856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker Vector<uint8_t> const &keyId, 6688856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker Vector<uint8_t> const &input, 6698856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker Vector<uint8_t> const &iv, 6708856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker Vector<uint8_t> &output) { 6718856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker Mutex::Autolock autoLock(mLock); 6728856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker 6738856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker if (mInitCheck != OK) { 6748856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker return mInitCheck; 6758856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker } 6768856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker 6778856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker if (mPlugin == NULL) { 6788856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker return -EINVAL; 6798856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker } 6808856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker 6815c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu DrmSessionManager::Instance()->useSession(sessionId); 6825c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu 6838856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker return mPlugin->encrypt(sessionId, keyId, input, iv, output); 6848856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker} 6858856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker 6868856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinkerstatus_t Drm::decrypt(Vector<uint8_t> const &sessionId, 6878856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker Vector<uint8_t> const &keyId, 6888856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker Vector<uint8_t> const &input, 6898856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker Vector<uint8_t> const &iv, 6908856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker Vector<uint8_t> &output) { 6918856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker Mutex::Autolock autoLock(mLock); 6928856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker 6938856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker if (mInitCheck != OK) { 6948856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker return mInitCheck; 6958856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker } 6968856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker 6978856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker if (mPlugin == NULL) { 6988856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker return -EINVAL; 6998856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker } 7008856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker 7015c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu DrmSessionManager::Instance()->useSession(sessionId); 7025c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu 7038856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker return mPlugin->decrypt(sessionId, keyId, input, iv, output); 7048856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker} 7058856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker 7068856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinkerstatus_t Drm::sign(Vector<uint8_t> const &sessionId, 7078856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker Vector<uint8_t> const &keyId, 7088856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker Vector<uint8_t> const &message, 7098856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker Vector<uint8_t> &signature) { 7108856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker Mutex::Autolock autoLock(mLock); 7118856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker 7128856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker if (mInitCheck != OK) { 7138856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker return mInitCheck; 7148856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker } 7158856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker 7168856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker if (mPlugin == NULL) { 7178856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker return -EINVAL; 7188856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker } 7198856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker 7205c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu DrmSessionManager::Instance()->useSession(sessionId); 7215c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu 7228856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker return mPlugin->sign(sessionId, keyId, message, signature); 7238856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker} 7248856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker 7258856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinkerstatus_t Drm::verify(Vector<uint8_t> const &sessionId, 7268856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker Vector<uint8_t> const &keyId, 7278856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker Vector<uint8_t> const &message, 7288856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker Vector<uint8_t> const &signature, 7298856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker bool &match) { 7308856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker Mutex::Autolock autoLock(mLock); 7318856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker 7328856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker if (mInitCheck != OK) { 7338856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker return mInitCheck; 7348856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker } 7358856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker 7368856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker if (mPlugin == NULL) { 7378856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker return -EINVAL; 7388856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker } 7398856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker 7405c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu DrmSessionManager::Instance()->useSession(sessionId); 7415c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu 7428856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker return mPlugin->verify(sessionId, keyId, message, signature, match); 7438856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker} 7448856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker 74568d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinkerstatus_t Drm::signRSA(Vector<uint8_t> const &sessionId, 74668d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker String8 const &algorithm, 74768d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker Vector<uint8_t> const &message, 74868d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker Vector<uint8_t> const &wrappedKey, 74968d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker Vector<uint8_t> &signature) { 75068d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker Mutex::Autolock autoLock(mLock); 75168d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker 75268d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker if (mInitCheck != OK) { 75368d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker return mInitCheck; 75468d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker } 75568d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker 75668d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker if (mPlugin == NULL) { 75768d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker return -EINVAL; 75868d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker } 75968d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker 76081e0bd44a10e90778ab5b0a3babd4fc52cadedd8Jeff Tinker if (!checkPermission("android.permission.ACCESS_DRM_CERTIFICATES")) { 76181e0bd44a10e90778ab5b0a3babd4fc52cadedd8Jeff Tinker return -EPERM; 76281e0bd44a10e90778ab5b0a3babd4fc52cadedd8Jeff Tinker } 76381e0bd44a10e90778ab5b0a3babd4fc52cadedd8Jeff Tinker 7645c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu DrmSessionManager::Instance()->useSession(sessionId); 7655c3da20ddde6d17c3ab3cff7f7ca19f4f484f812Ronghua Wu 76668d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker return mPlugin->signRSA(sessionId, algorithm, message, wrappedKey, signature); 76768d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker} 76868d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker 7696d339f1f764bbd32e3381dae7bfa7c6c575bb493Lajos Molnarvoid Drm::binderDied(const wp<IBinder> &the_late_who __unused) 7703d3f67f3afa45e6b49d85b20942ee8184a33c1a4Jeff Tinker{ 7714dbc8cc68a2674110ac1dce9e475ac30b1baa7c5Jeff Tinker mEventLock.lock(); 7724dbc8cc68a2674110ac1dce9e475ac30b1baa7c5Jeff Tinker mListener.clear(); 7734dbc8cc68a2674110ac1dce9e475ac30b1baa7c5Jeff Tinker mEventLock.unlock(); 7744dbc8cc68a2674110ac1dce9e475ac30b1baa7c5Jeff Tinker 7754dbc8cc68a2674110ac1dce9e475ac30b1baa7c5Jeff Tinker Mutex::Autolock autoLock(mLock); 7763d3f67f3afa45e6b49d85b20942ee8184a33c1a4Jeff Tinker delete mPlugin; 7773d3f67f3afa45e6b49d85b20942ee8184a33c1a4Jeff Tinker mPlugin = NULL; 7783d3f67f3afa45e6b49d85b20942ee8184a33c1a4Jeff Tinker closeFactory(); 7793d3f67f3afa45e6b49d85b20942ee8184a33c1a4Jeff Tinker} 7803d3f67f3afa45e6b49d85b20942ee8184a33c1a4Jeff Tinker 7812fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinkervoid Drm::writeByteArray(Parcel &obj, Vector<uint8_t> const *array) 7822fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker{ 7832fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker if (array && array->size()) { 7842fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker obj.writeInt32(array->size()); 7852fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker obj.write(array->array(), array->size()); 7862fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker } else { 7872fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker obj.writeInt32(0); 7882fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker } 7892fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker} 7902fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker 791cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker} // namespace android 792