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());
703b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        status_t status = remote()->transact(INIT_CHECK, data, &reply);
713b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        if (status != OK) {
723b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker            return status;
733b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        }
74441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
75441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return reply.readInt32();
76441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
77441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
789cf69e0fc110f17c28e988ed0f9bf91abfaf710dJeff Tinker    virtual bool isCryptoSchemeSupported(const uint8_t uuid[16], const String8 &mimeType) {
79441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        Parcel data, reply;
80441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
81441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.write(uuid, 16);
829cf69e0fc110f17c28e988ed0f9bf91abfaf710dJeff Tinker        data.writeString8(mimeType);
833b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        status_t status = remote()->transact(IS_CRYPTO_SUPPORTED, data, &reply);
843b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        if (status != OK) {
853b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker            ALOGE("isCryptoSchemeSupported: binder call failed: %d", status);
863b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker            return false;
873b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        }
88441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
89441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return reply.readInt32() != 0;
90441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
91441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
92441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    virtual status_t createPlugin(const uint8_t uuid[16]) {
93441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        Parcel data, reply;
94441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
95441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.write(uuid, 16);
96441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
973b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        status_t status = remote()->transact(CREATE_PLUGIN, data, &reply);
983b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        if (status != OK) {
993b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker            return status;
1003b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        }
101441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
102441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return reply.readInt32();
103441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
104441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
105441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    virtual status_t destroyPlugin() {
106441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        Parcel data, reply;
107441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
1083b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        status_t status = remote()->transact(DESTROY_PLUGIN, data, &reply);
1093b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        if (status != OK) {
1103b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker            return status;
1113b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        }
112441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
113441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return reply.readInt32();
114441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
115441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
116441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    virtual status_t openSession(Vector<uint8_t> &sessionId) {
117441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        Parcel data, reply;
118441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
119441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
1203b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        status_t status = remote()->transact(OPEN_SESSION, data, &reply);
1213b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        if (status != OK) {
1223b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker            return status;
1233b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        }
1244c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        readVector(reply, sessionId);
125441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
126441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return reply.readInt32();
127441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
128441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
129441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    virtual status_t closeSession(Vector<uint8_t> const &sessionId) {
130441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        Parcel data, reply;
131441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
132441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
1334c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, sessionId);
1343b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        status_t status = remote()->transact(CLOSE_SESSION, data, &reply);
1353b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        if (status != OK) {
1363b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker            return status;
1373b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        }
138441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
139441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return reply.readInt32();
140441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
141441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
142441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    virtual status_t
1434c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        getKeyRequest(Vector<uint8_t> const &sessionId,
1444c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                      Vector<uint8_t> const &initData,
1454c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                      String8 const &mimeType, DrmPlugin::KeyType keyType,
1464c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                      KeyedVector<String8, String8> const &optionalParameters,
147d072c909d87f8150433860f6de4c11df6e09e2f9Jeff Tinker                      Vector<uint8_t> &request, String8 &defaultUrl,
148d072c909d87f8150433860f6de4c11df6e09e2f9Jeff Tinker                      DrmPlugin::KeyRequestType *keyRequestType) {
149441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        Parcel data, reply;
150441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
151441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
1524c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, sessionId);
1534c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, initData);
154441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeString8(mimeType);
1554c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        data.writeInt32((uint32_t)keyType);
156441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
157441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInt32(optionalParameters.size());
158441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        for (size_t i = 0; i < optionalParameters.size(); ++i) {
159441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            data.writeString8(optionalParameters.keyAt(i));
160441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            data.writeString8(optionalParameters.valueAt(i));
161441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
1623b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker
1633b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        status_t status = remote()->transact(GET_KEY_REQUEST, data, &reply);
1643b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        if (status != OK) {
1653b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker            return status;
1663b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        }
167441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
1684c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        readVector(reply, request);
169441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        defaultUrl = reply.readString8();
170d072c909d87f8150433860f6de4c11df6e09e2f9Jeff Tinker        *keyRequestType = static_cast<DrmPlugin::KeyRequestType>(reply.readInt32());
171441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
172441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return reply.readInt32();
173441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
174441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
1754c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    virtual status_t provideKeyResponse(Vector<uint8_t> const &sessionId,
1764c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                                        Vector<uint8_t> const &response,
1774c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                                        Vector<uint8_t> &keySetId) {
1784c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        Parcel data, reply;
1794c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
1804c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, sessionId);
1814c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, response);
1823b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker
1833b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        status_t status = remote()->transact(PROVIDE_KEY_RESPONSE, data, &reply);
1843b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        if (status != OK) {
1853b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker            return status;
1863b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        }
1873b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker
1884c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        readVector(reply, keySetId);
1894c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
1904c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        return reply.readInt32();
1914c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    }
1924c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
1934c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    virtual status_t removeKeys(Vector<uint8_t> const &keySetId) {
194441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        Parcel data, reply;
195441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
196441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
1974c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, keySetId);
1983b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        status_t status = remote()->transact(REMOVE_KEYS, data, &reply);
1993b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        if (status != OK) {
2003b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker            return status;
2013b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        }
202441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
203441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return reply.readInt32();
204441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
205441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
2064c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    virtual status_t restoreKeys(Vector<uint8_t> const &sessionId,
2074c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                                 Vector<uint8_t> const &keySetId) {
208441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        Parcel data, reply;
209441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
210441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
2114c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, sessionId);
2124c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, keySetId);
2133b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        status_t status = remote()->transact(RESTORE_KEYS, data, &reply);
2143b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        if (status != OK) {
2153b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker            return status;
2163b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        }
217441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
218441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return reply.readInt32();
219441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
220441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
2214c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    virtual status_t queryKeyStatus(Vector<uint8_t> const &sessionId,
222441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker                                        KeyedVector<String8, String8> &infoMap) const {
223441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        Parcel data, reply;
224441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
225441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
2264c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, sessionId);
2273b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        status_t status = remote()->transact(QUERY_KEY_STATUS, data, &reply);
2283b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        if (status != OK) {
2293b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker            return status;
2303b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        }
231441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
232441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        infoMap.clear();
233441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        size_t count = reply.readInt32();
234441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        for (size_t i = 0; i < count; i++) {
235441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            String8 key = reply.readString8();
236441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            String8 value = reply.readString8();
237441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            infoMap.add(key, value);
238441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
239441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return reply.readInt32();
240441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
241441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
24268d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker    virtual status_t getProvisionRequest(String8 const &certType,
24368d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker                                         String8 const &certAuthority,
24468d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker                                         Vector<uint8_t> &request,
245441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker                                         String8 &defaultUrl) {
246441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        Parcel data, reply;
247441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
248441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
24968d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker        data.writeString8(certType);
25068d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker        data.writeString8(certAuthority);
2513b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        status_t status = remote()->transact(GET_PROVISION_REQUEST, data, &reply);
2523b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        if (status != OK) {
2533b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker            return status;
2543b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        }
255441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
2564c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        readVector(reply, request);
257441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        defaultUrl = reply.readString8();
258441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
259441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return reply.readInt32();
260441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
261441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
26268d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker    virtual status_t provideProvisionResponse(Vector<uint8_t> const &response,
26368d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker                                              Vector<uint8_t> &certificate,
26468d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker                                              Vector<uint8_t> &wrappedKey) {
265441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        Parcel data, reply;
266441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
267441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
2684c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, response);
2693b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        status_t status = remote()->transact(PROVIDE_PROVISION_RESPONSE, data, &reply);
2703b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        if (status != OK) {
2713b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker            return status;
2723b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        }
273441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
27468d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker        readVector(reply, certificate);
27568d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker        readVector(reply, wrappedKey);
27668d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker
277441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return reply.readInt32();
278441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
279441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
28068b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker    virtual status_t unprovisionDevice() {
28168b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker        Parcel data, reply;
28268b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
28368b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker
2843b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        status_t status = remote()->transact(UNPROVISION_DEVICE, data, &reply);
2853b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        if (status != OK) {
2863b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker            return status;
2873b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        }
28868b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker
28968b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker        return reply.readInt32();
29068b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker    }
29168b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker
292441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    virtual status_t getSecureStops(List<Vector<uint8_t> > &secureStops) {
293441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        Parcel data, reply;
294441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
295441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
2963b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        status_t status = remote()->transact(GET_SECURE_STOPS, data, &reply);
2973b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        if (status != OK) {
2983b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker            return status;
2993b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        }
300441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
301441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        secureStops.clear();
302441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        uint32_t count = reply.readInt32();
303441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        for (size_t i = 0; i < count; i++) {
304441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            Vector<uint8_t> secureStop;
3054c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(reply, secureStop);
306441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            secureStops.push_back(secureStop);
307441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
308441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return reply.readInt32();
309441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
310441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
3113c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker    virtual status_t getSecureStop(Vector<uint8_t> const &ssid, Vector<uint8_t> &secureStop) {
3123c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker        Parcel data, reply;
3133c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
3143c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker
3153c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker        writeVector(data, ssid);
3163b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        status_t status = remote()->transact(GET_SECURE_STOP, data, &reply);
3173b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        if (status != OK) {
3183b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker            return status;
3193b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        }
3203c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker
3213c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker        readVector(reply, secureStop);
3223c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker        return reply.readInt32();
3233c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker    }
3243c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker
325441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    virtual status_t releaseSecureStops(Vector<uint8_t> const &ssRelease) {
326441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        Parcel data, reply;
327441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
328441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
3294c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, ssRelease);
3303b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        status_t status = remote()->transact(RELEASE_SECURE_STOPS, data, &reply);
3313b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        if (status != OK) {
3323b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker            return status;
3333b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        }
334441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
335441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return reply.readInt32();
336441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
337441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
3383c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker    virtual status_t releaseAllSecureStops() {
3393c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker        Parcel data, reply;
3403c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
3413c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker
3423b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        status_t status = remote()->transact(RELEASE_ALL_SECURE_STOPS, data, &reply);
3433b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        if (status != OK) {
3443b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker            return status;
3453b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        }
3463c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker
3473c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker        return reply.readInt32();
3483c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker    }
3493c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker
350441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    virtual status_t getPropertyString(String8 const &name, String8 &value) const {
351441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        Parcel data, reply;
352441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
353441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
354441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeString8(name);
3553b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        status_t status = remote()->transact(GET_PROPERTY_STRING, data, &reply);
3563b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        if (status != OK) {
3573b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker            return status;
3583b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        }
359441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
360441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        value = reply.readString8();
361441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return reply.readInt32();
362441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
363441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
364441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    virtual status_t getPropertyByteArray(String8 const &name, Vector<uint8_t> &value) const {
365441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        Parcel data, reply;
366441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
367441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
368441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeString8(name);
3693b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        status_t status = remote()->transact(GET_PROPERTY_BYTE_ARRAY, data, &reply);
3703b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        if (status != OK) {
3713b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker            return status;
3723b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        }
373441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
3744c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        readVector(reply, value);
375441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return reply.readInt32();
376441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
377441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
378441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    virtual status_t setPropertyString(String8 const &name, String8 const &value) const {
379441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        Parcel data, reply;
380441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
381441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
382441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeString8(name);
383441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeString8(value);
3843b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        status_t status = remote()->transact(SET_PROPERTY_STRING, data, &reply);
3853b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        if (status != OK) {
3863b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker            return status;
3873b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        }
388441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
389441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return reply.readInt32();
390441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
391441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
392441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    virtual status_t setPropertyByteArray(String8 const &name,
393441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker                                          Vector<uint8_t> const &value) const {
394441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        Parcel data, reply;
395441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
396441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
397441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        data.writeString8(name);
3984c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, value);
3993b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        status_t status = remote()->transact(SET_PROPERTY_BYTE_ARRAY, data, &reply);
4003b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        if (status != OK) {
4013b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker            return status;
4023b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        }
403441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
404441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        return reply.readInt32();
405441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
406441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
407441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
4084c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    virtual status_t setCipherAlgorithm(Vector<uint8_t> const &sessionId,
4094c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                                        String8 const &algorithm) {
4104c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        Parcel data, reply;
4114c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
4124c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
4134c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, sessionId);
4144c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        data.writeString8(algorithm);
4153b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        status_t status = remote()->transact(SET_CIPHER_ALGORITHM, data, &reply);
4163b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        if (status != OK) {
4173b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker            return status;
4183b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        }
4194c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        return reply.readInt32();
4204c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    }
4214c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
4224c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    virtual status_t setMacAlgorithm(Vector<uint8_t> const &sessionId,
4234c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                                     String8 const &algorithm) {
4244c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        Parcel data, reply;
4254c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
4264c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
4274c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, sessionId);
4284c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        data.writeString8(algorithm);
4293b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        status_t status = remote()->transact(SET_MAC_ALGORITHM, data, &reply);
4303b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        if (status != OK) {
4313b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker            return status;
4323b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        }
4334c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        return reply.readInt32();
4344c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    }
4354c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
4364c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    virtual status_t encrypt(Vector<uint8_t> const &sessionId,
4374c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                             Vector<uint8_t> const &keyId,
4384c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                             Vector<uint8_t> const &input,
4394c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                             Vector<uint8_t> const &iv,
4404c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                             Vector<uint8_t> &output) {
4414c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        Parcel data, reply;
4424c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
4434c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
4444c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, sessionId);
4454c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, keyId);
4464c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, input);
4474c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, iv);
4484c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
4493b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        status_t status = remote()->transact(ENCRYPT, data, &reply);
4503b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        if (status != OK) {
4513b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker            return status;
4523b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        }
4534c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        readVector(reply, output);
4544c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
4554c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        return reply.readInt32();
4564c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    }
4574c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
4584c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    virtual status_t decrypt(Vector<uint8_t> const &sessionId,
4594c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                             Vector<uint8_t> const &keyId,
4604c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                             Vector<uint8_t> const &input,
4614c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                             Vector<uint8_t> const &iv,
4624c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                             Vector<uint8_t> &output) {
4634c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        Parcel data, reply;
4644c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
4654c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
4664c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, sessionId);
4674c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, keyId);
4684c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, input);
4694c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, iv);
4704c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
4713b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        status_t status = remote()->transact(DECRYPT, data, &reply);
4723b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        if (status != OK) {
4733b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker            return status;
4743b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        }
4754c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        readVector(reply, output);
4764c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
4774c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        return reply.readInt32();
4784c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    }
4794c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
4804c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    virtual status_t sign(Vector<uint8_t> const &sessionId,
4814c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                          Vector<uint8_t> const &keyId,
4824c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                          Vector<uint8_t> const &message,
4834c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                          Vector<uint8_t> &signature) {
4844c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        Parcel data, reply;
4854c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
4864c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
4874c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, sessionId);
4884c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, keyId);
4894c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, message);
4904c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
4913b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        status_t status = remote()->transact(SIGN, data, &reply);
4923b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        if (status != OK) {
4933b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker            return status;
4943b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        }
4954c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        readVector(reply, signature);
4964c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
4974c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        return reply.readInt32();
4984c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    }
4994c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
5004c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    virtual status_t verify(Vector<uint8_t> const &sessionId,
5014c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                            Vector<uint8_t> const &keyId,
5024c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                            Vector<uint8_t> const &message,
5034c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                            Vector<uint8_t> const &signature,
5044c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker                            bool &match) {
5054c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        Parcel data, reply;
5064c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
5074c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
5084c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, sessionId);
5094c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, keyId);
5104c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, message);
5114c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        writeVector(data, signature);
5124c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
5133b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        status_t status = remote()->transact(VERIFY, data, &reply);
5143b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        if (status != OK) {
5153b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker            return status;
5163b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        }
5174c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        match = (bool)reply.readInt32();
5184c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        return reply.readInt32();
5194c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    }
5204c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
52168d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker    virtual status_t signRSA(Vector<uint8_t> const &sessionId,
52268d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker                             String8 const &algorithm,
52368d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker                             Vector<uint8_t> const &message,
52468d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker                             Vector<uint8_t> const &wrappedKey,
52568d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker                             Vector<uint8_t> &signature) {
52668d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker        Parcel data, reply;
52768d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
52868d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker
52968d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker        writeVector(data, sessionId);
53068d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker        data.writeString8(algorithm);
53168d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker        writeVector(data, message);
53268d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker        writeVector(data, wrappedKey);
53368d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker
5343b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        status_t status = remote()->transact(SIGN_RSA, data, &reply);
5353b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        if (status != OK) {
5363b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker            return status;
5373b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        }
53868d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker        readVector(reply, signature);
53968d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker
54068d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker        return reply.readInt32();
54168d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker    }
54268d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker
543c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker    virtual status_t setListener(const sp<IDrmClient>& listener) {
544c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker        Parcel data, reply;
545c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
54606b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen        data.writeStrongBinder(IInterface::asBinder(listener));
5473b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        status_t status = remote()->transact(SET_LISTENER, data, &reply);
5483b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        if (status != OK) {
5493b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker            return status;
5503b5401ad38b4346920f9aff0440606b8b565ce90Jeff Tinker        }
551c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker        return reply.readInt32();
552c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker    }
553c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker
554441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinkerprivate:
5554c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    void readVector(Parcel &reply, Vector<uint8_t> &vector) const {
5564c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        uint32_t size = reply.readInt32();
5574c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        vector.insertAt((size_t)0, size);
5584c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        reply.read(vector.editArray(), size);
5594c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    }
5604c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
5614c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    void writeVector(Parcel &data, Vector<uint8_t> const &vector) const {
5624c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        data.writeInt32(vector.size());
5634c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        data.write(vector.array(), vector.size());
5644c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    }
5654c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
566441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    DISALLOW_EVIL_CONSTRUCTORS(BpDrm);
567441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker};
568441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
569441a78d5e224e0d67f9b52fa9adc795c6944159bJeff TinkerIMPLEMENT_META_INTERFACE(Drm, "android.drm.IDrm");
570441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
571441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker////////////////////////////////////////////////////////////////////////////////
572441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
5734c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinkervoid BnDrm::readVector(const Parcel &data, Vector<uint8_t> &vector) const {
5744c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    uint32_t size = data.readInt32();
5754c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    vector.insertAt((size_t)0, size);
5764c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    data.read(vector.editArray(), size);
5774c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker}
5784c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
5794c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinkervoid BnDrm::writeVector(Parcel *reply, Vector<uint8_t> const &vector) const {
5804c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    reply->writeInt32(vector.size());
5814c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    reply->write(vector.array(), vector.size());
5824c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker}
5834c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
584441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinkerstatus_t BnDrm::onTransact(
585441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) {
586441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    switch (code) {
587441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        case INIT_CHECK:
588441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        {
589441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
590441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeInt32(initCheck());
591441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            return OK;
592441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
593441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
594441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        case IS_CRYPTO_SUPPORTED:
595441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        {
596441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
597441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            uint8_t uuid[16];
598441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            data.read(uuid, sizeof(uuid));
5999cf69e0fc110f17c28e988ed0f9bf91abfaf710dJeff Tinker            String8 mimeType = data.readString8();
6009cf69e0fc110f17c28e988ed0f9bf91abfaf710dJeff Tinker            reply->writeInt32(isCryptoSchemeSupported(uuid, mimeType));
6019cf69e0fc110f17c28e988ed0f9bf91abfaf710dJeff Tinker
602441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            return OK;
603441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
604441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
605441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        case CREATE_PLUGIN:
606441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        {
607441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
608441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            uint8_t uuid[16];
609441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            data.read(uuid, sizeof(uuid));
610441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeInt32(createPlugin(uuid));
611441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            return OK;
612441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
613441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
614441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        case DESTROY_PLUGIN:
615441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        {
616441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
617441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeInt32(destroyPlugin());
618441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            return OK;
619441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
620441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
621441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        case OPEN_SESSION:
622441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        {
623441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
624441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            Vector<uint8_t> sessionId;
625441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            status_t result = openSession(sessionId);
6264c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            writeVector(reply, sessionId);
627441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeInt32(result);
628441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            return OK;
629441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
630441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
631441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        case CLOSE_SESSION:
632441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        {
633441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
634441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            Vector<uint8_t> sessionId;
6354c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, sessionId);
636441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeInt32(closeSession(sessionId));
637441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            return OK;
638441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
639441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
6404c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        case GET_KEY_REQUEST:
641441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        {
642441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
6434c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            Vector<uint8_t> sessionId, initData;
644441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
6454c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, sessionId);
6464c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, initData);
647441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            String8 mimeType = data.readString8();
6484c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            DrmPlugin::KeyType keyType = (DrmPlugin::KeyType)data.readInt32();
649441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
650441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            KeyedVector<String8, String8> optionalParameters;
651441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            uint32_t count = data.readInt32();
652441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            for (size_t i = 0; i < count; ++i) {
653441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker                String8 key, value;
654441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker                key = data.readString8();
655441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker                value = data.readString8();
656441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker                optionalParameters.add(key, value);
657441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            }
658441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
659441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            Vector<uint8_t> request;
660441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            String8 defaultUrl;
661d072c909d87f8150433860f6de4c11df6e09e2f9Jeff Tinker            DrmPlugin::KeyRequestType keyRequestType;
662d072c909d87f8150433860f6de4c11df6e09e2f9Jeff Tinker
663d072c909d87f8150433860f6de4c11df6e09e2f9Jeff Tinker            status_t result = getKeyRequest(sessionId, initData, mimeType,
664d072c909d87f8150433860f6de4c11df6e09e2f9Jeff Tinker                    keyType, optionalParameters, request, defaultUrl,
665d072c909d87f8150433860f6de4c11df6e09e2f9Jeff Tinker                    &keyRequestType);
666441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
6674c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            writeVector(reply, request);
668441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeString8(defaultUrl);
669d072c909d87f8150433860f6de4c11df6e09e2f9Jeff Tinker            reply->writeInt32(static_cast<int32_t>(keyRequestType));
670441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeInt32(result);
671441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            return OK;
672441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
673441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
6744c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        case PROVIDE_KEY_RESPONSE:
675441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        {
676441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
6774c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            Vector<uint8_t> sessionId, response, keySetId;
6784c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, sessionId);
6794c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, response);
6804c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            uint32_t result = provideKeyResponse(sessionId, response, keySetId);
6814c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            writeVector(reply, keySetId);
6824c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            reply->writeInt32(result);
6834c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            return OK;
6844c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        }
685441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
6864c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        case REMOVE_KEYS:
6874c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        {
6884c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
6894c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            Vector<uint8_t> keySetId;
6904c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, keySetId);
6914c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            reply->writeInt32(removeKeys(keySetId));
692441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            return OK;
693441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
694441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
6954c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        case RESTORE_KEYS:
696441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        {
697441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
6984c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            Vector<uint8_t> sessionId, keySetId;
6994c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, sessionId);
7004c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, keySetId);
7014c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            reply->writeInt32(restoreKeys(sessionId, keySetId));
702441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            return OK;
703441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
704441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
7054c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        case QUERY_KEY_STATUS:
706441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        {
707441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
708441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            Vector<uint8_t> sessionId;
7094c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, sessionId);
710441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            KeyedVector<String8, String8> infoMap;
7114c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            status_t result = queryKeyStatus(sessionId, infoMap);
712441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            size_t count = infoMap.size();
713441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeInt32(count);
714441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            for (size_t i = 0; i < count; ++i) {
715441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker                reply->writeString8(infoMap.keyAt(i));
716441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker                reply->writeString8(infoMap.valueAt(i));
717441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            }
718441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeInt32(result);
719441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            return OK;
720441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
721441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
722441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        case GET_PROVISION_REQUEST:
723441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        {
724441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
72568d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker            String8 certType = data.readString8();
72668d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker            String8 certAuthority = data.readString8();
72768d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker
728441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            Vector<uint8_t> request;
729441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            String8 defaultUrl;
73068d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker            status_t result = getProvisionRequest(certType, certAuthority,
73168d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker                                                  request, defaultUrl);
7324c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            writeVector(reply, request);
733441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeString8(defaultUrl);
734441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeInt32(result);
735441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            return OK;
736441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
737441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
738441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        case PROVIDE_PROVISION_RESPONSE:
739441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        {
740441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
741441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            Vector<uint8_t> response;
74268d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker            Vector<uint8_t> certificate;
74368d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker            Vector<uint8_t> wrappedKey;
7444c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, response);
74568d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker            status_t result = provideProvisionResponse(response, certificate, wrappedKey);
74668d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker            writeVector(reply, certificate);
74768d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker            writeVector(reply, wrappedKey);
74868d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker            reply->writeInt32(result);
749441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            return OK;
750441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
751441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
75268b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker        case UNPROVISION_DEVICE:
75368b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker        {
75468b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
75568b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker            status_t result = unprovisionDevice();
75668b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker            reply->writeInt32(result);
75768b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker            return OK;
75868b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker        }
75968b15554f6dca3b056eac517fe5fa2fd4ee80a33Jeff Tinker
760441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        case GET_SECURE_STOPS:
761441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        {
762441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
763441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            List<Vector<uint8_t> > secureStops;
764441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            status_t result = getSecureStops(secureStops);
765441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            size_t count = secureStops.size();
766441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeInt32(count);
767441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            List<Vector<uint8_t> >::iterator iter = secureStops.begin();
768441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            while(iter != secureStops.end()) {
769441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker                size_t size = iter->size();
770441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker                reply->writeInt32(size);
771441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker                reply->write(iter->array(), iter->size());
772423e33ce6569cb14ecf772e9670208517f7b30c4Jeff Tinker                iter++;
773441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            }
774441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeInt32(result);
775441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            return OK;
776441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
777441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
7783c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker        case GET_SECURE_STOP:
7793c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker        {
7803c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
7813c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker            Vector<uint8_t> ssid, secureStop;
7823c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker            readVector(data, ssid);
7833c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker            status_t result = getSecureStop(ssid, secureStop);
7843c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker            writeVector(reply, secureStop);
7853c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker            reply->writeInt32(result);
7863c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker            return OK;
7873c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker        }
7883c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker
789441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        case RELEASE_SECURE_STOPS:
790441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        {
791441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
792441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            Vector<uint8_t> ssRelease;
7934c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, ssRelease);
794441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeInt32(releaseSecureStops(ssRelease));
795441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            return OK;
796441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
797441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
7983c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker        case RELEASE_ALL_SECURE_STOPS:
7993c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker        {
8003c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
8013c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker            reply->writeInt32(releaseAllSecureStops());
8023c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker            return OK;
8033c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker        }
8043c1285e8f86bd497e14c14fb6df7b42072ef52bdJeff Tinker
805441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        case GET_PROPERTY_STRING:
806441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        {
807441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
808441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            String8 name = data.readString8();
809441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            String8 value;
810441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            status_t result = getPropertyString(name, value);
811441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeString8(value);
812441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeInt32(result);
813441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            return OK;
814441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
815441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
816441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        case GET_PROPERTY_BYTE_ARRAY:
817441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        {
818441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
819441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            String8 name = data.readString8();
820441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            Vector<uint8_t> value;
821441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            status_t result = getPropertyByteArray(name, value);
8224c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            writeVector(reply, value);
823441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeInt32(result);
824441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            return OK;
825441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
826441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
827441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        case SET_PROPERTY_STRING:
828441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        {
829441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
830441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            String8 name = data.readString8();
831441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            String8 value = data.readString8();
832441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeInt32(setPropertyString(name, value));
833441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            return OK;
834441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
835441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
836441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        case SET_PROPERTY_BYTE_ARRAY:
837441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        {
838441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
839441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            String8 name = data.readString8();
840441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            Vector<uint8_t> value;
8414c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, value);
842441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            reply->writeInt32(setPropertyByteArray(name, value));
843441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker            return OK;
844441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker        }
845441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
8464c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        case SET_CIPHER_ALGORITHM:
8474c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        {
8484c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
8494c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            Vector<uint8_t> sessionId;
8504c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, sessionId);
8514c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            String8 algorithm = data.readString8();
8524c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            reply->writeInt32(setCipherAlgorithm(sessionId, algorithm));
8534c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            return OK;
8544c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        }
8554c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
8564c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        case SET_MAC_ALGORITHM:
8574c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        {
8584c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
8594c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            Vector<uint8_t> sessionId;
8604c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, sessionId);
8614c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            String8 algorithm = data.readString8();
8624c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            reply->writeInt32(setMacAlgorithm(sessionId, algorithm));
8634c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            return OK;
8644c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        }
8654c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
8664c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        case ENCRYPT:
8674c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        {
8684c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
8694c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            Vector<uint8_t> sessionId, keyId, input, iv, output;
8704c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, sessionId);
8714c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, keyId);
8724c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, input);
8734c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, iv);
8744c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            uint32_t result = encrypt(sessionId, keyId, input, iv, output);
8754c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            writeVector(reply, output);
8764c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            reply->writeInt32(result);
8774c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            return OK;
8784c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        }
8794c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
8804c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        case DECRYPT:
8814c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        {
8824c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
8834c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            Vector<uint8_t> sessionId, keyId, input, iv, output;
8844c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, sessionId);
8854c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, keyId);
8864c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, input);
8874c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, iv);
8884c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            uint32_t result = decrypt(sessionId, keyId, input, iv, output);
8894c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            writeVector(reply, output);
8904c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            reply->writeInt32(result);
8914c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            return OK;
8924c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        }
8934c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
8944c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        case SIGN:
8954c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        {
8964c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
8974c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            Vector<uint8_t> sessionId, keyId, message, signature;
8984c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, sessionId);
8994c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, keyId);
9004c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, message);
9014c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            uint32_t result = sign(sessionId, keyId, message, signature);
9024c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            writeVector(reply, signature);
9034c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            reply->writeInt32(result);
9044c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            return OK;
9054c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        }
9064c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
9074c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        case VERIFY:
9084c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        {
9094c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
9104c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            Vector<uint8_t> sessionId, keyId, message, signature;
9114c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, sessionId);
9124c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, keyId);
9134c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, message);
9144c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            readVector(data, signature);
9154c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            bool match;
9164c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            uint32_t result = verify(sessionId, keyId, message, signature, match);
9174c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            reply->writeInt32(match);
9184c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            reply->writeInt32(result);
9194c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker            return OK;
9204c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        }
9214c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker
92268d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker        case SIGN_RSA:
92368d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker        {
92468d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker            CHECK_INTERFACE(IDrm, data, reply);
92568d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker            Vector<uint8_t> sessionId, message, wrappedKey, signature;
92668d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker            readVector(data, sessionId);
92768d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker            String8 algorithm = data.readString8();
92868d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker            readVector(data, message);
92968d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker            readVector(data, wrappedKey);
93068d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker            uint32_t result = signRSA(sessionId, algorithm, message, wrappedKey, signature);
93168d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker            writeVector(reply, signature);
93268d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker            reply->writeInt32(result);
93368d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker            return OK;
93468d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker        }
93568d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker
936c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker    case SET_LISTENER: {
937c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker        CHECK_INTERFACE(IDrm, data, reply);
938c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker        sp<IDrmClient> listener =
939c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker            interface_cast<IDrmClient>(data.readStrongBinder());
940c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker        reply->writeInt32(setListener(listener));
941c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker        return NO_ERROR;
942c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker    } break;
943c0d5f1f8405de861ed6f1725f26cd6601e7103abJeff Tinker
9444c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker    default:
9454c63a239c404af1e055e5f9939939ab0fd09d98aJeff Tinker        return BBinder::onTransact(code, data, reply, flags);
946441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker    }
947441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker}
948441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker
949441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker}  // namespace android
950