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) {
71630092e11dcff57a3a70e2fe1935bf58c5331e2fAdam Stone    // Note that the base 64 conversion only works with arrays of single-byte
72630092e11dcff57a3a70e2fe1935bf58c5331e2fAdam Stone    // values. If the source is empty or is not an array of single-byte values,
73630092e11dcff57a3a70e2fe1935bf58c5331e2fAdam Stone    // return empty string.
74630092e11dcff57a3a70e2fe1935bf58c5331e2fAdam Stone    if (size == 0 || sizeof(data[0]) != 1) {
7532494f5438db362e96b69e5fda7b2fd34633b562Adam Stone      return "";
7632494f5438db362e96b69e5fda7b2fd34633b562Adam Stone    }
7732494f5438db362e96b69e5fda7b2fd34633b562Adam Stone
7832494f5438db362e96b69e5fda7b2fd34633b562Adam Stone    android::AString outputString;
7932494f5438db362e96b69e5fda7b2fd34633b562Adam Stone    encodeBase64(data, size, &outputString);
8032494f5438db362e96b69e5fda7b2fd34633b562Adam Stone    // Remove trailing equals padding if it exists.
8132494f5438db362e96b69e5fda7b2fd34633b562Adam Stone    while (outputString.size() > 0 && outputString.endsWith(kEqualsSign)) {
8232494f5438db362e96b69e5fda7b2fd34633b562Adam Stone        outputString.erase(outputString.size() - 1, 1);
8332494f5438db362e96b69e5fda7b2fd34633b562Adam Stone    }
8432494f5438db362e96b69e5fda7b2fd34633b562Adam Stone
8532494f5438db362e96b69e5fda7b2fd34633b562Adam Stone    return std::string(outputString.c_str(), outputString.size());
86cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone}
87cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone
8832494f5438db362e96b69e5fda7b2fd34633b562Adam Stone}  // anonymous namespace
8932494f5438db362e96b69e5fda7b2fd34633b562Adam Stone
90a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkernamespace android {
91a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
926d998b67be330843f633a563c23c606593060165Jeff Tinker#define INIT_CHECK() {if (mInitCheck != OK) return mInitCheck;}
936d998b67be330843f633a563c23c606593060165Jeff Tinker
94a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic inline int getCallingPid() {
95a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return IPCThreadState::self()->getCallingPid();
96a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
97a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
98a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic bool checkPermission(const char* permissionString) {
99a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    if (getpid() == IPCThreadState::self()->getCallingPid()) return true;
100a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    bool ok = checkCallingPermission(String16(permissionString));
101a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    if (!ok) ALOGE("Request requires %s", permissionString);
102a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return ok;
103a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
104a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
105a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic const Vector<uint8_t> toVector(const hidl_vec<uint8_t> &vec) {
106a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Vector<uint8_t> vector;
107a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    vector.appendArray(vec.data(), vec.size());
108a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return *const_cast<const Vector<uint8_t> *>(&vector);
109a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
110a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
111a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic hidl_vec<uint8_t> toHidlVec(const Vector<uint8_t> &vector) {
112a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    hidl_vec<uint8_t> vec;
113a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    vec.setToExternal(const_cast<uint8_t *>(vector.array()), vector.size());
114a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return vec;
115a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
116a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
117a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic String8 toString8(const hidl_string &string) {
118a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return String8(string.c_str());
119a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
120a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
121a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic hidl_string toHidlString(const String8& string) {
122a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return hidl_string(string.string());
123a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
124a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1256d998b67be330843f633a563c23c606593060165Jeff Tinkerstatic DrmPlugin::SecurityLevel toSecurityLevel(SecurityLevel level) {
1266d998b67be330843f633a563c23c606593060165Jeff Tinker    switch(level) {
1276d998b67be330843f633a563c23c606593060165Jeff Tinker    case SecurityLevel::SW_SECURE_CRYPTO:
1286d998b67be330843f633a563c23c606593060165Jeff Tinker        return DrmPlugin::kSecurityLevelSwSecureCrypto;
1296d998b67be330843f633a563c23c606593060165Jeff Tinker    case SecurityLevel::SW_SECURE_DECODE:
1306d998b67be330843f633a563c23c606593060165Jeff Tinker        return DrmPlugin::kSecurityLevelSwSecureDecode;
1316d998b67be330843f633a563c23c606593060165Jeff Tinker    case SecurityLevel::HW_SECURE_CRYPTO:
1326d998b67be330843f633a563c23c606593060165Jeff Tinker        return DrmPlugin::kSecurityLevelHwSecureCrypto;
1336d998b67be330843f633a563c23c606593060165Jeff Tinker    case SecurityLevel::HW_SECURE_DECODE:
1346d998b67be330843f633a563c23c606593060165Jeff Tinker        return DrmPlugin::kSecurityLevelHwSecureDecode;
1356d998b67be330843f633a563c23c606593060165Jeff Tinker    case SecurityLevel::HW_SECURE_ALL:
1366d998b67be330843f633a563c23c606593060165Jeff Tinker        return DrmPlugin::kSecurityLevelHwSecureAll;
1376d998b67be330843f633a563c23c606593060165Jeff Tinker    default:
1386d998b67be330843f633a563c23c606593060165Jeff Tinker        return DrmPlugin::kSecurityLevelUnknown;
1396d998b67be330843f633a563c23c606593060165Jeff Tinker    }
1406d998b67be330843f633a563c23c606593060165Jeff Tinker}
1416d998b67be330843f633a563c23c606593060165Jeff Tinker
1426d998b67be330843f633a563c23c606593060165Jeff Tinkerstatic DrmPlugin::HdcpLevel toHdcpLevel(HdcpLevel level) {
1436d998b67be330843f633a563c23c606593060165Jeff Tinker    switch(level) {
1446d998b67be330843f633a563c23c606593060165Jeff Tinker    case HdcpLevel::HDCP_NONE:
1456d998b67be330843f633a563c23c606593060165Jeff Tinker        return DrmPlugin::kHdcpNone;
1466d998b67be330843f633a563c23c606593060165Jeff Tinker    case HdcpLevel::HDCP_V1:
1476d998b67be330843f633a563c23c606593060165Jeff Tinker        return DrmPlugin::kHdcpV1;
1486d998b67be330843f633a563c23c606593060165Jeff Tinker    case HdcpLevel::HDCP_V2:
1496d998b67be330843f633a563c23c606593060165Jeff Tinker        return DrmPlugin::kHdcpV2;
1506d998b67be330843f633a563c23c606593060165Jeff Tinker    case HdcpLevel::HDCP_V2_1:
1516d998b67be330843f633a563c23c606593060165Jeff Tinker        return DrmPlugin::kHdcpV2_1;
1526d998b67be330843f633a563c23c606593060165Jeff Tinker    case HdcpLevel::HDCP_V2_2:
1536d998b67be330843f633a563c23c606593060165Jeff Tinker        return DrmPlugin::kHdcpV2_2;
1546d998b67be330843f633a563c23c606593060165Jeff Tinker    case HdcpLevel::HDCP_NO_OUTPUT:
1556d998b67be330843f633a563c23c606593060165Jeff Tinker        return DrmPlugin::kHdcpNoOutput;
1566d998b67be330843f633a563c23c606593060165Jeff Tinker    default:
1576d998b67be330843f633a563c23c606593060165Jeff Tinker        return DrmPlugin::kHdcpLevelUnknown;
1586d998b67be330843f633a563c23c606593060165Jeff Tinker    }
1596d998b67be330843f633a563c23c606593060165Jeff Tinker}
1606d998b67be330843f633a563c23c606593060165Jeff Tinker
161a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
162a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic ::KeyedVector toHidlKeyedVector(const KeyedVector<String8, String8>&
163a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        keyedVector) {
164a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    std::vector<KeyValue> stdKeyedVector;
165a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    for (size_t i = 0; i < keyedVector.size(); i++) {
166a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        KeyValue keyValue;
167a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        keyValue.key = toHidlString(keyedVector.keyAt(i));
168a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        keyValue.value = toHidlString(keyedVector.valueAt(i));
169a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        stdKeyedVector.push_back(keyValue);
170a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    }
171a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return ::KeyedVector(stdKeyedVector);
172a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
173a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
174a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic KeyedVector<String8, String8> toKeyedVector(const ::KeyedVector&
175a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        hKeyedVector) {
176a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    KeyedVector<String8, String8> keyedVector;
177a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    for (size_t i = 0; i < hKeyedVector.size(); i++) {
178a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        keyedVector.add(toString8(hKeyedVector[i].key),
179a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                toString8(hKeyedVector[i].value));
180a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    }
181a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return keyedVector;
182a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
183a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
184abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinkerstatic List<Vector<uint8_t>> toSecureStops(const hidl_vec<SecureStop>&
185a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        hSecureStops) {
186abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker    List<Vector<uint8_t>> secureStops;
187a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    for (size_t i = 0; i < hSecureStops.size(); i++) {
188a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        secureStops.push_back(toVector(hSecureStops[i].opaqueData));
189a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    }
190a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return secureStops;
191a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
192a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
19315177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinkerstatic List<Vector<uint8_t>> toSecureStopIds(const hidl_vec<SecureStopId>&
19415177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker        hSecureStopIds) {
19515177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker    List<Vector<uint8_t>> secureStopIds;
19615177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker    for (size_t i = 0; i < hSecureStopIds.size(); i++) {
19715177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker        secureStopIds.push_back(toVector(hSecureStopIds[i]));
19815177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker    }
19915177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker    return secureStopIds;
20015177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker}
20115177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker
202a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic status_t toStatusT(Status status) {
203a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    switch (status) {
204a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    case Status::OK:
205a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        return OK;
206a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        break;
207a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    case Status::ERROR_DRM_NO_LICENSE:
208a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        return ERROR_DRM_NO_LICENSE;
209a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        break;
210a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    case Status::ERROR_DRM_LICENSE_EXPIRED:
211a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        return ERROR_DRM_LICENSE_EXPIRED;
212a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        break;
213a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    case Status::ERROR_DRM_SESSION_NOT_OPENED:
214a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        return ERROR_DRM_SESSION_NOT_OPENED;
215a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        break;
216a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    case Status::ERROR_DRM_CANNOT_HANDLE:
217a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        return ERROR_DRM_CANNOT_HANDLE;
218a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        break;
219a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    case Status::ERROR_DRM_INVALID_STATE:
220a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        return ERROR_DRM_TAMPER_DETECTED;
221a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        break;
222a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    case Status::BAD_VALUE:
223a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        return BAD_VALUE;
224a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        break;
225a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    case Status::ERROR_DRM_NOT_PROVISIONED:
226a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        return ERROR_DRM_NOT_PROVISIONED;
227a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        break;
228a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    case Status::ERROR_DRM_RESOURCE_BUSY:
229a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        return ERROR_DRM_RESOURCE_BUSY;
230a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        break;
231a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    case Status::ERROR_DRM_DEVICE_REVOKED:
232a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        return ERROR_DRM_DEVICE_REVOKED;
233a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        break;
234a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    case Status::ERROR_DRM_UNKNOWN:
235a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    default:
236a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        return ERROR_DRM_UNKNOWN;
237a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        break;
238a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    }
239a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
240a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
241a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
242a53d6553fce1818bdf87833f93633c93ad1b5915Jeff TinkerMutex DrmHal::mLock;
243a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
244a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstruct DrmSessionClient : public DrmSessionClientInterface {
245a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    explicit DrmSessionClient(DrmHal* drm) : mDrm(drm) {}
246a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
247a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    virtual bool reclaimSession(const Vector<uint8_t>& sessionId) {
248a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        sp<DrmHal> drm = mDrm.promote();
249a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        if (drm == NULL) {
250a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            return true;
251a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        }
252a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        status_t err = drm->closeSession(sessionId);
253a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        if (err != OK) {
254a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            return false;
255a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        }
256a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        drm->sendEvent(EventType::SESSION_RECLAIMED,
257a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                toHidlVec(sessionId), hidl_vec<uint8_t>());
258a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        return true;
259a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    }
260a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
261a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerprotected:
262a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    virtual ~DrmSessionClient() {}
263a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
264a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerprivate:
265a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    wp<DrmHal> mDrm;
266a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
267a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    DISALLOW_EVIL_CONSTRUCTORS(DrmSessionClient);
268a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker};
269a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
270a53d6553fce1818bdf87833f93633c93ad1b5915Jeff TinkerDrmHal::DrmHal()
271a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker   : mDrmSessionClient(new DrmSessionClient(this)),
272abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker     mFactories(makeDrmFactories()),
273abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker     mInitCheck((mFactories.size() == 0) ? ERROR_UNSUPPORTED : NO_INIT) {
274a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
275a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
2766133281c9b06c1d1176eca7f07401bba1067081eJeff Tinkervoid DrmHal::closeOpenSessions() {
2777dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker    Mutex::Autolock autoLock(mLock);
2787dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker    auto openSessions = mOpenSessions;
2797dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker    for (size_t i = 0; i < openSessions.size(); i++) {
2807dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker        mLock.unlock();
2817dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker        closeSession(openSessions[i]);
2827dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker        mLock.lock();
2836133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker    }
2846133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker    mOpenSessions.clear();
2856133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker}
2866133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker
287a53d6553fce1818bdf87833f93633c93ad1b5915Jeff TinkerDrmHal::~DrmHal() {
288a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    DrmSessionManager::Instance()->removeDrm(mDrmSessionClient);
289a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
290a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
2917dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinkervoid DrmHal::cleanup() {
2927dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker    closeOpenSessions();
2937dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker
2947dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker    Mutex::Autolock autoLock(mLock);
2957dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker    reportPluginMetrics();
2967dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker    reportFrameworkMetrics();
2977dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker
2987dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker    setListener(NULL);
2997dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker    mInitCheck = NO_INIT;
3007dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker
3017dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker    if (mPlugin != NULL) {
3027dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker        if (!mPlugin->setListener(NULL).isOk()) {
3037dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker            mInitCheck = DEAD_OBJECT;
3047dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker        }
3057dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker    }
3067dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker    mPlugin.clear();
3077dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker    mPluginV1_1.clear();
3087dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker}
3097dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker
310abeb36a8c2f044772297536e70340c3b245863e4Jeff TinkerVector<sp<IDrmFactory>> DrmHal::makeDrmFactories() {
311abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker    Vector<sp<IDrmFactory>> factories;
312c82b9c335e69b617817dace0ef64ad3df3f5080fJeff Tinker
313593111f4460f2b2e8f541e936670e3577d45fff6Jeff Tinker    auto manager = hardware::defaultServiceManager();
314c82b9c335e69b617817dace0ef64ad3df3f5080fJeff Tinker
315abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker    if (manager != NULL) {
316e307dc4e7b2c9d3c4018a755db687309cf590369Jeff Tinker        manager->listByInterface(drm::V1_0::IDrmFactory::descriptor,
317abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker                [&factories](const hidl_vec<hidl_string> &registered) {
318abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker                    for (const auto &instance : registered) {
319e307dc4e7b2c9d3c4018a755db687309cf590369Jeff Tinker                        auto factory = drm::V1_0::IDrmFactory::getService(instance);
320abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker                        if (factory != NULL) {
321e307dc4e7b2c9d3c4018a755db687309cf590369Jeff Tinker                            ALOGD("found drm@1.0 IDrmFactory %s", instance.c_str());
322e307dc4e7b2c9d3c4018a755db687309cf590369Jeff Tinker                            factories.push_back(factory);
323e307dc4e7b2c9d3c4018a755db687309cf590369Jeff Tinker                        }
324e307dc4e7b2c9d3c4018a755db687309cf590369Jeff Tinker                    }
325e307dc4e7b2c9d3c4018a755db687309cf590369Jeff Tinker                }
326e307dc4e7b2c9d3c4018a755db687309cf590369Jeff Tinker            );
327e307dc4e7b2c9d3c4018a755db687309cf590369Jeff Tinker        manager->listByInterface(drm::V1_1::IDrmFactory::descriptor,
328e307dc4e7b2c9d3c4018a755db687309cf590369Jeff Tinker                [&factories](const hidl_vec<hidl_string> &registered) {
329e307dc4e7b2c9d3c4018a755db687309cf590369Jeff Tinker                    for (const auto &instance : registered) {
330e307dc4e7b2c9d3c4018a755db687309cf590369Jeff Tinker                        auto factory = drm::V1_1::IDrmFactory::getService(instance);
331e307dc4e7b2c9d3c4018a755db687309cf590369Jeff Tinker                        if (factory != NULL) {
332e307dc4e7b2c9d3c4018a755db687309cf590369Jeff Tinker                            ALOGD("found drm@1.1 IDrmFactory %s", instance.c_str());
333abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker                            factories.push_back(factory);
334abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker                        }
335abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker                    }
336abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker                }
337abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker            );
338abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker    }
339a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
340abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker    if (factories.size() == 0) {
341abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker        // must be in passthrough mode, load the default passthrough service
342e309b22bff1719f1fea84b247e4b2bc4c5f09eb5Jeff Tinker        auto passthrough = IDrmFactory::getService();
343abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker        if (passthrough != NULL) {
344e307dc4e7b2c9d3c4018a755db687309cf590369Jeff Tinker            ALOGI("makeDrmFactories: using default passthrough drm instance");
345abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker            factories.push_back(passthrough);
346abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker        } else {
347abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker            ALOGE("Failed to find any drm factories");
348abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker        }
349a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    }
350abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker    return factories;
351abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker}
352abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker
353abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinkersp<IDrmPlugin> DrmHal::makeDrmPlugin(const sp<IDrmFactory>& factory,
354abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker        const uint8_t uuid[16], const String8& appPackageName) {
35532494f5438db362e96b69e5fda7b2fd34633b562Adam Stone    mAppPackageName = appPackageName;
356fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone    mMetrics.SetAppPackageName(appPackageName);
357a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
358a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    sp<IDrmPlugin> plugin;
359abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker    Return<void> hResult = factory->createPlugin(uuid, appPackageName.string(),
360a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            [&](Status status, const sp<IDrmPlugin>& hPlugin) {
361abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker                if (status != Status::OK) {
362abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker                    ALOGE("Failed to make drm plugin");
363abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker                    return;
364abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker                }
365abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker                plugin = hPlugin;
366abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker            }
367abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker        );
368f0e89b0b248976f622fc41da4f678955399def08Jeff Tinker
369f0e89b0b248976f622fc41da4f678955399def08Jeff Tinker    if (!hResult.isOk()) {
370f0e89b0b248976f622fc41da4f678955399def08Jeff Tinker        ALOGE("createPlugin remote call failed");
371f0e89b0b248976f622fc41da4f678955399def08Jeff Tinker    }
372f0e89b0b248976f622fc41da4f678955399def08Jeff Tinker
373a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return plugin;
374a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
375a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
376a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::initCheck() const {
377a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return mInitCheck;
378a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
379a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
380a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::setListener(const sp<IDrmClient>& listener)
381a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker{
382a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock lock(mEventLock);
383a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    if (mListener != NULL){
384a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        IInterface::asBinder(mListener)->unlinkToDeath(this);
385a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    }
386a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    if (listener != NULL) {
387a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        IInterface::asBinder(listener)->linkToDeath(this);
388a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    }
389a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    mListener = listener;
390a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return NO_ERROR;
391a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
392a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
393a53d6553fce1818bdf87833f93633c93ad1b5915Jeff TinkerReturn<void> DrmHal::sendEvent(EventType hEventType,
394a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        const hidl_vec<uint8_t>& sessionId, const hidl_vec<uint8_t>& data) {
395cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone    mMetrics.mEventCounter.Increment(hEventType);
396a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
397a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    mEventLock.lock();
398a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    sp<IDrmClient> listener = mListener;
399a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    mEventLock.unlock();
400a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
401a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    if (listener != NULL) {
402a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        Parcel obj;
403a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        writeByteArray(obj, sessionId);
404a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        writeByteArray(obj, data);
405a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
406a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        Mutex::Autolock lock(mNotifyLock);
407a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        DrmPlugin::EventType eventType;
408a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        switch(hEventType) {
409a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        case EventType::PROVISION_REQUIRED:
410a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            eventType = DrmPlugin::kDrmPluginEventProvisionRequired;
411a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            break;
412a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        case EventType::KEY_NEEDED:
413a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            eventType = DrmPlugin::kDrmPluginEventKeyNeeded;
414a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            break;
415a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        case EventType::KEY_EXPIRED:
416a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            eventType = DrmPlugin::kDrmPluginEventKeyExpired;
417a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            break;
418a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        case EventType::VENDOR_DEFINED:
419a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            eventType = DrmPlugin::kDrmPluginEventVendorDefined;
420a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            break;
421b86f4b3ce066eadbfe9c2f420b16aaf2de741edbRahul Frias        case EventType::SESSION_RECLAIMED:
422b86f4b3ce066eadbfe9c2f420b16aaf2de741edbRahul Frias            eventType = DrmPlugin::kDrmPluginEventSessionReclaimed;
423b86f4b3ce066eadbfe9c2f420b16aaf2de741edbRahul Frias            break;
424a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        default:
425a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            return Void();
426a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        }
427a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        listener->notify(eventType, 0, &obj);
428a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    }
429a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return Void();
430a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
431a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
432a53d6553fce1818bdf87833f93633c93ad1b5915Jeff TinkerReturn<void> DrmHal::sendExpirationUpdate(const hidl_vec<uint8_t>& sessionId,
433a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        int64_t expiryTimeInMS) {
434a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
435a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    mEventLock.lock();
436a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    sp<IDrmClient> listener = mListener;
437a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    mEventLock.unlock();
438a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
439a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    if (listener != NULL) {
440a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        Parcel obj;
441a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        writeByteArray(obj, sessionId);
442a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        obj.writeInt64(expiryTimeInMS);
443a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
444a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        Mutex::Autolock lock(mNotifyLock);
445a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        listener->notify(DrmPlugin::kDrmPluginEventExpirationUpdate, 0, &obj);
446a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    }
447a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return Void();
448a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
449a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
450a53d6553fce1818bdf87833f93633c93ad1b5915Jeff TinkerReturn<void> DrmHal::sendKeysChange(const hidl_vec<uint8_t>& sessionId,
451a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        const hidl_vec<KeyStatus>& keyStatusList, bool hasNewUsableKey) {
452a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
453a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    mEventLock.lock();
454a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    sp<IDrmClient> listener = mListener;
455a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    mEventLock.unlock();
456a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
457a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    if (listener != NULL) {
458a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        Parcel obj;
459a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        writeByteArray(obj, sessionId);
460a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
461a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        size_t nKeys = keyStatusList.size();
462a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        obj.writeInt32(nKeys);
463a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        for (size_t i = 0; i < nKeys; ++i) {
464a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            const KeyStatus &keyStatus = keyStatusList[i];
465a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            writeByteArray(obj, keyStatus.keyId);
466a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            uint32_t type;
467a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            switch(keyStatus.type) {
468a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            case KeyStatusType::USABLE:
469a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                type = DrmPlugin::kKeyStatusType_Usable;
470a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                break;
471a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            case KeyStatusType::EXPIRED:
472a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                type = DrmPlugin::kKeyStatusType_Expired;
473a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                break;
474a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            case KeyStatusType::OUTPUTNOTALLOWED:
475a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                type = DrmPlugin::kKeyStatusType_OutputNotAllowed;
476a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                break;
477a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            case KeyStatusType::STATUSPENDING:
478a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                type = DrmPlugin::kKeyStatusType_StatusPending;
479a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                break;
480a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            case KeyStatusType::INTERNALERROR:
481a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            default:
482a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                type = DrmPlugin::kKeyStatusType_InternalError;
483a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                break;
484a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            }
485a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            obj.writeInt32(type);
486cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone            mMetrics.mKeyStatusChangeCounter.Increment(keyStatus.type);
487a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        }
488a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        obj.writeInt32(hasNewUsableKey);
489a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
490a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        Mutex::Autolock lock(mNotifyLock);
491a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        listener->notify(DrmPlugin::kDrmPluginEventKeysChange, 0, &obj);
492cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone    } else {
493cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone        // There's no listener. But we still want to count the key change
494cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone        // events.
495cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone        size_t nKeys = keyStatusList.size();
496cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone        for (size_t i = 0; i < nKeys; i++) {
497cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone            mMetrics.mKeyStatusChangeCounter.Increment(keyStatusList[i].type);
498cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone        }
499a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    }
500cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone
501a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return Void();
502a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
503a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
504a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerbool DrmHal::isCryptoSchemeSupported(const uint8_t uuid[16], const String8 &mimeType) {
505a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
506a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
507abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker    for (size_t i = 0; i < mFactories.size(); i++) {
508abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker        if (mFactories[i]->isCryptoSchemeSupported(uuid)) {
509abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker            if (mimeType != "") {
510abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker                if (mFactories[i]->isContentTypeSupported(mimeType.string())) {
511abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker                    return true;
512abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker                }
513abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker            } else {
514abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker                return true;
515abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker            }
516a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        }
517a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    }
518abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker    return false;
519a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
520a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
52168b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wongstatus_t DrmHal::createPlugin(const uint8_t uuid[16],
52268b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong        const String8& appPackageName) {
523a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
524a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
525abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker    for (size_t i = 0; i < mFactories.size(); i++) {
526abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker        if (mFactories[i]->isCryptoSchemeSupported(uuid)) {
527abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker            mPlugin = makeDrmPlugin(mFactories[i], uuid, appPackageName);
5285641aa251bf9a6e7b6bf8a73214f92e42c393a2fEdwin Wong            if (mPlugin != NULL) {
5295641aa251bf9a6e7b6bf8a73214f92e42c393a2fEdwin Wong                mPluginV1_1 = drm::V1_1::IDrmPlugin::castFrom(mPlugin);
5305641aa251bf9a6e7b6bf8a73214f92e42c393a2fEdwin Wong            }
531abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker        }
532abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker    }
533a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
534a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    if (mPlugin == NULL) {
535a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        mInitCheck = ERROR_UNSUPPORTED;
536a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    } else {
537319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker        if (!mPlugin->setListener(this).isOk()) {
538319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker            mInitCheck = DEAD_OBJECT;
539319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker        } else {
540319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker            mInitCheck = OK;
541319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker        }
542a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    }
543a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
544a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return mInitCheck;
545a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
546a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
547a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::destroyPlugin() {
5487dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker    cleanup();
549a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return OK;
550a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
551a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
55241d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinkerstatus_t DrmHal::openSession(DrmPlugin::SecurityLevel level,
55341d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker        Vector<uint8_t> &sessionId) {
554a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
5556d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
556a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
55741d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker    SecurityLevel hSecurityLevel;
55841d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker    bool setSecurityLevel = true;
55941d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker
56041d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker    switch(level) {
56141d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker    case DrmPlugin::kSecurityLevelSwSecureCrypto:
56241d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker        hSecurityLevel = SecurityLevel::SW_SECURE_CRYPTO;
56341d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker        break;
56441d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker    case DrmPlugin::kSecurityLevelSwSecureDecode:
56541d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker        hSecurityLevel = SecurityLevel::SW_SECURE_DECODE;
56641d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker        break;
56741d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker    case DrmPlugin::kSecurityLevelHwSecureCrypto:
56841d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker        hSecurityLevel = SecurityLevel::HW_SECURE_CRYPTO;
56941d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker        break;
57041d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker    case DrmPlugin::kSecurityLevelHwSecureDecode:
57141d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker        hSecurityLevel = SecurityLevel::HW_SECURE_DECODE;
57241d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker        break;
57341d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker    case DrmPlugin::kSecurityLevelHwSecureAll:
57441d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker        hSecurityLevel = SecurityLevel::HW_SECURE_ALL;
57541d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker        break;
57641d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker    case DrmPlugin::kSecurityLevelMax:
57741d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker        setSecurityLevel = false;
57841d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker        break;
57941d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker    default:
58041d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker        return ERROR_DRM_CANNOT_HANDLE;
58141d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker    }
5825f5e43fa83551a3636b92871bd2ad6b260a8815bTobias Thierer
58341d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker    status_t  err = UNKNOWN_ERROR;
584a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    bool retry = true;
585a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    do {
586a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        hidl_vec<uint8_t> hSessionId;
587a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
58841d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker        Return<void> hResult;
58941d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker        if (mPluginV1_1 == NULL || !setSecurityLevel) {
59041d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker            hResult = mPlugin->openSession(
59141d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker                    [&](Status status,const hidl_vec<uint8_t>& id) {
59241d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker                        if (status == Status::OK) {
59341d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker                            sessionId = toVector(id);
59441d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker                        }
59541d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker                        err = toStatusT(status);
59656134cc9e790f39b3b10a18b701b0607c20b6154Jeff Tinker                    }
59741d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker                );
59841d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker        } else {
59941d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker            hResult = mPluginV1_1->openSession_1_1(hSecurityLevel,
60041d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker                    [&](Status status, const hidl_vec<uint8_t>& id) {
60141d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker                        if (status == Status::OK) {
60241d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker                            sessionId = toVector(id);
60341d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker                        }
60441d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker                        err = toStatusT(status);
60541d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker                    }
60641d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker                );
60741d279a7f3bc55a63b510d4dce07e18964cda152Jeff Tinker        }
608a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
609a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        if (!hResult.isOk()) {
610a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            err = DEAD_OBJECT;
611a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        }
612a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
613a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        if (err == ERROR_DRM_RESOURCE_BUSY && retry) {
614a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            mLock.unlock();
615a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            // reclaimSession may call back to closeSession, since mLock is
616a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            // shared between Drm instances, we should unlock here to avoid
617a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            // deadlock.
618a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            retry = DrmSessionManager::Instance()->reclaimSession(getCallingPid());
619a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            mLock.lock();
620a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        } else {
621a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            retry = false;
622a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        }
623a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    } while (retry);
624a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
625a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    if (err == OK) {
626a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        DrmSessionManager::Instance()->addSession(getCallingPid(),
627a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                mDrmSessionClient, sessionId);
6286133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker        mOpenSessions.push(sessionId);
629568b3c45d48fab64c80b2780e8547564d35722e9Adam Stone        mMetrics.SetSessionStart(sessionId);
630a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    }
631aaf87dd09686bdb47df0a638b622a4c2ea37a331Adam Stone
632f0e618d0ee16c63f918c7bb87ec1ff264d177746Adam Stone    mMetrics.mOpenSessionCounter.Increment(err);
633a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return err;
634a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
635a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
636a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::closeSession(Vector<uint8_t> const &sessionId) {
637a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
6386d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
639a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
640319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker    Return<Status> status = mPlugin->closeSession(toHidlVec(sessionId));
641319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker    if (status.isOk()) {
642319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker        if (status == Status::OK) {
643319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker            DrmSessionManager::Instance()->removeSession(sessionId);
644319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker            for (size_t i = 0; i < mOpenSessions.size(); i++) {
645319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker                if (mOpenSessions[i] == sessionId) {
646319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker                    mOpenSessions.removeAt(i);
647319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker                    break;
648319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker                }
6496133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker            }
6506133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker        }
651cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone        status_t response = toStatusT(status);
652568b3c45d48fab64c80b2780e8547564d35722e9Adam Stone        mMetrics.SetSessionEnd(sessionId);
653cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone        mMetrics.mCloseSessionCounter.Increment(response);
654cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone        return response;
655a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    }
656cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone    mMetrics.mCloseSessionCounter.Increment(DEAD_OBJECT);
657319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker    return DEAD_OBJECT;
658a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
659a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
660a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::getKeyRequest(Vector<uint8_t> const &sessionId,
661a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        Vector<uint8_t> const &initData, String8 const &mimeType,
662a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        DrmPlugin::KeyType keyType, KeyedVector<String8,
663a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        String8> const &optionalParameters, Vector<uint8_t> &request,
664a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        String8 &defaultUrl, DrmPlugin::KeyRequestType *keyRequestType) {
665a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
6666d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
667fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone    EventTimer<status_t> keyRequestTimer(&mMetrics.mGetKeyRequestTimeUs);
668a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
669a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    DrmSessionManager::Instance()->useSession(sessionId);
670a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
671a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    KeyType hKeyType;
672a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    if (keyType == DrmPlugin::kKeyType_Streaming) {
673a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        hKeyType = KeyType::STREAMING;
674a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    } else if (keyType == DrmPlugin::kKeyType_Offline) {
675a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        hKeyType = KeyType::OFFLINE;
676a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    } else if (keyType == DrmPlugin::kKeyType_Release) {
677a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        hKeyType = KeyType::RELEASE;
678a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    } else {
679f0e618d0ee16c63f918c7bb87ec1ff264d177746Adam Stone        keyRequestTimer.SetAttribute(BAD_VALUE);
680a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        return BAD_VALUE;
681a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    }
682a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
683a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    ::KeyedVector hOptionalParameters = toHidlKeyedVector(optionalParameters);
684a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
685a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    status_t err = UNKNOWN_ERROR;
686a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
68759bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias    if (mPluginV1_1 != NULL) {
68859bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias        Return<void> hResult =
68959bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias            mPluginV1_1->getKeyRequest_1_1(
69059bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias                toHidlVec(sessionId), toHidlVec(initData),
69159bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias                toHidlString(mimeType), hKeyType, hOptionalParameters,
69259bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias                [&](Status status, const hidl_vec<uint8_t>& hRequest,
69359bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias                    drm::V1_1::KeyRequestType hKeyRequestType,
69459bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias                    const hidl_string& hDefaultUrl) {
69559bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias
69659bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias            if (status == Status::OK) {
69759bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias                request = toVector(hRequest);
69859bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias                defaultUrl = toString8(hDefaultUrl);
69959bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias
70059bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias                switch (hKeyRequestType) {
70159bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias                    case drm::V1_1::KeyRequestType::INITIAL:
70259bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias                        *keyRequestType = DrmPlugin::kKeyRequestType_Initial;
70359bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias                        break;
70459bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias                    case drm::V1_1::KeyRequestType::RENEWAL:
70559bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias                        *keyRequestType = DrmPlugin::kKeyRequestType_Renewal;
70659bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias                        break;
70759bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias                    case drm::V1_1::KeyRequestType::RELEASE:
70859bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias                        *keyRequestType = DrmPlugin::kKeyRequestType_Release;
70959bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias                        break;
71059bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias                    case drm::V1_1::KeyRequestType::NONE:
71159bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias                        *keyRequestType = DrmPlugin::kKeyRequestType_None;
71259bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias                        break;
71359bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias                    case drm::V1_1::KeyRequestType::UPDATE:
71459bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias                        *keyRequestType = DrmPlugin::kKeyRequestType_Update;
71559bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias                        break;
71659bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias                    default:
71759bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias                        *keyRequestType = DrmPlugin::kKeyRequestType_Unknown;
71859bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias                        break;
71959bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias                }
72059bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias                err = toStatusT(status);
72159bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias            }
72259bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias        });
72359bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias        return hResult.isOk() ? err : DEAD_OBJECT;
72459bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias    }
72559bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias
726a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Return<void> hResult = mPlugin->getKeyRequest(toHidlVec(sessionId),
727a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            toHidlVec(initData), toHidlString(mimeType), hKeyType, hOptionalParameters,
728a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            [&](Status status, const hidl_vec<uint8_t>& hRequest,
72959bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias                    drm::V1_0::KeyRequestType hKeyRequestType,
73059bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias                    const hidl_string& hDefaultUrl) {
731a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
732a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                if (status == Status::OK) {
733a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    request = toVector(hRequest);
734a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    defaultUrl = toString8(hDefaultUrl);
735a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
736a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    switch (hKeyRequestType) {
73759bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias                    case drm::V1_0::KeyRequestType::INITIAL:
738a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                        *keyRequestType = DrmPlugin::kKeyRequestType_Initial;
739a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                        break;
74059bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias                    case drm::V1_0::KeyRequestType::RENEWAL:
741a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                        *keyRequestType = DrmPlugin::kKeyRequestType_Renewal;
742a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                        break;
74359bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias                    case drm::V1_0::KeyRequestType::RELEASE:
744a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                        *keyRequestType = DrmPlugin::kKeyRequestType_Release;
745a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                        break;
746a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    default:
747a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                        *keyRequestType = DrmPlugin::kKeyRequestType_Unknown;
748a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                        break;
749a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    }
750a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    err = toStatusT(status);
751a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                }
752a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            });
753a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
754f0e618d0ee16c63f918c7bb87ec1ff264d177746Adam Stone    err = hResult.isOk() ? err : DEAD_OBJECT;
755f0e618d0ee16c63f918c7bb87ec1ff264d177746Adam Stone    keyRequestTimer.SetAttribute(err);
756f0e618d0ee16c63f918c7bb87ec1ff264d177746Adam Stone    return err;
757a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
758a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
759a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::provideKeyResponse(Vector<uint8_t> const &sessionId,
760a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        Vector<uint8_t> const &response, Vector<uint8_t> &keySetId) {
761a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
762fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone    EventTimer<status_t> keyResponseTimer(&mMetrics.mProvideKeyResponseTimeUs);
763cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone
7646d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
765a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
766a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    DrmSessionManager::Instance()->useSession(sessionId);
767a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
768a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    status_t err = UNKNOWN_ERROR;
769a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
770a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Return<void> hResult = mPlugin->provideKeyResponse(toHidlVec(sessionId),
771a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            toHidlVec(response),
772a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            [&](Status status, const hidl_vec<uint8_t>& hKeySetId) {
773a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                if (status == Status::OK) {
774a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    keySetId = toVector(hKeySetId);
775a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                }
776a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                err = toStatusT(status);
777a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            }
778a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        );
779cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone    err = hResult.isOk() ? err : DEAD_OBJECT;
780cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone    keyResponseTimer.SetAttribute(err);
781cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone    return err;
782a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
783a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
784a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::removeKeys(Vector<uint8_t> const &keySetId) {
785a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
7866d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
787a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
78858ad475e3aa567bec63108970855e6518c90d42eJeff Tinker    Return<Status> status = mPlugin->removeKeys(toHidlVec(keySetId));
78958ad475e3aa567bec63108970855e6518c90d42eJeff Tinker    return status.isOk() ? toStatusT(status) : DEAD_OBJECT;
790a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
791a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
792a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::restoreKeys(Vector<uint8_t> const &sessionId,
793a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        Vector<uint8_t> const &keySetId) {
794a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
7956d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
796a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
797a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    DrmSessionManager::Instance()->useSession(sessionId);
798a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
79958ad475e3aa567bec63108970855e6518c90d42eJeff Tinker    Return<Status> status = mPlugin->restoreKeys(toHidlVec(sessionId),
80058ad475e3aa567bec63108970855e6518c90d42eJeff Tinker            toHidlVec(keySetId));
80158ad475e3aa567bec63108970855e6518c90d42eJeff Tinker    return status.isOk() ? toStatusT(status) : DEAD_OBJECT;
802a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
803a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
804a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::queryKeyStatus(Vector<uint8_t> const &sessionId,
805a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        KeyedVector<String8, String8> &infoMap) const {
806a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
8076d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
808a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
809a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    DrmSessionManager::Instance()->useSession(sessionId);
810a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
811a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    ::KeyedVector hInfoMap;
812a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
813a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    status_t err = UNKNOWN_ERROR;
814a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
815a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Return<void> hResult = mPlugin->queryKeyStatus(toHidlVec(sessionId),
816a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            [&](Status status, const hidl_vec<KeyValue>& map) {
817a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                if (status == Status::OK) {
818a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    infoMap = toKeyedVector(map);
819a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                }
820a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                err = toStatusT(status);
821a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            }
822a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        );
823a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
824a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return hResult.isOk() ? err : DEAD_OBJECT;
825a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
826a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
827a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::getProvisionRequest(String8 const &certType,
828a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        String8 const &certAuthority, Vector<uint8_t> &request,
829a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        String8 &defaultUrl) {
830a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
8316d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
832a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
833a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    status_t err = UNKNOWN_ERROR;
834a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
835a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Return<void> hResult = mPlugin->getProvisionRequest(
836a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            toHidlString(certType), toHidlString(certAuthority),
837a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            [&](Status status, const hidl_vec<uint8_t>& hRequest,
838a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    const hidl_string& hDefaultUrl) {
839a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                if (status == Status::OK) {
840a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    request = toVector(hRequest);
841a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    defaultUrl = toString8(hDefaultUrl);
842a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                }
843a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                err = toStatusT(status);
844a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            }
845a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        );
846a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
847cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone    err = hResult.isOk() ? err : DEAD_OBJECT;
848cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone    mMetrics.mGetProvisionRequestCounter.Increment(err);
849cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone    return err;
850a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
851a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
852a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::provideProvisionResponse(Vector<uint8_t> const &response,
85368b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong        Vector<uint8_t> &certificate, Vector<uint8_t> &wrappedKey) {
854a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
8556d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
856a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
857a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    status_t err = UNKNOWN_ERROR;
858a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
859a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Return<void> hResult = mPlugin->provideProvisionResponse(toHidlVec(response),
860a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            [&](Status status, const hidl_vec<uint8_t>& hCertificate,
861a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    const hidl_vec<uint8_t>& hWrappedKey) {
862a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                if (status == Status::OK) {
863a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    certificate = toVector(hCertificate);
864a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    wrappedKey = toVector(hWrappedKey);
865a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                }
866a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                err = toStatusT(status);
867a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            }
868a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        );
869a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
870cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone    err = hResult.isOk() ? err : DEAD_OBJECT;
871cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone    mMetrics.mProvideProvisionResponseCounter.Increment(err);
872cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone    return err;
873a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
874a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
875abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinkerstatus_t DrmHal::getSecureStops(List<Vector<uint8_t>> &secureStops) {
876a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
8776d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
878a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
879a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    status_t err = UNKNOWN_ERROR;
880a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
881a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Return<void> hResult = mPlugin->getSecureStops(
882a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            [&](Status status, const hidl_vec<SecureStop>& hSecureStops) {
883a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                if (status == Status::OK) {
884a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    secureStops = toSecureStops(hSecureStops);
885a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                }
886a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                err = toStatusT(status);
887a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            }
888a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    );
889a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
890a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return hResult.isOk() ? err : DEAD_OBJECT;
891a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
892a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
893a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
89415177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinkerstatus_t DrmHal::getSecureStopIds(List<Vector<uint8_t>> &secureStopIds) {
89515177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker    Mutex::Autolock autoLock(mLock);
89615177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker
89715177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker    if (mInitCheck != OK) {
89815177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker        return mInitCheck;
89915177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker    }
90015177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker
90115177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker    if (mPluginV1_1 == NULL) {
90215177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker        return ERROR_DRM_CANNOT_HANDLE;
90315177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker    }
90415177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker
90515177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker    status_t err = UNKNOWN_ERROR;
90615177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker
90715177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker    Return<void> hResult = mPluginV1_1->getSecureStopIds(
90815177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker            [&](Status status, const hidl_vec<SecureStopId>& hSecureStopIds) {
90915177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker                if (status == Status::OK) {
91015177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker                    secureStopIds = toSecureStopIds(hSecureStopIds);
91115177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker                }
91215177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker                err = toStatusT(status);
91315177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker            }
91415177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker    );
91515177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker
91615177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker    return hResult.isOk() ? err : DEAD_OBJECT;
91715177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker}
91815177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker
91915177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker
920a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::getSecureStop(Vector<uint8_t> const &ssid, Vector<uint8_t> &secureStop) {
921a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
9226d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
923a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
924a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    status_t err = UNKNOWN_ERROR;
925a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
926a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Return<void> hResult = mPlugin->getSecureStop(toHidlVec(ssid),
927a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            [&](Status status, const SecureStop& hSecureStop) {
928a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                if (status == Status::OK) {
929a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    secureStop = toVector(hSecureStop.opaqueData);
930a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                }
931a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                err = toStatusT(status);
932a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            }
933a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    );
934a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
935a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return hResult.isOk() ? err : DEAD_OBJECT;
936a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
937a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
938a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::releaseSecureStops(Vector<uint8_t> const &ssRelease) {
939a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
9406d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
941a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
94258ad475e3aa567bec63108970855e6518c90d42eJeff Tinker    Return<Status> status(Status::ERROR_DRM_UNKNOWN);
94315177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker    if (mPluginV1_1 != NULL) {
94415177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker        SecureStopRelease secureStopRelease;
94515177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker        secureStopRelease.opaqueData = toHidlVec(ssRelease);
94658ad475e3aa567bec63108970855e6518c90d42eJeff Tinker        status = mPluginV1_1->releaseSecureStops(secureStopRelease);
94758ad475e3aa567bec63108970855e6518c90d42eJeff Tinker    } else {
94858ad475e3aa567bec63108970855e6518c90d42eJeff Tinker        status = mPlugin->releaseSecureStop(toHidlVec(ssRelease));
94915177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker    }
95058ad475e3aa567bec63108970855e6518c90d42eJeff Tinker    return status.isOk() ? toStatusT(status) : DEAD_OBJECT;
951a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
952a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
95315177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinkerstatus_t DrmHal::removeSecureStop(Vector<uint8_t> const &ssid) {
95415177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker    Mutex::Autolock autoLock(mLock);
95515177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker
95615177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker    if (mInitCheck != OK) {
95715177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker        return mInitCheck;
95815177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker    }
95915177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker
96015177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker    if (mPluginV1_1 == NULL) {
96115177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker        return ERROR_DRM_CANNOT_HANDLE;
96215177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker    }
96315177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker
96458ad475e3aa567bec63108970855e6518c90d42eJeff Tinker    Return<Status> status = mPluginV1_1->removeSecureStop(toHidlVec(ssid));
96558ad475e3aa567bec63108970855e6518c90d42eJeff Tinker    return status.isOk() ? toStatusT(status) : DEAD_OBJECT;
96615177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker}
96715177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker
96815177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinkerstatus_t DrmHal::removeAllSecureStops() {
969a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
9706d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
971a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
97258ad475e3aa567bec63108970855e6518c90d42eJeff Tinker    Return<Status> status(Status::ERROR_DRM_UNKNOWN);
97315177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker    if (mPluginV1_1 != NULL) {
97458ad475e3aa567bec63108970855e6518c90d42eJeff Tinker        status = mPluginV1_1->removeAllSecureStops();
97558ad475e3aa567bec63108970855e6518c90d42eJeff Tinker    } else {
97658ad475e3aa567bec63108970855e6518c90d42eJeff Tinker        status = mPlugin->releaseAllSecureStops();
97715177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker    }
97858ad475e3aa567bec63108970855e6518c90d42eJeff Tinker    return status.isOk() ? toStatusT(status) : DEAD_OBJECT;
9796d998b67be330843f633a563c23c606593060165Jeff Tinker}
9806d998b67be330843f633a563c23c606593060165Jeff Tinker
9816d998b67be330843f633a563c23c606593060165Jeff Tinkerstatus_t DrmHal::getHdcpLevels(DrmPlugin::HdcpLevel *connected,
9826d998b67be330843f633a563c23c606593060165Jeff Tinker            DrmPlugin::HdcpLevel *max) const {
9836d998b67be330843f633a563c23c606593060165Jeff Tinker    Mutex::Autolock autoLock(mLock);
9846d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
9856d998b67be330843f633a563c23c606593060165Jeff Tinker
9866d998b67be330843f633a563c23c606593060165Jeff Tinker    if (connected == NULL || max == NULL) {
9876d998b67be330843f633a563c23c606593060165Jeff Tinker        return BAD_VALUE;
988a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    }
9896d998b67be330843f633a563c23c606593060165Jeff Tinker    status_t err = UNKNOWN_ERROR;
990a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
9916d998b67be330843f633a563c23c606593060165Jeff Tinker    if (mPluginV1_1 == NULL) {
9926d998b67be330843f633a563c23c606593060165Jeff Tinker        return ERROR_DRM_CANNOT_HANDLE;
9936d998b67be330843f633a563c23c606593060165Jeff Tinker    }
9946d998b67be330843f633a563c23c606593060165Jeff Tinker
9956d998b67be330843f633a563c23c606593060165Jeff Tinker    *connected = DrmPlugin::kHdcpLevelUnknown;
9966d998b67be330843f633a563c23c606593060165Jeff Tinker    *max = DrmPlugin::kHdcpLevelUnknown;
9976d998b67be330843f633a563c23c606593060165Jeff Tinker
9986d998b67be330843f633a563c23c606593060165Jeff Tinker    Return<void> hResult = mPluginV1_1->getHdcpLevels(
9996d998b67be330843f633a563c23c606593060165Jeff Tinker            [&](Status status, const HdcpLevel& hConnected, const HdcpLevel& hMax) {
10006d998b67be330843f633a563c23c606593060165Jeff Tinker                if (status == Status::OK) {
10016d998b67be330843f633a563c23c606593060165Jeff Tinker                    *connected = toHdcpLevel(hConnected);
10026d998b67be330843f633a563c23c606593060165Jeff Tinker                    *max = toHdcpLevel(hMax);
10036d998b67be330843f633a563c23c606593060165Jeff Tinker                }
10046d998b67be330843f633a563c23c606593060165Jeff Tinker                err = toStatusT(status);
10056d998b67be330843f633a563c23c606593060165Jeff Tinker            }
10066d998b67be330843f633a563c23c606593060165Jeff Tinker    );
10076d998b67be330843f633a563c23c606593060165Jeff Tinker
10086d998b67be330843f633a563c23c606593060165Jeff Tinker    return hResult.isOk() ? err : DEAD_OBJECT;
10096d998b67be330843f633a563c23c606593060165Jeff Tinker}
10106d998b67be330843f633a563c23c606593060165Jeff Tinker
10116d998b67be330843f633a563c23c606593060165Jeff Tinkerstatus_t DrmHal::getNumberOfSessions(uint32_t *open, uint32_t *max) const {
10126d998b67be330843f633a563c23c606593060165Jeff Tinker    Mutex::Autolock autoLock(mLock);
10136d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
10146d998b67be330843f633a563c23c606593060165Jeff Tinker
10156d998b67be330843f633a563c23c606593060165Jeff Tinker    if (open == NULL || max == NULL) {
10166d998b67be330843f633a563c23c606593060165Jeff Tinker        return BAD_VALUE;
10176d998b67be330843f633a563c23c606593060165Jeff Tinker    }
10186d998b67be330843f633a563c23c606593060165Jeff Tinker    status_t err = UNKNOWN_ERROR;
10196d998b67be330843f633a563c23c606593060165Jeff Tinker
10206d998b67be330843f633a563c23c606593060165Jeff Tinker    *open = 0;
10216d998b67be330843f633a563c23c606593060165Jeff Tinker    *max = 0;
10226d998b67be330843f633a563c23c606593060165Jeff Tinker
10236d998b67be330843f633a563c23c606593060165Jeff Tinker    if (mPluginV1_1 == NULL) {
10246d998b67be330843f633a563c23c606593060165Jeff Tinker        return ERROR_DRM_CANNOT_HANDLE;
10256d998b67be330843f633a563c23c606593060165Jeff Tinker    }
10266d998b67be330843f633a563c23c606593060165Jeff Tinker
10276d998b67be330843f633a563c23c606593060165Jeff Tinker    Return<void> hResult = mPluginV1_1->getNumberOfSessions(
10286d998b67be330843f633a563c23c606593060165Jeff Tinker            [&](Status status, uint32_t hOpen, uint32_t hMax) {
10296d998b67be330843f633a563c23c606593060165Jeff Tinker                if (status == Status::OK) {
10306d998b67be330843f633a563c23c606593060165Jeff Tinker                    *open = hOpen;
10316d998b67be330843f633a563c23c606593060165Jeff Tinker                    *max = hMax;
10326d998b67be330843f633a563c23c606593060165Jeff Tinker                }
10336d998b67be330843f633a563c23c606593060165Jeff Tinker                err = toStatusT(status);
10346d998b67be330843f633a563c23c606593060165Jeff Tinker            }
10356d998b67be330843f633a563c23c606593060165Jeff Tinker    );
10366d998b67be330843f633a563c23c606593060165Jeff Tinker
10376d998b67be330843f633a563c23c606593060165Jeff Tinker    return hResult.isOk() ? err : DEAD_OBJECT;
10386d998b67be330843f633a563c23c606593060165Jeff Tinker}
10396d998b67be330843f633a563c23c606593060165Jeff Tinker
10406d998b67be330843f633a563c23c606593060165Jeff Tinkerstatus_t DrmHal::getSecurityLevel(Vector<uint8_t> const &sessionId,
10416d998b67be330843f633a563c23c606593060165Jeff Tinker        DrmPlugin::SecurityLevel *level) const {
10426d998b67be330843f633a563c23c606593060165Jeff Tinker    Mutex::Autolock autoLock(mLock);
10436d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
10446d998b67be330843f633a563c23c606593060165Jeff Tinker
10456d998b67be330843f633a563c23c606593060165Jeff Tinker    if (level == NULL) {
10466d998b67be330843f633a563c23c606593060165Jeff Tinker        return BAD_VALUE;
10476d998b67be330843f633a563c23c606593060165Jeff Tinker    }
10486d998b67be330843f633a563c23c606593060165Jeff Tinker    status_t err = UNKNOWN_ERROR;
10496d998b67be330843f633a563c23c606593060165Jeff Tinker
10506d998b67be330843f633a563c23c606593060165Jeff Tinker    if (mPluginV1_1 == NULL) {
10516d998b67be330843f633a563c23c606593060165Jeff Tinker        return ERROR_DRM_CANNOT_HANDLE;
10526d998b67be330843f633a563c23c606593060165Jeff Tinker    }
10536d998b67be330843f633a563c23c606593060165Jeff Tinker
10546d998b67be330843f633a563c23c606593060165Jeff Tinker    *level = DrmPlugin::kSecurityLevelUnknown;
10556d998b67be330843f633a563c23c606593060165Jeff Tinker
10566d998b67be330843f633a563c23c606593060165Jeff Tinker    Return<void> hResult = mPluginV1_1->getSecurityLevel(toHidlVec(sessionId),
10576d998b67be330843f633a563c23c606593060165Jeff Tinker            [&](Status status, SecurityLevel hLevel) {
10586d998b67be330843f633a563c23c606593060165Jeff Tinker                if (status == Status::OK) {
10596d998b67be330843f633a563c23c606593060165Jeff Tinker                    *level = toSecurityLevel(hLevel);
10606d998b67be330843f633a563c23c606593060165Jeff Tinker                }
10616d998b67be330843f633a563c23c606593060165Jeff Tinker                err = toStatusT(status);
10626d998b67be330843f633a563c23c606593060165Jeff Tinker            }
10636d998b67be330843f633a563c23c606593060165Jeff Tinker    );
10646d998b67be330843f633a563c23c606593060165Jeff Tinker
10656d998b67be330843f633a563c23c606593060165Jeff Tinker    return hResult.isOk() ? err : DEAD_OBJECT;
10666d998b67be330843f633a563c23c606593060165Jeff Tinker}
10676d998b67be330843f633a563c23c606593060165Jeff Tinker
1068a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::getPropertyString(String8 const &name, String8 &value ) const {
1069a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
107033ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce    return getPropertyStringInternal(name, value);
107133ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce}
107233ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce
107333ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Brucestatus_t DrmHal::getPropertyStringInternal(String8 const &name, String8 &value) const {
107433ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce    // This function is internal to the class and should only be called while
107533ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce    // mLock is already held.
10766d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
1077a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1078a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    status_t err = UNKNOWN_ERROR;
1079a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1080a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Return<void> hResult = mPlugin->getPropertyString(toHidlString(name),
1081a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            [&](Status status, const hidl_string& hValue) {
1082a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                if (status == Status::OK) {
1083a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    value = toString8(hValue);
1084a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                }
1085a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                err = toStatusT(status);
1086a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            }
1087a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    );
1088a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1089a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return hResult.isOk() ? err : DEAD_OBJECT;
1090a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
1091a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1092a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::getPropertyByteArray(String8 const &name, Vector<uint8_t> &value ) const {
1093a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
109433ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce    return getPropertyByteArrayInternal(name, value);
109533ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce}
109633ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce
109733ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Brucestatus_t DrmHal::getPropertyByteArrayInternal(String8 const &name, Vector<uint8_t> &value ) const {
109833ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce    // This function is internal to the class and should only be called while
109933ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce    // mLock is already held.
11006d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
1101a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1102a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    status_t err = UNKNOWN_ERROR;
1103a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1104a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Return<void> hResult = mPlugin->getPropertyByteArray(toHidlString(name),
1105a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            [&](Status status, const hidl_vec<uint8_t>& hValue) {
1106a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                if (status == Status::OK) {
1107a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    value = toVector(hValue);
1108a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                }
1109a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                err = toStatusT(status);
1110a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            }
1111a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    );
1112a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1113cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone    err = hResult.isOk() ? err : DEAD_OBJECT;
1114cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone    if (name == kPropertyDeviceUniqueId) {
1115cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone        mMetrics.mGetDeviceUniqueIdCounter.Increment(err);
1116cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone    }
1117cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone    return err;
1118a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
1119a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1120a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::setPropertyString(String8 const &name, String8 const &value ) const {
1121a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
11226d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
1123a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
112458ad475e3aa567bec63108970855e6518c90d42eJeff Tinker    Return<Status> status = mPlugin->setPropertyString(toHidlString(name),
1125a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            toHidlString(value));
112658ad475e3aa567bec63108970855e6518c90d42eJeff Tinker    return status.isOk() ? toStatusT(status) : DEAD_OBJECT;
1127a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
1128a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1129a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::setPropertyByteArray(String8 const &name,
1130a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                                   Vector<uint8_t> const &value ) const {
1131a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
11326d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
1133a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
113458ad475e3aa567bec63108970855e6518c90d42eJeff Tinker    Return<Status> status = mPlugin->setPropertyByteArray(toHidlString(name),
1135a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            toHidlVec(value));
113658ad475e3aa567bec63108970855e6518c90d42eJeff Tinker    return status.isOk() ? toStatusT(status) : DEAD_OBJECT;
1137a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
1138a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
113928f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stonestatus_t DrmHal::getMetrics(PersistableBundle* metrics) {
114028f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone    if (metrics == nullptr) {
114128f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone        return UNEXPECTED_NULL;
114228f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone    }
114328f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone    mMetrics.Export(metrics);
114428f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone
114528f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone    // Append vendor metrics if they are supported.
114628f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone    if (mPluginV1_1 != NULL) {
114728f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone        String8 vendor;
114828f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone        String8 description;
114928f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone        if (getPropertyStringInternal(String8("vendor"), vendor) != OK
115028f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone            || vendor.isEmpty()) {
115128f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone          ALOGE("Get vendor failed or is empty");
115228f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone          vendor = "NONE";
115328f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone        }
115428f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone        if (getPropertyStringInternal(String8("description"), description) != OK
115528f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone            || description.isEmpty()) {
115628f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone          ALOGE("Get description failed or is empty.");
115728f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone          description = "NONE";
115828f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone        }
115928f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone        vendor += ".";
116028f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone        vendor += description;
116128f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone
116228f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone        hidl_vec<DrmMetricGroup> pluginMetrics;
116328f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone        status_t err = UNKNOWN_ERROR;
116428f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone
116528f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone        Return<void> status = mPluginV1_1->getMetrics(
116628f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone                [&](Status status, hidl_vec<DrmMetricGroup> pluginMetrics) {
116728f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone                    if (status != Status::OK) {
116828f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone                      ALOGV("Error getting plugin metrics: %d", status);
116928f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone                    } else {
117028f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone                        PersistableBundle pluginBundle;
117128f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone                        if (MediaDrmMetrics::HidlMetricsToBundle(
117228f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone                                pluginMetrics, &pluginBundle) == OK) {
117328f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone                            metrics->putPersistableBundle(String16(vendor), pluginBundle);
117428f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone                        }
117528f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone                    }
117628f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone                    err = toStatusT(status);
117728f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone                });
117828f27c3bee88b0f47b1086feeaa904bcdec37af6Adam Stone        return status.isOk() ? err : DEAD_OBJECT;
1179f0e618d0ee16c63f918c7bb87ec1ff264d177746Adam Stone    }
1180f0e618d0ee16c63f918c7bb87ec1ff264d177746Adam Stone
1181ab394d13bab3a84f23677357576cee7a6f0c7899Adam Stone    return OK;
1182ab394d13bab3a84f23677357576cee7a6f0c7899Adam Stone}
1183a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1184a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::setCipherAlgorithm(Vector<uint8_t> const &sessionId,
1185a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                                 String8 const &algorithm) {
1186a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
11876d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
1188a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1189a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    DrmSessionManager::Instance()->useSession(sessionId);
1190a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1191e641294b59e2a0792d894139d739228f182409b4Jeff Tinker    Return<Status> status = mPlugin->setCipherAlgorithm(toHidlVec(sessionId),
1192a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            toHidlString(algorithm));
1193e641294b59e2a0792d894139d739228f182409b4Jeff Tinker    return status.isOk() ? toStatusT(status) : DEAD_OBJECT;
1194a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
1195a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1196a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::setMacAlgorithm(Vector<uint8_t> const &sessionId,
1197a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                              String8 const &algorithm) {
1198a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
11996d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
1200a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1201a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    DrmSessionManager::Instance()->useSession(sessionId);
1202a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1203e641294b59e2a0792d894139d739228f182409b4Jeff Tinker    Return<Status> status = mPlugin->setMacAlgorithm(toHidlVec(sessionId),
1204a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            toHidlString(algorithm));
1205e641294b59e2a0792d894139d739228f182409b4Jeff Tinker    return status.isOk() ? toStatusT(status) : DEAD_OBJECT;
1206a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
1207a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1208a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::encrypt(Vector<uint8_t> const &sessionId,
120968b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong        Vector<uint8_t> const &keyId, Vector<uint8_t> const &input,
121068b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong        Vector<uint8_t> const &iv, Vector<uint8_t> &output) {
1211a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
12126d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
1213a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1214a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    DrmSessionManager::Instance()->useSession(sessionId);
1215a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1216a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    status_t err = UNKNOWN_ERROR;
1217a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1218a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Return<void> hResult = mPlugin->encrypt(toHidlVec(sessionId),
1219a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            toHidlVec(keyId), toHidlVec(input), toHidlVec(iv),
1220a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            [&](Status status, const hidl_vec<uint8_t>& hOutput) {
1221a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                if (status == Status::OK) {
1222a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    output = toVector(hOutput);
1223a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                }
1224a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                err = toStatusT(status);
1225a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            }
1226a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    );
1227a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1228a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return hResult.isOk() ? err : DEAD_OBJECT;
1229a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
1230a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1231a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::decrypt(Vector<uint8_t> const &sessionId,
123268b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong        Vector<uint8_t> const &keyId, Vector<uint8_t> const &input,
123368b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong        Vector<uint8_t> const &iv, Vector<uint8_t> &output) {
1234a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
12356d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
1236a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1237a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    DrmSessionManager::Instance()->useSession(sessionId);
1238a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1239a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    status_t  err = UNKNOWN_ERROR;
1240a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1241a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Return<void> hResult = mPlugin->decrypt(toHidlVec(sessionId),
1242a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            toHidlVec(keyId), toHidlVec(input), toHidlVec(iv),
1243a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            [&](Status status, const hidl_vec<uint8_t>& hOutput) {
1244a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                if (status == Status::OK) {
1245a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    output = toVector(hOutput);
1246a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                }
1247a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                err = toStatusT(status);
1248a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            }
1249a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    );
1250a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1251a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return hResult.isOk() ? err : DEAD_OBJECT;
1252a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
1253a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1254a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::sign(Vector<uint8_t> const &sessionId,
125568b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong        Vector<uint8_t> const &keyId, Vector<uint8_t> const &message,
125668b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong        Vector<uint8_t> &signature) {
1257a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
12586d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
1259a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1260a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    DrmSessionManager::Instance()->useSession(sessionId);
1261a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1262a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    status_t err = UNKNOWN_ERROR;
1263a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1264a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Return<void> hResult = mPlugin->sign(toHidlVec(sessionId),
1265a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            toHidlVec(keyId), toHidlVec(message),
1266a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            [&](Status status, const hidl_vec<uint8_t>& hSignature)  {
1267a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                if (status == Status::OK) {
1268a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    signature = toVector(hSignature);
1269a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                }
1270a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                err = toStatusT(status);
1271a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            }
1272a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    );
1273a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1274a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return hResult.isOk() ? err : DEAD_OBJECT;
1275a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
1276a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1277a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::verify(Vector<uint8_t> const &sessionId,
127868b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong        Vector<uint8_t> const &keyId, Vector<uint8_t> const &message,
127968b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong        Vector<uint8_t> const &signature, bool &match) {
1280a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
12816d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
1282a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1283a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    DrmSessionManager::Instance()->useSession(sessionId);
1284a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1285a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    status_t err = UNKNOWN_ERROR;
1286a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1287a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Return<void> hResult = mPlugin->verify(toHidlVec(sessionId),toHidlVec(keyId),
1288a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            toHidlVec(message), toHidlVec(signature),
1289a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            [&](Status status, bool hMatch) {
1290a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                if (status == Status::OK) {
1291a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    match = hMatch;
1292a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                } else {
1293a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    match = false;
1294a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                }
1295a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                err = toStatusT(status);
1296a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            }
1297a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    );
1298a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1299a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return hResult.isOk() ? err : DEAD_OBJECT;
1300a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
1301a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1302a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::signRSA(Vector<uint8_t> const &sessionId,
130368b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong        String8 const &algorithm, Vector<uint8_t> const &message,
130468b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong        Vector<uint8_t> const &wrappedKey, Vector<uint8_t> &signature) {
1305a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
13066d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
1307a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1308a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    if (!checkPermission("android.permission.ACCESS_DRM_CERTIFICATES")) {
1309a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        return -EPERM;
1310a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    }
1311a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1312a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    DrmSessionManager::Instance()->useSession(sessionId);
1313a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1314a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    status_t err = UNKNOWN_ERROR;
1315a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1316a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Return<void> hResult = mPlugin->signRSA(toHidlVec(sessionId),
1317a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            toHidlString(algorithm), toHidlVec(message), toHidlVec(wrappedKey),
1318a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            [&](Status status, const hidl_vec<uint8_t>& hSignature) {
1319a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                if (status == Status::OK) {
1320a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    signature = toVector(hSignature);
1321a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                }
1322a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                err = toStatusT(status);
1323a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            }
1324a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        );
1325a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1326a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return hResult.isOk() ? err : DEAD_OBJECT;
1327a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
1328a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1329a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkervoid DrmHal::binderDied(const wp<IBinder> &the_late_who __unused)
1330a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker{
13317dfe28f246bce404778f94e977b52699adfcb4eaJeff Tinker    cleanup();
1332a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
1333a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1334a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkervoid DrmHal::writeByteArray(Parcel &obj, hidl_vec<uint8_t> const &vec)
1335a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker{
1336a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    if (vec.size()) {
1337a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        obj.writeInt32(vec.size());
1338a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        obj.write(vec.data(), vec.size());
1339a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    } else {
1340a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        obj.writeInt32(0);
1341a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    }
1342a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
1343a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1344fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stonevoid DrmHal::reportFrameworkMetrics() const
1345fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone{
1346fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone    MediaAnalyticsItem item("mediadrm");
1347fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone    item.generateSessionID();
1348fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone    item.setPkgName(mMetrics.GetAppPackageName().c_str());
1349fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone    String8 vendor;
1350fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone    String8 description;
1351fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone    status_t result = getPropertyStringInternal(String8("vendor"), vendor);
1352fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone    if (result != OK) {
1353987ac7056040ed1594dc975c8a9d7cee463fa834Jeff Tinker        ALOGE("Failed to get vendor from drm plugin: %d", result);
1354fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone    } else {
1355fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone        item.setCString("vendor", vendor.c_str());
1356fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone    }
1357fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone    result = getPropertyStringInternal(String8("description"), description);
1358fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone    if (result != OK) {
1359987ac7056040ed1594dc975c8a9d7cee463fa834Jeff Tinker        ALOGE("Failed to get description from drm plugin: %d", result);
1360fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone    } else {
1361fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone        item.setCString("description", description.c_str());
1362fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone    }
1363fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone
1364fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone    std::string serializedMetrics;
1365fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone    result = mMetrics.GetSerializedMetrics(&serializedMetrics);
1366fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone    if (result != OK) {
1367987ac7056040ed1594dc975c8a9d7cee463fa834Jeff Tinker        ALOGE("Failed to serialize framework metrics: %d", result);
1368fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone    }
136932494f5438db362e96b69e5fda7b2fd34633b562Adam Stone    std::string b64EncodedMetrics = toBase64StringNoPad(serializedMetrics.data(),
137032494f5438db362e96b69e5fda7b2fd34633b562Adam Stone                                                        serializedMetrics.size());
137132494f5438db362e96b69e5fda7b2fd34633b562Adam Stone    if (!b64EncodedMetrics.empty()) {
137232494f5438db362e96b69e5fda7b2fd34633b562Adam Stone        item.setCString("serialized_metrics", b64EncodedMetrics.c_str());
1373fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone    }
1374fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone    if (!item.selfrecord()) {
1375987ac7056040ed1594dc975c8a9d7cee463fa834Jeff Tinker        ALOGE("Failed to self record framework metrics");
1376fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone    }
1377fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stone}
1378ab394d13bab3a84f23677357576cee7a6f0c7899Adam Stone
1379fb679e38bbc91614faa917024adddeb51ff07d0aAdam Stonevoid DrmHal::reportPluginMetrics() const
138033ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce{
138132494f5438db362e96b69e5fda7b2fd34633b562Adam Stone    Vector<uint8_t> metricsVector;
138233ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce    String8 vendor;
138333ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce    String8 description;
138433ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce    if (getPropertyStringInternal(String8("vendor"), vendor) == OK &&
138533ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce            getPropertyStringInternal(String8("description"), description) == OK &&
138632494f5438db362e96b69e5fda7b2fd34633b562Adam Stone            getPropertyByteArrayInternal(String8("metrics"), metricsVector) == OK) {
138732494f5438db362e96b69e5fda7b2fd34633b562Adam Stone        std::string metricsString = toBase64StringNoPad(metricsVector.array(),
138832494f5438db362e96b69e5fda7b2fd34633b562Adam Stone                                                        metricsVector.size());
138932494f5438db362e96b69e5fda7b2fd34633b562Adam Stone        status_t res = android::reportDrmPluginMetrics(metricsString, vendor,
139032494f5438db362e96b69e5fda7b2fd34633b562Adam Stone                                                       description, mAppPackageName);
139133ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce        if (res != OK) {
1392987ac7056040ed1594dc975c8a9d7cee463fa834Jeff Tinker            ALOGE("Metrics were retrieved but could not be reported: %d", res);
139333ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce        }
139433ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce    }
139533ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce}
139633ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce
1397a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}  // namespace android
1398