1791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang/* 2791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang * Copyright (C) 2017 The Android Open Source Project 3791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang * 4791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang * Licensed under the Apache License, Version 2.0 (the "License"); 5791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang * you may not use this file except in compliance with the License. 6791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang * You may obtain a copy of the License at 7791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang * 8791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang * http://www.apache.org/licenses/LICENSE-2.0 9791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang * 10791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang * Unless required by applicable law or agreed to in writing, software 11791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang * distributed under the License is distributed on an "AS IS" BASIS, 12791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang * See the License for the specific language governing permissions and 14791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang * limitations under the License. 15791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang */ 16791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang 17791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang#ifndef CLEARKEY_SESSION_LIBRARY_H_ 18791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang#define CLEARKEY_SESSION_LIBRARY_H_ 19791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang 20791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang#include <media/cas/CasAPI.h> 21791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang#include <media/cas/DescramblerAPI.h> 22791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang#include <openssl/aes.h> 23791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang#include <utils/KeyedVector.h> 24791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang#include <utils/Mutex.h> 25791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang#include <utils/RefBase.h> 26791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang 27791a1a206b56be8601a6fffd2614926e67d64790Chong Zhangnamespace android { 28791a1a206b56be8601a6fffd2614926e67d64790Chong Zhangstruct ABuffer; 29791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang 30791a1a206b56be8601a6fffd2614926e67d64790Chong Zhangnamespace clearkeycas { 31791a1a206b56be8601a6fffd2614926e67d64790Chong Zhangclass KeyFetcher; 32791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang 33791a1a206b56be8601a6fffd2614926e67d64790Chong Zhangclass ClearKeyCasSession : public RefBase { 34791a1a206b56be8601a6fffd2614926e67d64790Chong Zhangpublic: 35791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang ssize_t decrypt( 36791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang bool secure, 37791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang DescramblerPlugin::ScramblingControl scramblingControl, 38791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang size_t numSubSamples, 39791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang const DescramblerPlugin::SubSample *subSamples, 40791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang const void *srcPtr, 41791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang void *dstPtr, 42791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang AString * /* errorDetailMsg */); 43791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang 44791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang status_t updateECM(KeyFetcher *keyFetcher, void *ecm, size_t size); 45791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang 46791a1a206b56be8601a6fffd2614926e67d64790Chong Zhangprivate: 47791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang enum { 48791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang kNumKeys = 2, 49791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang }; 50791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang struct KeyInfo { 51791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang bool valid; 52791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang AES_KEY contentKey; 53791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang }; 54791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang sp<ABuffer> mEcmBuffer; 55791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang Mutex mKeyLock; 56a78c1cc9773532b1f9d066ed8fa0d9414c1bb8bbChong Zhang CasPlugin* mPlugin; 57791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang KeyInfo mKeyInfo[kNumKeys]; 58791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang 59791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang friend class ClearKeySessionLibrary; 60791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang 61a78c1cc9773532b1f9d066ed8fa0d9414c1bb8bbChong Zhang explicit ClearKeyCasSession(CasPlugin *plugin); 62791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang virtual ~ClearKeyCasSession(); 63a78c1cc9773532b1f9d066ed8fa0d9414c1bb8bbChong Zhang CasPlugin* getPlugin() const { return mPlugin; } 64791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang status_t decryptPayload( 65791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang const AES_KEY& key, size_t length, size_t offset, char* buffer) const; 66791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang 67791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang DISALLOW_EVIL_CONSTRUCTORS(ClearKeyCasSession); 68791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang}; 69791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang 70791a1a206b56be8601a6fffd2614926e67d64790Chong Zhangclass ClearKeySessionLibrary { 71791a1a206b56be8601a6fffd2614926e67d64790Chong Zhangpublic: 72791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang static ClearKeySessionLibrary* get(); 73791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang 74a78c1cc9773532b1f9d066ed8fa0d9414c1bb8bbChong Zhang status_t addSession(CasPlugin *plugin, CasSessionId *sessionId); 75791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang 76791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang sp<ClearKeyCasSession> findSession(const CasSessionId& sessionId); 77791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang 78791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang void destroySession(const CasSessionId& sessionId); 79791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang 80791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang void destroyPlugin(CasPlugin *plugin); 81791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang 82791a1a206b56be8601a6fffd2614926e67d64790Chong Zhangprivate: 83791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang static Mutex sSingletonLock; 84791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang static ClearKeySessionLibrary* sSingleton; 85791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang 86791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang Mutex mSessionsLock; 87791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang uint32_t mNextSessionId; 88791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang KeyedVector<CasSessionId, sp<ClearKeyCasSession>> mIDToSessionMap; 89791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang 90791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang ClearKeySessionLibrary(); 91791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang DISALLOW_EVIL_CONSTRUCTORS(ClearKeySessionLibrary); 92791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang}; 93791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang 94791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang} // namespace clearkeycas 95791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang} // namespace android 96791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang 97791a1a206b56be8601a6fffd2614926e67d64790Chong Zhang#endif // CLEARKEY_SESSION_LIBRARY_H_ 98