IHDCP.cpp revision a6a88d9c445e261972c2433254e0a996336e78a4
11b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber/* 21b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber * Copyright (C) 2012 The Android Open Source Project 31b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber * 41b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 51b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber * you may not use this file except in compliance with the License. 61b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber * You may obtain a copy of the License at 71b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber * 81b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 91b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber * 101b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber * Unless required by applicable law or agreed to in writing, software 111b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 121b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber * See the License for the specific language governing permissions and 141b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber * limitations under the License. 151b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber */ 161b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 171b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber//#define LOG_NDEBUG 0 181b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber#define LOG_TAG "IHDCP" 191b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber#include <utils/Log.h> 201b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 211b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber#include <binder/Parcel.h> 221b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber#include <media/IHDCP.h> 231b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber#include <media/stagefright/MediaErrors.h> 241b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber#include <media/stagefright/foundation/ADebug.h> 251b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 261b19c9d120869c3182373a9b06a1ed98898df882Andreas Hubernamespace android { 271b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 281b19c9d120869c3182373a9b06a1ed98898df882Andreas Huberenum { 291b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber OBSERVER_NOTIFY = IBinder::FIRST_CALL_TRANSACTION, 301b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber HDCP_SET_OBSERVER, 311b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber HDCP_INIT_ASYNC, 321b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber HDCP_SHUTDOWN_ASYNC, 331b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber HDCP_ENCRYPT, 34a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber HDCP_DECRYPT, 351b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber}; 361b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 371b19c9d120869c3182373a9b06a1ed98898df882Andreas Huberstruct BpHDCPObserver : public BpInterface<IHDCPObserver> { 381b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber BpHDCPObserver(const sp<IBinder> &impl) 391b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber : BpInterface<IHDCPObserver>(impl) { 401b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber } 411b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 421b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber virtual void notify( 431b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber int msg, int ext1, int ext2, const Parcel *obj) { 441b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber Parcel data, reply; 451b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber data.writeInterfaceToken(IHDCPObserver::getInterfaceDescriptor()); 461b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber data.writeInt32(msg); 471b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber data.writeInt32(ext1); 481b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber data.writeInt32(ext2); 491b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber if (obj && obj->dataSize() > 0) { 501b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber data.appendFrom(const_cast<Parcel *>(obj), 0, obj->dataSize()); 511b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber } 521b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber remote()->transact(OBSERVER_NOTIFY, data, &reply, IBinder::FLAG_ONEWAY); 531b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber } 541b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber}; 551b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 561b19c9d120869c3182373a9b06a1ed98898df882Andreas HuberIMPLEMENT_META_INTERFACE(HDCPObserver, "android.hardware.IHDCPObserver"); 571b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 581b19c9d120869c3182373a9b06a1ed98898df882Andreas Huberstruct BpHDCP : public BpInterface<IHDCP> { 591b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber BpHDCP(const sp<IBinder> &impl) 601b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber : BpInterface<IHDCP>(impl) { 611b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber } 621b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 631b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber virtual status_t setObserver(const sp<IHDCPObserver> &observer) { 641b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber Parcel data, reply; 651b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber data.writeInterfaceToken(IHDCP::getInterfaceDescriptor()); 661b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber data.writeStrongBinder(observer->asBinder()); 671b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber remote()->transact(HDCP_SET_OBSERVER, data, &reply); 681b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber return reply.readInt32(); 691b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber } 701b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 711b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber virtual status_t initAsync(const char *host, unsigned port) { 721b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber Parcel data, reply; 731b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber data.writeInterfaceToken(IHDCP::getInterfaceDescriptor()); 741b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber data.writeCString(host); 751b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber data.writeInt32(port); 761b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber remote()->transact(HDCP_INIT_ASYNC, data, &reply); 771b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber return reply.readInt32(); 781b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber } 791b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 801b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber virtual status_t shutdownAsync() { 811b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber Parcel data, reply; 821b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber data.writeInterfaceToken(IHDCP::getInterfaceDescriptor()); 831b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber remote()->transact(HDCP_SHUTDOWN_ASYNC, data, &reply); 841b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber return reply.readInt32(); 851b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber } 861b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 871b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber virtual status_t encrypt( 881b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber const void *inData, size_t size, uint32_t streamCTR, 891b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber uint64_t *outInputCTR, void *outData) { 901b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber Parcel data, reply; 911b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber data.writeInterfaceToken(IHDCP::getInterfaceDescriptor()); 921b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber data.writeInt32(size); 931b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber data.write(inData, size); 941b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber data.writeInt32(streamCTR); 951b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber remote()->transact(HDCP_ENCRYPT, data, &reply); 961b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 971b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber status_t err = reply.readInt32(); 981b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 991b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber if (err != OK) { 1001b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber *outInputCTR = 0; 1011b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 1021b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber return err; 1031b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber } 1041b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 1051b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber *outInputCTR = reply.readInt64(); 1061b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber reply.read(outData, size); 1071b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 1081b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber return err; 1091b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber } 110a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber 111a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber virtual status_t decrypt( 112a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber const void *inData, size_t size, 113a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber uint32_t streamCTR, uint64_t inputCTR, 114a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber void *outData) { 115a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber Parcel data, reply; 116a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber data.writeInterfaceToken(IHDCP::getInterfaceDescriptor()); 117a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber data.writeInt32(size); 118a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber data.write(inData, size); 119a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber data.writeInt32(streamCTR); 120a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber data.writeInt64(inputCTR); 121a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber remote()->transact(HDCP_DECRYPT, data, &reply); 122a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber 123a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber status_t err = reply.readInt32(); 124a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber 125a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber if (err != OK) { 126a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber return err; 127a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber } 128a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber 129a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber reply.read(outData, size); 130a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber 131a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber return err; 132a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber } 1331b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber}; 1341b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 1351b19c9d120869c3182373a9b06a1ed98898df882Andreas HuberIMPLEMENT_META_INTERFACE(HDCP, "android.hardware.IHDCP"); 1361b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 1371b19c9d120869c3182373a9b06a1ed98898df882Andreas Huberstatus_t BnHDCPObserver::onTransact( 1381b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) { 1391b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber switch (code) { 1401b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber case OBSERVER_NOTIFY: 1411b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber { 1421b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber CHECK_INTERFACE(IHDCPObserver, data, reply); 1431b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 1441b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber int msg = data.readInt32(); 1451b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber int ext1 = data.readInt32(); 1461b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber int ext2 = data.readInt32(); 1471b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 1481b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber Parcel obj; 1491b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber if (data.dataAvail() > 0) { 1501b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber obj.appendFrom( 1511b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber const_cast<Parcel *>(&data), 1521b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber data.dataPosition(), 1531b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber data.dataAvail()); 1541b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber } 1551b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 1561b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber notify(msg, ext1, ext2, &obj); 1571b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 1581b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber return OK; 1591b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber } 1601b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 1611b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber default: 1621b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber return BBinder::onTransact(code, data, reply, flags); 1631b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber } 1641b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber} 1651b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 1661b19c9d120869c3182373a9b06a1ed98898df882Andreas Huberstatus_t BnHDCP::onTransact( 1671b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) { 1681b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber switch (code) { 1691b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber case HDCP_SET_OBSERVER: 1701b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber { 1711b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber CHECK_INTERFACE(IHDCP, data, reply); 1721b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 1731b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber sp<IHDCPObserver> observer = 1741b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber interface_cast<IHDCPObserver>(data.readStrongBinder()); 1751b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 1761b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber reply->writeInt32(setObserver(observer)); 1771b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber return OK; 1781b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber } 1791b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 1801b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber case HDCP_INIT_ASYNC: 1811b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber { 1821b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber CHECK_INTERFACE(IHDCP, data, reply); 1831b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 1841b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber const char *host = data.readCString(); 1851b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber unsigned port = data.readInt32(); 1861b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 1871b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber reply->writeInt32(initAsync(host, port)); 1881b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber return OK; 1891b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber } 1901b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 1911b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber case HDCP_SHUTDOWN_ASYNC: 1921b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber { 1931b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber CHECK_INTERFACE(IHDCP, data, reply); 1941b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 1951b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber reply->writeInt32(shutdownAsync()); 1961b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber return OK; 1971b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber } 1981b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 1991b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber case HDCP_ENCRYPT: 2001b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber { 2011b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber size_t size = data.readInt32(); 2021b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 2031b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber void *inData = malloc(2 * size); 2041b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber void *outData = (uint8_t *)inData + size; 2051b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 2061b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber data.read(inData, size); 2071b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 2081b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber uint32_t streamCTR = data.readInt32(); 2091b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber uint64_t inputCTR; 2101b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber status_t err = encrypt(inData, size, streamCTR, &inputCTR, outData); 2111b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 2121b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber reply->writeInt32(err); 2131b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 2141b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber if (err == OK) { 2151b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber reply->writeInt64(inputCTR); 2161b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber reply->write(outData, size); 2171b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber } 2181b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 2191b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber free(inData); 2201b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber inData = outData = NULL; 2211b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 2221b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber return OK; 2231b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber } 2241b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 225a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber case HDCP_DECRYPT: 226a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber { 227a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber size_t size = data.readInt32(); 228a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber 229a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber void *inData = malloc(2 * size); 230a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber void *outData = (uint8_t *)inData + size; 231a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber 232a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber data.read(inData, size); 233a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber 234a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber uint32_t streamCTR = data.readInt32(); 235a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber uint64_t inputCTR = data.readInt64(); 236a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber status_t err = decrypt(inData, size, streamCTR, inputCTR, outData); 237a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber 238a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber reply->writeInt32(err); 239a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber 240a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber if (err == OK) { 241a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber reply->write(outData, size); 242a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber } 243a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber 244a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber free(inData); 245a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber inData = outData = NULL; 246a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber 247a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber return OK; 248a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber } 249a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber 2501b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber default: 2511b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber return BBinder::onTransact(code, data, reply, flags); 2521b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber } 2531b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber} 2541b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 2551b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber} // namespace android 256