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#include <utils/Mutex.h> 1834486800a022857b45c3882624449980c5cb6907Jeff Tinker 1934486800a022857b45c3882624449980c5cb6907Jeff Tinker#include "drm/DrmAPI.h" 2034486800a022857b45c3882624449980c5cb6907Jeff Tinker#include "hardware/CryptoAPI.h" 2134486800a022857b45c3882624449980c5cb6907Jeff Tinker 2234486800a022857b45c3882624449980c5cb6907Jeff Tinkerextern "C" { 2334486800a022857b45c3882624449980c5cb6907Jeff Tinker android::DrmFactory *createDrmFactory(); 2434486800a022857b45c3882624449980c5cb6907Jeff Tinker android::CryptoFactory *createCryptoFactory(); 2534486800a022857b45c3882624449980c5cb6907Jeff Tinker} 2634486800a022857b45c3882624449980c5cb6907Jeff Tinker 2734486800a022857b45c3882624449980c5cb6907Jeff Tinkernamespace android { 2834486800a022857b45c3882624449980c5cb6907Jeff Tinker 2934486800a022857b45c3882624449980c5cb6907Jeff Tinker class MockDrmFactory : public DrmFactory { 3034486800a022857b45c3882624449980c5cb6907Jeff Tinker public: 3134486800a022857b45c3882624449980c5cb6907Jeff Tinker MockDrmFactory() {} 3234486800a022857b45c3882624449980c5cb6907Jeff Tinker virtual ~MockDrmFactory() {} 3334486800a022857b45c3882624449980c5cb6907Jeff Tinker 3434486800a022857b45c3882624449980c5cb6907Jeff Tinker bool isCryptoSchemeSupported(const uint8_t uuid[16]); 3534486800a022857b45c3882624449980c5cb6907Jeff Tinker bool isContentTypeSupported(const String8 &mimeType); 3634486800a022857b45c3882624449980c5cb6907Jeff Tinker status_t createDrmPlugin(const uint8_t uuid[16], DrmPlugin **plugin); 3734486800a022857b45c3882624449980c5cb6907Jeff Tinker }; 3834486800a022857b45c3882624449980c5cb6907Jeff Tinker 3934486800a022857b45c3882624449980c5cb6907Jeff Tinker class MockCryptoFactory : public CryptoFactory { 4034486800a022857b45c3882624449980c5cb6907Jeff Tinker public: 4134486800a022857b45c3882624449980c5cb6907Jeff Tinker MockCryptoFactory() {} 4234486800a022857b45c3882624449980c5cb6907Jeff Tinker virtual ~MockCryptoFactory() {} 4334486800a022857b45c3882624449980c5cb6907Jeff Tinker 4434486800a022857b45c3882624449980c5cb6907Jeff Tinker bool isCryptoSchemeSupported(const uint8_t uuid[16]) const; 4534486800a022857b45c3882624449980c5cb6907Jeff Tinker status_t createPlugin( 4634486800a022857b45c3882624449980c5cb6907Jeff Tinker const uint8_t uuid[16], const void *data, size_t size, 4734486800a022857b45c3882624449980c5cb6907Jeff Tinker CryptoPlugin **plugin); 4834486800a022857b45c3882624449980c5cb6907Jeff Tinker }; 4934486800a022857b45c3882624449980c5cb6907Jeff Tinker 5034486800a022857b45c3882624449980c5cb6907Jeff Tinker 5134486800a022857b45c3882624449980c5cb6907Jeff Tinker 5234486800a022857b45c3882624449980c5cb6907Jeff Tinker class MockDrmPlugin : public DrmPlugin { 5334486800a022857b45c3882624449980c5cb6907Jeff Tinker public: 5434486800a022857b45c3882624449980c5cb6907Jeff Tinker MockDrmPlugin() {} 5534486800a022857b45c3882624449980c5cb6907Jeff Tinker virtual ~MockDrmPlugin() {} 5634486800a022857b45c3882624449980c5cb6907Jeff Tinker 5734486800a022857b45c3882624449980c5cb6907Jeff Tinker // from DrmPlugin 5834486800a022857b45c3882624449980c5cb6907Jeff Tinker status_t openSession(Vector<uint8_t> &sessionId); 5934486800a022857b45c3882624449980c5cb6907Jeff Tinker status_t closeSession(Vector<uint8_t> const &sessionId); 6034486800a022857b45c3882624449980c5cb6907Jeff Tinker 6134486800a022857b45c3882624449980c5cb6907Jeff Tinker status_t getKeyRequest(Vector<uint8_t> const &sessionId, 6234486800a022857b45c3882624449980c5cb6907Jeff Tinker Vector<uint8_t> const &initData, 6334486800a022857b45c3882624449980c5cb6907Jeff Tinker String8 const &mimeType, KeyType keyType, 6434486800a022857b45c3882624449980c5cb6907Jeff Tinker KeyedVector<String8, String8> const &optionalParameters, 6534486800a022857b45c3882624449980c5cb6907Jeff Tinker Vector<uint8_t> &request, String8 &defaultUrl); 6634486800a022857b45c3882624449980c5cb6907Jeff Tinker 6734486800a022857b45c3882624449980c5cb6907Jeff Tinker status_t provideKeyResponse(Vector<uint8_t> const &sessionId, 6834486800a022857b45c3882624449980c5cb6907Jeff Tinker Vector<uint8_t> const &response, 6934486800a022857b45c3882624449980c5cb6907Jeff Tinker Vector<uint8_t> &keySetId); 7034486800a022857b45c3882624449980c5cb6907Jeff Tinker 7134486800a022857b45c3882624449980c5cb6907Jeff Tinker status_t removeKeys(Vector<uint8_t> const &keySetId); 7234486800a022857b45c3882624449980c5cb6907Jeff Tinker 7334486800a022857b45c3882624449980c5cb6907Jeff Tinker status_t restoreKeys(Vector<uint8_t> const &sessionId, 7434486800a022857b45c3882624449980c5cb6907Jeff Tinker Vector<uint8_t> const &keySetId); 7534486800a022857b45c3882624449980c5cb6907Jeff Tinker 7634486800a022857b45c3882624449980c5cb6907Jeff Tinker status_t queryKeyStatus(Vector<uint8_t> const &sessionId, 7734486800a022857b45c3882624449980c5cb6907Jeff Tinker KeyedVector<String8, String8> &infoMap) const; 7834486800a022857b45c3882624449980c5cb6907Jeff Tinker 7934486800a022857b45c3882624449980c5cb6907Jeff Tinker status_t getProvisionRequest(Vector<uint8_t> &request, 8034486800a022857b45c3882624449980c5cb6907Jeff Tinker String8 &defaultUrl); 8134486800a022857b45c3882624449980c5cb6907Jeff Tinker 8234486800a022857b45c3882624449980c5cb6907Jeff Tinker status_t provideProvisionResponse(Vector<uint8_t> const &response); 8334486800a022857b45c3882624449980c5cb6907Jeff Tinker 8434486800a022857b45c3882624449980c5cb6907Jeff Tinker status_t getSecureStops(List<Vector<uint8_t> > &secureStops); 8534486800a022857b45c3882624449980c5cb6907Jeff Tinker status_t releaseSecureStops(Vector<uint8_t> const &ssRelease); 8634486800a022857b45c3882624449980c5cb6907Jeff Tinker 8734486800a022857b45c3882624449980c5cb6907Jeff Tinker status_t getPropertyString(String8 const &name, String8 &value ) const; 8834486800a022857b45c3882624449980c5cb6907Jeff Tinker status_t getPropertyByteArray(String8 const &name, 8934486800a022857b45c3882624449980c5cb6907Jeff Tinker Vector<uint8_t> &value ) const; 9034486800a022857b45c3882624449980c5cb6907Jeff Tinker 9134486800a022857b45c3882624449980c5cb6907Jeff Tinker status_t setPropertyString(String8 const &name, 9234486800a022857b45c3882624449980c5cb6907Jeff Tinker String8 const &value ); 9334486800a022857b45c3882624449980c5cb6907Jeff Tinker status_t setPropertyByteArray(String8 const &name, 9434486800a022857b45c3882624449980c5cb6907Jeff Tinker Vector<uint8_t> const &value ); 9534486800a022857b45c3882624449980c5cb6907Jeff Tinker 9634486800a022857b45c3882624449980c5cb6907Jeff Tinker status_t setCipherAlgorithm(Vector<uint8_t> const &sessionId, 9734486800a022857b45c3882624449980c5cb6907Jeff Tinker String8 const &algorithm); 9834486800a022857b45c3882624449980c5cb6907Jeff Tinker 9934486800a022857b45c3882624449980c5cb6907Jeff Tinker status_t setMacAlgorithm(Vector<uint8_t> const &sessionId, 10034486800a022857b45c3882624449980c5cb6907Jeff Tinker String8 const &algorithm); 10134486800a022857b45c3882624449980c5cb6907Jeff Tinker 10234486800a022857b45c3882624449980c5cb6907Jeff Tinker status_t encrypt(Vector<uint8_t> const &sessionId, 10334486800a022857b45c3882624449980c5cb6907Jeff Tinker Vector<uint8_t> const &keyId, 10434486800a022857b45c3882624449980c5cb6907Jeff Tinker Vector<uint8_t> const &input, 10534486800a022857b45c3882624449980c5cb6907Jeff Tinker Vector<uint8_t> const &iv, 10634486800a022857b45c3882624449980c5cb6907Jeff Tinker Vector<uint8_t> &output); 10734486800a022857b45c3882624449980c5cb6907Jeff Tinker 10834486800a022857b45c3882624449980c5cb6907Jeff Tinker status_t decrypt(Vector<uint8_t> const &sessionId, 10934486800a022857b45c3882624449980c5cb6907Jeff Tinker Vector<uint8_t> const &keyId, 11034486800a022857b45c3882624449980c5cb6907Jeff Tinker Vector<uint8_t> const &input, 11134486800a022857b45c3882624449980c5cb6907Jeff Tinker Vector<uint8_t> const &iv, 11234486800a022857b45c3882624449980c5cb6907Jeff Tinker Vector<uint8_t> &output); 11334486800a022857b45c3882624449980c5cb6907Jeff Tinker 11434486800a022857b45c3882624449980c5cb6907Jeff Tinker status_t sign(Vector<uint8_t> const &sessionId, 11534486800a022857b45c3882624449980c5cb6907Jeff Tinker Vector<uint8_t> const &keyId, 11634486800a022857b45c3882624449980c5cb6907Jeff Tinker Vector<uint8_t> const &message, 11734486800a022857b45c3882624449980c5cb6907Jeff Tinker Vector<uint8_t> &signature); 11834486800a022857b45c3882624449980c5cb6907Jeff Tinker 11934486800a022857b45c3882624449980c5cb6907Jeff Tinker status_t verify(Vector<uint8_t> const &sessionId, 12034486800a022857b45c3882624449980c5cb6907Jeff Tinker Vector<uint8_t> const &keyId, 12134486800a022857b45c3882624449980c5cb6907Jeff Tinker Vector<uint8_t> const &message, 12234486800a022857b45c3882624449980c5cb6907Jeff Tinker Vector<uint8_t> const &signature, 12334486800a022857b45c3882624449980c5cb6907Jeff Tinker bool &match); 12434486800a022857b45c3882624449980c5cb6907Jeff Tinker 12534486800a022857b45c3882624449980c5cb6907Jeff Tinker private: 12634486800a022857b45c3882624449980c5cb6907Jeff Tinker String8 vectorToString(Vector<uint8_t> const &vector) const; 12734486800a022857b45c3882624449980c5cb6907Jeff Tinker String8 arrayToString(uint8_t const *array, size_t len) const; 12834486800a022857b45c3882624449980c5cb6907Jeff Tinker String8 stringMapToString(KeyedVector<String8, String8> map) const; 12934486800a022857b45c3882624449980c5cb6907Jeff Tinker 13034486800a022857b45c3882624449980c5cb6907Jeff Tinker SortedVector<Vector<uint8_t> > mSessions; 13134486800a022857b45c3882624449980c5cb6907Jeff Tinker SortedVector<Vector<uint8_t> > mKeySets; 13234486800a022857b45c3882624449980c5cb6907Jeff Tinker 13334486800a022857b45c3882624449980c5cb6907Jeff Tinker static const ssize_t kNotFound = -1; 13434486800a022857b45c3882624449980c5cb6907Jeff Tinker ssize_t findSession(Vector<uint8_t> const &sessionId) const; 13534486800a022857b45c3882624449980c5cb6907Jeff Tinker ssize_t findKeySet(Vector<uint8_t> const &keySetId) const; 13634486800a022857b45c3882624449980c5cb6907Jeff Tinker 13734486800a022857b45c3882624449980c5cb6907Jeff Tinker Mutex mLock; 13834486800a022857b45c3882624449980c5cb6907Jeff Tinker KeyedVector<String8, String8> mStringProperties; 13934486800a022857b45c3882624449980c5cb6907Jeff Tinker KeyedVector<String8, Vector<uint8_t> > mByteArrayProperties; 14034486800a022857b45c3882624449980c5cb6907Jeff Tinker }; 14134486800a022857b45c3882624449980c5cb6907Jeff Tinker 14234486800a022857b45c3882624449980c5cb6907Jeff Tinker 14334486800a022857b45c3882624449980c5cb6907Jeff Tinker class MockCryptoPlugin : public CryptoPlugin { 14434486800a022857b45c3882624449980c5cb6907Jeff Tinker 14534486800a022857b45c3882624449980c5cb6907Jeff Tinker bool requiresSecureDecoderComponent(const char *mime) const; 14634486800a022857b45c3882624449980c5cb6907Jeff Tinker 14734486800a022857b45c3882624449980c5cb6907Jeff Tinker ssize_t decrypt(bool secure, 14834486800a022857b45c3882624449980c5cb6907Jeff Tinker const uint8_t key[16], const uint8_t iv[16], 14934486800a022857b45c3882624449980c5cb6907Jeff Tinker Mode mode, const void *srcPtr, 15034486800a022857b45c3882624449980c5cb6907Jeff Tinker const SubSample *subSamples, size_t numSubSamples, 15134486800a022857b45c3882624449980c5cb6907Jeff Tinker void *dstPtr, AString *errorDetailMsg); 15234486800a022857b45c3882624449980c5cb6907Jeff Tinker private: 15334486800a022857b45c3882624449980c5cb6907Jeff Tinker String8 subSamplesToString(CryptoPlugin::SubSample const *subSamples, size_t numSubSamples) const; 15434486800a022857b45c3882624449980c5cb6907Jeff Tinker String8 arrayToString(uint8_t const *array, size_t len) const; 15534486800a022857b45c3882624449980c5cb6907Jeff Tinker }; 15634486800a022857b45c3882624449980c5cb6907Jeff Tinker}; 157