IDrm.cpp revision 4c63a239c404af1e055e5f9939939ab0fd09d98a
1441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker/* 2441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker * Copyright (C) 2013 The Android Open Source Project 3441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker * 4441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker * Licensed under the Apache License, Version 2.0 (the "License"); 5441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker * you may not use this file except in compliance with the License. 6441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker * You may obtain a copy of the License at 7441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker * 8441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker * http://www.apache.org/licenses/LICENSE-2.0 9441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker * 10441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker * Unless required by applicable law or agreed to in writing, software 11441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker * distributed under the License is distributed on an "AS IS" BASIS, 12441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker * See the License for the specific language governing permissions and 14441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker * limitations under the License. 15441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker */ 16441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 17441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker//#define LOG_NDEBUG 0 18441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker#define LOG_TAG "IDrm" 19441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker#include <utils/Log.h> 20441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 21441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker#include <binder/Parcel.h> 22441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker#include <media/IDrm.h> 23441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker#include <media/stagefright/MediaErrors.h> 24441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker#include <media/stagefright/foundation/ADebug.h> 25441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker#include <media/stagefright/foundation/AString.h> 26441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 27441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinkernamespace android { 28441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 29441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinkerenum { 30441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker INIT_CHECK = IBinder::FIRST_CALL_TRANSACTION, 31441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker IS_CRYPTO_SUPPORTED, 32441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CREATE_PLUGIN, 33441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker DESTROY_PLUGIN, 34441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker OPEN_SESSION, 35441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CLOSE_SESSION, 364c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker GET_KEY_REQUEST, 374c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker PROVIDE_KEY_RESPONSE, 384c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker REMOVE_KEYS, 394c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker RESTORE_KEYS, 404c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker QUERY_KEY_STATUS, 41441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker GET_PROVISION_REQUEST, 42441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker PROVIDE_PROVISION_RESPONSE, 43441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker GET_SECURE_STOPS, 44441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker RELEASE_SECURE_STOPS, 45441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker GET_PROPERTY_STRING, 46441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker GET_PROPERTY_BYTE_ARRAY, 47441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker SET_PROPERTY_STRING, 484c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker SET_PROPERTY_BYTE_ARRAY, 494c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker SET_CIPHER_ALGORITHM, 504c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker SET_MAC_ALGORITHM, 514c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker ENCRYPT, 524c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker DECRYPT, 534c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker SIGN, 544c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker VERIFY 55441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker}; 56441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 57441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinkerstruct BpDrm : public BpInterface<IDrm> { 58441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker BpDrm(const sp<IBinder> &impl) 59441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker : BpInterface<IDrm>(impl) { 60441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 61441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 62441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t initCheck() const { 63441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 64441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 65441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker remote()->transact(INIT_CHECK, data, &reply); 66441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 67441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 68441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 69441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 70441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual bool isCryptoSchemeSupported(const uint8_t uuid[16]) { 71441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 72441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 73441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.write(uuid, 16); 74441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker remote()->transact(IS_CRYPTO_SUPPORTED, data, &reply); 75441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 76441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32() != 0; 77441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 78441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 79441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t createPlugin(const uint8_t uuid[16]) { 80441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 81441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 82441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.write(uuid, 16); 83441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 84441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker remote()->transact(CREATE_PLUGIN, data, &reply); 85441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 86441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 87441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 88441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 89441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t destroyPlugin() { 90441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 91441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 92441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker remote()->transact(DESTROY_PLUGIN, data, &reply); 93441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 94441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 95441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 96441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 97441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t openSession(Vector<uint8_t> &sessionId) { 98441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 99441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 100441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 101441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker remote()->transact(OPEN_SESSION, data, &reply); 1024c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(reply, sessionId); 103441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 104441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 105441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 106441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 107441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t closeSession(Vector<uint8_t> const &sessionId) { 108441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 109441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 110441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 1114c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, sessionId); 112441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker remote()->transact(CLOSE_SESSION, data, &reply); 113441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 114441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 115441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 116441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 117441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t 1184c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker getKeyRequest(Vector<uint8_t> const &sessionId, 1194c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &initData, 1204c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker String8 const &mimeType, DrmPlugin::KeyType keyType, 1214c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker KeyedVector<String8, String8> const &optionalParameters, 1224c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> &request, String8 &defaultUrl) { 123441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 124441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 125441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 1264c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, sessionId); 1274c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, initData); 128441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeString8(mimeType); 1294c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.writeInt32((uint32_t)keyType); 130441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 131441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInt32(optionalParameters.size()); 132441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker for (size_t i = 0; i < optionalParameters.size(); ++i) { 133441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeString8(optionalParameters.keyAt(i)); 134441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeString8(optionalParameters.valueAt(i)); 135441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 1364c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker remote()->transact(GET_KEY_REQUEST, data, &reply); 137441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 1384c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(reply, request); 139441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker defaultUrl = reply.readString8(); 140441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 141441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 142441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 143441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 1444c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker virtual status_t provideKeyResponse(Vector<uint8_t> const &sessionId, 1454c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &response, 1464c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> &keySetId) { 1474c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Parcel data, reply; 1484c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 1494c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, sessionId); 1504c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, response); 1514c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker remote()->transact(PROVIDE_KEY_RESPONSE, data, &reply); 1524c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(reply, keySetId); 1534c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 1544c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return reply.readInt32(); 1554c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 1564c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 1574c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker virtual status_t removeKeys(Vector<uint8_t> const &keySetId) { 158441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 159441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 160441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 1614c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, keySetId); 1624c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker remote()->transact(REMOVE_KEYS, data, &reply); 163441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 164441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 165441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 166441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 1674c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker virtual status_t restoreKeys(Vector<uint8_t> const &sessionId, 1684c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &keySetId) { 169441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 170441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 171441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 1724c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, sessionId); 1734c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, keySetId); 1744c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker remote()->transact(RESTORE_KEYS, data, &reply); 175441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 176441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 177441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 178441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 1794c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker virtual status_t queryKeyStatus(Vector<uint8_t> const &sessionId, 180441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker KeyedVector<String8, String8> &infoMap) const { 181441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 182441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 183441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 1844c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, sessionId); 1854c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker remote()->transact(QUERY_KEY_STATUS, data, &reply); 186441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 187441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker infoMap.clear(); 188441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker size_t count = reply.readInt32(); 189441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker for (size_t i = 0; i < count; i++) { 190441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 key = reply.readString8(); 191441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 value = reply.readString8(); 192441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker infoMap.add(key, value); 193441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 194441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 195441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 196441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 197441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t getProvisionRequest(Vector<uint8_t> &request, 198441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 &defaultUrl) { 199441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 200441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 201441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 202441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker remote()->transact(GET_PROVISION_REQUEST, data, &reply); 203441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 2044c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(reply, request); 205441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker defaultUrl = reply.readString8(); 206441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 207441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 208441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 209441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 210441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t provideProvisionResponse(Vector<uint8_t> const &response) { 211441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 212441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 213441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 2144c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, response); 215441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker remote()->transact(PROVIDE_PROVISION_RESPONSE, data, &reply); 216441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 217441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 218441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 219441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 220441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t getSecureStops(List<Vector<uint8_t> > &secureStops) { 221441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 222441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 223441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 224441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker remote()->transact(GET_SECURE_STOPS, data, &reply); 225441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 226441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker secureStops.clear(); 227441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker uint32_t count = reply.readInt32(); 228441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker for (size_t i = 0; i < count; i++) { 229441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> secureStop; 2304c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(reply, secureStop); 231441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker secureStops.push_back(secureStop); 232441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 233441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 234441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 235441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 236441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t releaseSecureStops(Vector<uint8_t> const &ssRelease) { 237441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 238441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 239441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 2404c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, ssRelease); 241441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker remote()->transact(RELEASE_SECURE_STOPS, data, &reply); 242441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 243441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 244441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 245441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 246441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t getPropertyString(String8 const &name, String8 &value) const { 247441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 248441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 249441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 250441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeString8(name); 251441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker remote()->transact(GET_PROPERTY_STRING, data, &reply); 252441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 253441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker value = reply.readString8(); 254441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 255441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 256441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 257441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t getPropertyByteArray(String8 const &name, Vector<uint8_t> &value) const { 258441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 259441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 260441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 261441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeString8(name); 262441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker remote()->transact(GET_PROPERTY_BYTE_ARRAY, data, &reply); 263441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 2644c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(reply, value); 265441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 266441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 267441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 268441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t setPropertyString(String8 const &name, String8 const &value) const { 269441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 270441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 271441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 272441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeString8(name); 273441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeString8(value); 274441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker remote()->transact(SET_PROPERTY_STRING, data, &reply); 275441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 276441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 277441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 278441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 279441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t setPropertyByteArray(String8 const &name, 280441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> const &value) const { 281441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 282441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 283441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 284441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeString8(name); 2854c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, value); 286441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker remote()->transact(SET_PROPERTY_BYTE_ARRAY, data, &reply); 287441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 288441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 289441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 290441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 291441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 2924c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker virtual status_t setCipherAlgorithm(Vector<uint8_t> const &sessionId, 2934c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker String8 const &algorithm) { 2944c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Parcel data, reply; 2954c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 2964c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 2974c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, sessionId); 2984c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.writeString8(algorithm); 2994c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker remote()->transact(SET_CIPHER_ALGORITHM, data, &reply); 3004c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return reply.readInt32(); 3014c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 3024c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 3034c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker virtual status_t setMacAlgorithm(Vector<uint8_t> const &sessionId, 3044c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker String8 const &algorithm) { 3054c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Parcel data, reply; 3064c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 3074c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 3084c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, sessionId); 3094c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.writeString8(algorithm); 3104c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker remote()->transact(SET_MAC_ALGORITHM, data, &reply); 3114c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return reply.readInt32(); 3124c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 3134c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 3144c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker virtual status_t encrypt(Vector<uint8_t> const &sessionId, 3154c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &keyId, 3164c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &input, 3174c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &iv, 3184c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> &output) { 3194c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Parcel data, reply; 3204c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 3214c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 3224c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, sessionId); 3234c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, keyId); 3244c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, input); 3254c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, iv); 3264c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 3274c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker remote()->transact(ENCRYPT, data, &reply); 3284c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(reply, output); 3294c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 3304c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return reply.readInt32(); 3314c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 3324c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 3334c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker virtual status_t decrypt(Vector<uint8_t> const &sessionId, 3344c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &keyId, 3354c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &input, 3364c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &iv, 3374c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> &output) { 3384c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Parcel data, reply; 3394c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 3404c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 3414c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, sessionId); 3424c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, keyId); 3434c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, input); 3444c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, iv); 3454c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 3464c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker remote()->transact(DECRYPT, data, &reply); 3474c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(reply, output); 3484c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 3494c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return reply.readInt32(); 3504c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 3514c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 3524c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker virtual status_t sign(Vector<uint8_t> const &sessionId, 3534c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &keyId, 3544c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &message, 3554c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> &signature) { 3564c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Parcel data, reply; 3574c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 3584c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 3594c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, sessionId); 3604c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, keyId); 3614c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, message); 3624c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 3634c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker remote()->transact(SIGN, data, &reply); 3644c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(reply, signature); 3654c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 3664c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return reply.readInt32(); 3674c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 3684c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 3694c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker virtual status_t verify(Vector<uint8_t> const &sessionId, 3704c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &keyId, 3714c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &message, 3724c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &signature, 3734c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker bool &match) { 3744c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Parcel data, reply; 3754c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 3764c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 3774c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, sessionId); 3784c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, keyId); 3794c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, message); 3804c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, signature); 3814c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 3824c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker remote()->transact(VERIFY, data, &reply); 3834c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker match = (bool)reply.readInt32(); 3844c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return reply.readInt32(); 3854c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 3864c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 387441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinkerprivate: 3884c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker void readVector(Parcel &reply, Vector<uint8_t> &vector) const { 3894c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker uint32_t size = reply.readInt32(); 3904c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker vector.insertAt((size_t)0, size); 3914c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply.read(vector.editArray(), size); 3924c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 3934c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 3944c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker void writeVector(Parcel &data, Vector<uint8_t> const &vector) const { 3954c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.writeInt32(vector.size()); 3964c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.write(vector.array(), vector.size()); 3974c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 3984c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 399441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker DISALLOW_EVIL_CONSTRUCTORS(BpDrm); 400441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker}; 401441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 402441a78d5e224e0d67f9b52fa9adc795c6944159bJeff TinkerIMPLEMENT_META_INTERFACE(Drm, "android.drm.IDrm"); 403441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 404441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker//////////////////////////////////////////////////////////////////////////////// 405441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 4064c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinkervoid BnDrm::readVector(const Parcel &data, Vector<uint8_t> &vector) const { 4074c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker uint32_t size = data.readInt32(); 4084c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker vector.insertAt((size_t)0, size); 4094c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.read(vector.editArray(), size); 4104c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker} 4114c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 4124c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinkervoid BnDrm::writeVector(Parcel *reply, Vector<uint8_t> const &vector) const { 4134c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply->writeInt32(vector.size()); 4144c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply->write(vector.array(), vector.size()); 4154c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker} 4164c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 417441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinkerstatus_t BnDrm::onTransact( 418441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) { 419441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker switch (code) { 420441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case INIT_CHECK: 421441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 422441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 423441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(initCheck()); 424441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 425441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 426441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 427441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case IS_CRYPTO_SUPPORTED: 428441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 429441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 430441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker uint8_t uuid[16]; 431441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.read(uuid, sizeof(uuid)); 432441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(isCryptoSchemeSupported(uuid)); 433441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 434441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 435441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 436441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case CREATE_PLUGIN: 437441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 438441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 439441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker uint8_t uuid[16]; 440441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.read(uuid, sizeof(uuid)); 441441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(createPlugin(uuid)); 442441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 443441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 444441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 445441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case DESTROY_PLUGIN: 446441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 447441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 448441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(destroyPlugin()); 449441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 450441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 451441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 452441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case OPEN_SESSION: 453441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 454441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 455441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> sessionId; 456441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker status_t result = openSession(sessionId); 4574c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(reply, sessionId); 458441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(result); 459441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 460441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 461441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 462441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case CLOSE_SESSION: 463441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 464441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 465441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> sessionId; 4664c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, sessionId); 467441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(closeSession(sessionId)); 468441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 469441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 470441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 4714c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker case GET_KEY_REQUEST: 472441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 473441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 4744c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> sessionId, initData; 475441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 4764c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, sessionId); 4774c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, initData); 478441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 mimeType = data.readString8(); 4794c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker DrmPlugin::KeyType keyType = (DrmPlugin::KeyType)data.readInt32(); 480441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 481441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker KeyedVector<String8, String8> optionalParameters; 482441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker uint32_t count = data.readInt32(); 483441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker for (size_t i = 0; i < count; ++i) { 484441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 key, value; 485441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker key = data.readString8(); 486441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker value = data.readString8(); 487441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker optionalParameters.add(key, value); 488441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 489441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 490441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> request; 491441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 defaultUrl; 492441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 4934c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker status_t result = getKeyRequest(sessionId, initData, 4944c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker mimeType, keyType, 4954c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker optionalParameters, 4964c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker request, defaultUrl); 4974c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(reply, request); 498441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeString8(defaultUrl); 499441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(result); 500441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 501441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 502441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 5034c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker case PROVIDE_KEY_RESPONSE: 504441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 505441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 5064c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> sessionId, response, keySetId; 5074c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, sessionId); 5084c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, response); 5094c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker uint32_t result = provideKeyResponse(sessionId, response, keySetId); 5104c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(reply, keySetId); 5114c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply->writeInt32(result); 5124c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return OK; 5134c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 514441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 5154c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker case REMOVE_KEYS: 5164c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker { 5174c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 5184c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> keySetId; 5194c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, keySetId); 5204c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply->writeInt32(removeKeys(keySetId)); 521441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 522441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 523441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 5244c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker case RESTORE_KEYS: 525441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 526441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 5274c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> sessionId, keySetId; 5284c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, sessionId); 5294c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, keySetId); 5304c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply->writeInt32(restoreKeys(sessionId, keySetId)); 531441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 532441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 533441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 5344c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker case QUERY_KEY_STATUS: 535441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 536441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 537441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> sessionId; 5384c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, sessionId); 539441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker KeyedVector<String8, String8> infoMap; 5404c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker status_t result = queryKeyStatus(sessionId, infoMap); 541441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker size_t count = infoMap.size(); 542441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(count); 543441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker for (size_t i = 0; i < count; ++i) { 544441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeString8(infoMap.keyAt(i)); 545441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeString8(infoMap.valueAt(i)); 546441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 547441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(result); 548441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 549441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 550441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 551441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case GET_PROVISION_REQUEST: 552441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 553441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 554441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> request; 555441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 defaultUrl; 556441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker status_t result = getProvisionRequest(request, defaultUrl); 5574c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(reply, request); 558441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeString8(defaultUrl); 559441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(result); 560441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 561441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 562441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 563441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case PROVIDE_PROVISION_RESPONSE: 564441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 565441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 566441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> response; 5674c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, response); 568441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(provideProvisionResponse(response)); 569441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 570441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 571441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 572441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case GET_SECURE_STOPS: 573441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 574441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 575441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker List<Vector<uint8_t> > secureStops; 576441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker status_t result = getSecureStops(secureStops); 577441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker size_t count = secureStops.size(); 578441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(count); 579441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker List<Vector<uint8_t> >::iterator iter = secureStops.begin(); 580441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker while(iter != secureStops.end()) { 581441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker size_t size = iter->size(); 582441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(size); 583441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->write(iter->array(), iter->size()); 584441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 585441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(result); 586441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 587441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 588441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 589441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case RELEASE_SECURE_STOPS: 590441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 591441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 592441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> ssRelease; 5934c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, ssRelease); 594441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(releaseSecureStops(ssRelease)); 595441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 596441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 597441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 598441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case GET_PROPERTY_STRING: 599441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 600441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 601441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 name = data.readString8(); 602441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 value; 603441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker status_t result = getPropertyString(name, value); 604441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeString8(value); 605441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(result); 606441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 607441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 608441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 609441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case GET_PROPERTY_BYTE_ARRAY: 610441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 611441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 612441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 name = data.readString8(); 613441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> value; 614441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker status_t result = getPropertyByteArray(name, value); 6154c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(reply, value); 616441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(result); 617441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 618441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 619441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 620441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case SET_PROPERTY_STRING: 621441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 622441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 623441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 name = data.readString8(); 624441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 value = data.readString8(); 625441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(setPropertyString(name, value)); 626441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 627441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 628441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 629441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case SET_PROPERTY_BYTE_ARRAY: 630441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 631441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 632441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 name = data.readString8(); 633441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> value; 6344c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, value); 635441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(setPropertyByteArray(name, value)); 636441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 637441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 638441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 6394c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker case SET_CIPHER_ALGORITHM: 6404c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker { 6414c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 6424c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> sessionId; 6434c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, sessionId); 6444c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker String8 algorithm = data.readString8(); 6454c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply->writeInt32(setCipherAlgorithm(sessionId, algorithm)); 6464c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return OK; 6474c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 6484c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 6494c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker case SET_MAC_ALGORITHM: 6504c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker { 6514c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 6524c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> sessionId; 6534c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, sessionId); 6544c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker String8 algorithm = data.readString8(); 6554c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply->writeInt32(setMacAlgorithm(sessionId, algorithm)); 6564c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return OK; 6574c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 6584c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 6594c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker case ENCRYPT: 6604c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker { 6614c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 6624c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> sessionId, keyId, input, iv, output; 6634c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, sessionId); 6644c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, keyId); 6654c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, input); 6664c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, iv); 6674c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker uint32_t result = encrypt(sessionId, keyId, input, iv, output); 6684c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(reply, output); 6694c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply->writeInt32(result); 6704c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return OK; 6714c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 6724c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 6734c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker case DECRYPT: 6744c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker { 6754c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 6764c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> sessionId, keyId, input, iv, output; 6774c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, sessionId); 6784c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, keyId); 6794c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, input); 6804c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, iv); 6814c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker uint32_t result = decrypt(sessionId, keyId, input, iv, output); 6824c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(reply, output); 6834c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply->writeInt32(result); 6844c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return OK; 6854c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 6864c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 6874c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker case SIGN: 6884c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker { 6894c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 6904c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> sessionId, keyId, message, signature; 6914c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, sessionId); 6924c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, keyId); 6934c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, message); 6944c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker uint32_t result = sign(sessionId, keyId, message, signature); 6954c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(reply, signature); 6964c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply->writeInt32(result); 6974c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return OK; 6984c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 6994c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 7004c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker case VERIFY: 7014c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker { 7024c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 7034c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> sessionId, keyId, message, signature; 7044c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, sessionId); 7054c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, keyId); 7064c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, message); 7074c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, signature); 7084c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker bool match; 7094c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker uint32_t result = verify(sessionId, keyId, message, signature, match); 7104c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply->writeInt32(match); 7114c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply->writeInt32(result); 7124c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return OK; 7134c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 7144c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 7154c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker default: 7164c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return BBinder::onTransact(code, data, reply, flags); 717441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 718441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker} 719441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 720441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker} // namespace android 721441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 722