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
23c481b5012a5f6cf72e5e93b36f1ed4c9169916f2Jeff Tinker#include <binder/IMemory.h>
243003807fcfa96c9cbfea18d643f47108aa116cd5Jeff Tinker#include <media/Crypto.h>
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;
916d339f1f764bbd32e3381dae7bfa7c6c575bb493Lajos Molnar    uuidVector.appendArray(uuid, sizeof(uuid[0]) * 16);
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(
2379ac86b3cae9a1e14b12bf97223ddde96142aae43Jeff Tinker        DestinationType dstType,
2381bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber        const uint8_t key[16],
2391bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber        const uint8_t iv[16],
2401bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber        CryptoPlugin::Mode mode,
24118cb1eca504817b5b144a023ae2792d90e74c9a5Jeff Tinker        const CryptoPlugin::Pattern &pattern,
242c481b5012a5f6cf72e5e93b36f1ed4c9169916f2Jeff Tinker        const sp<IMemory> &sharedBuffer, size_t offset,
2431bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber        const CryptoPlugin::SubSample *subSamples, size_t numSubSamples,
2445b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber        void *dstPtr,
2455b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber        AString *errorDetailMsg) {
2461bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber    Mutex::Autolock autoLock(mLock);
2471bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber
2481bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber    if (mInitCheck != OK) {
2491bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber        return mInitCheck;
2501bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber    }
2511bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber
2521bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber    if (mPlugin == NULL) {
2531bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber        return -EINVAL;
2541bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber    }
2551bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber
256c481b5012a5f6cf72e5e93b36f1ed4c9169916f2Jeff Tinker    const void *srcPtr = static_cast<uint8_t *>(sharedBuffer->pointer()) + offset;
257c481b5012a5f6cf72e5e93b36f1ed4c9169916f2Jeff Tinker
2581bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber    return mPlugin->decrypt(
2599ac86b3cae9a1e14b12bf97223ddde96142aae43Jeff Tinker            dstType != kDestinationTypeVmPointer,
2609ac86b3cae9a1e14b12bf97223ddde96142aae43Jeff Tinker            key, iv, mode, pattern, srcPtr, subSamples, numSubSamples, dstPtr,
2615b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber            errorDetailMsg);
262ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber}
263ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
2642514d080c8a54ff603a45d7e336de668fe7329dbJeff Tinkervoid Crypto::notifyResolution(uint32_t width, uint32_t height) {
2652514d080c8a54ff603a45d7e336de668fe7329dbJeff Tinker    Mutex::Autolock autoLock(mLock);
2662514d080c8a54ff603a45d7e336de668fe7329dbJeff Tinker
2672514d080c8a54ff603a45d7e336de668fe7329dbJeff Tinker    if (mInitCheck == OK && mPlugin != NULL) {
2682514d080c8a54ff603a45d7e336de668fe7329dbJeff Tinker        mPlugin->notifyResolution(width, height);
2692514d080c8a54ff603a45d7e336de668fe7329dbJeff Tinker    }
2702514d080c8a54ff603a45d7e336de668fe7329dbJeff Tinker}
2712514d080c8a54ff603a45d7e336de668fe7329dbJeff Tinker
2721849570240443d1f75775c205fa658f7070849c6Jeff Tinkerstatus_t Crypto::setMediaDrmSession(const Vector<uint8_t> &sessionId) {
2731849570240443d1f75775c205fa658f7070849c6Jeff Tinker    Mutex::Autolock autoLock(mLock);
2741849570240443d1f75775c205fa658f7070849c6Jeff Tinker
2751849570240443d1f75775c205fa658f7070849c6Jeff Tinker    status_t result = NO_INIT;
2761849570240443d1f75775c205fa658f7070849c6Jeff Tinker    if (mInitCheck == OK && mPlugin != NULL) {
2771849570240443d1f75775c205fa658f7070849c6Jeff Tinker        result = mPlugin->setMediaDrmSession(sessionId);
2781849570240443d1f75775c205fa658f7070849c6Jeff Tinker    }
2791849570240443d1f75775c205fa658f7070849c6Jeff Tinker    return result;
2801849570240443d1f75775c205fa658f7070849c6Jeff Tinker}
2811849570240443d1f75775c205fa658f7070849c6Jeff Tinker
282ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber}  // namespace android
283