1e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman/* 2e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * Copyright (C) 2013 The Android Open Source Project 3e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * 4e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * Licensed under the Apache License, Version 2.0 (the "License"); 5e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * you may not use this file except in compliance with the License. 6e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * You may obtain a copy of the License at 7e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * 8e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * http://www.apache.org/licenses/LICENSE-2.0 9e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * 10e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * Unless required by applicable law or agreed to in writing, software 11e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * distributed under the License is distributed on an "AS IS" BASIS, 12e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * See the License for the specific language governing permissions and 14e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * limitations under the License. 15e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman */ 16e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 17e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#ifndef DRM_H_ 18e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 19e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#define DRM_H_ 20e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 21e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#include "SharedLibrary.h" 22e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 23e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#include <media/IDrm.h> 24e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#include <media/IDrmClient.h> 25e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#include <utils/threads.h> 26e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 27e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramannamespace android { 28e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 29e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanclass DrmFactory; 30e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanclass DrmPlugin; 31e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanstruct DrmSessionClientInterface; 32e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 33e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanstruct Drm : public BnDrm, 34e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman public IBinder::DeathRecipient, 35e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman public DrmPluginListener { 36e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman Drm(); 37e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual ~Drm(); 38e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 39e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t initCheck() const; 40e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 41e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual bool isCryptoSchemeSupported(const uint8_t uuid[16], const String8 &mimeType); 42e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 43e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t createPlugin(const uint8_t uuid[16], const String8 &appPackageName); 44e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 45e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t destroyPlugin(); 46e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 47e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t openSession(Vector<uint8_t> &sessionId); 48e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 49e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t closeSession(Vector<uint8_t> const &sessionId); 50e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 51e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t 52e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman getKeyRequest(Vector<uint8_t> const &sessionId, 53e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman Vector<uint8_t> const &initData, 54e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman String8 const &mimeType, DrmPlugin::KeyType keyType, 55e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman KeyedVector<String8, String8> const &optionalParameters, 56e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman Vector<uint8_t> &request, String8 &defaultUrl, 57e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman DrmPlugin::KeyRequestType *keyRequestType); 58e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 59e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t provideKeyResponse(Vector<uint8_t> const &sessionId, 60e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman Vector<uint8_t> const &response, 61e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman Vector<uint8_t> &keySetId); 62e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 63e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t removeKeys(Vector<uint8_t> const &keySetId); 64e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 65e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t restoreKeys(Vector<uint8_t> const &sessionId, 66e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman Vector<uint8_t> const &keySetId); 67e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 68e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t queryKeyStatus(Vector<uint8_t> const &sessionId, 69e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman KeyedVector<String8, String8> &infoMap) const; 70e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 71e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t getProvisionRequest(String8 const &certType, 72e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman String8 const &certAuthority, 73e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman Vector<uint8_t> &request, 74e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman String8 &defaulUrl); 75e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 76e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t provideProvisionResponse(Vector<uint8_t> const &response, 77e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman Vector<uint8_t> &certificate, 78e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman Vector<uint8_t> &wrappedKey); 79e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 80e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t getSecureStops(List<Vector<uint8_t> > &secureStops); 81e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t getSecureStop(Vector<uint8_t> const &ssid, Vector<uint8_t> &secureStop); 82e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 83e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t releaseSecureStops(Vector<uint8_t> const &ssRelease); 84e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t releaseAllSecureStops(); 85e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 86e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t getPropertyString(String8 const &name, String8 &value ) const; 87e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t getPropertyByteArray(String8 const &name, 88e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman Vector<uint8_t> &value ) const; 89e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t setPropertyString(String8 const &name, String8 const &value ) const; 90e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t setPropertyByteArray(String8 const &name, 91e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman Vector<uint8_t> const &value ) const; 92e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 93e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t setCipherAlgorithm(Vector<uint8_t> const &sessionId, 94e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman String8 const &algorithm); 95e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 96e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t setMacAlgorithm(Vector<uint8_t> const &sessionId, 97e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman String8 const &algorithm); 98e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 99e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t encrypt(Vector<uint8_t> const &sessionId, 100e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman Vector<uint8_t> const &keyId, 101e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman Vector<uint8_t> const &input, 102e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman Vector<uint8_t> const &iv, 103e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman Vector<uint8_t> &output); 104e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 105e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t decrypt(Vector<uint8_t> const &sessionId, 106e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman Vector<uint8_t> const &keyId, 107e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman Vector<uint8_t> const &input, 108e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman Vector<uint8_t> const &iv, 109e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman Vector<uint8_t> &output); 110e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 111e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t sign(Vector<uint8_t> const &sessionId, 112e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman Vector<uint8_t> const &keyId, 113e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman Vector<uint8_t> const &message, 114e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman Vector<uint8_t> &signature); 115e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 116e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t verify(Vector<uint8_t> const &sessionId, 117e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman Vector<uint8_t> const &keyId, 118e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman Vector<uint8_t> const &message, 119e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman Vector<uint8_t> const &signature, 120e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman bool &match); 121e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 122e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t signRSA(Vector<uint8_t> const &sessionId, 123e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman String8 const &algorithm, 124e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman Vector<uint8_t> const &message, 125e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman Vector<uint8_t> const &wrappedKey, 126e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman Vector<uint8_t> &signature); 127e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 128e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual status_t setListener(const sp<IDrmClient>& listener); 129e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 130e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual void sendEvent(DrmPlugin::EventType eventType, int extra, 131e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman Vector<uint8_t> const *sessionId, 132e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman Vector<uint8_t> const *data); 133e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 134e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual void sendExpirationUpdate(Vector<uint8_t> const *sessionId, 135e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman int64_t expiryTimeInMS); 136e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 137e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual void sendKeysChange(Vector<uint8_t> const *sessionId, 138e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman Vector<DrmPlugin::KeyStatus> const *keyStatusList, 139e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman bool hasNewUsableKey); 140e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 141e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman virtual void binderDied(const wp<IBinder> &the_late_who); 142e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 143e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanprivate: 144e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman static Mutex mLock; 145e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 146e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman status_t mInitCheck; 147e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 148e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman sp<DrmSessionClientInterface> mDrmSessionClient; 149e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 150e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman sp<IDrmClient> mListener; 151e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman mutable Mutex mEventLock; 152e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman mutable Mutex mNotifyLock; 153e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 154e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman sp<SharedLibrary> mLibrary; 155e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman DrmFactory *mFactory; 156e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman DrmPlugin *mPlugin; 157e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 158e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman static KeyedVector<Vector<uint8_t>, String8> mUUIDToLibraryPathMap; 159e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman static KeyedVector<String8, wp<SharedLibrary> > mLibraryPathToOpenLibraryMap; 160e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman static Mutex mMapLock; 161e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 162e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman void findFactoryForScheme(const uint8_t uuid[16]); 163e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman bool loadLibraryForScheme(const String8 &path, const uint8_t uuid[16]); 164e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman void closeFactory(); 165e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman void writeByteArray(Parcel &obj, Vector<uint8_t> const *array); 166e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 167e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman DISALLOW_EVIL_CONSTRUCTORS(Drm); 168e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman}; 169e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 170e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman} // namespace android 171e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 172e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#endif // CRYPTO_H_ 173