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, 33ec3acca4a75fc4adc076b56751124f507b419622Chong Zhang HDCP_GET_CAPS, 341b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber HDCP_ENCRYPT, 35308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang HDCP_ENCRYPT_NATIVE, 36a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber HDCP_DECRYPT, 371b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber}; 381b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 391b19c9d120869c3182373a9b06a1ed98898df882Andreas Huberstruct BpHDCPObserver : public BpInterface<IHDCPObserver> { 401b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber BpHDCPObserver(const sp<IBinder> &impl) 411b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber : BpInterface<IHDCPObserver>(impl) { 421b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber } 431b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 441b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber virtual void notify( 451b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber int msg, int ext1, int ext2, const Parcel *obj) { 461b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber Parcel data, reply; 471b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber data.writeInterfaceToken(IHDCPObserver::getInterfaceDescriptor()); 481b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber data.writeInt32(msg); 491b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber data.writeInt32(ext1); 501b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber data.writeInt32(ext2); 511b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber if (obj && obj->dataSize() > 0) { 521b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber data.appendFrom(const_cast<Parcel *>(obj), 0, obj->dataSize()); 531b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber } 541b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber remote()->transact(OBSERVER_NOTIFY, data, &reply, IBinder::FLAG_ONEWAY); 551b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber } 561b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber}; 571b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 581b19c9d120869c3182373a9b06a1ed98898df882Andreas HuberIMPLEMENT_META_INTERFACE(HDCPObserver, "android.hardware.IHDCPObserver"); 591b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 601b19c9d120869c3182373a9b06a1ed98898df882Andreas Huberstruct BpHDCP : public BpInterface<IHDCP> { 611b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber BpHDCP(const sp<IBinder> &impl) 621b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber : BpInterface<IHDCP>(impl) { 631b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber } 641b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 651b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber virtual status_t setObserver(const sp<IHDCPObserver> &observer) { 661b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber Parcel data, reply; 671b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber data.writeInterfaceToken(IHDCP::getInterfaceDescriptor()); 681b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber data.writeStrongBinder(observer->asBinder()); 691b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber remote()->transact(HDCP_SET_OBSERVER, data, &reply); 701b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber return reply.readInt32(); 711b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber } 721b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 731b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber virtual status_t initAsync(const char *host, unsigned port) { 741b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber Parcel data, reply; 751b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber data.writeInterfaceToken(IHDCP::getInterfaceDescriptor()); 761b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber data.writeCString(host); 771b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber data.writeInt32(port); 781b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber remote()->transact(HDCP_INIT_ASYNC, data, &reply); 791b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber return reply.readInt32(); 801b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber } 811b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 821b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber virtual status_t shutdownAsync() { 831b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber Parcel data, reply; 841b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber data.writeInterfaceToken(IHDCP::getInterfaceDescriptor()); 851b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber remote()->transact(HDCP_SHUTDOWN_ASYNC, data, &reply); 861b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber return reply.readInt32(); 871b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber } 881b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 89ec3acca4a75fc4adc076b56751124f507b419622Chong Zhang virtual uint32_t getCaps() { 90ec3acca4a75fc4adc076b56751124f507b419622Chong Zhang Parcel data, reply; 91ec3acca4a75fc4adc076b56751124f507b419622Chong Zhang data.writeInterfaceToken(IHDCP::getInterfaceDescriptor()); 92ec3acca4a75fc4adc076b56751124f507b419622Chong Zhang remote()->transact(HDCP_GET_CAPS, data, &reply); 93ec3acca4a75fc4adc076b56751124f507b419622Chong Zhang return reply.readInt32(); 94ec3acca4a75fc4adc076b56751124f507b419622Chong Zhang } 95ec3acca4a75fc4adc076b56751124f507b419622Chong Zhang 961b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber virtual status_t encrypt( 971b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber const void *inData, size_t size, uint32_t streamCTR, 981b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber uint64_t *outInputCTR, void *outData) { 991b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber Parcel data, reply; 1001b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber data.writeInterfaceToken(IHDCP::getInterfaceDescriptor()); 1011b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber data.writeInt32(size); 1021b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber data.write(inData, size); 1031b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber data.writeInt32(streamCTR); 1041b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber remote()->transact(HDCP_ENCRYPT, data, &reply); 1051b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 1061b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber status_t err = reply.readInt32(); 1071b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 1081b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber if (err != OK) { 1091b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber *outInputCTR = 0; 1101b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 1111b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber return err; 1121b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber } 1131b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 1141b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber *outInputCTR = reply.readInt64(); 1151b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber reply.read(outData, size); 1161b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 1171b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber return err; 1181b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber } 119a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber 120308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang virtual status_t encryptNative( 121308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang const sp<GraphicBuffer> &graphicBuffer, 122308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang size_t offset, size_t size, uint32_t streamCTR, 123308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang uint64_t *outInputCTR, void *outData) { 124308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang Parcel data, reply; 125308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang data.writeInterfaceToken(IHDCP::getInterfaceDescriptor()); 126308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang data.write(*graphicBuffer); 127308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang data.writeInt32(offset); 128308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang data.writeInt32(size); 129308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang data.writeInt32(streamCTR); 130308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang remote()->transact(HDCP_ENCRYPT_NATIVE, data, &reply); 131308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang 132308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang status_t err = reply.readInt32(); 133308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang 134308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang if (err != OK) { 135308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang *outInputCTR = 0; 136308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang return err; 137308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang } 138308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang 139308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang *outInputCTR = reply.readInt64(); 140308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang reply.read(outData, size); 141308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang 142308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang return err; 143308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang } 144308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang 145a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber virtual status_t decrypt( 146a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber const void *inData, size_t size, 147a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber uint32_t streamCTR, uint64_t inputCTR, 148a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber void *outData) { 149a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber Parcel data, reply; 150a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber data.writeInterfaceToken(IHDCP::getInterfaceDescriptor()); 151a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber data.writeInt32(size); 152a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber data.write(inData, size); 153a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber data.writeInt32(streamCTR); 154a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber data.writeInt64(inputCTR); 155a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber remote()->transact(HDCP_DECRYPT, data, &reply); 156a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber 157a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber status_t err = reply.readInt32(); 158a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber 159a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber if (err != OK) { 160a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber return err; 161a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber } 162a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber 163a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber reply.read(outData, size); 164a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber 165a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber return err; 166a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber } 1671b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber}; 1681b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 1691b19c9d120869c3182373a9b06a1ed98898df882Andreas HuberIMPLEMENT_META_INTERFACE(HDCP, "android.hardware.IHDCP"); 1701b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 1711b19c9d120869c3182373a9b06a1ed98898df882Andreas Huberstatus_t BnHDCPObserver::onTransact( 1721b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) { 1731b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber switch (code) { 1741b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber case OBSERVER_NOTIFY: 1751b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber { 1761b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber CHECK_INTERFACE(IHDCPObserver, data, reply); 1771b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 1781b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber int msg = data.readInt32(); 1791b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber int ext1 = data.readInt32(); 1801b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber int ext2 = data.readInt32(); 1811b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 1821b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber Parcel obj; 1831b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber if (data.dataAvail() > 0) { 1841b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber obj.appendFrom( 1851b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber const_cast<Parcel *>(&data), 1861b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber data.dataPosition(), 1871b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber data.dataAvail()); 1881b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber } 1891b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 1901b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber notify(msg, ext1, ext2, &obj); 1911b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 1921b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber return OK; 1931b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber } 1941b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 1951b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber default: 1961b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber return BBinder::onTransact(code, data, reply, flags); 1971b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber } 1981b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber} 1991b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 2001b19c9d120869c3182373a9b06a1ed98898df882Andreas Huberstatus_t BnHDCP::onTransact( 2011b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) { 2021b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber switch (code) { 2031b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber case HDCP_SET_OBSERVER: 2041b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber { 2051b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber CHECK_INTERFACE(IHDCP, data, reply); 2061b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 2071b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber sp<IHDCPObserver> observer = 2081b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber interface_cast<IHDCPObserver>(data.readStrongBinder()); 2091b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 2101b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber reply->writeInt32(setObserver(observer)); 2111b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber return OK; 2121b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber } 2131b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 2141b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber case HDCP_INIT_ASYNC: 2151b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber { 2161b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber CHECK_INTERFACE(IHDCP, data, reply); 2171b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 2181b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber const char *host = data.readCString(); 2191b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber unsigned port = data.readInt32(); 2201b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 2211b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber reply->writeInt32(initAsync(host, port)); 2221b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber return OK; 2231b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber } 2241b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 2251b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber case HDCP_SHUTDOWN_ASYNC: 2261b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber { 2271b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber CHECK_INTERFACE(IHDCP, data, reply); 2281b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 2291b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber reply->writeInt32(shutdownAsync()); 2301b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber return OK; 2311b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber } 2321b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 233ec3acca4a75fc4adc076b56751124f507b419622Chong Zhang case HDCP_GET_CAPS: 234ec3acca4a75fc4adc076b56751124f507b419622Chong Zhang { 235ec3acca4a75fc4adc076b56751124f507b419622Chong Zhang CHECK_INTERFACE(IHDCP, data, reply); 236ec3acca4a75fc4adc076b56751124f507b419622Chong Zhang 237ec3acca4a75fc4adc076b56751124f507b419622Chong Zhang reply->writeInt32(getCaps()); 238ec3acca4a75fc4adc076b56751124f507b419622Chong Zhang return OK; 239ec3acca4a75fc4adc076b56751124f507b419622Chong Zhang } 240ec3acca4a75fc4adc076b56751124f507b419622Chong Zhang 2411b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber case HDCP_ENCRYPT: 2421b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber { 2431b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber size_t size = data.readInt32(); 2441b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 2451b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber void *inData = malloc(2 * size); 2461b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber void *outData = (uint8_t *)inData + size; 2471b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 2481b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber data.read(inData, size); 2491b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 2501b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber uint32_t streamCTR = data.readInt32(); 2511b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber uint64_t inputCTR; 2521b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber status_t err = encrypt(inData, size, streamCTR, &inputCTR, outData); 2531b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 2541b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber reply->writeInt32(err); 2551b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 2561b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber if (err == OK) { 2571b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber reply->writeInt64(inputCTR); 2581b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber reply->write(outData, size); 2591b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber } 2601b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 2611b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber free(inData); 2621b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber inData = outData = NULL; 2631b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 2641b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber return OK; 2651b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber } 2661b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 267308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang case HDCP_ENCRYPT_NATIVE: 268308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang { 269308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang CHECK_INTERFACE(IHDCP, data, reply); 270308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang 271308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang sp<GraphicBuffer> graphicBuffer = new GraphicBuffer(); 272308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang data.read(*graphicBuffer); 273308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang size_t offset = data.readInt32(); 274308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang size_t size = data.readInt32(); 275308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang uint32_t streamCTR = data.readInt32(); 276308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang void *outData = malloc(size); 277308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang uint64_t inputCTR; 278308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang 279308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang status_t err = encryptNative(graphicBuffer, offset, size, 280308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang streamCTR, &inputCTR, outData); 281308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang 282308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang reply->writeInt32(err); 283308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang 284308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang if (err == OK) { 285308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang reply->writeInt64(inputCTR); 286308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang reply->write(outData, size); 287308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang } 288308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang 289308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang free(outData); 290308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang outData = NULL; 291308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang 292308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang return OK; 293308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang } 294308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang 295a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber case HDCP_DECRYPT: 296a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber { 297a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber size_t size = data.readInt32(); 298a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber 299a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber void *inData = malloc(2 * size); 300a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber void *outData = (uint8_t *)inData + size; 301a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber 302a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber data.read(inData, size); 303a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber 304a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber uint32_t streamCTR = data.readInt32(); 305a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber uint64_t inputCTR = data.readInt64(); 306a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber status_t err = decrypt(inData, size, streamCTR, inputCTR, outData); 307a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber 308a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber reply->writeInt32(err); 309a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber 310a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber if (err == OK) { 311a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber reply->write(outData, size); 312a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber } 313a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber 314a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber free(inData); 315a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber inData = outData = NULL; 316a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber 317a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber return OK; 318a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber } 319a6a88d9c445e261972c2433254e0a996336e78a4Andreas Huber 3201b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber default: 3211b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber return BBinder::onTransact(code, data, reply, flags); 3221b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber } 3231b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber} 3241b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber 3251b19c9d120869c3182373a9b06a1ed98898df882Andreas Huber} // namespace android 326