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