ICrypto.cpp revision 1849570240443d1f75775c205fa658f7070849c6
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, 39ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber}; 40ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 41ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huberstruct BpCrypto : public BpInterface<ICrypto> { 42ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber BpCrypto(const sp<IBinder> &impl) 43ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber : BpInterface<ICrypto>(impl) { 44ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 45ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 461bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber virtual status_t initCheck() const { 47ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber Parcel data, reply; 48ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber data.writeInterfaceToken(ICrypto::getInterfaceDescriptor()); 491bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber remote()->transact(INIT_CHECK, data, &reply); 50ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 51ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber return reply.readInt32(); 52ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 53ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 54bafb682ec7f51486e751fea954169deb91846063Jeff Tinker virtual bool isCryptoSchemeSupported(const uint8_t uuid[16]) { 55ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber Parcel data, reply; 56ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber data.writeInterfaceToken(ICrypto::getInterfaceDescriptor()); 571bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber data.write(uuid, 16); 581bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber remote()->transact(IS_CRYPTO_SUPPORTED, data, &reply); 59ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 601bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber return reply.readInt32() != 0; 61ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 62ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 631bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber virtual status_t createPlugin( 641bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber const uint8_t uuid[16], const void *opaqueData, size_t opaqueSize) { 65ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber Parcel data, reply; 66ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber data.writeInterfaceToken(ICrypto::getInterfaceDescriptor()); 671bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber data.write(uuid, 16); 681bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber data.writeInt32(opaqueSize); 69705868c0f2a6e85a39addefe4db9f2130627c219Andreas Huber 70705868c0f2a6e85a39addefe4db9f2130627c219Andreas Huber if (opaqueSize > 0) { 71705868c0f2a6e85a39addefe4db9f2130627c219Andreas Huber data.write(opaqueData, opaqueSize); 72705868c0f2a6e85a39addefe4db9f2130627c219Andreas Huber } 73705868c0f2a6e85a39addefe4db9f2130627c219Andreas Huber 741bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber remote()->transact(CREATE_PLUGIN, data, &reply); 75ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 76ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber return reply.readInt32(); 77ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 78ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 791bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber virtual status_t destroyPlugin() { 80ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber Parcel data, reply; 81ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber data.writeInterfaceToken(ICrypto::getInterfaceDescriptor()); 821bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber remote()->transact(DESTROY_PLUGIN, data, &reply); 83ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 84ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber return reply.readInt32(); 85ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 86ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 871bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber virtual bool requiresSecureDecoderComponent( 881bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber const char *mime) const { 89ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber Parcel data, reply; 90ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber data.writeInterfaceToken(ICrypto::getInterfaceDescriptor()); 911bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber data.writeCString(mime); 921bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber remote()->transact(REQUIRES_SECURE_COMPONENT, data, &reply); 93ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 941bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber return reply.readInt32() != 0; 95ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 96ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 97fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong virtual ssize_t decrypt( 981bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber bool secure, 991bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber const uint8_t key[16], 1001bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber const uint8_t iv[16], 1011bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber CryptoPlugin::Mode mode, 102c481b5012a5f6cf72e5e93b36f1ed4c9169916f2Jeff Tinker const sp<IMemory> &sharedBuffer, size_t offset, 1031bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber const CryptoPlugin::SubSample *subSamples, size_t numSubSamples, 1045b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber void *dstPtr, 1055b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber AString *errorDetailMsg) { 106ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber Parcel data, reply; 107ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber data.writeInterfaceToken(ICrypto::getInterfaceDescriptor()); 1081bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber data.writeInt32(secure); 1091bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber data.writeInt32(mode); 1104b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 1114b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber static const uint8_t kDummy[16] = { 0 }; 1124b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 1134b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber if (key == NULL) { 1144b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber key = kDummy; 1154b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber } 1164b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 1174b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber if (iv == NULL) { 1184b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber iv = kDummy; 1194b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber } 1204b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 1211bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber data.write(key, 16); 1221bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber data.write(iv, 16); 1231bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 1241bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber size_t totalSize = 0; 1251bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber for (size_t i = 0; i < numSubSamples; ++i) { 1261bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber totalSize += subSamples[i].mNumBytesOfEncryptedData; 1271bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber totalSize += subSamples[i].mNumBytesOfClearData; 128ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 129ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 1301bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber data.writeInt32(totalSize); 131c481b5012a5f6cf72e5e93b36f1ed4c9169916f2Jeff Tinker data.writeStrongBinder(IInterface::asBinder(sharedBuffer)); 132c481b5012a5f6cf72e5e93b36f1ed4c9169916f2Jeff Tinker data.writeInt32(offset); 1331bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 1341bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber data.writeInt32(numSubSamples); 1351bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber data.write(subSamples, sizeof(CryptoPlugin::SubSample) * numSubSamples); 1361bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 1371bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber if (secure) { 138bcca9e072c1f288a53ce6862936f57dc36488f96Jeff Tinker data.writeInt64(static_cast<uint64_t>(reinterpret_cast<uintptr_t>(dstPtr))); 1391bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber } 140ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 1411bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber remote()->transact(DECRYPT, data, &reply); 142ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 143fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong ssize_t result = reply.readInt32(); 144ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 1455b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber if (result >= ERROR_DRM_VENDOR_MIN && result <= ERROR_DRM_VENDOR_MAX) { 1465b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber errorDetailMsg->setTo(reply.readCString()); 1475b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber } 1485b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber 149fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong if (!secure && result >= 0) { 150fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong reply.read(dstPtr, result); 151ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 152ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 153fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong return result; 154ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 155ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 1562514d080c8a54ff603a45d7e336de668fe7329dbJeff Tinker virtual void notifyResolution( 1572514d080c8a54ff603a45d7e336de668fe7329dbJeff Tinker uint32_t width, uint32_t height) { 1582514d080c8a54ff603a45d7e336de668fe7329dbJeff Tinker Parcel data, reply; 1592514d080c8a54ff603a45d7e336de668fe7329dbJeff Tinker data.writeInterfaceToken(ICrypto::getInterfaceDescriptor()); 1602514d080c8a54ff603a45d7e336de668fe7329dbJeff Tinker data.writeInt32(width); 1612514d080c8a54ff603a45d7e336de668fe7329dbJeff Tinker data.writeInt32(height); 1622514d080c8a54ff603a45d7e336de668fe7329dbJeff Tinker remote()->transact(NOTIFY_RESOLUTION, data, &reply); 1632514d080c8a54ff603a45d7e336de668fe7329dbJeff Tinker } 1642514d080c8a54ff603a45d7e336de668fe7329dbJeff Tinker 1651849570240443d1f75775c205fa658f7070849c6Jeff Tinker virtual status_t setMediaDrmSession(const Vector<uint8_t> &sessionId) { 1661849570240443d1f75775c205fa658f7070849c6Jeff Tinker Parcel data, reply; 1671849570240443d1f75775c205fa658f7070849c6Jeff Tinker data.writeInterfaceToken(ICrypto::getInterfaceDescriptor()); 1681849570240443d1f75775c205fa658f7070849c6Jeff Tinker 1691849570240443d1f75775c205fa658f7070849c6Jeff Tinker writeVector(data, sessionId); 1701849570240443d1f75775c205fa658f7070849c6Jeff Tinker remote()->transact(SET_MEDIADRM_SESSION, data, &reply); 1711849570240443d1f75775c205fa658f7070849c6Jeff Tinker 1721849570240443d1f75775c205fa658f7070849c6Jeff Tinker return reply.readInt32(); 1731849570240443d1f75775c205fa658f7070849c6Jeff Tinker } 1741849570240443d1f75775c205fa658f7070849c6Jeff Tinker 175ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huberprivate: 1761849570240443d1f75775c205fa658f7070849c6Jeff Tinker void readVector(Parcel &reply, Vector<uint8_t> &vector) const { 1771849570240443d1f75775c205fa658f7070849c6Jeff Tinker uint32_t size = reply.readInt32(); 1781849570240443d1f75775c205fa658f7070849c6Jeff Tinker vector.insertAt((size_t)0, size); 1791849570240443d1f75775c205fa658f7070849c6Jeff Tinker reply.read(vector.editArray(), size); 1801849570240443d1f75775c205fa658f7070849c6Jeff Tinker } 1811849570240443d1f75775c205fa658f7070849c6Jeff Tinker 1821849570240443d1f75775c205fa658f7070849c6Jeff Tinker void writeVector(Parcel &data, Vector<uint8_t> const &vector) const { 1831849570240443d1f75775c205fa658f7070849c6Jeff Tinker data.writeInt32(vector.size()); 1841849570240443d1f75775c205fa658f7070849c6Jeff Tinker data.write(vector.array(), vector.size()); 1851849570240443d1f75775c205fa658f7070849c6Jeff Tinker } 1861849570240443d1f75775c205fa658f7070849c6Jeff Tinker 187ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(BpCrypto); 188ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber}; 189ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 190ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas HuberIMPLEMENT_META_INTERFACE(Crypto, "android.hardware.ICrypto"); 191ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 192ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber//////////////////////////////////////////////////////////////////////////////// 193ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 1941849570240443d1f75775c205fa658f7070849c6Jeff Tinkervoid BnCrypto::readVector(const Parcel &data, Vector<uint8_t> &vector) const { 1951849570240443d1f75775c205fa658f7070849c6Jeff Tinker uint32_t size = data.readInt32(); 1961849570240443d1f75775c205fa658f7070849c6Jeff Tinker vector.insertAt((size_t)0, size); 1971849570240443d1f75775c205fa658f7070849c6Jeff Tinker data.read(vector.editArray(), size); 1981849570240443d1f75775c205fa658f7070849c6Jeff Tinker} 1991849570240443d1f75775c205fa658f7070849c6Jeff Tinker 2001849570240443d1f75775c205fa658f7070849c6Jeff Tinkervoid BnCrypto::writeVector(Parcel *reply, Vector<uint8_t> const &vector) const { 2011849570240443d1f75775c205fa658f7070849c6Jeff Tinker reply->writeInt32(vector.size()); 2021849570240443d1f75775c205fa658f7070849c6Jeff Tinker reply->write(vector.array(), vector.size()); 2031849570240443d1f75775c205fa658f7070849c6Jeff Tinker} 2041849570240443d1f75775c205fa658f7070849c6Jeff Tinker 205ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huberstatus_t BnCrypto::onTransact( 206ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) { 207ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber switch (code) { 2081bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber case INIT_CHECK: 209ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber { 210ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber CHECK_INTERFACE(ICrypto, data, reply); 2111bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber reply->writeInt32(initCheck()); 212ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 213ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber return OK; 214ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 215ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 2161bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber case IS_CRYPTO_SUPPORTED: 217ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber { 218ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber CHECK_INTERFACE(ICrypto, data, reply); 2191bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber uint8_t uuid[16]; 2201bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber data.read(uuid, sizeof(uuid)); 2211bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber reply->writeInt32(isCryptoSchemeSupported(uuid)); 222ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 223ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber return OK; 224ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 225ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 2261bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber case CREATE_PLUGIN: 227ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber { 228ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber CHECK_INTERFACE(ICrypto, data, reply); 229ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 2301bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber uint8_t uuid[16]; 2311bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber data.read(uuid, sizeof(uuid)); 2321bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 2331bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber size_t opaqueSize = data.readInt32(); 234705868c0f2a6e85a39addefe4db9f2130627c219Andreas Huber void *opaqueData = NULL; 235705868c0f2a6e85a39addefe4db9f2130627c219Andreas Huber 236705868c0f2a6e85a39addefe4db9f2130627c219Andreas Huber if (opaqueSize > 0) { 237705868c0f2a6e85a39addefe4db9f2130627c219Andreas Huber opaqueData = malloc(opaqueSize); 238705868c0f2a6e85a39addefe4db9f2130627c219Andreas Huber data.read(opaqueData, opaqueSize); 239705868c0f2a6e85a39addefe4db9f2130627c219Andreas Huber } 240ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 2411bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber reply->writeInt32(createPlugin(uuid, opaqueData, opaqueSize)); 242ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 243705868c0f2a6e85a39addefe4db9f2130627c219Andreas Huber if (opaqueData != NULL) { 244705868c0f2a6e85a39addefe4db9f2130627c219Andreas Huber free(opaqueData); 245705868c0f2a6e85a39addefe4db9f2130627c219Andreas Huber opaqueData = NULL; 246705868c0f2a6e85a39addefe4db9f2130627c219Andreas Huber } 247ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 248ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber return OK; 249ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 250ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 2511bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber case DESTROY_PLUGIN: 252ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber { 253ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber CHECK_INTERFACE(ICrypto, data, reply); 2541bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber reply->writeInt32(destroyPlugin()); 255ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 256ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber return OK; 257ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 258ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 2591bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber case REQUIRES_SECURE_COMPONENT: 260ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber { 261ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber CHECK_INTERFACE(ICrypto, data, reply); 262ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 2631bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber const char *mime = data.readCString(); 2641bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber reply->writeInt32(requiresSecureDecoderComponent(mime)); 265ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 2661bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber return OK; 2671bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber } 268ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 2691bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber case DECRYPT: 2701bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber { 2711bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber CHECK_INTERFACE(ICrypto, data, reply); 272ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 2731bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber bool secure = data.readInt32() != 0; 2741bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber CryptoPlugin::Mode mode = (CryptoPlugin::Mode)data.readInt32(); 275ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 2761bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber uint8_t key[16]; 2771bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber data.read(key, sizeof(key)); 278ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 2791bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber uint8_t iv[16]; 2801bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber data.read(iv, sizeof(iv)); 281ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 2821bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber size_t totalSize = data.readInt32(); 283c481b5012a5f6cf72e5e93b36f1ed4c9169916f2Jeff Tinker sp<IMemory> sharedBuffer = 284c481b5012a5f6cf72e5e93b36f1ed4c9169916f2Jeff Tinker interface_cast<IMemory>(data.readStrongBinder()); 285c481b5012a5f6cf72e5e93b36f1ed4c9169916f2Jeff Tinker int32_t offset = data.readInt32(); 286ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 2871bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber int32_t numSubSamples = data.readInt32(); 288ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 2891bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber CryptoPlugin::SubSample *subSamples = 2901bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber new CryptoPlugin::SubSample[numSubSamples]; 291ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 2921bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber data.read( 2931bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber subSamples, 2941bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber sizeof(CryptoPlugin::SubSample) * numSubSamples); 295ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 2961bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber void *dstPtr; 2971bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber if (secure) { 298bcca9e072c1f288a53ce6862936f57dc36488f96Jeff Tinker dstPtr = reinterpret_cast<void *>(static_cast<uintptr_t>(data.readInt64())); 2991bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber } else { 3001bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber dstPtr = malloc(totalSize); 301ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 302ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 3035b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber AString errorDetailMsg; 304c481b5012a5f6cf72e5e93b36f1ed4c9169916f2Jeff Tinker ssize_t result; 305c481b5012a5f6cf72e5e93b36f1ed4c9169916f2Jeff Tinker 306c481b5012a5f6cf72e5e93b36f1ed4c9169916f2Jeff Tinker if (offset + totalSize > sharedBuffer->size()) { 307c481b5012a5f6cf72e5e93b36f1ed4c9169916f2Jeff Tinker result = -EINVAL; 308c481b5012a5f6cf72e5e93b36f1ed4c9169916f2Jeff Tinker } else { 309c481b5012a5f6cf72e5e93b36f1ed4c9169916f2Jeff Tinker result = decrypt( 3101bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber secure, 3111bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber key, 3121bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber iv, 3131bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber mode, 314c481b5012a5f6cf72e5e93b36f1ed4c9169916f2Jeff Tinker sharedBuffer, offset, 3151bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber subSamples, numSubSamples, 3165b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber dstPtr, 3175b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber &errorDetailMsg); 318c481b5012a5f6cf72e5e93b36f1ed4c9169916f2Jeff Tinker } 319ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 320fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong reply->writeInt32(result); 321ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 322fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong if (result >= ERROR_DRM_VENDOR_MIN 323fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong && result <= ERROR_DRM_VENDOR_MAX) { 3245b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber reply->writeCString(errorDetailMsg.c_str()); 3255b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber } 3265b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber 3271bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber if (!secure) { 328fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong if (result >= 0) { 329fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong CHECK_LE(result, static_cast<ssize_t>(totalSize)); 330fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong reply->write(dstPtr, result); 3311bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber } 3321bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber free(dstPtr); 3331bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber dstPtr = NULL; 334ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 335ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 3361bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber delete[] subSamples; 3371bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber subSamples = NULL; 338ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 339ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber return OK; 340ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 341ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 3422514d080c8a54ff603a45d7e336de668fe7329dbJeff Tinker case NOTIFY_RESOLUTION: 3432514d080c8a54ff603a45d7e336de668fe7329dbJeff Tinker { 3442514d080c8a54ff603a45d7e336de668fe7329dbJeff Tinker CHECK_INTERFACE(ICrypto, data, reply); 3452514d080c8a54ff603a45d7e336de668fe7329dbJeff Tinker 3462514d080c8a54ff603a45d7e336de668fe7329dbJeff Tinker int32_t width = data.readInt32(); 3472514d080c8a54ff603a45d7e336de668fe7329dbJeff Tinker int32_t height = data.readInt32(); 3482514d080c8a54ff603a45d7e336de668fe7329dbJeff Tinker notifyResolution(width, height); 3492514d080c8a54ff603a45d7e336de668fe7329dbJeff Tinker 3502514d080c8a54ff603a45d7e336de668fe7329dbJeff Tinker return OK; 3512514d080c8a54ff603a45d7e336de668fe7329dbJeff Tinker } 3522514d080c8a54ff603a45d7e336de668fe7329dbJeff Tinker 3531849570240443d1f75775c205fa658f7070849c6Jeff Tinker case SET_MEDIADRM_SESSION: 3541849570240443d1f75775c205fa658f7070849c6Jeff Tinker { 3551849570240443d1f75775c205fa658f7070849c6Jeff Tinker CHECK_INTERFACE(IDrm, data, reply); 3561849570240443d1f75775c205fa658f7070849c6Jeff Tinker Vector<uint8_t> sessionId; 3571849570240443d1f75775c205fa658f7070849c6Jeff Tinker readVector(data, sessionId); 3581849570240443d1f75775c205fa658f7070849c6Jeff Tinker reply->writeInt32(setMediaDrmSession(sessionId)); 3591849570240443d1f75775c205fa658f7070849c6Jeff Tinker return OK; 3601849570240443d1f75775c205fa658f7070849c6Jeff Tinker } 3611849570240443d1f75775c205fa658f7070849c6Jeff Tinker 362ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber default: 363ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber return BBinder::onTransact(code, data, reply, flags); 364ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 365ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber} 366ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 367ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber} // namespace android 368