// // Copyright 2013 Google Inc. All Rights Reserved. // #ifndef WV_DRM_PLUGIN_H_ #define WV_DRM_PLUGIN_H_ #include #include "media/drm/DrmAPI.h" #include "media/stagefright/foundation/ABase.h" #include "media/stagefright/foundation/AString.h" #include "OEMCryptoCENC.h" #include "utils/Errors.h" #include "utils/KeyedVector.h" #include "utils/List.h" #include "utils/String8.h" #include "utils/Vector.h" #include "wv_cdm_event_listener.h" #include "wv_content_decryption_module.h" #include "WVGenericCryptoInterface.h" namespace wvdrm { using android::KeyedVector; using android::List; using android::status_t; using android::String8; using android::Vector; using std::map; using wvcdm::CdmEventType; using wvcdm::CdmSessionId; using wvcdm::CdmResponseType; using wvcdm::WvContentDecryptionModule; const OEMCrypto_Algorithm kInvalidCrytpoAlgorithm = static_cast(-1); class WVDrmPlugin : public android::DrmPlugin, public wvcdm::WvCdmEventListener { public: WVDrmPlugin(WvContentDecryptionModule* cdm, WVGenericCryptoInterface* crypto); virtual ~WVDrmPlugin(); virtual status_t openSession(Vector& sessionId); virtual status_t closeSession(const Vector& sessionId); virtual status_t getKeyRequest( const Vector& sessionId, const Vector& initData, const String8& mimeType, KeyType keyType, const KeyedVector& optionalParameters, Vector& request, String8& defaultUrl); virtual status_t provideKeyResponse(const Vector& sessionId, const Vector& response, Vector& keySetId); virtual status_t removeKeys(const Vector& keySetId); virtual status_t restoreKeys(const Vector& sessionId, const Vector& keySetId); virtual status_t queryKeyStatus( const Vector& sessionId, KeyedVector& infoMap) const; virtual status_t getProvisionRequest(Vector& request, String8& defaultUrl); virtual status_t provideProvisionResponse(const Vector& response); virtual status_t getSecureStops(List >& secureStops); virtual status_t releaseSecureStops(const Vector& ssRelease); virtual status_t getPropertyString(const String8& name, String8& value) const; virtual status_t getPropertyByteArray(const String8& name, Vector& value) const; virtual status_t setPropertyString(const String8& name, const String8& value); virtual status_t setPropertyByteArray(const String8& name, const Vector& value); virtual status_t setCipherAlgorithm(const Vector& sessionId, const String8& algorithm); virtual status_t setMacAlgorithm(const Vector& sessionId, const String8& algorithm); virtual status_t encrypt(const Vector& sessionId, const Vector& keyId, const Vector& input, const Vector& iv, Vector& output); virtual status_t decrypt(const Vector& sessionId, const Vector& keyId, const Vector& input, const Vector& iv, Vector& output); virtual status_t sign(const Vector& sessionId, const Vector& keyId, const Vector& message, Vector& signature); virtual status_t verify(const Vector& sessionId, const Vector& keyId, const Vector& message, const Vector& signature, bool& match); virtual void onEvent(const CdmSessionId& cdmSessionId, CdmEventType cdmEventType); private: DISALLOW_EVIL_CONSTRUCTORS(WVDrmPlugin); struct CryptoSession { public: CryptoSession() : mOecSessionId(-1), mCipherAlgorithm(kInvalidCrytpoAlgorithm), mMacAlgorithm(kInvalidCrytpoAlgorithm) {} CryptoSession(OEMCrypto_SESSION sessionId) : mOecSessionId(sessionId), mCipherAlgorithm(kInvalidCrytpoAlgorithm), mMacAlgorithm(kInvalidCrytpoAlgorithm) {} OEMCrypto_SESSION oecSessionId() const { return mOecSessionId; } OEMCrypto_Algorithm cipherAlgorithm() const { return mCipherAlgorithm; } void setCipherAlgorithm(OEMCrypto_Algorithm newAlgorithm) { mCipherAlgorithm = newAlgorithm; } OEMCrypto_Algorithm macAlgorithm() const { return mMacAlgorithm; } void setMacAlgorithm(OEMCrypto_Algorithm newAlgorithm) { mMacAlgorithm = newAlgorithm; } private: OEMCrypto_SESSION mOecSessionId; OEMCrypto_Algorithm mCipherAlgorithm; OEMCrypto_Algorithm mMacAlgorithm; }; WvContentDecryptionModule* mCDM; WVGenericCryptoInterface* mCrypto; map mCryptoSessions; }; } // namespace wvdrm #endif // WV_DRM_PLUGIN_H_