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