DrmHal.cpp revision 637b7855829920114a8863b93fe52203b7471eea
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"
19a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#include <utils/Log.h>
20a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
21a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#include <binder/IPCThreadState.h>
22a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#include <binder/IServiceManager.h>
23a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
24a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#include <android/hardware/drm/1.0/IDrmFactory.h>
25a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#include <android/hardware/drm/1.0/IDrmPlugin.h>
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
30a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#include <media/DrmHal.h>
31a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#include <media/DrmSessionClientInterface.h>
32a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#include <media/DrmSessionManager.h>
33f0e618d0ee16c63f918c7bb87ec1ff264d177746Adam Stone#include <media/EventMetric.h>
3433ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce#include <media/PluginMetricsReporting.h>
35a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#include <media/drm/DrmAPI.h>
36a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#include <media/stagefright/foundation/ADebug.h>
37a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#include <media/stagefright/foundation/AString.h>
38a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#include <media/stagefright/foundation/hexdump.h>
39a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#include <media/stagefright/MediaErrors.h>
40a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
416d998b67be330843f633a563c23c606593060165Jeff Tinkerusing drm::V1_0::KeyedVector;
426d998b67be330843f633a563c23c606593060165Jeff Tinkerusing drm::V1_0::KeyStatusType;
436d998b67be330843f633a563c23c606593060165Jeff Tinkerusing drm::V1_0::KeyType;
446d998b67be330843f633a563c23c606593060165Jeff Tinkerusing drm::V1_0::KeyValue;
456d998b67be330843f633a563c23c606593060165Jeff Tinkerusing drm::V1_1::HdcpLevel;;
466d998b67be330843f633a563c23c606593060165Jeff Tinkerusing drm::V1_0::SecureStop;
4715177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinkerusing drm::V1_1::SecureStopRelease;
4815177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinkerusing drm::V1_0::SecureStopId;
496d998b67be330843f633a563c23c606593060165Jeff Tinkerusing drm::V1_1::SecurityLevel;
506d998b67be330843f633a563c23c606593060165Jeff Tinkerusing drm::V1_0::Status;
51a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerusing ::android::hardware::hidl_array;
52a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerusing ::android::hardware::hidl_string;
53a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerusing ::android::hardware::hidl_vec;
54a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerusing ::android::hardware::Return;
55a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerusing ::android::hardware::Void;
56abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinkerusing ::android::hidl::manager::V1_0::IServiceManager;
57637b7855829920114a8863b93fe52203b7471eeaAdam Stoneusing ::android::os::PersistableBundle;
58a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerusing ::android::sp;
59a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
60cea91ce60260d7ebb94449ad7674150fdc227886Adam Stonenamespace {
61cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone
62cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone// This constant corresponds to the PROPERTY_DEVICE_UNIQUE_ID constant
63cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone// in the MediaDrm API.
64cea91ce60260d7ebb94449ad7674150fdc227886Adam Stoneconstexpr char kPropertyDeviceUniqueId[] = "deviceUniqueId";
65cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone
66cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone}
67cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone
68a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkernamespace android {
69a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
706d998b67be330843f633a563c23c606593060165Jeff Tinker#define INIT_CHECK() {if (mInitCheck != OK) return mInitCheck;}
716d998b67be330843f633a563c23c606593060165Jeff Tinker
72a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic inline int getCallingPid() {
73a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return IPCThreadState::self()->getCallingPid();
74a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
75a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
76a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic bool checkPermission(const char* permissionString) {
77a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    if (getpid() == IPCThreadState::self()->getCallingPid()) return true;
78a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    bool ok = checkCallingPermission(String16(permissionString));
79a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    if (!ok) ALOGE("Request requires %s", permissionString);
80a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return ok;
81a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
82a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
83a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic const Vector<uint8_t> toVector(const hidl_vec<uint8_t> &vec) {
84a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Vector<uint8_t> vector;
85a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    vector.appendArray(vec.data(), vec.size());
86a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return *const_cast<const Vector<uint8_t> *>(&vector);
87a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
88a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
89a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic hidl_vec<uint8_t> toHidlVec(const Vector<uint8_t> &vector) {
90a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    hidl_vec<uint8_t> vec;
91a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    vec.setToExternal(const_cast<uint8_t *>(vector.array()), vector.size());
92a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return vec;
93a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
94a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
95a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic String8 toString8(const hidl_string &string) {
96a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return String8(string.c_str());
97a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
98a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
99a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic hidl_string toHidlString(const String8& string) {
100a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return hidl_string(string.string());
101a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
102a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1036d998b67be330843f633a563c23c606593060165Jeff Tinkerstatic DrmPlugin::SecurityLevel toSecurityLevel(SecurityLevel level) {
1046d998b67be330843f633a563c23c606593060165Jeff Tinker    switch(level) {
1056d998b67be330843f633a563c23c606593060165Jeff Tinker    case SecurityLevel::SW_SECURE_CRYPTO:
1066d998b67be330843f633a563c23c606593060165Jeff Tinker        return DrmPlugin::kSecurityLevelSwSecureCrypto;
1076d998b67be330843f633a563c23c606593060165Jeff Tinker    case SecurityLevel::SW_SECURE_DECODE:
1086d998b67be330843f633a563c23c606593060165Jeff Tinker        return DrmPlugin::kSecurityLevelSwSecureDecode;
1096d998b67be330843f633a563c23c606593060165Jeff Tinker    case SecurityLevel::HW_SECURE_CRYPTO:
1106d998b67be330843f633a563c23c606593060165Jeff Tinker        return DrmPlugin::kSecurityLevelHwSecureCrypto;
1116d998b67be330843f633a563c23c606593060165Jeff Tinker    case SecurityLevel::HW_SECURE_DECODE:
1126d998b67be330843f633a563c23c606593060165Jeff Tinker        return DrmPlugin::kSecurityLevelHwSecureDecode;
1136d998b67be330843f633a563c23c606593060165Jeff Tinker    case SecurityLevel::HW_SECURE_ALL:
1146d998b67be330843f633a563c23c606593060165Jeff Tinker        return DrmPlugin::kSecurityLevelHwSecureAll;
1156d998b67be330843f633a563c23c606593060165Jeff Tinker    default:
1166d998b67be330843f633a563c23c606593060165Jeff Tinker        return DrmPlugin::kSecurityLevelUnknown;
1176d998b67be330843f633a563c23c606593060165Jeff Tinker    }
1186d998b67be330843f633a563c23c606593060165Jeff Tinker}
1196d998b67be330843f633a563c23c606593060165Jeff Tinker
1206d998b67be330843f633a563c23c606593060165Jeff Tinkerstatic DrmPlugin::HdcpLevel toHdcpLevel(HdcpLevel level) {
1216d998b67be330843f633a563c23c606593060165Jeff Tinker    switch(level) {
1226d998b67be330843f633a563c23c606593060165Jeff Tinker    case HdcpLevel::HDCP_NONE:
1236d998b67be330843f633a563c23c606593060165Jeff Tinker        return DrmPlugin::kHdcpNone;
1246d998b67be330843f633a563c23c606593060165Jeff Tinker    case HdcpLevel::HDCP_V1:
1256d998b67be330843f633a563c23c606593060165Jeff Tinker        return DrmPlugin::kHdcpV1;
1266d998b67be330843f633a563c23c606593060165Jeff Tinker    case HdcpLevel::HDCP_V2:
1276d998b67be330843f633a563c23c606593060165Jeff Tinker        return DrmPlugin::kHdcpV2;
1286d998b67be330843f633a563c23c606593060165Jeff Tinker    case HdcpLevel::HDCP_V2_1:
1296d998b67be330843f633a563c23c606593060165Jeff Tinker        return DrmPlugin::kHdcpV2_1;
1306d998b67be330843f633a563c23c606593060165Jeff Tinker    case HdcpLevel::HDCP_V2_2:
1316d998b67be330843f633a563c23c606593060165Jeff Tinker        return DrmPlugin::kHdcpV2_2;
1326d998b67be330843f633a563c23c606593060165Jeff Tinker    case HdcpLevel::HDCP_NO_OUTPUT:
1336d998b67be330843f633a563c23c606593060165Jeff Tinker        return DrmPlugin::kHdcpNoOutput;
1346d998b67be330843f633a563c23c606593060165Jeff Tinker    default:
1356d998b67be330843f633a563c23c606593060165Jeff Tinker        return DrmPlugin::kHdcpLevelUnknown;
1366d998b67be330843f633a563c23c606593060165Jeff Tinker    }
1376d998b67be330843f633a563c23c606593060165Jeff Tinker}
1386d998b67be330843f633a563c23c606593060165Jeff Tinker
139a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
140a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic ::KeyedVector toHidlKeyedVector(const KeyedVector<String8, String8>&
141a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        keyedVector) {
142a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    std::vector<KeyValue> stdKeyedVector;
143a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    for (size_t i = 0; i < keyedVector.size(); i++) {
144a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        KeyValue keyValue;
145a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        keyValue.key = toHidlString(keyedVector.keyAt(i));
146a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        keyValue.value = toHidlString(keyedVector.valueAt(i));
147a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        stdKeyedVector.push_back(keyValue);
148a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    }
149a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return ::KeyedVector(stdKeyedVector);
150a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
151a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
152a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic KeyedVector<String8, String8> toKeyedVector(const ::KeyedVector&
153a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        hKeyedVector) {
154a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    KeyedVector<String8, String8> keyedVector;
155a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    for (size_t i = 0; i < hKeyedVector.size(); i++) {
156a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        keyedVector.add(toString8(hKeyedVector[i].key),
157a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                toString8(hKeyedVector[i].value));
158a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    }
159a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return keyedVector;
160a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
161a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
162abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinkerstatic List<Vector<uint8_t>> toSecureStops(const hidl_vec<SecureStop>&
163a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        hSecureStops) {
164abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker    List<Vector<uint8_t>> secureStops;
165a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    for (size_t i = 0; i < hSecureStops.size(); i++) {
166a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        secureStops.push_back(toVector(hSecureStops[i].opaqueData));
167a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    }
168a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return secureStops;
169a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
170a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
17115177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinkerstatic List<Vector<uint8_t>> toSecureStopIds(const hidl_vec<SecureStopId>&
17215177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker        hSecureStopIds) {
17315177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker    List<Vector<uint8_t>> secureStopIds;
17415177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker    for (size_t i = 0; i < hSecureStopIds.size(); i++) {
17515177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker        secureStopIds.push_back(toVector(hSecureStopIds[i]));
17615177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker    }
17715177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker    return secureStopIds;
17815177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker}
17915177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker
180a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic status_t toStatusT(Status status) {
181a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    switch (status) {
182a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    case Status::OK:
183a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        return OK;
184a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        break;
185a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    case Status::ERROR_DRM_NO_LICENSE:
186a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        return ERROR_DRM_NO_LICENSE;
187a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        break;
188a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    case Status::ERROR_DRM_LICENSE_EXPIRED:
189a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        return ERROR_DRM_LICENSE_EXPIRED;
190a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        break;
191a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    case Status::ERROR_DRM_SESSION_NOT_OPENED:
192a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        return ERROR_DRM_SESSION_NOT_OPENED;
193a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        break;
194a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    case Status::ERROR_DRM_CANNOT_HANDLE:
195a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        return ERROR_DRM_CANNOT_HANDLE;
196a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        break;
197a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    case Status::ERROR_DRM_INVALID_STATE:
198a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        return ERROR_DRM_TAMPER_DETECTED;
199a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        break;
200a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    case Status::BAD_VALUE:
201a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        return BAD_VALUE;
202a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        break;
203a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    case Status::ERROR_DRM_NOT_PROVISIONED:
204a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        return ERROR_DRM_NOT_PROVISIONED;
205a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        break;
206a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    case Status::ERROR_DRM_RESOURCE_BUSY:
207a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        return ERROR_DRM_RESOURCE_BUSY;
208a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        break;
209a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    case Status::ERROR_DRM_DEVICE_REVOKED:
210a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        return ERROR_DRM_DEVICE_REVOKED;
211a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        break;
212a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    case Status::ERROR_DRM_UNKNOWN:
213a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    default:
214a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        return ERROR_DRM_UNKNOWN;
215a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        break;
216a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    }
217a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
218a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
219a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
220a53d6553fce1818bdf87833f93633c93ad1b5915Jeff TinkerMutex DrmHal::mLock;
221a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
222a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstruct DrmSessionClient : public DrmSessionClientInterface {
223a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    explicit DrmSessionClient(DrmHal* drm) : mDrm(drm) {}
224a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
225a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    virtual bool reclaimSession(const Vector<uint8_t>& sessionId) {
226a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        sp<DrmHal> drm = mDrm.promote();
227a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        if (drm == NULL) {
228a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            return true;
229a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        }
230a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        status_t err = drm->closeSession(sessionId);
231a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        if (err != OK) {
232a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            return false;
233a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        }
234a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        drm->sendEvent(EventType::SESSION_RECLAIMED,
235a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                toHidlVec(sessionId), hidl_vec<uint8_t>());
236a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        return true;
237a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    }
238a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
239a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerprotected:
240a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    virtual ~DrmSessionClient() {}
241a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
242a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerprivate:
243a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    wp<DrmHal> mDrm;
244a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
245a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    DISALLOW_EVIL_CONSTRUCTORS(DrmSessionClient);
246a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker};
247a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
248a53d6553fce1818bdf87833f93633c93ad1b5915Jeff TinkerDrmHal::DrmHal()
249a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker   : mDrmSessionClient(new DrmSessionClient(this)),
250abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker     mFactories(makeDrmFactories()),
251abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker     mInitCheck((mFactories.size() == 0) ? ERROR_UNSUPPORTED : NO_INIT) {
252a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
253a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
2546133281c9b06c1d1176eca7f07401bba1067081eJeff Tinkervoid DrmHal::closeOpenSessions() {
2556133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker    if (mPlugin != NULL) {
256b2b66fa4da5528cf9cdfc32f619e81e4d97ca654Jeff Tinker        for (size_t i = 0; i < mOpenSessions.size(); i++) {
257b2b66fa4da5528cf9cdfc32f619e81e4d97ca654Jeff Tinker            mPlugin->closeSession(toHidlVec(mOpenSessions[i]));
258b2b66fa4da5528cf9cdfc32f619e81e4d97ca654Jeff Tinker            DrmSessionManager::Instance()->removeSession(mOpenSessions[i]);
2596133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker        }
2606133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker    }
2616133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker    mOpenSessions.clear();
2626133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker}
2636133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker
264a53d6553fce1818bdf87833f93633c93ad1b5915Jeff TinkerDrmHal::~DrmHal() {
2656133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker    closeOpenSessions();
266a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    DrmSessionManager::Instance()->removeDrm(mDrmSessionClient);
267a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
268a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
269abeb36a8c2f044772297536e70340c3b245863e4Jeff TinkerVector<sp<IDrmFactory>> DrmHal::makeDrmFactories() {
270abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker    Vector<sp<IDrmFactory>> factories;
271c82b9c335e69b617817dace0ef64ad3df3f5080fJeff Tinker
272593111f4460f2b2e8f541e936670e3577d45fff6Jeff Tinker    auto manager = hardware::defaultServiceManager();
273c82b9c335e69b617817dace0ef64ad3df3f5080fJeff Tinker
274abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker    if (manager != NULL) {
275abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker        manager->listByInterface(IDrmFactory::descriptor,
276abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker                [&factories](const hidl_vec<hidl_string> &registered) {
277abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker                    for (const auto &instance : registered) {
278abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker                        auto factory = IDrmFactory::getService(instance);
279abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker                        if (factory != NULL) {
280abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker                            factories.push_back(factory);
281abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker                            ALOGI("makeDrmFactories: factory instance %s is %s",
282abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker                                    instance.c_str(),
283abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker                                    factory->isRemote() ? "Remote" : "Not Remote");
284abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker                        }
285abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker                    }
286abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker                }
287abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker            );
288abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker    }
289a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
290abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker    if (factories.size() == 0) {
291abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker        // must be in passthrough mode, load the default passthrough service
292e309b22bff1719f1fea84b247e4b2bc4c5f09eb5Jeff Tinker        auto passthrough = IDrmFactory::getService();
293abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker        if (passthrough != NULL) {
294abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker            ALOGI("makeDrmFactories: using default drm instance");
295abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker            factories.push_back(passthrough);
296abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker        } else {
297abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker            ALOGE("Failed to find any drm factories");
298abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker        }
299a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    }
300abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker    return factories;
301abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker}
302abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker
303abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinkersp<IDrmPlugin> DrmHal::makeDrmPlugin(const sp<IDrmFactory>& factory,
304abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker        const uint8_t uuid[16], const String8& appPackageName) {
305a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
306a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    sp<IDrmPlugin> plugin;
307abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker    Return<void> hResult = factory->createPlugin(uuid, appPackageName.string(),
308a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            [&](Status status, const sp<IDrmPlugin>& hPlugin) {
309abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker                if (status != Status::OK) {
310abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker                    ALOGE("Failed to make drm plugin");
311abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker                    return;
312abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker                }
313abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker                plugin = hPlugin;
314abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker            }
315abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker        );
316f0e89b0b248976f622fc41da4f678955399def08Jeff Tinker
317f0e89b0b248976f622fc41da4f678955399def08Jeff Tinker    if (!hResult.isOk()) {
318f0e89b0b248976f622fc41da4f678955399def08Jeff Tinker        ALOGE("createPlugin remote call failed");
319f0e89b0b248976f622fc41da4f678955399def08Jeff Tinker    }
320f0e89b0b248976f622fc41da4f678955399def08Jeff Tinker
321a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return plugin;
322a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
323a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
324a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::initCheck() const {
325a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return mInitCheck;
326a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
327a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
328a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::setListener(const sp<IDrmClient>& listener)
329a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker{
330a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock lock(mEventLock);
331a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    if (mListener != NULL){
332a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        IInterface::asBinder(mListener)->unlinkToDeath(this);
333a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    }
334a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    if (listener != NULL) {
335a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        IInterface::asBinder(listener)->linkToDeath(this);
336a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    }
337a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    mListener = listener;
338a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return NO_ERROR;
339a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
340a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
341a53d6553fce1818bdf87833f93633c93ad1b5915Jeff TinkerReturn<void> DrmHal::sendEvent(EventType hEventType,
342a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        const hidl_vec<uint8_t>& sessionId, const hidl_vec<uint8_t>& data) {
343cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone    mMetrics.mEventCounter.Increment(hEventType);
344a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
345a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    mEventLock.lock();
346a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    sp<IDrmClient> listener = mListener;
347a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    mEventLock.unlock();
348a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
349a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    if (listener != NULL) {
350a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        Parcel obj;
351a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        writeByteArray(obj, sessionId);
352a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        writeByteArray(obj, data);
353a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
354a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        Mutex::Autolock lock(mNotifyLock);
355a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        DrmPlugin::EventType eventType;
356a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        switch(hEventType) {
357a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        case EventType::PROVISION_REQUIRED:
358a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            eventType = DrmPlugin::kDrmPluginEventProvisionRequired;
359a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            break;
360a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        case EventType::KEY_NEEDED:
361a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            eventType = DrmPlugin::kDrmPluginEventKeyNeeded;
362a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            break;
363a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        case EventType::KEY_EXPIRED:
364a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            eventType = DrmPlugin::kDrmPluginEventKeyExpired;
365a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            break;
366a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        case EventType::VENDOR_DEFINED:
367a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            eventType = DrmPlugin::kDrmPluginEventVendorDefined;
368a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            break;
369b86f4b3ce066eadbfe9c2f420b16aaf2de741edbRahul Frias        case EventType::SESSION_RECLAIMED:
370b86f4b3ce066eadbfe9c2f420b16aaf2de741edbRahul Frias            eventType = DrmPlugin::kDrmPluginEventSessionReclaimed;
371b86f4b3ce066eadbfe9c2f420b16aaf2de741edbRahul Frias            break;
372a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        default:
373a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            return Void();
374a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        }
375a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        listener->notify(eventType, 0, &obj);
376a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    }
377a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return Void();
378a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
379a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
380a53d6553fce1818bdf87833f93633c93ad1b5915Jeff TinkerReturn<void> DrmHal::sendExpirationUpdate(const hidl_vec<uint8_t>& sessionId,
381a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        int64_t expiryTimeInMS) {
382a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
383a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    mEventLock.lock();
384a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    sp<IDrmClient> listener = mListener;
385a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    mEventLock.unlock();
386a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
387a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    if (listener != NULL) {
388a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        Parcel obj;
389a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        writeByteArray(obj, sessionId);
390a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        obj.writeInt64(expiryTimeInMS);
391a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
392a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        Mutex::Autolock lock(mNotifyLock);
393a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        listener->notify(DrmPlugin::kDrmPluginEventExpirationUpdate, 0, &obj);
394a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    }
395a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return Void();
396a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
397a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
398a53d6553fce1818bdf87833f93633c93ad1b5915Jeff TinkerReturn<void> DrmHal::sendKeysChange(const hidl_vec<uint8_t>& sessionId,
399a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        const hidl_vec<KeyStatus>& keyStatusList, bool hasNewUsableKey) {
400a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
401a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    mEventLock.lock();
402a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    sp<IDrmClient> listener = mListener;
403a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    mEventLock.unlock();
404a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
405a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    if (listener != NULL) {
406a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        Parcel obj;
407a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        writeByteArray(obj, sessionId);
408a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
409a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        size_t nKeys = keyStatusList.size();
410a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        obj.writeInt32(nKeys);
411a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        for (size_t i = 0; i < nKeys; ++i) {
412a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            const KeyStatus &keyStatus = keyStatusList[i];
413a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            writeByteArray(obj, keyStatus.keyId);
414a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            uint32_t type;
415a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            switch(keyStatus.type) {
416a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            case KeyStatusType::USABLE:
417a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                type = DrmPlugin::kKeyStatusType_Usable;
418a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                break;
419a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            case KeyStatusType::EXPIRED:
420a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                type = DrmPlugin::kKeyStatusType_Expired;
421a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                break;
422a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            case KeyStatusType::OUTPUTNOTALLOWED:
423a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                type = DrmPlugin::kKeyStatusType_OutputNotAllowed;
424a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                break;
425a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            case KeyStatusType::STATUSPENDING:
426a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                type = DrmPlugin::kKeyStatusType_StatusPending;
427a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                break;
428a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            case KeyStatusType::INTERNALERROR:
429a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            default:
430a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                type = DrmPlugin::kKeyStatusType_InternalError;
431a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                break;
432a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            }
433a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            obj.writeInt32(type);
434cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone            mMetrics.mKeyStatusChangeCounter.Increment(keyStatus.type);
435a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        }
436a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        obj.writeInt32(hasNewUsableKey);
437a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
438a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        Mutex::Autolock lock(mNotifyLock);
439a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        listener->notify(DrmPlugin::kDrmPluginEventKeysChange, 0, &obj);
440cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone    } else {
441cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone        // There's no listener. But we still want to count the key change
442cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone        // events.
443cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone        size_t nKeys = keyStatusList.size();
444cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone        for (size_t i = 0; i < nKeys; i++) {
445cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone            mMetrics.mKeyStatusChangeCounter.Increment(keyStatusList[i].type);
446cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone        }
447a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    }
448cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone
449a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return Void();
450a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
451a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
452a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerbool DrmHal::isCryptoSchemeSupported(const uint8_t uuid[16], const String8 &mimeType) {
453a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
454a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
455abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker    for (size_t i = 0; i < mFactories.size(); i++) {
456abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker        if (mFactories[i]->isCryptoSchemeSupported(uuid)) {
457abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker            if (mimeType != "") {
458abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker                if (mFactories[i]->isContentTypeSupported(mimeType.string())) {
459abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker                    return true;
460abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker                }
461abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker            } else {
462abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker                return true;
463abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker            }
464a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        }
465a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    }
466abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker    return false;
467a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
468a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
46968b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wongstatus_t DrmHal::createPlugin(const uint8_t uuid[16],
47068b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong        const String8& appPackageName) {
471a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
472a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
473abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker    for (size_t i = 0; i < mFactories.size(); i++) {
474abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker        if (mFactories[i]->isCryptoSchemeSupported(uuid)) {
475abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker            mPlugin = makeDrmPlugin(mFactories[i], uuid, appPackageName);
4765641aa251bf9a6e7b6bf8a73214f92e42c393a2fEdwin Wong            if (mPlugin != NULL) {
4775641aa251bf9a6e7b6bf8a73214f92e42c393a2fEdwin Wong                mPluginV1_1 = drm::V1_1::IDrmPlugin::castFrom(mPlugin);
4785641aa251bf9a6e7b6bf8a73214f92e42c393a2fEdwin Wong            }
479abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker        }
480abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker    }
481a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
482a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    if (mPlugin == NULL) {
483a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        mInitCheck = ERROR_UNSUPPORTED;
484a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    } else {
485319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker        if (!mPlugin->setListener(this).isOk()) {
486319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker            mInitCheck = DEAD_OBJECT;
487319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker        } else {
488319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker            mInitCheck = OK;
489319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker        }
490a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    }
491a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
492a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return mInitCheck;
493a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
494a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
495a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::destroyPlugin() {
496a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
4976d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
498a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
4996133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker    closeOpenSessions();
50033ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce    reportMetrics();
501a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    setListener(NULL);
502319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker    mInitCheck = NO_INIT;
503319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker
50470367f525a7bf5be52115608d190d72756e972eaJeff Tinker    if (mPlugin != NULL) {
505319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker        if (!mPlugin->setListener(NULL).isOk()) {
506319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker            mInitCheck = DEAD_OBJECT;
507319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker        }
50870367f525a7bf5be52115608d190d72756e972eaJeff Tinker    }
509a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    mPlugin.clear();
5105641aa251bf9a6e7b6bf8a73214f92e42c393a2fEdwin Wong    mPluginV1_1.clear();
511a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return OK;
512a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
513a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
514a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::openSession(Vector<uint8_t> &sessionId) {
515a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
5166d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
517a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
518a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    status_t  err = UNKNOWN_ERROR;
519a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
520a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    bool retry = true;
521a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    do {
522a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        hidl_vec<uint8_t> hSessionId;
523a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
524a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        Return<void> hResult = mPlugin->openSession(
525a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                [&](Status status, const hidl_vec<uint8_t>& id) {
526a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    if (status == Status::OK) {
527a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                        sessionId = toVector(id);
528a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    }
529a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    err = toStatusT(status);
530a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                }
531a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            );
532a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
533a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        if (!hResult.isOk()) {
534a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            err = DEAD_OBJECT;
535a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        }
536a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
537a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        if (err == ERROR_DRM_RESOURCE_BUSY && retry) {
538a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            mLock.unlock();
539a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            // reclaimSession may call back to closeSession, since mLock is
540a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            // shared between Drm instances, we should unlock here to avoid
541a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            // deadlock.
542a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            retry = DrmSessionManager::Instance()->reclaimSession(getCallingPid());
543a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            mLock.lock();
544a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        } else {
545a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            retry = false;
546a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        }
547a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    } while (retry);
548a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
549a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    if (err == OK) {
550a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        DrmSessionManager::Instance()->addSession(getCallingPid(),
551a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                mDrmSessionClient, sessionId);
5526133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker        mOpenSessions.push(sessionId);
553a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    }
554aaf87dd09686bdb47df0a638b622a4c2ea37a331Adam Stone
555f0e618d0ee16c63f918c7bb87ec1ff264d177746Adam Stone    mMetrics.mOpenSessionCounter.Increment(err);
556a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return err;
557a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
558a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
559a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::closeSession(Vector<uint8_t> const &sessionId) {
560a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
5616d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
562a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
563319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker    Return<Status> status = mPlugin->closeSession(toHidlVec(sessionId));
564319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker    if (status.isOk()) {
565319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker        if (status == Status::OK) {
566319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker            DrmSessionManager::Instance()->removeSession(sessionId);
567319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker            for (size_t i = 0; i < mOpenSessions.size(); i++) {
568319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker                if (mOpenSessions[i] == sessionId) {
569319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker                    mOpenSessions.removeAt(i);
570319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker                    break;
571319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker                }
5726133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker            }
5736133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker        }
574319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker        reportMetrics();
575cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone        status_t response = toStatusT(status);
576cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone        mMetrics.mCloseSessionCounter.Increment(response);
577cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone        return response;
578a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    }
579cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone    mMetrics.mCloseSessionCounter.Increment(DEAD_OBJECT);
580319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker    return DEAD_OBJECT;
581a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
582a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
583a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::getKeyRequest(Vector<uint8_t> const &sessionId,
584a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        Vector<uint8_t> const &initData, String8 const &mimeType,
585a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        DrmPlugin::KeyType keyType, KeyedVector<String8,
586a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        String8> const &optionalParameters, Vector<uint8_t> &request,
587a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        String8 &defaultUrl, DrmPlugin::KeyRequestType *keyRequestType) {
588a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
5896d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
590f0e618d0ee16c63f918c7bb87ec1ff264d177746Adam Stone    EventTimer<status_t> keyRequestTimer(&mMetrics.mGetKeyRequestTiming);
591a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
592a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    DrmSessionManager::Instance()->useSession(sessionId);
593a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
594a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    KeyType hKeyType;
595a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    if (keyType == DrmPlugin::kKeyType_Streaming) {
596a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        hKeyType = KeyType::STREAMING;
597a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    } else if (keyType == DrmPlugin::kKeyType_Offline) {
598a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        hKeyType = KeyType::OFFLINE;
599a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    } else if (keyType == DrmPlugin::kKeyType_Release) {
600a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        hKeyType = KeyType::RELEASE;
601a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    } else {
602f0e618d0ee16c63f918c7bb87ec1ff264d177746Adam Stone        keyRequestTimer.SetAttribute(BAD_VALUE);
603a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        return BAD_VALUE;
604a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    }
605a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
606a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    ::KeyedVector hOptionalParameters = toHidlKeyedVector(optionalParameters);
607a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
608a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    status_t err = UNKNOWN_ERROR;
609a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
61059bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias    if (mPluginV1_1 != NULL) {
61159bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias        Return<void> hResult =
61259bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias            mPluginV1_1->getKeyRequest_1_1(
61359bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias                toHidlVec(sessionId), toHidlVec(initData),
61459bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias                toHidlString(mimeType), hKeyType, hOptionalParameters,
61559bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias                [&](Status status, const hidl_vec<uint8_t>& hRequest,
61659bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias                    drm::V1_1::KeyRequestType hKeyRequestType,
61759bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias                    const hidl_string& hDefaultUrl) {
61859bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias
61959bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias            if (status == Status::OK) {
62059bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias                request = toVector(hRequest);
62159bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias                defaultUrl = toString8(hDefaultUrl);
62259bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias
62359bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias                switch (hKeyRequestType) {
62459bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias                    case drm::V1_1::KeyRequestType::INITIAL:
62559bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias                        *keyRequestType = DrmPlugin::kKeyRequestType_Initial;
62659bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias                        break;
62759bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias                    case drm::V1_1::KeyRequestType::RENEWAL:
62859bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias                        *keyRequestType = DrmPlugin::kKeyRequestType_Renewal;
62959bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias                        break;
63059bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias                    case drm::V1_1::KeyRequestType::RELEASE:
63159bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias                        *keyRequestType = DrmPlugin::kKeyRequestType_Release;
63259bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias                        break;
63359bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias                    case drm::V1_1::KeyRequestType::NONE:
63459bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias                        *keyRequestType = DrmPlugin::kKeyRequestType_None;
63559bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias                        break;
63659bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias                    case drm::V1_1::KeyRequestType::UPDATE:
63759bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias                        *keyRequestType = DrmPlugin::kKeyRequestType_Update;
63859bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias                        break;
63959bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias                    default:
64059bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias                        *keyRequestType = DrmPlugin::kKeyRequestType_Unknown;
64159bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias                        break;
64259bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias                }
64359bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias                err = toStatusT(status);
64459bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias            }
64559bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias        });
64659bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias        return hResult.isOk() ? err : DEAD_OBJECT;
64759bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias    }
64859bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias
649a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Return<void> hResult = mPlugin->getKeyRequest(toHidlVec(sessionId),
650a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            toHidlVec(initData), toHidlString(mimeType), hKeyType, hOptionalParameters,
651a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            [&](Status status, const hidl_vec<uint8_t>& hRequest,
65259bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias                    drm::V1_0::KeyRequestType hKeyRequestType,
65359bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias                    const hidl_string& hDefaultUrl) {
654a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
655a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                if (status == Status::OK) {
656a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    request = toVector(hRequest);
657a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    defaultUrl = toString8(hDefaultUrl);
658a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
659a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    switch (hKeyRequestType) {
66059bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias                    case drm::V1_0::KeyRequestType::INITIAL:
661a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                        *keyRequestType = DrmPlugin::kKeyRequestType_Initial;
662a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                        break;
66359bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias                    case drm::V1_0::KeyRequestType::RENEWAL:
664a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                        *keyRequestType = DrmPlugin::kKeyRequestType_Renewal;
665a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                        break;
66659bc3fa914467f37c32aea1963e9354355b244e7Rahul Frias                    case drm::V1_0::KeyRequestType::RELEASE:
667a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                        *keyRequestType = DrmPlugin::kKeyRequestType_Release;
668a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                        break;
669a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    default:
670a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                        *keyRequestType = DrmPlugin::kKeyRequestType_Unknown;
671a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                        break;
672a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    }
673a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    err = toStatusT(status);
674a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                }
675a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            });
676a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
677f0e618d0ee16c63f918c7bb87ec1ff264d177746Adam Stone    err = hResult.isOk() ? err : DEAD_OBJECT;
678f0e618d0ee16c63f918c7bb87ec1ff264d177746Adam Stone    keyRequestTimer.SetAttribute(err);
679f0e618d0ee16c63f918c7bb87ec1ff264d177746Adam Stone    return err;
680a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
681a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
682a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::provideKeyResponse(Vector<uint8_t> const &sessionId,
683a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        Vector<uint8_t> const &response, Vector<uint8_t> &keySetId) {
684a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
685cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone    EventTimer<status_t> keyResponseTimer(&mMetrics.mProvideKeyResponseTiming);
686cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone
6876d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
688a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
689a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    DrmSessionManager::Instance()->useSession(sessionId);
690a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
691a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    status_t err = UNKNOWN_ERROR;
692a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
693a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Return<void> hResult = mPlugin->provideKeyResponse(toHidlVec(sessionId),
694a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            toHidlVec(response),
695a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            [&](Status status, const hidl_vec<uint8_t>& hKeySetId) {
696a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                if (status == Status::OK) {
697a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    keySetId = toVector(hKeySetId);
698a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                }
699a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                err = toStatusT(status);
700a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            }
701a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        );
702cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone    err = hResult.isOk() ? err : DEAD_OBJECT;
703cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone    keyResponseTimer.SetAttribute(err);
704cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone    return err;
705a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
706a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
707a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::removeKeys(Vector<uint8_t> const &keySetId) {
708a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
7096d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
710a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
711a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return toStatusT(mPlugin->removeKeys(toHidlVec(keySetId)));
712a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
713a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
714a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::restoreKeys(Vector<uint8_t> const &sessionId,
715a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        Vector<uint8_t> const &keySetId) {
716a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
7176d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
718a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
719a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    DrmSessionManager::Instance()->useSession(sessionId);
720a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
721a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return toStatusT(mPlugin->restoreKeys(toHidlVec(sessionId),
722a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    toHidlVec(keySetId)));
723a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
724a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
725a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::queryKeyStatus(Vector<uint8_t> const &sessionId,
726a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        KeyedVector<String8, String8> &infoMap) const {
727a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
7286d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
729a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
730a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    DrmSessionManager::Instance()->useSession(sessionId);
731a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
732a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    ::KeyedVector hInfoMap;
733a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
734a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    status_t err = UNKNOWN_ERROR;
735a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
736a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Return<void> hResult = mPlugin->queryKeyStatus(toHidlVec(sessionId),
737a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            [&](Status status, const hidl_vec<KeyValue>& map) {
738a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                if (status == Status::OK) {
739a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    infoMap = toKeyedVector(map);
740a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                }
741a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                err = toStatusT(status);
742a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            }
743a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        );
744a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
745a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return hResult.isOk() ? err : DEAD_OBJECT;
746a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
747a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
748a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::getProvisionRequest(String8 const &certType,
749a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        String8 const &certAuthority, Vector<uint8_t> &request,
750a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        String8 &defaultUrl) {
751a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
7526d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
753a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
754a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    status_t err = UNKNOWN_ERROR;
755a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
756a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Return<void> hResult = mPlugin->getProvisionRequest(
757a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            toHidlString(certType), toHidlString(certAuthority),
758a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            [&](Status status, const hidl_vec<uint8_t>& hRequest,
759a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    const hidl_string& hDefaultUrl) {
760a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                if (status == Status::OK) {
761a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    request = toVector(hRequest);
762a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    defaultUrl = toString8(hDefaultUrl);
763a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                }
764a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                err = toStatusT(status);
765a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            }
766a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        );
767a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
768cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone    err = hResult.isOk() ? err : DEAD_OBJECT;
769cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone    mMetrics.mGetProvisionRequestCounter.Increment(err);
770cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone    return err;
771a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
772a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
773a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::provideProvisionResponse(Vector<uint8_t> const &response,
77468b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong        Vector<uint8_t> &certificate, Vector<uint8_t> &wrappedKey) {
775a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
7766d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
777a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
778a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    status_t err = UNKNOWN_ERROR;
779a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
780a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Return<void> hResult = mPlugin->provideProvisionResponse(toHidlVec(response),
781a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            [&](Status status, const hidl_vec<uint8_t>& hCertificate,
782a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    const hidl_vec<uint8_t>& hWrappedKey) {
783a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                if (status == Status::OK) {
784a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    certificate = toVector(hCertificate);
785a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    wrappedKey = toVector(hWrappedKey);
786a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                }
787a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                err = toStatusT(status);
788a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            }
789a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        );
790a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
791cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone    err = hResult.isOk() ? err : DEAD_OBJECT;
792cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone    mMetrics.mProvideProvisionResponseCounter.Increment(err);
793cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone    return err;
794a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
795a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
796abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinkerstatus_t DrmHal::getSecureStops(List<Vector<uint8_t>> &secureStops) {
797a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
7986d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
799a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
800a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    status_t err = UNKNOWN_ERROR;
801a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
802a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Return<void> hResult = mPlugin->getSecureStops(
803a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            [&](Status status, const hidl_vec<SecureStop>& hSecureStops) {
804a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                if (status == Status::OK) {
805a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    secureStops = toSecureStops(hSecureStops);
806a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                }
807a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                err = toStatusT(status);
808a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            }
809a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    );
810a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
811a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return hResult.isOk() ? err : DEAD_OBJECT;
812a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
813a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
814a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
81515177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinkerstatus_t DrmHal::getSecureStopIds(List<Vector<uint8_t>> &secureStopIds) {
81615177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker    Mutex::Autolock autoLock(mLock);
81715177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker
81815177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker    if (mInitCheck != OK) {
81915177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker        return mInitCheck;
82015177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker    }
82115177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker
82215177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker    if (mPluginV1_1 == NULL) {
82315177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker        return ERROR_DRM_CANNOT_HANDLE;
82415177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker    }
82515177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker
82615177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker    status_t err = UNKNOWN_ERROR;
82715177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker
82815177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker    Return<void> hResult = mPluginV1_1->getSecureStopIds(
82915177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker            [&](Status status, const hidl_vec<SecureStopId>& hSecureStopIds) {
83015177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker                if (status == Status::OK) {
83115177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker                    secureStopIds = toSecureStopIds(hSecureStopIds);
83215177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker                }
83315177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker                err = toStatusT(status);
83415177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker            }
83515177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker    );
83615177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker
83715177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker    return hResult.isOk() ? err : DEAD_OBJECT;
83815177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker}
83915177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker
84015177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker
841a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::getSecureStop(Vector<uint8_t> const &ssid, Vector<uint8_t> &secureStop) {
842a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
8436d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
844a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
845a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    status_t err = UNKNOWN_ERROR;
846a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
847a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Return<void> hResult = mPlugin->getSecureStop(toHidlVec(ssid),
848a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            [&](Status status, const SecureStop& hSecureStop) {
849a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                if (status == Status::OK) {
850a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    secureStop = toVector(hSecureStop.opaqueData);
851a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                }
852a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                err = toStatusT(status);
853a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            }
854a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    );
855a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
856a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return hResult.isOk() ? err : DEAD_OBJECT;
857a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
858a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
859a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::releaseSecureStops(Vector<uint8_t> const &ssRelease) {
860a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
8616d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
862a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
86315177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker    if (mPluginV1_1 != NULL) {
86415177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker        SecureStopRelease secureStopRelease;
86515177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker        secureStopRelease.opaqueData = toHidlVec(ssRelease);
86615177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker        return toStatusT(mPluginV1_1->releaseSecureStops(secureStopRelease));
86715177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker    }
86815177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker
869a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return toStatusT(mPlugin->releaseSecureStop(toHidlVec(ssRelease)));
870a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
871a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
87215177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinkerstatus_t DrmHal::removeSecureStop(Vector<uint8_t> const &ssid) {
87315177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker    Mutex::Autolock autoLock(mLock);
87415177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker
87515177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker    if (mInitCheck != OK) {
87615177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker        return mInitCheck;
87715177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker    }
87815177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker
87915177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker    if (mPluginV1_1 == NULL) {
88015177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker        return ERROR_DRM_CANNOT_HANDLE;
88115177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker    }
88215177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker
88315177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker    return toStatusT(mPluginV1_1->removeSecureStop(toHidlVec(ssid)));
88415177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker}
88515177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker
88615177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinkerstatus_t DrmHal::removeAllSecureStops() {
887a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
8886d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
889a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
89015177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker    if (mPluginV1_1 != NULL) {
89115177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker        return toStatusT(mPluginV1_1->removeAllSecureStops());
89215177d7eab8c2300b4f1d577267e528bd7e4eedcJeff Tinker    }
8936d998b67be330843f633a563c23c606593060165Jeff Tinker    return toStatusT(mPlugin->releaseAllSecureStops());
8946d998b67be330843f633a563c23c606593060165Jeff Tinker}
8956d998b67be330843f633a563c23c606593060165Jeff Tinker
8966d998b67be330843f633a563c23c606593060165Jeff Tinkerstatus_t DrmHal::getHdcpLevels(DrmPlugin::HdcpLevel *connected,
8976d998b67be330843f633a563c23c606593060165Jeff Tinker            DrmPlugin::HdcpLevel *max) const {
8986d998b67be330843f633a563c23c606593060165Jeff Tinker    Mutex::Autolock autoLock(mLock);
8996d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
9006d998b67be330843f633a563c23c606593060165Jeff Tinker
9016d998b67be330843f633a563c23c606593060165Jeff Tinker    if (connected == NULL || max == NULL) {
9026d998b67be330843f633a563c23c606593060165Jeff Tinker        return BAD_VALUE;
903a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    }
9046d998b67be330843f633a563c23c606593060165Jeff Tinker    status_t err = UNKNOWN_ERROR;
905a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
9066d998b67be330843f633a563c23c606593060165Jeff Tinker    if (mPluginV1_1 == NULL) {
9076d998b67be330843f633a563c23c606593060165Jeff Tinker        return ERROR_DRM_CANNOT_HANDLE;
9086d998b67be330843f633a563c23c606593060165Jeff Tinker    }
9096d998b67be330843f633a563c23c606593060165Jeff Tinker
9106d998b67be330843f633a563c23c606593060165Jeff Tinker    *connected = DrmPlugin::kHdcpLevelUnknown;
9116d998b67be330843f633a563c23c606593060165Jeff Tinker    *max = DrmPlugin::kHdcpLevelUnknown;
9126d998b67be330843f633a563c23c606593060165Jeff Tinker
9136d998b67be330843f633a563c23c606593060165Jeff Tinker    Return<void> hResult = mPluginV1_1->getHdcpLevels(
9146d998b67be330843f633a563c23c606593060165Jeff Tinker            [&](Status status, const HdcpLevel& hConnected, const HdcpLevel& hMax) {
9156d998b67be330843f633a563c23c606593060165Jeff Tinker                if (status == Status::OK) {
9166d998b67be330843f633a563c23c606593060165Jeff Tinker                    *connected = toHdcpLevel(hConnected);
9176d998b67be330843f633a563c23c606593060165Jeff Tinker                    *max = toHdcpLevel(hMax);
9186d998b67be330843f633a563c23c606593060165Jeff Tinker                }
9196d998b67be330843f633a563c23c606593060165Jeff Tinker                err = toStatusT(status);
9206d998b67be330843f633a563c23c606593060165Jeff Tinker            }
9216d998b67be330843f633a563c23c606593060165Jeff Tinker    );
9226d998b67be330843f633a563c23c606593060165Jeff Tinker
9236d998b67be330843f633a563c23c606593060165Jeff Tinker    return hResult.isOk() ? err : DEAD_OBJECT;
9246d998b67be330843f633a563c23c606593060165Jeff Tinker}
9256d998b67be330843f633a563c23c606593060165Jeff Tinker
9266d998b67be330843f633a563c23c606593060165Jeff Tinkerstatus_t DrmHal::getNumberOfSessions(uint32_t *open, uint32_t *max) const {
9276d998b67be330843f633a563c23c606593060165Jeff Tinker    Mutex::Autolock autoLock(mLock);
9286d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
9296d998b67be330843f633a563c23c606593060165Jeff Tinker
9306d998b67be330843f633a563c23c606593060165Jeff Tinker    if (open == NULL || max == NULL) {
9316d998b67be330843f633a563c23c606593060165Jeff Tinker        return BAD_VALUE;
9326d998b67be330843f633a563c23c606593060165Jeff Tinker    }
9336d998b67be330843f633a563c23c606593060165Jeff Tinker    status_t err = UNKNOWN_ERROR;
9346d998b67be330843f633a563c23c606593060165Jeff Tinker
9356d998b67be330843f633a563c23c606593060165Jeff Tinker    *open = 0;
9366d998b67be330843f633a563c23c606593060165Jeff Tinker    *max = 0;
9376d998b67be330843f633a563c23c606593060165Jeff Tinker
9386d998b67be330843f633a563c23c606593060165Jeff Tinker    if (mPluginV1_1 == NULL) {
9396d998b67be330843f633a563c23c606593060165Jeff Tinker        return ERROR_DRM_CANNOT_HANDLE;
9406d998b67be330843f633a563c23c606593060165Jeff Tinker    }
9416d998b67be330843f633a563c23c606593060165Jeff Tinker
9426d998b67be330843f633a563c23c606593060165Jeff Tinker    Return<void> hResult = mPluginV1_1->getNumberOfSessions(
9436d998b67be330843f633a563c23c606593060165Jeff Tinker            [&](Status status, uint32_t hOpen, uint32_t hMax) {
9446d998b67be330843f633a563c23c606593060165Jeff Tinker                if (status == Status::OK) {
9456d998b67be330843f633a563c23c606593060165Jeff Tinker                    *open = hOpen;
9466d998b67be330843f633a563c23c606593060165Jeff Tinker                    *max = hMax;
9476d998b67be330843f633a563c23c606593060165Jeff Tinker                }
9486d998b67be330843f633a563c23c606593060165Jeff Tinker                err = toStatusT(status);
9496d998b67be330843f633a563c23c606593060165Jeff Tinker            }
9506d998b67be330843f633a563c23c606593060165Jeff Tinker    );
9516d998b67be330843f633a563c23c606593060165Jeff Tinker
9526d998b67be330843f633a563c23c606593060165Jeff Tinker    return hResult.isOk() ? err : DEAD_OBJECT;
9536d998b67be330843f633a563c23c606593060165Jeff Tinker}
9546d998b67be330843f633a563c23c606593060165Jeff Tinker
9556d998b67be330843f633a563c23c606593060165Jeff Tinkerstatus_t DrmHal::getSecurityLevel(Vector<uint8_t> const &sessionId,
9566d998b67be330843f633a563c23c606593060165Jeff Tinker        DrmPlugin::SecurityLevel *level) const {
9576d998b67be330843f633a563c23c606593060165Jeff Tinker    Mutex::Autolock autoLock(mLock);
9586d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
9596d998b67be330843f633a563c23c606593060165Jeff Tinker
9606d998b67be330843f633a563c23c606593060165Jeff Tinker    if (level == NULL) {
9616d998b67be330843f633a563c23c606593060165Jeff Tinker        return BAD_VALUE;
9626d998b67be330843f633a563c23c606593060165Jeff Tinker    }
9636d998b67be330843f633a563c23c606593060165Jeff Tinker    status_t err = UNKNOWN_ERROR;
9646d998b67be330843f633a563c23c606593060165Jeff Tinker
9656d998b67be330843f633a563c23c606593060165Jeff Tinker    if (mPluginV1_1 == NULL) {
9666d998b67be330843f633a563c23c606593060165Jeff Tinker        return ERROR_DRM_CANNOT_HANDLE;
9676d998b67be330843f633a563c23c606593060165Jeff Tinker    }
9686d998b67be330843f633a563c23c606593060165Jeff Tinker
9696d998b67be330843f633a563c23c606593060165Jeff Tinker    *level = DrmPlugin::kSecurityLevelUnknown;
9706d998b67be330843f633a563c23c606593060165Jeff Tinker
9716d998b67be330843f633a563c23c606593060165Jeff Tinker    Return<void> hResult = mPluginV1_1->getSecurityLevel(toHidlVec(sessionId),
9726d998b67be330843f633a563c23c606593060165Jeff Tinker            [&](Status status, SecurityLevel hLevel) {
9736d998b67be330843f633a563c23c606593060165Jeff Tinker                if (status == Status::OK) {
9746d998b67be330843f633a563c23c606593060165Jeff Tinker                    *level = toSecurityLevel(hLevel);
9756d998b67be330843f633a563c23c606593060165Jeff Tinker                }
9766d998b67be330843f633a563c23c606593060165Jeff Tinker                err = toStatusT(status);
9776d998b67be330843f633a563c23c606593060165Jeff Tinker            }
9786d998b67be330843f633a563c23c606593060165Jeff Tinker    );
9796d998b67be330843f633a563c23c606593060165Jeff Tinker
9806d998b67be330843f633a563c23c606593060165Jeff Tinker    return hResult.isOk() ? err : DEAD_OBJECT;
9816d998b67be330843f633a563c23c606593060165Jeff Tinker}
9826d998b67be330843f633a563c23c606593060165Jeff Tinker
9836d998b67be330843f633a563c23c606593060165Jeff Tinkerstatus_t DrmHal::setSecurityLevel(Vector<uint8_t> const &sessionId,
9846d998b67be330843f633a563c23c606593060165Jeff Tinker        const DrmPlugin::SecurityLevel& level) {
9856d998b67be330843f633a563c23c606593060165Jeff Tinker    Mutex::Autolock autoLock(mLock);
9866d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
9876d998b67be330843f633a563c23c606593060165Jeff Tinker
9886d998b67be330843f633a563c23c606593060165Jeff Tinker    if (mPluginV1_1 == NULL) {
9896d998b67be330843f633a563c23c606593060165Jeff Tinker        return ERROR_DRM_CANNOT_HANDLE;
9906d998b67be330843f633a563c23c606593060165Jeff Tinker    }
9916d998b67be330843f633a563c23c606593060165Jeff Tinker
9926d998b67be330843f633a563c23c606593060165Jeff Tinker    SecurityLevel hSecurityLevel;
9936d998b67be330843f633a563c23c606593060165Jeff Tinker
9946d998b67be330843f633a563c23c606593060165Jeff Tinker    switch(level) {
9956d998b67be330843f633a563c23c606593060165Jeff Tinker    case DrmPlugin::kSecurityLevelSwSecureCrypto:
9966d998b67be330843f633a563c23c606593060165Jeff Tinker        hSecurityLevel = SecurityLevel::SW_SECURE_CRYPTO;
9976d998b67be330843f633a563c23c606593060165Jeff Tinker        break;
9986d998b67be330843f633a563c23c606593060165Jeff Tinker    case DrmPlugin::kSecurityLevelSwSecureDecode:
9996d998b67be330843f633a563c23c606593060165Jeff Tinker        hSecurityLevel = SecurityLevel::SW_SECURE_DECODE;
10006d998b67be330843f633a563c23c606593060165Jeff Tinker        break;
10016d998b67be330843f633a563c23c606593060165Jeff Tinker    case DrmPlugin::kSecurityLevelHwSecureCrypto:
10026d998b67be330843f633a563c23c606593060165Jeff Tinker        hSecurityLevel = SecurityLevel::HW_SECURE_CRYPTO;
10036d998b67be330843f633a563c23c606593060165Jeff Tinker        break;
10046d998b67be330843f633a563c23c606593060165Jeff Tinker    case DrmPlugin::kSecurityLevelHwSecureDecode:
10056d998b67be330843f633a563c23c606593060165Jeff Tinker        hSecurityLevel = SecurityLevel::HW_SECURE_DECODE;
10066d998b67be330843f633a563c23c606593060165Jeff Tinker        break;
10076d998b67be330843f633a563c23c606593060165Jeff Tinker    case DrmPlugin::kSecurityLevelHwSecureAll:
10086d998b67be330843f633a563c23c606593060165Jeff Tinker        hSecurityLevel = SecurityLevel::HW_SECURE_ALL;
10096d998b67be330843f633a563c23c606593060165Jeff Tinker        break;
10106d998b67be330843f633a563c23c606593060165Jeff Tinker    default:
10116d998b67be330843f633a563c23c606593060165Jeff Tinker        return ERROR_DRM_CANNOT_HANDLE;
10126d998b67be330843f633a563c23c606593060165Jeff Tinker    }
10136d998b67be330843f633a563c23c606593060165Jeff Tinker
10146d998b67be330843f633a563c23c606593060165Jeff Tinker    Status status = mPluginV1_1->setSecurityLevel(toHidlVec(sessionId),
10156d998b67be330843f633a563c23c606593060165Jeff Tinker            hSecurityLevel);
10166d998b67be330843f633a563c23c606593060165Jeff Tinker    return toStatusT(status);
1017a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
1018a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1019a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::getPropertyString(String8 const &name, String8 &value ) const {
1020a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
102133ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce    return getPropertyStringInternal(name, value);
102233ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce}
102333ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce
102433ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Brucestatus_t DrmHal::getPropertyStringInternal(String8 const &name, String8 &value) const {
102533ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce    // This function is internal to the class and should only be called while
102633ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce    // mLock is already held.
10276d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
1028a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1029a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    status_t err = UNKNOWN_ERROR;
1030a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1031a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Return<void> hResult = mPlugin->getPropertyString(toHidlString(name),
1032a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            [&](Status status, const hidl_string& hValue) {
1033a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                if (status == Status::OK) {
1034a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    value = toString8(hValue);
1035a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                }
1036a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                err = toStatusT(status);
1037a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            }
1038a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    );
1039a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1040a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return hResult.isOk() ? err : DEAD_OBJECT;
1041a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
1042a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1043a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::getPropertyByteArray(String8 const &name, Vector<uint8_t> &value ) const {
1044a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
104533ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce    return getPropertyByteArrayInternal(name, value);
104633ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce}
104733ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce
104833ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Brucestatus_t DrmHal::getPropertyByteArrayInternal(String8 const &name, Vector<uint8_t> &value ) const {
104933ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce    // This function is internal to the class and should only be called while
105033ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce    // mLock is already held.
10516d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
1052a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1053a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    status_t err = UNKNOWN_ERROR;
1054a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1055a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Return<void> hResult = mPlugin->getPropertyByteArray(toHidlString(name),
1056a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            [&](Status status, const hidl_vec<uint8_t>& hValue) {
1057a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                if (status == Status::OK) {
1058a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    value = toVector(hValue);
1059a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                }
1060a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                err = toStatusT(status);
1061a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            }
1062a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    );
1063a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1064cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone    err = hResult.isOk() ? err : DEAD_OBJECT;
1065cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone    if (name == kPropertyDeviceUniqueId) {
1066cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone        mMetrics.mGetDeviceUniqueIdCounter.Increment(err);
1067cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone    }
1068cea91ce60260d7ebb94449ad7674150fdc227886Adam Stone    return err;
1069a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
1070a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1071a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::setPropertyString(String8 const &name, String8 const &value ) const {
1072a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
10736d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
1074a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
10756d998b67be330843f633a563c23c606593060165Jeff Tinker    Status status = mPlugin->setPropertyString(toHidlString(name),
1076a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            toHidlString(value));
1077a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return toStatusT(status);
1078a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
1079a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1080a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::setPropertyByteArray(String8 const &name,
1081a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                                   Vector<uint8_t> const &value ) const {
1082a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
10836d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
1084a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1085a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Status status = mPlugin->setPropertyByteArray(toHidlString(name),
1086a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            toHidlVec(value));
1087a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return toStatusT(status);
1088a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
1089a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1090637b7855829920114a8863b93fe52203b7471eeaAdam Stonestatus_t DrmHal::getMetrics(PersistableBundle* item) {
1091f0e618d0ee16c63f918c7bb87ec1ff264d177746Adam Stone    if (item == nullptr) {
1092f0e618d0ee16c63f918c7bb87ec1ff264d177746Adam Stone      return UNEXPECTED_NULL;
1093f0e618d0ee16c63f918c7bb87ec1ff264d177746Adam Stone    }
1094f0e618d0ee16c63f918c7bb87ec1ff264d177746Adam Stone
1095f0e618d0ee16c63f918c7bb87ec1ff264d177746Adam Stone    mMetrics.Export(item);
1096ab394d13bab3a84f23677357576cee7a6f0c7899Adam Stone    return OK;
1097ab394d13bab3a84f23677357576cee7a6f0c7899Adam Stone}
1098a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1099a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::setCipherAlgorithm(Vector<uint8_t> const &sessionId,
1100a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                                 String8 const &algorithm) {
1101a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
11026d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
1103a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1104a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    DrmSessionManager::Instance()->useSession(sessionId);
1105a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1106a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Status status = mPlugin->setCipherAlgorithm(toHidlVec(sessionId),
1107a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            toHidlString(algorithm));
1108a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return toStatusT(status);
1109a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
1110a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1111a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::setMacAlgorithm(Vector<uint8_t> const &sessionId,
1112a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                              String8 const &algorithm) {
1113a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
11146d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
1115a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1116a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    DrmSessionManager::Instance()->useSession(sessionId);
1117a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1118a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Status status = mPlugin->setMacAlgorithm(toHidlVec(sessionId),
1119a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            toHidlString(algorithm));
1120a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return toStatusT(status);
1121a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
1122a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1123a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::encrypt(Vector<uint8_t> const &sessionId,
112468b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong        Vector<uint8_t> const &keyId, Vector<uint8_t> const &input,
112568b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong        Vector<uint8_t> const &iv, Vector<uint8_t> &output) {
1126a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
11276d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
1128a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1129a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    DrmSessionManager::Instance()->useSession(sessionId);
1130a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1131a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    status_t err = UNKNOWN_ERROR;
1132a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1133a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Return<void> hResult = mPlugin->encrypt(toHidlVec(sessionId),
1134a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            toHidlVec(keyId), toHidlVec(input), toHidlVec(iv),
1135a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            [&](Status status, const hidl_vec<uint8_t>& hOutput) {
1136a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                if (status == Status::OK) {
1137a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    output = toVector(hOutput);
1138a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                }
1139a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                err = toStatusT(status);
1140a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            }
1141a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    );
1142a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1143a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return hResult.isOk() ? err : DEAD_OBJECT;
1144a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
1145a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1146a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::decrypt(Vector<uint8_t> const &sessionId,
114768b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong        Vector<uint8_t> const &keyId, Vector<uint8_t> const &input,
114868b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong        Vector<uint8_t> const &iv, Vector<uint8_t> &output) {
1149a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
11506d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
1151a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1152a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    DrmSessionManager::Instance()->useSession(sessionId);
1153a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1154a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    status_t  err = UNKNOWN_ERROR;
1155a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1156a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Return<void> hResult = mPlugin->decrypt(toHidlVec(sessionId),
1157a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            toHidlVec(keyId), toHidlVec(input), toHidlVec(iv),
1158a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            [&](Status status, const hidl_vec<uint8_t>& hOutput) {
1159a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                if (status == Status::OK) {
1160a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    output = toVector(hOutput);
1161a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                }
1162a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                err = toStatusT(status);
1163a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            }
1164a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    );
1165a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1166a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return hResult.isOk() ? err : DEAD_OBJECT;
1167a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
1168a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1169a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::sign(Vector<uint8_t> const &sessionId,
117068b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong        Vector<uint8_t> const &keyId, Vector<uint8_t> const &message,
117168b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong        Vector<uint8_t> &signature) {
1172a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
11736d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
1174a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1175a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    DrmSessionManager::Instance()->useSession(sessionId);
1176a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1177a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    status_t err = UNKNOWN_ERROR;
1178a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1179a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Return<void> hResult = mPlugin->sign(toHidlVec(sessionId),
1180a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            toHidlVec(keyId), toHidlVec(message),
1181a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            [&](Status status, const hidl_vec<uint8_t>& hSignature)  {
1182a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                if (status == Status::OK) {
1183a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    signature = toVector(hSignature);
1184a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                }
1185a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                err = toStatusT(status);
1186a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            }
1187a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    );
1188a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1189a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return hResult.isOk() ? err : DEAD_OBJECT;
1190a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
1191a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1192a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::verify(Vector<uint8_t> const &sessionId,
119368b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong        Vector<uint8_t> const &keyId, Vector<uint8_t> const &message,
119468b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong        Vector<uint8_t> const &signature, bool &match) {
1195a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
11966d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
1197a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1198a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    DrmSessionManager::Instance()->useSession(sessionId);
1199a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1200a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    status_t err = UNKNOWN_ERROR;
1201a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1202a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Return<void> hResult = mPlugin->verify(toHidlVec(sessionId),toHidlVec(keyId),
1203a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            toHidlVec(message), toHidlVec(signature),
1204a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            [&](Status status, bool hMatch) {
1205a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                if (status == Status::OK) {
1206a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    match = hMatch;
1207a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                } else {
1208a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    match = false;
1209a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                }
1210a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                err = toStatusT(status);
1211a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            }
1212a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    );
1213a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1214a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return hResult.isOk() ? err : DEAD_OBJECT;
1215a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
1216a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1217a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::signRSA(Vector<uint8_t> const &sessionId,
121868b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong        String8 const &algorithm, Vector<uint8_t> const &message,
121968b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong        Vector<uint8_t> const &wrappedKey, Vector<uint8_t> &signature) {
1220a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
12216d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
1222a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1223a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    if (!checkPermission("android.permission.ACCESS_DRM_CERTIFICATES")) {
1224a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        return -EPERM;
1225a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    }
1226a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1227a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    DrmSessionManager::Instance()->useSession(sessionId);
1228a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1229a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    status_t err = UNKNOWN_ERROR;
1230a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1231a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Return<void> hResult = mPlugin->signRSA(toHidlVec(sessionId),
1232a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            toHidlString(algorithm), toHidlVec(message), toHidlVec(wrappedKey),
1233a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            [&](Status status, const hidl_vec<uint8_t>& hSignature) {
1234a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                if (status == Status::OK) {
1235a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    signature = toVector(hSignature);
1236a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                }
1237a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                err = toStatusT(status);
1238a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            }
1239a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        );
1240a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1241a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return hResult.isOk() ? err : DEAD_OBJECT;
1242a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
1243a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1244a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkervoid DrmHal::binderDied(const wp<IBinder> &the_late_who __unused)
1245a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker{
1246a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
12476133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker    closeOpenSessions();
12483e2891674ef57a74e59ca5e27f89647b3f06861bJeff Tinker    setListener(NULL);
1249319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker    mInitCheck = NO_INIT;
1250319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker
125170367f525a7bf5be52115608d190d72756e972eaJeff Tinker    if (mPlugin != NULL) {
1252319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker        if (!mPlugin->setListener(NULL).isOk()) {
1253319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker            mInitCheck = DEAD_OBJECT;
1254319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker        }
125570367f525a7bf5be52115608d190d72756e972eaJeff Tinker    }
1256a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    mPlugin.clear();
1257a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
1258a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1259a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkervoid DrmHal::writeByteArray(Parcel &obj, hidl_vec<uint8_t> const &vec)
1260a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker{
1261a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    if (vec.size()) {
1262a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        obj.writeInt32(vec.size());
1263a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        obj.write(vec.data(), vec.size());
1264a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    } else {
1265a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        obj.writeInt32(0);
1266a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    }
1267a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
1268a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1269ab394d13bab3a84f23677357576cee7a6f0c7899Adam Stone
127033ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Brucevoid DrmHal::reportMetrics() const
127133ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce{
127233ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce    Vector<uint8_t> metrics;
127333ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce    String8 vendor;
127433ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce    String8 description;
127533ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce    if (getPropertyStringInternal(String8("vendor"), vendor) == OK &&
127633ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce            getPropertyStringInternal(String8("description"), description) == OK &&
127733ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce            getPropertyByteArrayInternal(String8("metrics"), metrics) == OK) {
127833ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce        status_t res = android::reportDrmPluginMetrics(
127933ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce                metrics, vendor, description);
128033ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce        if (res != OK) {
128133ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce            ALOGE("Metrics were retrieved but could not be reported: %i", res);
128233ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce        }
128333ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce    }
128433ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce}
128533ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce
1286a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}  // namespace android
1287