1/* 2 * Copyright (C) 2017 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#ifndef CLEARKEY_CAS_PLUGIN_H_ 18#define CLEARKEY_CAS_PLUGIN_H_ 19 20#include <media/cas/CasAPI.h> 21#include <media/cas/DescramblerAPI.h> 22#include <utils/Mutex.h> 23#include <utils/StrongPointer.h> 24 25extern "C" { 26 android::CasFactory *createCasFactory(); 27 android::DescramblerFactory *createDescramblerFactory(); 28} 29 30namespace android { 31namespace clearkeycas { 32 33class KeyFetcher; 34class ClearKeyCasSession; 35 36class ClearKeyCasFactory : public CasFactory { 37public: 38 ClearKeyCasFactory() {} 39 virtual ~ClearKeyCasFactory() {} 40 41 virtual bool isSystemIdSupported( 42 int32_t CA_system_id) const override; 43 virtual status_t queryPlugins( 44 std::vector<CasPluginDescriptor> *descriptors) const override; 45 virtual status_t createPlugin( 46 int32_t CA_system_id, 47 uint64_t appData, 48 CasPluginCallback callback, 49 CasPlugin **plugin) override; 50}; 51 52class ClearKeyDescramblerFactory : public DescramblerFactory { 53public: 54 ClearKeyDescramblerFactory() {} 55 virtual ~ClearKeyDescramblerFactory() {} 56 57 virtual bool isSystemIdSupported( 58 int32_t CA_system_id) const override; 59 virtual status_t createPlugin( 60 int32_t CA_system_id, DescramblerPlugin **plugin) override; 61}; 62 63class ClearKeyCasPlugin : public CasPlugin { 64public: 65 ClearKeyCasPlugin(uint64_t appData, CasPluginCallback callback); 66 virtual ~ClearKeyCasPlugin(); 67 68 virtual status_t setPrivateData( 69 const CasData &data) override; 70 71 virtual status_t openSession(CasSessionId *sessionId) override; 72 73 virtual status_t closeSession( 74 const CasSessionId &sessionId) override; 75 76 virtual status_t setSessionPrivateData( 77 const CasSessionId &sessionId, 78 const CasData &data) override; 79 80 virtual status_t processEcm( 81 const CasSessionId &sessionId, const CasEcm &ecm) override; 82 83 virtual status_t processEmm(const CasEmm &emm) override; 84 85 virtual status_t sendEvent( 86 int32_t event, int32_t arg, const CasData &eventData) override; 87 88 virtual status_t provision(const String8 &str) override; 89 90 virtual status_t refreshEntitlements( 91 int32_t refreshType, const CasData &refreshData) override; 92 93private: 94 Mutex mKeyFetcherLock; 95 std::unique_ptr<KeyFetcher> mKeyFetcher; 96 CasPluginCallback mCallback; 97 uint64_t mAppData; 98}; 99 100class ClearKeyDescramblerPlugin : public DescramblerPlugin { 101public: 102 ClearKeyDescramblerPlugin() {} 103 virtual ~ClearKeyDescramblerPlugin() {}; 104 105 virtual bool requiresSecureDecoderComponent( 106 const char *mime) const override; 107 108 virtual status_t setMediaCasSession( 109 const CasSessionId &sessionId) override; 110 111 virtual ssize_t descramble( 112 bool secure, 113 ScramblingControl scramblingControl, 114 size_t numSubSamples, 115 const SubSample *subSamples, 116 const void *srcPtr, 117 int32_t srcOffset, 118 void *dstPtr, 119 int32_t dstOffset, 120 AString *errorDetailMsg) override; 121 122private: 123 sp<ClearKeyCasSession> mCASSession; 124 125 String8 subSamplesToString( 126 SubSample const *subSamples, 127 size_t numSubSamples) const; 128 String8 arrayToString(uint8_t const *array, size_t len) const; 129}; 130 131} // namespace clearkeycas 132} // namespace android 133 134#endif // CLEARKEY_CAS_PLUGIN_H_ 135