MockDrmCryptoPlugin.cpp revision 2fb25c873e1a7f346bd8c7c072a85ca6a74b0e95
134486800a022857b45c3882624449980c5cb6907Jeff Tinker/*
234486800a022857b45c3882624449980c5cb6907Jeff Tinker * Copyright (C) 2013 The Android Open Source Project
334486800a022857b45c3882624449980c5cb6907Jeff Tinker *
434486800a022857b45c3882624449980c5cb6907Jeff Tinker * Licensed under the Apache License, Version 2.0 (the "License");
534486800a022857b45c3882624449980c5cb6907Jeff Tinker * you may not use this file except in compliance with the License.
634486800a022857b45c3882624449980c5cb6907Jeff Tinker * You may obtain a copy of the License at
734486800a022857b45c3882624449980c5cb6907Jeff Tinker *
834486800a022857b45c3882624449980c5cb6907Jeff Tinker *      http://www.apache.org/licenses/LICENSE-2.0
934486800a022857b45c3882624449980c5cb6907Jeff Tinker *
1034486800a022857b45c3882624449980c5cb6907Jeff Tinker * Unless required by applicable law or agreed to in writing, software
1134486800a022857b45c3882624449980c5cb6907Jeff Tinker * distributed under the License is distributed on an "AS IS" BASIS,
1234486800a022857b45c3882624449980c5cb6907Jeff Tinker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1334486800a022857b45c3882624449980c5cb6907Jeff Tinker * See the License for the specific language governing permissions and
1434486800a022857b45c3882624449980c5cb6907Jeff Tinker * limitations under the License.
1534486800a022857b45c3882624449980c5cb6907Jeff Tinker */
1634486800a022857b45c3882624449980c5cb6907Jeff Tinker
1734486800a022857b45c3882624449980c5cb6907Jeff Tinker//#define LOG_NDEBUG 0
1834486800a022857b45c3882624449980c5cb6907Jeff Tinker#define LOG_TAG "MockDrmCryptoPlugin"
1934486800a022857b45c3882624449980c5cb6907Jeff Tinker#include <utils/Log.h>
2034486800a022857b45c3882624449980c5cb6907Jeff Tinker
2134486800a022857b45c3882624449980c5cb6907Jeff Tinker
2234486800a022857b45c3882624449980c5cb6907Jeff Tinker#include "drm/DrmAPI.h"
2334486800a022857b45c3882624449980c5cb6907Jeff Tinker#include "MockDrmCryptoPlugin.h"
2434486800a022857b45c3882624449980c5cb6907Jeff Tinker#include "media/stagefright/MediaErrors.h"
2534486800a022857b45c3882624449980c5cb6907Jeff Tinker
2634486800a022857b45c3882624449980c5cb6907Jeff Tinkerusing namespace android;
2734486800a022857b45c3882624449980c5cb6907Jeff Tinker
2834486800a022857b45c3882624449980c5cb6907Jeff Tinker// Shared library entry point
2934486800a022857b45c3882624449980c5cb6907Jeff TinkerDrmFactory *createDrmFactory()
3034486800a022857b45c3882624449980c5cb6907Jeff Tinker{
3134486800a022857b45c3882624449980c5cb6907Jeff Tinker    return new MockDrmFactory();
3234486800a022857b45c3882624449980c5cb6907Jeff Tinker}
3334486800a022857b45c3882624449980c5cb6907Jeff Tinker
3434486800a022857b45c3882624449980c5cb6907Jeff Tinker// Shared library entry point
3534486800a022857b45c3882624449980c5cb6907Jeff TinkerCryptoFactory *createCryptoFactory()
3634486800a022857b45c3882624449980c5cb6907Jeff Tinker{
3734486800a022857b45c3882624449980c5cb6907Jeff Tinker    return new MockCryptoFactory();
3834486800a022857b45c3882624449980c5cb6907Jeff Tinker}
3934486800a022857b45c3882624449980c5cb6907Jeff Tinker
4034486800a022857b45c3882624449980c5cb6907Jeff Tinkerconst uint8_t mock_uuid[16] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
4134486800a022857b45c3882624449980c5cb6907Jeff Tinker                               0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10};
4234486800a022857b45c3882624449980c5cb6907Jeff Tinker
4334486800a022857b45c3882624449980c5cb6907Jeff Tinkernamespace android {
4434486800a022857b45c3882624449980c5cb6907Jeff Tinker
4534486800a022857b45c3882624449980c5cb6907Jeff Tinker    // MockDrmFactory
4634486800a022857b45c3882624449980c5cb6907Jeff Tinker    bool MockDrmFactory::isCryptoSchemeSupported(const uint8_t uuid[16])
4734486800a022857b45c3882624449980c5cb6907Jeff Tinker    {
4868d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker        return (!memcmp(uuid, mock_uuid, sizeof(mock_uuid)));
4934486800a022857b45c3882624449980c5cb6907Jeff Tinker    }
5034486800a022857b45c3882624449980c5cb6907Jeff Tinker
5134486800a022857b45c3882624449980c5cb6907Jeff Tinker    bool MockDrmFactory::isContentTypeSupported(const String8 &mimeType)
5234486800a022857b45c3882624449980c5cb6907Jeff Tinker    {
5334486800a022857b45c3882624449980c5cb6907Jeff Tinker        if (mimeType != "video/mp4") {
5434486800a022857b45c3882624449980c5cb6907Jeff Tinker            return false;
5534486800a022857b45c3882624449980c5cb6907Jeff Tinker        }
5634486800a022857b45c3882624449980c5cb6907Jeff Tinker        return true;
5734486800a022857b45c3882624449980c5cb6907Jeff Tinker    }
5834486800a022857b45c3882624449980c5cb6907Jeff Tinker
592fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker    status_t MockDrmFactory::createDrmPlugin(const uint8_t /* uuid */[16], DrmPlugin **plugin)
6034486800a022857b45c3882624449980c5cb6907Jeff Tinker    {
6134486800a022857b45c3882624449980c5cb6907Jeff Tinker        *plugin = new MockDrmPlugin();
6234486800a022857b45c3882624449980c5cb6907Jeff Tinker        return OK;
6334486800a022857b45c3882624449980c5cb6907Jeff Tinker    }
6434486800a022857b45c3882624449980c5cb6907Jeff Tinker
6534486800a022857b45c3882624449980c5cb6907Jeff Tinker    // MockCryptoFactory
6634486800a022857b45c3882624449980c5cb6907Jeff Tinker    bool MockCryptoFactory::isCryptoSchemeSupported(const uint8_t uuid[16]) const
6734486800a022857b45c3882624449980c5cb6907Jeff Tinker    {
6868d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker        return (!memcmp(uuid, mock_uuid, sizeof(mock_uuid)));
6934486800a022857b45c3882624449980c5cb6907Jeff Tinker    }
7034486800a022857b45c3882624449980c5cb6907Jeff Tinker
712fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker    status_t MockCryptoFactory::createPlugin(const uint8_t /* uuid */[16],
722fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker                                             const void * /* data */,
732fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker                                             size_t /* size */, CryptoPlugin **plugin)
7434486800a022857b45c3882624449980c5cb6907Jeff Tinker    {
7534486800a022857b45c3882624449980c5cb6907Jeff Tinker        *plugin = new MockCryptoPlugin();
7634486800a022857b45c3882624449980c5cb6907Jeff Tinker        return OK;
7734486800a022857b45c3882624449980c5cb6907Jeff Tinker    }
7834486800a022857b45c3882624449980c5cb6907Jeff Tinker
7934486800a022857b45c3882624449980c5cb6907Jeff Tinker
8034486800a022857b45c3882624449980c5cb6907Jeff Tinker    // MockDrmPlugin methods
8134486800a022857b45c3882624449980c5cb6907Jeff Tinker
8234486800a022857b45c3882624449980c5cb6907Jeff Tinker    status_t MockDrmPlugin::openSession(Vector<uint8_t> &sessionId)
8334486800a022857b45c3882624449980c5cb6907Jeff Tinker    {
8434486800a022857b45c3882624449980c5cb6907Jeff Tinker        const size_t kSessionIdSize = 8;
8534486800a022857b45c3882624449980c5cb6907Jeff Tinker
8634486800a022857b45c3882624449980c5cb6907Jeff Tinker        Mutex::Autolock lock(mLock);
8734486800a022857b45c3882624449980c5cb6907Jeff Tinker        for (size_t i = 0; i < kSessionIdSize / sizeof(long); i++) {
8834486800a022857b45c3882624449980c5cb6907Jeff Tinker            long r = random();
8934486800a022857b45c3882624449980c5cb6907Jeff Tinker            sessionId.appendArray((uint8_t *)&r, sizeof(long));
9034486800a022857b45c3882624449980c5cb6907Jeff Tinker        }
9134486800a022857b45c3882624449980c5cb6907Jeff Tinker        mSessions.add(sessionId);
9234486800a022857b45c3882624449980c5cb6907Jeff Tinker
9334486800a022857b45c3882624449980c5cb6907Jeff Tinker        ALOGD("MockDrmPlugin::openSession() -> %s", vectorToString(sessionId).string());
9434486800a022857b45c3882624449980c5cb6907Jeff Tinker        return OK;
9534486800a022857b45c3882624449980c5cb6907Jeff Tinker    }
9634486800a022857b45c3882624449980c5cb6907Jeff Tinker
9734486800a022857b45c3882624449980c5cb6907Jeff Tinker    status_t MockDrmPlugin::closeSession(Vector<uint8_t> const &sessionId)
9834486800a022857b45c3882624449980c5cb6907Jeff Tinker    {
9934486800a022857b45c3882624449980c5cb6907Jeff Tinker        Mutex::Autolock lock(mLock);
10034486800a022857b45c3882624449980c5cb6907Jeff Tinker        ALOGD("MockDrmPlugin::closeSession(%s)", vectorToString(sessionId).string());
10134486800a022857b45c3882624449980c5cb6907Jeff Tinker        ssize_t index = findSession(sessionId);
10234486800a022857b45c3882624449980c5cb6907Jeff Tinker        if (index == kNotFound) {
10334486800a022857b45c3882624449980c5cb6907Jeff Tinker            ALOGD("Invalid sessionId");
10434486800a022857b45c3882624449980c5cb6907Jeff Tinker            return BAD_VALUE;
10534486800a022857b45c3882624449980c5cb6907Jeff Tinker        }
10634486800a022857b45c3882624449980c5cb6907Jeff Tinker        mSessions.removeAt(index);
10734486800a022857b45c3882624449980c5cb6907Jeff Tinker        return OK;
10834486800a022857b45c3882624449980c5cb6907Jeff Tinker    }
10934486800a022857b45c3882624449980c5cb6907Jeff Tinker
11034486800a022857b45c3882624449980c5cb6907Jeff Tinker
11134486800a022857b45c3882624449980c5cb6907Jeff Tinker    status_t MockDrmPlugin::getKeyRequest(Vector<uint8_t> const &sessionId,
11234486800a022857b45c3882624449980c5cb6907Jeff Tinker                                          Vector<uint8_t> const &initData,
11334486800a022857b45c3882624449980c5cb6907Jeff Tinker                                          String8 const &mimeType, KeyType keyType,
11434486800a022857b45c3882624449980c5cb6907Jeff Tinker                                          KeyedVector<String8, String8> const &optionalParameters,
115d072c909d87f8150433860f6de4c11df6e09e2f9Jeff Tinker                                          Vector<uint8_t> &request, String8 &defaultUrl,
116d072c909d87f8150433860f6de4c11df6e09e2f9Jeff Tinker                                          KeyRequestType *keyRequestType)
11734486800a022857b45c3882624449980c5cb6907Jeff Tinker    {
11834486800a022857b45c3882624449980c5cb6907Jeff Tinker        Mutex::Autolock lock(mLock);
11934486800a022857b45c3882624449980c5cb6907Jeff Tinker        ALOGD("MockDrmPlugin::getKeyRequest(sessionId=%s, initData=%s, mimeType=%s"
12034486800a022857b45c3882624449980c5cb6907Jeff Tinker              ", keyType=%d, optionalParameters=%s))",
12134486800a022857b45c3882624449980c5cb6907Jeff Tinker              vectorToString(sessionId).string(), vectorToString(initData).string(), mimeType.string(),
12234486800a022857b45c3882624449980c5cb6907Jeff Tinker              keyType, stringMapToString(optionalParameters).string());
12334486800a022857b45c3882624449980c5cb6907Jeff Tinker
12434486800a022857b45c3882624449980c5cb6907Jeff Tinker        ssize_t index = findSession(sessionId);
12534486800a022857b45c3882624449980c5cb6907Jeff Tinker        if (index == kNotFound) {
12634486800a022857b45c3882624449980c5cb6907Jeff Tinker            ALOGD("Invalid sessionId");
12734486800a022857b45c3882624449980c5cb6907Jeff Tinker            return BAD_VALUE;
12834486800a022857b45c3882624449980c5cb6907Jeff Tinker        }
12934486800a022857b45c3882624449980c5cb6907Jeff Tinker
13034486800a022857b45c3882624449980c5cb6907Jeff Tinker        // Properties used in mock test, set by mock plugin and verifed cts test app
13134486800a022857b45c3882624449980c5cb6907Jeff Tinker        //   byte[] initData           -> mock-initdata
13234486800a022857b45c3882624449980c5cb6907Jeff Tinker        //   string mimeType           -> mock-mimetype
13334486800a022857b45c3882624449980c5cb6907Jeff Tinker        //   string keyType            -> mock-keytype
13434486800a022857b45c3882624449980c5cb6907Jeff Tinker        //   string optionalParameters -> mock-optparams formatted as {key1,value1},{key2,value2}
13534486800a022857b45c3882624449980c5cb6907Jeff Tinker
13634486800a022857b45c3882624449980c5cb6907Jeff Tinker        mByteArrayProperties.add(String8("mock-initdata"), initData);
13734486800a022857b45c3882624449980c5cb6907Jeff Tinker        mStringProperties.add(String8("mock-mimetype"), mimeType);
13834486800a022857b45c3882624449980c5cb6907Jeff Tinker
13934486800a022857b45c3882624449980c5cb6907Jeff Tinker        String8 keyTypeStr;
14034486800a022857b45c3882624449980c5cb6907Jeff Tinker        keyTypeStr.appendFormat("%d", (int)keyType);
14134486800a022857b45c3882624449980c5cb6907Jeff Tinker        mStringProperties.add(String8("mock-keytype"), keyTypeStr);
14234486800a022857b45c3882624449980c5cb6907Jeff Tinker
14334486800a022857b45c3882624449980c5cb6907Jeff Tinker        String8 params;
14434486800a022857b45c3882624449980c5cb6907Jeff Tinker        for (size_t i = 0; i < optionalParameters.size(); i++) {
14534486800a022857b45c3882624449980c5cb6907Jeff Tinker            params.appendFormat("%s{%s,%s}", i ? "," : "",
14634486800a022857b45c3882624449980c5cb6907Jeff Tinker                                optionalParameters.keyAt(i).string(),
14734486800a022857b45c3882624449980c5cb6907Jeff Tinker                                optionalParameters.valueAt(i).string());
14834486800a022857b45c3882624449980c5cb6907Jeff Tinker        }
14934486800a022857b45c3882624449980c5cb6907Jeff Tinker        mStringProperties.add(String8("mock-optparams"), params);
15034486800a022857b45c3882624449980c5cb6907Jeff Tinker
15134486800a022857b45c3882624449980c5cb6907Jeff Tinker        // Properties used in mock test, set by cts test app returned from mock plugin
15234486800a022857b45c3882624449980c5cb6907Jeff Tinker        //   byte[] mock-request       -> request
15334486800a022857b45c3882624449980c5cb6907Jeff Tinker        //   string mock-default-url   -> defaultUrl
1542fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker        //   string mock-keyRequestType -> keyRequestType
15534486800a022857b45c3882624449980c5cb6907Jeff Tinker
15634486800a022857b45c3882624449980c5cb6907Jeff Tinker        index = mByteArrayProperties.indexOfKey(String8("mock-request"));
15734486800a022857b45c3882624449980c5cb6907Jeff Tinker        if (index < 0) {
15834486800a022857b45c3882624449980c5cb6907Jeff Tinker            ALOGD("Missing 'mock-request' parameter for mock");
15934486800a022857b45c3882624449980c5cb6907Jeff Tinker            return BAD_VALUE;
16034486800a022857b45c3882624449980c5cb6907Jeff Tinker        } else {
16134486800a022857b45c3882624449980c5cb6907Jeff Tinker            request = mByteArrayProperties.valueAt(index);
16234486800a022857b45c3882624449980c5cb6907Jeff Tinker        }
16334486800a022857b45c3882624449980c5cb6907Jeff Tinker
16434486800a022857b45c3882624449980c5cb6907Jeff Tinker        index = mStringProperties.indexOfKey(String8("mock-defaultUrl"));
16534486800a022857b45c3882624449980c5cb6907Jeff Tinker        if (index < 0) {
16634486800a022857b45c3882624449980c5cb6907Jeff Tinker            ALOGD("Missing 'mock-defaultUrl' parameter for mock");
16734486800a022857b45c3882624449980c5cb6907Jeff Tinker            return BAD_VALUE;
16834486800a022857b45c3882624449980c5cb6907Jeff Tinker        } else {
16934486800a022857b45c3882624449980c5cb6907Jeff Tinker            defaultUrl = mStringProperties.valueAt(index);
17034486800a022857b45c3882624449980c5cb6907Jeff Tinker        }
171d072c909d87f8150433860f6de4c11df6e09e2f9Jeff Tinker
172d072c909d87f8150433860f6de4c11df6e09e2f9Jeff Tinker        index = mStringProperties.indexOfKey(String8("mock-keyRequestType"));
173d072c909d87f8150433860f6de4c11df6e09e2f9Jeff Tinker        if (index < 0) {
174d072c909d87f8150433860f6de4c11df6e09e2f9Jeff Tinker            ALOGD("Missing 'mock-keyRequestType' parameter for mock");
175d072c909d87f8150433860f6de4c11df6e09e2f9Jeff Tinker            return BAD_VALUE;
176d072c909d87f8150433860f6de4c11df6e09e2f9Jeff Tinker        } else {
177d072c909d87f8150433860f6de4c11df6e09e2f9Jeff Tinker            *keyRequestType = static_cast<KeyRequestType>(
178d072c909d87f8150433860f6de4c11df6e09e2f9Jeff Tinker                atoi(mStringProperties.valueAt(index).string()));
179d072c909d87f8150433860f6de4c11df6e09e2f9Jeff Tinker        }
180d072c909d87f8150433860f6de4c11df6e09e2f9Jeff Tinker
18134486800a022857b45c3882624449980c5cb6907Jeff Tinker        return OK;
18234486800a022857b45c3882624449980c5cb6907Jeff Tinker    }
18334486800a022857b45c3882624449980c5cb6907Jeff Tinker
18434486800a022857b45c3882624449980c5cb6907Jeff Tinker    status_t MockDrmPlugin::provideKeyResponse(Vector<uint8_t> const &sessionId,
18534486800a022857b45c3882624449980c5cb6907Jeff Tinker                                               Vector<uint8_t> const &response,
18634486800a022857b45c3882624449980c5cb6907Jeff Tinker                                               Vector<uint8_t> &keySetId)
18734486800a022857b45c3882624449980c5cb6907Jeff Tinker    {
18834486800a022857b45c3882624449980c5cb6907Jeff Tinker        Mutex::Autolock lock(mLock);
18934486800a022857b45c3882624449980c5cb6907Jeff Tinker        ALOGD("MockDrmPlugin::provideKeyResponse(sessionId=%s, response=%s)",
19034486800a022857b45c3882624449980c5cb6907Jeff Tinker              vectorToString(sessionId).string(), vectorToString(response).string());
19134486800a022857b45c3882624449980c5cb6907Jeff Tinker        ssize_t index = findSession(sessionId);
19234486800a022857b45c3882624449980c5cb6907Jeff Tinker        if (index == kNotFound) {
19334486800a022857b45c3882624449980c5cb6907Jeff Tinker            ALOGD("Invalid sessionId");
19434486800a022857b45c3882624449980c5cb6907Jeff Tinker            return BAD_VALUE;
19534486800a022857b45c3882624449980c5cb6907Jeff Tinker        }
19634486800a022857b45c3882624449980c5cb6907Jeff Tinker        if (response.size() == 0) {
19734486800a022857b45c3882624449980c5cb6907Jeff Tinker            return BAD_VALUE;
19834486800a022857b45c3882624449980c5cb6907Jeff Tinker        }
19934486800a022857b45c3882624449980c5cb6907Jeff Tinker
20034486800a022857b45c3882624449980c5cb6907Jeff Tinker        // Properties used in mock test, set by mock plugin and verifed cts test app
20134486800a022857b45c3882624449980c5cb6907Jeff Tinker        //   byte[] response            -> mock-response
20234486800a022857b45c3882624449980c5cb6907Jeff Tinker        mByteArrayProperties.add(String8("mock-response"), response);
20334486800a022857b45c3882624449980c5cb6907Jeff Tinker
20434486800a022857b45c3882624449980c5cb6907Jeff Tinker        const size_t kKeySetIdSize = 8;
20534486800a022857b45c3882624449980c5cb6907Jeff Tinker
20634486800a022857b45c3882624449980c5cb6907Jeff Tinker        for (size_t i = 0; i < kKeySetIdSize / sizeof(long); i++) {
20734486800a022857b45c3882624449980c5cb6907Jeff Tinker            long r = random();
20834486800a022857b45c3882624449980c5cb6907Jeff Tinker            keySetId.appendArray((uint8_t *)&r, sizeof(long));
20934486800a022857b45c3882624449980c5cb6907Jeff Tinker        }
21034486800a022857b45c3882624449980c5cb6907Jeff Tinker        mKeySets.add(keySetId);
21134486800a022857b45c3882624449980c5cb6907Jeff Tinker
21234486800a022857b45c3882624449980c5cb6907Jeff Tinker        return OK;
21334486800a022857b45c3882624449980c5cb6907Jeff Tinker    }
21434486800a022857b45c3882624449980c5cb6907Jeff Tinker
21534486800a022857b45c3882624449980c5cb6907Jeff Tinker    status_t MockDrmPlugin::removeKeys(Vector<uint8_t> const &keySetId)
21634486800a022857b45c3882624449980c5cb6907Jeff Tinker    {
21734486800a022857b45c3882624449980c5cb6907Jeff Tinker        Mutex::Autolock lock(mLock);
21834486800a022857b45c3882624449980c5cb6907Jeff Tinker        ALOGD("MockDrmPlugin::removeKeys(keySetId=%s)",
21934486800a022857b45c3882624449980c5cb6907Jeff Tinker              vectorToString(keySetId).string());
22034486800a022857b45c3882624449980c5cb6907Jeff Tinker
22134486800a022857b45c3882624449980c5cb6907Jeff Tinker        ssize_t index = findKeySet(keySetId);
22234486800a022857b45c3882624449980c5cb6907Jeff Tinker        if (index == kNotFound) {
22334486800a022857b45c3882624449980c5cb6907Jeff Tinker            ALOGD("Invalid keySetId");
22434486800a022857b45c3882624449980c5cb6907Jeff Tinker            return BAD_VALUE;
22534486800a022857b45c3882624449980c5cb6907Jeff Tinker        }
22634486800a022857b45c3882624449980c5cb6907Jeff Tinker        mKeySets.removeAt(index);
22734486800a022857b45c3882624449980c5cb6907Jeff Tinker
22834486800a022857b45c3882624449980c5cb6907Jeff Tinker        return OK;
22934486800a022857b45c3882624449980c5cb6907Jeff Tinker    }
23034486800a022857b45c3882624449980c5cb6907Jeff Tinker
23134486800a022857b45c3882624449980c5cb6907Jeff Tinker    status_t MockDrmPlugin::restoreKeys(Vector<uint8_t> const &sessionId,
23234486800a022857b45c3882624449980c5cb6907Jeff Tinker                                        Vector<uint8_t> const &keySetId)
23334486800a022857b45c3882624449980c5cb6907Jeff Tinker    {
23434486800a022857b45c3882624449980c5cb6907Jeff Tinker        Mutex::Autolock lock(mLock);
23534486800a022857b45c3882624449980c5cb6907Jeff Tinker        ALOGD("MockDrmPlugin::restoreKeys(sessionId=%s, keySetId=%s)",
23634486800a022857b45c3882624449980c5cb6907Jeff Tinker              vectorToString(sessionId).string(),
23734486800a022857b45c3882624449980c5cb6907Jeff Tinker              vectorToString(keySetId).string());
23834486800a022857b45c3882624449980c5cb6907Jeff Tinker        ssize_t index = findSession(sessionId);
23934486800a022857b45c3882624449980c5cb6907Jeff Tinker        if (index == kNotFound) {
24034486800a022857b45c3882624449980c5cb6907Jeff Tinker            ALOGD("Invalid sessionId");
24134486800a022857b45c3882624449980c5cb6907Jeff Tinker            return BAD_VALUE;
24234486800a022857b45c3882624449980c5cb6907Jeff Tinker        }
24334486800a022857b45c3882624449980c5cb6907Jeff Tinker
24434486800a022857b45c3882624449980c5cb6907Jeff Tinker        index = findKeySet(keySetId);
24534486800a022857b45c3882624449980c5cb6907Jeff Tinker        if (index == kNotFound) {
24634486800a022857b45c3882624449980c5cb6907Jeff Tinker            ALOGD("Invalid keySetId");
24734486800a022857b45c3882624449980c5cb6907Jeff Tinker            return BAD_VALUE;
24834486800a022857b45c3882624449980c5cb6907Jeff Tinker        }
24934486800a022857b45c3882624449980c5cb6907Jeff Tinker
25034486800a022857b45c3882624449980c5cb6907Jeff Tinker        return OK;
25134486800a022857b45c3882624449980c5cb6907Jeff Tinker    }
25234486800a022857b45c3882624449980c5cb6907Jeff Tinker
25334486800a022857b45c3882624449980c5cb6907Jeff Tinker    status_t MockDrmPlugin::queryKeyStatus(Vector<uint8_t> const &sessionId,
25434486800a022857b45c3882624449980c5cb6907Jeff Tinker                                               KeyedVector<String8, String8> &infoMap) const
25534486800a022857b45c3882624449980c5cb6907Jeff Tinker    {
25634486800a022857b45c3882624449980c5cb6907Jeff Tinker        ALOGD("MockDrmPlugin::queryKeyStatus(sessionId=%s)",
25734486800a022857b45c3882624449980c5cb6907Jeff Tinker              vectorToString(sessionId).string());
25834486800a022857b45c3882624449980c5cb6907Jeff Tinker
25934486800a022857b45c3882624449980c5cb6907Jeff Tinker        ssize_t index = findSession(sessionId);
26034486800a022857b45c3882624449980c5cb6907Jeff Tinker        if (index == kNotFound) {
26134486800a022857b45c3882624449980c5cb6907Jeff Tinker            ALOGD("Invalid sessionId");
26234486800a022857b45c3882624449980c5cb6907Jeff Tinker            return BAD_VALUE;
26334486800a022857b45c3882624449980c5cb6907Jeff Tinker        }
26434486800a022857b45c3882624449980c5cb6907Jeff Tinker
26534486800a022857b45c3882624449980c5cb6907Jeff Tinker        infoMap.add(String8("purchaseDuration"), String8("1000"));
26634486800a022857b45c3882624449980c5cb6907Jeff Tinker        infoMap.add(String8("licenseDuration"), String8("100"));
26734486800a022857b45c3882624449980c5cb6907Jeff Tinker        return OK;
26834486800a022857b45c3882624449980c5cb6907Jeff Tinker    }
26934486800a022857b45c3882624449980c5cb6907Jeff Tinker
2702fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker    status_t MockDrmPlugin::getProvisionRequest(String8 const & /* certType */,
2712fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker                                                String8 const & /* certAuthority */,
27268d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker                                                Vector<uint8_t> &request,
27334486800a022857b45c3882624449980c5cb6907Jeff Tinker                                                String8 &defaultUrl)
27434486800a022857b45c3882624449980c5cb6907Jeff Tinker    {
27534486800a022857b45c3882624449980c5cb6907Jeff Tinker        Mutex::Autolock lock(mLock);
27634486800a022857b45c3882624449980c5cb6907Jeff Tinker        ALOGD("MockDrmPlugin::getProvisionRequest()");
27734486800a022857b45c3882624449980c5cb6907Jeff Tinker
27834486800a022857b45c3882624449980c5cb6907Jeff Tinker        // Properties used in mock test, set by cts test app returned from mock plugin
27934486800a022857b45c3882624449980c5cb6907Jeff Tinker        //   byte[] mock-request       -> request
28034486800a022857b45c3882624449980c5cb6907Jeff Tinker        //   string mock-default-url   -> defaultUrl
28134486800a022857b45c3882624449980c5cb6907Jeff Tinker
28234486800a022857b45c3882624449980c5cb6907Jeff Tinker        ssize_t index = mByteArrayProperties.indexOfKey(String8("mock-request"));
28334486800a022857b45c3882624449980c5cb6907Jeff Tinker        if (index < 0) {
28434486800a022857b45c3882624449980c5cb6907Jeff Tinker            ALOGD("Missing 'mock-request' parameter for mock");
28534486800a022857b45c3882624449980c5cb6907Jeff Tinker            return BAD_VALUE;
28634486800a022857b45c3882624449980c5cb6907Jeff Tinker        } else {
28734486800a022857b45c3882624449980c5cb6907Jeff Tinker            request = mByteArrayProperties.valueAt(index);
28834486800a022857b45c3882624449980c5cb6907Jeff Tinker        }
28934486800a022857b45c3882624449980c5cb6907Jeff Tinker
29034486800a022857b45c3882624449980c5cb6907Jeff Tinker        index = mStringProperties.indexOfKey(String8("mock-defaultUrl"));
29134486800a022857b45c3882624449980c5cb6907Jeff Tinker        if (index < 0) {
29234486800a022857b45c3882624449980c5cb6907Jeff Tinker            ALOGD("Missing 'mock-defaultUrl' parameter for mock");
29334486800a022857b45c3882624449980c5cb6907Jeff Tinker            return BAD_VALUE;
29434486800a022857b45c3882624449980c5cb6907Jeff Tinker        } else {
29534486800a022857b45c3882624449980c5cb6907Jeff Tinker            defaultUrl = mStringProperties.valueAt(index);
29634486800a022857b45c3882624449980c5cb6907Jeff Tinker        }
29734486800a022857b45c3882624449980c5cb6907Jeff Tinker        return OK;
29834486800a022857b45c3882624449980c5cb6907Jeff Tinker    }
29934486800a022857b45c3882624449980c5cb6907Jeff Tinker
30068d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker    status_t MockDrmPlugin::provideProvisionResponse(Vector<uint8_t> const &response,
3012fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker                                                     Vector<uint8_t> & /* certificate */,
3022fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker                                                     Vector<uint8_t> & /* wrappedKey */)
30334486800a022857b45c3882624449980c5cb6907Jeff Tinker    {
30434486800a022857b45c3882624449980c5cb6907Jeff Tinker        Mutex::Autolock lock(mLock);
30534486800a022857b45c3882624449980c5cb6907Jeff Tinker        ALOGD("MockDrmPlugin::provideProvisionResponse(%s)",
30634486800a022857b45c3882624449980c5cb6907Jeff Tinker              vectorToString(response).string());
30734486800a022857b45c3882624449980c5cb6907Jeff Tinker
30834486800a022857b45c3882624449980c5cb6907Jeff Tinker        // Properties used in mock test, set by mock plugin and verifed cts test app
30934486800a022857b45c3882624449980c5cb6907Jeff Tinker        //   byte[] response            -> mock-response
31034486800a022857b45c3882624449980c5cb6907Jeff Tinker
31134486800a022857b45c3882624449980c5cb6907Jeff Tinker        mByteArrayProperties.add(String8("mock-response"), response);
31234486800a022857b45c3882624449980c5cb6907Jeff Tinker        return OK;
31334486800a022857b45c3882624449980c5cb6907Jeff Tinker    }
31434486800a022857b45c3882624449980c5cb6907Jeff Tinker
315c2320223222fe4507b6d67f6b8b4001d26c77a9cJeff Tinker    status_t MockDrmPlugin::unprovisionDevice()
316c2320223222fe4507b6d67f6b8b4001d26c77a9cJeff Tinker    {
317c2320223222fe4507b6d67f6b8b4001d26c77a9cJeff Tinker        ALOGD("MockDrmPlugin::unprovisionDevice()");
318c2320223222fe4507b6d67f6b8b4001d26c77a9cJeff Tinker        return OK;
319c2320223222fe4507b6d67f6b8b4001d26c77a9cJeff Tinker    }
320c2320223222fe4507b6d67f6b8b4001d26c77a9cJeff Tinker
3212fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker    status_t MockDrmPlugin::getSecureStop(Vector<uint8_t> const & /* ssid */,
3222fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker                                          Vector<uint8_t> & secureStop)
32385c737a67e1b679251fce7f456ae79eefdc15e07Jeff Tinker    {
32485c737a67e1b679251fce7f456ae79eefdc15e07Jeff Tinker        Mutex::Autolock lock(mLock);
32585c737a67e1b679251fce7f456ae79eefdc15e07Jeff Tinker        ALOGD("MockDrmPlugin::getSecureStop()");
32685c737a67e1b679251fce7f456ae79eefdc15e07Jeff Tinker
32785c737a67e1b679251fce7f456ae79eefdc15e07Jeff Tinker        // Properties used in mock test, set by cts test app returned from mock plugin
32885c737a67e1b679251fce7f456ae79eefdc15e07Jeff Tinker        //   byte[] mock-secure-stop  -> first secure stop in list
32985c737a67e1b679251fce7f456ae79eefdc15e07Jeff Tinker
33085c737a67e1b679251fce7f456ae79eefdc15e07Jeff Tinker        ssize_t index = mByteArrayProperties.indexOfKey(String8("mock-secure-stop"));
33185c737a67e1b679251fce7f456ae79eefdc15e07Jeff Tinker        if (index < 0) {
33285c737a67e1b679251fce7f456ae79eefdc15e07Jeff Tinker            ALOGD("Missing 'mock-secure-stop' parameter for mock");
33385c737a67e1b679251fce7f456ae79eefdc15e07Jeff Tinker            return BAD_VALUE;
33485c737a67e1b679251fce7f456ae79eefdc15e07Jeff Tinker        } else {
33585c737a67e1b679251fce7f456ae79eefdc15e07Jeff Tinker            secureStop = mByteArrayProperties.valueAt(index);
33685c737a67e1b679251fce7f456ae79eefdc15e07Jeff Tinker        }
33785c737a67e1b679251fce7f456ae79eefdc15e07Jeff Tinker        return OK;
33885c737a67e1b679251fce7f456ae79eefdc15e07Jeff Tinker    }
33985c737a67e1b679251fce7f456ae79eefdc15e07Jeff Tinker
34034486800a022857b45c3882624449980c5cb6907Jeff Tinker    status_t MockDrmPlugin::getSecureStops(List<Vector<uint8_t> > &secureStops)
34134486800a022857b45c3882624449980c5cb6907Jeff Tinker    {
34234486800a022857b45c3882624449980c5cb6907Jeff Tinker        Mutex::Autolock lock(mLock);
34334486800a022857b45c3882624449980c5cb6907Jeff Tinker        ALOGD("MockDrmPlugin::getSecureStops()");
34434486800a022857b45c3882624449980c5cb6907Jeff Tinker
34534486800a022857b45c3882624449980c5cb6907Jeff Tinker        // Properties used in mock test, set by cts test app returned from mock plugin
34634486800a022857b45c3882624449980c5cb6907Jeff Tinker        //   byte[] mock-secure-stop1  -> first secure stop in list
34734486800a022857b45c3882624449980c5cb6907Jeff Tinker        //   byte[] mock-secure-stop2  -> second secure stop in list
34834486800a022857b45c3882624449980c5cb6907Jeff Tinker
34934486800a022857b45c3882624449980c5cb6907Jeff Tinker        Vector<uint8_t> ss1, ss2;
35034486800a022857b45c3882624449980c5cb6907Jeff Tinker        ssize_t index = mByteArrayProperties.indexOfKey(String8("mock-secure-stop1"));
35134486800a022857b45c3882624449980c5cb6907Jeff Tinker        if (index < 0) {
35234486800a022857b45c3882624449980c5cb6907Jeff Tinker            ALOGD("Missing 'mock-secure-stop1' parameter for mock");
35334486800a022857b45c3882624449980c5cb6907Jeff Tinker            return BAD_VALUE;
35434486800a022857b45c3882624449980c5cb6907Jeff Tinker        } else {
35534486800a022857b45c3882624449980c5cb6907Jeff Tinker            ss1 = mByteArrayProperties.valueAt(index);
35634486800a022857b45c3882624449980c5cb6907Jeff Tinker        }
35734486800a022857b45c3882624449980c5cb6907Jeff Tinker
35834486800a022857b45c3882624449980c5cb6907Jeff Tinker        index = mByteArrayProperties.indexOfKey(String8("mock-secure-stop2"));
35934486800a022857b45c3882624449980c5cb6907Jeff Tinker        if (index < 0) {
36034486800a022857b45c3882624449980c5cb6907Jeff Tinker            ALOGD("Missing 'mock-secure-stop2' parameter for mock");
36134486800a022857b45c3882624449980c5cb6907Jeff Tinker            return BAD_VALUE;
36234486800a022857b45c3882624449980c5cb6907Jeff Tinker        } else {
36334486800a022857b45c3882624449980c5cb6907Jeff Tinker            ss2 = mByteArrayProperties.valueAt(index);
36434486800a022857b45c3882624449980c5cb6907Jeff Tinker        }
36534486800a022857b45c3882624449980c5cb6907Jeff Tinker
36634486800a022857b45c3882624449980c5cb6907Jeff Tinker        secureStops.push_back(ss1);
36734486800a022857b45c3882624449980c5cb6907Jeff Tinker        secureStops.push_back(ss2);
36834486800a022857b45c3882624449980c5cb6907Jeff Tinker        return OK;
36934486800a022857b45c3882624449980c5cb6907Jeff Tinker    }
37034486800a022857b45c3882624449980c5cb6907Jeff Tinker
37134486800a022857b45c3882624449980c5cb6907Jeff Tinker    status_t MockDrmPlugin::releaseSecureStops(Vector<uint8_t> const &ssRelease)
37234486800a022857b45c3882624449980c5cb6907Jeff Tinker    {
37334486800a022857b45c3882624449980c5cb6907Jeff Tinker        Mutex::Autolock lock(mLock);
37434486800a022857b45c3882624449980c5cb6907Jeff Tinker        ALOGD("MockDrmPlugin::releaseSecureStops(%s)",
37534486800a022857b45c3882624449980c5cb6907Jeff Tinker              vectorToString(ssRelease).string());
37634486800a022857b45c3882624449980c5cb6907Jeff Tinker
37734486800a022857b45c3882624449980c5cb6907Jeff Tinker        // Properties used in mock test, set by mock plugin and verifed cts test app
37834486800a022857b45c3882624449980c5cb6907Jeff Tinker        //   byte[] secure-stop-release  -> mock-ssrelease
37934486800a022857b45c3882624449980c5cb6907Jeff Tinker        mByteArrayProperties.add(String8("mock-ssrelease"), ssRelease);
38034486800a022857b45c3882624449980c5cb6907Jeff Tinker
38134486800a022857b45c3882624449980c5cb6907Jeff Tinker        return OK;
38285c737a67e1b679251fce7f456ae79eefdc15e07Jeff Tinker    }
38385c737a67e1b679251fce7f456ae79eefdc15e07Jeff Tinker
38485c737a67e1b679251fce7f456ae79eefdc15e07Jeff Tinker    status_t MockDrmPlugin::releaseAllSecureStops()
38585c737a67e1b679251fce7f456ae79eefdc15e07Jeff Tinker    {
38685c737a67e1b679251fce7f456ae79eefdc15e07Jeff Tinker        Mutex::Autolock lock(mLock);
38785c737a67e1b679251fce7f456ae79eefdc15e07Jeff Tinker        ALOGD("MockDrmPlugin::releaseAllSecureStops()");
38885c737a67e1b679251fce7f456ae79eefdc15e07Jeff Tinker        return OK;
38934486800a022857b45c3882624449980c5cb6907Jeff Tinker    }
39034486800a022857b45c3882624449980c5cb6907Jeff Tinker
39134486800a022857b45c3882624449980c5cb6907Jeff Tinker    status_t MockDrmPlugin::getPropertyString(String8 const &name, String8 &value) const
39234486800a022857b45c3882624449980c5cb6907Jeff Tinker    {
39334486800a022857b45c3882624449980c5cb6907Jeff Tinker        ALOGD("MockDrmPlugin::getPropertyString(name=%s)", name.string());
39434486800a022857b45c3882624449980c5cb6907Jeff Tinker        ssize_t index = mStringProperties.indexOfKey(name);
39534486800a022857b45c3882624449980c5cb6907Jeff Tinker        if (index < 0) {
39634486800a022857b45c3882624449980c5cb6907Jeff Tinker            ALOGD("no property for '%s'", name.string());
39734486800a022857b45c3882624449980c5cb6907Jeff Tinker            return BAD_VALUE;
39834486800a022857b45c3882624449980c5cb6907Jeff Tinker        }
39934486800a022857b45c3882624449980c5cb6907Jeff Tinker        value = mStringProperties.valueAt(index);
40034486800a022857b45c3882624449980c5cb6907Jeff Tinker        return OK;
40134486800a022857b45c3882624449980c5cb6907Jeff Tinker    }
40234486800a022857b45c3882624449980c5cb6907Jeff Tinker
40334486800a022857b45c3882624449980c5cb6907Jeff Tinker    status_t MockDrmPlugin::getPropertyByteArray(String8 const &name,
40434486800a022857b45c3882624449980c5cb6907Jeff Tinker                                                 Vector<uint8_t> &value) const
40534486800a022857b45c3882624449980c5cb6907Jeff Tinker    {
40634486800a022857b45c3882624449980c5cb6907Jeff Tinker        ALOGD("MockDrmPlugin::getPropertyByteArray(name=%s)", name.string());
40734486800a022857b45c3882624449980c5cb6907Jeff Tinker        ssize_t index = mByteArrayProperties.indexOfKey(name);
40834486800a022857b45c3882624449980c5cb6907Jeff Tinker        if (index < 0) {
40934486800a022857b45c3882624449980c5cb6907Jeff Tinker            ALOGD("no property for '%s'", name.string());
41034486800a022857b45c3882624449980c5cb6907Jeff Tinker            return BAD_VALUE;
41134486800a022857b45c3882624449980c5cb6907Jeff Tinker        }
41234486800a022857b45c3882624449980c5cb6907Jeff Tinker        value = mByteArrayProperties.valueAt(index);
41334486800a022857b45c3882624449980c5cb6907Jeff Tinker        return OK;
41434486800a022857b45c3882624449980c5cb6907Jeff Tinker    }
41534486800a022857b45c3882624449980c5cb6907Jeff Tinker
41634486800a022857b45c3882624449980c5cb6907Jeff Tinker    status_t MockDrmPlugin::setPropertyString(String8 const &name,
41734486800a022857b45c3882624449980c5cb6907Jeff Tinker                                              String8 const &value)
41834486800a022857b45c3882624449980c5cb6907Jeff Tinker    {
41934486800a022857b45c3882624449980c5cb6907Jeff Tinker        Mutex::Autolock lock(mLock);
42034486800a022857b45c3882624449980c5cb6907Jeff Tinker        ALOGD("MockDrmPlugin::setPropertyString(name=%s, value=%s)",
42134486800a022857b45c3882624449980c5cb6907Jeff Tinker              name.string(), value.string());
42234486800a022857b45c3882624449980c5cb6907Jeff Tinker
42334486800a022857b45c3882624449980c5cb6907Jeff Tinker        if (name == "mock-send-event") {
42434486800a022857b45c3882624449980c5cb6907Jeff Tinker            unsigned code, extra;
42534486800a022857b45c3882624449980c5cb6907Jeff Tinker            sscanf(value.string(), "%d %d", &code, &extra);
42634486800a022857b45c3882624449980c5cb6907Jeff Tinker            DrmPlugin::EventType eventType = (DrmPlugin::EventType)code;
42734486800a022857b45c3882624449980c5cb6907Jeff Tinker
42834486800a022857b45c3882624449980c5cb6907Jeff Tinker            Vector<uint8_t> const *pSessionId = NULL;
42934486800a022857b45c3882624449980c5cb6907Jeff Tinker            ssize_t index = mByteArrayProperties.indexOfKey(String8("mock-event-session-id"));
43034486800a022857b45c3882624449980c5cb6907Jeff Tinker            if (index >= 0) {
43134486800a022857b45c3882624449980c5cb6907Jeff Tinker                pSessionId = &mByteArrayProperties[index];
43234486800a022857b45c3882624449980c5cb6907Jeff Tinker            }
43334486800a022857b45c3882624449980c5cb6907Jeff Tinker
43434486800a022857b45c3882624449980c5cb6907Jeff Tinker            Vector<uint8_t> const *pData = NULL;
43534486800a022857b45c3882624449980c5cb6907Jeff Tinker            index = mByteArrayProperties.indexOfKey(String8("mock-event-data"));
43634486800a022857b45c3882624449980c5cb6907Jeff Tinker            if (index >= 0) {
43734486800a022857b45c3882624449980c5cb6907Jeff Tinker                pData = &mByteArrayProperties[index];
43834486800a022857b45c3882624449980c5cb6907Jeff Tinker            }
43934486800a022857b45c3882624449980c5cb6907Jeff Tinker            ALOGD("sending event from mock drm plugin: %d %d %s %s",
44034486800a022857b45c3882624449980c5cb6907Jeff Tinker                  (int)code, extra, pSessionId ? vectorToString(*pSessionId) : "{}",
44134486800a022857b45c3882624449980c5cb6907Jeff Tinker                  pData ? vectorToString(*pData) : "{}");
44234486800a022857b45c3882624449980c5cb6907Jeff Tinker
44334486800a022857b45c3882624449980c5cb6907Jeff Tinker            sendEvent(eventType, extra, pSessionId, pData);
4442fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker        } else if (name == "mock-send-expiration-update") {
4452fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker            int64_t expiryTimeMS;
4462fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker            sscanf(value.string(), "%jd", &expiryTimeMS);
4472fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker
4482fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker            Vector<uint8_t> const *pSessionId = NULL;
4492fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker            ssize_t index = mByteArrayProperties.indexOfKey(String8("mock-event-session-id"));
4502fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker            if (index >= 0) {
4512fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker                pSessionId = &mByteArrayProperties[index];
4522fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker            }
4532fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker
4542fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker            ALOGD("sending expiration-update from mock drm plugin: %jd %s",
4552fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker                  expiryTimeMS, pSessionId ? vectorToString(*pSessionId) : "{}");
4562fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker
4572fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker            sendExpirationUpdate(pSessionId, expiryTimeMS);
4582fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker        } else if (name == "mock-send-keys-change") {
4592fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker            Vector<uint8_t> const *pSessionId = NULL;
4602fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker            ssize_t index = mByteArrayProperties.indexOfKey(String8("mock-event-session-id"));
4612fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker            if (index >= 0) {
4622fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker                pSessionId = &mByteArrayProperties[index];
4632fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker            }
4642fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker
4652fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker            ALOGD("sending keys-change from mock drm plugin: %s",
4662fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker                  pSessionId ? vectorToString(*pSessionId) : "{}");
4672fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker
4682fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker            Vector<DrmPlugin::KeyStatus> keyStatusList;
4692fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker            DrmPlugin::KeyStatus keyStatus;
4702fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker            uint8_t keyId1[] = {'k', 'e', 'y', '1'};
4712fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker            keyStatus.mKeyId.clear();
4722fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker            keyStatus.mKeyId.appendArray(keyId1, sizeof(keyId1));
4732fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker            keyStatus.mType = DrmPlugin::kKeyStatusType_Usable;
4742fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker            keyStatusList.add(keyStatus);
4752fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker
4762fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker            uint8_t keyId2[] = {'k', 'e', 'y', '2'};
4772fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker            keyStatus.mKeyId.clear();
4782fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker            keyStatus.mKeyId.appendArray(keyId2, sizeof(keyId2));
4792fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker            keyStatus.mType = DrmPlugin::kKeyStatusType_Expired;
4802fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker            keyStatusList.add(keyStatus);
4812fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker
4822fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker            uint8_t keyId3[] = {'k', 'e', 'y', '3'};
4832fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker            keyStatus.mKeyId.clear();
4842fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker            keyStatus.mKeyId.appendArray(keyId3, sizeof(keyId3));
4852fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker            keyStatus.mType = DrmPlugin::kKeyStatusType_OutputNotAllowed;
4862fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker            keyStatusList.add(keyStatus);
4872fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker
4882fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker            uint8_t keyId4[] = {'k', 'e', 'y', '4'};
4892fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker            keyStatus.mKeyId.clear();
4902fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker            keyStatus.mKeyId.appendArray(keyId4, sizeof(keyId4));
4912fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker            keyStatus.mType = DrmPlugin::kKeyStatusType_StatusPending;
4922fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker            keyStatusList.add(keyStatus);
4932fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker
4942fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker            uint8_t keyId5[] = {'k', 'e', 'y', '5'};
4952fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker            keyStatus.mKeyId.clear();
4962fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker            keyStatus.mKeyId.appendArray(keyId5, sizeof(keyId5));
4972fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker            keyStatus.mType = DrmPlugin::kKeyStatusType_InternalError;
4982fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker            keyStatusList.add(keyStatus);
4992fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker
5002fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker            sendKeysChange(pSessionId, &keyStatusList, true);
50134486800a022857b45c3882624449980c5cb6907Jeff Tinker        } else {
50234486800a022857b45c3882624449980c5cb6907Jeff Tinker            mStringProperties.add(name, value);
50334486800a022857b45c3882624449980c5cb6907Jeff Tinker        }
50434486800a022857b45c3882624449980c5cb6907Jeff Tinker        return OK;
50534486800a022857b45c3882624449980c5cb6907Jeff Tinker    }
50634486800a022857b45c3882624449980c5cb6907Jeff Tinker
50734486800a022857b45c3882624449980c5cb6907Jeff Tinker    status_t MockDrmPlugin::setPropertyByteArray(String8 const &name,
50834486800a022857b45c3882624449980c5cb6907Jeff Tinker                                                 Vector<uint8_t> const &value)
50934486800a022857b45c3882624449980c5cb6907Jeff Tinker    {
51034486800a022857b45c3882624449980c5cb6907Jeff Tinker        Mutex::Autolock lock(mLock);
51134486800a022857b45c3882624449980c5cb6907Jeff Tinker        ALOGD("MockDrmPlugin::setPropertyByteArray(name=%s, value=%s)",
51234486800a022857b45c3882624449980c5cb6907Jeff Tinker              name.string(), vectorToString(value).string());
51334486800a022857b45c3882624449980c5cb6907Jeff Tinker        mByteArrayProperties.add(name, value);
51434486800a022857b45c3882624449980c5cb6907Jeff Tinker        return OK;
51534486800a022857b45c3882624449980c5cb6907Jeff Tinker    }
51634486800a022857b45c3882624449980c5cb6907Jeff Tinker
51734486800a022857b45c3882624449980c5cb6907Jeff Tinker    status_t MockDrmPlugin::setCipherAlgorithm(Vector<uint8_t> const &sessionId,
51834486800a022857b45c3882624449980c5cb6907Jeff Tinker                                               String8 const &algorithm)
51934486800a022857b45c3882624449980c5cb6907Jeff Tinker    {
52034486800a022857b45c3882624449980c5cb6907Jeff Tinker        Mutex::Autolock lock(mLock);
52134486800a022857b45c3882624449980c5cb6907Jeff Tinker
52234486800a022857b45c3882624449980c5cb6907Jeff Tinker        ALOGD("MockDrmPlugin::setCipherAlgorithm(sessionId=%s, algorithm=%s)",
52334486800a022857b45c3882624449980c5cb6907Jeff Tinker              vectorToString(sessionId).string(), algorithm.string());
52434486800a022857b45c3882624449980c5cb6907Jeff Tinker
52534486800a022857b45c3882624449980c5cb6907Jeff Tinker        ssize_t index = findSession(sessionId);
52634486800a022857b45c3882624449980c5cb6907Jeff Tinker        if (index == kNotFound) {
52734486800a022857b45c3882624449980c5cb6907Jeff Tinker            ALOGD("Invalid sessionId");
52834486800a022857b45c3882624449980c5cb6907Jeff Tinker            return BAD_VALUE;
52934486800a022857b45c3882624449980c5cb6907Jeff Tinker        }
53034486800a022857b45c3882624449980c5cb6907Jeff Tinker
53134486800a022857b45c3882624449980c5cb6907Jeff Tinker        if (algorithm == "AES/CBC/NoPadding") {
53234486800a022857b45c3882624449980c5cb6907Jeff Tinker            return OK;
53334486800a022857b45c3882624449980c5cb6907Jeff Tinker        }
53434486800a022857b45c3882624449980c5cb6907Jeff Tinker        return BAD_VALUE;
53534486800a022857b45c3882624449980c5cb6907Jeff Tinker    }
53634486800a022857b45c3882624449980c5cb6907Jeff Tinker
53734486800a022857b45c3882624449980c5cb6907Jeff Tinker    status_t MockDrmPlugin::setMacAlgorithm(Vector<uint8_t> const &sessionId,
53834486800a022857b45c3882624449980c5cb6907Jeff Tinker                                            String8 const &algorithm)
53934486800a022857b45c3882624449980c5cb6907Jeff Tinker    {
54034486800a022857b45c3882624449980c5cb6907Jeff Tinker        Mutex::Autolock lock(mLock);
54134486800a022857b45c3882624449980c5cb6907Jeff Tinker
54234486800a022857b45c3882624449980c5cb6907Jeff Tinker        ALOGD("MockDrmPlugin::setMacAlgorithm(sessionId=%s, algorithm=%s)",
54334486800a022857b45c3882624449980c5cb6907Jeff Tinker              vectorToString(sessionId).string(), algorithm.string());
54434486800a022857b45c3882624449980c5cb6907Jeff Tinker
54534486800a022857b45c3882624449980c5cb6907Jeff Tinker        ssize_t index = findSession(sessionId);
54634486800a022857b45c3882624449980c5cb6907Jeff Tinker        if (index == kNotFound) {
54734486800a022857b45c3882624449980c5cb6907Jeff Tinker            ALOGD("Invalid sessionId");
54834486800a022857b45c3882624449980c5cb6907Jeff Tinker            return BAD_VALUE;
54934486800a022857b45c3882624449980c5cb6907Jeff Tinker        }
55034486800a022857b45c3882624449980c5cb6907Jeff Tinker
55134486800a022857b45c3882624449980c5cb6907Jeff Tinker        if (algorithm == "HmacSHA256") {
55234486800a022857b45c3882624449980c5cb6907Jeff Tinker            return OK;
55334486800a022857b45c3882624449980c5cb6907Jeff Tinker        }
55434486800a022857b45c3882624449980c5cb6907Jeff Tinker        return BAD_VALUE;
55534486800a022857b45c3882624449980c5cb6907Jeff Tinker    }
55634486800a022857b45c3882624449980c5cb6907Jeff Tinker
55734486800a022857b45c3882624449980c5cb6907Jeff Tinker    status_t MockDrmPlugin::encrypt(Vector<uint8_t> const &sessionId,
55834486800a022857b45c3882624449980c5cb6907Jeff Tinker                                    Vector<uint8_t> const &keyId,
55934486800a022857b45c3882624449980c5cb6907Jeff Tinker                                    Vector<uint8_t> const &input,
56034486800a022857b45c3882624449980c5cb6907Jeff Tinker                                    Vector<uint8_t> const &iv,
56134486800a022857b45c3882624449980c5cb6907Jeff Tinker                                    Vector<uint8_t> &output)
56234486800a022857b45c3882624449980c5cb6907Jeff Tinker    {
56334486800a022857b45c3882624449980c5cb6907Jeff Tinker        Mutex::Autolock lock(mLock);
56434486800a022857b45c3882624449980c5cb6907Jeff Tinker        ALOGD("MockDrmPlugin::encrypt(sessionId=%s, keyId=%s, input=%s, iv=%s)",
56534486800a022857b45c3882624449980c5cb6907Jeff Tinker              vectorToString(sessionId).string(),
56634486800a022857b45c3882624449980c5cb6907Jeff Tinker              vectorToString(keyId).string(),
56734486800a022857b45c3882624449980c5cb6907Jeff Tinker              vectorToString(input).string(),
56834486800a022857b45c3882624449980c5cb6907Jeff Tinker              vectorToString(iv).string());
56934486800a022857b45c3882624449980c5cb6907Jeff Tinker
57034486800a022857b45c3882624449980c5cb6907Jeff Tinker        ssize_t index = findSession(sessionId);
57134486800a022857b45c3882624449980c5cb6907Jeff Tinker        if (index == kNotFound) {
57234486800a022857b45c3882624449980c5cb6907Jeff Tinker            ALOGD("Invalid sessionId");
57334486800a022857b45c3882624449980c5cb6907Jeff Tinker            return BAD_VALUE;
57434486800a022857b45c3882624449980c5cb6907Jeff Tinker        }
57534486800a022857b45c3882624449980c5cb6907Jeff Tinker
57634486800a022857b45c3882624449980c5cb6907Jeff Tinker        // Properties used in mock test, set by mock plugin and verifed cts test app
57734486800a022857b45c3882624449980c5cb6907Jeff Tinker        //   byte[] keyId              -> mock-keyid
57834486800a022857b45c3882624449980c5cb6907Jeff Tinker        //   byte[] input              -> mock-input
57934486800a022857b45c3882624449980c5cb6907Jeff Tinker        //   byte[] iv                 -> mock-iv
58034486800a022857b45c3882624449980c5cb6907Jeff Tinker        mByteArrayProperties.add(String8("mock-keyid"), keyId);
58134486800a022857b45c3882624449980c5cb6907Jeff Tinker        mByteArrayProperties.add(String8("mock-input"), input);
58234486800a022857b45c3882624449980c5cb6907Jeff Tinker        mByteArrayProperties.add(String8("mock-iv"), iv);
58334486800a022857b45c3882624449980c5cb6907Jeff Tinker
58434486800a022857b45c3882624449980c5cb6907Jeff Tinker        // Properties used in mock test, set by cts test app returned from mock plugin
58534486800a022857b45c3882624449980c5cb6907Jeff Tinker        //   byte[] mock-output        -> output
58634486800a022857b45c3882624449980c5cb6907Jeff Tinker        index = mByteArrayProperties.indexOfKey(String8("mock-output"));
58734486800a022857b45c3882624449980c5cb6907Jeff Tinker        if (index < 0) {
58834486800a022857b45c3882624449980c5cb6907Jeff Tinker            ALOGD("Missing 'mock-request' parameter for mock");
58934486800a022857b45c3882624449980c5cb6907Jeff Tinker            return BAD_VALUE;
59034486800a022857b45c3882624449980c5cb6907Jeff Tinker        } else {
59134486800a022857b45c3882624449980c5cb6907Jeff Tinker            output = mByteArrayProperties.valueAt(index);
59234486800a022857b45c3882624449980c5cb6907Jeff Tinker        }
59334486800a022857b45c3882624449980c5cb6907Jeff Tinker        return OK;
59434486800a022857b45c3882624449980c5cb6907Jeff Tinker    }
59534486800a022857b45c3882624449980c5cb6907Jeff Tinker
59634486800a022857b45c3882624449980c5cb6907Jeff Tinker    status_t MockDrmPlugin::decrypt(Vector<uint8_t> const &sessionId,
59734486800a022857b45c3882624449980c5cb6907Jeff Tinker                                    Vector<uint8_t> const &keyId,
59834486800a022857b45c3882624449980c5cb6907Jeff Tinker                                    Vector<uint8_t> const &input,
59934486800a022857b45c3882624449980c5cb6907Jeff Tinker                                    Vector<uint8_t> const &iv,
60034486800a022857b45c3882624449980c5cb6907Jeff Tinker                                    Vector<uint8_t> &output)
60134486800a022857b45c3882624449980c5cb6907Jeff Tinker    {
60234486800a022857b45c3882624449980c5cb6907Jeff Tinker        Mutex::Autolock lock(mLock);
60334486800a022857b45c3882624449980c5cb6907Jeff Tinker        ALOGD("MockDrmPlugin::decrypt(sessionId=%s, keyId=%s, input=%s, iv=%s)",
60434486800a022857b45c3882624449980c5cb6907Jeff Tinker              vectorToString(sessionId).string(),
60534486800a022857b45c3882624449980c5cb6907Jeff Tinker              vectorToString(keyId).string(),
60634486800a022857b45c3882624449980c5cb6907Jeff Tinker              vectorToString(input).string(),
60734486800a022857b45c3882624449980c5cb6907Jeff Tinker              vectorToString(iv).string());
60834486800a022857b45c3882624449980c5cb6907Jeff Tinker
60934486800a022857b45c3882624449980c5cb6907Jeff Tinker        ssize_t index = findSession(sessionId);
61034486800a022857b45c3882624449980c5cb6907Jeff Tinker        if (index == kNotFound) {
61134486800a022857b45c3882624449980c5cb6907Jeff Tinker            ALOGD("Invalid sessionId");
61234486800a022857b45c3882624449980c5cb6907Jeff Tinker            return BAD_VALUE;
61334486800a022857b45c3882624449980c5cb6907Jeff Tinker        }
61434486800a022857b45c3882624449980c5cb6907Jeff Tinker
61534486800a022857b45c3882624449980c5cb6907Jeff Tinker        // Properties used in mock test, set by mock plugin and verifed cts test app
61634486800a022857b45c3882624449980c5cb6907Jeff Tinker        //   byte[] keyId              -> mock-keyid
61734486800a022857b45c3882624449980c5cb6907Jeff Tinker        //   byte[] input              -> mock-input
61834486800a022857b45c3882624449980c5cb6907Jeff Tinker        //   byte[] iv                 -> mock-iv
61934486800a022857b45c3882624449980c5cb6907Jeff Tinker        mByteArrayProperties.add(String8("mock-keyid"), keyId);
62034486800a022857b45c3882624449980c5cb6907Jeff Tinker        mByteArrayProperties.add(String8("mock-input"), input);
62134486800a022857b45c3882624449980c5cb6907Jeff Tinker        mByteArrayProperties.add(String8("mock-iv"), iv);
62234486800a022857b45c3882624449980c5cb6907Jeff Tinker
62334486800a022857b45c3882624449980c5cb6907Jeff Tinker        // Properties used in mock test, set by cts test app returned from mock plugin
62434486800a022857b45c3882624449980c5cb6907Jeff Tinker        //   byte[] mock-output        -> output
62534486800a022857b45c3882624449980c5cb6907Jeff Tinker        index = mByteArrayProperties.indexOfKey(String8("mock-output"));
62634486800a022857b45c3882624449980c5cb6907Jeff Tinker        if (index < 0) {
62734486800a022857b45c3882624449980c5cb6907Jeff Tinker            ALOGD("Missing 'mock-request' parameter for mock");
62834486800a022857b45c3882624449980c5cb6907Jeff Tinker            return BAD_VALUE;
62934486800a022857b45c3882624449980c5cb6907Jeff Tinker        } else {
63034486800a022857b45c3882624449980c5cb6907Jeff Tinker            output = mByteArrayProperties.valueAt(index);
63134486800a022857b45c3882624449980c5cb6907Jeff Tinker        }
63234486800a022857b45c3882624449980c5cb6907Jeff Tinker        return OK;
63334486800a022857b45c3882624449980c5cb6907Jeff Tinker    }
63434486800a022857b45c3882624449980c5cb6907Jeff Tinker
63534486800a022857b45c3882624449980c5cb6907Jeff Tinker    status_t MockDrmPlugin::sign(Vector<uint8_t> const &sessionId,
63634486800a022857b45c3882624449980c5cb6907Jeff Tinker                                 Vector<uint8_t> const &keyId,
63734486800a022857b45c3882624449980c5cb6907Jeff Tinker                                 Vector<uint8_t> const &message,
63834486800a022857b45c3882624449980c5cb6907Jeff Tinker                                 Vector<uint8_t> &signature)
63934486800a022857b45c3882624449980c5cb6907Jeff Tinker    {
64034486800a022857b45c3882624449980c5cb6907Jeff Tinker        Mutex::Autolock lock(mLock);
64134486800a022857b45c3882624449980c5cb6907Jeff Tinker        ALOGD("MockDrmPlugin::sign(sessionId=%s, keyId=%s, message=%s)",
64234486800a022857b45c3882624449980c5cb6907Jeff Tinker              vectorToString(sessionId).string(),
64334486800a022857b45c3882624449980c5cb6907Jeff Tinker              vectorToString(keyId).string(),
64434486800a022857b45c3882624449980c5cb6907Jeff Tinker              vectorToString(message).string());
64534486800a022857b45c3882624449980c5cb6907Jeff Tinker
64634486800a022857b45c3882624449980c5cb6907Jeff Tinker        ssize_t index = findSession(sessionId);
64734486800a022857b45c3882624449980c5cb6907Jeff Tinker        if (index == kNotFound) {
64834486800a022857b45c3882624449980c5cb6907Jeff Tinker            ALOGD("Invalid sessionId");
64934486800a022857b45c3882624449980c5cb6907Jeff Tinker            return BAD_VALUE;
65034486800a022857b45c3882624449980c5cb6907Jeff Tinker        }
65134486800a022857b45c3882624449980c5cb6907Jeff Tinker
65234486800a022857b45c3882624449980c5cb6907Jeff Tinker        // Properties used in mock test, set by mock plugin and verifed cts test app
65334486800a022857b45c3882624449980c5cb6907Jeff Tinker        //   byte[] keyId              -> mock-keyid
65434486800a022857b45c3882624449980c5cb6907Jeff Tinker        //   byte[] message            -> mock-message
65534486800a022857b45c3882624449980c5cb6907Jeff Tinker        mByteArrayProperties.add(String8("mock-keyid"), keyId);
65634486800a022857b45c3882624449980c5cb6907Jeff Tinker        mByteArrayProperties.add(String8("mock-message"), message);
65734486800a022857b45c3882624449980c5cb6907Jeff Tinker
65834486800a022857b45c3882624449980c5cb6907Jeff Tinker        // Properties used in mock test, set by cts test app returned from mock plugin
65934486800a022857b45c3882624449980c5cb6907Jeff Tinker        //   byte[] mock-signature        -> signature
66034486800a022857b45c3882624449980c5cb6907Jeff Tinker        index = mByteArrayProperties.indexOfKey(String8("mock-signature"));
66134486800a022857b45c3882624449980c5cb6907Jeff Tinker        if (index < 0) {
66234486800a022857b45c3882624449980c5cb6907Jeff Tinker            ALOGD("Missing 'mock-request' parameter for mock");
66334486800a022857b45c3882624449980c5cb6907Jeff Tinker            return BAD_VALUE;
66434486800a022857b45c3882624449980c5cb6907Jeff Tinker        } else {
66534486800a022857b45c3882624449980c5cb6907Jeff Tinker            signature = mByteArrayProperties.valueAt(index);
66634486800a022857b45c3882624449980c5cb6907Jeff Tinker        }
66734486800a022857b45c3882624449980c5cb6907Jeff Tinker        return OK;
66834486800a022857b45c3882624449980c5cb6907Jeff Tinker    }
66934486800a022857b45c3882624449980c5cb6907Jeff Tinker
67034486800a022857b45c3882624449980c5cb6907Jeff Tinker    status_t MockDrmPlugin::verify(Vector<uint8_t> const &sessionId,
67134486800a022857b45c3882624449980c5cb6907Jeff Tinker                                   Vector<uint8_t> const &keyId,
67234486800a022857b45c3882624449980c5cb6907Jeff Tinker                                   Vector<uint8_t> const &message,
67334486800a022857b45c3882624449980c5cb6907Jeff Tinker                                   Vector<uint8_t> const &signature,
67434486800a022857b45c3882624449980c5cb6907Jeff Tinker                                   bool &match)
67534486800a022857b45c3882624449980c5cb6907Jeff Tinker    {
67634486800a022857b45c3882624449980c5cb6907Jeff Tinker        Mutex::Autolock lock(mLock);
67734486800a022857b45c3882624449980c5cb6907Jeff Tinker        ALOGD("MockDrmPlugin::verify(sessionId=%s, keyId=%s, message=%s, signature=%s)",
67834486800a022857b45c3882624449980c5cb6907Jeff Tinker              vectorToString(sessionId).string(),
67934486800a022857b45c3882624449980c5cb6907Jeff Tinker              vectorToString(keyId).string(),
68034486800a022857b45c3882624449980c5cb6907Jeff Tinker              vectorToString(message).string(),
68134486800a022857b45c3882624449980c5cb6907Jeff Tinker              vectorToString(signature).string());
68234486800a022857b45c3882624449980c5cb6907Jeff Tinker
68334486800a022857b45c3882624449980c5cb6907Jeff Tinker        ssize_t index = findSession(sessionId);
68434486800a022857b45c3882624449980c5cb6907Jeff Tinker        if (index == kNotFound) {
68534486800a022857b45c3882624449980c5cb6907Jeff Tinker            ALOGD("Invalid sessionId");
68634486800a022857b45c3882624449980c5cb6907Jeff Tinker            return BAD_VALUE;
68734486800a022857b45c3882624449980c5cb6907Jeff Tinker        }
68834486800a022857b45c3882624449980c5cb6907Jeff Tinker
68934486800a022857b45c3882624449980c5cb6907Jeff Tinker        // Properties used in mock test, set by mock plugin and verifed cts test app
69034486800a022857b45c3882624449980c5cb6907Jeff Tinker        //   byte[] keyId              -> mock-keyid
69134486800a022857b45c3882624449980c5cb6907Jeff Tinker        //   byte[] message            -> mock-message
69234486800a022857b45c3882624449980c5cb6907Jeff Tinker        //   byte[] signature          -> mock-signature
69334486800a022857b45c3882624449980c5cb6907Jeff Tinker        mByteArrayProperties.add(String8("mock-keyid"), keyId);
69434486800a022857b45c3882624449980c5cb6907Jeff Tinker        mByteArrayProperties.add(String8("mock-message"), message);
69534486800a022857b45c3882624449980c5cb6907Jeff Tinker        mByteArrayProperties.add(String8("mock-signature"), signature);
69634486800a022857b45c3882624449980c5cb6907Jeff Tinker
69734486800a022857b45c3882624449980c5cb6907Jeff Tinker        // Properties used in mock test, set by cts test app returned from mock plugin
69834486800a022857b45c3882624449980c5cb6907Jeff Tinker        //   String mock-match "1" or "0"         -> match
69934486800a022857b45c3882624449980c5cb6907Jeff Tinker        index = mStringProperties.indexOfKey(String8("mock-match"));
70034486800a022857b45c3882624449980c5cb6907Jeff Tinker        if (index < 0) {
70134486800a022857b45c3882624449980c5cb6907Jeff Tinker            ALOGD("Missing 'mock-request' parameter for mock");
70234486800a022857b45c3882624449980c5cb6907Jeff Tinker            return BAD_VALUE;
70334486800a022857b45c3882624449980c5cb6907Jeff Tinker        } else {
70434486800a022857b45c3882624449980c5cb6907Jeff Tinker            match = atol(mStringProperties.valueAt(index).string());
70534486800a022857b45c3882624449980c5cb6907Jeff Tinker        }
70634486800a022857b45c3882624449980c5cb6907Jeff Tinker        return OK;
70734486800a022857b45c3882624449980c5cb6907Jeff Tinker    }
70834486800a022857b45c3882624449980c5cb6907Jeff Tinker
70968d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker    status_t MockDrmPlugin::signRSA(Vector<uint8_t> const &sessionId,
71068d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker                                    String8 const &algorithm,
71168d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker                                    Vector<uint8_t> const &message,
71268d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker                                    Vector<uint8_t> const &wrappedKey,
71368d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker                                    Vector<uint8_t> &signature)
71468d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker    {
71568d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker        Mutex::Autolock lock(mLock);
71668d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker        ALOGD("MockDrmPlugin::signRSA(sessionId=%s, algorithm=%s, keyId=%s, "
71768d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker              "message=%s, signature=%s)",
71868d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker              vectorToString(sessionId).string(),
71968d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker              algorithm.string(),
72068d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker              vectorToString(message).string(),
72168d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker              vectorToString(wrappedKey).string(),
72268d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker              vectorToString(signature).string());
72368d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker
72468d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker        // Properties used in mock test, set by mock plugin and verifed cts test app
72568d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker        //   byte[] wrappedKey         -> mock-wrappedkey
72668d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker        //   byte[] message            -> mock-message
72768d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker        //   byte[] signature          -> mock-signature
72868d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker        mByteArrayProperties.add(String8("mock-sessionid"), sessionId);
72968d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker        mStringProperties.add(String8("mock-algorithm"), algorithm);
73068d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker        mByteArrayProperties.add(String8("mock-message"), message);
73168d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker        mByteArrayProperties.add(String8("mock-wrappedkey"), wrappedKey);
73268d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker        mByteArrayProperties.add(String8("mock-signature"), signature);
73368d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker        return OK;
73468d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker    }
73568d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker
73634486800a022857b45c3882624449980c5cb6907Jeff Tinker    ssize_t MockDrmPlugin::findSession(Vector<uint8_t> const &sessionId) const
73734486800a022857b45c3882624449980c5cb6907Jeff Tinker    {
73834486800a022857b45c3882624449980c5cb6907Jeff Tinker        ALOGD("findSession: nsessions=%d, size=%d", mSessions.size(), sessionId.size());
73934486800a022857b45c3882624449980c5cb6907Jeff Tinker        for (size_t i = 0; i < mSessions.size(); ++i) {
74034486800a022857b45c3882624449980c5cb6907Jeff Tinker            if (memcmp(mSessions[i].array(), sessionId.array(), sessionId.size()) == 0) {
74134486800a022857b45c3882624449980c5cb6907Jeff Tinker                return i;
74234486800a022857b45c3882624449980c5cb6907Jeff Tinker            }
74334486800a022857b45c3882624449980c5cb6907Jeff Tinker        }
74434486800a022857b45c3882624449980c5cb6907Jeff Tinker        return kNotFound;
74534486800a022857b45c3882624449980c5cb6907Jeff Tinker    }
74634486800a022857b45c3882624449980c5cb6907Jeff Tinker
74734486800a022857b45c3882624449980c5cb6907Jeff Tinker    ssize_t MockDrmPlugin::findKeySet(Vector<uint8_t> const &keySetId) const
74834486800a022857b45c3882624449980c5cb6907Jeff Tinker    {
74934486800a022857b45c3882624449980c5cb6907Jeff Tinker        ALOGD("findKeySet: nkeySets=%d, size=%d", mKeySets.size(), keySetId.size());
75034486800a022857b45c3882624449980c5cb6907Jeff Tinker        for (size_t i = 0; i < mKeySets.size(); ++i) {
75134486800a022857b45c3882624449980c5cb6907Jeff Tinker            if (memcmp(mKeySets[i].array(), keySetId.array(), keySetId.size()) == 0) {
75234486800a022857b45c3882624449980c5cb6907Jeff Tinker                return i;
75334486800a022857b45c3882624449980c5cb6907Jeff Tinker            }
75434486800a022857b45c3882624449980c5cb6907Jeff Tinker        }
75534486800a022857b45c3882624449980c5cb6907Jeff Tinker        return kNotFound;
75634486800a022857b45c3882624449980c5cb6907Jeff Tinker    }
75734486800a022857b45c3882624449980c5cb6907Jeff Tinker
75834486800a022857b45c3882624449980c5cb6907Jeff Tinker
75934486800a022857b45c3882624449980c5cb6907Jeff Tinker    // Conversion utilities
76034486800a022857b45c3882624449980c5cb6907Jeff Tinker    String8 MockDrmPlugin::vectorToString(Vector<uint8_t> const &vector) const
76134486800a022857b45c3882624449980c5cb6907Jeff Tinker    {
76234486800a022857b45c3882624449980c5cb6907Jeff Tinker        return arrayToString(vector.array(), vector.size());
76334486800a022857b45c3882624449980c5cb6907Jeff Tinker    }
76434486800a022857b45c3882624449980c5cb6907Jeff Tinker
76534486800a022857b45c3882624449980c5cb6907Jeff Tinker    String8 MockDrmPlugin::arrayToString(uint8_t const *array, size_t len) const
76634486800a022857b45c3882624449980c5cb6907Jeff Tinker    {
76734486800a022857b45c3882624449980c5cb6907Jeff Tinker        String8 result("{ ");
76834486800a022857b45c3882624449980c5cb6907Jeff Tinker        for (size_t i = 0; i < len; i++) {
76934486800a022857b45c3882624449980c5cb6907Jeff Tinker            result.appendFormat("0x%02x ", array[i]);
77034486800a022857b45c3882624449980c5cb6907Jeff Tinker        }
77134486800a022857b45c3882624449980c5cb6907Jeff Tinker        result += "}";
77234486800a022857b45c3882624449980c5cb6907Jeff Tinker        return result;
77334486800a022857b45c3882624449980c5cb6907Jeff Tinker    }
77434486800a022857b45c3882624449980c5cb6907Jeff Tinker
77534486800a022857b45c3882624449980c5cb6907Jeff Tinker    String8 MockDrmPlugin::stringMapToString(KeyedVector<String8, String8> map) const
77634486800a022857b45c3882624449980c5cb6907Jeff Tinker    {
77734486800a022857b45c3882624449980c5cb6907Jeff Tinker        String8 result("{ ");
77834486800a022857b45c3882624449980c5cb6907Jeff Tinker        for (size_t i = 0; i < map.size(); i++) {
77934486800a022857b45c3882624449980c5cb6907Jeff Tinker            result.appendFormat("%s{name=%s, value=%s}", i > 0 ? ", " : "",
78034486800a022857b45c3882624449980c5cb6907Jeff Tinker                                map.keyAt(i).string(), map.valueAt(i).string());
78134486800a022857b45c3882624449980c5cb6907Jeff Tinker        }
78234486800a022857b45c3882624449980c5cb6907Jeff Tinker        return result + " }";
78334486800a022857b45c3882624449980c5cb6907Jeff Tinker    }
78434486800a022857b45c3882624449980c5cb6907Jeff Tinker
78534486800a022857b45c3882624449980c5cb6907Jeff Tinker    bool operator<(Vector<uint8_t> const &lhs, Vector<uint8_t> const &rhs) {
78634486800a022857b45c3882624449980c5cb6907Jeff Tinker        return lhs.size() < rhs.size() || (memcmp(lhs.array(), rhs.array(), lhs.size()) < 0);
78734486800a022857b45c3882624449980c5cb6907Jeff Tinker    }
78834486800a022857b45c3882624449980c5cb6907Jeff Tinker
78934486800a022857b45c3882624449980c5cb6907Jeff Tinker    //
79034486800a022857b45c3882624449980c5cb6907Jeff Tinker    // Crypto Plugin
79134486800a022857b45c3882624449980c5cb6907Jeff Tinker    //
79234486800a022857b45c3882624449980c5cb6907Jeff Tinker
79334486800a022857b45c3882624449980c5cb6907Jeff Tinker    bool MockCryptoPlugin::requiresSecureDecoderComponent(const char *mime) const
79434486800a022857b45c3882624449980c5cb6907Jeff Tinker    {
79534486800a022857b45c3882624449980c5cb6907Jeff Tinker        ALOGD("MockCryptoPlugin::requiresSecureDecoderComponent(mime=%s)", mime);
79634486800a022857b45c3882624449980c5cb6907Jeff Tinker        return false;
79734486800a022857b45c3882624449980c5cb6907Jeff Tinker    }
79834486800a022857b45c3882624449980c5cb6907Jeff Tinker
79934486800a022857b45c3882624449980c5cb6907Jeff Tinker    ssize_t
80034486800a022857b45c3882624449980c5cb6907Jeff Tinker    MockCryptoPlugin::decrypt(bool secure, const uint8_t key[16], const uint8_t iv[16],
80134486800a022857b45c3882624449980c5cb6907Jeff Tinker                              Mode mode, const void *srcPtr, const SubSample *subSamples,
8022fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker                              size_t numSubSamples, void *dstPtr, AString * /* errorDetailMsg */)
80334486800a022857b45c3882624449980c5cb6907Jeff Tinker    {
80434486800a022857b45c3882624449980c5cb6907Jeff Tinker        ALOGD("MockCryptoPlugin::decrypt(secure=%d, key=%s, iv=%s, mode=%d, src=%p, "
80534486800a022857b45c3882624449980c5cb6907Jeff Tinker              "subSamples=%s, dst=%p)",
80634486800a022857b45c3882624449980c5cb6907Jeff Tinker              (int)secure,
80734486800a022857b45c3882624449980c5cb6907Jeff Tinker              arrayToString(key, sizeof(key)).string(),
80834486800a022857b45c3882624449980c5cb6907Jeff Tinker              arrayToString(iv, sizeof(iv)).string(),
80934486800a022857b45c3882624449980c5cb6907Jeff Tinker              (int)mode, srcPtr,
81034486800a022857b45c3882624449980c5cb6907Jeff Tinker              subSamplesToString(subSamples, numSubSamples).string(),
81134486800a022857b45c3882624449980c5cb6907Jeff Tinker              dstPtr);
81234486800a022857b45c3882624449980c5cb6907Jeff Tinker        return OK;
81334486800a022857b45c3882624449980c5cb6907Jeff Tinker    }
81434486800a022857b45c3882624449980c5cb6907Jeff Tinker
81534486800a022857b45c3882624449980c5cb6907Jeff Tinker    // Conversion utilities
81634486800a022857b45c3882624449980c5cb6907Jeff Tinker    String8 MockCryptoPlugin::arrayToString(uint8_t const *array, size_t len) const
81734486800a022857b45c3882624449980c5cb6907Jeff Tinker    {
81834486800a022857b45c3882624449980c5cb6907Jeff Tinker        String8 result("{ ");
81934486800a022857b45c3882624449980c5cb6907Jeff Tinker        for (size_t i = 0; i < len; i++) {
82034486800a022857b45c3882624449980c5cb6907Jeff Tinker            result.appendFormat("0x%02x ", array[i]);
82134486800a022857b45c3882624449980c5cb6907Jeff Tinker        }
82234486800a022857b45c3882624449980c5cb6907Jeff Tinker        result += "}";
82334486800a022857b45c3882624449980c5cb6907Jeff Tinker        return result;
82434486800a022857b45c3882624449980c5cb6907Jeff Tinker    }
82534486800a022857b45c3882624449980c5cb6907Jeff Tinker
82634486800a022857b45c3882624449980c5cb6907Jeff Tinker    String8 MockCryptoPlugin::subSamplesToString(SubSample const *subSamples,
82734486800a022857b45c3882624449980c5cb6907Jeff Tinker                                                 size_t numSubSamples) const
82834486800a022857b45c3882624449980c5cb6907Jeff Tinker    {
82934486800a022857b45c3882624449980c5cb6907Jeff Tinker        String8 result;
83034486800a022857b45c3882624449980c5cb6907Jeff Tinker        for (size_t i = 0; i < numSubSamples; i++) {
8312fb25c873e1a7f346bd8c7c072a85ca6a74b0e95Jeff Tinker            result.appendFormat("[%zu] {clear:%u, encrypted:%u} ", i,
83234486800a022857b45c3882624449980c5cb6907Jeff Tinker                                subSamples[i].mNumBytesOfClearData,
83334486800a022857b45c3882624449980c5cb6907Jeff Tinker                                subSamples[i].mNumBytesOfEncryptedData);
83434486800a022857b45c3882624449980c5cb6907Jeff Tinker        }
83534486800a022857b45c3882624449980c5cb6907Jeff Tinker        return result;
83634486800a022857b45c3882624449980c5cb6907Jeff Tinker    }
83734486800a022857b45c3882624449980c5cb6907Jeff Tinker
83834486800a022857b45c3882624449980c5cb6907Jeff Tinker};
839