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); 3668b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong status_t createDrmPlugin(const uint8_t uuid[16], 3768b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong DrmPlugin **plugin); 3834486800a022857b45c3882624449980c5cb6907Jeff Tinker }; 3934486800a022857b45c3882624449980c5cb6907Jeff Tinker 4034486800a022857b45c3882624449980c5cb6907Jeff Tinker class MockCryptoFactory : public CryptoFactory { 4134486800a022857b45c3882624449980c5cb6907Jeff Tinker public: 4234486800a022857b45c3882624449980c5cb6907Jeff Tinker MockCryptoFactory() {} 4334486800a022857b45c3882624449980c5cb6907Jeff Tinker virtual ~MockCryptoFactory() {} 4434486800a022857b45c3882624449980c5cb6907Jeff Tinker 4534486800a022857b45c3882624449980c5cb6907Jeff Tinker bool isCryptoSchemeSupported(const uint8_t uuid[16]) const; 4634486800a022857b45c3882624449980c5cb6907Jeff Tinker status_t createPlugin( 4734486800a022857b45c3882624449980c5cb6907Jeff Tinker const uint8_t uuid[16], const void *data, size_t size, 4834486800a022857b45c3882624449980c5cb6907Jeff Tinker CryptoPlugin **plugin); 4934486800a022857b45c3882624449980c5cb6907Jeff Tinker }; 5034486800a022857b45c3882624449980c5cb6907Jeff Tinker 5134486800a022857b45c3882624449980c5cb6907Jeff Tinker 5234486800a022857b45c3882624449980c5cb6907Jeff Tinker 5334486800a022857b45c3882624449980c5cb6907Jeff Tinker class MockDrmPlugin : public DrmPlugin { 5434486800a022857b45c3882624449980c5cb6907Jeff Tinker public: 5534486800a022857b45c3882624449980c5cb6907Jeff Tinker MockDrmPlugin() {} 5634486800a022857b45c3882624449980c5cb6907Jeff Tinker virtual ~MockDrmPlugin() {} 5734486800a022857b45c3882624449980c5cb6907Jeff Tinker 5834486800a022857b45c3882624449980c5cb6907Jeff Tinker // from DrmPlugin 5934486800a022857b45c3882624449980c5cb6907Jeff Tinker status_t openSession(Vector<uint8_t> &sessionId); 6034486800a022857b45c3882624449980c5cb6907Jeff Tinker status_t closeSession(Vector<uint8_t> const &sessionId); 6134486800a022857b45c3882624449980c5cb6907Jeff Tinker 6234486800a022857b45c3882624449980c5cb6907Jeff Tinker status_t getKeyRequest(Vector<uint8_t> const &sessionId, 6334486800a022857b45c3882624449980c5cb6907Jeff Tinker Vector<uint8_t> const &initData, 6434486800a022857b45c3882624449980c5cb6907Jeff Tinker String8 const &mimeType, KeyType keyType, 6534486800a022857b45c3882624449980c5cb6907Jeff Tinker KeyedVector<String8, String8> const &optionalParameters, 66d072c909d87f8150433860f6de4c11df6e09e2f9Jeff Tinker Vector<uint8_t> &request, String8 &defaultUrl, 67d072c909d87f8150433860f6de4c11df6e09e2f9Jeff Tinker KeyRequestType *keyRequestType); 6834486800a022857b45c3882624449980c5cb6907Jeff Tinker 6934486800a022857b45c3882624449980c5cb6907Jeff Tinker status_t provideKeyResponse(Vector<uint8_t> const &sessionId, 7034486800a022857b45c3882624449980c5cb6907Jeff Tinker Vector<uint8_t> const &response, 7134486800a022857b45c3882624449980c5cb6907Jeff Tinker Vector<uint8_t> &keySetId); 7234486800a022857b45c3882624449980c5cb6907Jeff Tinker 7334486800a022857b45c3882624449980c5cb6907Jeff Tinker status_t removeKeys(Vector<uint8_t> const &keySetId); 7434486800a022857b45c3882624449980c5cb6907Jeff Tinker 7534486800a022857b45c3882624449980c5cb6907Jeff Tinker status_t restoreKeys(Vector<uint8_t> const &sessionId, 7634486800a022857b45c3882624449980c5cb6907Jeff Tinker Vector<uint8_t> const &keySetId); 7734486800a022857b45c3882624449980c5cb6907Jeff Tinker 7834486800a022857b45c3882624449980c5cb6907Jeff Tinker status_t queryKeyStatus(Vector<uint8_t> const &sessionId, 7934486800a022857b45c3882624449980c5cb6907Jeff Tinker KeyedVector<String8, String8> &infoMap) const; 8034486800a022857b45c3882624449980c5cb6907Jeff Tinker 8168d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker status_t getProvisionRequest(String8 const &certType, 8268d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker String8 const &certAuthority, 8368d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker Vector<uint8_t> &request, 8468d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker String8 &defaultUrl); 8534486800a022857b45c3882624449980c5cb6907Jeff Tinker 8668d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker status_t provideProvisionResponse(Vector<uint8_t> const &response, 8768d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker Vector<uint8_t> &certificate, 8868d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker Vector<uint8_t> &wrappedKey); 8934486800a022857b45c3882624449980c5cb6907Jeff Tinker 9034486800a022857b45c3882624449980c5cb6907Jeff Tinker status_t getSecureStops(List<Vector<uint8_t> > &secureStops); 9185c737a67e1b679251fce7f456ae79eefdc15e07Jeff Tinker status_t getSecureStop(Vector<uint8_t> const &ssid, Vector<uint8_t> &secureStop); 9234486800a022857b45c3882624449980c5cb6907Jeff Tinker status_t releaseSecureStops(Vector<uint8_t> const &ssRelease); 9385c737a67e1b679251fce7f456ae79eefdc15e07Jeff Tinker status_t releaseAllSecureStops(); 9434486800a022857b45c3882624449980c5cb6907Jeff Tinker 9534486800a022857b45c3882624449980c5cb6907Jeff Tinker status_t getPropertyString(String8 const &name, String8 &value ) const; 9634486800a022857b45c3882624449980c5cb6907Jeff Tinker status_t getPropertyByteArray(String8 const &name, 9734486800a022857b45c3882624449980c5cb6907Jeff Tinker Vector<uint8_t> &value ) const; 9834486800a022857b45c3882624449980c5cb6907Jeff Tinker 9934486800a022857b45c3882624449980c5cb6907Jeff Tinker status_t setPropertyString(String8 const &name, 10034486800a022857b45c3882624449980c5cb6907Jeff Tinker String8 const &value ); 10134486800a022857b45c3882624449980c5cb6907Jeff Tinker status_t setPropertyByteArray(String8 const &name, 10234486800a022857b45c3882624449980c5cb6907Jeff Tinker Vector<uint8_t> const &value ); 10334486800a022857b45c3882624449980c5cb6907Jeff Tinker 10434486800a022857b45c3882624449980c5cb6907Jeff Tinker status_t setCipherAlgorithm(Vector<uint8_t> const &sessionId, 10534486800a022857b45c3882624449980c5cb6907Jeff Tinker String8 const &algorithm); 10634486800a022857b45c3882624449980c5cb6907Jeff Tinker 10734486800a022857b45c3882624449980c5cb6907Jeff Tinker status_t setMacAlgorithm(Vector<uint8_t> const &sessionId, 10834486800a022857b45c3882624449980c5cb6907Jeff Tinker String8 const &algorithm); 10934486800a022857b45c3882624449980c5cb6907Jeff Tinker 11034486800a022857b45c3882624449980c5cb6907Jeff Tinker status_t encrypt(Vector<uint8_t> const &sessionId, 11134486800a022857b45c3882624449980c5cb6907Jeff Tinker Vector<uint8_t> const &keyId, 11234486800a022857b45c3882624449980c5cb6907Jeff Tinker Vector<uint8_t> const &input, 11334486800a022857b45c3882624449980c5cb6907Jeff Tinker Vector<uint8_t> const &iv, 11434486800a022857b45c3882624449980c5cb6907Jeff Tinker Vector<uint8_t> &output); 11534486800a022857b45c3882624449980c5cb6907Jeff Tinker 11634486800a022857b45c3882624449980c5cb6907Jeff Tinker status_t decrypt(Vector<uint8_t> const &sessionId, 11734486800a022857b45c3882624449980c5cb6907Jeff Tinker Vector<uint8_t> const &keyId, 11834486800a022857b45c3882624449980c5cb6907Jeff Tinker Vector<uint8_t> const &input, 11934486800a022857b45c3882624449980c5cb6907Jeff Tinker Vector<uint8_t> const &iv, 12034486800a022857b45c3882624449980c5cb6907Jeff Tinker Vector<uint8_t> &output); 12134486800a022857b45c3882624449980c5cb6907Jeff Tinker 12234486800a022857b45c3882624449980c5cb6907Jeff Tinker status_t sign(Vector<uint8_t> const &sessionId, 12334486800a022857b45c3882624449980c5cb6907Jeff Tinker Vector<uint8_t> const &keyId, 12434486800a022857b45c3882624449980c5cb6907Jeff Tinker Vector<uint8_t> const &message, 12534486800a022857b45c3882624449980c5cb6907Jeff Tinker Vector<uint8_t> &signature); 12634486800a022857b45c3882624449980c5cb6907Jeff Tinker 12734486800a022857b45c3882624449980c5cb6907Jeff Tinker status_t verify(Vector<uint8_t> const &sessionId, 12834486800a022857b45c3882624449980c5cb6907Jeff Tinker Vector<uint8_t> const &keyId, 12934486800a022857b45c3882624449980c5cb6907Jeff Tinker Vector<uint8_t> const &message, 13034486800a022857b45c3882624449980c5cb6907Jeff Tinker Vector<uint8_t> const &signature, 13134486800a022857b45c3882624449980c5cb6907Jeff Tinker bool &match); 13234486800a022857b45c3882624449980c5cb6907Jeff Tinker 13368d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker status_t signRSA(Vector<uint8_t> const &sessionId, 13468d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker String8 const &algorithm, 13568d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker Vector<uint8_t> const &message, 13668d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker Vector<uint8_t> const &wrappedKey, 13768d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker Vector<uint8_t> &signature); 13868d9d71a792deed75d32fe13febc07c9c12c8449Jeff Tinker 13934486800a022857b45c3882624449980c5cb6907Jeff Tinker private: 14034486800a022857b45c3882624449980c5cb6907Jeff Tinker String8 vectorToString(Vector<uint8_t> const &vector) const; 14134486800a022857b45c3882624449980c5cb6907Jeff Tinker String8 arrayToString(uint8_t const *array, size_t len) const; 1428c0164ca98bcc76f3656fb1078033bffd4a387deChih-Hung Hsieh String8 stringMapToString(const KeyedVector<String8, String8>& map) const; 14334486800a022857b45c3882624449980c5cb6907Jeff Tinker 14434486800a022857b45c3882624449980c5cb6907Jeff Tinker SortedVector<Vector<uint8_t> > mSessions; 14534486800a022857b45c3882624449980c5cb6907Jeff Tinker SortedVector<Vector<uint8_t> > mKeySets; 14634486800a022857b45c3882624449980c5cb6907Jeff Tinker 14734486800a022857b45c3882624449980c5cb6907Jeff Tinker static const ssize_t kNotFound = -1; 14834486800a022857b45c3882624449980c5cb6907Jeff Tinker ssize_t findSession(Vector<uint8_t> const &sessionId) const; 14934486800a022857b45c3882624449980c5cb6907Jeff Tinker ssize_t findKeySet(Vector<uint8_t> const &keySetId) const; 15034486800a022857b45c3882624449980c5cb6907Jeff Tinker 15134486800a022857b45c3882624449980c5cb6907Jeff Tinker Mutex mLock; 15234486800a022857b45c3882624449980c5cb6907Jeff Tinker KeyedVector<String8, String8> mStringProperties; 15334486800a022857b45c3882624449980c5cb6907Jeff Tinker KeyedVector<String8, Vector<uint8_t> > mByteArrayProperties; 15434486800a022857b45c3882624449980c5cb6907Jeff Tinker }; 15534486800a022857b45c3882624449980c5cb6907Jeff Tinker 15634486800a022857b45c3882624449980c5cb6907Jeff Tinker 15734486800a022857b45c3882624449980c5cb6907Jeff Tinker class MockCryptoPlugin : public CryptoPlugin { 15834486800a022857b45c3882624449980c5cb6907Jeff Tinker 15934486800a022857b45c3882624449980c5cb6907Jeff Tinker bool requiresSecureDecoderComponent(const char *mime) const; 16034486800a022857b45c3882624449980c5cb6907Jeff Tinker 16134486800a022857b45c3882624449980c5cb6907Jeff Tinker ssize_t decrypt(bool secure, 16234486800a022857b45c3882624449980c5cb6907Jeff Tinker const uint8_t key[16], const uint8_t iv[16], 16318cb1eca504817b5b144a023ae2792d90e74c9a5Jeff Tinker Mode mode, const Pattern &pattern, const void *srcPtr, 16434486800a022857b45c3882624449980c5cb6907Jeff Tinker const SubSample *subSamples, size_t numSubSamples, 16534486800a022857b45c3882624449980c5cb6907Jeff Tinker void *dstPtr, AString *errorDetailMsg); 16634486800a022857b45c3882624449980c5cb6907Jeff Tinker private: 16734486800a022857b45c3882624449980c5cb6907Jeff Tinker String8 subSamplesToString(CryptoPlugin::SubSample const *subSamples, size_t numSubSamples) const; 16834486800a022857b45c3882624449980c5cb6907Jeff Tinker String8 arrayToString(uint8_t const *array, size_t len) const; 16934486800a022857b45c3882624449980c5cb6907Jeff Tinker }; 17034486800a022857b45c3882624449980c5cb6907Jeff Tinker}; 171