1ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber/* 2ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber * Copyright (C) 2012 The Android Open Source Project 3ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber * 4ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber * you may not use this file except in compliance with the License. 6ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber * You may obtain a copy of the License at 7ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber * 8ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 9ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber * 10ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber * Unless required by applicable law or agreed to in writing, software 11ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber * See the License for the specific language governing permissions and 14ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber * limitations under the License. 15ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber */ 16ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 17ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber//#define LOG_NDEBUG 0 18ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber#define LOG_TAG "Crypto" 19ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber#include <utils/Log.h> 20bafb682ec7f51486e751fea954169deb91846063Jeff Tinker#include <dirent.h> 21bafb682ec7f51486e751fea954169deb91846063Jeff Tinker#include <dlfcn.h> 22ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 23ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber#include "Crypto.h" 24ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 251bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber#include <media/hardware/CryptoAPI.h> 261bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber#include <media/stagefright/foundation/ADebug.h> 275b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber#include <media/stagefright/foundation/AString.h> 281bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber#include <media/stagefright/foundation/hexdump.h> 29ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber#include <media/stagefright/MediaErrors.h> 30ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 31ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Hubernamespace android { 32ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 33bafb682ec7f51486e751fea954169deb91846063Jeff TinkerKeyedVector<Vector<uint8_t>, String8> Crypto::mUUIDToLibraryPathMap; 34bafb682ec7f51486e751fea954169deb91846063Jeff TinkerKeyedVector<String8, wp<SharedLibrary> > Crypto::mLibraryPathToOpenLibraryMap; 35bafb682ec7f51486e751fea954169deb91846063Jeff TinkerMutex Crypto::mMapLock; 36bafb682ec7f51486e751fea954169deb91846063Jeff Tinker 37bafb682ec7f51486e751fea954169deb91846063Jeff Tinkerstatic bool operator<(const Vector<uint8_t> &lhs, const Vector<uint8_t> &rhs) { 38bafb682ec7f51486e751fea954169deb91846063Jeff Tinker if (lhs.size() < rhs.size()) { 39bafb682ec7f51486e751fea954169deb91846063Jeff Tinker return true; 40bafb682ec7f51486e751fea954169deb91846063Jeff Tinker } else if (lhs.size() > rhs.size()) { 41bafb682ec7f51486e751fea954169deb91846063Jeff Tinker return false; 42bafb682ec7f51486e751fea954169deb91846063Jeff Tinker } 43bafb682ec7f51486e751fea954169deb91846063Jeff Tinker 44bafb682ec7f51486e751fea954169deb91846063Jeff Tinker return memcmp((void *)lhs.array(), (void *)rhs.array(), rhs.size()) < 0; 45bafb682ec7f51486e751fea954169deb91846063Jeff Tinker} 46bafb682ec7f51486e751fea954169deb91846063Jeff Tinker 471bd139a2a68690e80398b70b27ca59550fea0e65Andreas HuberCrypto::Crypto() 481bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber : mInitCheck(NO_INIT), 491608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber mFactory(NULL), 501bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber mPlugin(NULL) { 51ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber} 52ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 53ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas HuberCrypto::~Crypto() { 541bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber delete mPlugin; 551bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber mPlugin = NULL; 56bafb682ec7f51486e751fea954169deb91846063Jeff Tinker closeFactory(); 57bafb682ec7f51486e751fea954169deb91846063Jeff Tinker} 581bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 59bafb682ec7f51486e751fea954169deb91846063Jeff Tinkervoid Crypto::closeFactory() { 601bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber delete mFactory; 611bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber mFactory = NULL; 62bafb682ec7f51486e751fea954169deb91846063Jeff Tinker mLibrary.clear(); 63ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber} 64ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 651bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huberstatus_t Crypto::initCheck() const { 661bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber return mInitCheck; 67ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber} 68ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 69bafb682ec7f51486e751fea954169deb91846063Jeff Tinker/* 70bafb682ec7f51486e751fea954169deb91846063Jeff Tinker * Search the plugins directory for a plugin that supports the scheme 71bafb682ec7f51486e751fea954169deb91846063Jeff Tinker * specified by uuid 72bafb682ec7f51486e751fea954169deb91846063Jeff Tinker * 73bafb682ec7f51486e751fea954169deb91846063Jeff Tinker * If found: 74bafb682ec7f51486e751fea954169deb91846063Jeff Tinker * mLibrary holds a strong pointer to the dlopen'd library 75bafb682ec7f51486e751fea954169deb91846063Jeff Tinker * mFactory is set to the library's factory method 76bafb682ec7f51486e751fea954169deb91846063Jeff Tinker * mInitCheck is set to OK 77bafb682ec7f51486e751fea954169deb91846063Jeff Tinker * 78bafb682ec7f51486e751fea954169deb91846063Jeff Tinker * If not found: 79bafb682ec7f51486e751fea954169deb91846063Jeff Tinker * mLibrary is cleared and mFactory are set to NULL 80bafb682ec7f51486e751fea954169deb91846063Jeff Tinker * mInitCheck is set to an error (!OK) 81bafb682ec7f51486e751fea954169deb91846063Jeff Tinker */ 82bafb682ec7f51486e751fea954169deb91846063Jeff Tinkervoid Crypto::findFactoryForScheme(const uint8_t uuid[16]) { 831bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 84bafb682ec7f51486e751fea954169deb91846063Jeff Tinker closeFactory(); 851608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber 86bafb682ec7f51486e751fea954169deb91846063Jeff Tinker // lock static maps 87bafb682ec7f51486e751fea954169deb91846063Jeff Tinker Mutex::Autolock autoLock(mMapLock); 88bafb682ec7f51486e751fea954169deb91846063Jeff Tinker 89bafb682ec7f51486e751fea954169deb91846063Jeff Tinker // first check cache 90bafb682ec7f51486e751fea954169deb91846063Jeff Tinker Vector<uint8_t> uuidVector; 91bafb682ec7f51486e751fea954169deb91846063Jeff Tinker uuidVector.appendArray(uuid, sizeof(uuid)); 92bafb682ec7f51486e751fea954169deb91846063Jeff Tinker ssize_t index = mUUIDToLibraryPathMap.indexOfKey(uuidVector); 93bafb682ec7f51486e751fea954169deb91846063Jeff Tinker if (index >= 0) { 94bafb682ec7f51486e751fea954169deb91846063Jeff Tinker if (loadLibraryForScheme(mUUIDToLibraryPathMap[index], uuid)) { 95bafb682ec7f51486e751fea954169deb91846063Jeff Tinker mInitCheck = OK; 96bafb682ec7f51486e751fea954169deb91846063Jeff Tinker return; 97bafb682ec7f51486e751fea954169deb91846063Jeff Tinker } else { 98bafb682ec7f51486e751fea954169deb91846063Jeff Tinker ALOGE("Failed to load from cached library path!"); 99bafb682ec7f51486e751fea954169deb91846063Jeff Tinker mInitCheck = ERROR_UNSUPPORTED; 100bafb682ec7f51486e751fea954169deb91846063Jeff Tinker return; 101bafb682ec7f51486e751fea954169deb91846063Jeff Tinker } 1021bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber } 1031bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 104bafb682ec7f51486e751fea954169deb91846063Jeff Tinker // no luck, have to search 105bafb682ec7f51486e751fea954169deb91846063Jeff Tinker String8 dirPath("/vendor/lib/mediadrm"); 106bafb682ec7f51486e751fea954169deb91846063Jeff Tinker String8 pluginPath; 1071bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 108bafb682ec7f51486e751fea954169deb91846063Jeff Tinker DIR* pDir = opendir(dirPath.string()); 109bafb682ec7f51486e751fea954169deb91846063Jeff Tinker if (pDir) { 110bafb682ec7f51486e751fea954169deb91846063Jeff Tinker struct dirent* pEntry; 111bafb682ec7f51486e751fea954169deb91846063Jeff Tinker while ((pEntry = readdir(pDir))) { 112bafb682ec7f51486e751fea954169deb91846063Jeff Tinker 113bafb682ec7f51486e751fea954169deb91846063Jeff Tinker pluginPath = dirPath + "/" + pEntry->d_name; 114bafb682ec7f51486e751fea954169deb91846063Jeff Tinker 115bafb682ec7f51486e751fea954169deb91846063Jeff Tinker if (pluginPath.getPathExtension() == ".so") { 116bafb682ec7f51486e751fea954169deb91846063Jeff Tinker 117bafb682ec7f51486e751fea954169deb91846063Jeff Tinker if (loadLibraryForScheme(pluginPath, uuid)) { 118bafb682ec7f51486e751fea954169deb91846063Jeff Tinker mUUIDToLibraryPathMap.add(uuidVector, pluginPath); 119bafb682ec7f51486e751fea954169deb91846063Jeff Tinker mInitCheck = OK; 120bafb682ec7f51486e751fea954169deb91846063Jeff Tinker closedir(pDir); 121bafb682ec7f51486e751fea954169deb91846063Jeff Tinker return; 122bafb682ec7f51486e751fea954169deb91846063Jeff Tinker } 123bafb682ec7f51486e751fea954169deb91846063Jeff Tinker } 1241608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber } 1251608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber 126bafb682ec7f51486e751fea954169deb91846063Jeff Tinker closedir(pDir); 127bafb682ec7f51486e751fea954169deb91846063Jeff Tinker } 1281bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 129bafb682ec7f51486e751fea954169deb91846063Jeff Tinker // try the legacy libdrmdecrypt.so 130bafb682ec7f51486e751fea954169deb91846063Jeff Tinker pluginPath = "libdrmdecrypt.so"; 131bafb682ec7f51486e751fea954169deb91846063Jeff Tinker if (loadLibraryForScheme(pluginPath, uuid)) { 132bafb682ec7f51486e751fea954169deb91846063Jeff Tinker mUUIDToLibraryPathMap.add(uuidVector, pluginPath); 133bafb682ec7f51486e751fea954169deb91846063Jeff Tinker mInitCheck = OK; 134bafb682ec7f51486e751fea954169deb91846063Jeff Tinker return; 1351bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber } 1361bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 137bafb682ec7f51486e751fea954169deb91846063Jeff Tinker mInitCheck = ERROR_UNSUPPORTED; 138ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber} 139ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 140bafb682ec7f51486e751fea954169deb91846063Jeff Tinkerbool Crypto::loadLibraryForScheme(const String8 &path, const uint8_t uuid[16]) { 1411bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 142bafb682ec7f51486e751fea954169deb91846063Jeff Tinker // get strong pointer to open shared library 143bafb682ec7f51486e751fea954169deb91846063Jeff Tinker ssize_t index = mLibraryPathToOpenLibraryMap.indexOfKey(path); 144bafb682ec7f51486e751fea954169deb91846063Jeff Tinker if (index >= 0) { 145bafb682ec7f51486e751fea954169deb91846063Jeff Tinker mLibrary = mLibraryPathToOpenLibraryMap[index].promote(); 146bafb682ec7f51486e751fea954169deb91846063Jeff Tinker } else { 147bafb682ec7f51486e751fea954169deb91846063Jeff Tinker index = mLibraryPathToOpenLibraryMap.add(path, NULL); 148bafb682ec7f51486e751fea954169deb91846063Jeff Tinker } 149bafb682ec7f51486e751fea954169deb91846063Jeff Tinker 150bafb682ec7f51486e751fea954169deb91846063Jeff Tinker if (!mLibrary.get()) { 151bafb682ec7f51486e751fea954169deb91846063Jeff Tinker mLibrary = new SharedLibrary(path); 152bafb682ec7f51486e751fea954169deb91846063Jeff Tinker if (!*mLibrary) { 153d1eff5718510228503958e8fafa698c9e6a4a230leozwang@google.com ALOGE("loadLibraryForScheme failed:%s", mLibrary->lastError()); 154bafb682ec7f51486e751fea954169deb91846063Jeff Tinker return false; 155bafb682ec7f51486e751fea954169deb91846063Jeff Tinker } 156bafb682ec7f51486e751fea954169deb91846063Jeff Tinker 157bafb682ec7f51486e751fea954169deb91846063Jeff Tinker mLibraryPathToOpenLibraryMap.replaceValueAt(index, mLibrary); 158bafb682ec7f51486e751fea954169deb91846063Jeff Tinker } 159bafb682ec7f51486e751fea954169deb91846063Jeff Tinker 160bafb682ec7f51486e751fea954169deb91846063Jeff Tinker typedef CryptoFactory *(*CreateCryptoFactoryFunc)(); 161bafb682ec7f51486e751fea954169deb91846063Jeff Tinker 162bafb682ec7f51486e751fea954169deb91846063Jeff Tinker CreateCryptoFactoryFunc createCryptoFactory = 163bafb682ec7f51486e751fea954169deb91846063Jeff Tinker (CreateCryptoFactoryFunc)mLibrary->lookup("createCryptoFactory"); 164bafb682ec7f51486e751fea954169deb91846063Jeff Tinker 165bafb682ec7f51486e751fea954169deb91846063Jeff Tinker if (createCryptoFactory == NULL || 166bafb682ec7f51486e751fea954169deb91846063Jeff Tinker (mFactory = createCryptoFactory()) == NULL || 167bafb682ec7f51486e751fea954169deb91846063Jeff Tinker !mFactory->isCryptoSchemeSupported(uuid)) { 168d1eff5718510228503958e8fafa698c9e6a4a230leozwang@google.com ALOGE("createCryptoFactory failed:%s", mLibrary->lastError()); 169bafb682ec7f51486e751fea954169deb91846063Jeff Tinker closeFactory(); 1701bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber return false; 1711bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber } 172bafb682ec7f51486e751fea954169deb91846063Jeff Tinker return true; 173bafb682ec7f51486e751fea954169deb91846063Jeff Tinker} 174bafb682ec7f51486e751fea954169deb91846063Jeff Tinker 175bafb682ec7f51486e751fea954169deb91846063Jeff Tinkerbool Crypto::isCryptoSchemeSupported(const uint8_t uuid[16]) { 176bafb682ec7f51486e751fea954169deb91846063Jeff Tinker Mutex::Autolock autoLock(mLock); 177bafb682ec7f51486e751fea954169deb91846063Jeff Tinker 178bafb682ec7f51486e751fea954169deb91846063Jeff Tinker if (mFactory && mFactory->isCryptoSchemeSupported(uuid)) { 179bafb682ec7f51486e751fea954169deb91846063Jeff Tinker return true; 180bafb682ec7f51486e751fea954169deb91846063Jeff Tinker } 1811bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 182bafb682ec7f51486e751fea954169deb91846063Jeff Tinker findFactoryForScheme(uuid); 183bafb682ec7f51486e751fea954169deb91846063Jeff Tinker return (mInitCheck == OK); 184ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber} 185ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 1861bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huberstatus_t Crypto::createPlugin( 1871bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber const uint8_t uuid[16], const void *data, size_t size) { 1881bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber Mutex::Autolock autoLock(mLock); 1891bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 1901bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber if (mPlugin != NULL) { 1911bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber return -EINVAL; 1921bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber } 1931bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 194bafb682ec7f51486e751fea954169deb91846063Jeff Tinker if (!mFactory || !mFactory->isCryptoSchemeSupported(uuid)) { 195bafb682ec7f51486e751fea954169deb91846063Jeff Tinker findFactoryForScheme(uuid); 196bafb682ec7f51486e751fea954169deb91846063Jeff Tinker } 197bafb682ec7f51486e751fea954169deb91846063Jeff Tinker 198bafb682ec7f51486e751fea954169deb91846063Jeff Tinker if (mInitCheck != OK) { 199bafb682ec7f51486e751fea954169deb91846063Jeff Tinker return mInitCheck; 200bafb682ec7f51486e751fea954169deb91846063Jeff Tinker } 201bafb682ec7f51486e751fea954169deb91846063Jeff Tinker 2021bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber return mFactory->createPlugin(uuid, data, size, &mPlugin); 203ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber} 204ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 2051bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huberstatus_t Crypto::destroyPlugin() { 2061bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber Mutex::Autolock autoLock(mLock); 2071bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 2081bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber if (mInitCheck != OK) { 2091bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber return mInitCheck; 2101bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber } 2111bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 2121bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber if (mPlugin == NULL) { 2131bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber return -EINVAL; 2141bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber } 2151bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 2161bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber delete mPlugin; 2171bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber mPlugin = NULL; 2181bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 2191bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber return OK; 2201bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber} 2211bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 2221bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huberbool Crypto::requiresSecureDecoderComponent(const char *mime) const { 2231bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber Mutex::Autolock autoLock(mLock); 2241bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 2251bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber if (mInitCheck != OK) { 2261bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber return mInitCheck; 2271bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber } 2281bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 2291bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber if (mPlugin == NULL) { 2301bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber return -EINVAL; 2311bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber } 2321bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 2331bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber return mPlugin->requiresSecureDecoderComponent(mime); 234ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber} 235ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 236fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wongssize_t Crypto::decrypt( 2371bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber bool secure, 2381bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber const uint8_t key[16], 2391bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber const uint8_t iv[16], 2401bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber CryptoPlugin::Mode mode, 2411bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber const void *srcPtr, 2421bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber const CryptoPlugin::SubSample *subSamples, size_t numSubSamples, 2435b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber void *dstPtr, 2445b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber AString *errorDetailMsg) { 2451bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber Mutex::Autolock autoLock(mLock); 2461bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 2471bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber if (mInitCheck != OK) { 2481bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber return mInitCheck; 2491bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber } 2501bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 2511bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber if (mPlugin == NULL) { 2521bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber return -EINVAL; 2531bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber } 2541bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 2551bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber return mPlugin->decrypt( 2565b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber secure, key, iv, mode, srcPtr, subSamples, numSubSamples, dstPtr, 2575b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber errorDetailMsg); 258ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber} 259ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 2602514d080c8a54ff603a45d7e336de668fe7329dbJeff Tinkervoid Crypto::notifyResolution(uint32_t width, uint32_t height) { 2612514d080c8a54ff603a45d7e336de668fe7329dbJeff Tinker Mutex::Autolock autoLock(mLock); 2622514d080c8a54ff603a45d7e336de668fe7329dbJeff Tinker 2632514d080c8a54ff603a45d7e336de668fe7329dbJeff Tinker if (mInitCheck == OK && mPlugin != NULL) { 2642514d080c8a54ff603a45d7e336de668fe7329dbJeff Tinker mPlugin->notifyResolution(width, height); 2652514d080c8a54ff603a45d7e336de668fe7329dbJeff Tinker } 2662514d080c8a54ff603a45d7e336de668fe7329dbJeff Tinker} 2672514d080c8a54ff603a45d7e336de668fe7329dbJeff Tinker 268ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber} // namespace android 269