IDrm.cpp revision 3c1285e8f86bd497e14c14fb6df7b42072ef52bd
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, 5468d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker SIGN_RSA, 55c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker VERIFY, 5668b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker SET_LISTENER, 573c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker UNPROVISION_DEVICE, 583c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker GET_SECURE_STOP, 593c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker RELEASE_ALL_SECURE_STOPS 60441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker}; 61441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 62441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinkerstruct BpDrm : public BpInterface<IDrm> { 63441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker BpDrm(const sp<IBinder> &impl) 64441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker : BpInterface<IDrm>(impl) { 65441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 66441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 67441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t initCheck() const { 68441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 69441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 70441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker remote()->transact(INIT_CHECK, data, &reply); 71441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 72441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 73441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 74441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 759cf69e0fc110f17c28e988ed0f9bf91abfaf710dJeff Tinker virtual bool isCryptoSchemeSupported(const uint8_t uuid[16], const String8 &mimeType) { 76441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 77441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 78441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.write(uuid, 16); 799cf69e0fc110f17c28e988ed0f9bf91abfaf710dJeff Tinker data.writeString8(mimeType); 80441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker remote()->transact(IS_CRYPTO_SUPPORTED, data, &reply); 81441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 82441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32() != 0; 83441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 84441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 85441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t createPlugin(const uint8_t uuid[16]) { 86441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 87441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 88441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.write(uuid, 16); 89441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 90441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker remote()->transact(CREATE_PLUGIN, data, &reply); 91441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 92441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 93441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 94441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 95441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t destroyPlugin() { 96441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 97441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 98441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker remote()->transact(DESTROY_PLUGIN, data, &reply); 99441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 100441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 101441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 102441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 103441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t openSession(Vector<uint8_t> &sessionId) { 104441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 105441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 106441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 107441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker remote()->transact(OPEN_SESSION, data, &reply); 1084c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(reply, sessionId); 109441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 110441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 111441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 112441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 113441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t closeSession(Vector<uint8_t> const &sessionId) { 114441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 115441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 116441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 1174c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, sessionId); 118441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker remote()->transact(CLOSE_SESSION, data, &reply); 119441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 120441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 121441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 122441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 123441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t 1244c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker getKeyRequest(Vector<uint8_t> const &sessionId, 1254c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &initData, 1264c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker String8 const &mimeType, DrmPlugin::KeyType keyType, 1274c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker KeyedVector<String8, String8> const &optionalParameters, 1284c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> &request, String8 &defaultUrl) { 129441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 130441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 131441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 1324c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, sessionId); 1334c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, initData); 134441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeString8(mimeType); 1354c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.writeInt32((uint32_t)keyType); 136441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 137441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInt32(optionalParameters.size()); 138441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker for (size_t i = 0; i < optionalParameters.size(); ++i) { 139441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeString8(optionalParameters.keyAt(i)); 140441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeString8(optionalParameters.valueAt(i)); 141441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 1424c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker remote()->transact(GET_KEY_REQUEST, data, &reply); 143441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 1444c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(reply, request); 145441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker defaultUrl = reply.readString8(); 146441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 147441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 148441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 149441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 1504c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker virtual status_t provideKeyResponse(Vector<uint8_t> const &sessionId, 1514c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &response, 1524c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> &keySetId) { 1534c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Parcel data, reply; 1544c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 1554c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, sessionId); 1564c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, response); 1574c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker remote()->transact(PROVIDE_KEY_RESPONSE, data, &reply); 1584c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(reply, keySetId); 1594c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 1604c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return reply.readInt32(); 1614c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 1624c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 1634c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker virtual status_t removeKeys(Vector<uint8_t> const &keySetId) { 164441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 165441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 166441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 1674c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, keySetId); 1684c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker remote()->transact(REMOVE_KEYS, data, &reply); 169441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 170441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 171441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 172441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 1734c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker virtual status_t restoreKeys(Vector<uint8_t> const &sessionId, 1744c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &keySetId) { 175441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 176441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 177441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 1784c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, sessionId); 1794c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, keySetId); 1804c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker remote()->transact(RESTORE_KEYS, data, &reply); 181441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 182441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 183441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 184441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 1854c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker virtual status_t queryKeyStatus(Vector<uint8_t> const &sessionId, 186441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker KeyedVector<String8, String8> &infoMap) const { 187441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 188441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 189441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 1904c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, sessionId); 1914c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker remote()->transact(QUERY_KEY_STATUS, data, &reply); 192441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 193441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker infoMap.clear(); 194441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker size_t count = reply.readInt32(); 195441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker for (size_t i = 0; i < count; i++) { 196441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 key = reply.readString8(); 197441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 value = reply.readString8(); 198441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker infoMap.add(key, value); 199441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 200441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 201441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 202441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 20368d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker virtual status_t getProvisionRequest(String8 const &certType, 20468d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker String8 const &certAuthority, 20568d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker Vector<uint8_t> &request, 206441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 &defaultUrl) { 207441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 208441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 209441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 21068d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker data.writeString8(certType); 21168d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker data.writeString8(certAuthority); 212441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker remote()->transact(GET_PROVISION_REQUEST, data, &reply); 213441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 2144c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(reply, request); 215441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker defaultUrl = reply.readString8(); 216441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 217441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 218441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 219441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 22068d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker virtual status_t provideProvisionResponse(Vector<uint8_t> const &response, 22168d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker Vector<uint8_t> &certificate, 22268d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker Vector<uint8_t> &wrappedKey) { 223441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 224441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 225441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 2264c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, response); 227441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker remote()->transact(PROVIDE_PROVISION_RESPONSE, data, &reply); 228441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 22968d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker readVector(reply, certificate); 23068d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker readVector(reply, wrappedKey); 23168d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker 232441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 233441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 234441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 23568b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker virtual status_t unprovisionDevice() { 23668b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker Parcel data, reply; 23768b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 23868b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker 23968b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker remote()->transact(UNPROVISION_DEVICE, data, &reply); 24068b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker 24168b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker return reply.readInt32(); 24268b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker } 24368b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker 244441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t getSecureStops(List<Vector<uint8_t> > &secureStops) { 245441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 246441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 247441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 248441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker remote()->transact(GET_SECURE_STOPS, data, &reply); 249441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 250441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker secureStops.clear(); 251441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker uint32_t count = reply.readInt32(); 252441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker for (size_t i = 0; i < count; i++) { 253441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> secureStop; 2544c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(reply, secureStop); 255441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker secureStops.push_back(secureStop); 256441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 257441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 258441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 259441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 2603c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker virtual status_t getSecureStop(Vector<uint8_t> const &ssid, Vector<uint8_t> &secureStop) { 2613c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker Parcel data, reply; 2623c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 2633c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker 2643c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker writeVector(data, ssid); 2653c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker remote()->transact(GET_SECURE_STOP, data, &reply); 2663c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker 2673c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker readVector(reply, secureStop); 2683c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker return reply.readInt32(); 2693c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker } 2703c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker 271441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t releaseSecureStops(Vector<uint8_t> const &ssRelease) { 272441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 273441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 274441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 2754c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, ssRelease); 276441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker remote()->transact(RELEASE_SECURE_STOPS, data, &reply); 277441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 278441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 279441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 280441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 2813c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker virtual status_t releaseAllSecureStops() { 2823c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker Parcel data, reply; 2833c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 2843c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker 2853c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker remote()->transact(RELEASE_ALL_SECURE_STOPS, data, &reply); 2863c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker 2873c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker return reply.readInt32(); 2883c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker } 2893c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker 290441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t getPropertyString(String8 const &name, String8 &value) const { 291441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 292441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 293441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 294441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeString8(name); 295441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker remote()->transact(GET_PROPERTY_STRING, data, &reply); 296441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 297441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker value = reply.readString8(); 298441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 299441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 300441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 301441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t getPropertyByteArray(String8 const &name, Vector<uint8_t> &value) const { 302441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 303441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 304441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 305441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeString8(name); 306441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker remote()->transact(GET_PROPERTY_BYTE_ARRAY, data, &reply); 307441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 3084c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(reply, value); 309441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 310441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 311441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 312441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t setPropertyString(String8 const &name, String8 const &value) const { 313441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 314441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 315441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 316441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeString8(name); 317441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeString8(value); 318441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker remote()->transact(SET_PROPERTY_STRING, data, &reply); 319441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 320441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 321441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 322441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 323441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t setPropertyByteArray(String8 const &name, 324441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> const &value) const { 325441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 326441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 327441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 328441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeString8(name); 3294c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, value); 330441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker remote()->transact(SET_PROPERTY_BYTE_ARRAY, data, &reply); 331441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 332441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 333441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 334441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 335441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 3364c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker virtual status_t setCipherAlgorithm(Vector<uint8_t> const &sessionId, 3374c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker String8 const &algorithm) { 3384c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Parcel data, reply; 3394c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 3404c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 3414c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, sessionId); 3424c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.writeString8(algorithm); 3434c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker remote()->transact(SET_CIPHER_ALGORITHM, data, &reply); 3444c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return reply.readInt32(); 3454c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 3464c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 3474c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker virtual status_t setMacAlgorithm(Vector<uint8_t> const &sessionId, 3484c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker String8 const &algorithm) { 3494c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Parcel data, reply; 3504c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 3514c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 3524c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, sessionId); 3534c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.writeString8(algorithm); 3544c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker remote()->transact(SET_MAC_ALGORITHM, data, &reply); 3554c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return reply.readInt32(); 3564c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 3574c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 3584c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker virtual status_t encrypt(Vector<uint8_t> const &sessionId, 3594c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &keyId, 3604c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &input, 3614c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &iv, 3624c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> &output) { 3634c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Parcel data, reply; 3644c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 3654c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 3664c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, sessionId); 3674c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, keyId); 3684c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, input); 3694c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, iv); 3704c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 3714c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker remote()->transact(ENCRYPT, data, &reply); 3724c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(reply, output); 3734c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 3744c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return reply.readInt32(); 3754c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 3764c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 3774c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker virtual status_t decrypt(Vector<uint8_t> const &sessionId, 3784c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &keyId, 3794c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &input, 3804c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &iv, 3814c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> &output) { 3824c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Parcel data, reply; 3834c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 3844c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 3854c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, sessionId); 3864c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, keyId); 3874c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, input); 3884c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, iv); 3894c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 3904c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker remote()->transact(DECRYPT, data, &reply); 3914c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(reply, output); 3924c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 3934c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return reply.readInt32(); 3944c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 3954c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 3964c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker virtual status_t sign(Vector<uint8_t> const &sessionId, 3974c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &keyId, 3984c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &message, 3994c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> &signature) { 4004c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Parcel data, reply; 4014c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 4024c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 4034c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, sessionId); 4044c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, keyId); 4054c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, message); 4064c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 4074c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker remote()->transact(SIGN, data, &reply); 4084c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(reply, signature); 4094c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 4104c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return reply.readInt32(); 4114c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 4124c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 4134c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker virtual status_t verify(Vector<uint8_t> const &sessionId, 4144c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &keyId, 4154c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &message, 4164c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &signature, 4174c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker bool &match) { 4184c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Parcel data, reply; 4194c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 4204c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 4214c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, sessionId); 4224c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, keyId); 4234c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, message); 4244c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, signature); 4254c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 4264c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker remote()->transact(VERIFY, data, &reply); 4274c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker match = (bool)reply.readInt32(); 4284c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return reply.readInt32(); 4294c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 4304c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 43168d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker virtual status_t signRSA(Vector<uint8_t> const &sessionId, 43268d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker String8 const &algorithm, 43368d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker Vector<uint8_t> const &message, 43468d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker Vector<uint8_t> const &wrappedKey, 43568d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker Vector<uint8_t> &signature) { 43668d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker Parcel data, reply; 43768d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 43868d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker 43968d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker writeVector(data, sessionId); 44068d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker data.writeString8(algorithm); 44168d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker writeVector(data, message); 44268d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker writeVector(data, wrappedKey); 44368d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker 44468d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker remote()->transact(SIGN_RSA, data, &reply); 44568d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker readVector(reply, signature); 44668d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker 44768d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker return reply.readInt32(); 44868d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker } 44968d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker 450c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker virtual status_t setListener(const sp<IDrmClient>& listener) { 451c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker Parcel data, reply; 452c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 453c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker data.writeStrongBinder(listener->asBinder()); 454c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker remote()->transact(SET_LISTENER, data, &reply); 455c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker return reply.readInt32(); 456c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker } 457c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker 458441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinkerprivate: 4594c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker void readVector(Parcel &reply, Vector<uint8_t> &vector) const { 4604c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker uint32_t size = reply.readInt32(); 4614c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker vector.insertAt((size_t)0, size); 4624c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply.read(vector.editArray(), size); 4634c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 4644c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 4654c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker void writeVector(Parcel &data, Vector<uint8_t> const &vector) const { 4664c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.writeInt32(vector.size()); 4674c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.write(vector.array(), vector.size()); 4684c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 4694c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 470441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker DISALLOW_EVIL_CONSTRUCTORS(BpDrm); 471441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker}; 472441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 473441a78d5e224e0d67f9b52fa9adc795c6944159bJeff TinkerIMPLEMENT_META_INTERFACE(Drm, "android.drm.IDrm"); 474441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 475441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker//////////////////////////////////////////////////////////////////////////////// 476441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 4774c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinkervoid BnDrm::readVector(const Parcel &data, Vector<uint8_t> &vector) const { 4784c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker uint32_t size = data.readInt32(); 4794c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker vector.insertAt((size_t)0, size); 4804c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.read(vector.editArray(), size); 4814c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker} 4824c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 4834c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinkervoid BnDrm::writeVector(Parcel *reply, Vector<uint8_t> const &vector) const { 4844c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply->writeInt32(vector.size()); 4854c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply->write(vector.array(), vector.size()); 4864c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker} 4874c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 488441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinkerstatus_t BnDrm::onTransact( 489441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) { 490441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker switch (code) { 491441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case INIT_CHECK: 492441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 493441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 494441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(initCheck()); 495441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 496441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 497441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 498441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case IS_CRYPTO_SUPPORTED: 499441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 500441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 501441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker uint8_t uuid[16]; 502441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.read(uuid, sizeof(uuid)); 5039cf69e0fc110f17c28e988ed0f9bf91abfaf710dJeff Tinker String8 mimeType = data.readString8(); 5049cf69e0fc110f17c28e988ed0f9bf91abfaf710dJeff Tinker reply->writeInt32(isCryptoSchemeSupported(uuid, mimeType)); 5059cf69e0fc110f17c28e988ed0f9bf91abfaf710dJeff Tinker 506441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 507441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 508441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 509441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case CREATE_PLUGIN: 510441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 511441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 512441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker uint8_t uuid[16]; 513441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.read(uuid, sizeof(uuid)); 514441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(createPlugin(uuid)); 515441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 516441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 517441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 518441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case DESTROY_PLUGIN: 519441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 520441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 521441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(destroyPlugin()); 522441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 523441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 524441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 525441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case OPEN_SESSION: 526441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 527441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 528441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> sessionId; 529441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker status_t result = openSession(sessionId); 5304c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(reply, sessionId); 531441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(result); 532441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 533441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 534441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 535441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case CLOSE_SESSION: 536441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 537441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 538441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> sessionId; 5394c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, sessionId); 540441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(closeSession(sessionId)); 541441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 542441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 543441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 5444c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker case GET_KEY_REQUEST: 545441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 546441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 5474c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> sessionId, initData; 548441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 5494c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, sessionId); 5504c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, initData); 551441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 mimeType = data.readString8(); 5524c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker DrmPlugin::KeyType keyType = (DrmPlugin::KeyType)data.readInt32(); 553441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 554441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker KeyedVector<String8, String8> optionalParameters; 555441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker uint32_t count = data.readInt32(); 556441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker for (size_t i = 0; i < count; ++i) { 557441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 key, value; 558441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker key = data.readString8(); 559441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker value = data.readString8(); 560441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker optionalParameters.add(key, value); 561441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 562441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 563441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> request; 564441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 defaultUrl; 565441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 5664c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker status_t result = getKeyRequest(sessionId, initData, 5674c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker mimeType, keyType, 5684c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker optionalParameters, 5694c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker request, defaultUrl); 5704c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(reply, request); 571441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeString8(defaultUrl); 572441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(result); 573441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 574441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 575441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 5764c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker case PROVIDE_KEY_RESPONSE: 577441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 578441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 5794c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> sessionId, response, keySetId; 5804c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, sessionId); 5814c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, response); 5824c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker uint32_t result = provideKeyResponse(sessionId, response, keySetId); 5834c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(reply, keySetId); 5844c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply->writeInt32(result); 5854c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return OK; 5864c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 587441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 5884c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker case REMOVE_KEYS: 5894c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker { 5904c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 5914c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> keySetId; 5924c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, keySetId); 5934c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply->writeInt32(removeKeys(keySetId)); 594441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 595441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 596441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 5974c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker case RESTORE_KEYS: 598441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 599441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 6004c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> sessionId, keySetId; 6014c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, sessionId); 6024c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, keySetId); 6034c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply->writeInt32(restoreKeys(sessionId, keySetId)); 604441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 605441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 606441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 6074c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker case QUERY_KEY_STATUS: 608441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 609441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 610441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> sessionId; 6114c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, sessionId); 612441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker KeyedVector<String8, String8> infoMap; 6134c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker status_t result = queryKeyStatus(sessionId, infoMap); 614441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker size_t count = infoMap.size(); 615441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(count); 616441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker for (size_t i = 0; i < count; ++i) { 617441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeString8(infoMap.keyAt(i)); 618441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeString8(infoMap.valueAt(i)); 619441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 620441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(result); 621441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 622441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 623441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 624441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case GET_PROVISION_REQUEST: 625441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 626441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 62768d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker String8 certType = data.readString8(); 62868d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker String8 certAuthority = data.readString8(); 62968d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker 630441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> request; 631441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 defaultUrl; 63268d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker status_t result = getProvisionRequest(certType, certAuthority, 63368d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker request, defaultUrl); 6344c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(reply, request); 635441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeString8(defaultUrl); 636441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(result); 637441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 638441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 639441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 640441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case PROVIDE_PROVISION_RESPONSE: 641441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 642441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 643441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> response; 64468d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker Vector<uint8_t> certificate; 64568d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker Vector<uint8_t> wrappedKey; 6464c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, response); 64768d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker status_t result = provideProvisionResponse(response, certificate, wrappedKey); 64868d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker writeVector(reply, certificate); 64968d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker writeVector(reply, wrappedKey); 65068d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker reply->writeInt32(result); 651441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 652441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 653441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 65468b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker case UNPROVISION_DEVICE: 65568b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker { 65668b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker CHECK_INTERFACE(IDrm, data, reply); 65768b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker status_t result = unprovisionDevice(); 65868b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker reply->writeInt32(result); 65968b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker return OK; 66068b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker } 66168b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker 662441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case GET_SECURE_STOPS: 663441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 664441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 665441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker List<Vector<uint8_t> > secureStops; 666441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker status_t result = getSecureStops(secureStops); 667441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker size_t count = secureStops.size(); 668441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(count); 669441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker List<Vector<uint8_t> >::iterator iter = secureStops.begin(); 670441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker while(iter != secureStops.end()) { 671441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker size_t size = iter->size(); 672441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(size); 673441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->write(iter->array(), iter->size()); 674423e33ce6569cb14ecf772e9670208517f7b30c4Jeff Tinker iter++; 675441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 676441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(result); 677441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 678441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 679441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 6803c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker case GET_SECURE_STOP: 6813c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker { 6823c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 6833c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker Vector<uint8_t> ssid, secureStop; 6843c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker readVector(data, ssid); 6853c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker status_t result = getSecureStop(ssid, secureStop); 6863c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker writeVector(reply, secureStop); 6873c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker reply->writeInt32(result); 6883c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker return OK; 6893c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker } 6903c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker 691441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case RELEASE_SECURE_STOPS: 692441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 693441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 694441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> ssRelease; 6954c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, ssRelease); 696441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(releaseSecureStops(ssRelease)); 697441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 698441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 699441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 7003c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker case RELEASE_ALL_SECURE_STOPS: 7013c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker { 7023c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 7033c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker reply->writeInt32(releaseAllSecureStops()); 7043c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker return OK; 7053c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker } 7063c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker 707441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case GET_PROPERTY_STRING: 708441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 709441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 710441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 name = data.readString8(); 711441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 value; 712441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker status_t result = getPropertyString(name, value); 713441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeString8(value); 714441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(result); 715441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 716441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 717441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 718441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case GET_PROPERTY_BYTE_ARRAY: 719441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 720441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 721441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 name = data.readString8(); 722441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> value; 723441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker status_t result = getPropertyByteArray(name, value); 7244c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(reply, value); 725441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(result); 726441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 727441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 728441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 729441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case SET_PROPERTY_STRING: 730441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 731441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 732441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 name = data.readString8(); 733441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 value = data.readString8(); 734441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(setPropertyString(name, value)); 735441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 736441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 737441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 738441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case SET_PROPERTY_BYTE_ARRAY: 739441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 740441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 741441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 name = data.readString8(); 742441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> value; 7434c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, value); 744441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(setPropertyByteArray(name, value)); 745441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 746441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 747441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 7484c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker case SET_CIPHER_ALGORITHM: 7494c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker { 7504c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 7514c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> sessionId; 7524c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, sessionId); 7534c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker String8 algorithm = data.readString8(); 7544c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply->writeInt32(setCipherAlgorithm(sessionId, algorithm)); 7554c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return OK; 7564c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 7574c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 7584c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker case SET_MAC_ALGORITHM: 7594c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker { 7604c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 7614c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> sessionId; 7624c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, sessionId); 7634c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker String8 algorithm = data.readString8(); 7644c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply->writeInt32(setMacAlgorithm(sessionId, algorithm)); 7654c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return OK; 7664c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 7674c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 7684c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker case ENCRYPT: 7694c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker { 7704c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 7714c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> sessionId, keyId, input, iv, output; 7724c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, sessionId); 7734c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, keyId); 7744c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, input); 7754c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, iv); 7764c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker uint32_t result = encrypt(sessionId, keyId, input, iv, output); 7774c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(reply, output); 7784c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply->writeInt32(result); 7794c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return OK; 7804c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 7814c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 7824c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker case DECRYPT: 7834c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker { 7844c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 7854c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> sessionId, keyId, input, iv, output; 7864c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, sessionId); 7874c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, keyId); 7884c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, input); 7894c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, iv); 7904c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker uint32_t result = decrypt(sessionId, keyId, input, iv, output); 7914c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(reply, output); 7924c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply->writeInt32(result); 7934c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return OK; 7944c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 7954c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 7964c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker case SIGN: 7974c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker { 7984c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 7994c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> sessionId, keyId, message, signature; 8004c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, sessionId); 8014c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, keyId); 8024c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, message); 8034c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker uint32_t result = sign(sessionId, keyId, message, signature); 8044c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(reply, signature); 8054c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply->writeInt32(result); 8064c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return OK; 8074c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 8084c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 8094c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker case VERIFY: 8104c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker { 8114c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 8124c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> sessionId, keyId, message, signature; 8134c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, sessionId); 8144c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, keyId); 8154c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, message); 8164c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, signature); 8174c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker bool match; 8184c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker uint32_t result = verify(sessionId, keyId, message, signature, match); 8194c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply->writeInt32(match); 8204c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply->writeInt32(result); 8214c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return OK; 8224c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 8234c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 82468d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker case SIGN_RSA: 82568d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker { 82668d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker CHECK_INTERFACE(IDrm, data, reply); 82768d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker Vector<uint8_t> sessionId, message, wrappedKey, signature; 82868d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker readVector(data, sessionId); 82968d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker String8 algorithm = data.readString8(); 83068d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker readVector(data, message); 83168d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker readVector(data, wrappedKey); 83268d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker uint32_t result = signRSA(sessionId, algorithm, message, wrappedKey, signature); 83368d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker writeVector(reply, signature); 83468d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker reply->writeInt32(result); 83568d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker return OK; 83668d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker } 83768d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker 838c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker case SET_LISTENER: { 839c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 840c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker sp<IDrmClient> listener = 841c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker interface_cast<IDrmClient>(data.readStrongBinder()); 842c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker reply->writeInt32(setListener(listener)); 843c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker return NO_ERROR; 844c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker } break; 845c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker 8464c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker default: 8474c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return BBinder::onTransact(code, data, reply, flags); 848441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 849441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker} 850441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 851441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker} // namespace android 852