IDrm.cpp revision 68d9d71a792deed75d32fe13febc07c9c12c8449
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,
56c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker    SET_LISTENER
57441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker};
58441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
59441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinkerstruct BpDrm : public BpInterface<IDrm> {
60441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    BpDrm(const sp<IBinder> &impl)
61441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        : BpInterface<IDrm>(impl) {
62441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
63441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
64441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    virtual status_t initCheck() const {
65441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        Parcel data, reply;
66441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
67441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        remote()->transact(INIT_CHECK, data, &reply);
68441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
69441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return reply.readInt32();
70441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
71441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
729cf69e0fc110f17c28e988ed0f9bf91abfaf710dJeff Tinker    virtual bool isCryptoSchemeSupported(const uint8_t uuid[16], const String8 &mimeType) {
73441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        Parcel data, reply;
74441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
75441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.write(uuid, 16);
769cf69e0fc110f17c28e988ed0f9bf91abfaf710dJeff Tinker        data.writeString8(mimeType);
77441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        remote()->transact(IS_CRYPTO_SUPPORTED, data, &reply);
78441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
79441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return reply.readInt32() != 0;
80441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
81441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
82441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    virtual status_t createPlugin(const uint8_t uuid[16]) {
83441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        Parcel data, reply;
84441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
85441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.write(uuid, 16);
86441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
87441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        remote()->transact(CREATE_PLUGIN, data, &reply);
88441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
89441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return reply.readInt32();
90441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
91441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
92441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    virtual status_t destroyPlugin() {
93441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        Parcel data, reply;
94441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
95441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        remote()->transact(DESTROY_PLUGIN, data, &reply);
96441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
97441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return reply.readInt32();
98441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
99441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
100441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    virtual status_t openSession(Vector<uint8_t> &sessionId) {
101441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        Parcel data, reply;
102441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
103441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
104441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        remote()->transact(OPEN_SESSION, data, &reply);
1054c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        readVector(reply, sessionId);
106441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
107441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return reply.readInt32();
108441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
109441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
110441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    virtual status_t closeSession(Vector<uint8_t> const &sessionId) {
111441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        Parcel data, reply;
112441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
113441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
1144c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, sessionId);
115441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        remote()->transact(CLOSE_SESSION, data, &reply);
116441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
117441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return reply.readInt32();
118441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
119441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
120441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    virtual status_t
1214c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        getKeyRequest(Vector<uint8_t> const &sessionId,
1224c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                      Vector<uint8_t> const &initData,
1234c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                      String8 const &mimeType, DrmPlugin::KeyType keyType,
1244c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                      KeyedVector<String8, String8> const &optionalParameters,
1254c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                      Vector<uint8_t> &request, String8 &defaultUrl) {
126441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        Parcel data, reply;
127441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
128441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
1294c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, sessionId);
1304c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, initData);
131441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeString8(mimeType);
1324c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        data.writeInt32((uint32_t)keyType);
133441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
134441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInt32(optionalParameters.size());
135441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        for (size_t i = 0; i < optionalParameters.size(); ++i) {
136441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            data.writeString8(optionalParameters.keyAt(i));
137441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            data.writeString8(optionalParameters.valueAt(i));
138441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
1394c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        remote()->transact(GET_KEY_REQUEST, data, &reply);
140441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
1414c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        readVector(reply, request);
142441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        defaultUrl = reply.readString8();
143441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
144441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return reply.readInt32();
145441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
146441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
1474c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    virtual status_t provideKeyResponse(Vector<uint8_t> const &sessionId,
1484c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                                        Vector<uint8_t> const &response,
1494c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                                        Vector<uint8_t> &keySetId) {
1504c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        Parcel data, reply;
1514c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
1524c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, sessionId);
1534c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, response);
1544c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        remote()->transact(PROVIDE_KEY_RESPONSE, data, &reply);
1554c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        readVector(reply, keySetId);
1564c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
1574c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        return reply.readInt32();
1584c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    }
1594c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
1604c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    virtual status_t removeKeys(Vector<uint8_t> const &keySetId) {
161441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        Parcel data, reply;
162441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
163441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
1644c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, keySetId);
1654c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        remote()->transact(REMOVE_KEYS, data, &reply);
166441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
167441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return reply.readInt32();
168441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
169441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
1704c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    virtual status_t restoreKeys(Vector<uint8_t> const &sessionId,
1714c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                                 Vector<uint8_t> const &keySetId) {
172441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        Parcel data, reply;
173441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
174441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
1754c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, sessionId);
1764c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, keySetId);
1774c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        remote()->transact(RESTORE_KEYS, data, &reply);
178441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
179441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return reply.readInt32();
180441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
181441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
1824c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    virtual status_t queryKeyStatus(Vector<uint8_t> const &sessionId,
183441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker                                        KeyedVector<String8, String8> &infoMap) const {
184441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        Parcel data, reply;
185441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
186441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
1874c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, sessionId);
1884c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        remote()->transact(QUERY_KEY_STATUS, data, &reply);
189441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
190441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        infoMap.clear();
191441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        size_t count = reply.readInt32();
192441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        for (size_t i = 0; i < count; i++) {
193441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            String8 key = reply.readString8();
194441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            String8 value = reply.readString8();
195441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            infoMap.add(key, value);
196441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
197441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return reply.readInt32();
198441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
199441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
20068d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker    virtual status_t getProvisionRequest(String8 const &certType,
20168d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker                                         String8 const &certAuthority,
20268d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker                                         Vector<uint8_t> &request,
203441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker                                         String8 &defaultUrl) {
204441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        Parcel data, reply;
205441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
206441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
20768d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker        data.writeString8(certType);
20868d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker        data.writeString8(certAuthority);
209441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        remote()->transact(GET_PROVISION_REQUEST, data, &reply);
210441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
2114c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        readVector(reply, request);
212441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        defaultUrl = reply.readString8();
213441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
214441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return reply.readInt32();
215441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
216441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
21768d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker    virtual status_t provideProvisionResponse(Vector<uint8_t> const &response,
21868d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker                                              Vector<uint8_t> &certificate,
21968d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker                                              Vector<uint8_t> &wrappedKey) {
220441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        Parcel data, reply;
221441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
222441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
2234c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, response);
224441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        remote()->transact(PROVIDE_PROVISION_RESPONSE, data, &reply);
225441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
22668d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker        readVector(reply, certificate);
22768d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker        readVector(reply, wrappedKey);
22868d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker
229441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return reply.readInt32();
230441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
231441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
232441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    virtual status_t getSecureStops(List<Vector<uint8_t> > &secureStops) {
233441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        Parcel data, reply;
234441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
235441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
236441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        remote()->transact(GET_SECURE_STOPS, data, &reply);
237441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
238441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        secureStops.clear();
239441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        uint32_t count = reply.readInt32();
240441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        for (size_t i = 0; i < count; i++) {
241441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            Vector<uint8_t> secureStop;
2424c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(reply, secureStop);
243441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            secureStops.push_back(secureStop);
244441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
245441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return reply.readInt32();
246441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
247441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
248441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    virtual status_t releaseSecureStops(Vector<uint8_t> const &ssRelease) {
249441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        Parcel data, reply;
250441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
251441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
2524c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, ssRelease);
253441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        remote()->transact(RELEASE_SECURE_STOPS, data, &reply);
254441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
255441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return reply.readInt32();
256441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
257441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
258441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    virtual status_t getPropertyString(String8 const &name, String8 &value) const {
259441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        Parcel data, reply;
260441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
261441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
262441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeString8(name);
263441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        remote()->transact(GET_PROPERTY_STRING, data, &reply);
264441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
265441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        value = reply.readString8();
266441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return reply.readInt32();
267441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
268441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
269441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    virtual status_t getPropertyByteArray(String8 const &name, Vector<uint8_t> &value) const {
270441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        Parcel data, reply;
271441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
272441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
273441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeString8(name);
274441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        remote()->transact(GET_PROPERTY_BYTE_ARRAY, data, &reply);
275441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
2764c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        readVector(reply, value);
277441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return reply.readInt32();
278441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
279441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
280441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    virtual status_t setPropertyString(String8 const &name, String8 const &value) const {
281441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        Parcel data, reply;
282441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
283441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
284441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeString8(name);
285441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeString8(value);
286441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        remote()->transact(SET_PROPERTY_STRING, data, &reply);
287441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
288441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return reply.readInt32();
289441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
290441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
291441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    virtual status_t setPropertyByteArray(String8 const &name,
292441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker                                          Vector<uint8_t> const &value) const {
293441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        Parcel data, reply;
294441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
295441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
296441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeString8(name);
2974c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, value);
298441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        remote()->transact(SET_PROPERTY_BYTE_ARRAY, data, &reply);
299441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
300441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return reply.readInt32();
301441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
302441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
303441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
3044c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    virtual status_t setCipherAlgorithm(Vector<uint8_t> const &sessionId,
3054c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                                        String8 const &algorithm) {
3064c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        Parcel data, reply;
3074c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
3084c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
3094c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, sessionId);
3104c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        data.writeString8(algorithm);
3114c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        remote()->transact(SET_CIPHER_ALGORITHM, data, &reply);
3124c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        return reply.readInt32();
3134c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    }
3144c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
3154c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    virtual status_t setMacAlgorithm(Vector<uint8_t> const &sessionId,
3164c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                                     String8 const &algorithm) {
3174c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        Parcel data, reply;
3184c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
3194c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
3204c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, sessionId);
3214c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        data.writeString8(algorithm);
3224c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        remote()->transact(SET_MAC_ALGORITHM, data, &reply);
3234c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        return reply.readInt32();
3244c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    }
3254c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
3264c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    virtual status_t encrypt(Vector<uint8_t> const &sessionId,
3274c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                             Vector<uint8_t> const &keyId,
3284c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                             Vector<uint8_t> const &input,
3294c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                             Vector<uint8_t> const &iv,
3304c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                             Vector<uint8_t> &output) {
3314c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        Parcel data, reply;
3324c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
3334c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
3344c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, sessionId);
3354c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, keyId);
3364c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, input);
3374c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, iv);
3384c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
3394c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        remote()->transact(ENCRYPT, data, &reply);
3404c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        readVector(reply, output);
3414c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
3424c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        return reply.readInt32();
3434c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    }
3444c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
3454c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    virtual status_t decrypt(Vector<uint8_t> const &sessionId,
3464c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                             Vector<uint8_t> const &keyId,
3474c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                             Vector<uint8_t> const &input,
3484c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                             Vector<uint8_t> const &iv,
3494c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                             Vector<uint8_t> &output) {
3504c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        Parcel data, reply;
3514c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
3524c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
3534c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, sessionId);
3544c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, keyId);
3554c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, input);
3564c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, iv);
3574c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
3584c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        remote()->transact(DECRYPT, data, &reply);
3594c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        readVector(reply, output);
3604c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
3614c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        return reply.readInt32();
3624c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    }
3634c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
3644c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    virtual status_t sign(Vector<uint8_t> const &sessionId,
3654c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                          Vector<uint8_t> const &keyId,
3664c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                          Vector<uint8_t> const &message,
3674c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                          Vector<uint8_t> &signature) {
3684c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        Parcel data, reply;
3694c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
3704c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
3714c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, sessionId);
3724c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, keyId);
3734c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, message);
3744c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
3754c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        remote()->transact(SIGN, data, &reply);
3764c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        readVector(reply, signature);
3774c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
3784c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        return reply.readInt32();
3794c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    }
3804c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
3814c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    virtual status_t verify(Vector<uint8_t> const &sessionId,
3824c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                            Vector<uint8_t> const &keyId,
3834c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                            Vector<uint8_t> const &message,
3844c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                            Vector<uint8_t> const &signature,
3854c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                            bool &match) {
3864c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        Parcel data, reply;
3874c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
3884c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
3894c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, sessionId);
3904c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, keyId);
3914c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, message);
3924c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, signature);
3934c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
3944c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        remote()->transact(VERIFY, data, &reply);
3954c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        match = (bool)reply.readInt32();
3964c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        return reply.readInt32();
3974c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    }
3984c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
39968d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker    virtual status_t signRSA(Vector<uint8_t> const &sessionId,
40068d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker                             String8 const &algorithm,
40168d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker                             Vector<uint8_t> const &message,
40268d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker                             Vector<uint8_t> const &wrappedKey,
40368d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker                             Vector<uint8_t> &signature) {
40468d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker        Parcel data, reply;
40568d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
40668d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker
40768d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker        writeVector(data, sessionId);
40868d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker        data.writeString8(algorithm);
40968d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker        writeVector(data, message);
41068d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker        writeVector(data, wrappedKey);
41168d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker
41268d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker        remote()->transact(SIGN_RSA, data, &reply);
41368d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker        readVector(reply, signature);
41468d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker
41568d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker        return reply.readInt32();
41668d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker    }
41768d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker
418c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker    virtual status_t setListener(const sp<IDrmClient>& listener) {
419c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker        Parcel data, reply;
420c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
421c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker        data.writeStrongBinder(listener->asBinder());
422c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker        remote()->transact(SET_LISTENER, data, &reply);
423c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker        return reply.readInt32();
424c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker    }
425c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker
426441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinkerprivate:
4274c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    void readVector(Parcel &reply, Vector<uint8_t> &vector) const {
4284c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        uint32_t size = reply.readInt32();
4294c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        vector.insertAt((size_t)0, size);
4304c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        reply.read(vector.editArray(), size);
4314c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    }
4324c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
4334c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    void writeVector(Parcel &data, Vector<uint8_t> const &vector) const {
4344c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        data.writeInt32(vector.size());
4354c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        data.write(vector.array(), vector.size());
4364c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    }
4374c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
438441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    DISALLOW_EVIL_CONSTRUCTORS(BpDrm);
439441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker};
440441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
441441a78d5e224e0d67f9b52fa9adc795c6944159bJeff TinkerIMPLEMENT_META_INTERFACE(Drm, "android.drm.IDrm");
442441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
443441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker////////////////////////////////////////////////////////////////////////////////
444441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
4454c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinkervoid BnDrm::readVector(const Parcel &data, Vector<uint8_t> &vector) const {
4464c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    uint32_t size = data.readInt32();
4474c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    vector.insertAt((size_t)0, size);
4484c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    data.read(vector.editArray(), size);
4494c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker}
4504c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
4514c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinkervoid BnDrm::writeVector(Parcel *reply, Vector<uint8_t> const &vector) const {
4524c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    reply->writeInt32(vector.size());
4534c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    reply->write(vector.array(), vector.size());
4544c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker}
4554c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
456441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinkerstatus_t BnDrm::onTransact(
457441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) {
458441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    switch (code) {
459441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        case INIT_CHECK:
460441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        {
461441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
462441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeInt32(initCheck());
463441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            return OK;
464441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
465441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
466441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        case IS_CRYPTO_SUPPORTED:
467441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        {
468441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
469441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            uint8_t uuid[16];
470441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            data.read(uuid, sizeof(uuid));
4719cf69e0fc110f17c28e988ed0f9bf91abfaf710dJeff Tinker            String8 mimeType = data.readString8();
4729cf69e0fc110f17c28e988ed0f9bf91abfaf710dJeff Tinker            reply->writeInt32(isCryptoSchemeSupported(uuid, mimeType));
4739cf69e0fc110f17c28e988ed0f9bf91abfaf710dJeff Tinker
474441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            return OK;
475441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
476441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
477441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        case CREATE_PLUGIN:
478441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        {
479441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
480441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            uint8_t uuid[16];
481441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            data.read(uuid, sizeof(uuid));
482441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeInt32(createPlugin(uuid));
483441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            return OK;
484441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
485441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
486441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        case DESTROY_PLUGIN:
487441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        {
488441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
489441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeInt32(destroyPlugin());
490441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            return OK;
491441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
492441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
493441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        case OPEN_SESSION:
494441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        {
495441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
496441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            Vector<uint8_t> sessionId;
497441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            status_t result = openSession(sessionId);
4984c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            writeVector(reply, sessionId);
499441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeInt32(result);
500441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            return OK;
501441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
502441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
503441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        case CLOSE_SESSION:
504441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        {
505441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
506441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            Vector<uint8_t> sessionId;
5074c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, sessionId);
508441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeInt32(closeSession(sessionId));
509441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            return OK;
510441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
511441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
5124c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        case GET_KEY_REQUEST:
513441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        {
514441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
5154c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            Vector<uint8_t> sessionId, initData;
516441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
5174c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, sessionId);
5184c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, initData);
519441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            String8 mimeType = data.readString8();
5204c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            DrmPlugin::KeyType keyType = (DrmPlugin::KeyType)data.readInt32();
521441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
522441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            KeyedVector<String8, String8> optionalParameters;
523441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            uint32_t count = data.readInt32();
524441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            for (size_t i = 0; i < count; ++i) {
525441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker                String8 key, value;
526441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker                key = data.readString8();
527441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker                value = data.readString8();
528441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker                optionalParameters.add(key, value);
529441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            }
530441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
531441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            Vector<uint8_t> request;
532441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            String8 defaultUrl;
533441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
5344c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            status_t result = getKeyRequest(sessionId, initData,
5354c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                                            mimeType, keyType,
5364c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                                            optionalParameters,
5374c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                                            request, defaultUrl);
5384c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            writeVector(reply, request);
539441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeString8(defaultUrl);
540441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeInt32(result);
541441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            return OK;
542441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
543441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
5444c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        case PROVIDE_KEY_RESPONSE:
545441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        {
546441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
5474c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            Vector<uint8_t> sessionId, response, keySetId;
5484c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, sessionId);
5494c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, response);
5504c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            uint32_t result = provideKeyResponse(sessionId, response, keySetId);
5514c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            writeVector(reply, keySetId);
5524c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            reply->writeInt32(result);
5534c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            return OK;
5544c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        }
555441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
5564c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        case REMOVE_KEYS:
5574c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        {
5584c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
5594c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            Vector<uint8_t> keySetId;
5604c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, keySetId);
5614c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            reply->writeInt32(removeKeys(keySetId));
562441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            return OK;
563441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
564441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
5654c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        case RESTORE_KEYS:
566441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        {
567441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
5684c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            Vector<uint8_t> sessionId, keySetId;
5694c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, sessionId);
5704c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, keySetId);
5714c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            reply->writeInt32(restoreKeys(sessionId, keySetId));
572441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            return OK;
573441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
574441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
5754c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        case QUERY_KEY_STATUS:
576441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        {
577441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
578441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            Vector<uint8_t> sessionId;
5794c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, sessionId);
580441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            KeyedVector<String8, String8> infoMap;
5814c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            status_t result = queryKeyStatus(sessionId, infoMap);
582441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            size_t count = infoMap.size();
583441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeInt32(count);
584441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            for (size_t i = 0; i < count; ++i) {
585441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker                reply->writeString8(infoMap.keyAt(i));
586441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker                reply->writeString8(infoMap.valueAt(i));
587441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            }
588441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeInt32(result);
589441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            return OK;
590441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
591441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
592441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        case GET_PROVISION_REQUEST:
593441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        {
594441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
59568d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker            String8 certType = data.readString8();
59668d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker            String8 certAuthority = data.readString8();
59768d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker
598441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            Vector<uint8_t> request;
599441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            String8 defaultUrl;
60068d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker            status_t result = getProvisionRequest(certType, certAuthority,
60168d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker                                                  request, defaultUrl);
6024c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            writeVector(reply, request);
603441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeString8(defaultUrl);
604441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeInt32(result);
605441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            return OK;
606441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
607441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
608441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        case PROVIDE_PROVISION_RESPONSE:
609441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        {
610441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
611441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            Vector<uint8_t> response;
61268d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker            Vector<uint8_t> certificate;
61368d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker            Vector<uint8_t> wrappedKey;
6144c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, response);
61568d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker            status_t result = provideProvisionResponse(response, certificate, wrappedKey);
61668d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker            writeVector(reply, certificate);
61768d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker            writeVector(reply, wrappedKey);
61868d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker            reply->writeInt32(result);
619441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            return OK;
620441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
621441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
622441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        case GET_SECURE_STOPS:
623441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        {
624441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
625441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            List<Vector<uint8_t> > secureStops;
626441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            status_t result = getSecureStops(secureStops);
627441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            size_t count = secureStops.size();
628441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeInt32(count);
629441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            List<Vector<uint8_t> >::iterator iter = secureStops.begin();
630441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            while(iter != secureStops.end()) {
631441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker                size_t size = iter->size();
632441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker                reply->writeInt32(size);
633441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker                reply->write(iter->array(), iter->size());
634423e33ce6569cb14ecf772e9670208517f7b30c4Jeff Tinker                iter++;
635441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            }
636441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeInt32(result);
637441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            return OK;
638441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
639441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
640441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        case RELEASE_SECURE_STOPS:
641441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        {
642441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
643441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            Vector<uint8_t> ssRelease;
6444c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, ssRelease);
645441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeInt32(releaseSecureStops(ssRelease));
646441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            return OK;
647441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
648441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
649441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        case GET_PROPERTY_STRING:
650441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        {
651441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
652441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            String8 name = data.readString8();
653441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            String8 value;
654441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            status_t result = getPropertyString(name, value);
655441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeString8(value);
656441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeInt32(result);
657441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            return OK;
658441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
659441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
660441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        case GET_PROPERTY_BYTE_ARRAY:
661441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        {
662441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
663441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            String8 name = data.readString8();
664441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            Vector<uint8_t> value;
665441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            status_t result = getPropertyByteArray(name, value);
6664c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            writeVector(reply, value);
667441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeInt32(result);
668441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            return OK;
669441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
670441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
671441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        case SET_PROPERTY_STRING:
672441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        {
673441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
674441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            String8 name = data.readString8();
675441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            String8 value = data.readString8();
676441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeInt32(setPropertyString(name, value));
677441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            return OK;
678441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
679441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
680441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        case SET_PROPERTY_BYTE_ARRAY:
681441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        {
682441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
683441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            String8 name = data.readString8();
684441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            Vector<uint8_t> value;
6854c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, value);
686441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeInt32(setPropertyByteArray(name, value));
687441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            return OK;
688441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
689441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
6904c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        case SET_CIPHER_ALGORITHM:
6914c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        {
6924c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
6934c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            Vector<uint8_t> sessionId;
6944c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, sessionId);
6954c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            String8 algorithm = data.readString8();
6964c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            reply->writeInt32(setCipherAlgorithm(sessionId, algorithm));
6974c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            return OK;
6984c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        }
6994c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
7004c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        case SET_MAC_ALGORITHM:
7014c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        {
7024c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
7034c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            Vector<uint8_t> sessionId;
7044c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, sessionId);
7054c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            String8 algorithm = data.readString8();
7064c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            reply->writeInt32(setMacAlgorithm(sessionId, algorithm));
7074c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            return OK;
7084c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        }
7094c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
7104c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        case ENCRYPT:
7114c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        {
7124c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
7134c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            Vector<uint8_t> sessionId, keyId, input, iv, output;
7144c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, sessionId);
7154c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, keyId);
7164c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, input);
7174c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, iv);
7184c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            uint32_t result = encrypt(sessionId, keyId, input, iv, output);
7194c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            writeVector(reply, output);
7204c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            reply->writeInt32(result);
7214c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            return OK;
7224c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        }
7234c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
7244c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        case DECRYPT:
7254c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        {
7264c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
7274c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            Vector<uint8_t> sessionId, keyId, input, iv, output;
7284c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, sessionId);
7294c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, keyId);
7304c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, input);
7314c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, iv);
7324c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            uint32_t result = decrypt(sessionId, keyId, input, iv, output);
7334c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            writeVector(reply, output);
7344c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            reply->writeInt32(result);
7354c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            return OK;
7364c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        }
7374c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
7384c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        case SIGN:
7394c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        {
7404c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
7414c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            Vector<uint8_t> sessionId, keyId, message, signature;
7424c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, sessionId);
7434c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, keyId);
7444c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, message);
7454c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            uint32_t result = sign(sessionId, keyId, message, signature);
7464c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            writeVector(reply, signature);
7474c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            reply->writeInt32(result);
7484c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            return OK;
7494c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        }
7504c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
7514c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        case VERIFY:
7524c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        {
7534c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
7544c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            Vector<uint8_t> sessionId, keyId, message, signature;
7554c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, sessionId);
7564c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, keyId);
7574c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, message);
7584c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, signature);
7594c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            bool match;
7604c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            uint32_t result = verify(sessionId, keyId, message, signature, match);
7614c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            reply->writeInt32(match);
7624c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            reply->writeInt32(result);
7634c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            return OK;
7644c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        }
7654c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
76668d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker        case SIGN_RSA:
76768d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker        {
76868d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
76968d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker            Vector<uint8_t> sessionId, message, wrappedKey, signature;
77068d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker            readVector(data, sessionId);
77168d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker            String8 algorithm = data.readString8();
77268d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker            readVector(data, message);
77368d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker            readVector(data, wrappedKey);
77468d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker            uint32_t result = signRSA(sessionId, algorithm, message, wrappedKey, signature);
77568d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker            writeVector(reply, signature);
77668d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker            reply->writeInt32(result);
77768d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker            return OK;
77868d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker        }
77968d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker
780c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker    case SET_LISTENER: {
781c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker        CHECK_INTERFACE(IDrm, data, reply);
782c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker        sp<IDrmClient> listener =
783c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker            interface_cast<IDrmClient>(data.readStrongBinder());
784c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker        reply->writeInt32(setListener(listener));
785c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker        return NO_ERROR;
786c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker    } break;
787c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker
7884c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    default:
7894c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        return BBinder::onTransact(code, data, reply, flags);
790441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
791441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker}
792441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
793441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker}  // namespace android
794441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
795