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> &registered) {
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> &registered) {
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