DrmHal.cpp revision 32494f5438db362e96b69e5fda7b2fd34633b562
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 "DrmHal" 19fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone#include <iomanip> 20fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone 21a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#include <utils/Log.h> 22a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 23a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#include <binder/IPCThreadState.h> 24a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#include <binder/IServiceManager.h> 25a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 26a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#include <android/hardware/drm/1.0/types.h> 27abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker#include <android/hidl/manager/1.0/IServiceManager.h> 28593111f4460f2b2e8f541e936670e3577d45fff6Jeff Tinker#include <hidl/ServiceManagement.h> 29a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 30f0e618d0ee16c63f918c7bb87ec1ff264d177746Adam Stone#include <media/EventMetric.h> 3133ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce#include <media/PluginMetricsReporting.h> 32a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#include <media/drm/DrmAPI.h> 33a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#include <media/stagefright/foundation/ADebug.h> 34a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#include <media/stagefright/foundation/AString.h> 3532494f5438db362e96b69e5fda7b2fd34633b562Adam Stone#include <media/stagefright/foundation/base64.h> 36a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#include <media/stagefright/foundation/hexdump.h> 37a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#include <media/stagefright/MediaErrors.h> 387d2c6e8be2c9a4f3c1364d243856a345f17f851eJeff Tinker#include <mediadrm/DrmHal.h> 397d2c6e8be2c9a4f3c1364d243856a345f17f851eJeff Tinker#include <mediadrm/DrmSessionClientInterface.h> 407d2c6e8be2c9a4f3c1364d243856a345f17f851eJeff Tinker#include <mediadrm/DrmSessionManager.h> 41a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 426d998b67be330843f633a563c23c606593060165Jeff Tinkerusing drm::V1_0::KeyedVector; 436d998b67be330843f633a563c23c606593060165Jeff Tinkerusing drm::V1_0::KeyStatusType; 446d998b67be330843f633a563c23c606593060165Jeff Tinkerusing drm::V1_0::KeyType; 456d998b67be330843f633a563c23c606593060165Jeff Tinkerusing drm::V1_0::KeyValue; 466d998b67be330843f633a563c23c606593060165Jeff Tinkerusing drm::V1_1::HdcpLevel;; 476d998b67be330843f633a563c23c606593060165Jeff Tinkerusing drm::V1_0::SecureStop; 4815177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinkerusing drm::V1_1::SecureStopRelease; 4915177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinkerusing drm::V1_0::SecureStopId; 506d998b67be330843f633a563c23c606593060165Jeff Tinkerusing drm::V1_1::SecurityLevel; 516d998b67be330843f633a563c23c606593060165Jeff Tinkerusing drm::V1_0::Status; 5228f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stoneusing ::android::hardware::drm::V1_1::DrmMetricGroup; 53a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerusing ::android::hardware::hidl_array; 54a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerusing ::android::hardware::hidl_string; 55a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerusing ::android::hardware::hidl_vec; 56a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerusing ::android::hardware::Return; 57a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerusing ::android::hardware::Void; 58abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinkerusing ::android::hidl::manager::V1_0::IServiceManager; 59637b7855829920114a8863b93fe52203b7471eeaAdam Stoneusing ::android::os::PersistableBundle; 60a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerusing ::android::sp; 61a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 62cea91ce60260d7ebb94449ad7674150fdc227886Adam Stonenamespace { 63cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone 64cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone// This constant corresponds to the PROPERTY_DEVICE_UNIQUE_ID constant 65cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone// in the MediaDrm API. 66cea91ce60260d7ebb94449ad7674150fdc227886Adam Stoneconstexpr char kPropertyDeviceUniqueId[] = "deviceUniqueId"; 6732494f5438db362e96b69e5fda7b2fd34633b562Adam Stoneconstexpr char kEqualsSign[] = "="; 68cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone 6932494f5438db362e96b69e5fda7b2fd34633b562Adam Stonetemplate<typename T> 7032494f5438db362e96b69e5fda7b2fd34633b562Adam Stonestd::string toBase64StringNoPad(const T* data, size_t size) { 7132494f5438db362e96b69e5fda7b2fd34633b562Adam Stone if (size == 0) { 7232494f5438db362e96b69e5fda7b2fd34633b562Adam Stone return ""; 7332494f5438db362e96b69e5fda7b2fd34633b562Adam Stone } 7432494f5438db362e96b69e5fda7b2fd34633b562Adam Stone CHECK(sizeof(data[0] == 1)); 7532494f5438db362e96b69e5fda7b2fd34633b562Adam Stone 7632494f5438db362e96b69e5fda7b2fd34633b562Adam Stone android::AString outputString; 7732494f5438db362e96b69e5fda7b2fd34633b562Adam Stone encodeBase64(data, size, &outputString); 7832494f5438db362e96b69e5fda7b2fd34633b562Adam Stone // Remove trailing equals padding if it exists. 7932494f5438db362e96b69e5fda7b2fd34633b562Adam Stone while (outputString.size() > 0 && outputString.endsWith(kEqualsSign)) { 8032494f5438db362e96b69e5fda7b2fd34633b562Adam Stone outputString.erase(outputString.size() - 1, 1); 8132494f5438db362e96b69e5fda7b2fd34633b562Adam Stone } 8232494f5438db362e96b69e5fda7b2fd34633b562Adam Stone 8332494f5438db362e96b69e5fda7b2fd34633b562Adam Stone return std::string(outputString.c_str(), outputString.size()); 84cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone} 85cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone 8632494f5438db362e96b69e5fda7b2fd34633b562Adam Stone} // anonymous namespace 8732494f5438db362e96b69e5fda7b2fd34633b562Adam Stone 88a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkernamespace android { 89a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 906d998b67be330843f633a563c23c606593060165Jeff Tinker#define INIT_CHECK() {if (mInitCheck != OK) return mInitCheck;} 916d998b67be330843f633a563c23c606593060165Jeff Tinker 92a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic inline int getCallingPid() { 93a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return IPCThreadState::self()->getCallingPid(); 94a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 95a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 96a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic bool checkPermission(const char* permissionString) { 97a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (getpid() == IPCThreadState::self()->getCallingPid()) return true; 98a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker bool ok = checkCallingPermission(String16(permissionString)); 99a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (!ok) ALOGE("Request requires %s", permissionString); 100a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return ok; 101a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 102a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 103a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic const Vector<uint8_t> toVector(const hidl_vec<uint8_t> &vec) { 104a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Vector<uint8_t> vector; 105a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker vector.appendArray(vec.data(), vec.size()); 106a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return *const_cast<const Vector<uint8_t> *>(&vector); 107a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 108a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 109a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic hidl_vec<uint8_t> toHidlVec(const Vector<uint8_t> &vector) { 110a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker hidl_vec<uint8_t> vec; 111a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker vec.setToExternal(const_cast<uint8_t *>(vector.array()), vector.size()); 112a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return vec; 113a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 114a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 115a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic String8 toString8(const hidl_string &string) { 116a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return String8(string.c_str()); 117a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 118a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 119a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic hidl_string toHidlString(const String8& string) { 120a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hidl_string(string.string()); 121a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 122a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1236d998b67be330843f633a563c23c606593060165Jeff Tinkerstatic DrmPlugin::SecurityLevel toSecurityLevel(SecurityLevel level) { 1246d998b67be330843f633a563c23c606593060165Jeff Tinker switch(level) { 1256d998b67be330843f633a563c23c606593060165Jeff Tinker case SecurityLevel::SW_SECURE_CRYPTO: 1266d998b67be330843f633a563c23c606593060165Jeff Tinker return DrmPlugin::kSecurityLevelSwSecureCrypto; 1276d998b67be330843f633a563c23c606593060165Jeff Tinker case SecurityLevel::SW_SECURE_DECODE: 1286d998b67be330843f633a563c23c606593060165Jeff Tinker return DrmPlugin::kSecurityLevelSwSecureDecode; 1296d998b67be330843f633a563c23c606593060165Jeff Tinker case SecurityLevel::HW_SECURE_CRYPTO: 1306d998b67be330843f633a563c23c606593060165Jeff Tinker return DrmPlugin::kSecurityLevelHwSecureCrypto; 1316d998b67be330843f633a563c23c606593060165Jeff Tinker case SecurityLevel::HW_SECURE_DECODE: 1326d998b67be330843f633a563c23c606593060165Jeff Tinker return DrmPlugin::kSecurityLevelHwSecureDecode; 1336d998b67be330843f633a563c23c606593060165Jeff Tinker case SecurityLevel::HW_SECURE_ALL: 1346d998b67be330843f633a563c23c606593060165Jeff Tinker return DrmPlugin::kSecurityLevelHwSecureAll; 1356d998b67be330843f633a563c23c606593060165Jeff Tinker default: 1366d998b67be330843f633a563c23c606593060165Jeff Tinker return DrmPlugin::kSecurityLevelUnknown; 1376d998b67be330843f633a563c23c606593060165Jeff Tinker } 1386d998b67be330843f633a563c23c606593060165Jeff Tinker} 1396d998b67be330843f633a563c23c606593060165Jeff Tinker 1406d998b67be330843f633a563c23c606593060165Jeff Tinkerstatic DrmPlugin::HdcpLevel toHdcpLevel(HdcpLevel level) { 1416d998b67be330843f633a563c23c606593060165Jeff Tinker switch(level) { 1426d998b67be330843f633a563c23c606593060165Jeff Tinker case HdcpLevel::HDCP_NONE: 1436d998b67be330843f633a563c23c606593060165Jeff Tinker return DrmPlugin::kHdcpNone; 1446d998b67be330843f633a563c23c606593060165Jeff Tinker case HdcpLevel::HDCP_V1: 1456d998b67be330843f633a563c23c606593060165Jeff Tinker return DrmPlugin::kHdcpV1; 1466d998b67be330843f633a563c23c606593060165Jeff Tinker case HdcpLevel::HDCP_V2: 1476d998b67be330843f633a563c23c606593060165Jeff Tinker return DrmPlugin::kHdcpV2; 1486d998b67be330843f633a563c23c606593060165Jeff Tinker case HdcpLevel::HDCP_V2_1: 1496d998b67be330843f633a563c23c606593060165Jeff Tinker return DrmPlugin::kHdcpV2_1; 1506d998b67be330843f633a563c23c606593060165Jeff Tinker case HdcpLevel::HDCP_V2_2: 1516d998b67be330843f633a563c23c606593060165Jeff Tinker return DrmPlugin::kHdcpV2_2; 1526d998b67be330843f633a563c23c606593060165Jeff Tinker case HdcpLevel::HDCP_NO_OUTPUT: 1536d998b67be330843f633a563c23c606593060165Jeff Tinker return DrmPlugin::kHdcpNoOutput; 1546d998b67be330843f633a563c23c606593060165Jeff Tinker default: 1556d998b67be330843f633a563c23c606593060165Jeff Tinker return DrmPlugin::kHdcpLevelUnknown; 1566d998b67be330843f633a563c23c606593060165Jeff Tinker } 1576d998b67be330843f633a563c23c606593060165Jeff Tinker} 1586d998b67be330843f633a563c23c606593060165Jeff Tinker 159a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 160a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic ::KeyedVector toHidlKeyedVector(const KeyedVector<String8, String8>& 161a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker keyedVector) { 162a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker std::vector<KeyValue> stdKeyedVector; 163a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker for (size_t i = 0; i < keyedVector.size(); i++) { 164a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker KeyValue keyValue; 165a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker keyValue.key = toHidlString(keyedVector.keyAt(i)); 166a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker keyValue.value = toHidlString(keyedVector.valueAt(i)); 167a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker stdKeyedVector.push_back(keyValue); 168a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 169a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return ::KeyedVector(stdKeyedVector); 170a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 171a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 172a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic KeyedVector<String8, String8> toKeyedVector(const ::KeyedVector& 173a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker hKeyedVector) { 174a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker KeyedVector<String8, String8> keyedVector; 175a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker for (size_t i = 0; i < hKeyedVector.size(); i++) { 176a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker keyedVector.add(toString8(hKeyedVector[i].key), 177a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toString8(hKeyedVector[i].value)); 178a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 179a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return keyedVector; 180a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 181a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 182abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinkerstatic List<Vector<uint8_t>> toSecureStops(const hidl_vec<SecureStop>& 183a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker hSecureStops) { 184abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker List<Vector<uint8_t>> secureStops; 185a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker for (size_t i = 0; i < hSecureStops.size(); i++) { 186a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker secureStops.push_back(toVector(hSecureStops[i].opaqueData)); 187a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 188a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return secureStops; 189a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 190a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 19115177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinkerstatic List<Vector<uint8_t>> toSecureStopIds(const hidl_vec<SecureStopId>& 19215177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker hSecureStopIds) { 19315177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker List<Vector<uint8_t>> secureStopIds; 19415177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker for (size_t i = 0; i < hSecureStopIds.size(); i++) { 19515177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker secureStopIds.push_back(toVector(hSecureStopIds[i])); 19615177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker } 19715177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker return secureStopIds; 19815177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker} 19915177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker 200a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic status_t toStatusT(Status status) { 201a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker switch (status) { 202a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case Status::OK: 203a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return OK; 204a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 205a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case Status::ERROR_DRM_NO_LICENSE: 206a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return ERROR_DRM_NO_LICENSE; 207a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 208a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case Status::ERROR_DRM_LICENSE_EXPIRED: 209a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return ERROR_DRM_LICENSE_EXPIRED; 210a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 211a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case Status::ERROR_DRM_SESSION_NOT_OPENED: 212a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return ERROR_DRM_SESSION_NOT_OPENED; 213a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 214a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case Status::ERROR_DRM_CANNOT_HANDLE: 215a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return ERROR_DRM_CANNOT_HANDLE; 216a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 217a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case Status::ERROR_DRM_INVALID_STATE: 218a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return ERROR_DRM_TAMPER_DETECTED; 219a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 220a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case Status::BAD_VALUE: 221a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return BAD_VALUE; 222a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 223a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case Status::ERROR_DRM_NOT_PROVISIONED: 224a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return ERROR_DRM_NOT_PROVISIONED; 225a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 226a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case Status::ERROR_DRM_RESOURCE_BUSY: 227a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return ERROR_DRM_RESOURCE_BUSY; 228a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 229a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case Status::ERROR_DRM_DEVICE_REVOKED: 230a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return ERROR_DRM_DEVICE_REVOKED; 231a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 232a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case Status::ERROR_DRM_UNKNOWN: 233a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker default: 234a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return ERROR_DRM_UNKNOWN; 235a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 236a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 237a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 238a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 239a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 240a53d6553fce1818bdf87833f93633c93ad1b5915Jeff TinkerMutex DrmHal::mLock; 241a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 242a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstruct DrmSessionClient : public DrmSessionClientInterface { 243a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker explicit DrmSessionClient(DrmHal* drm) : mDrm(drm) {} 244a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 245a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker virtual bool reclaimSession(const Vector<uint8_t>& sessionId) { 246a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker sp<DrmHal> drm = mDrm.promote(); 247a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (drm == NULL) { 248a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return true; 249a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 250a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = drm->closeSession(sessionId); 251a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (err != OK) { 252a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return false; 253a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 254a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker drm->sendEvent(EventType::SESSION_RECLAIMED, 255a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlVec(sessionId), hidl_vec<uint8_t>()); 256a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return true; 257a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 258a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 259a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerprotected: 260a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker virtual ~DrmSessionClient() {} 261a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 262a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerprivate: 263a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker wp<DrmHal> mDrm; 264a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 265a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DISALLOW_EVIL_CONSTRUCTORS(DrmSessionClient); 266a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}; 267a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 268a53d6553fce1818bdf87833f93633c93ad1b5915Jeff TinkerDrmHal::DrmHal() 269a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker : mDrmSessionClient(new DrmSessionClient(this)), 270abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker mFactories(makeDrmFactories()), 271abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker mInitCheck((mFactories.size() == 0) ? ERROR_UNSUPPORTED : NO_INIT) { 272a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 273a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 2746133281c9b06c1d1176eca7f07401bba1067081eJeff Tinkervoid DrmHal::closeOpenSessions() { 2757dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker Mutex::Autolock autoLock(mLock); 2767dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker auto openSessions = mOpenSessions; 2777dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker for (size_t i = 0; i < openSessions.size(); i++) { 2787dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker mLock.unlock(); 2797dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker closeSession(openSessions[i]); 2807dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker mLock.lock(); 2816133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker } 2826133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker mOpenSessions.clear(); 2836133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker} 2846133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker 285a53d6553fce1818bdf87833f93633c93ad1b5915Jeff TinkerDrmHal::~DrmHal() { 286a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->removeDrm(mDrmSessionClient); 287a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 288a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 2897dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinkervoid DrmHal::cleanup() { 2907dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker closeOpenSessions(); 2917dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker 2927dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker Mutex::Autolock autoLock(mLock); 2937dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker reportPluginMetrics(); 2947dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker reportFrameworkMetrics(); 2957dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker 2967dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker setListener(NULL); 2977dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker mInitCheck = NO_INIT; 2987dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker 2997dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker if (mPlugin != NULL) { 3007dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker if (!mPlugin->setListener(NULL).isOk()) { 3017dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker mInitCheck = DEAD_OBJECT; 3027dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker } 3037dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker } 3047dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker mPlugin.clear(); 3057dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker mPluginV1_1.clear(); 3067dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker} 3077dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker 308abeb36a8c2f044772297536e70340c3b245863e4Jeff TinkerVector<sp<IDrmFactory>> DrmHal::makeDrmFactories() { 309abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker Vector<sp<IDrmFactory>> factories; 310c82b9c335e69b617817dace0ef64ad3df3f5080fJeff Tinker 311593111f4460f2b2e8f541e936670e3577d45fff6Jeff Tinker auto manager = hardware::defaultServiceManager(); 312c82b9c335e69b617817dace0ef64ad3df3f5080fJeff Tinker 313abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker if (manager != NULL) { 314e307dc4e7b2c9d3c4018a755db687309cf590369Jeff Tinker manager->listByInterface(drm::V1_0::IDrmFactory::descriptor, 315abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker [&factories](const hidl_vec<hidl_string> ®istered) { 316abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker for (const auto &instance : registered) { 317e307dc4e7b2c9d3c4018a755db687309cf590369Jeff Tinker auto factory = drm::V1_0::IDrmFactory::getService(instance); 318abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker if (factory != NULL) { 319e307dc4e7b2c9d3c4018a755db687309cf590369Jeff Tinker ALOGD("found drm@1.0 IDrmFactory %s", instance.c_str()); 320e307dc4e7b2c9d3c4018a755db687309cf590369Jeff Tinker factories.push_back(factory); 321e307dc4e7b2c9d3c4018a755db687309cf590369Jeff Tinker } 322e307dc4e7b2c9d3c4018a755db687309cf590369Jeff Tinker } 323e307dc4e7b2c9d3c4018a755db687309cf590369Jeff Tinker } 324e307dc4e7b2c9d3c4018a755db687309cf590369Jeff Tinker ); 325e307dc4e7b2c9d3c4018a755db687309cf590369Jeff Tinker manager->listByInterface(drm::V1_1::IDrmFactory::descriptor, 326e307dc4e7b2c9d3c4018a755db687309cf590369Jeff Tinker [&factories](const hidl_vec<hidl_string> ®istered) { 327e307dc4e7b2c9d3c4018a755db687309cf590369Jeff Tinker for (const auto &instance : registered) { 328e307dc4e7b2c9d3c4018a755db687309cf590369Jeff Tinker auto factory = drm::V1_1::IDrmFactory::getService(instance); 329e307dc4e7b2c9d3c4018a755db687309cf590369Jeff Tinker if (factory != NULL) { 330e307dc4e7b2c9d3c4018a755db687309cf590369Jeff Tinker ALOGD("found drm@1.1 IDrmFactory %s", instance.c_str()); 331abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker factories.push_back(factory); 332abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } 333abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } 334abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } 335abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker ); 336abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } 337a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 338abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker if (factories.size() == 0) { 339abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker // must be in passthrough mode, load the default passthrough service 340e309b22bff1719f1fea84b247e4b2bc4c5f09eb5Jeff Tinker auto passthrough = IDrmFactory::getService(); 341abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker if (passthrough != NULL) { 342e307dc4e7b2c9d3c4018a755db687309cf590369Jeff Tinker ALOGI("makeDrmFactories: using default passthrough drm instance"); 343abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker factories.push_back(passthrough); 344abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } else { 345abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker ALOGE("Failed to find any drm factories"); 346abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } 347a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 348abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker return factories; 349abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker} 350abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker 351abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinkersp<IDrmPlugin> DrmHal::makeDrmPlugin(const sp<IDrmFactory>& factory, 352abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker const uint8_t uuid[16], const String8& appPackageName) { 35332494f5438db362e96b69e5fda7b2fd34633b562Adam Stone mAppPackageName = appPackageName; 354fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone mMetrics.SetAppPackageName(appPackageName); 355a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 356a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker sp<IDrmPlugin> plugin; 357abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker Return<void> hResult = factory->createPlugin(uuid, appPackageName.string(), 358a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const sp<IDrmPlugin>& hPlugin) { 359abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker if (status != Status::OK) { 360abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker ALOGE("Failed to make drm plugin"); 361abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker return; 362abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } 363abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker plugin = hPlugin; 364abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } 365abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker ); 366f0e89b0b248976f622fc41da4f678955399def08Jeff Tinker 367f0e89b0b248976f622fc41da4f678955399def08Jeff Tinker if (!hResult.isOk()) { 368f0e89b0b248976f622fc41da4f678955399def08Jeff Tinker ALOGE("createPlugin remote call failed"); 369f0e89b0b248976f622fc41da4f678955399def08Jeff Tinker } 370f0e89b0b248976f622fc41da4f678955399def08Jeff Tinker 371a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return plugin; 372a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 373a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 374a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::initCheck() const { 375a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return mInitCheck; 376a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 377a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 378a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::setListener(const sp<IDrmClient>& listener) 379a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker{ 380a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock lock(mEventLock); 381a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (mListener != NULL){ 382a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker IInterface::asBinder(mListener)->unlinkToDeath(this); 383a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 384a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (listener != NULL) { 385a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker IInterface::asBinder(listener)->linkToDeath(this); 386a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 387a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mListener = listener; 388a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return NO_ERROR; 389a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 390a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 391a53d6553fce1818bdf87833f93633c93ad1b5915Jeff TinkerReturn<void> DrmHal::sendEvent(EventType hEventType, 392a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker const hidl_vec<uint8_t>& sessionId, const hidl_vec<uint8_t>& data) { 393cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone mMetrics.mEventCounter.Increment(hEventType); 394a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 395a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mEventLock.lock(); 396a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker sp<IDrmClient> listener = mListener; 397a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mEventLock.unlock(); 398a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 399a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (listener != NULL) { 400a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Parcel obj; 401a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker writeByteArray(obj, sessionId); 402a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker writeByteArray(obj, data); 403a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 404a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock lock(mNotifyLock); 405a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmPlugin::EventType eventType; 406a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker switch(hEventType) { 407a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case EventType::PROVISION_REQUIRED: 408a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker eventType = DrmPlugin::kDrmPluginEventProvisionRequired; 409a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 410a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case EventType::KEY_NEEDED: 411a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker eventType = DrmPlugin::kDrmPluginEventKeyNeeded; 412a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 413a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case EventType::KEY_EXPIRED: 414a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker eventType = DrmPlugin::kDrmPluginEventKeyExpired; 415a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 416a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case EventType::VENDOR_DEFINED: 417a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker eventType = DrmPlugin::kDrmPluginEventVendorDefined; 418a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 419b86f4b3ce066eadbfe9c2f420b16aaf2de741edbRahul Frias case EventType::SESSION_RECLAIMED: 420b86f4b3ce066eadbfe9c2f420b16aaf2de741edbRahul Frias eventType = DrmPlugin::kDrmPluginEventSessionReclaimed; 421b86f4b3ce066eadbfe9c2f420b16aaf2de741edbRahul Frias break; 422a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker default: 423a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return Void(); 424a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 425a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker listener->notify(eventType, 0, &obj); 426a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 427a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return Void(); 428a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 429a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 430a53d6553fce1818bdf87833f93633c93ad1b5915Jeff TinkerReturn<void> DrmHal::sendExpirationUpdate(const hidl_vec<uint8_t>& sessionId, 431a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker int64_t expiryTimeInMS) { 432a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 433a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mEventLock.lock(); 434a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker sp<IDrmClient> listener = mListener; 435a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mEventLock.unlock(); 436a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 437a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (listener != NULL) { 438a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Parcel obj; 439a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker writeByteArray(obj, sessionId); 440a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker obj.writeInt64(expiryTimeInMS); 441a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 442a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock lock(mNotifyLock); 443a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker listener->notify(DrmPlugin::kDrmPluginEventExpirationUpdate, 0, &obj); 444a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 445a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return Void(); 446a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 447a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 448a53d6553fce1818bdf87833f93633c93ad1b5915Jeff TinkerReturn<void> DrmHal::sendKeysChange(const hidl_vec<uint8_t>& sessionId, 449a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker const hidl_vec<KeyStatus>& keyStatusList, bool hasNewUsableKey) { 450a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 451a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mEventLock.lock(); 452a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker sp<IDrmClient> listener = mListener; 453a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mEventLock.unlock(); 454a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 455a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (listener != NULL) { 456a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Parcel obj; 457a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker writeByteArray(obj, sessionId); 458a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 459a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker size_t nKeys = keyStatusList.size(); 460a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker obj.writeInt32(nKeys); 461a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker for (size_t i = 0; i < nKeys; ++i) { 462a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker const KeyStatus &keyStatus = keyStatusList[i]; 463a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker writeByteArray(obj, keyStatus.keyId); 464a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker uint32_t type; 465a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker switch(keyStatus.type) { 466a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case KeyStatusType::USABLE: 467a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker type = DrmPlugin::kKeyStatusType_Usable; 468a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 469a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case KeyStatusType::EXPIRED: 470a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker type = DrmPlugin::kKeyStatusType_Expired; 471a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 472a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case KeyStatusType::OUTPUTNOTALLOWED: 473a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker type = DrmPlugin::kKeyStatusType_OutputNotAllowed; 474a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 475a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case KeyStatusType::STATUSPENDING: 476a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker type = DrmPlugin::kKeyStatusType_StatusPending; 477a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 478a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker case KeyStatusType::INTERNALERROR: 479a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker default: 480a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker type = DrmPlugin::kKeyStatusType_InternalError; 481a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 482a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 483a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker obj.writeInt32(type); 484cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone mMetrics.mKeyStatusChangeCounter.Increment(keyStatus.type); 485a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 486a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker obj.writeInt32(hasNewUsableKey); 487a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 488a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock lock(mNotifyLock); 489a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker listener->notify(DrmPlugin::kDrmPluginEventKeysChange, 0, &obj); 490cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone } else { 491cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone // There's no listener. But we still want to count the key change 492cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone // events. 493cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone size_t nKeys = keyStatusList.size(); 494cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone for (size_t i = 0; i < nKeys; i++) { 495cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone mMetrics.mKeyStatusChangeCounter.Increment(keyStatusList[i].type); 496cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone } 497a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 498cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone 499a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return Void(); 500a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 501a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 502a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerbool DrmHal::isCryptoSchemeSupported(const uint8_t uuid[16], const String8 &mimeType) { 503a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 504a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 505abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker for (size_t i = 0; i < mFactories.size(); i++) { 506abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker if (mFactories[i]->isCryptoSchemeSupported(uuid)) { 507abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker if (mimeType != "") { 508abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker if (mFactories[i]->isContentTypeSupported(mimeType.string())) { 509abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker return true; 510abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } 511abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } else { 512abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker return true; 513abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } 514a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 515a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 516abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker return false; 517a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 518a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 51968b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wongstatus_t DrmHal::createPlugin(const uint8_t uuid[16], 52068b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong const String8& appPackageName) { 521a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 522a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 523abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker for (size_t i = 0; i < mFactories.size(); i++) { 524abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker if (mFactories[i]->isCryptoSchemeSupported(uuid)) { 525abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker mPlugin = makeDrmPlugin(mFactories[i], uuid, appPackageName); 5265641aa251bf9a6e7b6bf8a73214f92e42c393a2fEdwin Wong if (mPlugin != NULL) { 5275641aa251bf9a6e7b6bf8a73214f92e42c393a2fEdwin Wong mPluginV1_1 = drm::V1_1::IDrmPlugin::castFrom(mPlugin); 5285641aa251bf9a6e7b6bf8a73214f92e42c393a2fEdwin Wong } 529abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } 530abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker } 531a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 532a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (mPlugin == NULL) { 533a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mInitCheck = ERROR_UNSUPPORTED; 534a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } else { 535319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker if (!mPlugin->setListener(this).isOk()) { 536319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker mInitCheck = DEAD_OBJECT; 537319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker } else { 538319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker mInitCheck = OK; 539319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker } 540a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 541a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 542a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return mInitCheck; 543a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 544a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 545a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::destroyPlugin() { 5467dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker cleanup(); 547a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return OK; 548a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 549a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 55041d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinkerstatus_t DrmHal::openSession(DrmPlugin::SecurityLevel level, 55141d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker Vector<uint8_t> &sessionId) { 552a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 5536d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 554a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 55541d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker SecurityLevel hSecurityLevel; 55641d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker bool setSecurityLevel = true; 55741d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker 55841d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker switch(level) { 55941d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker case DrmPlugin::kSecurityLevelSwSecureCrypto: 56041d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker hSecurityLevel = SecurityLevel::SW_SECURE_CRYPTO; 56141d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker break; 56241d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker case DrmPlugin::kSecurityLevelSwSecureDecode: 56341d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker hSecurityLevel = SecurityLevel::SW_SECURE_DECODE; 56441d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker break; 56541d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker case DrmPlugin::kSecurityLevelHwSecureCrypto: 56641d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker hSecurityLevel = SecurityLevel::HW_SECURE_CRYPTO; 56741d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker break; 56841d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker case DrmPlugin::kSecurityLevelHwSecureDecode: 56941d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker hSecurityLevel = SecurityLevel::HW_SECURE_DECODE; 57041d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker break; 57141d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker case DrmPlugin::kSecurityLevelHwSecureAll: 57241d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker hSecurityLevel = SecurityLevel::HW_SECURE_ALL; 57341d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker break; 57441d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker case DrmPlugin::kSecurityLevelMax: 57541d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker setSecurityLevel = false; 57641d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker break; 57741d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker default: 57841d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker return ERROR_DRM_CANNOT_HANDLE; 57941d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker } 5805f5e43fa83551a3636b92871bd2ad6b260a8815bTobias Thierer 58141d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker status_t err = UNKNOWN_ERROR; 582a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker bool retry = true; 583a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker do { 584a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker hidl_vec<uint8_t> hSessionId; 585a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 58641d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker Return<void> hResult; 58741d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker if (mPluginV1_1 == NULL || !setSecurityLevel) { 58841d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker hResult = mPlugin->openSession( 58941d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker [&](Status status,const hidl_vec<uint8_t>& id) { 59041d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker if (status == Status::OK) { 59141d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker sessionId = toVector(id); 59241d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker } 59341d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker err = toStatusT(status); 59456134cc9e790f39b3b10a18b701b0607c20b6154Jeff Tinker } 59541d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker ); 59641d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker } else { 59741d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker hResult = mPluginV1_1->openSession_1_1(hSecurityLevel, 59841d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& id) { 59941d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker if (status == Status::OK) { 60041d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker sessionId = toVector(id); 60141d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker } 60241d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker err = toStatusT(status); 60341d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker } 60441d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker ); 60541d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker } 606a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 607a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (!hResult.isOk()) { 608a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = DEAD_OBJECT; 609a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 610a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 611a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (err == ERROR_DRM_RESOURCE_BUSY && retry) { 612a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mLock.unlock(); 613a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker // reclaimSession may call back to closeSession, since mLock is 614a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker // shared between Drm instances, we should unlock here to avoid 615a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker // deadlock. 616a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker retry = DrmSessionManager::Instance()->reclaimSession(getCallingPid()); 617a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mLock.lock(); 618a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } else { 619a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker retry = false; 620a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 621a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } while (retry); 622a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 623a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (err == OK) { 624a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->addSession(getCallingPid(), 625a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker mDrmSessionClient, sessionId); 6266133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker mOpenSessions.push(sessionId); 627568b3c45d48fab64c80b2780e8547564d35722e9Adam Stone mMetrics.SetSessionStart(sessionId); 628a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 629aaf87dd09686bdb47df0a638b622a4c2ea37a331Adam Stone 630f0e618d0ee16c63f918c7bb87ec1ff264d177746Adam Stone mMetrics.mOpenSessionCounter.Increment(err); 631a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return err; 632a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 633a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 634a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::closeSession(Vector<uint8_t> const &sessionId) { 635a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 6366d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 637a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 638319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker Return<Status> status = mPlugin->closeSession(toHidlVec(sessionId)); 639319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker if (status.isOk()) { 640319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker if (status == Status::OK) { 641319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker DrmSessionManager::Instance()->removeSession(sessionId); 642319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker for (size_t i = 0; i < mOpenSessions.size(); i++) { 643319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker if (mOpenSessions[i] == sessionId) { 644319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker mOpenSessions.removeAt(i); 645319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker break; 646319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker } 6476133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker } 6486133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker } 649cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone status_t response = toStatusT(status); 650568b3c45d48fab64c80b2780e8547564d35722e9Adam Stone mMetrics.SetSessionEnd(sessionId); 651cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone mMetrics.mCloseSessionCounter.Increment(response); 652cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone return response; 653a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 654cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone mMetrics.mCloseSessionCounter.Increment(DEAD_OBJECT); 655319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker return DEAD_OBJECT; 656a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 657a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 658a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::getKeyRequest(Vector<uint8_t> const &sessionId, 659a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Vector<uint8_t> const &initData, String8 const &mimeType, 660a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmPlugin::KeyType keyType, KeyedVector<String8, 661a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker String8> const &optionalParameters, Vector<uint8_t> &request, 662a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker String8 &defaultUrl, DrmPlugin::KeyRequestType *keyRequestType) { 663a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 6646d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 665fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone EventTimer<status_t> keyRequestTimer(&mMetrics.mGetKeyRequestTimeUs); 666a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 667a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 668a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 669a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker KeyType hKeyType; 670a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (keyType == DrmPlugin::kKeyType_Streaming) { 671a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker hKeyType = KeyType::STREAMING; 672a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } else if (keyType == DrmPlugin::kKeyType_Offline) { 673a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker hKeyType = KeyType::OFFLINE; 674a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } else if (keyType == DrmPlugin::kKeyType_Release) { 675a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker hKeyType = KeyType::RELEASE; 676a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } else { 677f0e618d0ee16c63f918c7bb87ec1ff264d177746Adam Stone keyRequestTimer.SetAttribute(BAD_VALUE); 678a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return BAD_VALUE; 679a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 680a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 681a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ::KeyedVector hOptionalParameters = toHidlKeyedVector(optionalParameters); 682a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 683a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 684a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 68559bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias if (mPluginV1_1 != NULL) { 68659bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias Return<void> hResult = 68759bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias mPluginV1_1->getKeyRequest_1_1( 68859bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias toHidlVec(sessionId), toHidlVec(initData), 68959bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias toHidlString(mimeType), hKeyType, hOptionalParameters, 69059bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias [&](Status status, const hidl_vec<uint8_t>& hRequest, 69159bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias drm::V1_1::KeyRequestType hKeyRequestType, 69259bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias const hidl_string& hDefaultUrl) { 69359bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias 69459bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias if (status == Status::OK) { 69559bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias request = toVector(hRequest); 69659bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias defaultUrl = toString8(hDefaultUrl); 69759bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias 69859bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias switch (hKeyRequestType) { 69959bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias case drm::V1_1::KeyRequestType::INITIAL: 70059bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias *keyRequestType = DrmPlugin::kKeyRequestType_Initial; 70159bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias break; 70259bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias case drm::V1_1::KeyRequestType::RENEWAL: 70359bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias *keyRequestType = DrmPlugin::kKeyRequestType_Renewal; 70459bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias break; 70559bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias case drm::V1_1::KeyRequestType::RELEASE: 70659bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias *keyRequestType = DrmPlugin::kKeyRequestType_Release; 70759bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias break; 70859bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias case drm::V1_1::KeyRequestType::NONE: 70959bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias *keyRequestType = DrmPlugin::kKeyRequestType_None; 71059bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias break; 71159bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias case drm::V1_1::KeyRequestType::UPDATE: 71259bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias *keyRequestType = DrmPlugin::kKeyRequestType_Update; 71359bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias break; 71459bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias default: 71559bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias *keyRequestType = DrmPlugin::kKeyRequestType_Unknown; 71659bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias break; 71759bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias } 71859bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias err = toStatusT(status); 71959bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias } 72059bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias }); 72159bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias return hResult.isOk() ? err : DEAD_OBJECT; 72259bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias } 72359bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias 724a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->getKeyRequest(toHidlVec(sessionId), 725a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlVec(initData), toHidlString(mimeType), hKeyType, hOptionalParameters, 726a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& hRequest, 72759bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias drm::V1_0::KeyRequestType hKeyRequestType, 72859bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias const hidl_string& hDefaultUrl) { 729a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 730a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 731a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker request = toVector(hRequest); 732a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker defaultUrl = toString8(hDefaultUrl); 733a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 734a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker switch (hKeyRequestType) { 73559bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias case drm::V1_0::KeyRequestType::INITIAL: 736a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker *keyRequestType = DrmPlugin::kKeyRequestType_Initial; 737a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 73859bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias case drm::V1_0::KeyRequestType::RENEWAL: 739a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker *keyRequestType = DrmPlugin::kKeyRequestType_Renewal; 740a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 74159bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias case drm::V1_0::KeyRequestType::RELEASE: 742a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker *keyRequestType = DrmPlugin::kKeyRequestType_Release; 743a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 744a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker default: 745a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker *keyRequestType = DrmPlugin::kKeyRequestType_Unknown; 746a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker break; 747a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 748a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 749a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 750a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker }); 751a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 752f0e618d0ee16c63f918c7bb87ec1ff264d177746Adam Stone err = hResult.isOk() ? err : DEAD_OBJECT; 753f0e618d0ee16c63f918c7bb87ec1ff264d177746Adam Stone keyRequestTimer.SetAttribute(err); 754f0e618d0ee16c63f918c7bb87ec1ff264d177746Adam Stone return err; 755a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 756a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 757a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::provideKeyResponse(Vector<uint8_t> const &sessionId, 758a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Vector<uint8_t> const &response, Vector<uint8_t> &keySetId) { 759a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 760fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone EventTimer<status_t> keyResponseTimer(&mMetrics.mProvideKeyResponseTimeUs); 761cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone 7626d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 763a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 764a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 765a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 766a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 767a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 768a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->provideKeyResponse(toHidlVec(sessionId), 769a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlVec(response), 770a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& hKeySetId) { 771a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 772a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker keySetId = toVector(hKeySetId); 773a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 774a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 775a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 776a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 777cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone err = hResult.isOk() ? err : DEAD_OBJECT; 778cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone keyResponseTimer.SetAttribute(err); 779cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone return err; 780a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 781a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 782a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::removeKeys(Vector<uint8_t> const &keySetId) { 783a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 7846d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 785a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 78658ad475e3aa567bec63108970855e6518c90d42eJeff Tinker Return<Status> status = mPlugin->removeKeys(toHidlVec(keySetId)); 78758ad475e3aa567bec63108970855e6518c90d42eJeff Tinker return status.isOk() ? toStatusT(status) : DEAD_OBJECT; 788a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 789a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 790a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::restoreKeys(Vector<uint8_t> const &sessionId, 791a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Vector<uint8_t> const &keySetId) { 792a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 7936d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 794a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 795a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 796a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 79758ad475e3aa567bec63108970855e6518c90d42eJeff Tinker Return<Status> status = mPlugin->restoreKeys(toHidlVec(sessionId), 79858ad475e3aa567bec63108970855e6518c90d42eJeff Tinker toHidlVec(keySetId)); 79958ad475e3aa567bec63108970855e6518c90d42eJeff Tinker return status.isOk() ? toStatusT(status) : DEAD_OBJECT; 800a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 801a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 802a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::queryKeyStatus(Vector<uint8_t> const &sessionId, 803a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker KeyedVector<String8, String8> &infoMap) const { 804a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 8056d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 806a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 807a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 808a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 809a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ::KeyedVector hInfoMap; 810a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 811a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 812a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 813a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->queryKeyStatus(toHidlVec(sessionId), 814a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<KeyValue>& map) { 815a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 816a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker infoMap = toKeyedVector(map); 817a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 818a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 819a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 820a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 821a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 822a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 823a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 824a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 825a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::getProvisionRequest(String8 const &certType, 826a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker String8 const &certAuthority, Vector<uint8_t> &request, 827a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker String8 &defaultUrl) { 828a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 8296d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 830a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 831a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 832a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 833a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->getProvisionRequest( 834a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlString(certType), toHidlString(certAuthority), 835a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& hRequest, 836a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker const hidl_string& hDefaultUrl) { 837a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 838a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker request = toVector(hRequest); 839a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker defaultUrl = toString8(hDefaultUrl); 840a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 841a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 842a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 843a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 844a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 845cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone err = hResult.isOk() ? err : DEAD_OBJECT; 846cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone mMetrics.mGetProvisionRequestCounter.Increment(err); 847cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone return err; 848a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 849a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 850a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::provideProvisionResponse(Vector<uint8_t> const &response, 85168b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong Vector<uint8_t> &certificate, Vector<uint8_t> &wrappedKey) { 852a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 8536d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 854a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 855a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 856a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 857a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->provideProvisionResponse(toHidlVec(response), 858a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& hCertificate, 859a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker const hidl_vec<uint8_t>& hWrappedKey) { 860a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 861a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker certificate = toVector(hCertificate); 862a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker wrappedKey = toVector(hWrappedKey); 863a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 864a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 865a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 866a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 867a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 868cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone err = hResult.isOk() ? err : DEAD_OBJECT; 869cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone mMetrics.mProvideProvisionResponseCounter.Increment(err); 870cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone return err; 871a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 872a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 873abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinkerstatus_t DrmHal::getSecureStops(List<Vector<uint8_t>> &secureStops) { 874a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 8756d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 876a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 877a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 878a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 879a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->getSecureStops( 880a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<SecureStop>& hSecureStops) { 881a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 882a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker secureStops = toSecureStops(hSecureStops); 883a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 884a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 885a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 886a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 887a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 888a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 889a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 890a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 891a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 89215177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinkerstatus_t DrmHal::getSecureStopIds(List<Vector<uint8_t>> &secureStopIds) { 89315177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker Mutex::Autolock autoLock(mLock); 89415177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker 89515177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker if (mInitCheck != OK) { 89615177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker return mInitCheck; 89715177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker } 89815177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker 89915177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker if (mPluginV1_1 == NULL) { 90015177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker return ERROR_DRM_CANNOT_HANDLE; 90115177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker } 90215177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker 90315177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker status_t err = UNKNOWN_ERROR; 90415177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker 90515177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker Return<void> hResult = mPluginV1_1->getSecureStopIds( 90615177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker [&](Status status, const hidl_vec<SecureStopId>& hSecureStopIds) { 90715177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker if (status == Status::OK) { 90815177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker secureStopIds = toSecureStopIds(hSecureStopIds); 90915177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker } 91015177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker err = toStatusT(status); 91115177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker } 91215177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker ); 91315177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker 91415177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 91515177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker} 91615177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker 91715177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker 918a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::getSecureStop(Vector<uint8_t> const &ssid, Vector<uint8_t> &secureStop) { 919a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 9206d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 921a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 922a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 923a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 924a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->getSecureStop(toHidlVec(ssid), 925a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const SecureStop& hSecureStop) { 926a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 927a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker secureStop = toVector(hSecureStop.opaqueData); 928a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 929a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 930a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 931a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 932a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 933a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 934a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 935a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 936a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::releaseSecureStops(Vector<uint8_t> const &ssRelease) { 937a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 9386d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 939a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 94058ad475e3aa567bec63108970855e6518c90d42eJeff Tinker Return<Status> status(Status::ERROR_DRM_UNKNOWN); 94115177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker if (mPluginV1_1 != NULL) { 94215177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker SecureStopRelease secureStopRelease; 94315177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker secureStopRelease.opaqueData = toHidlVec(ssRelease); 94458ad475e3aa567bec63108970855e6518c90d42eJeff Tinker status = mPluginV1_1->releaseSecureStops(secureStopRelease); 94558ad475e3aa567bec63108970855e6518c90d42eJeff Tinker } else { 94658ad475e3aa567bec63108970855e6518c90d42eJeff Tinker status = mPlugin->releaseSecureStop(toHidlVec(ssRelease)); 94715177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker } 94858ad475e3aa567bec63108970855e6518c90d42eJeff Tinker return status.isOk() ? toStatusT(status) : DEAD_OBJECT; 949a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 950a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 95115177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinkerstatus_t DrmHal::removeSecureStop(Vector<uint8_t> const &ssid) { 95215177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker Mutex::Autolock autoLock(mLock); 95315177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker 95415177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker if (mInitCheck != OK) { 95515177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker return mInitCheck; 95615177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker } 95715177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker 95815177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker if (mPluginV1_1 == NULL) { 95915177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker return ERROR_DRM_CANNOT_HANDLE; 96015177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker } 96115177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker 96258ad475e3aa567bec63108970855e6518c90d42eJeff Tinker Return<Status> status = mPluginV1_1->removeSecureStop(toHidlVec(ssid)); 96358ad475e3aa567bec63108970855e6518c90d42eJeff Tinker return status.isOk() ? toStatusT(status) : DEAD_OBJECT; 96415177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker} 96515177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker 96615177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinkerstatus_t DrmHal::removeAllSecureStops() { 967a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 9686d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 969a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 97058ad475e3aa567bec63108970855e6518c90d42eJeff Tinker Return<Status> status(Status::ERROR_DRM_UNKNOWN); 97115177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker if (mPluginV1_1 != NULL) { 97258ad475e3aa567bec63108970855e6518c90d42eJeff Tinker status = mPluginV1_1->removeAllSecureStops(); 97358ad475e3aa567bec63108970855e6518c90d42eJeff Tinker } else { 97458ad475e3aa567bec63108970855e6518c90d42eJeff Tinker status = mPlugin->releaseAllSecureStops(); 97515177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker } 97658ad475e3aa567bec63108970855e6518c90d42eJeff Tinker return status.isOk() ? toStatusT(status) : DEAD_OBJECT; 9776d998b67be330843f633a563c23c606593060165Jeff Tinker} 9786d998b67be330843f633a563c23c606593060165Jeff Tinker 9796d998b67be330843f633a563c23c606593060165Jeff Tinkerstatus_t DrmHal::getHdcpLevels(DrmPlugin::HdcpLevel *connected, 9806d998b67be330843f633a563c23c606593060165Jeff Tinker DrmPlugin::HdcpLevel *max) const { 9816d998b67be330843f633a563c23c606593060165Jeff Tinker Mutex::Autolock autoLock(mLock); 9826d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 9836d998b67be330843f633a563c23c606593060165Jeff Tinker 9846d998b67be330843f633a563c23c606593060165Jeff Tinker if (connected == NULL || max == NULL) { 9856d998b67be330843f633a563c23c606593060165Jeff Tinker return BAD_VALUE; 986a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 9876d998b67be330843f633a563c23c606593060165Jeff Tinker status_t err = UNKNOWN_ERROR; 988a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 9896d998b67be330843f633a563c23c606593060165Jeff Tinker if (mPluginV1_1 == NULL) { 9906d998b67be330843f633a563c23c606593060165Jeff Tinker return ERROR_DRM_CANNOT_HANDLE; 9916d998b67be330843f633a563c23c606593060165Jeff Tinker } 9926d998b67be330843f633a563c23c606593060165Jeff Tinker 9936d998b67be330843f633a563c23c606593060165Jeff Tinker *connected = DrmPlugin::kHdcpLevelUnknown; 9946d998b67be330843f633a563c23c606593060165Jeff Tinker *max = DrmPlugin::kHdcpLevelUnknown; 9956d998b67be330843f633a563c23c606593060165Jeff Tinker 9966d998b67be330843f633a563c23c606593060165Jeff Tinker Return<void> hResult = mPluginV1_1->getHdcpLevels( 9976d998b67be330843f633a563c23c606593060165Jeff Tinker [&](Status status, const HdcpLevel& hConnected, const HdcpLevel& hMax) { 9986d998b67be330843f633a563c23c606593060165Jeff Tinker if (status == Status::OK) { 9996d998b67be330843f633a563c23c606593060165Jeff Tinker *connected = toHdcpLevel(hConnected); 10006d998b67be330843f633a563c23c606593060165Jeff Tinker *max = toHdcpLevel(hMax); 10016d998b67be330843f633a563c23c606593060165Jeff Tinker } 10026d998b67be330843f633a563c23c606593060165Jeff Tinker err = toStatusT(status); 10036d998b67be330843f633a563c23c606593060165Jeff Tinker } 10046d998b67be330843f633a563c23c606593060165Jeff Tinker ); 10056d998b67be330843f633a563c23c606593060165Jeff Tinker 10066d998b67be330843f633a563c23c606593060165Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 10076d998b67be330843f633a563c23c606593060165Jeff Tinker} 10086d998b67be330843f633a563c23c606593060165Jeff Tinker 10096d998b67be330843f633a563c23c606593060165Jeff Tinkerstatus_t DrmHal::getNumberOfSessions(uint32_t *open, uint32_t *max) const { 10106d998b67be330843f633a563c23c606593060165Jeff Tinker Mutex::Autolock autoLock(mLock); 10116d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 10126d998b67be330843f633a563c23c606593060165Jeff Tinker 10136d998b67be330843f633a563c23c606593060165Jeff Tinker if (open == NULL || max == NULL) { 10146d998b67be330843f633a563c23c606593060165Jeff Tinker return BAD_VALUE; 10156d998b67be330843f633a563c23c606593060165Jeff Tinker } 10166d998b67be330843f633a563c23c606593060165Jeff Tinker status_t err = UNKNOWN_ERROR; 10176d998b67be330843f633a563c23c606593060165Jeff Tinker 10186d998b67be330843f633a563c23c606593060165Jeff Tinker *open = 0; 10196d998b67be330843f633a563c23c606593060165Jeff Tinker *max = 0; 10206d998b67be330843f633a563c23c606593060165Jeff Tinker 10216d998b67be330843f633a563c23c606593060165Jeff Tinker if (mPluginV1_1 == NULL) { 10226d998b67be330843f633a563c23c606593060165Jeff Tinker return ERROR_DRM_CANNOT_HANDLE; 10236d998b67be330843f633a563c23c606593060165Jeff Tinker } 10246d998b67be330843f633a563c23c606593060165Jeff Tinker 10256d998b67be330843f633a563c23c606593060165Jeff Tinker Return<void> hResult = mPluginV1_1->getNumberOfSessions( 10266d998b67be330843f633a563c23c606593060165Jeff Tinker [&](Status status, uint32_t hOpen, uint32_t hMax) { 10276d998b67be330843f633a563c23c606593060165Jeff Tinker if (status == Status::OK) { 10286d998b67be330843f633a563c23c606593060165Jeff Tinker *open = hOpen; 10296d998b67be330843f633a563c23c606593060165Jeff Tinker *max = hMax; 10306d998b67be330843f633a563c23c606593060165Jeff Tinker } 10316d998b67be330843f633a563c23c606593060165Jeff Tinker err = toStatusT(status); 10326d998b67be330843f633a563c23c606593060165Jeff Tinker } 10336d998b67be330843f633a563c23c606593060165Jeff Tinker ); 10346d998b67be330843f633a563c23c606593060165Jeff Tinker 10356d998b67be330843f633a563c23c606593060165Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 10366d998b67be330843f633a563c23c606593060165Jeff Tinker} 10376d998b67be330843f633a563c23c606593060165Jeff Tinker 10386d998b67be330843f633a563c23c606593060165Jeff Tinkerstatus_t DrmHal::getSecurityLevel(Vector<uint8_t> const &sessionId, 10396d998b67be330843f633a563c23c606593060165Jeff Tinker DrmPlugin::SecurityLevel *level) const { 10406d998b67be330843f633a563c23c606593060165Jeff Tinker Mutex::Autolock autoLock(mLock); 10416d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 10426d998b67be330843f633a563c23c606593060165Jeff Tinker 10436d998b67be330843f633a563c23c606593060165Jeff Tinker if (level == NULL) { 10446d998b67be330843f633a563c23c606593060165Jeff Tinker return BAD_VALUE; 10456d998b67be330843f633a563c23c606593060165Jeff Tinker } 10466d998b67be330843f633a563c23c606593060165Jeff Tinker status_t err = UNKNOWN_ERROR; 10476d998b67be330843f633a563c23c606593060165Jeff Tinker 10486d998b67be330843f633a563c23c606593060165Jeff Tinker if (mPluginV1_1 == NULL) { 10496d998b67be330843f633a563c23c606593060165Jeff Tinker return ERROR_DRM_CANNOT_HANDLE; 10506d998b67be330843f633a563c23c606593060165Jeff Tinker } 10516d998b67be330843f633a563c23c606593060165Jeff Tinker 10526d998b67be330843f633a563c23c606593060165Jeff Tinker *level = DrmPlugin::kSecurityLevelUnknown; 10536d998b67be330843f633a563c23c606593060165Jeff Tinker 10546d998b67be330843f633a563c23c606593060165Jeff Tinker Return<void> hResult = mPluginV1_1->getSecurityLevel(toHidlVec(sessionId), 10556d998b67be330843f633a563c23c606593060165Jeff Tinker [&](Status status, SecurityLevel hLevel) { 10566d998b67be330843f633a563c23c606593060165Jeff Tinker if (status == Status::OK) { 10576d998b67be330843f633a563c23c606593060165Jeff Tinker *level = toSecurityLevel(hLevel); 10586d998b67be330843f633a563c23c606593060165Jeff Tinker } 10596d998b67be330843f633a563c23c606593060165Jeff Tinker err = toStatusT(status); 10606d998b67be330843f633a563c23c606593060165Jeff Tinker } 10616d998b67be330843f633a563c23c606593060165Jeff Tinker ); 10626d998b67be330843f633a563c23c606593060165Jeff Tinker 10636d998b67be330843f633a563c23c606593060165Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 10646d998b67be330843f633a563c23c606593060165Jeff Tinker} 10656d998b67be330843f633a563c23c606593060165Jeff Tinker 1066a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::getPropertyString(String8 const &name, String8 &value ) const { 1067a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 106833ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce return getPropertyStringInternal(name, value); 106933ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce} 107033ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce 107133ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Brucestatus_t DrmHal::getPropertyStringInternal(String8 const &name, String8 &value) const { 107233ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce // This function is internal to the class and should only be called while 107333ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce // mLock is already held. 10746d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 1075a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1076a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 1077a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1078a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->getPropertyString(toHidlString(name), 1079a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_string& hValue) { 1080a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 1081a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker value = toString8(hValue); 1082a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1083a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 1084a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1085a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 1086a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1087a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 1088a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 1089a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1090a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::getPropertyByteArray(String8 const &name, Vector<uint8_t> &value ) const { 1091a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 109233ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce return getPropertyByteArrayInternal(name, value); 109333ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce} 109433ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce 109533ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Brucestatus_t DrmHal::getPropertyByteArrayInternal(String8 const &name, Vector<uint8_t> &value ) const { 109633ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce // This function is internal to the class and should only be called while 109733ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce // mLock is already held. 10986d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 1099a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1100a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 1101a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1102a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->getPropertyByteArray(toHidlString(name), 1103a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& hValue) { 1104a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 1105a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker value = toVector(hValue); 1106a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1107a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 1108a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1109a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 1110a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1111cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone err = hResult.isOk() ? err : DEAD_OBJECT; 1112cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone if (name == kPropertyDeviceUniqueId) { 1113cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone mMetrics.mGetDeviceUniqueIdCounter.Increment(err); 1114cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone } 1115cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone return err; 1116a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 1117a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1118a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::setPropertyString(String8 const &name, String8 const &value ) const { 1119a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 11206d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 1121a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 112258ad475e3aa567bec63108970855e6518c90d42eJeff Tinker Return<Status> status = mPlugin->setPropertyString(toHidlString(name), 1123a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlString(value)); 112458ad475e3aa567bec63108970855e6518c90d42eJeff Tinker return status.isOk() ? toStatusT(status) : DEAD_OBJECT; 1125a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 1126a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1127a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::setPropertyByteArray(String8 const &name, 1128a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Vector<uint8_t> const &value ) const { 1129a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 11306d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 1131a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 113258ad475e3aa567bec63108970855e6518c90d42eJeff Tinker Return<Status> status = mPlugin->setPropertyByteArray(toHidlString(name), 1133a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlVec(value)); 113458ad475e3aa567bec63108970855e6518c90d42eJeff Tinker return status.isOk() ? toStatusT(status) : DEAD_OBJECT; 1135a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 1136a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 113728f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stonestatus_t DrmHal::getMetrics(PersistableBundle* metrics) { 113828f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone if (metrics == nullptr) { 113928f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone return UNEXPECTED_NULL; 114028f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone } 114128f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone mMetrics.Export(metrics); 114228f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone 114328f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone // Append vendor metrics if they are supported. 114428f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone if (mPluginV1_1 != NULL) { 114528f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone String8 vendor; 114628f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone String8 description; 114728f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone if (getPropertyStringInternal(String8("vendor"), vendor) != OK 114828f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone || vendor.isEmpty()) { 114928f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone ALOGE("Get vendor failed or is empty"); 115028f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone vendor = "NONE"; 115128f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone } 115228f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone if (getPropertyStringInternal(String8("description"), description) != OK 115328f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone || description.isEmpty()) { 115428f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone ALOGE("Get description failed or is empty."); 115528f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone description = "NONE"; 115628f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone } 115728f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone vendor += "."; 115828f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone vendor += description; 115928f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone 116028f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone hidl_vec<DrmMetricGroup> pluginMetrics; 116128f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone status_t err = UNKNOWN_ERROR; 116228f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone 116328f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone Return<void> status = mPluginV1_1->getMetrics( 116428f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone [&](Status status, hidl_vec<DrmMetricGroup> pluginMetrics) { 116528f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone if (status != Status::OK) { 116628f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone ALOGV("Error getting plugin metrics: %d", status); 116728f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone } else { 116828f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone PersistableBundle pluginBundle; 116928f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone if (MediaDrmMetrics::HidlMetricsToBundle( 117028f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone pluginMetrics, &pluginBundle) == OK) { 117128f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone metrics->putPersistableBundle(String16(vendor), pluginBundle); 117228f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone } 117328f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone } 117428f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone err = toStatusT(status); 117528f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone }); 117628f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone return status.isOk() ? err : DEAD_OBJECT; 1177f0e618d0ee16c63f918c7bb87ec1ff264d177746Adam Stone } 1178f0e618d0ee16c63f918c7bb87ec1ff264d177746Adam Stone 1179ab394d13bab3a84f23677357576cee7a6f0c7899Adam Stone return OK; 1180ab394d13bab3a84f23677357576cee7a6f0c7899Adam Stone} 1181a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1182a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::setCipherAlgorithm(Vector<uint8_t> const &sessionId, 1183a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker String8 const &algorithm) { 1184a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 11856d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 1186a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1187a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 1188a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1189a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Status status = mPlugin->setCipherAlgorithm(toHidlVec(sessionId), 1190a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlString(algorithm)); 1191a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return toStatusT(status); 1192a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 1193a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1194a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::setMacAlgorithm(Vector<uint8_t> const &sessionId, 1195a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker String8 const &algorithm) { 1196a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 11976d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 1198a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1199a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 1200a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1201a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Status status = mPlugin->setMacAlgorithm(toHidlVec(sessionId), 1202a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlString(algorithm)); 1203a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return toStatusT(status); 1204a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 1205a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1206a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::encrypt(Vector<uint8_t> const &sessionId, 120768b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong Vector<uint8_t> const &keyId, Vector<uint8_t> const &input, 120868b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong Vector<uint8_t> const &iv, Vector<uint8_t> &output) { 1209a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 12106d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 1211a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1212a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 1213a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1214a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 1215a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1216a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->encrypt(toHidlVec(sessionId), 1217a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlVec(keyId), toHidlVec(input), toHidlVec(iv), 1218a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& hOutput) { 1219a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 1220a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker output = toVector(hOutput); 1221a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1222a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 1223a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1224a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 1225a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1226a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 1227a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 1228a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1229a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::decrypt(Vector<uint8_t> const &sessionId, 123068b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong Vector<uint8_t> const &keyId, Vector<uint8_t> const &input, 123168b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong Vector<uint8_t> const &iv, Vector<uint8_t> &output) { 1232a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 12336d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 1234a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1235a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 1236a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1237a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 1238a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1239a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->decrypt(toHidlVec(sessionId), 1240a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlVec(keyId), toHidlVec(input), toHidlVec(iv), 1241a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& hOutput) { 1242a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 1243a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker output = toVector(hOutput); 1244a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1245a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 1246a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1247a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 1248a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1249a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 1250a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 1251a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1252a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::sign(Vector<uint8_t> const &sessionId, 125368b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong Vector<uint8_t> const &keyId, Vector<uint8_t> const &message, 125468b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong Vector<uint8_t> &signature) { 1255a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 12566d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 1257a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1258a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 1259a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1260a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 1261a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1262a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->sign(toHidlVec(sessionId), 1263a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlVec(keyId), toHidlVec(message), 1264a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& hSignature) { 1265a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 1266a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker signature = toVector(hSignature); 1267a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1268a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 1269a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1270a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 1271a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1272a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 1273a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 1274a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1275a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::verify(Vector<uint8_t> const &sessionId, 127668b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong Vector<uint8_t> const &keyId, Vector<uint8_t> const &message, 127768b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong Vector<uint8_t> const &signature, bool &match) { 1278a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 12796d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 1280a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1281a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 1282a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1283a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 1284a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1285a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->verify(toHidlVec(sessionId),toHidlVec(keyId), 1286a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlVec(message), toHidlVec(signature), 1287a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, bool hMatch) { 1288a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 1289a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker match = hMatch; 1290a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } else { 1291a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker match = false; 1292a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1293a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 1294a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1295a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 1296a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1297a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 1298a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 1299a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1300a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::signRSA(Vector<uint8_t> const &sessionId, 130168b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong String8 const &algorithm, Vector<uint8_t> const &message, 130268b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong Vector<uint8_t> const &wrappedKey, Vector<uint8_t> &signature) { 1303a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Mutex::Autolock autoLock(mLock); 13046d998b67be330843f633a563c23c606593060165Jeff Tinker INIT_CHECK(); 1305a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1306a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (!checkPermission("android.permission.ACCESS_DRM_CERTIFICATES")) { 1307a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return -EPERM; 1308a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1309a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1310a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker DrmSessionManager::Instance()->useSession(sessionId); 1311a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1312a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker status_t err = UNKNOWN_ERROR; 1313a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1314a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker Return<void> hResult = mPlugin->signRSA(toHidlVec(sessionId), 1315a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker toHidlString(algorithm), toHidlVec(message), toHidlVec(wrappedKey), 1316a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& hSignature) { 1317a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (status == Status::OK) { 1318a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker signature = toVector(hSignature); 1319a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1320a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker err = toStatusT(status); 1321a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1322a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker ); 1323a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1324a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker return hResult.isOk() ? err : DEAD_OBJECT; 1325a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 1326a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1327a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkervoid DrmHal::binderDied(const wp<IBinder> &the_late_who __unused) 1328a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker{ 13297dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker cleanup(); 1330a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 1331a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1332a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkervoid DrmHal::writeByteArray(Parcel &obj, hidl_vec<uint8_t> const &vec) 1333a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker{ 1334a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker if (vec.size()) { 1335a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker obj.writeInt32(vec.size()); 1336a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker obj.write(vec.data(), vec.size()); 1337a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } else { 1338a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker obj.writeInt32(0); 1339a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker } 1340a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} 1341a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker 1342fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stonevoid DrmHal::reportFrameworkMetrics() const 1343fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone{ 1344fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone MediaAnalyticsItem item("mediadrm"); 1345fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone item.generateSessionID(); 1346fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone item.setPkgName(mMetrics.GetAppPackageName().c_str()); 1347fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone String8 vendor; 1348fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone String8 description; 1349fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone status_t result = getPropertyStringInternal(String8("vendor"), vendor); 1350fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone if (result != OK) { 1351987ac7056040ed1594dc975c8a9d7cee463fa834Jeff Tinker ALOGE("Failed to get vendor from drm plugin: %d", result); 1352fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone } else { 1353fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone item.setCString("vendor", vendor.c_str()); 1354fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone } 1355fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone result = getPropertyStringInternal(String8("description"), description); 1356fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone if (result != OK) { 1357987ac7056040ed1594dc975c8a9d7cee463fa834Jeff Tinker ALOGE("Failed to get description from drm plugin: %d", result); 1358fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone } else { 1359fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone item.setCString("description", description.c_str()); 1360fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone } 1361fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone 1362fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone std::string serializedMetrics; 1363fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone result = mMetrics.GetSerializedMetrics(&serializedMetrics); 1364fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone if (result != OK) { 1365987ac7056040ed1594dc975c8a9d7cee463fa834Jeff Tinker ALOGE("Failed to serialize framework metrics: %d", result); 1366fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone } 136732494f5438db362e96b69e5fda7b2fd34633b562Adam Stone std::string b64EncodedMetrics = toBase64StringNoPad(serializedMetrics.data(), 136832494f5438db362e96b69e5fda7b2fd34633b562Adam Stone serializedMetrics.size()); 136932494f5438db362e96b69e5fda7b2fd34633b562Adam Stone if (!b64EncodedMetrics.empty()) { 137032494f5438db362e96b69e5fda7b2fd34633b562Adam Stone item.setCString("serialized_metrics", b64EncodedMetrics.c_str()); 1371fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone } 1372fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone if (!item.selfrecord()) { 1373987ac7056040ed1594dc975c8a9d7cee463fa834Jeff Tinker ALOGE("Failed to self record framework metrics"); 1374fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone } 1375fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone} 1376ab394d13bab3a84f23677357576cee7a6f0c7899Adam Stone 1377fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stonevoid DrmHal::reportPluginMetrics() const 137833ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce{ 137932494f5438db362e96b69e5fda7b2fd34633b562Adam Stone Vector<uint8_t> metricsVector; 138033ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce String8 vendor; 138133ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce String8 description; 138233ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce if (getPropertyStringInternal(String8("vendor"), vendor) == OK && 138333ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce getPropertyStringInternal(String8("description"), description) == OK && 138432494f5438db362e96b69e5fda7b2fd34633b562Adam Stone getPropertyByteArrayInternal(String8("metrics"), metricsVector) == OK) { 138532494f5438db362e96b69e5fda7b2fd34633b562Adam Stone std::string metricsString = toBase64StringNoPad(metricsVector.array(), 138632494f5438db362e96b69e5fda7b2fd34633b562Adam Stone metricsVector.size()); 138732494f5438db362e96b69e5fda7b2fd34633b562Adam Stone status_t res = android::reportDrmPluginMetrics(metricsString, vendor, 138832494f5438db362e96b69e5fda7b2fd34633b562Adam Stone description, mAppPackageName); 138933ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce if (res != OK) { 1390987ac7056040ed1594dc975c8a9d7cee463fa834Jeff Tinker ALOGE("Metrics were retrieved but could not be reported: %d", res); 139133ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce } 139233ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce } 139333ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce} 139433ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce 1395a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker} // namespace android 1396