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
172272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi//#define LOG_NDEBUG 0
1827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#define LOG_TAG "DrmManagerService(Native)"
1927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <utils/Log.h>
2027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
213473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi#include <private/android_filesystem_config.h>
228635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong#include <media/MemoryLeakTrackUtil.h>
233473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi
2427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <errno.h>
2527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <utils/threads.h>
2627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <binder/IServiceManager.h>
273473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi#include <binder/IPCThreadState.h>
2827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <sys/stat.h>
2927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include "DrmManagerService.h"
3027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include "DrmManager.h"
3127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
32f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn#include <selinux/android.h>
33f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn
3427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiusing namespace android;
3527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
36f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahnstatic int selinux_enabled;
37f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahnstatic char *drmserver_context;
383473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimistatic Vector<uid_t> trustedUids;
393473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi
40f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahnconst char *const DrmManagerService::drm_perm_labels[] = {
41f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn    "consumeRights",
42f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn    "setPlaybackStatus",
43f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn    "openDecryptSession",
44f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn    "closeDecryptSession",
45f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn    "initializeDecryptUnit",
46f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn    "decrypt",
47f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn    "finalizeDecryptUnit",
48f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn    "pread"
49f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn};
50f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn
51f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahnconst char *DrmManagerService::get_perm_label(drm_perm_t perm) {
52f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn    unsigned int index = perm;
53f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn
54c903684e9a8af5450bab61b0883fc81c5a466844Aurimas Liutikas    if (index >= (sizeof(drm_perm_labels) / sizeof(drm_perm_labels[0]))) {
55f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn        ALOGE("SELinux: Failed to retrieve permission label(perm=%d).\n", perm);
56f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn        abort();
57f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn    }
58f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn    return drm_perm_labels[index];
59f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn}
60f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn
61f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahnbool DrmManagerService::selinuxIsProtectedCallAllowed(pid_t spid, drm_perm_t perm) {
62f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn    if (selinux_enabled <= 0) {
63f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn        return true;
64f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn    }
65f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn
66f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn    char *sctx;
67f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn    const char *selinux_class = "drmservice";
68f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn    const char *str_perm = get_perm_label(perm);
69f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn
70f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn    if (getpidcon(spid, &sctx) != 0) {
71f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn        ALOGE("SELinux: getpidcon(pid=%d) failed.\n", spid);
72f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn        return false;
73f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn    }
74f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn
75f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn    bool allowed = (selinux_check_access(sctx, drmserver_context, selinux_class,
76f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn            str_perm, NULL) == 0);
77f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn    freecon(sctx);
78f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn
79f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn    return allowed;
80f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn}
81f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn
82f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahnbool DrmManagerService::isProtectedCallAllowed(drm_perm_t perm) {
836868e986044a23cd3592f03b3937978175ebad53Jeff Tinker    // TODO
846868e986044a23cd3592f03b3937978175ebad53Jeff Tinker    // Following implementation is just for reference.
856868e986044a23cd3592f03b3937978175ebad53Jeff Tinker    // Each OEM manufacturer should implement/replace with their own solutions.
866868e986044a23cd3592f03b3937978175ebad53Jeff Tinker    IPCThreadState* ipcState = IPCThreadState::self();
876868e986044a23cd3592f03b3937978175ebad53Jeff Tinker    uid_t uid = ipcState->getCallingUid();
88f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn    pid_t spid = ipcState->getCallingPid();
896868e986044a23cd3592f03b3937978175ebad53Jeff Tinker
906868e986044a23cd3592f03b3937978175ebad53Jeff Tinker    for (unsigned int i = 0; i < trustedUids.size(); ++i) {
916868e986044a23cd3592f03b3937978175ebad53Jeff Tinker        if (trustedUids[i] == uid) {
92f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn            return selinuxIsProtectedCallAllowed(spid, perm);
936868e986044a23cd3592f03b3937978175ebad53Jeff Tinker        }
946868e986044a23cd3592f03b3937978175ebad53Jeff Tinker    }
956868e986044a23cd3592f03b3937978175ebad53Jeff Tinker    return false;
963473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi}
973473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi
9827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshivoid DrmManagerService::instantiate() {
993856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("instantiate");
100e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    defaultServiceManager()->addService(String16("drm.drmManager"), new DrmManagerService());
1013473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi
1023473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    if (0 >= trustedUids.size()) {
1033473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        // TODO
1043473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        // Following implementation is just for reference.
1053473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        // Each OEM manufacturer should implement/replace with their own solutions.
1063473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi
1073473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        // Add trusted uids here
1083473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        trustedUids.push(AID_MEDIA);
1093473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    }
110f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn
111f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn    selinux_enabled = is_selinux_enabled();
112f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn    if (selinux_enabled > 0 && getcon(&drmserver_context) != 0) {
113f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn        ALOGE("SELinux: DrmManagerService failed to get context for DrmManagerService. Aborting.\n");
114f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn        abort();
115f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn    }
116f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn
117f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn    union selinux_callback cb;
118f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn    cb.func_log = selinux_log_callback;
119f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn    selinux_set_callback(SELINUX_CB_LOG, cb);
12027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
12127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
122e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi AimiDrmManagerService::DrmManagerService() :
123e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        mDrmManager(NULL) {
1243856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("created");
12527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    mDrmManager = new DrmManager();
126e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    mDrmManager->loadPlugIns();
12727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
12827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
12927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmManagerService::~DrmManagerService() {
1303856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Destroyed");
131e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    mDrmManager->unloadPlugIns();
13227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    delete mDrmManager; mDrmManager = NULL;
13327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
13427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
1358f00151cbe693d52f3e233757c57fab3b6396d21Gloria Wangint DrmManagerService::addUniqueId(bool isNative) {
1368f00151cbe693d52f3e233757c57fab3b6396d21Gloria Wang    return mDrmManager->addUniqueId(isNative);
1372272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi}
1382272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi
1392272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimivoid DrmManagerService::removeUniqueId(int uniqueId) {
1402272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    mDrmManager->removeUniqueId(uniqueId);
1412272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi}
1422272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi
143e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimivoid DrmManagerService::addClient(int uniqueId) {
144e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    mDrmManager->addClient(uniqueId);
14527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
14627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
147e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimivoid DrmManagerService::removeClient(int uniqueId) {
148e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    mDrmManager->removeClient(uniqueId);
14927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
15027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
15127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t DrmManagerService::setDrmServiceListener(
15227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, const sp<IDrmServiceListener>& drmServiceListener) {
1533856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Entering setDrmServiceListener");
15427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    mDrmManager->setDrmServiceListener(uniqueId, drmServiceListener);
15527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return DRM_NO_ERROR;
15627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
15727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
15827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmConstraints* DrmManagerService::getConstraints(
15927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, const String8* path, const int action) {
1603856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Entering getConstraints from content");
16127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return mDrmManager->getConstraints(uniqueId, path, action);
16227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
16327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
1643473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi AimiDrmMetadata* DrmManagerService::getMetadata(int uniqueId, const String8* path) {
1653856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Entering getMetadata from content");
1663473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    return mDrmManager->getMetadata(uniqueId, path);
1673473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi}
1683473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi
16927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshibool DrmManagerService::canHandle(int uniqueId, const String8& path, const String8& mimeType) {
1703856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Entering canHandle");
17127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return mDrmManager->canHandle(uniqueId, path, mimeType);
17227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
17327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
17427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmInfoStatus* DrmManagerService::processDrmInfo(int uniqueId, const DrmInfo* drmInfo) {
1753856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Entering processDrmInfo");
17627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return mDrmManager->processDrmInfo(uniqueId, drmInfo);
17727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
17827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
17927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmInfo* DrmManagerService::acquireDrmInfo(int uniqueId, const DrmInfoRequest* drmInfoRequest) {
1803856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Entering acquireDrmInfo");
18127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return mDrmManager->acquireDrmInfo(uniqueId, drmInfoRequest);
18227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
18327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
1842272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t DrmManagerService::saveRights(
18527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, const DrmRights& drmRights,
18627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const String8& rightsPath, const String8& contentPath) {
1873856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Entering saveRights");
18827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return mDrmManager->saveRights(uniqueId, drmRights, rightsPath, contentPath);
18927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
19027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
191bf5b3b29e31b293313788d7464cfb258ac0da803James DongString8 DrmManagerService::getOriginalMimeType(int uniqueId, const String8& path, int fd) {
1923856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Entering getOriginalMimeType");
193bf5b3b29e31b293313788d7464cfb258ac0da803James Dong    return mDrmManager->getOriginalMimeType(uniqueId, path, fd);
19427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
19527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
19627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiint DrmManagerService::getDrmObjectType(
19727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi           int uniqueId, const String8& path, const String8& mimeType) {
1983856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Entering getDrmObjectType");
19927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return mDrmManager->getDrmObjectType(uniqueId, path, mimeType);
20027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
20127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
20227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiint DrmManagerService::checkRightsStatus(
20327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, const String8& path, int action) {
2043856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Entering checkRightsStatus");
20527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return mDrmManager->checkRightsStatus(uniqueId, path, action);
20627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
20727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
2082272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t DrmManagerService::consumeRights(
20927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, DecryptHandle* decryptHandle, int action, bool reserve) {
2103856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Entering consumeRights");
211f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn    if (!isProtectedCallAllowed(CONSUME_RIGHTS)) {
212328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong        return DRM_ERROR_NO_PERMISSION;
213328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong    }
2142272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    return mDrmManager->consumeRights(uniqueId, decryptHandle, action, reserve);
21527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
21627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
2172272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t DrmManagerService::setPlaybackStatus(
218a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang            int uniqueId, DecryptHandle* decryptHandle, int playbackStatus, int64_t position) {
2193856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Entering setPlaybackStatus");
220f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn    if (!isProtectedCallAllowed(SET_PLAYBACK_STATUS)) {
221328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong        return DRM_ERROR_NO_PERMISSION;
222328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong    }
2232272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    return mDrmManager->setPlaybackStatus(uniqueId, decryptHandle, playbackStatus, position);
22427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
22527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
22627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshibool DrmManagerService::validateAction(
22727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, const String8& path,
22827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int action, const ActionDescription& description) {
2293856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Entering validateAction");
23027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return mDrmManager->validateAction(uniqueId, path, action, description);
23127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
23227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
2332272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t DrmManagerService::removeRights(int uniqueId, const String8& path) {
2343856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Entering removeRights");
2352272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    return mDrmManager->removeRights(uniqueId, path);
23627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
23727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
2382272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t DrmManagerService::removeAllRights(int uniqueId) {
2393856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Entering removeAllRights");
2402272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    return mDrmManager->removeAllRights(uniqueId);
24127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
24227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
24327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiint DrmManagerService::openConvertSession(int uniqueId, const String8& mimeType) {
2443856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Entering openConvertSession");
24527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return mDrmManager->openConvertSession(uniqueId, mimeType);
24627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
24727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
24827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmConvertedStatus* DrmManagerService::convertData(
24927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, int convertId, const DrmBuffer* inputData) {
2503856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Entering convertData");
25127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return mDrmManager->convertData(uniqueId, convertId, inputData);
25227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
25327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
25427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmConvertedStatus* DrmManagerService::closeConvertSession(int uniqueId, int convertId) {
2553856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Entering closeConvertSession");
25627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return mDrmManager->closeConvertSession(uniqueId, convertId);
25727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
25827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
25927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t DrmManagerService::getAllSupportInfo(
26027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, int* length, DrmSupportInfo** drmSupportInfoArray) {
2613856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Entering getAllSupportInfo");
26227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return mDrmManager->getAllSupportInfo(uniqueId, length, drmSupportInfoArray);
26327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
26427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
26527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDecryptHandle* DrmManagerService::openDecryptSession(
2669d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong            int uniqueId, int fd, off64_t offset, off64_t length, const char* mime) {
2673856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Entering DrmManagerService::openDecryptSession");
268f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn    if (isProtectedCallAllowed(OPEN_DECRYPT_SESSION)) {
2699d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong        return mDrmManager->openDecryptSession(uniqueId, fd, offset, length, mime);
2703473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    }
2713473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi
2723473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    return NULL;
27327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
27427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
275e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi AimiDecryptHandle* DrmManagerService::openDecryptSession(
2769d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong            int uniqueId, const char* uri, const char* mime) {
2773856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Entering DrmManagerService::openDecryptSession with uri");
278f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn    if (isProtectedCallAllowed(OPEN_DECRYPT_SESSION)) {
2799d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong        return mDrmManager->openDecryptSession(uniqueId, uri, mime);
2803473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    }
2813473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi
2823473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    return NULL;
283e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi}
284e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi
285cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei TakahashiDecryptHandle* DrmManagerService::openDecryptSession(
286cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi            int uniqueId, const DrmBuffer& buf, const String8& mimeType) {
287cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi    ALOGV("Entering DrmManagerService::openDecryptSession for streaming");
288f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn    if (isProtectedCallAllowed(OPEN_DECRYPT_SESSION)) {
289cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi        return mDrmManager->openDecryptSession(uniqueId, buf, mimeType);
290cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi    }
291cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi
292cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi    return NULL;
293cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi}
294cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi
2952272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t DrmManagerService::closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle) {
2963856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Entering closeDecryptSession");
297f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn    if (!isProtectedCallAllowed(CLOSE_DECRYPT_SESSION)) {
298328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong        return DRM_ERROR_NO_PERMISSION;
299328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong    }
3002272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    return mDrmManager->closeDecryptSession(uniqueId, decryptHandle);
30127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
30227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
3032272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t DrmManagerService::initializeDecryptUnit(int uniqueId, DecryptHandle* decryptHandle,
30427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int decryptUnitId, const DrmBuffer* headerInfo) {
3053856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Entering initializeDecryptUnit");
306f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn    if (!isProtectedCallAllowed(INITIALIZE_DECRYPT_UNIT)) {
307328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong        return DRM_ERROR_NO_PERMISSION;
308328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong    }
3092272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    return mDrmManager->initializeDecryptUnit(uniqueId,decryptHandle, decryptUnitId, headerInfo);
31027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
31127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
31227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t DrmManagerService::decrypt(
3132272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi            int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId,
3142272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi            const DrmBuffer* encBuffer, DrmBuffer** decBuffer, DrmBuffer* IV) {
3153856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Entering decrypt");
316f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn    if (!isProtectedCallAllowed(DECRYPT)) {
317328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong        return DRM_ERROR_NO_PERMISSION;
318328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong    }
3192272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    return mDrmManager->decrypt(uniqueId, decryptHandle, decryptUnitId, encBuffer, decBuffer, IV);
32027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
32127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
3222272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t DrmManagerService::finalizeDecryptUnit(
32327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId) {
3243856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Entering finalizeDecryptUnit");
325f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn    if (!isProtectedCallAllowed(FINALIZE_DECRYPT_UNIT)) {
326328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong        return DRM_ERROR_NO_PERMISSION;
327328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong    }
3282272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    return mDrmManager->finalizeDecryptUnit(uniqueId, decryptHandle, decryptUnitId);
32927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
33027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
33127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshissize_t DrmManagerService::pread(int uniqueId, DecryptHandle* decryptHandle,
332a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang            void* buffer, ssize_t numBytes, off64_t offset) {
3333856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Entering pread");
334f785f497567ea9d55ade92cbf82a7e80eeb5cb82Riley Spahn    if (!isProtectedCallAllowed(PREAD)) {
335328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong        return DRM_ERROR_NO_PERMISSION;
336328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong    }
33727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return mDrmManager->pread(uniqueId, decryptHandle, buffer, numBytes, offset);
33827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
33927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
34007b745e166ee62030960ccea37e117caadf71c32Andy Hungstatus_t DrmManagerService::dump(int fd, const Vector<String16>& args)
3418635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong{
3428635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong    const size_t SIZE = 256;
3438635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong    char buffer[SIZE];
3448635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong    String8 result;
3458635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong    if (checkCallingPermission(String16("android.permission.DUMP")) == false) {
3468635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong        snprintf(buffer, SIZE, "Permission Denial: "
3478635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong                "can't dump DrmManagerService from pid=%d, uid=%d\n",
3488635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong                IPCThreadState::self()->getCallingPid(),
3498635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong                IPCThreadState::self()->getCallingUid());
3508635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong        result.append(buffer);
3518635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong    } else {
3528635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong#if DRM_MEMORY_LEAK_TRACK
3538635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong        bool dumpMem = false;
3548635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong        for (size_t i = 0; i < args.size(); i++) {
3558635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong            if (args[i] == String16("-m")) {
3568635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong                dumpMem = true;
3578635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong            }
3588635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong        }
3598635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong        if (dumpMem) {
36007b745e166ee62030960ccea37e117caadf71c32Andy Hung            result.append("\nDumping memory:\n");
36107b745e166ee62030960ccea37e117caadf71c32Andy Hung            std::string s = dumpMemoryAddresses(100 /* limit */);
36207b745e166ee62030960ccea37e117caadf71c32Andy Hung            result.append(s.c_str(), s.size());
3638635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong        }
36407b745e166ee62030960ccea37e117caadf71c32Andy Hung#else
36507b745e166ee62030960ccea37e117caadf71c32Andy Hung        (void)args;
3668635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong#endif
3678635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong    }
3688635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong    write(fd, result.string(), result.size());
3698635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong    return NO_ERROR;
3708635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong}
3718635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong
372