IDrm.cpp revision 4c63a239c404af1e055e5f9939939ab0fd09d98a
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,
544c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    VERIFY
55441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker};
56441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
57441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinkerstruct BpDrm : public BpInterface<IDrm> {
58441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    BpDrm(const sp<IBinder> &impl)
59441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        : BpInterface<IDrm>(impl) {
60441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
61441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
62441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    virtual status_t initCheck() const {
63441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        Parcel data, reply;
64441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
65441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        remote()->transact(INIT_CHECK, data, &reply);
66441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
67441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return reply.readInt32();
68441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
69441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
70441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    virtual bool isCryptoSchemeSupported(const uint8_t uuid[16]) {
71441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        Parcel data, reply;
72441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
73441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.write(uuid, 16);
74441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        remote()->transact(IS_CRYPTO_SUPPORTED, data, &reply);
75441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
76441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return reply.readInt32() != 0;
77441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
78441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
79441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    virtual status_t createPlugin(const uint8_t uuid[16]) {
80441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        Parcel data, reply;
81441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
82441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.write(uuid, 16);
83441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
84441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        remote()->transact(CREATE_PLUGIN, data, &reply);
85441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
86441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return reply.readInt32();
87441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
88441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
89441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    virtual status_t destroyPlugin() {
90441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        Parcel data, reply;
91441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
92441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        remote()->transact(DESTROY_PLUGIN, data, &reply);
93441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
94441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return reply.readInt32();
95441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
96441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
97441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    virtual status_t openSession(Vector<uint8_t> &sessionId) {
98441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        Parcel data, reply;
99441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
100441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
101441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        remote()->transact(OPEN_SESSION, data, &reply);
1024c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        readVector(reply, sessionId);
103441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
104441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return reply.readInt32();
105441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
106441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
107441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    virtual status_t closeSession(Vector<uint8_t> const &sessionId) {
108441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        Parcel data, reply;
109441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
110441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
1114c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, sessionId);
112441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        remote()->transact(CLOSE_SESSION, data, &reply);
113441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
114441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return reply.readInt32();
115441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
116441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
117441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    virtual status_t
1184c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        getKeyRequest(Vector<uint8_t> const &sessionId,
1194c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                      Vector<uint8_t> const &initData,
1204c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                      String8 const &mimeType, DrmPlugin::KeyType keyType,
1214c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                      KeyedVector<String8, String8> const &optionalParameters,
1224c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                      Vector<uint8_t> &request, String8 &defaultUrl) {
123441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        Parcel data, reply;
124441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
125441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
1264c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, sessionId);
1274c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, initData);
128441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeString8(mimeType);
1294c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        data.writeInt32((uint32_t)keyType);
130441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
131441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInt32(optionalParameters.size());
132441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        for (size_t i = 0; i < optionalParameters.size(); ++i) {
133441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            data.writeString8(optionalParameters.keyAt(i));
134441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            data.writeString8(optionalParameters.valueAt(i));
135441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
1364c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        remote()->transact(GET_KEY_REQUEST, data, &reply);
137441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
1384c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        readVector(reply, request);
139441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        defaultUrl = reply.readString8();
140441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
141441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return reply.readInt32();
142441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
143441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
1444c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    virtual status_t provideKeyResponse(Vector<uint8_t> const &sessionId,
1454c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                                        Vector<uint8_t> const &response,
1464c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                                        Vector<uint8_t> &keySetId) {
1474c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        Parcel data, reply;
1484c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
1494c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, sessionId);
1504c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, response);
1514c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        remote()->transact(PROVIDE_KEY_RESPONSE, data, &reply);
1524c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        readVector(reply, keySetId);
1534c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
1544c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        return reply.readInt32();
1554c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    }
1564c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
1574c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    virtual status_t removeKeys(Vector<uint8_t> const &keySetId) {
158441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        Parcel data, reply;
159441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
160441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
1614c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, keySetId);
1624c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        remote()->transact(REMOVE_KEYS, data, &reply);
163441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
164441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return reply.readInt32();
165441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
166441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
1674c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    virtual status_t restoreKeys(Vector<uint8_t> const &sessionId,
1684c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                                 Vector<uint8_t> const &keySetId) {
169441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        Parcel data, reply;
170441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
171441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
1724c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, sessionId);
1734c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, keySetId);
1744c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        remote()->transact(RESTORE_KEYS, data, &reply);
175441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
176441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return reply.readInt32();
177441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
178441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
1794c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    virtual status_t queryKeyStatus(Vector<uint8_t> const &sessionId,
180441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker                                        KeyedVector<String8, String8> &infoMap) const {
181441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        Parcel data, reply;
182441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
183441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
1844c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, sessionId);
1854c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        remote()->transact(QUERY_KEY_STATUS, data, &reply);
186441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
187441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        infoMap.clear();
188441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        size_t count = reply.readInt32();
189441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        for (size_t i = 0; i < count; i++) {
190441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            String8 key = reply.readString8();
191441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            String8 value = reply.readString8();
192441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            infoMap.add(key, value);
193441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
194441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return reply.readInt32();
195441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
196441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
197441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    virtual status_t getProvisionRequest(Vector<uint8_t> &request,
198441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker                                         String8 &defaultUrl) {
199441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        Parcel data, reply;
200441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
201441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
202441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        remote()->transact(GET_PROVISION_REQUEST, data, &reply);
203441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
2044c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        readVector(reply, request);
205441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        defaultUrl = reply.readString8();
206441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
207441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return reply.readInt32();
208441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
209441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
210441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    virtual status_t provideProvisionResponse(Vector<uint8_t> const &response) {
211441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        Parcel data, reply;
212441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
213441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
2144c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, response);
215441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        remote()->transact(PROVIDE_PROVISION_RESPONSE, data, &reply);
216441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
217441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return reply.readInt32();
218441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
219441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
220441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    virtual status_t getSecureStops(List<Vector<uint8_t> > &secureStops) {
221441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        Parcel data, reply;
222441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
223441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
224441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        remote()->transact(GET_SECURE_STOPS, data, &reply);
225441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
226441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        secureStops.clear();
227441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        uint32_t count = reply.readInt32();
228441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        for (size_t i = 0; i < count; i++) {
229441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            Vector<uint8_t> secureStop;
2304c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(reply, secureStop);
231441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            secureStops.push_back(secureStop);
232441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
233441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return reply.readInt32();
234441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
235441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
236441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    virtual status_t releaseSecureStops(Vector<uint8_t> const &ssRelease) {
237441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        Parcel data, reply;
238441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
239441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
2404c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, ssRelease);
241441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        remote()->transact(RELEASE_SECURE_STOPS, data, &reply);
242441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
243441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return reply.readInt32();
244441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
245441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
246441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    virtual status_t getPropertyString(String8 const &name, String8 &value) const {
247441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        Parcel data, reply;
248441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
249441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
250441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeString8(name);
251441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        remote()->transact(GET_PROPERTY_STRING, data, &reply);
252441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
253441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        value = reply.readString8();
254441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return reply.readInt32();
255441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
256441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
257441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    virtual status_t getPropertyByteArray(String8 const &name, Vector<uint8_t> &value) const {
258441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        Parcel data, reply;
259441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
260441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
261441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeString8(name);
262441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        remote()->transact(GET_PROPERTY_BYTE_ARRAY, data, &reply);
263441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
2644c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        readVector(reply, value);
265441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return reply.readInt32();
266441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
267441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
268441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    virtual status_t setPropertyString(String8 const &name, String8 const &value) const {
269441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        Parcel data, reply;
270441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
271441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
272441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeString8(name);
273441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeString8(value);
274441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        remote()->transact(SET_PROPERTY_STRING, data, &reply);
275441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
276441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return reply.readInt32();
277441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
278441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
279441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    virtual status_t setPropertyByteArray(String8 const &name,
280441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker                                          Vector<uint8_t> const &value) const {
281441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        Parcel data, reply;
282441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
283441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
284441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeString8(name);
2854c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, value);
286441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        remote()->transact(SET_PROPERTY_BYTE_ARRAY, data, &reply);
287441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
288441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return reply.readInt32();
289441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
290441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
291441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
2924c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    virtual status_t setCipherAlgorithm(Vector<uint8_t> const &sessionId,
2934c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                                        String8 const &algorithm) {
2944c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        Parcel data, reply;
2954c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
2964c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
2974c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, sessionId);
2984c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        data.writeString8(algorithm);
2994c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        remote()->transact(SET_CIPHER_ALGORITHM, data, &reply);
3004c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        return reply.readInt32();
3014c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    }
3024c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
3034c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    virtual status_t setMacAlgorithm(Vector<uint8_t> const &sessionId,
3044c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                                     String8 const &algorithm) {
3054c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        Parcel data, reply;
3064c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
3074c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
3084c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, sessionId);
3094c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        data.writeString8(algorithm);
3104c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        remote()->transact(SET_MAC_ALGORITHM, data, &reply);
3114c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        return reply.readInt32();
3124c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    }
3134c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
3144c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    virtual status_t encrypt(Vector<uint8_t> const &sessionId,
3154c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                             Vector<uint8_t> const &keyId,
3164c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                             Vector<uint8_t> const &input,
3174c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                             Vector<uint8_t> const &iv,
3184c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                             Vector<uint8_t> &output) {
3194c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        Parcel data, reply;
3204c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
3214c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
3224c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, sessionId);
3234c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, keyId);
3244c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, input);
3254c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, iv);
3264c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
3274c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        remote()->transact(ENCRYPT, data, &reply);
3284c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        readVector(reply, output);
3294c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
3304c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        return reply.readInt32();
3314c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    }
3324c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
3334c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    virtual status_t decrypt(Vector<uint8_t> const &sessionId,
3344c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                             Vector<uint8_t> const &keyId,
3354c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                             Vector<uint8_t> const &input,
3364c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                             Vector<uint8_t> const &iv,
3374c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                             Vector<uint8_t> &output) {
3384c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        Parcel data, reply;
3394c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
3404c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
3414c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, sessionId);
3424c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, keyId);
3434c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, input);
3444c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, iv);
3454c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
3464c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        remote()->transact(DECRYPT, data, &reply);
3474c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        readVector(reply, output);
3484c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
3494c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        return reply.readInt32();
3504c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    }
3514c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
3524c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    virtual status_t sign(Vector<uint8_t> const &sessionId,
3534c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                          Vector<uint8_t> const &keyId,
3544c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                          Vector<uint8_t> const &message,
3554c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                          Vector<uint8_t> &signature) {
3564c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        Parcel data, reply;
3574c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
3584c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
3594c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, sessionId);
3604c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, keyId);
3614c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, message);
3624c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
3634c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        remote()->transact(SIGN, data, &reply);
3644c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        readVector(reply, signature);
3654c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
3664c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        return reply.readInt32();
3674c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    }
3684c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
3694c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    virtual status_t verify(Vector<uint8_t> const &sessionId,
3704c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                            Vector<uint8_t> const &keyId,
3714c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                            Vector<uint8_t> const &message,
3724c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                            Vector<uint8_t> const &signature,
3734c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                            bool &match) {
3744c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        Parcel data, reply;
3754c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
3764c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
3774c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, sessionId);
3784c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, keyId);
3794c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, message);
3804c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, signature);
3814c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
3824c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        remote()->transact(VERIFY, data, &reply);
3834c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        match = (bool)reply.readInt32();
3844c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        return reply.readInt32();
3854c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    }
3864c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
387441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinkerprivate:
3884c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    void readVector(Parcel &reply, Vector<uint8_t> &vector) const {
3894c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        uint32_t size = reply.readInt32();
3904c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        vector.insertAt((size_t)0, size);
3914c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        reply.read(vector.editArray(), size);
3924c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    }
3934c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
3944c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    void writeVector(Parcel &data, Vector<uint8_t> const &vector) const {
3954c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        data.writeInt32(vector.size());
3964c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        data.write(vector.array(), vector.size());
3974c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    }
3984c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
399441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    DISALLOW_EVIL_CONSTRUCTORS(BpDrm);
400441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker};
401441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
402441a78d5e224e0d67f9b52fa9adc795c6944159bJeff TinkerIMPLEMENT_META_INTERFACE(Drm, "android.drm.IDrm");
403441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
404441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker////////////////////////////////////////////////////////////////////////////////
405441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
4064c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinkervoid BnDrm::readVector(const Parcel &data, Vector<uint8_t> &vector) const {
4074c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    uint32_t size = data.readInt32();
4084c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    vector.insertAt((size_t)0, size);
4094c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    data.read(vector.editArray(), size);
4104c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker}
4114c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
4124c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinkervoid BnDrm::writeVector(Parcel *reply, Vector<uint8_t> const &vector) const {
4134c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    reply->writeInt32(vector.size());
4144c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    reply->write(vector.array(), vector.size());
4154c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker}
4164c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
417441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinkerstatus_t BnDrm::onTransact(
418441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) {
419441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    switch (code) {
420441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        case INIT_CHECK:
421441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        {
422441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
423441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeInt32(initCheck());
424441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            return OK;
425441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
426441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
427441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        case IS_CRYPTO_SUPPORTED:
428441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        {
429441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
430441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            uint8_t uuid[16];
431441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            data.read(uuid, sizeof(uuid));
432441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeInt32(isCryptoSchemeSupported(uuid));
433441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            return OK;
434441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
435441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
436441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        case CREATE_PLUGIN:
437441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        {
438441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
439441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            uint8_t uuid[16];
440441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            data.read(uuid, sizeof(uuid));
441441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeInt32(createPlugin(uuid));
442441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            return OK;
443441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
444441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
445441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        case DESTROY_PLUGIN:
446441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        {
447441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
448441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeInt32(destroyPlugin());
449441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            return OK;
450441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
451441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
452441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        case OPEN_SESSION:
453441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        {
454441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
455441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            Vector<uint8_t> sessionId;
456441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            status_t result = openSession(sessionId);
4574c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            writeVector(reply, sessionId);
458441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeInt32(result);
459441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            return OK;
460441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
461441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
462441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        case CLOSE_SESSION:
463441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        {
464441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
465441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            Vector<uint8_t> sessionId;
4664c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, sessionId);
467441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeInt32(closeSession(sessionId));
468441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            return OK;
469441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
470441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
4714c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        case GET_KEY_REQUEST:
472441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        {
473441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
4744c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            Vector<uint8_t> sessionId, initData;
475441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
4764c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, sessionId);
4774c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, initData);
478441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            String8 mimeType = data.readString8();
4794c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            DrmPlugin::KeyType keyType = (DrmPlugin::KeyType)data.readInt32();
480441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
481441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            KeyedVector<String8, String8> optionalParameters;
482441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            uint32_t count = data.readInt32();
483441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            for (size_t i = 0; i < count; ++i) {
484441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker                String8 key, value;
485441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker                key = data.readString8();
486441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker                value = data.readString8();
487441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker                optionalParameters.add(key, value);
488441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            }
489441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
490441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            Vector<uint8_t> request;
491441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            String8 defaultUrl;
492441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
4934c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            status_t result = getKeyRequest(sessionId, initData,
4944c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                                            mimeType, keyType,
4954c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                                            optionalParameters,
4964c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                                            request, defaultUrl);
4974c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            writeVector(reply, request);
498441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeString8(defaultUrl);
499441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeInt32(result);
500441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            return OK;
501441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
502441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
5034c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        case PROVIDE_KEY_RESPONSE:
504441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        {
505441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
5064c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            Vector<uint8_t> sessionId, response, keySetId;
5074c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, sessionId);
5084c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, response);
5094c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            uint32_t result = provideKeyResponse(sessionId, response, keySetId);
5104c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            writeVector(reply, keySetId);
5114c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            reply->writeInt32(result);
5124c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            return OK;
5134c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        }
514441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
5154c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        case REMOVE_KEYS:
5164c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        {
5174c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
5184c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            Vector<uint8_t> keySetId;
5194c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, keySetId);
5204c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            reply->writeInt32(removeKeys(keySetId));
521441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            return OK;
522441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
523441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
5244c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        case RESTORE_KEYS:
525441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        {
526441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
5274c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            Vector<uint8_t> sessionId, keySetId;
5284c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, sessionId);
5294c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, keySetId);
5304c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            reply->writeInt32(restoreKeys(sessionId, keySetId));
531441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            return OK;
532441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
533441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
5344c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        case QUERY_KEY_STATUS:
535441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        {
536441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
537441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            Vector<uint8_t> sessionId;
5384c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, sessionId);
539441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            KeyedVector<String8, String8> infoMap;
5404c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            status_t result = queryKeyStatus(sessionId, infoMap);
541441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            size_t count = infoMap.size();
542441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeInt32(count);
543441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            for (size_t i = 0; i < count; ++i) {
544441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker                reply->writeString8(infoMap.keyAt(i));
545441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker                reply->writeString8(infoMap.valueAt(i));
546441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            }
547441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeInt32(result);
548441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            return OK;
549441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
550441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
551441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        case GET_PROVISION_REQUEST:
552441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        {
553441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
554441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            Vector<uint8_t> request;
555441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            String8 defaultUrl;
556441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            status_t result = getProvisionRequest(request, defaultUrl);
5574c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            writeVector(reply, request);
558441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeString8(defaultUrl);
559441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeInt32(result);
560441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            return OK;
561441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
562441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
563441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        case PROVIDE_PROVISION_RESPONSE:
564441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        {
565441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
566441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            Vector<uint8_t> response;
5674c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, response);
568441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeInt32(provideProvisionResponse(response));
569441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            return OK;
570441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
571441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
572441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        case GET_SECURE_STOPS:
573441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        {
574441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
575441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            List<Vector<uint8_t> > secureStops;
576441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            status_t result = getSecureStops(secureStops);
577441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            size_t count = secureStops.size();
578441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeInt32(count);
579441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            List<Vector<uint8_t> >::iterator iter = secureStops.begin();
580441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            while(iter != secureStops.end()) {
581441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker                size_t size = iter->size();
582441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker                reply->writeInt32(size);
583441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker                reply->write(iter->array(), iter->size());
584441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            }
585441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeInt32(result);
586441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            return OK;
587441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
588441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
589441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        case RELEASE_SECURE_STOPS:
590441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        {
591441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
592441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            Vector<uint8_t> ssRelease;
5934c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, ssRelease);
594441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeInt32(releaseSecureStops(ssRelease));
595441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            return OK;
596441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
597441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
598441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        case GET_PROPERTY_STRING:
599441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        {
600441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
601441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            String8 name = data.readString8();
602441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            String8 value;
603441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            status_t result = getPropertyString(name, value);
604441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeString8(value);
605441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeInt32(result);
606441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            return OK;
607441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
608441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
609441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        case GET_PROPERTY_BYTE_ARRAY:
610441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        {
611441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
612441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            String8 name = data.readString8();
613441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            Vector<uint8_t> value;
614441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            status_t result = getPropertyByteArray(name, value);
6154c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            writeVector(reply, value);
616441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeInt32(result);
617441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            return OK;
618441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
619441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
620441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        case SET_PROPERTY_STRING:
621441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        {
622441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
623441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            String8 name = data.readString8();
624441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            String8 value = data.readString8();
625441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeInt32(setPropertyString(name, value));
626441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            return OK;
627441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
628441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
629441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        case SET_PROPERTY_BYTE_ARRAY:
630441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        {
631441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
632441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            String8 name = data.readString8();
633441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            Vector<uint8_t> value;
6344c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, value);
635441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeInt32(setPropertyByteArray(name, value));
636441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            return OK;
637441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
638441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
6394c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        case SET_CIPHER_ALGORITHM:
6404c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        {
6414c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
6424c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            Vector<uint8_t> sessionId;
6434c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, sessionId);
6444c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            String8 algorithm = data.readString8();
6454c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            reply->writeInt32(setCipherAlgorithm(sessionId, algorithm));
6464c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            return OK;
6474c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        }
6484c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
6494c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        case SET_MAC_ALGORITHM:
6504c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        {
6514c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
6524c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            Vector<uint8_t> sessionId;
6534c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, sessionId);
6544c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            String8 algorithm = data.readString8();
6554c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            reply->writeInt32(setMacAlgorithm(sessionId, algorithm));
6564c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            return OK;
6574c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        }
6584c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
6594c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        case ENCRYPT:
6604c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        {
6614c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
6624c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            Vector<uint8_t> sessionId, keyId, input, iv, output;
6634c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, sessionId);
6644c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, keyId);
6654c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, input);
6664c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, iv);
6674c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            uint32_t result = encrypt(sessionId, keyId, input, iv, output);
6684c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            writeVector(reply, output);
6694c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            reply->writeInt32(result);
6704c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            return OK;
6714c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        }
6724c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
6734c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        case DECRYPT:
6744c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        {
6754c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
6764c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            Vector<uint8_t> sessionId, keyId, input, iv, output;
6774c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, sessionId);
6784c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, keyId);
6794c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, input);
6804c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, iv);
6814c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            uint32_t result = decrypt(sessionId, keyId, input, iv, output);
6824c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            writeVector(reply, output);
6834c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            reply->writeInt32(result);
6844c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            return OK;
6854c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        }
6864c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
6874c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        case SIGN:
6884c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        {
6894c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
6904c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            Vector<uint8_t> sessionId, keyId, message, signature;
6914c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, sessionId);
6924c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, keyId);
6934c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, message);
6944c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            uint32_t result = sign(sessionId, keyId, message, signature);
6954c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            writeVector(reply, signature);
6964c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            reply->writeInt32(result);
6974c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            return OK;
6984c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        }
6994c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
7004c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        case VERIFY:
7014c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        {
7024c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
7034c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            Vector<uint8_t> sessionId, keyId, message, signature;
7044c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, sessionId);
7054c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, keyId);
7064c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, message);
7074c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, signature);
7084c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            bool match;
7094c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            uint32_t result = verify(sessionId, keyId, message, signature, match);
7104c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            reply->writeInt32(match);
7114c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            reply->writeInt32(result);
7124c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            return OK;
7134c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        }
7144c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
7154c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    default:
7164c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        return BBinder::onTransact(code, data, reply, flags);
717441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
718441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker}
719441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
720441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker}  // namespace android
721441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
722