/* * Copyright (C) 2013 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include <utils/Mutex.h> #include "media/drm/DrmAPI.h" #include "media/hardware/CryptoAPI.h" extern "C" { android::DrmFactory *createDrmFactory(); android::CryptoFactory *createCryptoFactory(); } namespace android { class MockDrmFactory : public DrmFactory { public: MockDrmFactory() {} virtual ~MockDrmFactory() {} bool isCryptoSchemeSupported(const uint8_t uuid[16]); bool isContentTypeSupported(const String8 &mimeType); status_t createDrmPlugin(const uint8_t uuid[16], DrmPlugin **plugin); }; class MockCryptoFactory : public CryptoFactory { public: MockCryptoFactory() {} virtual ~MockCryptoFactory() {} bool isCryptoSchemeSupported(const uint8_t uuid[16]) const; status_t createPlugin( const uint8_t uuid[16], const void *data, size_t size, CryptoPlugin **plugin); }; class MockDrmPlugin : public DrmPlugin { public: MockDrmPlugin() {} virtual ~MockDrmPlugin() {} // from DrmPlugin status_t openSession(Vector<uint8_t> &sessionId); status_t closeSession(Vector<uint8_t> const &sessionId); status_t getKeyRequest(Vector<uint8_t> const &sessionId, Vector<uint8_t> const &initData, String8 const &mimeType, KeyType keyType, KeyedVector<String8, String8> const &optionalParameters, Vector<uint8_t> &request, String8 &defaultUrl, KeyRequestType *keyRequestType); status_t provideKeyResponse(Vector<uint8_t> const &sessionId, Vector<uint8_t> const &response, Vector<uint8_t> &keySetId); status_t removeKeys(Vector<uint8_t> const &keySetId); status_t restoreKeys(Vector<uint8_t> const &sessionId, Vector<uint8_t> const &keySetId); status_t queryKeyStatus(Vector<uint8_t> const &sessionId, KeyedVector<String8, String8> &infoMap) const; status_t getProvisionRequest(String8 const &certType, String8 const &certAuthority, Vector<uint8_t> &request, String8 &defaultUrl); status_t provideProvisionResponse(Vector<uint8_t> const &response, Vector<uint8_t> &certificate, Vector<uint8_t> &wrappedKey); status_t getSecureStops(List<Vector<uint8_t> > &secureStops); status_t getSecureStop(Vector<uint8_t> const &ssid, Vector<uint8_t> &secureStop); status_t releaseSecureStops(Vector<uint8_t> const &ssRelease); status_t releaseAllSecureStops(); status_t getPropertyString(String8 const &name, String8 &value ) const; status_t getPropertyByteArray(String8 const &name, Vector<uint8_t> &value ) const; status_t setPropertyString(String8 const &name, String8 const &value ); status_t setPropertyByteArray(String8 const &name, Vector<uint8_t> const &value ); status_t setCipherAlgorithm(Vector<uint8_t> const &sessionId, String8 const &algorithm); status_t setMacAlgorithm(Vector<uint8_t> const &sessionId, String8 const &algorithm); status_t encrypt(Vector<uint8_t> const &sessionId, Vector<uint8_t> const &keyId, Vector<uint8_t> const &input, Vector<uint8_t> const &iv, Vector<uint8_t> &output); status_t decrypt(Vector<uint8_t> const &sessionId, Vector<uint8_t> const &keyId, Vector<uint8_t> const &input, Vector<uint8_t> const &iv, Vector<uint8_t> &output); status_t sign(Vector<uint8_t> const &sessionId, Vector<uint8_t> const &keyId, Vector<uint8_t> const &message, Vector<uint8_t> &signature); status_t verify(Vector<uint8_t> const &sessionId, Vector<uint8_t> const &keyId, Vector<uint8_t> const &message, Vector<uint8_t> const &signature, bool &match); status_t signRSA(Vector<uint8_t> const &sessionId, String8 const &algorithm, Vector<uint8_t> const &message, Vector<uint8_t> const &wrappedKey, Vector<uint8_t> &signature); private: String8 vectorToString(Vector<uint8_t> const &vector) const; String8 arrayToString(uint8_t const *array, size_t len) const; String8 stringMapToString(const KeyedVector<String8, String8>& map) const; SortedVector<Vector<uint8_t> > mSessions; SortedVector<Vector<uint8_t> > mKeySets; static const ssize_t kNotFound = -1; ssize_t findSession(Vector<uint8_t> const &sessionId) const; ssize_t findKeySet(Vector<uint8_t> const &keySetId) const; Mutex mLock; KeyedVector<String8, String8> mStringProperties; KeyedVector<String8, Vector<uint8_t> > mByteArrayProperties; }; class MockCryptoPlugin : public CryptoPlugin { bool requiresSecureDecoderComponent(const char *mime) const; static constexpr size_t DECRYPT_KEY_SIZE = 16; ssize_t decrypt(bool secure, const uint8_t key[DECRYPT_KEY_SIZE], const uint8_t iv[DECRYPT_KEY_SIZE], Mode mode, const Pattern &pattern, const void *srcPtr, const SubSample *subSamples, size_t numSubSamples, void *dstPtr, AString *errorDetailMsg); private: String8 subSamplesToString(CryptoPlugin::SubSample const *subSamples, size_t numSubSamples) const; String8 arrayToString(uint8_t const *array, size_t len) const; }; };