ICrypto.cpp revision fa2b8f243eb048fb2b8e5a14356190f69eb31a36
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 "ICrypto"
19ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber#include <utils/Log.h>
20ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
21ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber#include <binder/Parcel.h>
22ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber#include <media/ICrypto.h>
235b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber#include <media/stagefright/MediaErrors.h>
24ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber#include <media/stagefright/foundation/ADebug.h>
255b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber#include <media/stagefright/foundation/AString.h>
26ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
27ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Hubernamespace android {
28ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
29ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huberenum {
301bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber    INIT_CHECK = IBinder::FIRST_CALL_TRANSACTION,
311bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber    IS_CRYPTO_SUPPORTED,
321bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber    CREATE_PLUGIN,
331bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber    DESTROY_PLUGIN,
341bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber    REQUIRES_SECURE_COMPONENT,
351bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber    DECRYPT,
36ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber};
37ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
38ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huberstruct BpCrypto : public BpInterface<ICrypto> {
39ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber    BpCrypto(const sp<IBinder> &impl)
40ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber        : BpInterface<ICrypto>(impl) {
41ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber    }
42ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
431bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber    virtual status_t initCheck() const {
44ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber        Parcel data, reply;
45ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber        data.writeInterfaceToken(ICrypto::getInterfaceDescriptor());
461bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber        remote()->transact(INIT_CHECK, data, &reply);
47ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
48ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber        return reply.readInt32();
49ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber    }
50ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
511bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber    virtual bool isCryptoSchemeSupported(const uint8_t uuid[16]) const {
52ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber        Parcel data, reply;
53ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber        data.writeInterfaceToken(ICrypto::getInterfaceDescriptor());
541bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber        data.write(uuid, 16);
551bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber        remote()->transact(IS_CRYPTO_SUPPORTED, data, &reply);
56ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
571bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber        return reply.readInt32() != 0;
58ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber    }
59ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
601bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber    virtual status_t createPlugin(
611bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            const uint8_t uuid[16], const void *opaqueData, size_t opaqueSize) {
62ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber        Parcel data, reply;
63ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber        data.writeInterfaceToken(ICrypto::getInterfaceDescriptor());
641bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber        data.write(uuid, 16);
651bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber        data.writeInt32(opaqueSize);
66705868c0f2a6e85a39addefe4db9f2130627c219Andreas Huber
67705868c0f2a6e85a39addefe4db9f2130627c219Andreas Huber        if (opaqueSize > 0) {
68705868c0f2a6e85a39addefe4db9f2130627c219Andreas Huber            data.write(opaqueData, opaqueSize);
69705868c0f2a6e85a39addefe4db9f2130627c219Andreas Huber        }
70705868c0f2a6e85a39addefe4db9f2130627c219Andreas Huber
711bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber        remote()->transact(CREATE_PLUGIN, data, &reply);
72ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
73ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber        return reply.readInt32();
74ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber    }
75ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
761bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber    virtual status_t destroyPlugin() {
77ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber        Parcel data, reply;
78ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber        data.writeInterfaceToken(ICrypto::getInterfaceDescriptor());
791bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber        remote()->transact(DESTROY_PLUGIN, data, &reply);
80ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
81ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber        return reply.readInt32();
82ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber    }
83ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
841bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber    virtual bool requiresSecureDecoderComponent(
851bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            const char *mime) const {
86ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber        Parcel data, reply;
87ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber        data.writeInterfaceToken(ICrypto::getInterfaceDescriptor());
881bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber        data.writeCString(mime);
891bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber        remote()->transact(REQUIRES_SECURE_COMPONENT, data, &reply);
90ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
911bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber        return reply.readInt32() != 0;
92ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber    }
93ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
94fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong    virtual ssize_t decrypt(
951bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            bool secure,
961bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            const uint8_t key[16],
971bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            const uint8_t iv[16],
981bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            CryptoPlugin::Mode mode,
991bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            const void *srcPtr,
1001bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            const CryptoPlugin::SubSample *subSamples, size_t numSubSamples,
1015b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber            void *dstPtr,
1025b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber            AString *errorDetailMsg) {
103ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber        Parcel data, reply;
104ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber        data.writeInterfaceToken(ICrypto::getInterfaceDescriptor());
1051bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber        data.writeInt32(secure);
1061bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber        data.writeInt32(mode);
1074b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber
1084b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        static const uint8_t kDummy[16] = { 0 };
1094b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber
1104b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        if (key == NULL) {
1114b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            key = kDummy;
1124b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        }
1134b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber
1144b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        if (iv == NULL) {
1154b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            iv = kDummy;
1164b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        }
1174b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber
1181bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber        data.write(key, 16);
1191bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber        data.write(iv, 16);
1201bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber
1211bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber        size_t totalSize = 0;
1221bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber        for (size_t i = 0; i < numSubSamples; ++i) {
1231bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            totalSize += subSamples[i].mNumBytesOfEncryptedData;
1241bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            totalSize += subSamples[i].mNumBytesOfClearData;
125ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber        }
126ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
1271bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber        data.writeInt32(totalSize);
1281bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber        data.write(srcPtr, totalSize);
1291bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber
1301bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber        data.writeInt32(numSubSamples);
1311bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber        data.write(subSamples, sizeof(CryptoPlugin::SubSample) * numSubSamples);
1321bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber
1331bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber        if (secure) {
1341bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            data.writeIntPtr((intptr_t)dstPtr);
1351bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber        }
136ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
1371bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber        remote()->transact(DECRYPT, data, &reply);
138ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
139fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong        ssize_t result = reply.readInt32();
140ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
1415b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber        if (result >= ERROR_DRM_VENDOR_MIN && result <= ERROR_DRM_VENDOR_MAX) {
1425b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber            errorDetailMsg->setTo(reply.readCString());
1435b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber        }
1445b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber
145fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong        if (!secure && result >= 0) {
146fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong            reply.read(dstPtr, result);
147ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber        }
148ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
149fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong        return result;
150ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber    }
151ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
152ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huberprivate:
153ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(BpCrypto);
154ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber};
155ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
156ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas HuberIMPLEMENT_META_INTERFACE(Crypto, "android.hardware.ICrypto");
157ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
158ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber////////////////////////////////////////////////////////////////////////////////
159ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
160ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huberstatus_t BnCrypto::onTransact(
161ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber    uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) {
162ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber    switch (code) {
1631bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber        case INIT_CHECK:
164ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber        {
165ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber            CHECK_INTERFACE(ICrypto, data, reply);
1661bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            reply->writeInt32(initCheck());
167ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
168ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber            return OK;
169ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber        }
170ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
1711bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber        case IS_CRYPTO_SUPPORTED:
172ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber        {
173ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber            CHECK_INTERFACE(ICrypto, data, reply);
1741bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            uint8_t uuid[16];
1751bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            data.read(uuid, sizeof(uuid));
1761bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            reply->writeInt32(isCryptoSchemeSupported(uuid));
177ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
178ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber            return OK;
179ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber        }
180ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
1811bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber        case CREATE_PLUGIN:
182ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber        {
183ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber            CHECK_INTERFACE(ICrypto, data, reply);
184ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
1851bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            uint8_t uuid[16];
1861bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            data.read(uuid, sizeof(uuid));
1871bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber
1881bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            size_t opaqueSize = data.readInt32();
189705868c0f2a6e85a39addefe4db9f2130627c219Andreas Huber            void *opaqueData = NULL;
190705868c0f2a6e85a39addefe4db9f2130627c219Andreas Huber
191705868c0f2a6e85a39addefe4db9f2130627c219Andreas Huber            if (opaqueSize > 0) {
192705868c0f2a6e85a39addefe4db9f2130627c219Andreas Huber                opaqueData = malloc(opaqueSize);
193705868c0f2a6e85a39addefe4db9f2130627c219Andreas Huber                data.read(opaqueData, opaqueSize);
194705868c0f2a6e85a39addefe4db9f2130627c219Andreas Huber            }
195ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
1961bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            reply->writeInt32(createPlugin(uuid, opaqueData, opaqueSize));
197ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
198705868c0f2a6e85a39addefe4db9f2130627c219Andreas Huber            if (opaqueData != NULL) {
199705868c0f2a6e85a39addefe4db9f2130627c219Andreas Huber                free(opaqueData);
200705868c0f2a6e85a39addefe4db9f2130627c219Andreas Huber                opaqueData = NULL;
201705868c0f2a6e85a39addefe4db9f2130627c219Andreas Huber            }
202ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
203ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber            return OK;
204ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber        }
205ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
2061bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber        case DESTROY_PLUGIN:
207ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber        {
208ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber            CHECK_INTERFACE(ICrypto, data, reply);
2091bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            reply->writeInt32(destroyPlugin());
210ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
211ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber            return OK;
212ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber        }
213ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
2141bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber        case REQUIRES_SECURE_COMPONENT:
215ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber        {
216ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber            CHECK_INTERFACE(ICrypto, data, reply);
217ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
2181bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            const char *mime = data.readCString();
2191bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            reply->writeInt32(requiresSecureDecoderComponent(mime));
220ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
2211bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            return OK;
2221bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber        }
223ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
2241bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber        case DECRYPT:
2251bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber        {
2261bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            CHECK_INTERFACE(ICrypto, data, reply);
227ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
2281bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            bool secure = data.readInt32() != 0;
2291bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            CryptoPlugin::Mode mode = (CryptoPlugin::Mode)data.readInt32();
230ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
2311bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            uint8_t key[16];
2321bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            data.read(key, sizeof(key));
233ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
2341bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            uint8_t iv[16];
2351bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            data.read(iv, sizeof(iv));
236ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
2371bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            size_t totalSize = data.readInt32();
2381bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            void *srcData = malloc(totalSize);
2391bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            data.read(srcData, totalSize);
240ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
2411bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            int32_t numSubSamples = data.readInt32();
242ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
2431bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            CryptoPlugin::SubSample *subSamples =
2441bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                new CryptoPlugin::SubSample[numSubSamples];
245ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
2461bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            data.read(
2471bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                    subSamples,
2481bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                    sizeof(CryptoPlugin::SubSample) * numSubSamples);
249ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
2501bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            void *dstPtr;
2511bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            if (secure) {
2521bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                dstPtr = (void *)data.readIntPtr();
2531bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            } else {
2541bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                dstPtr = malloc(totalSize);
255ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber            }
256ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
2575b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber            AString errorDetailMsg;
258fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong            ssize_t result = decrypt(
2591bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                    secure,
2601bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                    key,
2611bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                    iv,
2621bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                    mode,
2631bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                    srcData,
2641bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                    subSamples, numSubSamples,
2655b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber                    dstPtr,
2665b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber                    &errorDetailMsg);
267ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
268fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong            reply->writeInt32(result);
269ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
270fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong            if (result >= ERROR_DRM_VENDOR_MIN
271fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong                && result <= ERROR_DRM_VENDOR_MAX) {
2725b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber                reply->writeCString(errorDetailMsg.c_str());
2735b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber            }
2745b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber
2751bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            if (!secure) {
276fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong                if (result >= 0) {
277fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong                    CHECK_LE(result, static_cast<ssize_t>(totalSize));
278fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong                    reply->write(dstPtr, result);
2791bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                }
2801bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                free(dstPtr);
2811bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                dstPtr = NULL;
282ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber            }
283ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
2841bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            delete[] subSamples;
2851bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            subSamples = NULL;
286ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
287ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber            free(srcData);
288ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber            srcData = NULL;
289ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
290ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber            return OK;
291ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber        }
292ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
293ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber        default:
294ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber            return BBinder::onTransact(code, data, reply, flags);
295ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber    }
296ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber}
297ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
298ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber}  // namespace android
299ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
300