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