Drm.cpp revision 9cf69e0fc110f17c28e988ed0f9bf91abfaf710d
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
24cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker#include "Drm.h"
25cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
26cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker#include <media/drm/DrmAPI.h>
27cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker#include <media/stagefright/foundation/ADebug.h>
28cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker#include <media/stagefright/foundation/AString.h>
29cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker#include <media/stagefright/foundation/hexdump.h>
30cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker#include <media/stagefright/MediaErrors.h>
31cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
32cc82dc6d500023eba6048616301a4b12682458dbJeff Tinkernamespace android {
33cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
34cc82dc6d500023eba6048616301a4b12682458dbJeff TinkerKeyedVector<Vector<uint8_t>, String8> Drm::mUUIDToLibraryPathMap;
35cc82dc6d500023eba6048616301a4b12682458dbJeff TinkerKeyedVector<String8, wp<SharedLibrary> > Drm::mLibraryPathToOpenLibraryMap;
36cc82dc6d500023eba6048616301a4b12682458dbJeff TinkerMutex Drm::mMapLock;
37cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
38cc82dc6d500023eba6048616301a4b12682458dbJeff Tinkerstatic bool operator<(const Vector<uint8_t> &lhs, const Vector<uint8_t> &rhs) {
39cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (lhs.size() < rhs.size()) {
40cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        return true;
41cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    } else if (lhs.size() > rhs.size()) {
42cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        return false;
43cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
44cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
45cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    return memcmp((void *)lhs.array(), (void *)rhs.array(), rhs.size()) < 0;
46cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker}
47cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
48cc82dc6d500023eba6048616301a4b12682458dbJeff TinkerDrm::Drm()
49cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    : mInitCheck(NO_INIT),
500cb126a34fe32f81c830858102471e7be2ce85b1Jeff Tinker      mListener(NULL),
51cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker      mFactory(NULL),
52cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker      mPlugin(NULL) {
53cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker}
54cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
55cc82dc6d500023eba6048616301a4b12682458dbJeff TinkerDrm::~Drm() {
56cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    delete mPlugin;
57cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    mPlugin = NULL;
58cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    closeFactory();
59cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker}
60cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
61cc82dc6d500023eba6048616301a4b12682458dbJeff Tinkervoid Drm::closeFactory() {
62cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    delete mFactory;
63cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    mFactory = NULL;
64cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    mLibrary.clear();
65cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker}
66cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
67cc82dc6d500023eba6048616301a4b12682458dbJeff Tinkerstatus_t Drm::initCheck() const {
68cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    return mInitCheck;
69cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker}
70cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
710cb126a34fe32f81c830858102471e7be2ce85b1Jeff Tinkerstatus_t Drm::setListener(const sp<IDrmClient>& listener)
720cb126a34fe32f81c830858102471e7be2ce85b1Jeff Tinker{
730cb126a34fe32f81c830858102471e7be2ce85b1Jeff Tinker    Mutex::Autolock lock(mEventLock);
743d3f67f3afa45e6b49d85b20942ee8184a33c1a4Jeff Tinker    if (mListener != NULL){
753d3f67f3afa45e6b49d85b20942ee8184a33c1a4Jeff Tinker        mListener->asBinder()->unlinkToDeath(this);
763d3f67f3afa45e6b49d85b20942ee8184a33c1a4Jeff Tinker    }
773d3f67f3afa45e6b49d85b20942ee8184a33c1a4Jeff Tinker    if (listener != NULL) {
783d3f67f3afa45e6b49d85b20942ee8184a33c1a4Jeff Tinker        listener->asBinder()->linkToDeath(this);
793d3f67f3afa45e6b49d85b20942ee8184a33c1a4Jeff Tinker    }
800cb126a34fe32f81c830858102471e7be2ce85b1Jeff Tinker    mListener = listener;
810cb126a34fe32f81c830858102471e7be2ce85b1Jeff Tinker    return NO_ERROR;
820cb126a34fe32f81c830858102471e7be2ce85b1Jeff Tinker}
830cb126a34fe32f81c830858102471e7be2ce85b1Jeff Tinker
840cb126a34fe32f81c830858102471e7be2ce85b1Jeff Tinkervoid Drm::sendEvent(DrmPlugin::EventType eventType, int extra,
850cb126a34fe32f81c830858102471e7be2ce85b1Jeff Tinker                    Vector<uint8_t> const *sessionId,
860cb126a34fe32f81c830858102471e7be2ce85b1Jeff Tinker                    Vector<uint8_t> const *data)
870cb126a34fe32f81c830858102471e7be2ce85b1Jeff Tinker{
880cb126a34fe32f81c830858102471e7be2ce85b1Jeff Tinker    mEventLock.lock();
890cb126a34fe32f81c830858102471e7be2ce85b1Jeff Tinker    sp<IDrmClient> listener = mListener;
900cb126a34fe32f81c830858102471e7be2ce85b1Jeff Tinker    mEventLock.unlock();
910cb126a34fe32f81c830858102471e7be2ce85b1Jeff Tinker
920cb126a34fe32f81c830858102471e7be2ce85b1Jeff Tinker    if (listener != NULL) {
930cb126a34fe32f81c830858102471e7be2ce85b1Jeff Tinker        Parcel obj;
940cb126a34fe32f81c830858102471e7be2ce85b1Jeff Tinker        if (sessionId && sessionId->size()) {
950cb126a34fe32f81c830858102471e7be2ce85b1Jeff Tinker            obj.writeInt32(sessionId->size());
960cb126a34fe32f81c830858102471e7be2ce85b1Jeff Tinker            obj.write(sessionId->array(), sessionId->size());
970cb126a34fe32f81c830858102471e7be2ce85b1Jeff Tinker        } else {
980cb126a34fe32f81c830858102471e7be2ce85b1Jeff Tinker            obj.writeInt32(0);
990cb126a34fe32f81c830858102471e7be2ce85b1Jeff Tinker        }
1000cb126a34fe32f81c830858102471e7be2ce85b1Jeff Tinker
1010cb126a34fe32f81c830858102471e7be2ce85b1Jeff Tinker        if (data && data->size()) {
1020cb126a34fe32f81c830858102471e7be2ce85b1Jeff Tinker            obj.writeInt32(data->size());
1030cb126a34fe32f81c830858102471e7be2ce85b1Jeff Tinker            obj.write(data->array(), data->size());
1040cb126a34fe32f81c830858102471e7be2ce85b1Jeff Tinker        } else {
1050cb126a34fe32f81c830858102471e7be2ce85b1Jeff Tinker            obj.writeInt32(0);
1060cb126a34fe32f81c830858102471e7be2ce85b1Jeff Tinker        }
1070cb126a34fe32f81c830858102471e7be2ce85b1Jeff Tinker
1080cb126a34fe32f81c830858102471e7be2ce85b1Jeff Tinker        Mutex::Autolock lock(mNotifyLock);
1090cb126a34fe32f81c830858102471e7be2ce85b1Jeff Tinker        listener->notify(eventType, extra, &obj);
1100cb126a34fe32f81c830858102471e7be2ce85b1Jeff Tinker    }
1110cb126a34fe32f81c830858102471e7be2ce85b1Jeff Tinker}
112cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
113cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker/*
114cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker * Search the plugins directory for a plugin that supports the scheme
115cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker * specified by uuid
116cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker *
117cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker * If found:
118cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker *    mLibrary holds a strong pointer to the dlopen'd library
119cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker *    mFactory is set to the library's factory method
120cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker *    mInitCheck is set to OK
121cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker *
122cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker * If not found:
123cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker *    mLibrary is cleared and mFactory are set to NULL
124cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker *    mInitCheck is set to an error (!OK)
125cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker */
126cc82dc6d500023eba6048616301a4b12682458dbJeff Tinkervoid Drm::findFactoryForScheme(const uint8_t uuid[16]) {
127cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
128cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    closeFactory();
129cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
130cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    // lock static maps
131cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    Mutex::Autolock autoLock(mMapLock);
132cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
133cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    // first check cache
134cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    Vector<uint8_t> uuidVector;
135cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    uuidVector.appendArray(uuid, sizeof(uuid));
136cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    ssize_t index = mUUIDToLibraryPathMap.indexOfKey(uuidVector);
137cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (index >= 0) {
138cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        if (loadLibraryForScheme(mUUIDToLibraryPathMap[index], uuid)) {
139cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker            mInitCheck = OK;
140cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker            return;
141cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        } else {
142cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker            ALOGE("Failed to load from cached library path!");
143cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker            mInitCheck = ERROR_UNSUPPORTED;
144cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker            return;
145cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        }
146cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
147cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
148cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    // no luck, have to search
149cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    String8 dirPath("/vendor/lib/mediadrm");
150cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    DIR* pDir = opendir(dirPath.string());
151cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
152cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (pDir == NULL) {
153cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        mInitCheck = ERROR_UNSUPPORTED;
154cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        ALOGE("Failed to open plugin directory %s", dirPath.string());
155cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        return;
156cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
157cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
158cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
159cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    struct dirent* pEntry;
160cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    while ((pEntry = readdir(pDir))) {
161cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
162cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        String8 pluginPath = dirPath + "/" + pEntry->d_name;
163cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
164cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        if (pluginPath.getPathExtension() == ".so") {
165cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
166cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker            if (loadLibraryForScheme(pluginPath, uuid)) {
167cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker                mUUIDToLibraryPathMap.add(uuidVector, pluginPath);
168cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker                mInitCheck = OK;
169cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker                closedir(pDir);
170cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker                return;
171cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker            }
172cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        }
173cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
174cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
175cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    closedir(pDir);
176cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
177cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    ALOGE("Failed to find drm plugin");
178cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    mInitCheck = ERROR_UNSUPPORTED;
179cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker}
180cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
181cc82dc6d500023eba6048616301a4b12682458dbJeff Tinkerbool Drm::loadLibraryForScheme(const String8 &path, const uint8_t uuid[16]) {
182cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
183cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    // get strong pointer to open shared library
184cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    ssize_t index = mLibraryPathToOpenLibraryMap.indexOfKey(path);
185cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (index >= 0) {
186cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        mLibrary = mLibraryPathToOpenLibraryMap[index].promote();
187cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    } else {
188cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        index = mLibraryPathToOpenLibraryMap.add(path, NULL);
189cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
190cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
191cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (!mLibrary.get()) {
192cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        mLibrary = new SharedLibrary(path);
193cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        if (!*mLibrary) {
194cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker            return false;
195cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        }
196cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
197cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        mLibraryPathToOpenLibraryMap.replaceValueAt(index, mLibrary);
198cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
199cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
200cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    typedef DrmFactory *(*CreateDrmFactoryFunc)();
201cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
202cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    CreateDrmFactoryFunc createDrmFactory =
203cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        (CreateDrmFactoryFunc)mLibrary->lookup("createDrmFactory");
204cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
205cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (createDrmFactory == NULL ||
206cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        (mFactory = createDrmFactory()) == NULL ||
207cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        !mFactory->isCryptoSchemeSupported(uuid)) {
208cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        closeFactory();
209cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        return false;
210cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
211cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    return true;
212cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker}
213cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
2149cf69e0fc110f17c28e988ed0f9bf91abfaf710dJeff Tinkerbool Drm::isCryptoSchemeSupported(const uint8_t uuid[16], const String8 &mimeType) {
2159cf69e0fc110f17c28e988ed0f9bf91abfaf710dJeff Tinker
216cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    Mutex::Autolock autoLock(mLock);
217cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
2189cf69e0fc110f17c28e988ed0f9bf91abfaf710dJeff Tinker    if (!mFactory || !mFactory->isCryptoSchemeSupported(uuid)) {
2199cf69e0fc110f17c28e988ed0f9bf91abfaf710dJeff Tinker        findFactoryForScheme(uuid);
2209cf69e0fc110f17c28e988ed0f9bf91abfaf710dJeff Tinker        if (mInitCheck != OK) {
2219cf69e0fc110f17c28e988ed0f9bf91abfaf710dJeff Tinker            return false;
2229cf69e0fc110f17c28e988ed0f9bf91abfaf710dJeff Tinker        }
223cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
224cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
2259cf69e0fc110f17c28e988ed0f9bf91abfaf710dJeff Tinker    return mFactory->isContentTypeSupported(mimeType);
226cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker}
227cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
228cc82dc6d500023eba6048616301a4b12682458dbJeff Tinkerstatus_t Drm::createPlugin(const uint8_t uuid[16]) {
229cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    Mutex::Autolock autoLock(mLock);
230cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
231cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (mPlugin != NULL) {
232cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        return -EINVAL;
233cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
234cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
235cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (!mFactory || !mFactory->isCryptoSchemeSupported(uuid)) {
236cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        findFactoryForScheme(uuid);
237cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
238cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
239cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (mInitCheck != OK) {
240cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        return mInitCheck;
241cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
242cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
2430cb126a34fe32f81c830858102471e7be2ce85b1Jeff Tinker    status_t result = mFactory->createDrmPlugin(uuid, &mPlugin);
2440cb126a34fe32f81c830858102471e7be2ce85b1Jeff Tinker    mPlugin->setListener(this);
2450cb126a34fe32f81c830858102471e7be2ce85b1Jeff Tinker    return result;
246cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker}
247cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
248cc82dc6d500023eba6048616301a4b12682458dbJeff Tinkerstatus_t Drm::destroyPlugin() {
249cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    Mutex::Autolock autoLock(mLock);
250cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
251cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (mInitCheck != OK) {
252cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        return mInitCheck;
253cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
254cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
255cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (mPlugin == NULL) {
256cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        return -EINVAL;
257cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
258cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
259cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    delete mPlugin;
260cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    mPlugin = NULL;
261cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
262cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    return OK;
263cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker}
264cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
265cc82dc6d500023eba6048616301a4b12682458dbJeff Tinkerstatus_t Drm::openSession(Vector<uint8_t> &sessionId) {
266cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    Mutex::Autolock autoLock(mLock);
267cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
268cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (mInitCheck != OK) {
269cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        return mInitCheck;
270cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
271cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
272cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (mPlugin == NULL) {
273cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        return -EINVAL;
274cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
275cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
276cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    return mPlugin->openSession(sessionId);
277cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker}
278cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
279cc82dc6d500023eba6048616301a4b12682458dbJeff Tinkerstatus_t Drm::closeSession(Vector<uint8_t> const &sessionId) {
280cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    Mutex::Autolock autoLock(mLock);
281cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
282cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (mInitCheck != OK) {
283cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        return mInitCheck;
284cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
285cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
286cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (mPlugin == NULL) {
287cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        return -EINVAL;
288cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
289cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
290cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    return mPlugin->closeSession(sessionId);
291cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker}
292cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
2938856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinkerstatus_t Drm::getKeyRequest(Vector<uint8_t> const &sessionId,
2948856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker                            Vector<uint8_t> const &initData,
2958856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker                            String8 const &mimeType, DrmPlugin::KeyType keyType,
2968856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker                            KeyedVector<String8, String8> const &optionalParameters,
2978856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker                            Vector<uint8_t> &request, String8 &defaultUrl) {
298cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    Mutex::Autolock autoLock(mLock);
299cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
300cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (mInitCheck != OK) {
301cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        return mInitCheck;
302cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
303cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
304cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (mPlugin == NULL) {
305cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        return -EINVAL;
306cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
307cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
3088856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker    return mPlugin->getKeyRequest(sessionId, initData, mimeType, keyType,
3098856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker                                  optionalParameters, request, defaultUrl);
310cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker}
311cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
3128856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinkerstatus_t Drm::provideKeyResponse(Vector<uint8_t> const &sessionId,
3138856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker                                 Vector<uint8_t> const &response,
3148856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker                                 Vector<uint8_t> &keySetId) {
315cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    Mutex::Autolock autoLock(mLock);
316cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
317cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (mInitCheck != OK) {
318cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        return mInitCheck;
319cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
320cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
321cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (mPlugin == NULL) {
322cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        return -EINVAL;
323cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
324cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
3258856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker    return mPlugin->provideKeyResponse(sessionId, response, keySetId);
326cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker}
327cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
3288856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinkerstatus_t Drm::removeKeys(Vector<uint8_t> const &keySetId) {
329cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    Mutex::Autolock autoLock(mLock);
330cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
331cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (mInitCheck != OK) {
332cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        return mInitCheck;
333cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
334cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
335cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (mPlugin == NULL) {
336cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        return -EINVAL;
337cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
338cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
3398856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker    return mPlugin->removeKeys(keySetId);
340cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker}
341cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
3428856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinkerstatus_t Drm::restoreKeys(Vector<uint8_t> const &sessionId,
3438856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker                          Vector<uint8_t> const &keySetId) {
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
3548856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker    return mPlugin->restoreKeys(sessionId, keySetId);
3558856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker}
3568856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker
3578856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinkerstatus_t Drm::queryKeyStatus(Vector<uint8_t> const &sessionId,
3588856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker                             KeyedVector<String8, String8> &infoMap) const {
3598856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker    Mutex::Autolock autoLock(mLock);
3608856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker
3618856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker    if (mInitCheck != OK) {
3628856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker        return mInitCheck;
3638856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker    }
3648856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker
3658856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker    if (mPlugin == NULL) {
3668856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker        return -EINVAL;
3678856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker    }
3688856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker
3698856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker    return mPlugin->queryKeyStatus(sessionId, infoMap);
370cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker}
371cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
372cc82dc6d500023eba6048616301a4b12682458dbJeff Tinkerstatus_t Drm::getProvisionRequest(Vector<uint8_t> &request, String8 &defaultUrl) {
373cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    Mutex::Autolock autoLock(mLock);
374cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
375cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (mInitCheck != OK) {
376cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        return mInitCheck;
377cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
378cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
379cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (mPlugin == NULL) {
380cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        return -EINVAL;
381cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
382cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
383cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    return mPlugin->getProvisionRequest(request, defaultUrl);
384cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker}
385cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
386cc82dc6d500023eba6048616301a4b12682458dbJeff Tinkerstatus_t Drm::provideProvisionResponse(Vector<uint8_t> const &response) {
387cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    Mutex::Autolock autoLock(mLock);
388cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
389cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (mInitCheck != OK) {
390cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        return mInitCheck;
391cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
392cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
393cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (mPlugin == NULL) {
394cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        return -EINVAL;
395cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
396cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
397cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    return mPlugin->provideProvisionResponse(response);
398cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker}
399cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
400cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
401cc82dc6d500023eba6048616301a4b12682458dbJeff Tinkerstatus_t Drm::getSecureStops(List<Vector<uint8_t> > &secureStops) {
402cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    Mutex::Autolock autoLock(mLock);
403cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
404cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (mInitCheck != OK) {
405cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        return mInitCheck;
406cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
407cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
408cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (mPlugin == NULL) {
409cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        return -EINVAL;
410cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
411cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
412cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    return mPlugin->getSecureStops(secureStops);
413cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker}
414cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
415cc82dc6d500023eba6048616301a4b12682458dbJeff Tinkerstatus_t Drm::releaseSecureStops(Vector<uint8_t> const &ssRelease) {
416cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    Mutex::Autolock autoLock(mLock);
417cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
418cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (mInitCheck != OK) {
419cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        return mInitCheck;
420cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
421cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
422cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (mPlugin == NULL) {
423cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        return -EINVAL;
424cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
425cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
426cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    return mPlugin->releaseSecureStops(ssRelease);
427cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker}
428cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
429cc82dc6d500023eba6048616301a4b12682458dbJeff Tinkerstatus_t Drm::getPropertyString(String8 const &name, String8 &value ) const {
430cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    Mutex::Autolock autoLock(mLock);
431cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
432cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (mInitCheck != OK) {
433cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        return mInitCheck;
434cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
435cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
436cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (mPlugin == NULL) {
437cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        return -EINVAL;
438cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
439cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
440cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    return mPlugin->getPropertyString(name, value);
441cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker}
442cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
443cc82dc6d500023eba6048616301a4b12682458dbJeff Tinkerstatus_t Drm::getPropertyByteArray(String8 const &name, Vector<uint8_t> &value ) const {
444cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    Mutex::Autolock autoLock(mLock);
445cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
446cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (mInitCheck != OK) {
447cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        return mInitCheck;
448cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
449cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
450cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (mPlugin == NULL) {
451cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        return -EINVAL;
452cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
453cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
454cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    return mPlugin->getPropertyByteArray(name, value);
455cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker}
456cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
457cc82dc6d500023eba6048616301a4b12682458dbJeff Tinkerstatus_t Drm::setPropertyString(String8 const &name, String8 const &value ) const {
458cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    Mutex::Autolock autoLock(mLock);
459cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
460cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (mInitCheck != OK) {
461cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        return mInitCheck;
462cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
463cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
464cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (mPlugin == NULL) {
465cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        return -EINVAL;
466cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
467cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
468cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    return mPlugin->setPropertyString(name, value);
469cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker}
470cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
471cc82dc6d500023eba6048616301a4b12682458dbJeff Tinkerstatus_t Drm::setPropertyByteArray(String8 const &name,
472cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker                                   Vector<uint8_t> const &value ) const {
473cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    Mutex::Autolock autoLock(mLock);
474cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
475cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (mInitCheck != OK) {
476cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        return mInitCheck;
477cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
478cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
479cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (mPlugin == NULL) {
480cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        return -EINVAL;
481cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
482cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
483cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    return mPlugin->setPropertyByteArray(name, value);
484cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker}
485cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
4868856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker
4878856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinkerstatus_t Drm::setCipherAlgorithm(Vector<uint8_t> const &sessionId,
4888856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker                                 String8 const &algorithm) {
4898856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker    Mutex::Autolock autoLock(mLock);
4908856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker
4918856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker    if (mInitCheck != OK) {
4928856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker        return mInitCheck;
4938856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker    }
4948856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker
4958856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker    if (mPlugin == NULL) {
4968856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker        return -EINVAL;
4978856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker    }
4988856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker
4998856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker    return mPlugin->setCipherAlgorithm(sessionId, algorithm);
5008856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker}
5018856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker
5028856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinkerstatus_t Drm::setMacAlgorithm(Vector<uint8_t> const &sessionId,
5038856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker                              String8 const &algorithm) {
5048856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker    Mutex::Autolock autoLock(mLock);
5058856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker
5068856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker    if (mInitCheck != OK) {
5078856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker        return mInitCheck;
5088856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker    }
5098856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker
5108856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker    if (mPlugin == NULL) {
5118856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker        return -EINVAL;
5128856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker    }
5138856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker
5148856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker    return mPlugin->setMacAlgorithm(sessionId, algorithm);
5158856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker}
5168856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker
5178856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinkerstatus_t Drm::encrypt(Vector<uint8_t> const &sessionId,
5188856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker                      Vector<uint8_t> const &keyId,
5198856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker                      Vector<uint8_t> const &input,
5208856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker                      Vector<uint8_t> const &iv,
5218856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker                      Vector<uint8_t> &output) {
5228856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker    Mutex::Autolock autoLock(mLock);
5238856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker
5248856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker    if (mInitCheck != OK) {
5258856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker        return mInitCheck;
5268856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker    }
5278856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker
5288856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker    if (mPlugin == NULL) {
5298856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker        return -EINVAL;
5308856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker    }
5318856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker
5328856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker    return mPlugin->encrypt(sessionId, keyId, input, iv, output);
5338856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker}
5348856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker
5358856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinkerstatus_t Drm::decrypt(Vector<uint8_t> const &sessionId,
5368856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker                      Vector<uint8_t> const &keyId,
5378856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker                      Vector<uint8_t> const &input,
5388856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker                      Vector<uint8_t> const &iv,
5398856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker                      Vector<uint8_t> &output) {
5408856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker    Mutex::Autolock autoLock(mLock);
5418856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker
5428856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker    if (mInitCheck != OK) {
5438856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker        return mInitCheck;
5448856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker    }
5458856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker
5468856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker    if (mPlugin == NULL) {
5478856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker        return -EINVAL;
5488856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker    }
5498856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker
5508856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker    return mPlugin->decrypt(sessionId, keyId, input, iv, output);
5518856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker}
5528856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker
5538856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinkerstatus_t Drm::sign(Vector<uint8_t> const &sessionId,
5548856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker                   Vector<uint8_t> const &keyId,
5558856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker                   Vector<uint8_t> const &message,
5568856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker                   Vector<uint8_t> &signature) {
5578856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker    Mutex::Autolock autoLock(mLock);
5588856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker
5598856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker    if (mInitCheck != OK) {
5608856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker        return mInitCheck;
5618856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker    }
5628856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker
5638856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker    if (mPlugin == NULL) {
5648856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker        return -EINVAL;
5658856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker    }
5668856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker
5678856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker    return mPlugin->sign(sessionId, keyId, message, signature);
5688856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker}
5698856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker
5708856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinkerstatus_t Drm::verify(Vector<uint8_t> const &sessionId,
5718856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker                     Vector<uint8_t> const &keyId,
5728856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker                     Vector<uint8_t> const &message,
5738856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker                     Vector<uint8_t> const &signature,
5748856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker                     bool &match) {
5758856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker    Mutex::Autolock autoLock(mLock);
5768856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker
5778856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker    if (mInitCheck != OK) {
5788856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker        return mInitCheck;
5798856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker    }
5808856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker
5818856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker    if (mPlugin == NULL) {
5828856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker        return -EINVAL;
5838856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker    }
5848856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker
5858856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker    return mPlugin->verify(sessionId, keyId, message, signature, match);
5868856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker}
5878856c8b8777d0e0de11b2de863a336b001024e29Jeff Tinker
5883d3f67f3afa45e6b49d85b20942ee8184a33c1a4Jeff Tinkervoid Drm::binderDied(const wp<IBinder> &the_late_who)
5893d3f67f3afa45e6b49d85b20942ee8184a33c1a4Jeff Tinker{
5903d3f67f3afa45e6b49d85b20942ee8184a33c1a4Jeff Tinker    delete mPlugin;
5913d3f67f3afa45e6b49d85b20942ee8184a33c1a4Jeff Tinker    mPlugin = NULL;
5923d3f67f3afa45e6b49d85b20942ee8184a33c1a4Jeff Tinker    closeFactory();
5933d3f67f3afa45e6b49d85b20942ee8184a33c1a4Jeff Tinker    mListener.clear();
5943d3f67f3afa45e6b49d85b20942ee8184a33c1a4Jeff Tinker}
5953d3f67f3afa45e6b49d85b20942ee8184a33c1a4Jeff Tinker
596cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker}  // namespace android
597