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