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