CryptoHal.cpp revision 3cb5316c442d182ada75a1394e1505a017400526
1a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker/* 2a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker * Copyright (C) 2017 The Android Open Source Project 3a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker * 4a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker * Licensed under the Apache License, Version 2.0 (the "License"); 5a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker * you may not use this file except in compliance with the License. 6a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker * You may obtain a copy of the License at 7a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker * 8a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker * http://www.apache.org/licenses/LICENSE-2.0 9a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker * 10a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker * Unless required by applicable law or agreed to in writing, software 11a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker * distributed under the License is distributed on an "AS IS" BASIS, 12a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker * See the License for the specific language governing permissions and 14a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker * limitations under the License. 15a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker */ 16a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 17a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker//#define LOG_NDEBUG 0 18a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#define LOG_TAG "CryptoHal" 19a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#include <utils/Log.h> 20a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#include <dirent.h> 21a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#include <dlfcn.h> 22a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 23a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#include <android/hardware/drm/1.0/types.h> 24a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 25a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#include <binder/IMemory.h> 26a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#include <cutils/native_handle.h> 27a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#include <media/CryptoHal.h> 28a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#include <media/hardware/CryptoAPI.h> 29a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#include <media/stagefright/foundation/ADebug.h> 30a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#include <media/stagefright/foundation/AString.h> 31a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#include <media/stagefright/foundation/hexdump.h> 32a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#include <media/stagefright/MediaErrors.h> 33a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 34a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerusing ::android::hardware::drm::V1_0::BufferType; 35a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerusing ::android::hardware::drm::V1_0::DestinationBuffer; 36a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerusing ::android::hardware::drm::V1_0::ICryptoFactory; 37a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerusing ::android::hardware::drm::V1_0::ICryptoPlugin; 38a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerusing ::android::hardware::drm::V1_0::Mode; 39a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerusing ::android::hardware::drm::V1_0::Pattern; 40a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerusing ::android::hardware::drm::V1_0::SharedBuffer; 41a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerusing ::android::hardware::drm::V1_0::Status; 42a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerusing ::android::hardware::drm::V1_0::SubSample; 43a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerusing ::android::hardware::hidl_array; 44a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerusing ::android::hardware::hidl_handle; 45a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerusing ::android::hardware::hidl_memory; 46a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerusing ::android::hardware::hidl_string; 47a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerusing ::android::hardware::hidl_vec; 48a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerusing ::android::hardware::Return; 49a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerusing ::android::hardware::Void; 50a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerusing ::android::sp; 51a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 52a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 53a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkernamespace android { 54a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 55a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic status_t toStatusT(Status status) { 56a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker switch (status) { 57a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case Status::OK: 58a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return OK; 59a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case Status::ERROR_DRM_NO_LICENSE: 60a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return ERROR_DRM_NO_LICENSE; 61a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case Status::ERROR_DRM_LICENSE_EXPIRED: 62a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return ERROR_DRM_LICENSE_EXPIRED; 63a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case Status::ERROR_DRM_RESOURCE_BUSY: 64a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return ERROR_DRM_RESOURCE_BUSY; 65a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case Status::ERROR_DRM_INSUFFICIENT_OUTPUT_PROTECTION: 66a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return ERROR_DRM_INSUFFICIENT_OUTPUT_PROTECTION; 67a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case Status::ERROR_DRM_SESSION_NOT_OPENED: 68a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return ERROR_DRM_SESSION_NOT_OPENED; 69a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case Status::ERROR_DRM_CANNOT_HANDLE: 70a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return ERROR_DRM_CANNOT_HANDLE; 71a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker default: 72a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return UNKNOWN_ERROR; 73a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 74a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 75a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 76a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 77a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic hidl_vec<uint8_t> toHidlVec(const Vector<uint8_t> &vector) { 78a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker hidl_vec<uint8_t> vec; 79a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker vec.setToExternal(const_cast<uint8_t *>(vector.array()), vector.size()); 80a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return vec; 81a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 82a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 83a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic hidl_vec<uint8_t> toHidlVec(const void *ptr, size_t size) { 84a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker hidl_vec<uint8_t> vec; 85a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker vec.resize(size); 86a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker memcpy(vec.data(), ptr, size); 87a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return vec; 88a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 89a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 90a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic hidl_array<uint8_t, 16> toHidlArray16(const uint8_t *ptr) { 91a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (!ptr) { 92a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hidl_array<uint8_t, 16>(); 93a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 94a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hidl_array<uint8_t, 16>(ptr); 95a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 96a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 97a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 98a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic String8 toString8(hidl_string hString) { 99a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return String8(hString.c_str()); 100a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 101a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 102a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 103a53d6553fce1818bdf87833f93633c93ad1b5915Jeff TinkerCryptoHal::CryptoHal() 104a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker : mFactory(makeCryptoFactory()), 105a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mInitCheck((mFactory == NULL) ? ERROR_UNSUPPORTED : NO_INIT), 1063cb5316c442d182ada75a1394e1505a017400526Jeff Tinker mNextBufferId(0) { 107a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 108a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 109a53d6553fce1818bdf87833f93633c93ad1b5915Jeff TinkerCryptoHal::~CryptoHal() { 110a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 111a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 112a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 113a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkersp<ICryptoFactory> CryptoHal::makeCryptoFactory() { 114a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker sp<ICryptoFactory> factory = ICryptoFactory::getService("crypto"); 115a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (factory == NULL) { 116a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ALOGE("Failed to make crypto factory"); 117a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 118a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return factory; 119a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 120a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 121a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkersp<ICryptoPlugin> CryptoHal::makeCryptoPlugin(const uint8_t uuid[16], 122a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker const void *initData, size_t initDataSize) { 123a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (mFactory == NULL){ 124a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return NULL; 125a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 126a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 127a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker sp<ICryptoPlugin> plugin; 128a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mFactory->createPlugin(toHidlArray16(uuid), 129a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlVec(initData, initDataSize), 130a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const sp<ICryptoPlugin>& hPlugin) { 131a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status != Status::OK) { 132a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ALOGE("Failed to make crypto plugin"); 133a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return; 134a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 135a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker plugin = hPlugin; 136a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 137a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 138a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return plugin; 139a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 140a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 141a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 142a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t CryptoHal::initCheck() const { 143a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return mInitCheck; 144a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 145a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 146a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 147a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerbool CryptoHal::isCryptoSchemeSupported(const uint8_t uuid[16]) { 148a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 149a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (mFactory != NULL) { 150a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return mFactory->isCryptoSchemeSupported(uuid); 151a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 152a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return false; 153a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 154a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 155a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t CryptoHal::createPlugin( 156a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker const uint8_t uuid[16], const void *data, size_t size) { 157a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 158a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 159a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mPlugin = makeCryptoPlugin(uuid, data, size); 160a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 161a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (mPlugin == NULL) { 162a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mInitCheck = ERROR_UNSUPPORTED; 163a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } else { 164a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mInitCheck = OK; 165a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 166a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 167a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return mInitCheck; 168a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 169a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 170a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t CryptoHal::destroyPlugin() { 171a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 172a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 173a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (mInitCheck != OK) { 174a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return mInitCheck; 175a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 176a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 177a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mPlugin.clear(); 178a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return OK; 179a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 180a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 181a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerbool CryptoHal::requiresSecureDecoderComponent(const char *mime) const { 182a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 183a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 184a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (mInitCheck != OK) { 185a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return mInitCheck; 186a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 187a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 188a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return mPlugin->requiresSecureDecoderComponent(hidl_string(mime)); 189a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 190a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 191a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 192a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker/** 193a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker * If the heap base isn't set, get the heap base from the IMemory 194a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker * and send it to the HAL so it can map a remote heap of the same 195a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker * size. Once the heap base is established, shared memory buffers 196a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker * are sent by providing an offset into the heap and a buffer size. 197a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker */ 1983cb5316c442d182ada75a1394e1505a017400526Jeff Tinkervoid CryptoHal::setHeapBase(const sp<IMemoryHeap>& heap) { 1993cb5316c442d182ada75a1394e1505a017400526Jeff Tinker native_handle_t* nativeHandle = native_handle_create(1, 0); 2003cb5316c442d182ada75a1394e1505a017400526Jeff Tinker if (!nativeHandle) { 2013cb5316c442d182ada75a1394e1505a017400526Jeff Tinker ALOGE("setSharedBufferBase(), failed to create native handle"); 2023cb5316c442d182ada75a1394e1505a017400526Jeff Tinker return; 2033cb5316c442d182ada75a1394e1505a017400526Jeff Tinker } 2043cb5316c442d182ada75a1394e1505a017400526Jeff Tinker if (heap == NULL) { 2053cb5316c442d182ada75a1394e1505a017400526Jeff Tinker ALOGE("setSharedBufferBase(): heap is NULL"); 2063cb5316c442d182ada75a1394e1505a017400526Jeff Tinker return; 207a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 2083cb5316c442d182ada75a1394e1505a017400526Jeff Tinker int fd = heap->getHeapID(); 2093cb5316c442d182ada75a1394e1505a017400526Jeff Tinker nativeHandle->data[0] = fd; 2103cb5316c442d182ada75a1394e1505a017400526Jeff Tinker auto hidlHandle = hidl_handle(nativeHandle); 2113cb5316c442d182ada75a1394e1505a017400526Jeff Tinker auto hidlMemory = hidl_memory("ashmem", hidlHandle, heap->getSize()); 2123cb5316c442d182ada75a1394e1505a017400526Jeff Tinker mHeapBases.add(heap->getBase(), mNextBufferId); 2133cb5316c442d182ada75a1394e1505a017400526Jeff Tinker Return<void> hResult = mPlugin->setSharedBufferBase(hidlMemory, mNextBufferId++); 2143cb5316c442d182ada75a1394e1505a017400526Jeff Tinker ALOGE_IF(!hResult.isOk(), "setSharedBufferBase(): remote call failed"); 2153cb5316c442d182ada75a1394e1505a017400526Jeff Tinker} 2163cb5316c442d182ada75a1394e1505a017400526Jeff Tinker 2173cb5316c442d182ada75a1394e1505a017400526Jeff Tinkerstatus_t CryptoHal::toSharedBuffer(const sp<IMemory>& memory, ::SharedBuffer* buffer) { 2183cb5316c442d182ada75a1394e1505a017400526Jeff Tinker ssize_t offset; 2193cb5316c442d182ada75a1394e1505a017400526Jeff Tinker size_t size; 2203cb5316c442d182ada75a1394e1505a017400526Jeff Tinker 2213cb5316c442d182ada75a1394e1505a017400526Jeff Tinker if (memory == NULL && buffer == NULL) { 2223cb5316c442d182ada75a1394e1505a017400526Jeff Tinker return UNEXPECTED_NULL; 2233cb5316c442d182ada75a1394e1505a017400526Jeff Tinker } 2243cb5316c442d182ada75a1394e1505a017400526Jeff Tinker 2253cb5316c442d182ada75a1394e1505a017400526Jeff Tinker sp<IMemoryHeap> heap = memory->getMemory(&offset, &size); 2263cb5316c442d182ada75a1394e1505a017400526Jeff Tinker if (heap == NULL) { 2273cb5316c442d182ada75a1394e1505a017400526Jeff Tinker return UNEXPECTED_NULL; 2283cb5316c442d182ada75a1394e1505a017400526Jeff Tinker } 2293cb5316c442d182ada75a1394e1505a017400526Jeff Tinker 2303cb5316c442d182ada75a1394e1505a017400526Jeff Tinker if (mHeapBases.indexOfKey(heap->getBase()) < 0) { 2313cb5316c442d182ada75a1394e1505a017400526Jeff Tinker setHeapBase(heap); 2323cb5316c442d182ada75a1394e1505a017400526Jeff Tinker } 2333cb5316c442d182ada75a1394e1505a017400526Jeff Tinker 2343cb5316c442d182ada75a1394e1505a017400526Jeff Tinker buffer->bufferId = mHeapBases.valueFor(heap->getBase()); 2353cb5316c442d182ada75a1394e1505a017400526Jeff Tinker buffer->offset = offset >= 0 ? offset : 0; 2363cb5316c442d182ada75a1394e1505a017400526Jeff Tinker buffer->size = size; 237a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return OK; 238a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 239a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 240a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerssize_t CryptoHal::decrypt(const uint8_t keyId[16], const uint8_t iv[16], 241a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker CryptoPlugin::Mode mode, const CryptoPlugin::Pattern &pattern, 242a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker const sp<IMemory> &source, size_t offset, 243a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker const CryptoPlugin::SubSample *subSamples, size_t numSubSamples, 244a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker const ICrypto::DestinationBuffer &destination, AString *errorDetailMsg) { 245a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 246a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 247a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (mInitCheck != OK) { 248a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return mInitCheck; 249a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 250a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 251a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mode hMode; 252a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker switch(mode) { 253a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case CryptoPlugin::kMode_Unencrypted: 254a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker hMode = Mode::UNENCRYPTED ; 255a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 256a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case CryptoPlugin::kMode_AES_CTR: 257a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker hMode = Mode::AES_CTR; 258a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 259a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case CryptoPlugin::kMode_AES_WV: 260a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker hMode = Mode::AES_CBC_CTS; 261a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 262a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case CryptoPlugin::kMode_AES_CBC: 263a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker hMode = Mode::AES_CBC; 264a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 265a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker default: 266a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return UNKNOWN_ERROR; 267a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 268a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 269a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Pattern hPattern; 270a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker hPattern.encryptBlocks = pattern.mEncryptBlocks; 271a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker hPattern.skipBlocks = pattern.mSkipBlocks; 272a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 273a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker std::vector<SubSample> stdSubSamples; 274a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker for (size_t i = 0; i < numSubSamples; i++) { 275a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker SubSample subSample; 276a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker subSample.numBytesOfClearData = subSamples[i].mNumBytesOfClearData; 277a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker subSample.numBytesOfEncryptedData = subSamples[i].mNumBytesOfEncryptedData; 278a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker stdSubSamples.push_back(subSample); 279a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 280a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker auto hSubSamples = hidl_vec<SubSample>(stdSubSamples); 281a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 282a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker bool secure; 283a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ::DestinationBuffer hDestination; 284a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (destination.mType == kDestinationTypeSharedMemory) { 285a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker hDestination.type = BufferType::SHARED_MEMORY; 2863cb5316c442d182ada75a1394e1505a017400526Jeff Tinker status_t status = toSharedBuffer(destination.mSharedMemory, 2873cb5316c442d182ada75a1394e1505a017400526Jeff Tinker &hDestination.nonsecureMemory); 2883cb5316c442d182ada75a1394e1505a017400526Jeff Tinker if (status != OK) { 2893cb5316c442d182ada75a1394e1505a017400526Jeff Tinker return status; 2903cb5316c442d182ada75a1394e1505a017400526Jeff Tinker } 291a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker secure = false; 292a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } else { 293a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker hDestination.type = BufferType::NATIVE_HANDLE; 294a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker hDestination.secureMemory = hidl_handle(destination.mHandle); 295a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker secure = true; 296a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 297a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 2983cb5316c442d182ada75a1394e1505a017400526Jeff Tinker ::SharedBuffer hSource; 2993cb5316c442d182ada75a1394e1505a017400526Jeff Tinker status_t status = toSharedBuffer(source, &hSource); 3003cb5316c442d182ada75a1394e1505a017400526Jeff Tinker if (status != OK) { 3013cb5316c442d182ada75a1394e1505a017400526Jeff Tinker return status; 3023cb5316c442d182ada75a1394e1505a017400526Jeff Tinker } 303a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 304a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 305a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker uint32_t bytesWritten = 0; 306a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 307a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->decrypt(secure, toHidlArray16(keyId), toHidlArray16(iv), hMode, 3083cb5316c442d182ada75a1394e1505a017400526Jeff Tinker hPattern, hSubSamples, hSource, offset, hDestination, 309a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, uint32_t hBytesWritten, hidl_string hDetailedError) { 310a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 311a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker bytesWritten = hBytesWritten; 312a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker *errorDetailMsg = toString8(hDetailedError); 313a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 314a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 315a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 316a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 317a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 318a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (!hResult.isOk()) { 319a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = DEAD_OBJECT; 320a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 321a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 322a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (err == OK) { 323a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return bytesWritten; 324a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 325a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return err; 326a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 327a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 328a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkervoid CryptoHal::notifyResolution(uint32_t width, uint32_t height) { 329a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 330a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 331a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (mInitCheck != OK) { 332a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return; 333a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 334a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 335a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mPlugin->notifyResolution(width, height); 336a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 337a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 338a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t CryptoHal::setMediaDrmSession(const Vector<uint8_t> &sessionId) { 339a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 340a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 341a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (mInitCheck != OK) { 342a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return mInitCheck; 343a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 344a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 345a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return toStatusT(mPlugin->setMediaDrmSession(toHidlVec(sessionId))); 346a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 347a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 348a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} // namespace android 349