1441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker/*
2441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker * Copyright (C) 2013 The Android Open Source Project
3441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker *
4441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker * Licensed under the Apache License, Version 2.0 (the "License");
5441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker * you may not use this file except in compliance with the License.
6441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker * You may obtain a copy of the License at
7441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker *
8441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker *      http://www.apache.org/licenses/LICENSE-2.0
9441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker *
10441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker * Unless required by applicable law or agreed to in writing, software
11441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker * distributed under the License is distributed on an "AS IS" BASIS,
12441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker * See the License for the specific language governing permissions and
14441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker * limitations under the License.
15441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker */
16441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
17441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker//#define LOG_NDEBUG 0
18441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker#define LOG_TAG "IDrm"
19441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker#include <utils/Log.h>
20441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
21441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker#include <binder/Parcel.h>
22441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker#include <media/IDrm.h>
23441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker#include <media/stagefright/MediaErrors.h>
24441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker#include <media/stagefright/foundation/ADebug.h>
25441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker#include <media/stagefright/foundation/AString.h>
26441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
27441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinkernamespace android {
28441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
29441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinkerenum {
30441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    INIT_CHECK = IBinder::FIRST_CALL_TRANSACTION,
31441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    IS_CRYPTO_SUPPORTED,
32441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    CREATE_PLUGIN,
33441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    DESTROY_PLUGIN,
34441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    OPEN_SESSION,
35441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    CLOSE_SESSION,
364c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    GET_KEY_REQUEST,
374c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    PROVIDE_KEY_RESPONSE,
384c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    REMOVE_KEYS,
394c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    RESTORE_KEYS,
404c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    QUERY_KEY_STATUS,
41441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    GET_PROVISION_REQUEST,
42441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    PROVIDE_PROVISION_RESPONSE,
43441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    GET_SECURE_STOPS,
44441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    RELEASE_SECURE_STOPS,
45441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    GET_PROPERTY_STRING,
46441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    GET_PROPERTY_BYTE_ARRAY,
47441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    SET_PROPERTY_STRING,
484c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    SET_PROPERTY_BYTE_ARRAY,
494c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    SET_CIPHER_ALGORITHM,
504c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    SET_MAC_ALGORITHM,
514c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    ENCRYPT,
524c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    DECRYPT,
534c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    SIGN,
5468d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker    SIGN_RSA,
55c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker    VERIFY,
5668b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker    SET_LISTENER,
573c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker    UNPROVISION_DEVICE,
583c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker    GET_SECURE_STOP,
593c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker    RELEASE_ALL_SECURE_STOPS
60441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker};
61441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
62441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinkerstruct BpDrm : public BpInterface<IDrm> {
63441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    BpDrm(const sp<IBinder> &impl)
64441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        : BpInterface<IDrm>(impl) {
65441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
66441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
67441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    virtual status_t initCheck() const {
68441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        Parcel data, reply;
69441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
70441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        remote()->transact(INIT_CHECK, data, &reply);
71441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
72441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return reply.readInt32();
73441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
74441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
759cf69e0fc110f17c28e988ed0f9bf91abfaf710dJeff Tinker    virtual bool isCryptoSchemeSupported(const uint8_t uuid[16], const String8 &mimeType) {
76441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        Parcel data, reply;
77441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
78441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.write(uuid, 16);
799cf69e0fc110f17c28e988ed0f9bf91abfaf710dJeff Tinker        data.writeString8(mimeType);
80441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        remote()->transact(IS_CRYPTO_SUPPORTED, data, &reply);
81441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
82441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return reply.readInt32() != 0;
83441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
84441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
85441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    virtual status_t createPlugin(const uint8_t uuid[16]) {
86441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        Parcel data, reply;
87441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
88441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.write(uuid, 16);
89441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
90441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        remote()->transact(CREATE_PLUGIN, data, &reply);
91441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
92441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return reply.readInt32();
93441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
94441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
95441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    virtual status_t destroyPlugin() {
96441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        Parcel data, reply;
97441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
98441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        remote()->transact(DESTROY_PLUGIN, data, &reply);
99441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
100441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return reply.readInt32();
101441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
102441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
103441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    virtual status_t openSession(Vector<uint8_t> &sessionId) {
104441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        Parcel data, reply;
105441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
106441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
107441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        remote()->transact(OPEN_SESSION, data, &reply);
1084c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        readVector(reply, sessionId);
109441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
110441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return reply.readInt32();
111441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
112441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
113441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    virtual status_t closeSession(Vector<uint8_t> const &sessionId) {
114441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        Parcel data, reply;
115441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
116441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
1174c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, sessionId);
118441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        remote()->transact(CLOSE_SESSION, data, &reply);
119441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
120441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return reply.readInt32();
121441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
122441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
123441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    virtual status_t
1244c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        getKeyRequest(Vector<uint8_t> const &sessionId,
1254c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                      Vector<uint8_t> const &initData,
1264c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                      String8 const &mimeType, DrmPlugin::KeyType keyType,
1274c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                      KeyedVector<String8, String8> const &optionalParameters,
1284c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                      Vector<uint8_t> &request, String8 &defaultUrl) {
129441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        Parcel data, reply;
130441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
131441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
1324c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, sessionId);
1334c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, initData);
134441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeString8(mimeType);
1354c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        data.writeInt32((uint32_t)keyType);
136441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
137441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInt32(optionalParameters.size());
138441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        for (size_t i = 0; i < optionalParameters.size(); ++i) {
139441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            data.writeString8(optionalParameters.keyAt(i));
140441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            data.writeString8(optionalParameters.valueAt(i));
141441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
1424c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        remote()->transact(GET_KEY_REQUEST, data, &reply);
143441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
1444c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        readVector(reply, request);
145441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        defaultUrl = reply.readString8();
146441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
147441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return reply.readInt32();
148441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
149441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
1504c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    virtual status_t provideKeyResponse(Vector<uint8_t> const &sessionId,
1514c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                                        Vector<uint8_t> const &response,
1524c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                                        Vector<uint8_t> &keySetId) {
1534c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        Parcel data, reply;
1544c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
1554c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, sessionId);
1564c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, response);
1574c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        remote()->transact(PROVIDE_KEY_RESPONSE, data, &reply);
1584c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        readVector(reply, keySetId);
1594c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
1604c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        return reply.readInt32();
1614c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    }
1624c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
1634c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    virtual status_t removeKeys(Vector<uint8_t> const &keySetId) {
164441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        Parcel data, reply;
165441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
166441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
1674c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, keySetId);
1684c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        remote()->transact(REMOVE_KEYS, data, &reply);
169441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
170441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return reply.readInt32();
171441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
172441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
1734c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    virtual status_t restoreKeys(Vector<uint8_t> const &sessionId,
1744c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                                 Vector<uint8_t> const &keySetId) {
175441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        Parcel data, reply;
176441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
177441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
1784c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, sessionId);
1794c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, keySetId);
1804c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        remote()->transact(RESTORE_KEYS, data, &reply);
181441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
182441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return reply.readInt32();
183441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
184441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
1854c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    virtual status_t queryKeyStatus(Vector<uint8_t> const &sessionId,
186441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker                                        KeyedVector<String8, String8> &infoMap) const {
187441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        Parcel data, reply;
188441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
189441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
1904c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, sessionId);
1914c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        remote()->transact(QUERY_KEY_STATUS, data, &reply);
192441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
193441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        infoMap.clear();
194441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        size_t count = reply.readInt32();
195441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        for (size_t i = 0; i < count; i++) {
196441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            String8 key = reply.readString8();
197441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            String8 value = reply.readString8();
198441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            infoMap.add(key, value);
199441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
200441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return reply.readInt32();
201441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
202441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
20368d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker    virtual status_t getProvisionRequest(String8 const &certType,
20468d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker                                         String8 const &certAuthority,
20568d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker                                         Vector<uint8_t> &request,
206441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker                                         String8 &defaultUrl) {
207441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        Parcel data, reply;
208441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
209441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
21068d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker        data.writeString8(certType);
21168d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker        data.writeString8(certAuthority);
212441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        remote()->transact(GET_PROVISION_REQUEST, data, &reply);
213441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
2144c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        readVector(reply, request);
215441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        defaultUrl = reply.readString8();
216441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
217441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return reply.readInt32();
218441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
219441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
22068d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker    virtual status_t provideProvisionResponse(Vector<uint8_t> const &response,
22168d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker                                              Vector<uint8_t> &certificate,
22268d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker                                              Vector<uint8_t> &wrappedKey) {
223441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        Parcel data, reply;
224441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
225441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
2264c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, response);
227441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        remote()->transact(PROVIDE_PROVISION_RESPONSE, data, &reply);
228441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
22968d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker        readVector(reply, certificate);
23068d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker        readVector(reply, wrappedKey);
23168d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker
232441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return reply.readInt32();
233441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
234441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
23568b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker    virtual status_t unprovisionDevice() {
23668b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker        Parcel data, reply;
23768b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
23868b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker
23968b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker        remote()->transact(UNPROVISION_DEVICE, data, &reply);
24068b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker
24168b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker        return reply.readInt32();
24268b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker    }
24368b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker
244441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    virtual status_t getSecureStops(List<Vector<uint8_t> > &secureStops) {
245441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        Parcel data, reply;
246441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
247441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
248441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        remote()->transact(GET_SECURE_STOPS, data, &reply);
249441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
250441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        secureStops.clear();
251441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        uint32_t count = reply.readInt32();
252441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        for (size_t i = 0; i < count; i++) {
253441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            Vector<uint8_t> secureStop;
2544c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(reply, secureStop);
255441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            secureStops.push_back(secureStop);
256441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
257441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return reply.readInt32();
258441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
259441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
2603c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker    virtual status_t getSecureStop(Vector<uint8_t> const &ssid, Vector<uint8_t> &secureStop) {
2613c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker        Parcel data, reply;
2623c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
2633c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker
2643c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker        writeVector(data, ssid);
2653c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker        remote()->transact(GET_SECURE_STOP, data, &reply);
2663c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker
2673c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker        readVector(reply, secureStop);
2683c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker        return reply.readInt32();
2693c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker    }
2703c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker
271441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    virtual status_t releaseSecureStops(Vector<uint8_t> const &ssRelease) {
272441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        Parcel data, reply;
273441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
274441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
2754c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, ssRelease);
276441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        remote()->transact(RELEASE_SECURE_STOPS, data, &reply);
277441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
278441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return reply.readInt32();
279441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
280441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
2813c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker    virtual status_t releaseAllSecureStops() {
2823c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker        Parcel data, reply;
2833c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
2843c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker
2853c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker        remote()->transact(RELEASE_ALL_SECURE_STOPS, data, &reply);
2863c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker
2873c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker        return reply.readInt32();
2883c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker    }
2893c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker
290441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    virtual status_t getPropertyString(String8 const &name, String8 &value) const {
291441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        Parcel data, reply;
292441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
293441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
294441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeString8(name);
295441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        remote()->transact(GET_PROPERTY_STRING, data, &reply);
296441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
297441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        value = reply.readString8();
298441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return reply.readInt32();
299441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
300441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
301441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    virtual status_t getPropertyByteArray(String8 const &name, Vector<uint8_t> &value) const {
302441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        Parcel data, reply;
303441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
304441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
305441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeString8(name);
306441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        remote()->transact(GET_PROPERTY_BYTE_ARRAY, data, &reply);
307441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
3084c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        readVector(reply, value);
309441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return reply.readInt32();
310441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
311441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
312441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    virtual status_t setPropertyString(String8 const &name, String8 const &value) const {
313441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        Parcel data, reply;
314441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
315441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
316441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeString8(name);
317441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeString8(value);
318441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        remote()->transact(SET_PROPERTY_STRING, data, &reply);
319441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
320441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return reply.readInt32();
321441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
322441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
323441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    virtual status_t setPropertyByteArray(String8 const &name,
324441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker                                          Vector<uint8_t> const &value) const {
325441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        Parcel data, reply;
326441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
327441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
328441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeString8(name);
3294c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, value);
330441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        remote()->transact(SET_PROPERTY_BYTE_ARRAY, data, &reply);
331441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
332441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return reply.readInt32();
333441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
334441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
335441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
3364c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    virtual status_t setCipherAlgorithm(Vector<uint8_t> const &sessionId,
3374c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                                        String8 const &algorithm) {
3384c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        Parcel data, reply;
3394c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
3404c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
3414c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, sessionId);
3424c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        data.writeString8(algorithm);
3434c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        remote()->transact(SET_CIPHER_ALGORITHM, data, &reply);
3444c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        return reply.readInt32();
3454c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    }
3464c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
3474c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    virtual status_t setMacAlgorithm(Vector<uint8_t> const &sessionId,
3484c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                                     String8 const &algorithm) {
3494c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        Parcel data, reply;
3504c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
3514c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
3524c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, sessionId);
3534c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        data.writeString8(algorithm);
3544c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        remote()->transact(SET_MAC_ALGORITHM, data, &reply);
3554c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        return reply.readInt32();
3564c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    }
3574c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
3584c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    virtual status_t encrypt(Vector<uint8_t> const &sessionId,
3594c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                             Vector<uint8_t> const &keyId,
3604c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                             Vector<uint8_t> const &input,
3614c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                             Vector<uint8_t> const &iv,
3624c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                             Vector<uint8_t> &output) {
3634c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        Parcel data, reply;
3644c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
3654c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
3664c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, sessionId);
3674c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, keyId);
3684c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, input);
3694c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, iv);
3704c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
3714c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        remote()->transact(ENCRYPT, data, &reply);
3724c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        readVector(reply, output);
3734c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
3744c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        return reply.readInt32();
3754c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    }
3764c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
3774c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    virtual status_t decrypt(Vector<uint8_t> const &sessionId,
3784c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                             Vector<uint8_t> const &keyId,
3794c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                             Vector<uint8_t> const &input,
3804c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                             Vector<uint8_t> const &iv,
3814c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                             Vector<uint8_t> &output) {
3824c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        Parcel data, reply;
3834c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
3844c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
3854c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, sessionId);
3864c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, keyId);
3874c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, input);
3884c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, iv);
3894c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
3904c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        remote()->transact(DECRYPT, data, &reply);
3914c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        readVector(reply, output);
3924c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
3934c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        return reply.readInt32();
3944c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    }
3954c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
3964c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    virtual status_t sign(Vector<uint8_t> const &sessionId,
3974c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                          Vector<uint8_t> const &keyId,
3984c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                          Vector<uint8_t> const &message,
3994c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                          Vector<uint8_t> &signature) {
4004c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        Parcel data, reply;
4014c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
4024c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
4034c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, sessionId);
4044c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, keyId);
4054c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, message);
4064c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
4074c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        remote()->transact(SIGN, data, &reply);
4084c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        readVector(reply, signature);
4094c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
4104c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        return reply.readInt32();
4114c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    }
4124c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
4134c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    virtual status_t verify(Vector<uint8_t> const &sessionId,
4144c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                            Vector<uint8_t> const &keyId,
4154c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                            Vector<uint8_t> const &message,
4164c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                            Vector<uint8_t> const &signature,
4174c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                            bool &match) {
4184c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        Parcel data, reply;
4194c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
4204c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
4214c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, sessionId);
4224c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, keyId);
4234c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, message);
4244c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, signature);
4254c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
4264c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        remote()->transact(VERIFY, data, &reply);
4274c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        match = (bool)reply.readInt32();
4284c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        return reply.readInt32();
4294c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    }
4304c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
43168d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker    virtual status_t signRSA(Vector<uint8_t> const &sessionId,
43268d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker                             String8 const &algorithm,
43368d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker                             Vector<uint8_t> const &message,
43468d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker                             Vector<uint8_t> const &wrappedKey,
43568d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker                             Vector<uint8_t> &signature) {
43668d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker        Parcel data, reply;
43768d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
43868d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker
43968d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker        writeVector(data, sessionId);
44068d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker        data.writeString8(algorithm);
44168d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker        writeVector(data, message);
44268d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker        writeVector(data, wrappedKey);
44368d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker
44468d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker        remote()->transact(SIGN_RSA, data, &reply);
44568d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker        readVector(reply, signature);
44668d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker
44768d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker        return reply.readInt32();
44868d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker    }
44968d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker
450c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker    virtual status_t setListener(const sp<IDrmClient>& listener) {
451c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker        Parcel data, reply;
452c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
453c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker        data.writeStrongBinder(listener->asBinder());
454c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker        remote()->transact(SET_LISTENER, data, &reply);
455c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker        return reply.readInt32();
456c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker    }
457c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker
458441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinkerprivate:
4594c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    void readVector(Parcel &reply, Vector<uint8_t> &vector) const {
4604c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        uint32_t size = reply.readInt32();
4614c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        vector.insertAt((size_t)0, size);
4624c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        reply.read(vector.editArray(), size);
4634c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    }
4644c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
4654c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    void writeVector(Parcel &data, Vector<uint8_t> const &vector) const {
4664c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        data.writeInt32(vector.size());
4674c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        data.write(vector.array(), vector.size());
4684c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    }
4694c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
470441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    DISALLOW_EVIL_CONSTRUCTORS(BpDrm);
471441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker};
472441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
473441a78d5e224e0d67f9b52fa9adc795c6944159bJeff TinkerIMPLEMENT_META_INTERFACE(Drm, "android.drm.IDrm");
474441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
475441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker////////////////////////////////////////////////////////////////////////////////
476441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
4774c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinkervoid BnDrm::readVector(const Parcel &data, Vector<uint8_t> &vector) const {
4784c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    uint32_t size = data.readInt32();
4794c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    vector.insertAt((size_t)0, size);
4804c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    data.read(vector.editArray(), size);
4814c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker}
4824c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
4834c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinkervoid BnDrm::writeVector(Parcel *reply, Vector<uint8_t> const &vector) const {
4844c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    reply->writeInt32(vector.size());
4854c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    reply->write(vector.array(), vector.size());
4864c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker}
4874c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
488441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinkerstatus_t BnDrm::onTransact(
489441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) {
490441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    switch (code) {
491441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        case INIT_CHECK:
492441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        {
493441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
494441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeInt32(initCheck());
495441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            return OK;
496441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
497441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
498441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        case IS_CRYPTO_SUPPORTED:
499441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        {
500441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
501441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            uint8_t uuid[16];
502441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            data.read(uuid, sizeof(uuid));
5039cf69e0fc110f17c28e988ed0f9bf91abfaf710dJeff Tinker            String8 mimeType = data.readString8();
5049cf69e0fc110f17c28e988ed0f9bf91abfaf710dJeff Tinker            reply->writeInt32(isCryptoSchemeSupported(uuid, mimeType));
5059cf69e0fc110f17c28e988ed0f9bf91abfaf710dJeff Tinker
506441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            return OK;
507441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
508441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
509441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        case CREATE_PLUGIN:
510441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        {
511441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
512441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            uint8_t uuid[16];
513441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            data.read(uuid, sizeof(uuid));
514441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeInt32(createPlugin(uuid));
515441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            return OK;
516441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
517441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
518441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        case DESTROY_PLUGIN:
519441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        {
520441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
521441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeInt32(destroyPlugin());
522441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            return OK;
523441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
524441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
525441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        case OPEN_SESSION:
526441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        {
527441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
528441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            Vector<uint8_t> sessionId;
529441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            status_t result = openSession(sessionId);
5304c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            writeVector(reply, sessionId);
531441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeInt32(result);
532441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            return OK;
533441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
534441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
535441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        case CLOSE_SESSION:
536441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        {
537441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
538441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            Vector<uint8_t> sessionId;
5394c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, sessionId);
540441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeInt32(closeSession(sessionId));
541441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            return OK;
542441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
543441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
5444c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        case GET_KEY_REQUEST:
545441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        {
546441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
5474c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            Vector<uint8_t> sessionId, initData;
548441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
5494c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, sessionId);
5504c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, initData);
551441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            String8 mimeType = data.readString8();
5524c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            DrmPlugin::KeyType keyType = (DrmPlugin::KeyType)data.readInt32();
553441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
554441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            KeyedVector<String8, String8> optionalParameters;
555441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            uint32_t count = data.readInt32();
556441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            for (size_t i = 0; i < count; ++i) {
557441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker                String8 key, value;
558441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker                key = data.readString8();
559441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker                value = data.readString8();
560441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker                optionalParameters.add(key, value);
561441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            }
562441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
563441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            Vector<uint8_t> request;
564441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            String8 defaultUrl;
565441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
5664c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            status_t result = getKeyRequest(sessionId, initData,
5674c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                                            mimeType, keyType,
5684c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                                            optionalParameters,
5694c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                                            request, defaultUrl);
5704c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            writeVector(reply, request);
571441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeString8(defaultUrl);
572441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeInt32(result);
573441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            return OK;
574441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
575441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
5764c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        case PROVIDE_KEY_RESPONSE:
577441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        {
578441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
5794c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            Vector<uint8_t> sessionId, response, keySetId;
5804c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, sessionId);
5814c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, response);
5824c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            uint32_t result = provideKeyResponse(sessionId, response, keySetId);
5834c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            writeVector(reply, keySetId);
5844c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            reply->writeInt32(result);
5854c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            return OK;
5864c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        }
587441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
5884c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        case REMOVE_KEYS:
5894c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        {
5904c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
5914c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            Vector<uint8_t> keySetId;
5924c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, keySetId);
5934c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            reply->writeInt32(removeKeys(keySetId));
594441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            return OK;
595441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
596441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
5974c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        case RESTORE_KEYS:
598441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        {
599441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
6004c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            Vector<uint8_t> sessionId, keySetId;
6014c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, sessionId);
6024c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, keySetId);
6034c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            reply->writeInt32(restoreKeys(sessionId, keySetId));
604441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            return OK;
605441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
606441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
6074c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        case QUERY_KEY_STATUS:
608441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        {
609441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
610441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            Vector<uint8_t> sessionId;
6114c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, sessionId);
612441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            KeyedVector<String8, String8> infoMap;
6134c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            status_t result = queryKeyStatus(sessionId, infoMap);
614441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            size_t count = infoMap.size();
615441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeInt32(count);
616441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            for (size_t i = 0; i < count; ++i) {
617441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker                reply->writeString8(infoMap.keyAt(i));
618441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker                reply->writeString8(infoMap.valueAt(i));
619441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            }
620441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeInt32(result);
621441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            return OK;
622441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
623441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
624441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        case GET_PROVISION_REQUEST:
625441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        {
626441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
62768d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker            String8 certType = data.readString8();
62868d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker            String8 certAuthority = data.readString8();
62968d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker
630441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            Vector<uint8_t> request;
631441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            String8 defaultUrl;
63268d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker            status_t result = getProvisionRequest(certType, certAuthority,
63368d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker                                                  request, defaultUrl);
6344c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            writeVector(reply, request);
635441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeString8(defaultUrl);
636441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeInt32(result);
637441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            return OK;
638441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
639441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
640441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        case PROVIDE_PROVISION_RESPONSE:
641441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        {
642441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
643441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            Vector<uint8_t> response;
64468d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker            Vector<uint8_t> certificate;
64568d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker            Vector<uint8_t> wrappedKey;
6464c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, response);
64768d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker            status_t result = provideProvisionResponse(response, certificate, wrappedKey);
64868d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker            writeVector(reply, certificate);
64968d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker            writeVector(reply, wrappedKey);
65068d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker            reply->writeInt32(result);
651441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            return OK;
652441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
653441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
65468b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker        case UNPROVISION_DEVICE:
65568b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker        {
65668b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
65768b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker            status_t result = unprovisionDevice();
65868b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker            reply->writeInt32(result);
65968b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker            return OK;
66068b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker        }
66168b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker
662441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        case GET_SECURE_STOPS:
663441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        {
664441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
665441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            List<Vector<uint8_t> > secureStops;
666441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            status_t result = getSecureStops(secureStops);
667441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            size_t count = secureStops.size();
668441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeInt32(count);
669441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            List<Vector<uint8_t> >::iterator iter = secureStops.begin();
670441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            while(iter != secureStops.end()) {
671441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker                size_t size = iter->size();
672441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker                reply->writeInt32(size);
673441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker                reply->write(iter->array(), iter->size());
674423e33ce6569cb14ecf772e9670208517f7b30c4Jeff Tinker                iter++;
675441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            }
676441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeInt32(result);
677441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            return OK;
678441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
679441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
6803c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker        case GET_SECURE_STOP:
6813c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker        {
6823c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
6833c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker            Vector<uint8_t> ssid, secureStop;
6843c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker            readVector(data, ssid);
6853c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker            status_t result = getSecureStop(ssid, secureStop);
6863c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker            writeVector(reply, secureStop);
6873c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker            reply->writeInt32(result);
6883c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker            return OK;
6893c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker        }
6903c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker
691441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        case RELEASE_SECURE_STOPS:
692441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        {
693441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
694441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            Vector<uint8_t> ssRelease;
6954c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, ssRelease);
696441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeInt32(releaseSecureStops(ssRelease));
697441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            return OK;
698441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
699441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
7003c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker        case RELEASE_ALL_SECURE_STOPS:
7013c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker        {
7023c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
7033c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker            reply->writeInt32(releaseAllSecureStops());
7043c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker            return OK;
7053c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker        }
7063c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker
707441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        case GET_PROPERTY_STRING:
708441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        {
709441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
710441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            String8 name = data.readString8();
711441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            String8 value;
712441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            status_t result = getPropertyString(name, value);
713441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeString8(value);
714441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeInt32(result);
715441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            return OK;
716441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
717441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
718441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        case GET_PROPERTY_BYTE_ARRAY:
719441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        {
720441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
721441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            String8 name = data.readString8();
722441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            Vector<uint8_t> value;
723441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            status_t result = getPropertyByteArray(name, value);
7244c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            writeVector(reply, value);
725441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeInt32(result);
726441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            return OK;
727441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
728441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
729441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        case SET_PROPERTY_STRING:
730441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        {
731441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
732441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            String8 name = data.readString8();
733441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            String8 value = data.readString8();
734441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeInt32(setPropertyString(name, value));
735441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            return OK;
736441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
737441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
738441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        case SET_PROPERTY_BYTE_ARRAY:
739441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        {
740441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
741441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            String8 name = data.readString8();
742441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            Vector<uint8_t> value;
7434c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, value);
744441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeInt32(setPropertyByteArray(name, value));
745441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            return OK;
746441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
747441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
7484c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        case SET_CIPHER_ALGORITHM:
7494c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        {
7504c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
7514c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            Vector<uint8_t> sessionId;
7524c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, sessionId);
7534c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            String8 algorithm = data.readString8();
7544c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            reply->writeInt32(setCipherAlgorithm(sessionId, algorithm));
7554c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            return OK;
7564c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        }
7574c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
7584c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        case SET_MAC_ALGORITHM:
7594c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        {
7604c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
7614c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            Vector<uint8_t> sessionId;
7624c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, sessionId);
7634c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            String8 algorithm = data.readString8();
7644c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            reply->writeInt32(setMacAlgorithm(sessionId, algorithm));
7654c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            return OK;
7664c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        }
7674c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
7684c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        case ENCRYPT:
7694c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        {
7704c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
7714c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            Vector<uint8_t> sessionId, keyId, input, iv, output;
7724c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, sessionId);
7734c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, keyId);
7744c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, input);
7754c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, iv);
7764c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            uint32_t result = encrypt(sessionId, keyId, input, iv, output);
7774c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            writeVector(reply, output);
7784c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            reply->writeInt32(result);
7794c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            return OK;
7804c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        }
7814c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
7824c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        case DECRYPT:
7834c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        {
7844c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
7854c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            Vector<uint8_t> sessionId, keyId, input, iv, output;
7864c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, sessionId);
7874c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, keyId);
7884c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, input);
7894c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, iv);
7904c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            uint32_t result = decrypt(sessionId, keyId, input, iv, output);
7914c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            writeVector(reply, output);
7924c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            reply->writeInt32(result);
7934c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            return OK;
7944c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        }
7954c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
7964c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        case SIGN:
7974c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        {
7984c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
7994c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            Vector<uint8_t> sessionId, keyId, message, signature;
8004c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, sessionId);
8014c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, keyId);
8024c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, message);
8034c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            uint32_t result = sign(sessionId, keyId, message, signature);
8044c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            writeVector(reply, signature);
8054c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            reply->writeInt32(result);
8064c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            return OK;
8074c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        }
8084c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
8094c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        case VERIFY:
8104c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        {
8114c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
8124c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            Vector<uint8_t> sessionId, keyId, message, signature;
8134c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, sessionId);
8144c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, keyId);
8154c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, message);
8164c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, signature);
8174c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            bool match;
8184c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            uint32_t result = verify(sessionId, keyId, message, signature, match);
8194c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            reply->writeInt32(match);
8204c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            reply->writeInt32(result);
8214c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            return OK;
8224c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        }
8234c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
82468d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker        case SIGN_RSA:
82568d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker        {
82668d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
82768d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker            Vector<uint8_t> sessionId, message, wrappedKey, signature;
82868d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker            readVector(data, sessionId);
82968d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker            String8 algorithm = data.readString8();
83068d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker            readVector(data, message);
83168d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker            readVector(data, wrappedKey);
83268d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker            uint32_t result = signRSA(sessionId, algorithm, message, wrappedKey, signature);
83368d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker            writeVector(reply, signature);
83468d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker            reply->writeInt32(result);
83568d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker            return OK;
83668d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker        }
83768d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker
838c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker    case SET_LISTENER: {
839c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker        CHECK_INTERFACE(IDrm, data, reply);
840c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker        sp<IDrmClient> listener =
841c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker            interface_cast<IDrmClient>(data.readStrongBinder());
842c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker        reply->writeInt32(setListener(listener));
843c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker        return NO_ERROR;
844c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker    } break;
845c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker
8464c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    default:
8474c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        return BBinder::onTransact(code, data, reply, flags);
848441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
849441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker}
850441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
851441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker}  // namespace android
852