ICrypto.cpp revision d07c92742fc5801cab8e99801f591365986acbe9
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> 22c481b5012a5f6cf72e5e93b36f1ed4c9169916f2Jeff Tinker#include <binder/IMemory.h> 23ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber#include <media/ICrypto.h> 245b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber#include <media/stagefright/MediaErrors.h> 25ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber#include <media/stagefright/foundation/ADebug.h> 265b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber#include <media/stagefright/foundation/AString.h> 27ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 28ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Hubernamespace android { 29ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 30ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huberenum { 311bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber INIT_CHECK = IBinder::FIRST_CALL_TRANSACTION, 321bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber IS_CRYPTO_SUPPORTED, 331bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber CREATE_PLUGIN, 341bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber DESTROY_PLUGIN, 351bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber REQUIRES_SECURE_COMPONENT, 361bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber DECRYPT, 372514d080c8a54ff603a45d7e336de668fe7329dbJeff Tinker NOTIFY_RESOLUTION, 381849570240443d1f75775c205fa658f7070849c6Jeff Tinker SET_MEDIADRM_SESSION, 39d07c92742fc5801cab8e99801f591365986acbe9Chong Zhang SET_HEAP, 40d07c92742fc5801cab8e99801f591365986acbe9Chong Zhang UNSET_HEAP, 41ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber}; 42ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 43ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huberstruct BpCrypto : public BpInterface<ICrypto> { 44090ef604f81447eab4aa0a5b45d6307482573560Chih-Hung Hsieh explicit BpCrypto(const sp<IBinder> &impl) 45ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber : BpInterface<ICrypto>(impl) { 46ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 47ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 481bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber virtual status_t initCheck() const { 49ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber Parcel data, reply; 50ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber data.writeInterfaceToken(ICrypto::getInterfaceDescriptor()); 511bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber remote()->transact(INIT_CHECK, data, &reply); 52ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 53ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber return reply.readInt32(); 54ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 55ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 56bafb682ec7f51486e751fea954169deb91846063Jeff Tinker virtual bool isCryptoSchemeSupported(const uint8_t uuid[16]) { 57ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber Parcel data, reply; 58ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber data.writeInterfaceToken(ICrypto::getInterfaceDescriptor()); 591bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber data.write(uuid, 16); 601bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber remote()->transact(IS_CRYPTO_SUPPORTED, data, &reply); 61ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 621bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber return reply.readInt32() != 0; 63ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 64ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 651bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber virtual status_t createPlugin( 661bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber const uint8_t uuid[16], const void *opaqueData, size_t opaqueSize) { 67ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber Parcel data, reply; 68ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber data.writeInterfaceToken(ICrypto::getInterfaceDescriptor()); 691bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber data.write(uuid, 16); 701bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber data.writeInt32(opaqueSize); 71705868c0f2a6e85a39addefe4db9f2130627c219Andreas Huber 72705868c0f2a6e85a39addefe4db9f2130627c219Andreas Huber if (opaqueSize > 0) { 73705868c0f2a6e85a39addefe4db9f2130627c219Andreas Huber data.write(opaqueData, opaqueSize); 74705868c0f2a6e85a39addefe4db9f2130627c219Andreas Huber } 75705868c0f2a6e85a39addefe4db9f2130627c219Andreas Huber 761bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber remote()->transact(CREATE_PLUGIN, data, &reply); 77ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 78ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber return reply.readInt32(); 79ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 80ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 811bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber virtual status_t destroyPlugin() { 82ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber Parcel data, reply; 83ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber data.writeInterfaceToken(ICrypto::getInterfaceDescriptor()); 841bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber remote()->transact(DESTROY_PLUGIN, data, &reply); 85ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 86ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber return reply.readInt32(); 87ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 88ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 891bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber virtual bool requiresSecureDecoderComponent( 901bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber const char *mime) const { 91ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber Parcel data, reply; 92ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber data.writeInterfaceToken(ICrypto::getInterfaceDescriptor()); 931bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber data.writeCString(mime); 941bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber remote()->transact(REQUIRES_SECURE_COMPONENT, data, &reply); 95ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 961bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber return reply.readInt32() != 0; 97ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 98ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 99a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker virtual ssize_t decrypt(const uint8_t key[16], const uint8_t iv[16], 10018cb1eca504817b5b144a023ae2792d90e74c9a5Jeff Tinker CryptoPlugin::Mode mode, const CryptoPlugin::Pattern &pattern, 101a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker const sp<IMemory> &source, size_t offset, 1021bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber const CryptoPlugin::SubSample *subSamples, size_t numSubSamples, 103a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker const DestinationBuffer &destination, AString *errorDetailMsg) { 104ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber Parcel data, reply; 105ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber data.writeInterfaceToken(ICrypto::getInterfaceDescriptor()); 1061bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber data.writeInt32(mode); 10718cb1eca504817b5b144a023ae2792d90e74c9a5Jeff Tinker data.writeInt32(pattern.mEncryptBlocks); 10818cb1eca504817b5b144a023ae2792d90e74c9a5Jeff Tinker data.writeInt32(pattern.mSkipBlocks); 1094b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 1104b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber static const uint8_t kDummy[16] = { 0 }; 1114b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 1124b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber if (key == NULL) { 1134b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber key = kDummy; 1144b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber } 1154b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 1164b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber if (iv == NULL) { 1174b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber iv = kDummy; 1184b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber } 1194b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 1201bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber data.write(key, 16); 1211bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber data.write(iv, 16); 1221bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 1231bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber size_t totalSize = 0; 1241bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber for (size_t i = 0; i < numSubSamples; ++i) { 1251bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber totalSize += subSamples[i].mNumBytesOfEncryptedData; 1261bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber totalSize += subSamples[i].mNumBytesOfClearData; 127ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 128ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 1291bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber data.writeInt32(totalSize); 130a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker data.writeStrongBinder(IInterface::asBinder(source)); 131c481b5012a5f6cf72e5e93b36f1ed4c9169916f2Jeff Tinker data.writeInt32(offset); 1321bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 1331bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber data.writeInt32(numSubSamples); 1341bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber data.write(subSamples, sizeof(CryptoPlugin::SubSample) * numSubSamples); 1351bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 136a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker data.writeInt32((int32_t)destination.mType); 137a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (destination.mType == kDestinationTypeNativeHandle) { 138a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (destination.mHandle == NULL) { 139a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return BAD_VALUE; 140a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 141a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker data.writeNativeHandle(destination.mHandle); 1429ac86b3cae9a1e14b12bf97223ddde96142aae43Jeff Tinker } else { 143a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (destination.mSharedMemory == NULL) { 144a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return BAD_VALUE; 145a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 146a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker data.writeStrongBinder(IInterface::asBinder(destination.mSharedMemory)); 1471bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber } 148ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 1491bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber remote()->transact(DECRYPT, data, &reply); 150ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 151fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong ssize_t result = reply.readInt32(); 152ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 153ceffd8cc911bd2e685b525f838cd3d8198ab35cfJeff Tinker if (isCryptoError(result)) { 1540be134af061566c7d68c0c4f868a677daf85f550Jeff Tinker AString msg = reply.readCString(); 1550be134af061566c7d68c0c4f868a677daf85f550Jeff Tinker if (errorDetailMsg) { 1560be134af061566c7d68c0c4f868a677daf85f550Jeff Tinker *errorDetailMsg = msg; 1570be134af061566c7d68c0c4f868a677daf85f550Jeff Tinker } 158ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 159ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 160fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong return result; 161ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 162ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 1632514d080c8a54ff603a45d7e336de668fe7329dbJeff Tinker virtual void notifyResolution( 1642514d080c8a54ff603a45d7e336de668fe7329dbJeff Tinker uint32_t width, uint32_t height) { 1652514d080c8a54ff603a45d7e336de668fe7329dbJeff Tinker Parcel data, reply; 1662514d080c8a54ff603a45d7e336de668fe7329dbJeff Tinker data.writeInterfaceToken(ICrypto::getInterfaceDescriptor()); 1672514d080c8a54ff603a45d7e336de668fe7329dbJeff Tinker data.writeInt32(width); 1682514d080c8a54ff603a45d7e336de668fe7329dbJeff Tinker data.writeInt32(height); 1692514d080c8a54ff603a45d7e336de668fe7329dbJeff Tinker remote()->transact(NOTIFY_RESOLUTION, data, &reply); 1702514d080c8a54ff603a45d7e336de668fe7329dbJeff Tinker } 1712514d080c8a54ff603a45d7e336de668fe7329dbJeff Tinker 1721849570240443d1f75775c205fa658f7070849c6Jeff Tinker virtual status_t setMediaDrmSession(const Vector<uint8_t> &sessionId) { 1731849570240443d1f75775c205fa658f7070849c6Jeff Tinker Parcel data, reply; 1741849570240443d1f75775c205fa658f7070849c6Jeff Tinker data.writeInterfaceToken(ICrypto::getInterfaceDescriptor()); 1751849570240443d1f75775c205fa658f7070849c6Jeff Tinker 1761849570240443d1f75775c205fa658f7070849c6Jeff Tinker writeVector(data, sessionId); 1771849570240443d1f75775c205fa658f7070849c6Jeff Tinker remote()->transact(SET_MEDIADRM_SESSION, data, &reply); 1781849570240443d1f75775c205fa658f7070849c6Jeff Tinker 1791849570240443d1f75775c205fa658f7070849c6Jeff Tinker return reply.readInt32(); 1801849570240443d1f75775c205fa658f7070849c6Jeff Tinker } 1811849570240443d1f75775c205fa658f7070849c6Jeff Tinker 182d07c92742fc5801cab8e99801f591365986acbe9Chong Zhang virtual void setHeap(const sp<IMemoryHeap> &heap) { 183d07c92742fc5801cab8e99801f591365986acbe9Chong Zhang Parcel data, reply; 184d07c92742fc5801cab8e99801f591365986acbe9Chong Zhang data.writeInterfaceToken(ICrypto::getInterfaceDescriptor()); 185d07c92742fc5801cab8e99801f591365986acbe9Chong Zhang data.writeStrongBinder(IInterface::asBinder(heap)); 186d07c92742fc5801cab8e99801f591365986acbe9Chong Zhang remote()->transact(SET_HEAP, data, &reply); 187d07c92742fc5801cab8e99801f591365986acbe9Chong Zhang return; 188d07c92742fc5801cab8e99801f591365986acbe9Chong Zhang } 189d07c92742fc5801cab8e99801f591365986acbe9Chong Zhang 190d07c92742fc5801cab8e99801f591365986acbe9Chong Zhang virtual void unsetHeap(const sp<IMemoryHeap>& heap) { 191d07c92742fc5801cab8e99801f591365986acbe9Chong Zhang Parcel data, reply; 192d07c92742fc5801cab8e99801f591365986acbe9Chong Zhang data.writeInterfaceToken(ICrypto::getInterfaceDescriptor()); 193d07c92742fc5801cab8e99801f591365986acbe9Chong Zhang data.writeStrongBinder(IInterface::asBinder(heap)); 194d07c92742fc5801cab8e99801f591365986acbe9Chong Zhang remote()->transact(UNSET_HEAP, data, &reply); 195d07c92742fc5801cab8e99801f591365986acbe9Chong Zhang return; 196d07c92742fc5801cab8e99801f591365986acbe9Chong Zhang } 197d07c92742fc5801cab8e99801f591365986acbe9Chong Zhang 198d07c92742fc5801cab8e99801f591365986acbe9Chong Zhang 199ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huberprivate: 2001849570240443d1f75775c205fa658f7070849c6Jeff Tinker void readVector(Parcel &reply, Vector<uint8_t> &vector) const { 2011849570240443d1f75775c205fa658f7070849c6Jeff Tinker uint32_t size = reply.readInt32(); 2021849570240443d1f75775c205fa658f7070849c6Jeff Tinker vector.insertAt((size_t)0, size); 2031849570240443d1f75775c205fa658f7070849c6Jeff Tinker reply.read(vector.editArray(), size); 2041849570240443d1f75775c205fa658f7070849c6Jeff Tinker } 2051849570240443d1f75775c205fa658f7070849c6Jeff Tinker 2061849570240443d1f75775c205fa658f7070849c6Jeff Tinker void writeVector(Parcel &data, Vector<uint8_t> const &vector) const { 2071849570240443d1f75775c205fa658f7070849c6Jeff Tinker data.writeInt32(vector.size()); 2081849570240443d1f75775c205fa658f7070849c6Jeff Tinker data.write(vector.array(), vector.size()); 2091849570240443d1f75775c205fa658f7070849c6Jeff Tinker } 2101849570240443d1f75775c205fa658f7070849c6Jeff Tinker 211ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(BpCrypto); 212ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber}; 213ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 214ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas HuberIMPLEMENT_META_INTERFACE(Crypto, "android.hardware.ICrypto"); 215ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 216ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber//////////////////////////////////////////////////////////////////////////////// 217ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 2181849570240443d1f75775c205fa658f7070849c6Jeff Tinkervoid BnCrypto::readVector(const Parcel &data, Vector<uint8_t> &vector) const { 2191849570240443d1f75775c205fa658f7070849c6Jeff Tinker uint32_t size = data.readInt32(); 2201849570240443d1f75775c205fa658f7070849c6Jeff Tinker vector.insertAt((size_t)0, size); 2211849570240443d1f75775c205fa658f7070849c6Jeff Tinker data.read(vector.editArray(), size); 2221849570240443d1f75775c205fa658f7070849c6Jeff Tinker} 2231849570240443d1f75775c205fa658f7070849c6Jeff Tinker 2241849570240443d1f75775c205fa658f7070849c6Jeff Tinkervoid BnCrypto::writeVector(Parcel *reply, Vector<uint8_t> const &vector) const { 2251849570240443d1f75775c205fa658f7070849c6Jeff Tinker reply->writeInt32(vector.size()); 2261849570240443d1f75775c205fa658f7070849c6Jeff Tinker reply->write(vector.array(), vector.size()); 2271849570240443d1f75775c205fa658f7070849c6Jeff Tinker} 2281849570240443d1f75775c205fa658f7070849c6Jeff Tinker 229ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huberstatus_t BnCrypto::onTransact( 230ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) { 231ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber switch (code) { 2321bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber case INIT_CHECK: 233ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber { 234ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber CHECK_INTERFACE(ICrypto, data, reply); 2351bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber reply->writeInt32(initCheck()); 236ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 237ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber return OK; 238ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 239ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 2401bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber case IS_CRYPTO_SUPPORTED: 241ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber { 242ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber CHECK_INTERFACE(ICrypto, data, reply); 2431bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber uint8_t uuid[16]; 2441bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber data.read(uuid, sizeof(uuid)); 2451bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber reply->writeInt32(isCryptoSchemeSupported(uuid)); 246ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 247ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber return OK; 248ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 249ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 2501bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber case CREATE_PLUGIN: 251ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber { 252ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber CHECK_INTERFACE(ICrypto, data, reply); 253ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 2541bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber uint8_t uuid[16]; 2551bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber data.read(uuid, sizeof(uuid)); 2561bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 2571bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber size_t opaqueSize = data.readInt32(); 258705868c0f2a6e85a39addefe4db9f2130627c219Andreas Huber void *opaqueData = NULL; 259705868c0f2a6e85a39addefe4db9f2130627c219Andreas Huber 2609247e10531fa3128d5263e3ad605a0fecefcd2d0Edwin Wong const size_t kMaxOpaqueSize = 100 * 1024; 2619247e10531fa3128d5263e3ad605a0fecefcd2d0Edwin Wong if (opaqueSize > kMaxOpaqueSize) { 2629247e10531fa3128d5263e3ad605a0fecefcd2d0Edwin Wong return BAD_VALUE; 2639247e10531fa3128d5263e3ad605a0fecefcd2d0Edwin Wong } 2649247e10531fa3128d5263e3ad605a0fecefcd2d0Edwin Wong 2659247e10531fa3128d5263e3ad605a0fecefcd2d0Edwin Wong opaqueData = malloc(opaqueSize); 2669247e10531fa3128d5263e3ad605a0fecefcd2d0Edwin Wong if (NULL == opaqueData) { 2679247e10531fa3128d5263e3ad605a0fecefcd2d0Edwin Wong return NO_MEMORY; 268705868c0f2a6e85a39addefe4db9f2130627c219Andreas Huber } 269ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 2709247e10531fa3128d5263e3ad605a0fecefcd2d0Edwin Wong data.read(opaqueData, opaqueSize); 2711bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber reply->writeInt32(createPlugin(uuid, opaqueData, opaqueSize)); 272ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 2739247e10531fa3128d5263e3ad605a0fecefcd2d0Edwin Wong free(opaqueData); 2749247e10531fa3128d5263e3ad605a0fecefcd2d0Edwin Wong opaqueData = NULL; 275ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 276ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber return OK; 277ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 278ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 2791bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber case DESTROY_PLUGIN: 280ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber { 281ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber CHECK_INTERFACE(ICrypto, data, reply); 2821bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber reply->writeInt32(destroyPlugin()); 283ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 284ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber return OK; 285ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 286ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 2871bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber case REQUIRES_SECURE_COMPONENT: 288ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber { 289ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber CHECK_INTERFACE(ICrypto, data, reply); 290ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 2911bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber const char *mime = data.readCString(); 2922afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia if (mime == NULL) { 2932afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia reply->writeInt32(BAD_VALUE); 2942afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia } else { 2952afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia reply->writeInt32(requiresSecureDecoderComponent(mime)); 2962afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia } 297ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 2981bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber return OK; 2991bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber } 300ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 3011bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber case DECRYPT: 3021bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber { 3031bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber CHECK_INTERFACE(ICrypto, data, reply); 304ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 3051bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber CryptoPlugin::Mode mode = (CryptoPlugin::Mode)data.readInt32(); 30618cb1eca504817b5b144a023ae2792d90e74c9a5Jeff Tinker CryptoPlugin::Pattern pattern; 30718cb1eca504817b5b144a023ae2792d90e74c9a5Jeff Tinker pattern.mEncryptBlocks = data.readInt32(); 30818cb1eca504817b5b144a023ae2792d90e74c9a5Jeff Tinker pattern.mSkipBlocks = data.readInt32(); 309ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 3101bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber uint8_t key[16]; 3111bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber data.read(key, sizeof(key)); 312ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 3131bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber uint8_t iv[16]; 3141bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber data.read(iv, sizeof(iv)); 315ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 3161bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber size_t totalSize = data.readInt32(); 317a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker sp<IMemory> source = 318c481b5012a5f6cf72e5e93b36f1ed4c9169916f2Jeff Tinker interface_cast<IMemory>(data.readStrongBinder()); 319a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (source == NULL) { 3202afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia reply->writeInt32(BAD_VALUE); 3212afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia return OK; 3222afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia } 323c481b5012a5f6cf72e5e93b36f1ed4c9169916f2Jeff Tinker int32_t offset = data.readInt32(); 324ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 3251bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber int32_t numSubSamples = data.readInt32(); 3264183d539fd9528d79d2c740769d01233b19017a1Jeff Tinker if (numSubSamples < 0 || numSubSamples > 0xffff) { 3274183d539fd9528d79d2c740769d01233b19017a1Jeff Tinker reply->writeInt32(BAD_VALUE); 3284183d539fd9528d79d2c740769d01233b19017a1Jeff Tinker return OK; 3294183d539fd9528d79d2c740769d01233b19017a1Jeff Tinker } 330ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 3311bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber CryptoPlugin::SubSample *subSamples = 332a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker new CryptoPlugin::SubSample[numSubSamples]; 333ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 334a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker data.read(subSamples, 3351bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber sizeof(CryptoPlugin::SubSample) * numSubSamples); 336ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 337a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DestinationBuffer destination; 338a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker destination.mType = (DestinationType)data.readInt32(); 339a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (destination.mType == kDestinationTypeNativeHandle) { 340a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker destination.mHandle = data.readNativeHandle(); 341a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (destination.mHandle == NULL) { 342a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker reply->writeInt32(BAD_VALUE); 343a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return OK; 344a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 345a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } else if (destination.mType == kDestinationTypeSharedMemory) { 346a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker destination.mSharedMemory = 347a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker interface_cast<IMemory>(data.readStrongBinder()); 348a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (destination.mSharedMemory == NULL) { 349a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker reply->writeInt32(BAD_VALUE); 350a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return OK; 351a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 352ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 353ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 3545b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber AString errorDetailMsg; 355c481b5012a5f6cf72e5e93b36f1ed4c9169916f2Jeff Tinker ssize_t result; 356c481b5012a5f6cf72e5e93b36f1ed4c9169916f2Jeff Tinker 357c6fc6a3ca618b0e72ee565ded2e4960797f53fa6Jeff Tinker size_t sumSubsampleSizes = 0; 358c6fc6a3ca618b0e72ee565ded2e4960797f53fa6Jeff Tinker bool overflow = false; 359c6fc6a3ca618b0e72ee565ded2e4960797f53fa6Jeff Tinker for (int32_t i = 0; i < numSubSamples; ++i) { 360c6fc6a3ca618b0e72ee565ded2e4960797f53fa6Jeff Tinker CryptoPlugin::SubSample &ss = subSamples[i]; 361c6fc6a3ca618b0e72ee565ded2e4960797f53fa6Jeff Tinker if (sumSubsampleSizes <= SIZE_MAX - ss.mNumBytesOfEncryptedData) { 362c6fc6a3ca618b0e72ee565ded2e4960797f53fa6Jeff Tinker sumSubsampleSizes += ss.mNumBytesOfEncryptedData; 363c6fc6a3ca618b0e72ee565ded2e4960797f53fa6Jeff Tinker } else { 364c6fc6a3ca618b0e72ee565ded2e4960797f53fa6Jeff Tinker overflow = true; 365c6fc6a3ca618b0e72ee565ded2e4960797f53fa6Jeff Tinker } 366c6fc6a3ca618b0e72ee565ded2e4960797f53fa6Jeff Tinker if (sumSubsampleSizes <= SIZE_MAX - ss.mNumBytesOfClearData) { 367c6fc6a3ca618b0e72ee565ded2e4960797f53fa6Jeff Tinker sumSubsampleSizes += ss.mNumBytesOfClearData; 368c6fc6a3ca618b0e72ee565ded2e4960797f53fa6Jeff Tinker } else { 369c6fc6a3ca618b0e72ee565ded2e4960797f53fa6Jeff Tinker overflow = true; 370c6fc6a3ca618b0e72ee565ded2e4960797f53fa6Jeff Tinker } 371c6fc6a3ca618b0e72ee565ded2e4960797f53fa6Jeff Tinker } 372c6fc6a3ca618b0e72ee565ded2e4960797f53fa6Jeff Tinker 373c6fc6a3ca618b0e72ee565ded2e4960797f53fa6Jeff Tinker if (overflow || sumSubsampleSizes != totalSize) { 374c6fc6a3ca618b0e72ee565ded2e4960797f53fa6Jeff Tinker result = -EINVAL; 375a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } else if (totalSize > source->size()) { 376bb4877d143c6c7ec9b42e3c490fed58af4f39deaJeff Tinker result = -EINVAL; 377a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } else if ((size_t)offset > source->size() - totalSize) { 378c481b5012a5f6cf72e5e93b36f1ed4c9169916f2Jeff Tinker result = -EINVAL; 379c481b5012a5f6cf72e5e93b36f1ed4c9169916f2Jeff Tinker } else { 380a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker result = decrypt(key, iv, mode, pattern, source, offset, 381a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker subSamples, numSubSamples, destination, &errorDetailMsg); 382c481b5012a5f6cf72e5e93b36f1ed4c9169916f2Jeff Tinker } 383ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 384fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong reply->writeInt32(result); 385ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 386ceffd8cc911bd2e685b525f838cd3d8198ab35cfJeff Tinker if (isCryptoError(result)) { 3875b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber reply->writeCString(errorDetailMsg.c_str()); 3885b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber } 3895b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber 390a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (destination.mType == kDestinationTypeNativeHandle) { 3919ac86b3cae9a1e14b12bf97223ddde96142aae43Jeff Tinker int err; 392a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if ((err = native_handle_close(destination.mHandle)) < 0) { 3939ac86b3cae9a1e14b12bf97223ddde96142aae43Jeff Tinker ALOGW("secure buffer native_handle_close failed: %d", err); 3949ac86b3cae9a1e14b12bf97223ddde96142aae43Jeff Tinker } 395a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if ((err = native_handle_delete(destination.mHandle)) < 0) { 3969ac86b3cae9a1e14b12bf97223ddde96142aae43Jeff Tinker ALOGW("secure buffer native_handle_delete failed: %d", err); 3979ac86b3cae9a1e14b12bf97223ddde96142aae43Jeff Tinker } 398ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 399ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 4001bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber delete[] subSamples; 4011bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber subSamples = NULL; 402ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 403ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber return OK; 404ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 405ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 4062514d080c8a54ff603a45d7e336de668fe7329dbJeff Tinker case NOTIFY_RESOLUTION: 4072514d080c8a54ff603a45d7e336de668fe7329dbJeff Tinker { 4082514d080c8a54ff603a45d7e336de668fe7329dbJeff Tinker CHECK_INTERFACE(ICrypto, data, reply); 4092514d080c8a54ff603a45d7e336de668fe7329dbJeff Tinker 4102514d080c8a54ff603a45d7e336de668fe7329dbJeff Tinker int32_t width = data.readInt32(); 4112514d080c8a54ff603a45d7e336de668fe7329dbJeff Tinker int32_t height = data.readInt32(); 4122514d080c8a54ff603a45d7e336de668fe7329dbJeff Tinker notifyResolution(width, height); 4132514d080c8a54ff603a45d7e336de668fe7329dbJeff Tinker 4142514d080c8a54ff603a45d7e336de668fe7329dbJeff Tinker return OK; 4152514d080c8a54ff603a45d7e336de668fe7329dbJeff Tinker } 4162514d080c8a54ff603a45d7e336de668fe7329dbJeff Tinker 4171849570240443d1f75775c205fa658f7070849c6Jeff Tinker case SET_MEDIADRM_SESSION: 4181849570240443d1f75775c205fa658f7070849c6Jeff Tinker { 4191849570240443d1f75775c205fa658f7070849c6Jeff Tinker CHECK_INTERFACE(IDrm, data, reply); 4201849570240443d1f75775c205fa658f7070849c6Jeff Tinker Vector<uint8_t> sessionId; 4211849570240443d1f75775c205fa658f7070849c6Jeff Tinker readVector(data, sessionId); 4221849570240443d1f75775c205fa658f7070849c6Jeff Tinker reply->writeInt32(setMediaDrmSession(sessionId)); 4231849570240443d1f75775c205fa658f7070849c6Jeff Tinker return OK; 4241849570240443d1f75775c205fa658f7070849c6Jeff Tinker } 4251849570240443d1f75775c205fa658f7070849c6Jeff Tinker 426d07c92742fc5801cab8e99801f591365986acbe9Chong Zhang case SET_HEAP: 427d07c92742fc5801cab8e99801f591365986acbe9Chong Zhang { 428d07c92742fc5801cab8e99801f591365986acbe9Chong Zhang CHECK_INTERFACE(ICrypto, data, reply); 429d07c92742fc5801cab8e99801f591365986acbe9Chong Zhang sp<IMemoryHeap> heap = 430d07c92742fc5801cab8e99801f591365986acbe9Chong Zhang interface_cast<IMemoryHeap>(data.readStrongBinder()); 431d07c92742fc5801cab8e99801f591365986acbe9Chong Zhang setHeap(heap); 432d07c92742fc5801cab8e99801f591365986acbe9Chong Zhang return OK; 433d07c92742fc5801cab8e99801f591365986acbe9Chong Zhang } 434d07c92742fc5801cab8e99801f591365986acbe9Chong Zhang 435d07c92742fc5801cab8e99801f591365986acbe9Chong Zhang case UNSET_HEAP: 436d07c92742fc5801cab8e99801f591365986acbe9Chong Zhang { 437d07c92742fc5801cab8e99801f591365986acbe9Chong Zhang CHECK_INTERFACE(ICrypto, data, reply); 438d07c92742fc5801cab8e99801f591365986acbe9Chong Zhang sp<IMemoryHeap> heap = 439d07c92742fc5801cab8e99801f591365986acbe9Chong Zhang interface_cast<IMemoryHeap>(data.readStrongBinder()); 440d07c92742fc5801cab8e99801f591365986acbe9Chong Zhang unsetHeap(heap); 441d07c92742fc5801cab8e99801f591365986acbe9Chong Zhang return OK; 442d07c92742fc5801cab8e99801f591365986acbe9Chong Zhang } 443d07c92742fc5801cab8e99801f591365986acbe9Chong Zhang 444ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber default: 445ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber return BBinder::onTransact(code, data, reply, flags); 446ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 447ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber} 448ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 449ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber} // namespace android 450