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 GET_SECURE_STOP, 583c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker RELEASE_ALL_SECURE_STOPS 59441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker}; 60441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 61441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinkerstruct BpDrm : public BpInterface<IDrm> { 62441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker BpDrm(const sp<IBinder> &impl) 63441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker : BpInterface<IDrm>(impl) { 64441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 65441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 66441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t initCheck() const { 67441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 68441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 693b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(INIT_CHECK, data, &reply); 703b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 713b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 723b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 73441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 74441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 75441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 76441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 779cf69e0fc110f17c28e988ed0f9bf91abfaf710dJeff Tinker virtual bool isCryptoSchemeSupported(const uint8_t uuid[16], const String8 &mimeType) { 78441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 79441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 80441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.write(uuid, 16); 819cf69e0fc110f17c28e988ed0f9bf91abfaf710dJeff Tinker data.writeString8(mimeType); 823b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(IS_CRYPTO_SUPPORTED, data, &reply); 833b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 843b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker ALOGE("isCryptoSchemeSupported: binder call failed: %d", status); 853b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return false; 863b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 87441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 88441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32() != 0; 89441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 90441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 91441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t createPlugin(const uint8_t uuid[16]) { 92441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 93441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 94441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.write(uuid, 16); 95441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 963b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(CREATE_PLUGIN, data, &reply); 973b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 983b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 993b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 100441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 101441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 102441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 103441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 104441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t destroyPlugin() { 105441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 106441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 1073b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(DESTROY_PLUGIN, data, &reply); 1083b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 1093b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 1103b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 111441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 112441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 113441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 114441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 115441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t openSession(Vector<uint8_t> &sessionId) { 116441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 117441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 118441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 1193b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(OPEN_SESSION, data, &reply); 1203b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 1213b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 1223b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 1234c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(reply, sessionId); 124441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 125441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 126441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 127441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 128441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t closeSession(Vector<uint8_t> const &sessionId) { 129441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 130441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 131441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 1324c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, sessionId); 1333b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(CLOSE_SESSION, data, &reply); 1343b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 1353b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 1363b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 137441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 138441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 139441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 140441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 141441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t 1424c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker getKeyRequest(Vector<uint8_t> const &sessionId, 1434c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &initData, 1444c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker String8 const &mimeType, DrmPlugin::KeyType keyType, 1454c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker KeyedVector<String8, String8> const &optionalParameters, 146d072c909d87f8150433860f6de4c11df6e09e2f9Jeff Tinker Vector<uint8_t> &request, String8 &defaultUrl, 147d072c909d87f8150433860f6de4c11df6e09e2f9Jeff Tinker DrmPlugin::KeyRequestType *keyRequestType) { 148441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 149441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 150441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 1514c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, sessionId); 1524c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, initData); 153441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeString8(mimeType); 1544c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.writeInt32((uint32_t)keyType); 155441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 156441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInt32(optionalParameters.size()); 157441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker for (size_t i = 0; i < optionalParameters.size(); ++i) { 158441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeString8(optionalParameters.keyAt(i)); 159441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeString8(optionalParameters.valueAt(i)); 160441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 1613b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker 1623b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(GET_KEY_REQUEST, data, &reply); 1633b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 1643b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 1653b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 166441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 1674c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(reply, request); 168441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker defaultUrl = reply.readString8(); 169d072c909d87f8150433860f6de4c11df6e09e2f9Jeff Tinker *keyRequestType = static_cast<DrmPlugin::KeyRequestType>(reply.readInt32()); 170441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 171441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 172441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 173441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 1744c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker virtual status_t provideKeyResponse(Vector<uint8_t> const &sessionId, 1754c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &response, 1764c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> &keySetId) { 1774c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Parcel data, reply; 1784c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 1794c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, sessionId); 1804c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, response); 1813b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker 1823b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(PROVIDE_KEY_RESPONSE, data, &reply); 1833b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 1843b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 1853b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 1863b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker 1874c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(reply, keySetId); 1884c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 1894c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return reply.readInt32(); 1904c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 1914c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 1924c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker virtual status_t removeKeys(Vector<uint8_t> const &keySetId) { 193441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 194441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 195441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 1964c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, keySetId); 1973b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(REMOVE_KEYS, data, &reply); 1983b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 1993b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 2003b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 201441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 202441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 203441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 204441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 2054c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker virtual status_t restoreKeys(Vector<uint8_t> const &sessionId, 2064c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &keySetId) { 207441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 208441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 209441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 2104c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, sessionId); 2114c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, keySetId); 2123b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(RESTORE_KEYS, data, &reply); 2133b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 2143b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 2153b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 216441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 217441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 218441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 219441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 2204c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker virtual status_t queryKeyStatus(Vector<uint8_t> const &sessionId, 221441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker KeyedVector<String8, String8> &infoMap) const { 222441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 223441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 224441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 2254c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, sessionId); 2263b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(QUERY_KEY_STATUS, data, &reply); 2273b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 2283b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 2293b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 230441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 231441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker infoMap.clear(); 232441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker size_t count = reply.readInt32(); 233441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker for (size_t i = 0; i < count; i++) { 234441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 key = reply.readString8(); 235441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 value = reply.readString8(); 236441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker infoMap.add(key, value); 237441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 238441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 239441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 240441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 24168d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker virtual status_t getProvisionRequest(String8 const &certType, 24268d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker String8 const &certAuthority, 24368d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker Vector<uint8_t> &request, 244441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 &defaultUrl) { 245441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 246441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 247441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 24868d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker data.writeString8(certType); 24968d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker data.writeString8(certAuthority); 2503b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(GET_PROVISION_REQUEST, data, &reply); 2513b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 2523b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 2533b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 254441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 2554c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(reply, request); 256441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker defaultUrl = reply.readString8(); 257441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 258441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 259441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 260441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 26168d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker virtual status_t provideProvisionResponse(Vector<uint8_t> const &response, 26268d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker Vector<uint8_t> &certificate, 26368d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker Vector<uint8_t> &wrappedKey) { 264441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 265441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 266441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 2674c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, response); 2683b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(PROVIDE_PROVISION_RESPONSE, data, &reply); 2693b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 2703b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 2713b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 272441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 27368d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker readVector(reply, certificate); 27468d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker readVector(reply, wrappedKey); 27568d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker 276441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 277441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 278441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 279441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t getSecureStops(List<Vector<uint8_t> > &secureStops) { 280441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 281441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 282441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 2833b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(GET_SECURE_STOPS, data, &reply); 2843b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 2853b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 2863b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 287441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 288441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker secureStops.clear(); 289441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker uint32_t count = reply.readInt32(); 290441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker for (size_t i = 0; i < count; i++) { 291441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> secureStop; 2924c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(reply, secureStop); 293441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker secureStops.push_back(secureStop); 294441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 295441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 296441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 297441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 2983c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker virtual status_t getSecureStop(Vector<uint8_t> const &ssid, Vector<uint8_t> &secureStop) { 2993c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker Parcel data, reply; 3003c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 3013c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker 3023c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker writeVector(data, ssid); 3033b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(GET_SECURE_STOP, data, &reply); 3043b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 3053b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 3063b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 3073c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker 3083c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker readVector(reply, secureStop); 3093c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker return reply.readInt32(); 3103c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker } 3113c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker 312441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t releaseSecureStops(Vector<uint8_t> const &ssRelease) { 313441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 314441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 315441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 3164c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, ssRelease); 3173b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(RELEASE_SECURE_STOPS, data, &reply); 3183b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 3193b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 3203b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 321441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 322441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 323441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 324441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 3253c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker virtual status_t releaseAllSecureStops() { 3263c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker Parcel data, reply; 3273c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 3283c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker 3293b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(RELEASE_ALL_SECURE_STOPS, data, &reply); 3303b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 3313b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 3323b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 3333c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker 3343c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker return reply.readInt32(); 3353c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker } 3363c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker 337441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t getPropertyString(String8 const &name, String8 &value) const { 338441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 339441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 340441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 341441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeString8(name); 3423b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(GET_PROPERTY_STRING, data, &reply); 3433b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 3443b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 3453b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 346441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 347441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker value = reply.readString8(); 348441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 349441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 350441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 351441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t getPropertyByteArray(String8 const &name, Vector<uint8_t> &value) const { 352441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 353441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 354441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 355441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeString8(name); 3563b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(GET_PROPERTY_BYTE_ARRAY, data, &reply); 3573b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 3583b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 3593b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 360441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 3614c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(reply, value); 362441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 363441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 364441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 365441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t setPropertyString(String8 const &name, String8 const &value) const { 366441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 367441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 368441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 369441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeString8(name); 370441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeString8(value); 3713b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(SET_PROPERTY_STRING, data, &reply); 3723b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 3733b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 3743b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 375441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 376441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 377441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 378441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 379441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t setPropertyByteArray(String8 const &name, 380441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> const &value) const { 381441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 382441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 383441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 384441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeString8(name); 3854c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, value); 3863b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(SET_PROPERTY_BYTE_ARRAY, data, &reply); 3873b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 3883b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 3893b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 390441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 391441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 392441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 393441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 394441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 3954c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker virtual status_t setCipherAlgorithm(Vector<uint8_t> const &sessionId, 3964c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker String8 const &algorithm) { 3974c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Parcel data, reply; 3984c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 3994c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 4004c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, sessionId); 4014c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.writeString8(algorithm); 4023b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(SET_CIPHER_ALGORITHM, data, &reply); 4033b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 4043b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 4053b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 4064c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return reply.readInt32(); 4074c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 4084c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 4094c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker virtual status_t setMacAlgorithm(Vector<uint8_t> const &sessionId, 4104c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker String8 const &algorithm) { 4114c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Parcel data, reply; 4124c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 4134c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 4144c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, sessionId); 4154c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.writeString8(algorithm); 4163b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(SET_MAC_ALGORITHM, data, &reply); 4173b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 4183b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 4193b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 4204c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return reply.readInt32(); 4214c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 4224c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 4234c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker virtual status_t encrypt(Vector<uint8_t> const &sessionId, 4244c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &keyId, 4254c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &input, 4264c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &iv, 4274c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> &output) { 4284c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Parcel data, reply; 4294c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 4304c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 4314c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, sessionId); 4324c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, keyId); 4334c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, input); 4344c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, iv); 4354c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 4363b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(ENCRYPT, data, &reply); 4373b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 4383b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 4393b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 4404c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(reply, output); 4414c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 4424c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return reply.readInt32(); 4434c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 4444c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 4454c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker virtual status_t decrypt(Vector<uint8_t> const &sessionId, 4464c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &keyId, 4474c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &input, 4484c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &iv, 4494c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> &output) { 4504c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Parcel data, reply; 4514c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 4524c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 4534c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, sessionId); 4544c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, keyId); 4554c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, input); 4564c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, iv); 4574c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 4583b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(DECRYPT, data, &reply); 4593b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 4603b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 4613b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 4624c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(reply, output); 4634c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 4644c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return reply.readInt32(); 4654c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 4664c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 4674c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker virtual status_t sign(Vector<uint8_t> const &sessionId, 4684c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &keyId, 4694c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &message, 4704c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> &signature) { 4714c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Parcel data, reply; 4724c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 4734c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 4744c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, sessionId); 4754c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, keyId); 4764c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, message); 4774c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 4783b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(SIGN, data, &reply); 4793b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 4803b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 4813b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 4824c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(reply, signature); 4834c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 4844c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return reply.readInt32(); 4854c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 4864c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 4874c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker virtual status_t verify(Vector<uint8_t> const &sessionId, 4884c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &keyId, 4894c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &message, 4904c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &signature, 4914c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker bool &match) { 4924c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Parcel data, reply; 4934c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 4944c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 4954c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, sessionId); 4964c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, keyId); 4974c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, message); 4984c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, signature); 4994c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 5003b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(VERIFY, data, &reply); 5013b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 5023b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 5033b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 5044c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker match = (bool)reply.readInt32(); 5054c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return reply.readInt32(); 5064c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 5074c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 50868d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker virtual status_t signRSA(Vector<uint8_t> const &sessionId, 50968d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker String8 const &algorithm, 51068d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker Vector<uint8_t> const &message, 51168d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker Vector<uint8_t> const &wrappedKey, 51268d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker Vector<uint8_t> &signature) { 51368d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker Parcel data, reply; 51468d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 51568d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker 51668d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker writeVector(data, sessionId); 51768d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker data.writeString8(algorithm); 51868d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker writeVector(data, message); 51968d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker writeVector(data, wrappedKey); 52068d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker 5213b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(SIGN_RSA, data, &reply); 5223b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 5233b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 5243b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 52568d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker readVector(reply, signature); 52668d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker 52768d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker return reply.readInt32(); 52868d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker } 52968d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker 530c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker virtual status_t setListener(const sp<IDrmClient>& listener) { 531c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker Parcel data, reply; 532c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 53306b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen data.writeStrongBinder(IInterface::asBinder(listener)); 5343b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(SET_LISTENER, data, &reply); 5353b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 5363b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 5373b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 538c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker return reply.readInt32(); 539c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker } 540c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker 541441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinkerprivate: 5424c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker void readVector(Parcel &reply, Vector<uint8_t> &vector) const { 5434c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker uint32_t size = reply.readInt32(); 5444c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker vector.insertAt((size_t)0, size); 5454c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply.read(vector.editArray(), size); 5464c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 5474c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 5484c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker void writeVector(Parcel &data, Vector<uint8_t> const &vector) const { 5494c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.writeInt32(vector.size()); 5504c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.write(vector.array(), vector.size()); 5514c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 5524c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 553441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker DISALLOW_EVIL_CONSTRUCTORS(BpDrm); 554441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker}; 555441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 556441a78d5e224e0d67f9b52fa9adc795c6944159bJeff TinkerIMPLEMENT_META_INTERFACE(Drm, "android.drm.IDrm"); 557441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 558441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker//////////////////////////////////////////////////////////////////////////////// 559441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 5604c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinkervoid BnDrm::readVector(const Parcel &data, Vector<uint8_t> &vector) const { 5614c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker uint32_t size = data.readInt32(); 5624c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker vector.insertAt((size_t)0, size); 5634c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.read(vector.editArray(), size); 5644c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker} 5654c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 5664c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinkervoid BnDrm::writeVector(Parcel *reply, Vector<uint8_t> const &vector) const { 5674c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply->writeInt32(vector.size()); 5684c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply->write(vector.array(), vector.size()); 5694c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker} 5704c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 571441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinkerstatus_t BnDrm::onTransact( 572441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) { 573441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker switch (code) { 574441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case INIT_CHECK: 575441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 576441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 577441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(initCheck()); 578441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 579441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 580441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 581441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case IS_CRYPTO_SUPPORTED: 582441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 583441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 584441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker uint8_t uuid[16]; 585441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.read(uuid, sizeof(uuid)); 5869cf69e0fc110f17c28e988ed0f9bf91abfaf710dJeff Tinker String8 mimeType = data.readString8(); 5879cf69e0fc110f17c28e988ed0f9bf91abfaf710dJeff Tinker reply->writeInt32(isCryptoSchemeSupported(uuid, mimeType)); 5889cf69e0fc110f17c28e988ed0f9bf91abfaf710dJeff Tinker 589441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 590441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 591441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 592441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case CREATE_PLUGIN: 593441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 594441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 595441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker uint8_t uuid[16]; 596441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.read(uuid, sizeof(uuid)); 597441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(createPlugin(uuid)); 598441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 599441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 600441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 601441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case DESTROY_PLUGIN: 602441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 603441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 604441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(destroyPlugin()); 605441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 606441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 607441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 608441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case OPEN_SESSION: 609441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 610441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 611441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> sessionId; 612441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker status_t result = openSession(sessionId); 6134c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(reply, sessionId); 614441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(result); 615441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 616441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 617441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 618441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case CLOSE_SESSION: 619441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 620441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 621441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> sessionId; 6224c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, sessionId); 623441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(closeSession(sessionId)); 624441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 625441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 626441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 6274c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker case GET_KEY_REQUEST: 628441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 629441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 6304c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> sessionId, initData; 631441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 6324c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, sessionId); 6334c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, initData); 634441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 mimeType = data.readString8(); 6354c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker DrmPlugin::KeyType keyType = (DrmPlugin::KeyType)data.readInt32(); 636441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 637441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker KeyedVector<String8, String8> optionalParameters; 638441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker uint32_t count = data.readInt32(); 639441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker for (size_t i = 0; i < count; ++i) { 640441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 key, value; 641441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker key = data.readString8(); 642441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker value = data.readString8(); 643441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker optionalParameters.add(key, value); 644441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 645441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 646441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> request; 647441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 defaultUrl; 6488aff7771bf6f4230a0bf9b548c874e139e133686Jeff Tinker DrmPlugin::KeyRequestType keyRequestType = DrmPlugin::kKeyRequestType_Unknown; 649d072c909d87f8150433860f6de4c11df6e09e2f9Jeff Tinker 650d072c909d87f8150433860f6de4c11df6e09e2f9Jeff Tinker status_t result = getKeyRequest(sessionId, initData, mimeType, 651d072c909d87f8150433860f6de4c11df6e09e2f9Jeff Tinker keyType, optionalParameters, request, defaultUrl, 652d072c909d87f8150433860f6de4c11df6e09e2f9Jeff Tinker &keyRequestType); 653441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 6544c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(reply, request); 655441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeString8(defaultUrl); 656d072c909d87f8150433860f6de4c11df6e09e2f9Jeff Tinker reply->writeInt32(static_cast<int32_t>(keyRequestType)); 657441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(result); 658441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 659441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 660441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 6614c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker case PROVIDE_KEY_RESPONSE: 662441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 663441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 6644c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> sessionId, response, keySetId; 6654c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, sessionId); 6664c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, response); 6674c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker uint32_t result = provideKeyResponse(sessionId, response, keySetId); 6684c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(reply, keySetId); 6694c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply->writeInt32(result); 6704c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return OK; 6714c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 672441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 6734c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker case REMOVE_KEYS: 6744c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker { 6754c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 6764c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> keySetId; 6774c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, keySetId); 6784c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply->writeInt32(removeKeys(keySetId)); 679441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 680441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 681441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 6824c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker case RESTORE_KEYS: 683441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 684441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 6854c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> sessionId, keySetId; 6864c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, sessionId); 6874c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, keySetId); 6884c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply->writeInt32(restoreKeys(sessionId, keySetId)); 689441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 690441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 691441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 6924c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker case QUERY_KEY_STATUS: 693441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 694441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 695441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> sessionId; 6964c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, sessionId); 697441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker KeyedVector<String8, String8> infoMap; 6984c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker status_t result = queryKeyStatus(sessionId, infoMap); 699441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker size_t count = infoMap.size(); 700441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(count); 701441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker for (size_t i = 0; i < count; ++i) { 702441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeString8(infoMap.keyAt(i)); 703441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeString8(infoMap.valueAt(i)); 704441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 705441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(result); 706441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 707441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 708441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 709441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case GET_PROVISION_REQUEST: 710441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 711441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 71268d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker String8 certType = data.readString8(); 71368d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker String8 certAuthority = data.readString8(); 71468d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker 715441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> request; 716441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 defaultUrl; 71768d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker status_t result = getProvisionRequest(certType, certAuthority, 71868d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker request, defaultUrl); 7194c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(reply, request); 720441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeString8(defaultUrl); 721441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(result); 722441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 723441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 724441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 725441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case PROVIDE_PROVISION_RESPONSE: 726441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 727441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 728441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> response; 72968d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker Vector<uint8_t> certificate; 73068d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker Vector<uint8_t> wrappedKey; 7314c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, response); 73268d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker status_t result = provideProvisionResponse(response, certificate, wrappedKey); 73368d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker writeVector(reply, certificate); 73468d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker writeVector(reply, wrappedKey); 73568d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker reply->writeInt32(result); 736441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 737441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 738441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 739441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case GET_SECURE_STOPS: 740441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 741441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 742441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker List<Vector<uint8_t> > secureStops; 743441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker status_t result = getSecureStops(secureStops); 744441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker size_t count = secureStops.size(); 745441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(count); 746441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker List<Vector<uint8_t> >::iterator iter = secureStops.begin(); 747441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker while(iter != secureStops.end()) { 748441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker size_t size = iter->size(); 749441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(size); 750441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->write(iter->array(), iter->size()); 751423e33ce6569cb14ecf772e9670208517f7b30c4Jeff Tinker iter++; 752441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 753441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(result); 754441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 755441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 756441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 7573c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker case GET_SECURE_STOP: 7583c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker { 7593c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 7603c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker Vector<uint8_t> ssid, secureStop; 7613c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker readVector(data, ssid); 7623c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker status_t result = getSecureStop(ssid, secureStop); 7633c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker writeVector(reply, secureStop); 7643c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker reply->writeInt32(result); 7653c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker return OK; 7663c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker } 7673c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker 768441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case RELEASE_SECURE_STOPS: 769441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 770441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 771441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> ssRelease; 7724c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, ssRelease); 773441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(releaseSecureStops(ssRelease)); 774441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 775441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 776441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 7773c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker case RELEASE_ALL_SECURE_STOPS: 7783c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker { 7793c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 7803c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker reply->writeInt32(releaseAllSecureStops()); 7813c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker return OK; 7823c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker } 7833c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker 784441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case GET_PROPERTY_STRING: 785441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 786441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 787441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 name = data.readString8(); 788441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 value; 789441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker status_t result = getPropertyString(name, value); 790441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeString8(value); 791441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(result); 792441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 793441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 794441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 795441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case GET_PROPERTY_BYTE_ARRAY: 796441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 797441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 798441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 name = data.readString8(); 799441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> value; 800441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker status_t result = getPropertyByteArray(name, value); 8014c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(reply, value); 802441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(result); 803441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 804441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 805441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 806441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case SET_PROPERTY_STRING: 807441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 808441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 809441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 name = data.readString8(); 810441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 value = data.readString8(); 811441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(setPropertyString(name, value)); 812441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 813441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 814441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 815441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case SET_PROPERTY_BYTE_ARRAY: 816441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 817441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 818441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 name = data.readString8(); 819441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> value; 8204c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, value); 821441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(setPropertyByteArray(name, value)); 822441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 823441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 824441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 8254c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker case SET_CIPHER_ALGORITHM: 8264c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker { 8274c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 8284c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> sessionId; 8294c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, sessionId); 8304c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker String8 algorithm = data.readString8(); 8314c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply->writeInt32(setCipherAlgorithm(sessionId, algorithm)); 8324c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return OK; 8334c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 8344c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 8354c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker case SET_MAC_ALGORITHM: 8364c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker { 8374c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 8384c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> sessionId; 8394c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, sessionId); 8404c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker String8 algorithm = data.readString8(); 8414c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply->writeInt32(setMacAlgorithm(sessionId, algorithm)); 8424c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return OK; 8434c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 8444c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 8454c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker case ENCRYPT: 8464c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker { 8474c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 8484c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> sessionId, keyId, input, iv, output; 8494c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, sessionId); 8504c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, keyId); 8514c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, input); 8524c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, iv); 8534c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker uint32_t result = encrypt(sessionId, keyId, input, iv, output); 8544c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(reply, output); 8554c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply->writeInt32(result); 8564c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return OK; 8574c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 8584c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 8594c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker case DECRYPT: 8604c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker { 8614c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 8624c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> sessionId, keyId, input, iv, output; 8634c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, sessionId); 8644c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, keyId); 8654c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, input); 8664c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, iv); 8674c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker uint32_t result = decrypt(sessionId, keyId, input, iv, output); 8684c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(reply, output); 8694c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply->writeInt32(result); 8704c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return OK; 8714c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 8724c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 8734c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker case SIGN: 8744c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker { 8754c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 8764c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> sessionId, keyId, message, signature; 8774c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, sessionId); 8784c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, keyId); 8794c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, message); 8804c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker uint32_t result = sign(sessionId, keyId, message, signature); 8814c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(reply, signature); 8824c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply->writeInt32(result); 8834c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return OK; 8844c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 8854c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 8864c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker case VERIFY: 8874c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker { 8884c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 8894c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> sessionId, keyId, message, signature; 8904c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, sessionId); 8914c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, keyId); 8924c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, message); 8934c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, signature); 8944c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker bool match; 8954c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker uint32_t result = verify(sessionId, keyId, message, signature, match); 8964c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply->writeInt32(match); 8974c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply->writeInt32(result); 8984c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return OK; 8994c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 9004c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 90168d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker case SIGN_RSA: 90268d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker { 90368d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker CHECK_INTERFACE(IDrm, data, reply); 90468d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker Vector<uint8_t> sessionId, message, wrappedKey, signature; 90568d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker readVector(data, sessionId); 90668d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker String8 algorithm = data.readString8(); 90768d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker readVector(data, message); 90868d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker readVector(data, wrappedKey); 90968d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker uint32_t result = signRSA(sessionId, algorithm, message, wrappedKey, signature); 91068d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker writeVector(reply, signature); 91168d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker reply->writeInt32(result); 91268d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker return OK; 91368d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker } 91468d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker 915c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker case SET_LISTENER: { 916c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 917c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker sp<IDrmClient> listener = 918c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker interface_cast<IDrmClient>(data.readStrongBinder()); 919c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker reply->writeInt32(setListener(listener)); 920c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker return NO_ERROR; 921c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker } break; 922c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker 9234c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker default: 9244c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return BBinder::onTransact(code, data, reply, flags); 925441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 926441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker} 927441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 928441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker} // namespace android 929