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