127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi/*
227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * Copyright (C) 2010 The Android Open Source Project
327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi *
427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * Licensed under the Apache License, Version 2.0 (the "License");
527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * you may not use this file except in compliance with the License.
627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * You may obtain a copy of the License at
727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi *
827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi *      http://www.apache.org/licenses/LICENSE-2.0
927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi *
1027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * Unless required by applicable law or agreed to in writing, software
1127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * distributed under the License is distributed on an "AS IS" BASIS,
1227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * See the License for the specific language governing permissions and
1427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * limitations under the License.
1527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi */
1627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
1727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#ifndef __DRM_MANAGER_SERVICE_H__
1827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#define __DRM_MANAGER_SERVICE_H__
1927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
2027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <utils/RefBase.h>
2127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <utils/KeyedVector.h>
2227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <binder/IInterface.h>
2327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <binder/Parcel.h>
2427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include "IDrmManagerService.h"
2527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include "IDrmServiceListener.h"
2627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
2727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshinamespace android {
2827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
2927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiclass DrmManager;
3027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiclass String8;
3127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiclass Mutex;
3227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
3327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi/**
3427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * This is the implementation class for DRM manager service. This delegates
3527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * the responsibility to DrmManager.
3627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi *
3727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * The instance of this class is created while starting the DRM manager service.
3827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi *
3927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi */
4027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiclass DrmManagerService : public BnDrmManagerService {
4127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshipublic:
4227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    static void instantiate();
4327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
4427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiprivate:
45f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn    enum drm_perm_t {
46f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn        CONSUME_RIGHTS          = 0,
47f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn        SET_PLAYBACK_STATUS     = 1,
48f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn        OPEN_DECRYPT_SESSION    = 2,
49f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn        CLOSE_DECRYPT_SESSION   = 3,
50f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn        INITIALIZE_DECRYPT_UNIT = 4,
51f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn        DECRYPT                 = 5,
52f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn        FINALIZE_DECRYPT_UNIT   = 6,
53f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn        PREAD                   = 7,
54f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn    };
55f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn
56f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn    static const char *const drm_perm_labels[];
57f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn
5827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    DrmManagerService();
5927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    virtual ~DrmManagerService();
6027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
61f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn    static const char *get_perm_label(drm_perm_t perm);
62f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn
63f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn    static bool selinuxIsProtectedCallAllowed(pid_t spid, drm_perm_t perm);
64f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn
65f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn    static bool isProtectedCallAllowed(drm_perm_t perm);
66f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn
6727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshipublic:
688f00151cbe693d52f3e233757c57fab3b6396d21Gloria Wang    int addUniqueId(bool isNative);
692272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi
702272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    void removeUniqueId(int uniqueId);
712272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi
72e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    void addClient(int uniqueId);
7327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
74e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    void removeClient(int uniqueId);
7527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
7627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    status_t setDrmServiceListener(
7727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, const sp<IDrmServiceListener>& drmServiceListener);
7827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
7927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    DrmConstraints* getConstraints(int uniqueId, const String8* path, const int action);
8027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
813473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    DrmMetadata* getMetadata(int uniqueId, const String8* path);
823473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi
8327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    bool canHandle(int uniqueId, const String8& path, const String8& mimeType);
8427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
8527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    DrmInfoStatus* processDrmInfo(int uniqueId, const DrmInfo* drmInfo);
8627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
8727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    DrmInfo* acquireDrmInfo(int uniqueId, const DrmInfoRequest* drmInforequest);
8827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
892272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    status_t saveRights(int uniqueId, const DrmRights& drmRights,
9027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const String8& rightsPath, const String8& contentPath);
9127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
92bf5b3b29e31b293313788d7464cfb258ac0da803James Dong    String8 getOriginalMimeType(int uniqueId, const String8& path, int fd);
9327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
9427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    int getDrmObjectType(int uniqueId, const String8& path, const String8& mimeType);
9527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
9627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    int checkRightsStatus(int uniqueId, const String8& path,int action);
9727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
982272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    status_t consumeRights(int uniqueId, DecryptHandle* decryptHandle, int action, bool reserve);
9927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
1002272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    status_t setPlaybackStatus(
101a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang            int uniqueId, DecryptHandle* decryptHandle, int playbackStatus, int64_t position);
10227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
10327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    bool validateAction(int uniqueId, const String8& path,
10427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int action, const ActionDescription& description);
10527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
1062272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    status_t removeRights(int uniqueId, const String8& path);
10727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
1082272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    status_t removeAllRights(int uniqueId);
10927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
11027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    int openConvertSession(int uniqueId, const String8& mimeType);
11127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
11227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    DrmConvertedStatus* convertData(int uniqueId, int convertId, const DrmBuffer* inputData);
11327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
11427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    DrmConvertedStatus* closeConvertSession(int uniqueId, int convertId);
11527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
11627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    status_t getAllSupportInfo(int uniqueId, int* length, DrmSupportInfo** drmSupportInfoArray);
11727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
1189d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong    DecryptHandle* openDecryptSession(
1199d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong        int uniqueId, int fd, off64_t offset, off64_t length, const char *mime);
12027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
1219d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong    DecryptHandle* openDecryptSession(
1229d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong        int uniqueId, const char* uri, const char* mime);
123e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi
124cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi    DecryptHandle* openDecryptSession(int uniqueId, const DrmBuffer& buf,
125cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi            const String8& mimeType);
126cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi
1272272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    status_t closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle);
12827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
1292272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    status_t initializeDecryptUnit(int uniqueId, DecryptHandle* decryptHandle,
13027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int decryptUnitId, const DrmBuffer* headerInfo);
13127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
1322272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    status_t decrypt(int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId,
1332272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi            const DrmBuffer* encBuffer, DrmBuffer** decBuffer, DrmBuffer* IV);
13427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
1352272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    status_t finalizeDecryptUnit(int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId);
13627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
13727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    ssize_t pread(int uniqueId, DecryptHandle* decryptHandle,
138a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang            void* buffer, ssize_t numBytes, off64_t offset);
13927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
1408635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong    virtual status_t dump(int fd, const Vector<String16>& args);
1418635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong
14227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiprivate:
14327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    DrmManager* mDrmManager;
14427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi};
14527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
14627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi};
14727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
14827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#endif /* __DRM_MANAGER_SERVICE_H__ */
14927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
150