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