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 3227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiusing namespace android; 3327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 343473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimistatic Vector<uid_t> trustedUids; 353473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi 363473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimistatic bool isProtectedCallAllowed() { 371608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber return true; 383473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi} 393473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi 4027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshivoid DrmManagerService::instantiate() { 413856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("instantiate"); 42e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi defaultServiceManager()->addService(String16("drm.drmManager"), new DrmManagerService()); 433473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi 443473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi if (0 >= trustedUids.size()) { 453473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi // TODO 463473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi // Following implementation is just for reference. 473473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi // Each OEM manufacturer should implement/replace with their own solutions. 483473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi 493473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi // Add trusted uids here 503473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi trustedUids.push(AID_MEDIA); 513473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi } 5227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 5327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 54e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi AimiDrmManagerService::DrmManagerService() : 55e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi mDrmManager(NULL) { 563856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("created"); 5727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi mDrmManager = new DrmManager(); 58e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi mDrmManager->loadPlugIns(); 5927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 6027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 6127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmManagerService::~DrmManagerService() { 623856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Destroyed"); 63e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi mDrmManager->unloadPlugIns(); 6427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete mDrmManager; mDrmManager = NULL; 6527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 6627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 678f00151cbe693d52f3e233757c57fab3b6396d21Gloria Wangint DrmManagerService::addUniqueId(bool isNative) { 688f00151cbe693d52f3e233757c57fab3b6396d21Gloria Wang return mDrmManager->addUniqueId(isNative); 692272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi} 702272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi 712272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimivoid DrmManagerService::removeUniqueId(int uniqueId) { 722272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi mDrmManager->removeUniqueId(uniqueId); 732272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi} 742272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi 75e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimivoid DrmManagerService::addClient(int uniqueId) { 76e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi mDrmManager->addClient(uniqueId); 7727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 7827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 79e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimivoid DrmManagerService::removeClient(int uniqueId) { 80e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi mDrmManager->removeClient(uniqueId); 8127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 8227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 8327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t DrmManagerService::setDrmServiceListener( 8427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, const sp<IDrmServiceListener>& drmServiceListener) { 853856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering setDrmServiceListener"); 8627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi mDrmManager->setDrmServiceListener(uniqueId, drmServiceListener); 8727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 8827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 8927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 9027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t DrmManagerService::installDrmEngine(int uniqueId, const String8& drmEngineFile) { 913856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering installDrmEngine"); 9227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return mDrmManager->installDrmEngine(uniqueId, drmEngineFile); 9327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 9427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 9527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmConstraints* DrmManagerService::getConstraints( 9627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, const String8* path, const int action) { 973856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering getConstraints from content"); 9827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return mDrmManager->getConstraints(uniqueId, path, action); 9927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 10027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1013473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi AimiDrmMetadata* DrmManagerService::getMetadata(int uniqueId, const String8* path) { 1023856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering getMetadata from content"); 1033473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi return mDrmManager->getMetadata(uniqueId, path); 1043473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi} 1053473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi 10627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshibool DrmManagerService::canHandle(int uniqueId, const String8& path, const String8& mimeType) { 1073856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering canHandle"); 10827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return mDrmManager->canHandle(uniqueId, path, mimeType); 10927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 11027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 11127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmInfoStatus* DrmManagerService::processDrmInfo(int uniqueId, const DrmInfo* drmInfo) { 1123856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering processDrmInfo"); 11327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return mDrmManager->processDrmInfo(uniqueId, drmInfo); 11427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 11527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 11627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmInfo* DrmManagerService::acquireDrmInfo(int uniqueId, const DrmInfoRequest* drmInfoRequest) { 1173856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering acquireDrmInfo"); 11827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return mDrmManager->acquireDrmInfo(uniqueId, drmInfoRequest); 11927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 12027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1212272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t DrmManagerService::saveRights( 12227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, const DrmRights& drmRights, 12327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8& rightsPath, const String8& contentPath) { 1243856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering saveRights"); 12527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return mDrmManager->saveRights(uniqueId, drmRights, rightsPath, contentPath); 12627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 12727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 128bf5b3b29e31b293313788d7464cfb258ac0da803James DongString8 DrmManagerService::getOriginalMimeType(int uniqueId, const String8& path, int fd) { 1293856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering getOriginalMimeType"); 130bf5b3b29e31b293313788d7464cfb258ac0da803James Dong return mDrmManager->getOriginalMimeType(uniqueId, path, fd); 13127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 13227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 13327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiint DrmManagerService::getDrmObjectType( 13427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, const String8& path, const String8& mimeType) { 1353856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering getDrmObjectType"); 13627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return mDrmManager->getDrmObjectType(uniqueId, path, mimeType); 13727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 13827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 13927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiint DrmManagerService::checkRightsStatus( 14027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, const String8& path, int action) { 1413856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering checkRightsStatus"); 14227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return mDrmManager->checkRightsStatus(uniqueId, path, action); 14327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 14427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1452272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t DrmManagerService::consumeRights( 14627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, DecryptHandle* decryptHandle, int action, bool reserve) { 1473856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering consumeRights"); 148328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong if (!isProtectedCallAllowed()) { 149328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong return DRM_ERROR_NO_PERMISSION; 150328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong } 1512272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return mDrmManager->consumeRights(uniqueId, decryptHandle, action, reserve); 15227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 15327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1542272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t DrmManagerService::setPlaybackStatus( 155a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang int uniqueId, DecryptHandle* decryptHandle, int playbackStatus, int64_t position) { 1563856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering setPlaybackStatus"); 157328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong if (!isProtectedCallAllowed()) { 158328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong return DRM_ERROR_NO_PERMISSION; 159328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong } 1602272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return mDrmManager->setPlaybackStatus(uniqueId, decryptHandle, playbackStatus, position); 16127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 16227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 16327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshibool DrmManagerService::validateAction( 16427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, const String8& path, 16527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int action, const ActionDescription& description) { 1663856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering validateAction"); 16727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return mDrmManager->validateAction(uniqueId, path, action, description); 16827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 16927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1702272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t DrmManagerService::removeRights(int uniqueId, const String8& path) { 1713856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering removeRights"); 1722272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return mDrmManager->removeRights(uniqueId, path); 17327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 17427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1752272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t DrmManagerService::removeAllRights(int uniqueId) { 1763856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering removeAllRights"); 1772272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return mDrmManager->removeAllRights(uniqueId); 17827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 17927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 18027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiint DrmManagerService::openConvertSession(int uniqueId, const String8& mimeType) { 1813856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering openConvertSession"); 18227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return mDrmManager->openConvertSession(uniqueId, mimeType); 18327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 18427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 18527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmConvertedStatus* DrmManagerService::convertData( 18627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, int convertId, const DrmBuffer* inputData) { 1873856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering convertData"); 18827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return mDrmManager->convertData(uniqueId, convertId, inputData); 18927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 19027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 19127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmConvertedStatus* DrmManagerService::closeConvertSession(int uniqueId, int convertId) { 1923856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering closeConvertSession"); 19327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return mDrmManager->closeConvertSession(uniqueId, convertId); 19427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 19527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 19627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t DrmManagerService::getAllSupportInfo( 19727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, int* length, DrmSupportInfo** drmSupportInfoArray) { 1983856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering getAllSupportInfo"); 19927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return mDrmManager->getAllSupportInfo(uniqueId, length, drmSupportInfoArray); 20027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 20127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 20227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDecryptHandle* DrmManagerService::openDecryptSession( 2039d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong int uniqueId, int fd, off64_t offset, off64_t length, const char* mime) { 2043856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering DrmManagerService::openDecryptSession"); 2053473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi if (isProtectedCallAllowed()) { 2069d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong return mDrmManager->openDecryptSession(uniqueId, fd, offset, length, mime); 2073473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi } 2083473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi 2093473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi return NULL; 21027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 21127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 212e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi AimiDecryptHandle* DrmManagerService::openDecryptSession( 2139d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong int uniqueId, const char* uri, const char* mime) { 2143856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering DrmManagerService::openDecryptSession with uri"); 2153473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi if (isProtectedCallAllowed()) { 2169d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong return mDrmManager->openDecryptSession(uniqueId, uri, mime); 2173473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi } 2183473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi 2193473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi return NULL; 220e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi} 221e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi 222cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei TakahashiDecryptHandle* DrmManagerService::openDecryptSession( 223cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi int uniqueId, const DrmBuffer& buf, const String8& mimeType) { 224cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi ALOGV("Entering DrmManagerService::openDecryptSession for streaming"); 225cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi if (isProtectedCallAllowed()) { 226cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi return mDrmManager->openDecryptSession(uniqueId, buf, mimeType); 227cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi } 228cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi 229cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi return NULL; 230cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi} 231cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi 2322272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t DrmManagerService::closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle) { 2333856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering closeDecryptSession"); 234328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong if (!isProtectedCallAllowed()) { 235328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong return DRM_ERROR_NO_PERMISSION; 236328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong } 2372272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return mDrmManager->closeDecryptSession(uniqueId, decryptHandle); 23827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 23927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 2402272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t DrmManagerService::initializeDecryptUnit(int uniqueId, DecryptHandle* decryptHandle, 24127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int decryptUnitId, const DrmBuffer* headerInfo) { 2423856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering initializeDecryptUnit"); 243328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong if (!isProtectedCallAllowed()) { 244328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong return DRM_ERROR_NO_PERMISSION; 245328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong } 2462272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return mDrmManager->initializeDecryptUnit(uniqueId,decryptHandle, decryptUnitId, headerInfo); 24727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 24827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 24927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t DrmManagerService::decrypt( 2502272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId, 2512272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi const DrmBuffer* encBuffer, DrmBuffer** decBuffer, DrmBuffer* IV) { 2523856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering decrypt"); 253328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong if (!isProtectedCallAllowed()) { 254328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong return DRM_ERROR_NO_PERMISSION; 255328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong } 2562272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return mDrmManager->decrypt(uniqueId, decryptHandle, decryptUnitId, encBuffer, decBuffer, IV); 25727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 25827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 2592272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t DrmManagerService::finalizeDecryptUnit( 26027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId) { 2613856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering finalizeDecryptUnit"); 262328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong if (!isProtectedCallAllowed()) { 263328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong return DRM_ERROR_NO_PERMISSION; 264328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong } 2652272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return mDrmManager->finalizeDecryptUnit(uniqueId, decryptHandle, decryptUnitId); 26627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 26727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 26827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshissize_t DrmManagerService::pread(int uniqueId, DecryptHandle* decryptHandle, 269a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang void* buffer, ssize_t numBytes, off64_t offset) { 2703856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering pread"); 271328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong if (!isProtectedCallAllowed()) { 272328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong return DRM_ERROR_NO_PERMISSION; 273328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong } 27427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return mDrmManager->pread(uniqueId, decryptHandle, buffer, numBytes, offset); 27527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 27627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 2778635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dongstatus_t DrmManagerService::dump(int fd, const Vector<String16>& args) 2788635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong{ 2798635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong const size_t SIZE = 256; 2808635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong char buffer[SIZE]; 2818635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong String8 result; 2828635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong if (checkCallingPermission(String16("android.permission.DUMP")) == false) { 2838635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong snprintf(buffer, SIZE, "Permission Denial: " 2848635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong "can't dump DrmManagerService from pid=%d, uid=%d\n", 2858635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong IPCThreadState::self()->getCallingPid(), 2868635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong IPCThreadState::self()->getCallingUid()); 2878635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong result.append(buffer); 2888635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong } else { 2898635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong#if DRM_MEMORY_LEAK_TRACK 2908635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong bool dumpMem = false; 2918635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong for (size_t i = 0; i < args.size(); i++) { 2928635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong if (args[i] == String16("-m")) { 2938635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong dumpMem = true; 2948635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong } 2958635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong } 2968635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong if (dumpMem) { 2978635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong dumpMemoryAddresses(fd); 2988635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong } 2998635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong#endif 3008635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong } 3018635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong write(fd, result.string(), result.size()); 3028635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong return NO_ERROR; 3038635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong} 3048635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong 305