IDrm.cpp revision 68b15554f6dca3b056eac517fe5fa2fd4ee80a33
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, 5768b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker UNPROVISION_DEVICE 58441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker}; 59441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 60441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinkerstruct BpDrm : public BpInterface<IDrm> { 61441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker BpDrm(const sp<IBinder> &impl) 62441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker : BpInterface<IDrm>(impl) { 63441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 64441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 65441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t initCheck() const { 66441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 67441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 68441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker remote()->transact(INIT_CHECK, data, &reply); 69441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 70441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 71441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 72441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 739cf69e0fc110f17c28e988ed0f9bf91abfaf710dJeff Tinker virtual bool isCryptoSchemeSupported(const uint8_t uuid[16], const String8 &mimeType) { 74441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 75441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 76441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.write(uuid, 16); 779cf69e0fc110f17c28e988ed0f9bf91abfaf710dJeff Tinker data.writeString8(mimeType); 78441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker remote()->transact(IS_CRYPTO_SUPPORTED, data, &reply); 79441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 80441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32() != 0; 81441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 82441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 83441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t createPlugin(const uint8_t uuid[16]) { 84441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 85441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 86441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.write(uuid, 16); 87441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 88441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker remote()->transact(CREATE_PLUGIN, data, &reply); 89441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 90441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 91441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 92441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 93441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t destroyPlugin() { 94441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 95441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 96441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker remote()->transact(DESTROY_PLUGIN, data, &reply); 97441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 98441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 99441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 100441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 101441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t openSession(Vector<uint8_t> &sessionId) { 102441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 103441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 104441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 105441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker remote()->transact(OPEN_SESSION, data, &reply); 1064c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(reply, sessionId); 107441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 108441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 109441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 110441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 111441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t closeSession(Vector<uint8_t> const &sessionId) { 112441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 113441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 114441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 1154c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, sessionId); 116441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker remote()->transact(CLOSE_SESSION, data, &reply); 117441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 118441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 119441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 120441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 121441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t 1224c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker getKeyRequest(Vector<uint8_t> const &sessionId, 1234c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &initData, 1244c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker String8 const &mimeType, DrmPlugin::KeyType keyType, 1254c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker KeyedVector<String8, String8> const &optionalParameters, 1264c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> &request, String8 &defaultUrl) { 127441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 128441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 129441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 1304c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, sessionId); 1314c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, initData); 132441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeString8(mimeType); 1334c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.writeInt32((uint32_t)keyType); 134441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 135441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInt32(optionalParameters.size()); 136441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker for (size_t i = 0; i < optionalParameters.size(); ++i) { 137441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeString8(optionalParameters.keyAt(i)); 138441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeString8(optionalParameters.valueAt(i)); 139441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 1404c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker remote()->transact(GET_KEY_REQUEST, data, &reply); 141441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 1424c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(reply, request); 143441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker defaultUrl = reply.readString8(); 144441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 145441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 146441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 147441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 1484c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker virtual status_t provideKeyResponse(Vector<uint8_t> const &sessionId, 1494c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &response, 1504c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> &keySetId) { 1514c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Parcel data, reply; 1524c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 1534c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, sessionId); 1544c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, response); 1554c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker remote()->transact(PROVIDE_KEY_RESPONSE, data, &reply); 1564c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(reply, keySetId); 1574c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 1584c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return reply.readInt32(); 1594c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 1604c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 1614c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker virtual status_t removeKeys(Vector<uint8_t> const &keySetId) { 162441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 163441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 164441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 1654c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, keySetId); 1664c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker remote()->transact(REMOVE_KEYS, data, &reply); 167441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 168441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 169441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 170441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 1714c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker virtual status_t restoreKeys(Vector<uint8_t> const &sessionId, 1724c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &keySetId) { 173441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 174441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 175441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 1764c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, sessionId); 1774c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, keySetId); 1784c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker remote()->transact(RESTORE_KEYS, data, &reply); 179441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 180441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 181441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 182441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 1834c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker virtual status_t queryKeyStatus(Vector<uint8_t> const &sessionId, 184441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker KeyedVector<String8, String8> &infoMap) const { 185441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 186441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 187441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 1884c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, sessionId); 1894c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker remote()->transact(QUERY_KEY_STATUS, data, &reply); 190441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 191441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker infoMap.clear(); 192441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker size_t count = reply.readInt32(); 193441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker for (size_t i = 0; i < count; i++) { 194441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 key = reply.readString8(); 195441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 value = reply.readString8(); 196441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker infoMap.add(key, value); 197441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 198441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 199441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 200441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 20168d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker virtual status_t getProvisionRequest(String8 const &certType, 20268d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker String8 const &certAuthority, 20368d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker Vector<uint8_t> &request, 204441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 &defaultUrl) { 205441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 206441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 207441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 20868d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker data.writeString8(certType); 20968d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker data.writeString8(certAuthority); 210441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker remote()->transact(GET_PROVISION_REQUEST, data, &reply); 211441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 2124c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(reply, request); 213441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker defaultUrl = reply.readString8(); 214441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 215441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 216441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 217441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 21868d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker virtual status_t provideProvisionResponse(Vector<uint8_t> const &response, 21968d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker Vector<uint8_t> &certificate, 22068d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker Vector<uint8_t> &wrappedKey) { 221441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 222441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 223441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 2244c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, response); 225441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker remote()->transact(PROVIDE_PROVISION_RESPONSE, data, &reply); 226441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 22768d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker readVector(reply, certificate); 22868d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker readVector(reply, wrappedKey); 22968d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker 230441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 231441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 232441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 23368b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker virtual status_t unprovisionDevice() { 23468b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker Parcel data, reply; 23568b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 23668b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker 23768b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker remote()->transact(UNPROVISION_DEVICE, data, &reply); 23868b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker 23968b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker return reply.readInt32(); 24068b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker } 24168b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker 242441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t getSecureStops(List<Vector<uint8_t> > &secureStops) { 243441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 244441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 245441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 246441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker remote()->transact(GET_SECURE_STOPS, data, &reply); 247441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 248441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker secureStops.clear(); 249441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker uint32_t count = reply.readInt32(); 250441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker for (size_t i = 0; i < count; i++) { 251441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> secureStop; 2524c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(reply, secureStop); 253441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker secureStops.push_back(secureStop); 254441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 255441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 256441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 257441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 258441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t releaseSecureStops(Vector<uint8_t> const &ssRelease) { 259441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 260441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 261441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 2624c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, ssRelease); 263441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker remote()->transact(RELEASE_SECURE_STOPS, data, &reply); 264441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 265441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 266441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 267441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 268441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t getPropertyString(String8 const &name, String8 &value) const { 269441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 270441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 271441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 272441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeString8(name); 273441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker remote()->transact(GET_PROPERTY_STRING, data, &reply); 274441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 275441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker value = reply.readString8(); 276441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 277441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 278441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 279441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t getPropertyByteArray(String8 const &name, Vector<uint8_t> &value) const { 280441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 281441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 282441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 283441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeString8(name); 284441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker remote()->transact(GET_PROPERTY_BYTE_ARRAY, data, &reply); 285441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 2864c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(reply, value); 287441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 288441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 289441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 290441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t setPropertyString(String8 const &name, String8 const &value) const { 291441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 292441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 293441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 294441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeString8(name); 295441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeString8(value); 296441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker remote()->transact(SET_PROPERTY_STRING, data, &reply); 297441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 298441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 299441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 300441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 301441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t setPropertyByteArray(String8 const &name, 302441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> const &value) const { 303441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 304441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 305441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 306441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeString8(name); 3074c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, value); 308441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker remote()->transact(SET_PROPERTY_BYTE_ARRAY, data, &reply); 309441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 310441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 311441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 312441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 313441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 3144c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker virtual status_t setCipherAlgorithm(Vector<uint8_t> const &sessionId, 3154c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker String8 const &algorithm) { 3164c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Parcel data, reply; 3174c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 3184c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 3194c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, sessionId); 3204c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.writeString8(algorithm); 3214c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker remote()->transact(SET_CIPHER_ALGORITHM, data, &reply); 3224c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return reply.readInt32(); 3234c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 3244c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 3254c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker virtual status_t setMacAlgorithm(Vector<uint8_t> const &sessionId, 3264c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker String8 const &algorithm) { 3274c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Parcel data, reply; 3284c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 3294c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 3304c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, sessionId); 3314c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.writeString8(algorithm); 3324c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker remote()->transact(SET_MAC_ALGORITHM, data, &reply); 3334c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return reply.readInt32(); 3344c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 3354c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 3364c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker virtual status_t encrypt(Vector<uint8_t> const &sessionId, 3374c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &keyId, 3384c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &input, 3394c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &iv, 3404c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> &output) { 3414c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Parcel data, reply; 3424c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 3434c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 3444c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, sessionId); 3454c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, keyId); 3464c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, input); 3474c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, iv); 3484c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 3494c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker remote()->transact(ENCRYPT, data, &reply); 3504c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(reply, output); 3514c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 3524c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return reply.readInt32(); 3534c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 3544c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 3554c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker virtual status_t decrypt(Vector<uint8_t> const &sessionId, 3564c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &keyId, 3574c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &input, 3584c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &iv, 3594c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> &output) { 3604c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Parcel data, reply; 3614c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 3624c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 3634c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, sessionId); 3644c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, keyId); 3654c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, input); 3664c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, iv); 3674c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 3684c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker remote()->transact(DECRYPT, data, &reply); 3694c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(reply, output); 3704c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 3714c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return reply.readInt32(); 3724c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 3734c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 3744c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker virtual status_t sign(Vector<uint8_t> const &sessionId, 3754c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &keyId, 3764c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &message, 3774c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> &signature) { 3784c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Parcel data, reply; 3794c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 3804c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 3814c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, sessionId); 3824c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, keyId); 3834c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, message); 3844c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 3854c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker remote()->transact(SIGN, data, &reply); 3864c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(reply, signature); 3874c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 3884c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return reply.readInt32(); 3894c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 3904c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 3914c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker virtual status_t verify(Vector<uint8_t> const &sessionId, 3924c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &keyId, 3934c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &message, 3944c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &signature, 3954c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker bool &match) { 3964c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Parcel data, reply; 3974c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 3984c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 3994c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, sessionId); 4004c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, keyId); 4014c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, message); 4024c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, signature); 4034c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 4044c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker remote()->transact(VERIFY, data, &reply); 4054c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker match = (bool)reply.readInt32(); 4064c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return reply.readInt32(); 4074c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 4084c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 40968d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker virtual status_t signRSA(Vector<uint8_t> const &sessionId, 41068d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker String8 const &algorithm, 41168d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker Vector<uint8_t> const &message, 41268d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker Vector<uint8_t> const &wrappedKey, 41368d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker Vector<uint8_t> &signature) { 41468d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker Parcel data, reply; 41568d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 41668d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker 41768d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker writeVector(data, sessionId); 41868d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker data.writeString8(algorithm); 41968d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker writeVector(data, message); 42068d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker writeVector(data, wrappedKey); 42168d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker 42268d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker remote()->transact(SIGN_RSA, data, &reply); 42368d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker readVector(reply, signature); 42468d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker 42568d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker return reply.readInt32(); 42668d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker } 42768d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker 428c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker virtual status_t setListener(const sp<IDrmClient>& listener) { 429c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker Parcel data, reply; 430c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 431c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker data.writeStrongBinder(listener->asBinder()); 432c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker remote()->transact(SET_LISTENER, data, &reply); 433c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker return reply.readInt32(); 434c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker } 435c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker 436441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinkerprivate: 4374c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker void readVector(Parcel &reply, Vector<uint8_t> &vector) const { 4384c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker uint32_t size = reply.readInt32(); 4394c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker vector.insertAt((size_t)0, size); 4404c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply.read(vector.editArray(), size); 4414c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 4424c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 4434c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker void writeVector(Parcel &data, Vector<uint8_t> const &vector) const { 4444c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.writeInt32(vector.size()); 4454c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.write(vector.array(), vector.size()); 4464c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 4474c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 448441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker DISALLOW_EVIL_CONSTRUCTORS(BpDrm); 449441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker}; 450441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 451441a78d5e224e0d67f9b52fa9adc795c6944159bJeff TinkerIMPLEMENT_META_INTERFACE(Drm, "android.drm.IDrm"); 452441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 453441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker//////////////////////////////////////////////////////////////////////////////// 454441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 4554c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinkervoid BnDrm::readVector(const Parcel &data, Vector<uint8_t> &vector) const { 4564c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker uint32_t size = data.readInt32(); 4574c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker vector.insertAt((size_t)0, size); 4584c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.read(vector.editArray(), size); 4594c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker} 4604c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 4614c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinkervoid BnDrm::writeVector(Parcel *reply, Vector<uint8_t> const &vector) const { 4624c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply->writeInt32(vector.size()); 4634c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply->write(vector.array(), vector.size()); 4644c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker} 4654c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 466441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinkerstatus_t BnDrm::onTransact( 467441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) { 468441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker switch (code) { 469441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case INIT_CHECK: 470441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 471441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 472441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(initCheck()); 473441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 474441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 475441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 476441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case IS_CRYPTO_SUPPORTED: 477441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 478441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 479441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker uint8_t uuid[16]; 480441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.read(uuid, sizeof(uuid)); 4819cf69e0fc110f17c28e988ed0f9bf91abfaf710dJeff Tinker String8 mimeType = data.readString8(); 4829cf69e0fc110f17c28e988ed0f9bf91abfaf710dJeff Tinker reply->writeInt32(isCryptoSchemeSupported(uuid, mimeType)); 4839cf69e0fc110f17c28e988ed0f9bf91abfaf710dJeff Tinker 484441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 485441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 486441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 487441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case CREATE_PLUGIN: 488441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 489441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 490441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker uint8_t uuid[16]; 491441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.read(uuid, sizeof(uuid)); 492441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(createPlugin(uuid)); 493441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 494441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 495441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 496441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case DESTROY_PLUGIN: 497441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 498441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 499441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(destroyPlugin()); 500441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 501441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 502441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 503441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case OPEN_SESSION: 504441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 505441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 506441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> sessionId; 507441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker status_t result = openSession(sessionId); 5084c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(reply, sessionId); 509441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(result); 510441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 511441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 512441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 513441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case CLOSE_SESSION: 514441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 515441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 516441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> sessionId; 5174c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, sessionId); 518441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(closeSession(sessionId)); 519441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 520441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 521441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 5224c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker case GET_KEY_REQUEST: 523441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 524441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 5254c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> sessionId, initData; 526441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 5274c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, sessionId); 5284c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, initData); 529441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 mimeType = data.readString8(); 5304c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker DrmPlugin::KeyType keyType = (DrmPlugin::KeyType)data.readInt32(); 531441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 532441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker KeyedVector<String8, String8> optionalParameters; 533441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker uint32_t count = data.readInt32(); 534441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker for (size_t i = 0; i < count; ++i) { 535441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 key, value; 536441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker key = data.readString8(); 537441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker value = data.readString8(); 538441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker optionalParameters.add(key, value); 539441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 540441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 541441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> request; 542441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 defaultUrl; 543441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 5444c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker status_t result = getKeyRequest(sessionId, initData, 5454c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker mimeType, keyType, 5464c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker optionalParameters, 5474c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker request, defaultUrl); 5484c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(reply, request); 549441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeString8(defaultUrl); 550441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(result); 551441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 552441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 553441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 5544c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker case PROVIDE_KEY_RESPONSE: 555441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 556441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 5574c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> sessionId, response, keySetId; 5584c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, sessionId); 5594c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, response); 5604c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker uint32_t result = provideKeyResponse(sessionId, response, keySetId); 5614c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(reply, keySetId); 5624c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply->writeInt32(result); 5634c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return OK; 5644c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 565441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 5664c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker case REMOVE_KEYS: 5674c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker { 5684c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 5694c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> keySetId; 5704c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, keySetId); 5714c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply->writeInt32(removeKeys(keySetId)); 572441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 573441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 574441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 5754c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker case RESTORE_KEYS: 576441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 577441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 5784c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> sessionId, keySetId; 5794c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, sessionId); 5804c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, keySetId); 5814c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply->writeInt32(restoreKeys(sessionId, keySetId)); 582441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 583441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 584441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 5854c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker case QUERY_KEY_STATUS: 586441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 587441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 588441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> sessionId; 5894c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, sessionId); 590441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker KeyedVector<String8, String8> infoMap; 5914c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker status_t result = queryKeyStatus(sessionId, infoMap); 592441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker size_t count = infoMap.size(); 593441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(count); 594441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker for (size_t i = 0; i < count; ++i) { 595441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeString8(infoMap.keyAt(i)); 596441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeString8(infoMap.valueAt(i)); 597441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 598441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(result); 599441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 600441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 601441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 602441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case GET_PROVISION_REQUEST: 603441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 604441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 60568d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker String8 certType = data.readString8(); 60668d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker String8 certAuthority = data.readString8(); 60768d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker 608441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> request; 609441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 defaultUrl; 61068d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker status_t result = getProvisionRequest(certType, certAuthority, 61168d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker request, defaultUrl); 6124c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(reply, request); 613441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeString8(defaultUrl); 614441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(result); 615441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 616441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 617441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 618441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case PROVIDE_PROVISION_RESPONSE: 619441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 620441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 621441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> response; 62268d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker Vector<uint8_t> certificate; 62368d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker Vector<uint8_t> wrappedKey; 6244c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, response); 62568d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker status_t result = provideProvisionResponse(response, certificate, wrappedKey); 62668d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker writeVector(reply, certificate); 62768d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker writeVector(reply, wrappedKey); 62868d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker reply->writeInt32(result); 629441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 630441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 631441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 63268b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker case UNPROVISION_DEVICE: 63368b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker { 63468b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker CHECK_INTERFACE(IDrm, data, reply); 63568b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker status_t result = unprovisionDevice(); 63668b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker reply->writeInt32(result); 63768b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker return OK; 63868b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker } 63968b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker 640441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case GET_SECURE_STOPS: 641441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 642441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 643441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker List<Vector<uint8_t> > secureStops; 644441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker status_t result = getSecureStops(secureStops); 645441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker size_t count = secureStops.size(); 646441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(count); 647441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker List<Vector<uint8_t> >::iterator iter = secureStops.begin(); 648441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker while(iter != secureStops.end()) { 649441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker size_t size = iter->size(); 650441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(size); 651441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->write(iter->array(), iter->size()); 652423e33ce6569cb14ecf772e9670208517f7b30c4Jeff Tinker iter++; 653441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 654441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(result); 655441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 656441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 657441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 658441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case RELEASE_SECURE_STOPS: 659441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 660441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 661441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> ssRelease; 6624c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, ssRelease); 663441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(releaseSecureStops(ssRelease)); 664441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 665441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 666441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 667441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case GET_PROPERTY_STRING: 668441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 669441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 670441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 name = data.readString8(); 671441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 value; 672441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker status_t result = getPropertyString(name, value); 673441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeString8(value); 674441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(result); 675441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 676441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 677441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 678441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case GET_PROPERTY_BYTE_ARRAY: 679441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 680441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 681441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 name = data.readString8(); 682441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> value; 683441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker status_t result = getPropertyByteArray(name, value); 6844c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(reply, value); 685441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(result); 686441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 687441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 688441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 689441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case SET_PROPERTY_STRING: 690441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 691441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 692441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 name = data.readString8(); 693441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 value = data.readString8(); 694441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(setPropertyString(name, value)); 695441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 696441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 697441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 698441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case SET_PROPERTY_BYTE_ARRAY: 699441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 700441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 701441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 name = data.readString8(); 702441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> value; 7034c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, value); 704441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(setPropertyByteArray(name, value)); 705441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 706441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 707441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 7084c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker case SET_CIPHER_ALGORITHM: 7094c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker { 7104c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 7114c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> sessionId; 7124c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, sessionId); 7134c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker String8 algorithm = data.readString8(); 7144c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply->writeInt32(setCipherAlgorithm(sessionId, algorithm)); 7154c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return OK; 7164c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 7174c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 7184c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker case SET_MAC_ALGORITHM: 7194c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker { 7204c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 7214c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> sessionId; 7224c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, sessionId); 7234c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker String8 algorithm = data.readString8(); 7244c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply->writeInt32(setMacAlgorithm(sessionId, algorithm)); 7254c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return OK; 7264c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 7274c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 7284c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker case ENCRYPT: 7294c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker { 7304c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 7314c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> sessionId, keyId, input, iv, output; 7324c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, sessionId); 7334c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, keyId); 7344c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, input); 7354c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, iv); 7364c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker uint32_t result = encrypt(sessionId, keyId, input, iv, output); 7374c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(reply, output); 7384c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply->writeInt32(result); 7394c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return OK; 7404c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 7414c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 7424c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker case DECRYPT: 7434c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker { 7444c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 7454c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> sessionId, keyId, input, iv, output; 7464c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, sessionId); 7474c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, keyId); 7484c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, input); 7494c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, iv); 7504c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker uint32_t result = decrypt(sessionId, keyId, input, iv, output); 7514c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(reply, output); 7524c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply->writeInt32(result); 7534c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return OK; 7544c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 7554c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 7564c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker case SIGN: 7574c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker { 7584c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 7594c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> sessionId, keyId, message, signature; 7604c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, sessionId); 7614c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, keyId); 7624c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, message); 7634c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker uint32_t result = sign(sessionId, keyId, message, signature); 7644c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(reply, signature); 7654c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply->writeInt32(result); 7664c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return OK; 7674c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 7684c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 7694c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker case VERIFY: 7704c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker { 7714c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 7724c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> sessionId, keyId, message, signature; 7734c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, sessionId); 7744c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, keyId); 7754c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, message); 7764c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, signature); 7774c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker bool match; 7784c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker uint32_t result = verify(sessionId, keyId, message, signature, match); 7794c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply->writeInt32(match); 7804c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply->writeInt32(result); 7814c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return OK; 7824c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 7834c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 78468d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker case SIGN_RSA: 78568d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker { 78668d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker CHECK_INTERFACE(IDrm, data, reply); 78768d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker Vector<uint8_t> sessionId, message, wrappedKey, signature; 78868d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker readVector(data, sessionId); 78968d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker String8 algorithm = data.readString8(); 79068d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker readVector(data, message); 79168d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker readVector(data, wrappedKey); 79268d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker uint32_t result = signRSA(sessionId, algorithm, message, wrappedKey, signature); 79368d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker writeVector(reply, signature); 79468d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker reply->writeInt32(result); 79568d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker return OK; 79668d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker } 79768d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker 798c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker case SET_LISTENER: { 799c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 800c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker sp<IDrmClient> listener = 801c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker interface_cast<IDrmClient>(data.readStrongBinder()); 802c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker reply->writeInt32(setListener(listener)); 803c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker return NO_ERROR; 804c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker } break; 805c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker 8064c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker default: 8074c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return BBinder::onTransact(code, data, reply, flags); 808441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 809441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker} 810441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 811441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker} // namespace android 812441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 813