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/stagefright/MediaErrors.h> 23441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker#include <media/stagefright/foundation/ADebug.h> 24441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker#include <media/stagefright/foundation/AString.h> 257d2c6e8be2c9a4f3c1364d243856a345f17f851eJeff Tinker#include <mediadrm/IDrm.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, 49ab394d13bab3a84f23677357576cee7a6f0c7899Adam Stone GET_METRICS, 504c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker SET_CIPHER_ALGORITHM, 514c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker SET_MAC_ALGORITHM, 524c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker ENCRYPT, 534c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker DECRYPT, 544c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker SIGN, 5568d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker SIGN_RSA, 56c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker VERIFY, 5768b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker SET_LISTENER, 583c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker GET_SECURE_STOP, 5915177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker REMOVE_ALL_SECURE_STOPS, 606d998b67be330843f633a563c23c606593060165Jeff Tinker GET_HDCP_LEVELS, 616d998b67be330843f633a563c23c606593060165Jeff Tinker GET_NUMBER_OF_SESSIONS, 626d998b67be330843f633a563c23c606593060165Jeff Tinker GET_SECURITY_LEVEL, 6315177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker REMOVE_SECURE_STOP, 6415177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker GET_SECURE_STOP_IDS 65441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker}; 66441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 67441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinkerstruct BpDrm : public BpInterface<IDrm> { 68090ef604f81447eab4aa0a5b45d6307482573560Chih-Hung Hsieh explicit BpDrm(const sp<IBinder> &impl) 69441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker : BpInterface<IDrm>(impl) { 70441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 71441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 72441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t initCheck() const { 73441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 74441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 753b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(INIT_CHECK, data, &reply); 763b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 773b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 783b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 79441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 80441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 81441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 82441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 839cf69e0fc110f17c28e988ed0f9bf91abfaf710dJeff Tinker virtual bool isCryptoSchemeSupported(const uint8_t uuid[16], const String8 &mimeType) { 84441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 85441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 86441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.write(uuid, 16); 879cf69e0fc110f17c28e988ed0f9bf91abfaf710dJeff Tinker data.writeString8(mimeType); 883b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(IS_CRYPTO_SUPPORTED, data, &reply); 893b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 903b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker ALOGE("isCryptoSchemeSupported: binder call failed: %d", status); 913b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return false; 923b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 93441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 94441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32() != 0; 95441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 96441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 9768b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong virtual status_t createPlugin(const uint8_t uuid[16], 9868b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong const String8& appPackageName) { 99441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 100441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 101441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.write(uuid, 16); 10268b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong data.writeString8(appPackageName); 1033b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(CREATE_PLUGIN, data, &reply); 1043b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 10568b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong ALOGE("createPlugin: binder call failed: %d", status); 1063b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 1073b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 108441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 109441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 110441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 111441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 112441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t destroyPlugin() { 113441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 114441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 1153b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(DESTROY_PLUGIN, data, &reply); 1163b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 1173b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 1183b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 119441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 120441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 121441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 122441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 12341d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker virtual status_t openSession(DrmPlugin::SecurityLevel securityLevel, 12441d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker Vector<uint8_t> &sessionId) { 125441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 126441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 12741d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker data.writeInt32(securityLevel); 128441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 1293b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(OPEN_SESSION, data, &reply); 1303b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 1313b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 1323b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 1334c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(reply, sessionId); 134441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 135441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 136441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 137441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 138441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t closeSession(Vector<uint8_t> const &sessionId) { 139441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 140441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 141441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 1424c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, sessionId); 1433b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(CLOSE_SESSION, data, &reply); 1443b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 1453b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 1463b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 147441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 148441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 149441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 150441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 151441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t 1524c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker getKeyRequest(Vector<uint8_t> const &sessionId, 1534c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &initData, 1544c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker String8 const &mimeType, DrmPlugin::KeyType keyType, 1554c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker KeyedVector<String8, String8> const &optionalParameters, 156d072c909d87f8150433860f6de4c11df6e09e2f9Jeff Tinker Vector<uint8_t> &request, String8 &defaultUrl, 157d072c909d87f8150433860f6de4c11df6e09e2f9Jeff Tinker DrmPlugin::KeyRequestType *keyRequestType) { 158441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 159441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 160441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 1614c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, sessionId); 1624c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, initData); 163441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeString8(mimeType); 1644c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.writeInt32((uint32_t)keyType); 165441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 166441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInt32(optionalParameters.size()); 167441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker for (size_t i = 0; i < optionalParameters.size(); ++i) { 168441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeString8(optionalParameters.keyAt(i)); 169441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeString8(optionalParameters.valueAt(i)); 170441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 1713b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker 1723b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(GET_KEY_REQUEST, data, &reply); 1733b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 1743b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 1753b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 176441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 1774c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(reply, request); 178441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker defaultUrl = reply.readString8(); 179d072c909d87f8150433860f6de4c11df6e09e2f9Jeff Tinker *keyRequestType = static_cast<DrmPlugin::KeyRequestType>(reply.readInt32()); 180441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 181441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 182441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 183441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 1844c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker virtual status_t provideKeyResponse(Vector<uint8_t> const &sessionId, 1854c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &response, 1864c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> &keySetId) { 1874c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Parcel data, reply; 1884c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 1894c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, sessionId); 1904c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, response); 1913b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker 1923b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(PROVIDE_KEY_RESPONSE, data, &reply); 1933b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 1943b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 1953b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 1963b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker 1974c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(reply, keySetId); 1984c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 1994c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return reply.readInt32(); 2004c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 2014c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 2024c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker virtual status_t removeKeys(Vector<uint8_t> const &keySetId) { 203441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 204441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 205441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 2064c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, keySetId); 2073b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(REMOVE_KEYS, data, &reply); 2083b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 2093b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 2103b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 211441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 212441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 213441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 214441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 2154c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker virtual status_t restoreKeys(Vector<uint8_t> const &sessionId, 2164c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &keySetId) { 217441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 218441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 219441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 2204c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, sessionId); 2214c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, keySetId); 2223b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(RESTORE_KEYS, data, &reply); 2233b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 2243b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 2253b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 226441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 227441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 228441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 229441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 2304c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker virtual status_t queryKeyStatus(Vector<uint8_t> const &sessionId, 231441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker KeyedVector<String8, String8> &infoMap) const { 232441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 233441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 234441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 2354c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, sessionId); 2363b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(QUERY_KEY_STATUS, data, &reply); 2373b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 2383b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 2393b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 240441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 241441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker infoMap.clear(); 242441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker size_t count = reply.readInt32(); 243441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker for (size_t i = 0; i < count; i++) { 244441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 key = reply.readString8(); 245441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 value = reply.readString8(); 246441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker infoMap.add(key, value); 247441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 248441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 249441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 250441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 25168d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker virtual status_t getProvisionRequest(String8 const &certType, 25268d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker String8 const &certAuthority, 25368d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker Vector<uint8_t> &request, 254441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 &defaultUrl) { 255441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 256441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 257441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 25868d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker data.writeString8(certType); 25968d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker data.writeString8(certAuthority); 2603b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(GET_PROVISION_REQUEST, data, &reply); 2613b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 2623b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 2633b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 264441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 2654c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(reply, request); 266441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker defaultUrl = reply.readString8(); 267441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 268441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 269441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 270441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 27168d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker virtual status_t provideProvisionResponse(Vector<uint8_t> const &response, 27268d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker Vector<uint8_t> &certificate, 27368d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker Vector<uint8_t> &wrappedKey) { 274441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 275441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 276441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 2774c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, response); 2783b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(PROVIDE_PROVISION_RESPONSE, data, &reply); 2793b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 2803b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 2813b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 282441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 28368d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker readVector(reply, certificate); 28468d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker readVector(reply, wrappedKey); 28568d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker 286441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 287441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 288441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 289441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t getSecureStops(List<Vector<uint8_t> > &secureStops) { 290441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 291441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 292441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 2933b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(GET_SECURE_STOPS, data, &reply); 2943b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 2953b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 2963b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 297441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 298441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker secureStops.clear(); 299441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker uint32_t count = reply.readInt32(); 300441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker for (size_t i = 0; i < count; i++) { 301441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> secureStop; 3024c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(reply, secureStop); 303441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker secureStops.push_back(secureStop); 304441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 305441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 306441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 307441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 30815177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker virtual status_t getSecureStopIds(List<Vector<uint8_t> > &secureStopIds) { 30915177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker Parcel data, reply; 31015177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 31115177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker 31215177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker status_t status = remote()->transact(GET_SECURE_STOP_IDS, data, &reply); 31315177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker if (status != OK) { 31415177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker return status; 31515177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker } 31615177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker 31715177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker secureStopIds.clear(); 31815177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker uint32_t count = reply.readInt32(); 31915177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker for (size_t i = 0; i < count; i++) { 32015177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker Vector<uint8_t> secureStopId; 32115177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker readVector(reply, secureStopId); 32215177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker secureStopIds.push_back(secureStopId); 32315177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker } 32415177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker return reply.readInt32(); 32515177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker } 32615177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker 3273c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker virtual status_t getSecureStop(Vector<uint8_t> const &ssid, Vector<uint8_t> &secureStop) { 3283c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker Parcel data, reply; 3293c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 3303c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker 3313c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker writeVector(data, ssid); 3323b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(GET_SECURE_STOP, data, &reply); 3333b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 3343b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 3353b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 3363c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker 3373c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker readVector(reply, secureStop); 3383c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker return reply.readInt32(); 3393c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker } 3403c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker 341441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t releaseSecureStops(Vector<uint8_t> const &ssRelease) { 342441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 343441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 344441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 3454c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, ssRelease); 3463b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(RELEASE_SECURE_STOPS, data, &reply); 3473b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 3483b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 3493b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 350441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 351441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 352441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 353441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 35415177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker virtual status_t removeSecureStop(Vector<uint8_t> const &ssid) { 35515177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker Parcel data, reply; 35615177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 35715177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker 35815177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker writeVector(data, ssid); 35915177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker status_t status = remote()->transact(REMOVE_SECURE_STOP, data, &reply); 36015177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker if (status != OK) { 36115177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker return status; 36215177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker } 36315177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker 36415177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker return reply.readInt32(); 36515177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker } 36615177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker 36715177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker virtual status_t removeAllSecureStops() { 3683c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker Parcel data, reply; 3693c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 3703c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker 37115177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker status_t status = remote()->transact(REMOVE_ALL_SECURE_STOPS, data, &reply); 3723b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 3733b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 3743b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 3753c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker 3763c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker return reply.readInt32(); 3773c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker } 3783c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker 379441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t getPropertyString(String8 const &name, String8 &value) const { 380441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 381441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 382441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 383441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeString8(name); 3843b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(GET_PROPERTY_STRING, data, &reply); 3853b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 3863b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 3873b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 388441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 389441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker value = reply.readString8(); 390441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 391441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 392441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 3936d998b67be330843f633a563c23c606593060165Jeff Tinker virtual status_t getHdcpLevels(DrmPlugin::HdcpLevel *connected, 3946d998b67be330843f633a563c23c606593060165Jeff Tinker DrmPlugin::HdcpLevel *max) const { 3956d998b67be330843f633a563c23c606593060165Jeff Tinker Parcel data, reply; 3966d998b67be330843f633a563c23c606593060165Jeff Tinker 3976d998b67be330843f633a563c23c606593060165Jeff Tinker if (connected == NULL || max == NULL) { 3986d998b67be330843f633a563c23c606593060165Jeff Tinker return BAD_VALUE; 3996d998b67be330843f633a563c23c606593060165Jeff Tinker } 4006d998b67be330843f633a563c23c606593060165Jeff Tinker 4016d998b67be330843f633a563c23c606593060165Jeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 4026d998b67be330843f633a563c23c606593060165Jeff Tinker 4036d998b67be330843f633a563c23c606593060165Jeff Tinker status_t status = remote()->transact(GET_HDCP_LEVELS, data, &reply); 4046d998b67be330843f633a563c23c606593060165Jeff Tinker if (status != OK) { 4056d998b67be330843f633a563c23c606593060165Jeff Tinker return status; 4066d998b67be330843f633a563c23c606593060165Jeff Tinker } 4076d998b67be330843f633a563c23c606593060165Jeff Tinker 4086d998b67be330843f633a563c23c606593060165Jeff Tinker *connected = static_cast<DrmPlugin::HdcpLevel>(reply.readInt32()); 4096d998b67be330843f633a563c23c606593060165Jeff Tinker *max = static_cast<DrmPlugin::HdcpLevel>(reply.readInt32()); 4106d998b67be330843f633a563c23c606593060165Jeff Tinker return reply.readInt32(); 4116d998b67be330843f633a563c23c606593060165Jeff Tinker } 4126d998b67be330843f633a563c23c606593060165Jeff Tinker 4136d998b67be330843f633a563c23c606593060165Jeff Tinker virtual status_t getNumberOfSessions(uint32_t *open, uint32_t *max) const { 4146d998b67be330843f633a563c23c606593060165Jeff Tinker Parcel data, reply; 4156d998b67be330843f633a563c23c606593060165Jeff Tinker 4166d998b67be330843f633a563c23c606593060165Jeff Tinker if (open == NULL || max == NULL) { 4176d998b67be330843f633a563c23c606593060165Jeff Tinker return BAD_VALUE; 4186d998b67be330843f633a563c23c606593060165Jeff Tinker } 4196d998b67be330843f633a563c23c606593060165Jeff Tinker 4206d998b67be330843f633a563c23c606593060165Jeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 4216d998b67be330843f633a563c23c606593060165Jeff Tinker 4226d998b67be330843f633a563c23c606593060165Jeff Tinker status_t status = remote()->transact(GET_NUMBER_OF_SESSIONS, data, &reply); 4236d998b67be330843f633a563c23c606593060165Jeff Tinker if (status != OK) { 4246d998b67be330843f633a563c23c606593060165Jeff Tinker return status; 4256d998b67be330843f633a563c23c606593060165Jeff Tinker } 4266d998b67be330843f633a563c23c606593060165Jeff Tinker 4276d998b67be330843f633a563c23c606593060165Jeff Tinker *open = reply.readInt32(); 4286d998b67be330843f633a563c23c606593060165Jeff Tinker *max = reply.readInt32(); 4296d998b67be330843f633a563c23c606593060165Jeff Tinker return reply.readInt32(); 4306d998b67be330843f633a563c23c606593060165Jeff Tinker } 4316d998b67be330843f633a563c23c606593060165Jeff Tinker 4326d998b67be330843f633a563c23c606593060165Jeff Tinker virtual status_t getSecurityLevel(Vector<uint8_t> const &sessionId, 4336d998b67be330843f633a563c23c606593060165Jeff Tinker DrmPlugin::SecurityLevel *level) const { 4346d998b67be330843f633a563c23c606593060165Jeff Tinker Parcel data, reply; 4356d998b67be330843f633a563c23c606593060165Jeff Tinker 4366d998b67be330843f633a563c23c606593060165Jeff Tinker if (level == NULL) { 4376d998b67be330843f633a563c23c606593060165Jeff Tinker return BAD_VALUE; 4386d998b67be330843f633a563c23c606593060165Jeff Tinker } 4396d998b67be330843f633a563c23c606593060165Jeff Tinker 4406d998b67be330843f633a563c23c606593060165Jeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 4416d998b67be330843f633a563c23c606593060165Jeff Tinker 4426d998b67be330843f633a563c23c606593060165Jeff Tinker writeVector(data, sessionId); 4436d998b67be330843f633a563c23c606593060165Jeff Tinker status_t status = remote()->transact(GET_SECURITY_LEVEL, data, &reply); 4446d998b67be330843f633a563c23c606593060165Jeff Tinker if (status != OK) { 4456d998b67be330843f633a563c23c606593060165Jeff Tinker return status; 4466d998b67be330843f633a563c23c606593060165Jeff Tinker } 4476d998b67be330843f633a563c23c606593060165Jeff Tinker 4486d998b67be330843f633a563c23c606593060165Jeff Tinker *level = static_cast<DrmPlugin::SecurityLevel>(reply.readInt32()); 4496d998b67be330843f633a563c23c606593060165Jeff Tinker return reply.readInt32(); 4506d998b67be330843f633a563c23c606593060165Jeff Tinker } 4516d998b67be330843f633a563c23c606593060165Jeff Tinker 452441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t getPropertyByteArray(String8 const &name, Vector<uint8_t> &value) const { 453441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 454441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 455441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 456441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeString8(name); 4573b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(GET_PROPERTY_BYTE_ARRAY, data, &reply); 4583b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 4593b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 4603b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 461441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 4624c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(reply, value); 463441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 464441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 465441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 466441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t setPropertyString(String8 const &name, String8 const &value) const { 467441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 468441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 469441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 470441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeString8(name); 471441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeString8(value); 4723b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(SET_PROPERTY_STRING, data, &reply); 4733b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 4743b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 4753b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 476441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 477441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 478441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 479441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 480441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t setPropertyByteArray(String8 const &name, 481441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> const &value) const { 482441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 483441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 484441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 485441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeString8(name); 4864c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, value); 4873b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(SET_PROPERTY_BYTE_ARRAY, data, &reply); 4883b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 4893b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 4903b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 491441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 492441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 493441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 494441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 495637b7855829920114a8863b93fe52203b7471eeaAdam Stone virtual status_t getMetrics(os::PersistableBundle *metrics) { 496568b3c45d48fab64c80b2780e8547564d35722e9Adam Stone if (metrics == NULL) { 497568b3c45d48fab64c80b2780e8547564d35722e9Adam Stone return BAD_VALUE; 498568b3c45d48fab64c80b2780e8547564d35722e9Adam Stone } 499ab394d13bab3a84f23677357576cee7a6f0c7899Adam Stone Parcel data, reply; 500ab394d13bab3a84f23677357576cee7a6f0c7899Adam Stone data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 501ab394d13bab3a84f23677357576cee7a6f0c7899Adam Stone 502ab394d13bab3a84f23677357576cee7a6f0c7899Adam Stone status_t status = remote()->transact(GET_METRICS, data, &reply); 503ab394d13bab3a84f23677357576cee7a6f0c7899Adam Stone if (status != OK) { 504ab394d13bab3a84f23677357576cee7a6f0c7899Adam Stone return status; 505ab394d13bab3a84f23677357576cee7a6f0c7899Adam Stone } 506568b3c45d48fab64c80b2780e8547564d35722e9Adam Stone // The reply data is ordered as 507568b3c45d48fab64c80b2780e8547564d35722e9Adam Stone // 1) 32 bit integer reply followed by 508568b3c45d48fab64c80b2780e8547564d35722e9Adam Stone // 2) Serialized PersistableBundle containing metrics. 509568b3c45d48fab64c80b2780e8547564d35722e9Adam Stone status_t reply_status; 510568b3c45d48fab64c80b2780e8547564d35722e9Adam Stone if (reply.readInt32(&reply_status) != OK 511568b3c45d48fab64c80b2780e8547564d35722e9Adam Stone || reply_status != OK) { 512568b3c45d48fab64c80b2780e8547564d35722e9Adam Stone ALOGE("Failed to read getMetrics response code from parcel. %d", 513568b3c45d48fab64c80b2780e8547564d35722e9Adam Stone reply_status); 514568b3c45d48fab64c80b2780e8547564d35722e9Adam Stone return reply_status; 515568b3c45d48fab64c80b2780e8547564d35722e9Adam Stone } 516ab394d13bab3a84f23677357576cee7a6f0c7899Adam Stone 517568b3c45d48fab64c80b2780e8547564d35722e9Adam Stone status = metrics->readFromParcel(&reply); 518568b3c45d48fab64c80b2780e8547564d35722e9Adam Stone if (status != OK) { 519568b3c45d48fab64c80b2780e8547564d35722e9Adam Stone ALOGE("Failed to read metrics from parcel. %d", status); 520568b3c45d48fab64c80b2780e8547564d35722e9Adam Stone return status; 521568b3c45d48fab64c80b2780e8547564d35722e9Adam Stone } 522568b3c45d48fab64c80b2780e8547564d35722e9Adam Stone return reply_status; 523ab394d13bab3a84f23677357576cee7a6f0c7899Adam Stone } 524441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 5254c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker virtual status_t setCipherAlgorithm(Vector<uint8_t> const &sessionId, 5264c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker String8 const &algorithm) { 5274c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Parcel data, reply; 5284c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 5294c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 5304c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, sessionId); 5314c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.writeString8(algorithm); 5323b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(SET_CIPHER_ALGORITHM, data, &reply); 5333b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 5343b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 5353b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 5364c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return reply.readInt32(); 5374c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 5384c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 5394c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker virtual status_t setMacAlgorithm(Vector<uint8_t> const &sessionId, 5404c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker String8 const &algorithm) { 5414c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Parcel data, reply; 5424c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 5434c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 5444c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, sessionId); 5454c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.writeString8(algorithm); 5463b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(SET_MAC_ALGORITHM, data, &reply); 5473b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 5483b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 5493b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 5504c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return reply.readInt32(); 5514c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 5524c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 5534c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker virtual status_t encrypt(Vector<uint8_t> const &sessionId, 5544c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &keyId, 5554c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &input, 5564c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &iv, 5574c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> &output) { 5584c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Parcel data, reply; 5594c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 5604c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 5614c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, sessionId); 5624c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, keyId); 5634c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, input); 5644c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, iv); 5654c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 5663b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(ENCRYPT, data, &reply); 5673b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 5683b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 5693b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 5704c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(reply, output); 5714c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 5724c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return reply.readInt32(); 5734c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 5744c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 5754c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker virtual status_t decrypt(Vector<uint8_t> const &sessionId, 5764c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &keyId, 5774c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &input, 5784c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &iv, 5794c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> &output) { 5804c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Parcel data, reply; 5814c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 5824c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 5834c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, sessionId); 5844c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, keyId); 5854c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, input); 5864c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, iv); 5874c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 5883b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(DECRYPT, data, &reply); 5893b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 5903b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 5913b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 5924c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(reply, output); 5934c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 5944c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return reply.readInt32(); 5954c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 5964c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 5974c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker virtual status_t sign(Vector<uint8_t> const &sessionId, 5984c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &keyId, 5994c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &message, 6004c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> &signature) { 6014c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Parcel data, reply; 6024c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 6034c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 6044c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, sessionId); 6054c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, keyId); 6064c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, message); 6074c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 6083b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(SIGN, data, &reply); 6093b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 6103b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 6113b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 6124c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(reply, signature); 6134c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 6144c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return reply.readInt32(); 6154c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 6164c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 6174c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker virtual status_t verify(Vector<uint8_t> const &sessionId, 6184c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &keyId, 6194c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &message, 6204c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> const &signature, 6214c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker bool &match) { 6224c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Parcel data, reply; 6234c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 6244c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 6254c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, sessionId); 6264c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, keyId); 6274c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, message); 6284c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(data, signature); 6294c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 6303b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(VERIFY, data, &reply); 6313b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 6323b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 6333b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 6344c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker match = (bool)reply.readInt32(); 6354c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return reply.readInt32(); 6364c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 6374c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 63868d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker virtual status_t signRSA(Vector<uint8_t> const &sessionId, 63968d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker String8 const &algorithm, 64068d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker Vector<uint8_t> const &message, 64168d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker Vector<uint8_t> const &wrappedKey, 64268d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker Vector<uint8_t> &signature) { 64368d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker Parcel data, reply; 64468d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 64568d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker 64668d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker writeVector(data, sessionId); 64768d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker data.writeString8(algorithm); 64868d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker writeVector(data, message); 64968d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker writeVector(data, wrappedKey); 65068d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker 6513b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(SIGN_RSA, data, &reply); 6523b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 6533b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 6543b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 65568d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker readVector(reply, signature); 65668d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker 65768d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker return reply.readInt32(); 65868d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker } 65968d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker 660c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker virtual status_t setListener(const sp<IDrmClient>& listener) { 661c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker Parcel data, reply; 662c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 66306b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen data.writeStrongBinder(IInterface::asBinder(listener)); 6643b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker status_t status = remote()->transact(SET_LISTENER, data, &reply); 6653b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker if (status != OK) { 6663b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker return status; 6673b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker } 668c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker return reply.readInt32(); 669c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker } 670c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker 671441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinkerprivate: 6724c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker void readVector(Parcel &reply, Vector<uint8_t> &vector) const { 6734c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker uint32_t size = reply.readInt32(); 6744c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker vector.insertAt((size_t)0, size); 6754c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply.read(vector.editArray(), size); 6764c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 6774c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 6784c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker void writeVector(Parcel &data, Vector<uint8_t> const &vector) const { 6794c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.writeInt32(vector.size()); 6804c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker data.write(vector.array(), vector.size()); 6814c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 6824c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 683441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker DISALLOW_EVIL_CONSTRUCTORS(BpDrm); 684441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker}; 685441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 686441a78d5e224e0d67f9b52fa9adc795c6944159bJeff TinkerIMPLEMENT_META_INTERFACE(Drm, "android.drm.IDrm"); 687441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 688441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker//////////////////////////////////////////////////////////////////////////////// 689441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 6904c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinkervoid BnDrm::readVector(const Parcel &data, Vector<uint8_t> &vector) const { 6914c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker uint32_t size = data.readInt32(); 692b41a527176b659c5ddfc734838df7607a6af80c9Jeff Tinker if (vector.insertAt((size_t)0, size) < 0) { 693b41a527176b659c5ddfc734838df7607a6af80c9Jeff Tinker vector.clear(); 694b41a527176b659c5ddfc734838df7607a6af80c9Jeff Tinker } 695b41a527176b659c5ddfc734838df7607a6af80c9Jeff Tinker if (data.read(vector.editArray(), size) != NO_ERROR) { 696b41a527176b659c5ddfc734838df7607a6af80c9Jeff Tinker vector.clear(); 697b41a527176b659c5ddfc734838df7607a6af80c9Jeff Tinker android_errorWriteWithInfoLog(0x534e4554, "62872384", -1, NULL, 0); 698b41a527176b659c5ddfc734838df7607a6af80c9Jeff Tinker } 6994c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker} 7004c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 7014c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinkervoid BnDrm::writeVector(Parcel *reply, Vector<uint8_t> const &vector) const { 7024c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply->writeInt32(vector.size()); 7034c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply->write(vector.array(), vector.size()); 7044c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker} 7054c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 706441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinkerstatus_t BnDrm::onTransact( 707441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) { 708441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker switch (code) { 709441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case INIT_CHECK: 710441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 711441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 712441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(initCheck()); 713441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 714441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 715441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 716441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case IS_CRYPTO_SUPPORTED: 717441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 718441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 719441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker uint8_t uuid[16]; 720441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.read(uuid, sizeof(uuid)); 7219cf69e0fc110f17c28e988ed0f9bf91abfaf710dJeff Tinker String8 mimeType = data.readString8(); 7229cf69e0fc110f17c28e988ed0f9bf91abfaf710dJeff Tinker reply->writeInt32(isCryptoSchemeSupported(uuid, mimeType)); 723441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 724441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 725441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 726441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case CREATE_PLUGIN: 727441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 728441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 729441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker uint8_t uuid[16]; 730441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.read(uuid, sizeof(uuid)); 73168b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong String8 appPackageName = data.readString8(); 73268b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong reply->writeInt32(createPlugin(uuid, appPackageName)); 733441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 734441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 735441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 736441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case DESTROY_PLUGIN: 737441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 738441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 739441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(destroyPlugin()); 740441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 741441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 742441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 743441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case OPEN_SESSION: 744441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 745441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 74641d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker DrmPlugin::SecurityLevel level = 74741d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker static_cast<DrmPlugin::SecurityLevel>(data.readInt32()); 748441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> sessionId; 74941d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker status_t result = openSession(level, sessionId); 7504c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(reply, sessionId); 751441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(result); 752441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 753441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 754441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 755441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case CLOSE_SESSION: 756441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 757441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 758441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> sessionId; 7594c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, sessionId); 760441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(closeSession(sessionId)); 761441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 762441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 763441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 7644c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker case GET_KEY_REQUEST: 765441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 766441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 7674c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> sessionId, initData; 768441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 7694c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, sessionId); 7704c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, initData); 771441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 mimeType = data.readString8(); 7724c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker DrmPlugin::KeyType keyType = (DrmPlugin::KeyType)data.readInt32(); 773441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 774441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker KeyedVector<String8, String8> optionalParameters; 775441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker uint32_t count = data.readInt32(); 776441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker for (size_t i = 0; i < count; ++i) { 777441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 key, value; 778441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker key = data.readString8(); 779441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker value = data.readString8(); 780441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker optionalParameters.add(key, value); 781441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 782441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 783441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> request; 784441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 defaultUrl; 7858aff7771bf6f4230a0bf9b548c874e139e133686Jeff Tinker DrmPlugin::KeyRequestType keyRequestType = DrmPlugin::kKeyRequestType_Unknown; 786d072c909d87f8150433860f6de4c11df6e09e2f9Jeff Tinker 787d072c909d87f8150433860f6de4c11df6e09e2f9Jeff Tinker status_t result = getKeyRequest(sessionId, initData, mimeType, 788d072c909d87f8150433860f6de4c11df6e09e2f9Jeff Tinker keyType, optionalParameters, request, defaultUrl, 789d072c909d87f8150433860f6de4c11df6e09e2f9Jeff Tinker &keyRequestType); 790441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 7914c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(reply, request); 792441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeString8(defaultUrl); 793d072c909d87f8150433860f6de4c11df6e09e2f9Jeff Tinker reply->writeInt32(static_cast<int32_t>(keyRequestType)); 794441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(result); 795441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 796441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 797441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 7984c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker case PROVIDE_KEY_RESPONSE: 799441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 800441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 8014c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> sessionId, response, keySetId; 8024c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, sessionId); 8034c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, response); 8044c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker uint32_t result = provideKeyResponse(sessionId, response, keySetId); 8054c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(reply, keySetId); 8064c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply->writeInt32(result); 8074c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return OK; 8084c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 809441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 8104c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker case REMOVE_KEYS: 8114c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker { 8124c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 8134c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> keySetId; 8144c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, keySetId); 8154c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply->writeInt32(removeKeys(keySetId)); 816441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 817441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 818441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 8194c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker case RESTORE_KEYS: 820441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 821441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 8224c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> sessionId, keySetId; 8234c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, sessionId); 8244c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, keySetId); 8254c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply->writeInt32(restoreKeys(sessionId, keySetId)); 826441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 827441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 828441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 8294c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker case QUERY_KEY_STATUS: 830441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 831441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 832441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> sessionId; 8334c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, sessionId); 834441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker KeyedVector<String8, String8> infoMap; 8354c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker status_t result = queryKeyStatus(sessionId, infoMap); 836441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker size_t count = infoMap.size(); 837441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(count); 838441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker for (size_t i = 0; i < count; ++i) { 839441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeString8(infoMap.keyAt(i)); 840441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeString8(infoMap.valueAt(i)); 841441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 842441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(result); 843441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 844441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 845441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 846441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case GET_PROVISION_REQUEST: 847441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 848441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 84968d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker String8 certType = data.readString8(); 85068d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker String8 certAuthority = data.readString8(); 85168d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker 852441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> request; 853441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 defaultUrl; 85468d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker status_t result = getProvisionRequest(certType, certAuthority, 85568d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker request, defaultUrl); 8564c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(reply, request); 857441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeString8(defaultUrl); 858441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(result); 859441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 860441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 861441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 862441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case PROVIDE_PROVISION_RESPONSE: 863441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 864441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 865441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> response; 86668d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker Vector<uint8_t> certificate; 86768d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker Vector<uint8_t> wrappedKey; 8684c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, response); 86968d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker status_t result = provideProvisionResponse(response, certificate, wrappedKey); 87068d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker writeVector(reply, certificate); 87168d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker writeVector(reply, wrappedKey); 87268d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker reply->writeInt32(result); 873441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 874441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 875441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 876441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case GET_SECURE_STOPS: 877441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 878441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 879441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker List<Vector<uint8_t> > secureStops; 880441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker status_t result = getSecureStops(secureStops); 881441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker size_t count = secureStops.size(); 882441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(count); 883441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker List<Vector<uint8_t> >::iterator iter = secureStops.begin(); 884441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker while(iter != secureStops.end()) { 885441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker size_t size = iter->size(); 886441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(size); 887441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->write(iter->array(), iter->size()); 888423e33ce6569cb14ecf772e9670208517f7b30c4Jeff Tinker iter++; 889441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 890441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(result); 891441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 892441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 893441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 89415177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker case GET_SECURE_STOP_IDS: 89515177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker { 89615177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 89715177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker List<Vector<uint8_t> > secureStopIds; 89815177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker status_t result = getSecureStopIds(secureStopIds); 89915177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker size_t count = secureStopIds.size(); 90015177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker reply->writeInt32(count); 90115177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker List<Vector<uint8_t> >::iterator iter = secureStopIds.begin(); 90215177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker while(iter != secureStopIds.end()) { 90315177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker size_t size = iter->size(); 90415177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker reply->writeInt32(size); 90515177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker reply->write(iter->array(), iter->size()); 90615177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker iter++; 90715177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker } 90815177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker reply->writeInt32(result); 90915177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker return OK; 91015177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker } 91115177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker 9123c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker case GET_SECURE_STOP: 9133c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker { 9143c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 9153c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker Vector<uint8_t> ssid, secureStop; 9163c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker readVector(data, ssid); 9173c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker status_t result = getSecureStop(ssid, secureStop); 9183c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker writeVector(reply, secureStop); 9193c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker reply->writeInt32(result); 9203c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker return OK; 9213c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker } 9223c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker 923441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case RELEASE_SECURE_STOPS: 924441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 925441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 926441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> ssRelease; 9274c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, ssRelease); 928441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(releaseSecureStops(ssRelease)); 929441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 930441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 931441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 93215177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker case REMOVE_SECURE_STOP: 93315177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker { 93415177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 93515177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker Vector<uint8_t> ssid; 93615177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker readVector(data, ssid); 93715177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker reply->writeInt32(removeSecureStop(ssid)); 93815177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker return OK; 93915177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker } 94015177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker 94115177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker case REMOVE_ALL_SECURE_STOPS: 9423c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker { 9433c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 94415177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker reply->writeInt32(removeAllSecureStops()); 9453c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker return OK; 9463c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker } 9473c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker 9486d998b67be330843f633a563c23c606593060165Jeff Tinker case GET_HDCP_LEVELS: 9496d998b67be330843f633a563c23c606593060165Jeff Tinker { 9506d998b67be330843f633a563c23c606593060165Jeff Tinker CHECK_INTERFACE(IDrm, data, reply); 9516d998b67be330843f633a563c23c606593060165Jeff Tinker DrmPlugin::HdcpLevel connected = DrmPlugin::kHdcpLevelUnknown; 9526d998b67be330843f633a563c23c606593060165Jeff Tinker DrmPlugin::HdcpLevel max = DrmPlugin::kHdcpLevelUnknown; 9536d998b67be330843f633a563c23c606593060165Jeff Tinker status_t result = getHdcpLevels(&connected, &max); 9546d998b67be330843f633a563c23c606593060165Jeff Tinker reply->writeInt32(connected); 9556d998b67be330843f633a563c23c606593060165Jeff Tinker reply->writeInt32(max); 9566d998b67be330843f633a563c23c606593060165Jeff Tinker reply->writeInt32(result); 9576d998b67be330843f633a563c23c606593060165Jeff Tinker return OK; 9586d998b67be330843f633a563c23c606593060165Jeff Tinker } 9596d998b67be330843f633a563c23c606593060165Jeff Tinker 9606d998b67be330843f633a563c23c606593060165Jeff Tinker case GET_NUMBER_OF_SESSIONS: 9616d998b67be330843f633a563c23c606593060165Jeff Tinker { 9626d998b67be330843f633a563c23c606593060165Jeff Tinker CHECK_INTERFACE(IDrm, data, reply); 9636d998b67be330843f633a563c23c606593060165Jeff Tinker uint32_t open = 0, max = 0; 9646d998b67be330843f633a563c23c606593060165Jeff Tinker status_t result = getNumberOfSessions(&open, &max); 9656d998b67be330843f633a563c23c606593060165Jeff Tinker reply->writeInt32(open); 9666d998b67be330843f633a563c23c606593060165Jeff Tinker reply->writeInt32(max); 9676d998b67be330843f633a563c23c606593060165Jeff Tinker reply->writeInt32(result); 9686d998b67be330843f633a563c23c606593060165Jeff Tinker return OK; 9696d998b67be330843f633a563c23c606593060165Jeff Tinker } 9706d998b67be330843f633a563c23c606593060165Jeff Tinker 9716d998b67be330843f633a563c23c606593060165Jeff Tinker case GET_SECURITY_LEVEL: 9726d998b67be330843f633a563c23c606593060165Jeff Tinker { 9736d998b67be330843f633a563c23c606593060165Jeff Tinker CHECK_INTERFACE(IDrm, data, reply); 9746d998b67be330843f633a563c23c606593060165Jeff Tinker Vector<uint8_t> sessionId; 9756d998b67be330843f633a563c23c606593060165Jeff Tinker readVector(data, sessionId); 9766d998b67be330843f633a563c23c606593060165Jeff Tinker DrmPlugin::SecurityLevel level = DrmPlugin::kSecurityLevelUnknown; 9776d998b67be330843f633a563c23c606593060165Jeff Tinker status_t result = getSecurityLevel(sessionId, &level); 9786d998b67be330843f633a563c23c606593060165Jeff Tinker reply->writeInt32(level); 9796d998b67be330843f633a563c23c606593060165Jeff Tinker reply->writeInt32(result); 9806d998b67be330843f633a563c23c606593060165Jeff Tinker return OK; 9816d998b67be330843f633a563c23c606593060165Jeff Tinker } 9826d998b67be330843f633a563c23c606593060165Jeff Tinker 983441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case GET_PROPERTY_STRING: 984441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 985441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 986441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 name = data.readString8(); 987441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 value; 988441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker status_t result = getPropertyString(name, value); 989441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeString8(value); 990441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(result); 991441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 992441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 993441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 994441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case GET_PROPERTY_BYTE_ARRAY: 995441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 996441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 997441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 name = data.readString8(); 998441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> value; 999441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker status_t result = getPropertyByteArray(name, value); 10004c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(reply, value); 1001441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(result); 1002441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 1003441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 1004441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 1005441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case SET_PROPERTY_STRING: 1006441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 1007441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 1008441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 name = data.readString8(); 1009441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 value = data.readString8(); 1010441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(setPropertyString(name, value)); 1011441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 1012441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 1013441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 1014441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case SET_PROPERTY_BYTE_ARRAY: 1015441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 1016441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 1017441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 name = data.readString8(); 1018441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> value; 10194c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, value); 1020441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(setPropertyByteArray(name, value)); 1021441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 1022441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 1023441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 1024ab394d13bab3a84f23677357576cee7a6f0c7899Adam Stone case GET_METRICS: 1025ab394d13bab3a84f23677357576cee7a6f0c7899Adam Stone { 1026ab394d13bab3a84f23677357576cee7a6f0c7899Adam Stone CHECK_INTERFACE(IDrm, data, reply); 1027ab394d13bab3a84f23677357576cee7a6f0c7899Adam Stone 1028637b7855829920114a8863b93fe52203b7471eeaAdam Stone os::PersistableBundle metrics; 1029637b7855829920114a8863b93fe52203b7471eeaAdam Stone status_t result = getMetrics(&metrics); 1030568b3c45d48fab64c80b2780e8547564d35722e9Adam Stone // The reply data is ordered as 1031568b3c45d48fab64c80b2780e8547564d35722e9Adam Stone // 1) 32 bit integer reply followed by 1032568b3c45d48fab64c80b2780e8547564d35722e9Adam Stone // 2) Serialized PersistableBundle containing metrics. 1033568b3c45d48fab64c80b2780e8547564d35722e9Adam Stone // Only write the metrics if the getMetrics result was 1034568b3c45d48fab64c80b2780e8547564d35722e9Adam Stone // OK and we successfully added the status to reply. 1035568b3c45d48fab64c80b2780e8547564d35722e9Adam Stone status_t parcel_result = reply->writeInt32(result); 1036568b3c45d48fab64c80b2780e8547564d35722e9Adam Stone if (result == OK && parcel_result == OK) { 1037568b3c45d48fab64c80b2780e8547564d35722e9Adam Stone parcel_result = metrics.writeToParcel(reply); 1038568b3c45d48fab64c80b2780e8547564d35722e9Adam Stone } 1039568b3c45d48fab64c80b2780e8547564d35722e9Adam Stone return parcel_result; 1040ab394d13bab3a84f23677357576cee7a6f0c7899Adam Stone } 1041ab394d13bab3a84f23677357576cee7a6f0c7899Adam Stone 10424c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker case SET_CIPHER_ALGORITHM: 10434c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker { 10444c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 10454c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> sessionId; 10464c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, sessionId); 10474c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker String8 algorithm = data.readString8(); 10484c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply->writeInt32(setCipherAlgorithm(sessionId, algorithm)); 10494c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return OK; 10504c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 10514c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 10524c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker case SET_MAC_ALGORITHM: 10534c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker { 10544c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 10554c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> sessionId; 10564c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, sessionId); 10574c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker String8 algorithm = data.readString8(); 10584c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply->writeInt32(setMacAlgorithm(sessionId, algorithm)); 10594c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return OK; 10604c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 10614c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 10624c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker case ENCRYPT: 10634c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker { 10644c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 10654c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> sessionId, keyId, input, iv, output; 10664c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, sessionId); 10674c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, keyId); 10684c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, input); 10694c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, iv); 10704c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker uint32_t result = encrypt(sessionId, keyId, input, iv, output); 10714c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(reply, output); 10724c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply->writeInt32(result); 10734c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return OK; 10744c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 10754c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 10764c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker case DECRYPT: 10774c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker { 10784c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 10794c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> sessionId, keyId, input, iv, output; 10804c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, sessionId); 10814c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, keyId); 10824c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, input); 10834c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, iv); 10844c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker uint32_t result = decrypt(sessionId, keyId, input, iv, output); 10854c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(reply, output); 10864c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply->writeInt32(result); 10874c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return OK; 10884c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 10894c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 10904c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker case SIGN: 10914c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker { 10924c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 10934c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> sessionId, keyId, message, signature; 10944c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, sessionId); 10954c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, keyId); 10964c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, message); 10974c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker uint32_t result = sign(sessionId, keyId, message, signature); 10984c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker writeVector(reply, signature); 10994c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply->writeInt32(result); 11004c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return OK; 11014c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 11024c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 11034c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker case VERIFY: 11044c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker { 11054c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 11064c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker Vector<uint8_t> sessionId, keyId, message, signature; 11074c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, sessionId); 11084c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, keyId); 11094c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, message); 11104c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker readVector(data, signature); 11119a6861cbd3bb0e1b8fe4c105795256ee032f9664Jeff Tinker bool match = false; 11124c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker uint32_t result = verify(sessionId, keyId, message, signature, match); 11134c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply->writeInt32(match); 11144c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker reply->writeInt32(result); 11154c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return OK; 11164c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker } 11174c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker 111868d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker case SIGN_RSA: 111968d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker { 112068d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker CHECK_INTERFACE(IDrm, data, reply); 112168d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker Vector<uint8_t> sessionId, message, wrappedKey, signature; 112268d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker readVector(data, sessionId); 112368d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker String8 algorithm = data.readString8(); 112468d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker readVector(data, message); 112568d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker readVector(data, wrappedKey); 112668d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker uint32_t result = signRSA(sessionId, algorithm, message, wrappedKey, signature); 112768d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker writeVector(reply, signature); 112868d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker reply->writeInt32(result); 112968d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker return OK; 113068d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker } 113168d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker 1132c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker case SET_LISTENER: { 1133c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 1134c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker sp<IDrmClient> listener = 1135c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker interface_cast<IDrmClient>(data.readStrongBinder()); 1136c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker reply->writeInt32(setListener(listener)); 1137c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker return NO_ERROR; 1138c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker } break; 1139c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker 11404c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker default: 11414c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker return BBinder::onTransact(code, data, reply, flags); 1142441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 1143441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker} 1144441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 1145441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker} // namespace android 1146