1*ec779b8eSAndroid Build Coastguard Worker /* 2*ec779b8eSAndroid Build Coastguard Worker * Copyright (C) 2010 The Android Open Source Project 3*ec779b8eSAndroid Build Coastguard Worker * 4*ec779b8eSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*ec779b8eSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*ec779b8eSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*ec779b8eSAndroid Build Coastguard Worker * 8*ec779b8eSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*ec779b8eSAndroid Build Coastguard Worker * 10*ec779b8eSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*ec779b8eSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*ec779b8eSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*ec779b8eSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*ec779b8eSAndroid Build Coastguard Worker * limitations under the License. 15*ec779b8eSAndroid Build Coastguard Worker */ 16*ec779b8eSAndroid Build Coastguard Worker 17*ec779b8eSAndroid Build Coastguard Worker #ifndef __DRM_MANAGER_SERVICE_H__ 18*ec779b8eSAndroid Build Coastguard Worker #define __DRM_MANAGER_SERVICE_H__ 19*ec779b8eSAndroid Build Coastguard Worker 20*ec779b8eSAndroid Build Coastguard Worker #include <utils/RefBase.h> 21*ec779b8eSAndroid Build Coastguard Worker #include <utils/KeyedVector.h> 22*ec779b8eSAndroid Build Coastguard Worker #include <binder/IInterface.h> 23*ec779b8eSAndroid Build Coastguard Worker #include <binder/Parcel.h> 24*ec779b8eSAndroid Build Coastguard Worker #include "IDrmManagerService.h" 25*ec779b8eSAndroid Build Coastguard Worker #include "IDrmServiceListener.h" 26*ec779b8eSAndroid Build Coastguard Worker 27*ec779b8eSAndroid Build Coastguard Worker namespace android { 28*ec779b8eSAndroid Build Coastguard Worker 29*ec779b8eSAndroid Build Coastguard Worker class DrmManager; 30*ec779b8eSAndroid Build Coastguard Worker class String8; 31*ec779b8eSAndroid Build Coastguard Worker class Mutex; 32*ec779b8eSAndroid Build Coastguard Worker 33*ec779b8eSAndroid Build Coastguard Worker /** 34*ec779b8eSAndroid Build Coastguard Worker * This is the implementation class for DRM manager service. This delegates 35*ec779b8eSAndroid Build Coastguard Worker * the responsibility to DrmManager. 36*ec779b8eSAndroid Build Coastguard Worker * 37*ec779b8eSAndroid Build Coastguard Worker * The instance of this class is created while starting the DRM manager service. 38*ec779b8eSAndroid Build Coastguard Worker * 39*ec779b8eSAndroid Build Coastguard Worker */ 40*ec779b8eSAndroid Build Coastguard Worker class DrmManagerService : public BnDrmManagerService { 41*ec779b8eSAndroid Build Coastguard Worker public: 42*ec779b8eSAndroid Build Coastguard Worker static void instantiate(); 43*ec779b8eSAndroid Build Coastguard Worker 44*ec779b8eSAndroid Build Coastguard Worker private: 45*ec779b8eSAndroid Build Coastguard Worker enum drm_perm_t { 46*ec779b8eSAndroid Build Coastguard Worker CONSUME_RIGHTS = 0, 47*ec779b8eSAndroid Build Coastguard Worker SET_PLAYBACK_STATUS = 1, 48*ec779b8eSAndroid Build Coastguard Worker OPEN_DECRYPT_SESSION = 2, 49*ec779b8eSAndroid Build Coastguard Worker CLOSE_DECRYPT_SESSION = 3, 50*ec779b8eSAndroid Build Coastguard Worker INITIALIZE_DECRYPT_UNIT = 4, 51*ec779b8eSAndroid Build Coastguard Worker DECRYPT = 5, 52*ec779b8eSAndroid Build Coastguard Worker FINALIZE_DECRYPT_UNIT = 6, 53*ec779b8eSAndroid Build Coastguard Worker PREAD = 7, 54*ec779b8eSAndroid Build Coastguard Worker }; 55*ec779b8eSAndroid Build Coastguard Worker 56*ec779b8eSAndroid Build Coastguard Worker static const char *const drm_perm_labels[]; 57*ec779b8eSAndroid Build Coastguard Worker 58*ec779b8eSAndroid Build Coastguard Worker DrmManagerService(); 59*ec779b8eSAndroid Build Coastguard Worker virtual ~DrmManagerService(); 60*ec779b8eSAndroid Build Coastguard Worker 61*ec779b8eSAndroid Build Coastguard Worker static const char *get_perm_label(drm_perm_t perm); 62*ec779b8eSAndroid Build Coastguard Worker 63*ec779b8eSAndroid Build Coastguard Worker static bool selinuxIsProtectedCallAllowed(pid_t spid, const char* ssid, drm_perm_t perm); 64*ec779b8eSAndroid Build Coastguard Worker 65*ec779b8eSAndroid Build Coastguard Worker static bool isProtectedCallAllowed(drm_perm_t perm); 66*ec779b8eSAndroid Build Coastguard Worker 67*ec779b8eSAndroid Build Coastguard Worker public: 68*ec779b8eSAndroid Build Coastguard Worker int addUniqueId(bool isNative); 69*ec779b8eSAndroid Build Coastguard Worker 70*ec779b8eSAndroid Build Coastguard Worker void removeUniqueId(int uniqueId); 71*ec779b8eSAndroid Build Coastguard Worker 72*ec779b8eSAndroid Build Coastguard Worker void addClient(int uniqueId); 73*ec779b8eSAndroid Build Coastguard Worker 74*ec779b8eSAndroid Build Coastguard Worker void removeClient(int uniqueId); 75*ec779b8eSAndroid Build Coastguard Worker 76*ec779b8eSAndroid Build Coastguard Worker status_t setDrmServiceListener( 77*ec779b8eSAndroid Build Coastguard Worker int uniqueId, const sp<IDrmServiceListener>& drmServiceListener); 78*ec779b8eSAndroid Build Coastguard Worker 79*ec779b8eSAndroid Build Coastguard Worker DrmConstraints* getConstraints(int uniqueId, const String8* path, const int action); 80*ec779b8eSAndroid Build Coastguard Worker 81*ec779b8eSAndroid Build Coastguard Worker DrmMetadata* getMetadata(int uniqueId, const String8* path); 82*ec779b8eSAndroid Build Coastguard Worker 83*ec779b8eSAndroid Build Coastguard Worker bool canHandle(int uniqueId, const String8& path, const String8& mimeType); 84*ec779b8eSAndroid Build Coastguard Worker 85*ec779b8eSAndroid Build Coastguard Worker DrmInfoStatus* processDrmInfo(int uniqueId, const DrmInfo* drmInfo); 86*ec779b8eSAndroid Build Coastguard Worker 87*ec779b8eSAndroid Build Coastguard Worker DrmInfo* acquireDrmInfo(int uniqueId, const DrmInfoRequest* drmInforequest); 88*ec779b8eSAndroid Build Coastguard Worker 89*ec779b8eSAndroid Build Coastguard Worker status_t saveRights(int uniqueId, const DrmRights& drmRights, 90*ec779b8eSAndroid Build Coastguard Worker const String8& rightsPath, const String8& contentPath); 91*ec779b8eSAndroid Build Coastguard Worker 92*ec779b8eSAndroid Build Coastguard Worker String8 getOriginalMimeType(int uniqueId, const String8& path, int fd); 93*ec779b8eSAndroid Build Coastguard Worker 94*ec779b8eSAndroid Build Coastguard Worker int getDrmObjectType(int uniqueId, const String8& path, const String8& mimeType); 95*ec779b8eSAndroid Build Coastguard Worker 96*ec779b8eSAndroid Build Coastguard Worker int checkRightsStatus(int uniqueId, const String8& path,int action); 97*ec779b8eSAndroid Build Coastguard Worker 98*ec779b8eSAndroid Build Coastguard Worker status_t consumeRights(int uniqueId, sp<DecryptHandle>& decryptHandle, int action, 99*ec779b8eSAndroid Build Coastguard Worker bool reserve); 100*ec779b8eSAndroid Build Coastguard Worker 101*ec779b8eSAndroid Build Coastguard Worker status_t setPlaybackStatus( 102*ec779b8eSAndroid Build Coastguard Worker int uniqueId, sp<DecryptHandle>& decryptHandle, int playbackStatus, int64_t position); 103*ec779b8eSAndroid Build Coastguard Worker 104*ec779b8eSAndroid Build Coastguard Worker bool validateAction(int uniqueId, const String8& path, 105*ec779b8eSAndroid Build Coastguard Worker int action, const ActionDescription& description); 106*ec779b8eSAndroid Build Coastguard Worker 107*ec779b8eSAndroid Build Coastguard Worker status_t removeRights(int uniqueId, const String8& path); 108*ec779b8eSAndroid Build Coastguard Worker 109*ec779b8eSAndroid Build Coastguard Worker status_t removeAllRights(int uniqueId); 110*ec779b8eSAndroid Build Coastguard Worker 111*ec779b8eSAndroid Build Coastguard Worker int openConvertSession(int uniqueId, const String8& mimeType); 112*ec779b8eSAndroid Build Coastguard Worker 113*ec779b8eSAndroid Build Coastguard Worker DrmConvertedStatus* convertData(int uniqueId, int convertId, const DrmBuffer* inputData); 114*ec779b8eSAndroid Build Coastguard Worker 115*ec779b8eSAndroid Build Coastguard Worker DrmConvertedStatus* closeConvertSession(int uniqueId, int convertId); 116*ec779b8eSAndroid Build Coastguard Worker 117*ec779b8eSAndroid Build Coastguard Worker status_t getAllSupportInfo(int uniqueId, int* length, DrmSupportInfo** drmSupportInfoArray); 118*ec779b8eSAndroid Build Coastguard Worker 119*ec779b8eSAndroid Build Coastguard Worker sp<DecryptHandle> openDecryptSession( 120*ec779b8eSAndroid Build Coastguard Worker int uniqueId, int fd, off64_t offset, off64_t length, const char *mime); 121*ec779b8eSAndroid Build Coastguard Worker 122*ec779b8eSAndroid Build Coastguard Worker sp<DecryptHandle> openDecryptSession( 123*ec779b8eSAndroid Build Coastguard Worker int uniqueId, const char* uri, const char* mime); 124*ec779b8eSAndroid Build Coastguard Worker 125*ec779b8eSAndroid Build Coastguard Worker sp<DecryptHandle> openDecryptSession(int uniqueId, const DrmBuffer& buf, 126*ec779b8eSAndroid Build Coastguard Worker const String8& mimeType); 127*ec779b8eSAndroid Build Coastguard Worker 128*ec779b8eSAndroid Build Coastguard Worker status_t closeDecryptSession(int uniqueId, sp<DecryptHandle>& decryptHandle); 129*ec779b8eSAndroid Build Coastguard Worker 130*ec779b8eSAndroid Build Coastguard Worker status_t initializeDecryptUnit(int uniqueId, sp<DecryptHandle>& decryptHandle, 131*ec779b8eSAndroid Build Coastguard Worker int decryptUnitId, const DrmBuffer* headerInfo); 132*ec779b8eSAndroid Build Coastguard Worker 133*ec779b8eSAndroid Build Coastguard Worker status_t decrypt(int uniqueId, sp<DecryptHandle>& decryptHandle, int decryptUnitId, 134*ec779b8eSAndroid Build Coastguard Worker const DrmBuffer* encBuffer, DrmBuffer** decBuffer, DrmBuffer* IV); 135*ec779b8eSAndroid Build Coastguard Worker 136*ec779b8eSAndroid Build Coastguard Worker status_t finalizeDecryptUnit(int uniqueId, sp<DecryptHandle>& decryptHandle, 137*ec779b8eSAndroid Build Coastguard Worker int decryptUnitId); 138*ec779b8eSAndroid Build Coastguard Worker 139*ec779b8eSAndroid Build Coastguard Worker ssize_t pread(int uniqueId, sp<DecryptHandle>& decryptHandle, 140*ec779b8eSAndroid Build Coastguard Worker void* buffer, ssize_t numBytes, off64_t offset); 141*ec779b8eSAndroid Build Coastguard Worker 142*ec779b8eSAndroid Build Coastguard Worker virtual status_t dump(int fd, const Vector<String16>& args); 143*ec779b8eSAndroid Build Coastguard Worker 144*ec779b8eSAndroid Build Coastguard Worker friend class DrmManagerServiceFuzzer; 145*ec779b8eSAndroid Build Coastguard Worker 146*ec779b8eSAndroid Build Coastguard Worker private: 147*ec779b8eSAndroid Build Coastguard Worker sp<DrmManager> mDrmManager; 148*ec779b8eSAndroid Build Coastguard Worker }; 149*ec779b8eSAndroid Build Coastguard Worker 150*ec779b8eSAndroid Build Coastguard Worker }; 151*ec779b8eSAndroid Build Coastguard Worker 152*ec779b8eSAndroid Build Coastguard Worker #endif /* __DRM_MANAGER_SERVICE_H__ */ 153*ec779b8eSAndroid Build Coastguard Worker 154