1441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker/* 2441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker * Copyright (C) 2013 The Android Open Source Project 3441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker * 4441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker * Licensed under the Apache License, Version 2.0 (the "License"); 5441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker * you may not use this file except in compliance with the License. 6441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker * You may obtain a copy of the License at 7441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker * 8441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker * http://www.apache.org/licenses/LICENSE-2.0 9441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker * 10441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker * Unless required by applicable law or agreed to in writing, software 11441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker * distributed under the License is distributed on an "AS IS" BASIS, 12441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker * See the License for the specific language governing permissions and 14441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker * limitations under the License. 15441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker */ 16441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 17441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker//#define LOG_NDEBUG 0 18441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker#define LOG_TAG "IDrm" 19441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker#include <utils/Log.h> 20441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 21441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker#include <binder/Parcel.h> 22441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker#include <media/IDrm.h> 23441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker#include <media/stagefright/MediaErrors.h> 24441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker#include <media/stagefright/foundation/ADebug.h> 25441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker#include <media/stagefright/foundation/AString.h> 26441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 27441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinkernamespace android { 28441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 29441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinkerenum { 30441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker INIT_CHECK = IBinder::FIRST_CALL_TRANSACTION, 31441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker IS_CRYPTO_SUPPORTED, 32441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CREATE_PLUGIN, 33441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker DESTROY_PLUGIN, 34441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker OPEN_SESSION, 35441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CLOSE_SESSION, 364c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker GET_KEY_REQUEST, 374c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker PROVIDE_KEY_RESPONSE, 384c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker REMOVE_KEYS, 394c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker RESTORE_KEYS, 404c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker QUERY_KEY_STATUS, 41441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker GET_PROVISION_REQUEST, 42441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker PROVIDE_PROVISION_RESPONSE, 43441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker GET_SECURE_STOPS, 44441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker RELEASE_SECURE_STOPS, 45441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker GET_PROPERTY_STRING, 46441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker GET_PROPERTY_BYTE_ARRAY, 47441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker SET_PROPERTY_STRING, 484c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker SET_PROPERTY_BYTE_ARRAY, 494c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker SET_CIPHER_ALGORITHM, 504c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker SET_MAC_ALGORITHM, 514c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker ENCRYPT, 524c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker DECRYPT, 534c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker SIGN, 5468d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker SIGN_RSA, 55c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker VERIFY, 5668b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker SET_LISTENER, 573c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker UNPROVISION_DEVICE, 583c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker GET_SECURE_STOP, 593c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker RELEASE_ALL_SECURE_STOPS 60441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker}; 61441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 62441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinkerstruct BpDrm : public BpInterface<IDrm> { 63441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker BpDrm(const sp<IBinder> &impl) 64441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker : BpInterface<IDrm>(impl) { 65441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 66441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 67441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t initCheck() const { 68441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 69441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 703b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(INIT_CHECK, data, &reply); 713b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 723b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 733b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 74441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 75441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 76441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 77441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 789cf69e0fc110f17c28e988ed0f9bf91abfaf710dJeff Tinker virtual bool isCryptoSchemeSupported(const uint8_t uuid[16], const String8 &mimeType) { 79441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 80441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 81441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.write(uuid, 16); 829cf69e0fc110f17c28e988ed0f9bf91abfaf710dJeff Tinker data.writeString8(mimeType); 833b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(IS_CRYPTO_SUPPORTED, data, &reply); 843b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 853b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker ALOGE("isCryptoSchemeSupported: binder call failed: %d", status); 863b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return false; 873b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 88441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 89441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32() != 0; 90441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 91441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 92441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t createPlugin(const uint8_t uuid[16]) { 93441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 94441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 95441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.write(uuid, 16); 96441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 973b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(CREATE_PLUGIN, data, &reply); 983b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 993b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 1003b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 101441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 102441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 103441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 104441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 105441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t destroyPlugin() { 106441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 107441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 1083b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(DESTROY_PLUGIN, data, &reply); 1093b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 1103b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 1113b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 112441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 113441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 114441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 115441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 116441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t openSession(Vector<uint8_t> &sessionId) { 117441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 118441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 119441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 1203b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(OPEN_SESSION, data, &reply); 1213b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 1223b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 1233b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 1244c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(reply, sessionId); 125441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 126441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 127441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 128441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 129441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t closeSession(Vector<uint8_t> const &sessionId) { 130441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 131441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 132441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 1334c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, sessionId); 1343b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(CLOSE_SESSION, data, &reply); 1353b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 1363b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 1373b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 138441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 139441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 140441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 141441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 142441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t 1434c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker getKeyRequest(Vector<uint8_t> const &sessionId, 1444c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &initData, 1454c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker String8 const &mimeType, DrmPlugin::KeyType keyType, 1464c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker KeyedVector<String8, String8> const &optionalParameters, 147d072c909d87f8150433860f6de4c11df6e09e2f9Jeff Tinker Vector<uint8_t> &request, String8 &defaultUrl, 148d072c909d87f8150433860f6de4c11df6e09e2f9Jeff Tinker DrmPlugin::KeyRequestType *keyRequestType) { 149441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 150441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 151441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 1524c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, sessionId); 1534c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, initData); 154441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeString8(mimeType); 1554c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.writeInt32((uint32_t)keyType); 156441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 157441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInt32(optionalParameters.size()); 158441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker for (size_t i = 0; i < optionalParameters.size(); ++i) { 159441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeString8(optionalParameters.keyAt(i)); 160441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeString8(optionalParameters.valueAt(i)); 161441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 1623b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker 1633b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(GET_KEY_REQUEST, data, &reply); 1643b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 1653b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 1663b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 167441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 1684c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(reply, request); 169441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker defaultUrl = reply.readString8(); 170d072c909d87f8150433860f6de4c11df6e09e2f9Jeff Tinker *keyRequestType = static_cast<DrmPlugin::KeyRequestType>(reply.readInt32()); 171441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 172441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 173441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 174441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 1754c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker virtual status_t provideKeyResponse(Vector<uint8_t> const &sessionId, 1764c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &response, 1774c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> &keySetId) { 1784c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Parcel data, reply; 1794c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 1804c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, sessionId); 1814c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, response); 1823b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker 1833b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(PROVIDE_KEY_RESPONSE, data, &reply); 1843b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 1853b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 1863b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 1873b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker 1884c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(reply, keySetId); 1894c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 1904c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return reply.readInt32(); 1914c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 1924c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 1934c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker virtual status_t removeKeys(Vector<uint8_t> const &keySetId) { 194441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 195441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 196441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 1974c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, keySetId); 1983b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(REMOVE_KEYS, data, &reply); 1993b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 2003b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 2013b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 202441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 203441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 204441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 205441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 2064c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker virtual status_t restoreKeys(Vector<uint8_t> const &sessionId, 2074c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &keySetId) { 208441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 209441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 210441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 2114c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, sessionId); 2124c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, keySetId); 2133b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(RESTORE_KEYS, data, &reply); 2143b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 2153b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 2163b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 217441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 218441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 219441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 220441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 2214c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker virtual status_t queryKeyStatus(Vector<uint8_t> const &sessionId, 222441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker KeyedVector<String8, String8> &infoMap) const { 223441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 224441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 225441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 2264c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, sessionId); 2273b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(QUERY_KEY_STATUS, data, &reply); 2283b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 2293b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 2303b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 231441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 232441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker infoMap.clear(); 233441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker size_t count = reply.readInt32(); 234441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker for (size_t i = 0; i < count; i++) { 235441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 key = reply.readString8(); 236441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 value = reply.readString8(); 237441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker infoMap.add(key, value); 238441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 239441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 240441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 241441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 24268d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker virtual status_t getProvisionRequest(String8 const &certType, 24368d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker String8 const &certAuthority, 24468d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker Vector<uint8_t> &request, 245441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 &defaultUrl) { 246441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 247441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 248441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 24968d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker data.writeString8(certType); 25068d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker data.writeString8(certAuthority); 2513b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(GET_PROVISION_REQUEST, data, &reply); 2523b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 2533b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 2543b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 255441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 2564c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(reply, request); 257441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker defaultUrl = reply.readString8(); 258441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 259441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 260441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 261441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 26268d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker virtual status_t provideProvisionResponse(Vector<uint8_t> const &response, 26368d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker Vector<uint8_t> &certificate, 26468d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker Vector<uint8_t> &wrappedKey) { 265441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 266441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 267441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 2684c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, response); 2693b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(PROVIDE_PROVISION_RESPONSE, data, &reply); 2703b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 2713b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 2723b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 273441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 27468d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker readVector(reply, certificate); 27568d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker readVector(reply, wrappedKey); 27668d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker 277441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 278441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 279441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 28068b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker virtual status_t unprovisionDevice() { 28168b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker Parcel data, reply; 28268b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 28368b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker 2843b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(UNPROVISION_DEVICE, data, &reply); 2853b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 2863b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 2873b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 28868b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker 28968b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker return reply.readInt32(); 29068b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker } 29168b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker 292441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t getSecureStops(List<Vector<uint8_t> > &secureStops) { 293441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 294441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 295441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 2963b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(GET_SECURE_STOPS, data, &reply); 2973b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 2983b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 2993b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 300441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 301441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker secureStops.clear(); 302441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker uint32_t count = reply.readInt32(); 303441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker for (size_t i = 0; i < count; i++) { 304441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> secureStop; 3054c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(reply, secureStop); 306441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker secureStops.push_back(secureStop); 307441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 308441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 309441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 310441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 3113c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker virtual status_t getSecureStop(Vector<uint8_t> const &ssid, Vector<uint8_t> &secureStop) { 3123c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker Parcel data, reply; 3133c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 3143c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker 3153c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker writeVector(data, ssid); 3163b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(GET_SECURE_STOP, data, &reply); 3173b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 3183b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 3193b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 3203c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker 3213c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker readVector(reply, secureStop); 3223c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker return reply.readInt32(); 3233c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker } 3243c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker 325441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t releaseSecureStops(Vector<uint8_t> const &ssRelease) { 326441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 327441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 328441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 3294c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, ssRelease); 3303b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(RELEASE_SECURE_STOPS, data, &reply); 3313b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 3323b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 3333b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 334441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 335441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 336441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 337441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 3383c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker virtual status_t releaseAllSecureStops() { 3393c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker Parcel data, reply; 3403c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 3413c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker 3423b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(RELEASE_ALL_SECURE_STOPS, data, &reply); 3433b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 3443b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 3453b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 3463c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker 3473c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker return reply.readInt32(); 3483c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker } 3493c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker 350441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t getPropertyString(String8 const &name, String8 &value) const { 351441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 352441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 353441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 354441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeString8(name); 3553b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(GET_PROPERTY_STRING, data, &reply); 3563b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 3573b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 3583b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 359441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 360441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker value = reply.readString8(); 361441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 362441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 363441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 364441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t getPropertyByteArray(String8 const &name, Vector<uint8_t> &value) const { 365441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 366441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 367441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 368441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeString8(name); 3693b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(GET_PROPERTY_BYTE_ARRAY, data, &reply); 3703b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 3713b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 3723b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 373441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 3744c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(reply, value); 375441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 376441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 377441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 378441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t setPropertyString(String8 const &name, String8 const &value) const { 379441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 380441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 381441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 382441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeString8(name); 383441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeString8(value); 3843b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(SET_PROPERTY_STRING, data, &reply); 3853b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 3863b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 3873b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 388441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 389441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 390441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 391441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 392441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t setPropertyByteArray(String8 const &name, 393441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> const &value) const { 394441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 395441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 396441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 397441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeString8(name); 3984c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, value); 3993b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(SET_PROPERTY_BYTE_ARRAY, data, &reply); 4003b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 4013b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 4023b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 403441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 404441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 405441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 406441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 407441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 4084c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker virtual status_t setCipherAlgorithm(Vector<uint8_t> const &sessionId, 4094c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker String8 const &algorithm) { 4104c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Parcel data, reply; 4114c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 4124c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 4134c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, sessionId); 4144c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.writeString8(algorithm); 4153b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(SET_CIPHER_ALGORITHM, data, &reply); 4163b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 4173b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 4183b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 4194c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return reply.readInt32(); 4204c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 4214c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 4224c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker virtual status_t setMacAlgorithm(Vector<uint8_t> const &sessionId, 4234c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker String8 const &algorithm) { 4244c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Parcel data, reply; 4254c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 4264c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 4274c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, sessionId); 4284c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.writeString8(algorithm); 4293b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(SET_MAC_ALGORITHM, data, &reply); 4303b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 4313b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 4323b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 4334c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return reply.readInt32(); 4344c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 4354c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 4364c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker virtual status_t encrypt(Vector<uint8_t> const &sessionId, 4374c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &keyId, 4384c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &input, 4394c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &iv, 4404c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> &output) { 4414c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Parcel data, reply; 4424c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 4434c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 4444c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, sessionId); 4454c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, keyId); 4464c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, input); 4474c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, iv); 4484c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 4493b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(ENCRYPT, data, &reply); 4503b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 4513b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 4523b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 4534c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(reply, output); 4544c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 4554c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return reply.readInt32(); 4564c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 4574c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 4584c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker virtual status_t decrypt(Vector<uint8_t> const &sessionId, 4594c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &keyId, 4604c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &input, 4614c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &iv, 4624c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> &output) { 4634c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Parcel data, reply; 4644c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 4654c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 4664c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, sessionId); 4674c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, keyId); 4684c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, input); 4694c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, iv); 4704c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 4713b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(DECRYPT, data, &reply); 4723b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 4733b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 4743b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 4754c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(reply, output); 4764c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 4774c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return reply.readInt32(); 4784c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 4794c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 4804c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker virtual status_t sign(Vector<uint8_t> const &sessionId, 4814c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &keyId, 4824c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &message, 4834c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> &signature) { 4844c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Parcel data, reply; 4854c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 4864c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 4874c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, sessionId); 4884c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, keyId); 4894c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, message); 4904c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 4913b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(SIGN, data, &reply); 4923b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 4933b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 4943b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 4954c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(reply, signature); 4964c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 4974c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return reply.readInt32(); 4984c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 4994c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 5004c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker virtual status_t verify(Vector<uint8_t> const &sessionId, 5014c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &keyId, 5024c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &message, 5034c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &signature, 5044c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker bool &match) { 5054c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Parcel data, reply; 5064c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 5074c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 5084c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, sessionId); 5094c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, keyId); 5104c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, message); 5114c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, signature); 5124c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 5133b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(VERIFY, data, &reply); 5143b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 5153b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 5163b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 5174c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker match = (bool)reply.readInt32(); 5184c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return reply.readInt32(); 5194c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 5204c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 52168d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker virtual status_t signRSA(Vector<uint8_t> const &sessionId, 52268d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker String8 const &algorithm, 52368d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker Vector<uint8_t> const &message, 52468d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker Vector<uint8_t> const &wrappedKey, 52568d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker Vector<uint8_t> &signature) { 52668d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker Parcel data, reply; 52768d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 52868d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker 52968d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker writeVector(data, sessionId); 53068d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker data.writeString8(algorithm); 53168d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker writeVector(data, message); 53268d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker writeVector(data, wrappedKey); 53368d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker 5343b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(SIGN_RSA, data, &reply); 5353b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 5363b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 5373b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 53868d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker readVector(reply, signature); 53968d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker 54068d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker return reply.readInt32(); 54168d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker } 54268d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker 543c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker virtual status_t setListener(const sp<IDrmClient>& listener) { 544c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker Parcel data, reply; 545c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 54606b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen data.writeStrongBinder(IInterface::asBinder(listener)); 5473b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(SET_LISTENER, data, &reply); 5483b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 5493b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 5503b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 551c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker return reply.readInt32(); 552c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker } 553c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker 554441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinkerprivate: 5554c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker void readVector(Parcel &reply, Vector<uint8_t> &vector) const { 5564c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker uint32_t size = reply.readInt32(); 5574c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker vector.insertAt((size_t)0, size); 5584c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply.read(vector.editArray(), size); 5594c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 5604c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 5614c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker void writeVector(Parcel &data, Vector<uint8_t> const &vector) const { 5624c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.writeInt32(vector.size()); 5634c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.write(vector.array(), vector.size()); 5644c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 5654c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 566441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker DISALLOW_EVIL_CONSTRUCTORS(BpDrm); 567441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker}; 568441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 569441a78d5e224e0d67f9b52fa9adc795c6944159bJeff TinkerIMPLEMENT_META_INTERFACE(Drm, "android.drm.IDrm"); 570441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 571441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker//////////////////////////////////////////////////////////////////////////////// 572441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 5734c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinkervoid BnDrm::readVector(const Parcel &data, Vector<uint8_t> &vector) const { 5744c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker uint32_t size = data.readInt32(); 5754c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker vector.insertAt((size_t)0, size); 5764c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.read(vector.editArray(), size); 5774c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker} 5784c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 5794c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinkervoid BnDrm::writeVector(Parcel *reply, Vector<uint8_t> const &vector) const { 5804c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply->writeInt32(vector.size()); 5814c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply->write(vector.array(), vector.size()); 5824c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker} 5834c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 584441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinkerstatus_t BnDrm::onTransact( 585441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) { 586441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker switch (code) { 587441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case INIT_CHECK: 588441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 589441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 590441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(initCheck()); 591441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 592441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 593441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 594441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case IS_CRYPTO_SUPPORTED: 595441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 596441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 597441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker uint8_t uuid[16]; 598441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.read(uuid, sizeof(uuid)); 5999cf69e0fc110f17c28e988ed0f9bf91abfaf710dJeff Tinker String8 mimeType = data.readString8(); 6009cf69e0fc110f17c28e988ed0f9bf91abfaf710dJeff Tinker reply->writeInt32(isCryptoSchemeSupported(uuid, mimeType)); 6019cf69e0fc110f17c28e988ed0f9bf91abfaf710dJeff Tinker 602441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 603441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 604441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 605441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case CREATE_PLUGIN: 606441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 607441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 608441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker uint8_t uuid[16]; 609441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.read(uuid, sizeof(uuid)); 610441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(createPlugin(uuid)); 611441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 612441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 613441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 614441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case DESTROY_PLUGIN: 615441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 616441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 617441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(destroyPlugin()); 618441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 619441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 620441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 621441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case OPEN_SESSION: 622441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 623441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 624441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> sessionId; 625441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker status_t result = openSession(sessionId); 6264c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(reply, sessionId); 627441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(result); 628441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 629441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 630441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 631441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case CLOSE_SESSION: 632441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 633441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 634441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> sessionId; 6354c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, sessionId); 636441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(closeSession(sessionId)); 637441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 638441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 639441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 6404c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker case GET_KEY_REQUEST: 641441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 642441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 6434c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> sessionId, initData; 644441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 6454c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, sessionId); 6464c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, initData); 647441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 mimeType = data.readString8(); 6484c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker DrmPlugin::KeyType keyType = (DrmPlugin::KeyType)data.readInt32(); 649441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 650441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker KeyedVector<String8, String8> optionalParameters; 651441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker uint32_t count = data.readInt32(); 652441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker for (size_t i = 0; i < count; ++i) { 653441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 key, value; 654441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker key = data.readString8(); 655441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker value = data.readString8(); 656441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker optionalParameters.add(key, value); 657441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 658441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 659441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> request; 660441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 defaultUrl; 661d072c909d87f8150433860f6de4c11df6e09e2f9Jeff Tinker DrmPlugin::KeyRequestType keyRequestType; 662d072c909d87f8150433860f6de4c11df6e09e2f9Jeff Tinker 663d072c909d87f8150433860f6de4c11df6e09e2f9Jeff Tinker status_t result = getKeyRequest(sessionId, initData, mimeType, 664d072c909d87f8150433860f6de4c11df6e09e2f9Jeff Tinker keyType, optionalParameters, request, defaultUrl, 665d072c909d87f8150433860f6de4c11df6e09e2f9Jeff Tinker &keyRequestType); 666441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 6674c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(reply, request); 668441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeString8(defaultUrl); 669d072c909d87f8150433860f6de4c11df6e09e2f9Jeff Tinker reply->writeInt32(static_cast<int32_t>(keyRequestType)); 670441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(result); 671441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 672441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 673441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 6744c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker case PROVIDE_KEY_RESPONSE: 675441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 676441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 6774c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> sessionId, response, keySetId; 6784c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, sessionId); 6794c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, response); 6804c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker uint32_t result = provideKeyResponse(sessionId, response, keySetId); 6814c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(reply, keySetId); 6824c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply->writeInt32(result); 6834c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return OK; 6844c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 685441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 6864c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker case REMOVE_KEYS: 6874c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker { 6884c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 6894c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> keySetId; 6904c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, keySetId); 6914c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply->writeInt32(removeKeys(keySetId)); 692441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 693441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 694441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 6954c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker case RESTORE_KEYS: 696441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 697441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 6984c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> sessionId, keySetId; 6994c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, sessionId); 7004c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, keySetId); 7014c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply->writeInt32(restoreKeys(sessionId, keySetId)); 702441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 703441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 704441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 7054c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker case QUERY_KEY_STATUS: 706441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 707441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 708441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> sessionId; 7094c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, sessionId); 710441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker KeyedVector<String8, String8> infoMap; 7114c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker status_t result = queryKeyStatus(sessionId, infoMap); 712441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker size_t count = infoMap.size(); 713441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(count); 714441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker for (size_t i = 0; i < count; ++i) { 715441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeString8(infoMap.keyAt(i)); 716441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeString8(infoMap.valueAt(i)); 717441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 718441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(result); 719441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 720441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 721441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 722441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case GET_PROVISION_REQUEST: 723441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 724441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 72568d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker String8 certType = data.readString8(); 72668d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker String8 certAuthority = data.readString8(); 72768d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker 728441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> request; 729441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 defaultUrl; 73068d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker status_t result = getProvisionRequest(certType, certAuthority, 73168d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker request, defaultUrl); 7324c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(reply, request); 733441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeString8(defaultUrl); 734441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(result); 735441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 736441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 737441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 738441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case PROVIDE_PROVISION_RESPONSE: 739441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 740441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 741441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> response; 74268d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker Vector<uint8_t> certificate; 74368d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker Vector<uint8_t> wrappedKey; 7444c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, response); 74568d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker status_t result = provideProvisionResponse(response, certificate, wrappedKey); 74668d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker writeVector(reply, certificate); 74768d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker writeVector(reply, wrappedKey); 74868d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker reply->writeInt32(result); 749441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 750441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 751441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 75268b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker case UNPROVISION_DEVICE: 75368b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker { 75468b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker CHECK_INTERFACE(IDrm, data, reply); 75568b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker status_t result = unprovisionDevice(); 75668b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker reply->writeInt32(result); 75768b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker return OK; 75868b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker } 75968b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker 760441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case GET_SECURE_STOPS: 761441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 762441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 763441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker List<Vector<uint8_t> > secureStops; 764441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker status_t result = getSecureStops(secureStops); 765441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker size_t count = secureStops.size(); 766441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(count); 767441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker List<Vector<uint8_t> >::iterator iter = secureStops.begin(); 768441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker while(iter != secureStops.end()) { 769441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker size_t size = iter->size(); 770441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(size); 771441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->write(iter->array(), iter->size()); 772423e33ce6569cb14ecf772e9670208517f7b30c4Jeff Tinker iter++; 773441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 774441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(result); 775441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 776441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 777441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 7783c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker case GET_SECURE_STOP: 7793c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker { 7803c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 7813c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker Vector<uint8_t> ssid, secureStop; 7823c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker readVector(data, ssid); 7833c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker status_t result = getSecureStop(ssid, secureStop); 7843c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker writeVector(reply, secureStop); 7853c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker reply->writeInt32(result); 7863c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker return OK; 7873c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker } 7883c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker 789441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case RELEASE_SECURE_STOPS: 790441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 791441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 792441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> ssRelease; 7934c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, ssRelease); 794441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(releaseSecureStops(ssRelease)); 795441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 796441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 797441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 7983c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker case RELEASE_ALL_SECURE_STOPS: 7993c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker { 8003c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 8013c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker reply->writeInt32(releaseAllSecureStops()); 8023c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker return OK; 8033c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker } 8043c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker 805441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case GET_PROPERTY_STRING: 806441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 807441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 808441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 name = data.readString8(); 809441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 value; 810441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker status_t result = getPropertyString(name, value); 811441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeString8(value); 812441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(result); 813441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 814441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 815441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 816441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case GET_PROPERTY_BYTE_ARRAY: 817441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 818441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 819441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 name = data.readString8(); 820441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> value; 821441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker status_t result = getPropertyByteArray(name, value); 8224c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(reply, value); 823441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(result); 824441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 825441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 826441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 827441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case SET_PROPERTY_STRING: 828441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 829441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 830441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 name = data.readString8(); 831441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 value = data.readString8(); 832441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(setPropertyString(name, value)); 833441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 834441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 835441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 836441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case SET_PROPERTY_BYTE_ARRAY: 837441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 838441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 839441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 name = data.readString8(); 840441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> value; 8414c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, value); 842441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(setPropertyByteArray(name, value)); 843441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 844441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 845441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 8464c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker case SET_CIPHER_ALGORITHM: 8474c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker { 8484c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 8494c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> sessionId; 8504c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, sessionId); 8514c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker String8 algorithm = data.readString8(); 8524c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply->writeInt32(setCipherAlgorithm(sessionId, algorithm)); 8534c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return OK; 8544c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 8554c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 8564c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker case SET_MAC_ALGORITHM: 8574c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker { 8584c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 8594c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> sessionId; 8604c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, sessionId); 8614c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker String8 algorithm = data.readString8(); 8624c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply->writeInt32(setMacAlgorithm(sessionId, algorithm)); 8634c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return OK; 8644c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 8654c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 8664c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker case ENCRYPT: 8674c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker { 8684c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 8694c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> sessionId, keyId, input, iv, output; 8704c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, sessionId); 8714c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, keyId); 8724c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, input); 8734c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, iv); 8744c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker uint32_t result = encrypt(sessionId, keyId, input, iv, output); 8754c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(reply, output); 8764c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply->writeInt32(result); 8774c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return OK; 8784c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 8794c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 8804c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker case DECRYPT: 8814c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker { 8824c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 8834c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> sessionId, keyId, input, iv, output; 8844c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, sessionId); 8854c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, keyId); 8864c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, input); 8874c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, iv); 8884c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker uint32_t result = decrypt(sessionId, keyId, input, iv, output); 8894c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(reply, output); 8904c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply->writeInt32(result); 8914c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return OK; 8924c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 8934c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 8944c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker case SIGN: 8954c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker { 8964c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 8974c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> sessionId, keyId, message, signature; 8984c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, sessionId); 8994c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, keyId); 9004c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, message); 9014c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker uint32_t result = sign(sessionId, keyId, message, signature); 9024c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(reply, signature); 9034c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply->writeInt32(result); 9044c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return OK; 9054c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 9064c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 9074c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker case VERIFY: 9084c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker { 9094c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 9104c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> sessionId, keyId, message, signature; 9114c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, sessionId); 9124c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, keyId); 9134c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, message); 9144c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, signature); 9154c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker bool match; 9164c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker uint32_t result = verify(sessionId, keyId, message, signature, match); 9174c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply->writeInt32(match); 9184c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply->writeInt32(result); 9194c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return OK; 9204c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 9214c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 92268d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker case SIGN_RSA: 92368d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker { 92468d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker CHECK_INTERFACE(IDrm, data, reply); 92568d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker Vector<uint8_t> sessionId, message, wrappedKey, signature; 92668d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker readVector(data, sessionId); 92768d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker String8 algorithm = data.readString8(); 92868d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker readVector(data, message); 92968d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker readVector(data, wrappedKey); 93068d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker uint32_t result = signRSA(sessionId, algorithm, message, wrappedKey, signature); 93168d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker writeVector(reply, signature); 93268d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker reply->writeInt32(result); 93368d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker return OK; 93468d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker } 93568d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker 936c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker case SET_LISTENER: { 937c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 938c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker sp<IDrmClient> listener = 939c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker interface_cast<IDrmClient>(data.readStrongBinder()); 940c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker reply->writeInt32(setListener(listener)); 941c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker return NO_ERROR; 942c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker } break; 943c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker 9444c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker default: 9454c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return BBinder::onTransact(code, data, reply, flags); 946441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 947441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker} 948441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 949441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker} // namespace android 950