DrmHal.cpp revision 6d998b67be330843f633a563c23c606593060165
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>
3333ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce#include <media/PluginMetricsReporting.h>
34a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#include <media/drm/DrmAPI.h>
35a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#include <media/stagefright/foundation/ADebug.h>
36a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#include <media/stagefright/foundation/AString.h>
37a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#include <media/stagefright/foundation/hexdump.h>
38a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker#include <media/stagefright/MediaErrors.h>
39a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
406d998b67be330843f633a563c23c606593060165Jeff Tinkerusing drm::V1_0::KeyedVector;
416d998b67be330843f633a563c23c606593060165Jeff Tinkerusing drm::V1_0::KeyRequestType;
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;
476d998b67be330843f633a563c23c606593060165Jeff Tinkerusing drm::V1_1::SecurityLevel;
486d998b67be330843f633a563c23c606593060165Jeff Tinkerusing drm::V1_0::Status;
49a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerusing ::android::hardware::hidl_array;
50a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerusing ::android::hardware::hidl_string;
51a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerusing ::android::hardware::hidl_vec;
52a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerusing ::android::hardware::Return;
53a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerusing ::android::hardware::Void;
54abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinkerusing ::android::hidl::manager::V1_0::IServiceManager;
55a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerusing ::android::sp;
56a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
57a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkernamespace android {
58a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
596d998b67be330843f633a563c23c606593060165Jeff Tinker#define INIT_CHECK() {if (mInitCheck != OK) return mInitCheck;}
606d998b67be330843f633a563c23c606593060165Jeff Tinker
61a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic inline int getCallingPid() {
62a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return IPCThreadState::self()->getCallingPid();
63a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
64a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
65a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic bool checkPermission(const char* permissionString) {
66a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    if (getpid() == IPCThreadState::self()->getCallingPid()) return true;
67a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    bool ok = checkCallingPermission(String16(permissionString));
68a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    if (!ok) ALOGE("Request requires %s", permissionString);
69a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return ok;
70a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
71a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
72a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic const Vector<uint8_t> toVector(const hidl_vec<uint8_t> &vec) {
73a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Vector<uint8_t> vector;
74a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    vector.appendArray(vec.data(), vec.size());
75a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return *const_cast<const Vector<uint8_t> *>(&vector);
76a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
77a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
78a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic hidl_vec<uint8_t> toHidlVec(const Vector<uint8_t> &vector) {
79a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    hidl_vec<uint8_t> vec;
80a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    vec.setToExternal(const_cast<uint8_t *>(vector.array()), vector.size());
81a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return vec;
82a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
83a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
84a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic String8 toString8(const hidl_string &string) {
85a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return String8(string.c_str());
86a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
87a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
88a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic hidl_string toHidlString(const String8& string) {
89a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return hidl_string(string.string());
90a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
91a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
926d998b67be330843f633a563c23c606593060165Jeff Tinkerstatic DrmPlugin::SecurityLevel toSecurityLevel(SecurityLevel level) {
936d998b67be330843f633a563c23c606593060165Jeff Tinker    switch(level) {
946d998b67be330843f633a563c23c606593060165Jeff Tinker    case SecurityLevel::SW_SECURE_CRYPTO:
956d998b67be330843f633a563c23c606593060165Jeff Tinker        return DrmPlugin::kSecurityLevelSwSecureCrypto;
966d998b67be330843f633a563c23c606593060165Jeff Tinker    case SecurityLevel::SW_SECURE_DECODE:
976d998b67be330843f633a563c23c606593060165Jeff Tinker        return DrmPlugin::kSecurityLevelSwSecureDecode;
986d998b67be330843f633a563c23c606593060165Jeff Tinker    case SecurityLevel::HW_SECURE_CRYPTO:
996d998b67be330843f633a563c23c606593060165Jeff Tinker        return DrmPlugin::kSecurityLevelHwSecureCrypto;
1006d998b67be330843f633a563c23c606593060165Jeff Tinker    case SecurityLevel::HW_SECURE_DECODE:
1016d998b67be330843f633a563c23c606593060165Jeff Tinker        return DrmPlugin::kSecurityLevelHwSecureDecode;
1026d998b67be330843f633a563c23c606593060165Jeff Tinker    case SecurityLevel::HW_SECURE_ALL:
1036d998b67be330843f633a563c23c606593060165Jeff Tinker        return DrmPlugin::kSecurityLevelHwSecureAll;
1046d998b67be330843f633a563c23c606593060165Jeff Tinker    default:
1056d998b67be330843f633a563c23c606593060165Jeff Tinker        return DrmPlugin::kSecurityLevelUnknown;
1066d998b67be330843f633a563c23c606593060165Jeff Tinker    }
1076d998b67be330843f633a563c23c606593060165Jeff Tinker}
1086d998b67be330843f633a563c23c606593060165Jeff Tinker
1096d998b67be330843f633a563c23c606593060165Jeff Tinkerstatic DrmPlugin::HdcpLevel toHdcpLevel(HdcpLevel level) {
1106d998b67be330843f633a563c23c606593060165Jeff Tinker    switch(level) {
1116d998b67be330843f633a563c23c606593060165Jeff Tinker    case HdcpLevel::HDCP_NONE:
1126d998b67be330843f633a563c23c606593060165Jeff Tinker        return DrmPlugin::kHdcpNone;
1136d998b67be330843f633a563c23c606593060165Jeff Tinker    case HdcpLevel::HDCP_V1:
1146d998b67be330843f633a563c23c606593060165Jeff Tinker        return DrmPlugin::kHdcpV1;
1156d998b67be330843f633a563c23c606593060165Jeff Tinker    case HdcpLevel::HDCP_V2:
1166d998b67be330843f633a563c23c606593060165Jeff Tinker        return DrmPlugin::kHdcpV2;
1176d998b67be330843f633a563c23c606593060165Jeff Tinker    case HdcpLevel::HDCP_V2_1:
1186d998b67be330843f633a563c23c606593060165Jeff Tinker        return DrmPlugin::kHdcpV2_1;
1196d998b67be330843f633a563c23c606593060165Jeff Tinker    case HdcpLevel::HDCP_V2_2:
1206d998b67be330843f633a563c23c606593060165Jeff Tinker        return DrmPlugin::kHdcpV2_2;
1216d998b67be330843f633a563c23c606593060165Jeff Tinker    case HdcpLevel::HDCP_NO_OUTPUT:
1226d998b67be330843f633a563c23c606593060165Jeff Tinker        return DrmPlugin::kHdcpNoOutput;
1236d998b67be330843f633a563c23c606593060165Jeff Tinker    default:
1246d998b67be330843f633a563c23c606593060165Jeff Tinker        return DrmPlugin::kHdcpLevelUnknown;
1256d998b67be330843f633a563c23c606593060165Jeff Tinker    }
1266d998b67be330843f633a563c23c606593060165Jeff Tinker}
1276d998b67be330843f633a563c23c606593060165Jeff Tinker
128a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
129a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic ::KeyedVector toHidlKeyedVector(const KeyedVector<String8, String8>&
130a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        keyedVector) {
131a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    std::vector<KeyValue> stdKeyedVector;
132a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    for (size_t i = 0; i < keyedVector.size(); i++) {
133a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        KeyValue keyValue;
134a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        keyValue.key = toHidlString(keyedVector.keyAt(i));
135a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        keyValue.value = toHidlString(keyedVector.valueAt(i));
136a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        stdKeyedVector.push_back(keyValue);
137a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    }
138a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return ::KeyedVector(stdKeyedVector);
139a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
140a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
141a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic KeyedVector<String8, String8> toKeyedVector(const ::KeyedVector&
142a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        hKeyedVector) {
143a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    KeyedVector<String8, String8> keyedVector;
144a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    for (size_t i = 0; i < hKeyedVector.size(); i++) {
145a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        keyedVector.add(toString8(hKeyedVector[i].key),
146a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                toString8(hKeyedVector[i].value));
147a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    }
148a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return keyedVector;
149a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
150a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
151abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinkerstatic List<Vector<uint8_t>> toSecureStops(const hidl_vec<SecureStop>&
152a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        hSecureStops) {
153abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker    List<Vector<uint8_t>> secureStops;
154a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    for (size_t i = 0; i < hSecureStops.size(); i++) {
155a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        secureStops.push_back(toVector(hSecureStops[i].opaqueData));
156a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    }
157a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return secureStops;
158a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
159a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
160a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatic status_t toStatusT(Status status) {
161a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    switch (status) {
162a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    case Status::OK:
163a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        return OK;
164a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        break;
165a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    case Status::ERROR_DRM_NO_LICENSE:
166a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        return ERROR_DRM_NO_LICENSE;
167a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        break;
168a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    case Status::ERROR_DRM_LICENSE_EXPIRED:
169a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        return ERROR_DRM_LICENSE_EXPIRED;
170a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        break;
171a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    case Status::ERROR_DRM_SESSION_NOT_OPENED:
172a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        return ERROR_DRM_SESSION_NOT_OPENED;
173a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        break;
174a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    case Status::ERROR_DRM_CANNOT_HANDLE:
175a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        return ERROR_DRM_CANNOT_HANDLE;
176a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        break;
177a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    case Status::ERROR_DRM_INVALID_STATE:
178a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        return ERROR_DRM_TAMPER_DETECTED;
179a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        break;
180a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    case Status::BAD_VALUE:
181a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        return BAD_VALUE;
182a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        break;
183a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    case Status::ERROR_DRM_NOT_PROVISIONED:
184a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        return ERROR_DRM_NOT_PROVISIONED;
185a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        break;
186a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    case Status::ERROR_DRM_RESOURCE_BUSY:
187a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        return ERROR_DRM_RESOURCE_BUSY;
188a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        break;
189a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    case Status::ERROR_DRM_DEVICE_REVOKED:
190a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        return ERROR_DRM_DEVICE_REVOKED;
191a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        break;
192a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    case Status::ERROR_DRM_UNKNOWN:
193a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    default:
194a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        return ERROR_DRM_UNKNOWN;
195a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        break;
196a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    }
197a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
198a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
199a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
200a53d6553fce1818bdf87833f93633c93ad1b5915Jeff TinkerMutex DrmHal::mLock;
201a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
202a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstruct DrmSessionClient : public DrmSessionClientInterface {
203a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    explicit DrmSessionClient(DrmHal* drm) : mDrm(drm) {}
204a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
205a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    virtual bool reclaimSession(const Vector<uint8_t>& sessionId) {
206a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        sp<DrmHal> drm = mDrm.promote();
207a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        if (drm == NULL) {
208a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            return true;
209a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        }
210a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        status_t err = drm->closeSession(sessionId);
211a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        if (err != OK) {
212a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            return false;
213a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        }
214a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        drm->sendEvent(EventType::SESSION_RECLAIMED,
215a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                toHidlVec(sessionId), hidl_vec<uint8_t>());
216a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        return true;
217a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    }
218a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
219a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerprotected:
220a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    virtual ~DrmSessionClient() {}
221a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
222a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerprivate:
223a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    wp<DrmHal> mDrm;
224a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
225a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    DISALLOW_EVIL_CONSTRUCTORS(DrmSessionClient);
226a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker};
227a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
228a53d6553fce1818bdf87833f93633c93ad1b5915Jeff TinkerDrmHal::DrmHal()
229a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker   : mDrmSessionClient(new DrmSessionClient(this)),
230abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker     mFactories(makeDrmFactories()),
231abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker     mInitCheck((mFactories.size() == 0) ? ERROR_UNSUPPORTED : NO_INIT) {
232a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
233a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
2346133281c9b06c1d1176eca7f07401bba1067081eJeff Tinkervoid DrmHal::closeOpenSessions() {
2356133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker    if (mPlugin != NULL) {
2366133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker        for (size_t i = 0; i < mOpenSessions.size(); i++) {
2376133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker            mPlugin->closeSession(toHidlVec(mOpenSessions[i]));
2386133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker            DrmSessionManager::Instance()->removeSession(mOpenSessions[i]);
2396133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker        }
2406133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker    }
2416133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker    mOpenSessions.clear();
2426133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker}
2436133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker
244a53d6553fce1818bdf87833f93633c93ad1b5915Jeff TinkerDrmHal::~DrmHal() {
2456133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker    closeOpenSessions();
246a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    DrmSessionManager::Instance()->removeDrm(mDrmSessionClient);
247a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
248a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
249abeb36a8c2f044772297536e70340c3b245863e4Jeff TinkerVector<sp<IDrmFactory>> DrmHal::makeDrmFactories() {
250abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker    Vector<sp<IDrmFactory>> factories;
251c82b9c335e69b617817dace0ef64ad3df3f5080fJeff Tinker
252593111f4460f2b2e8f541e936670e3577d45fff6Jeff Tinker    auto manager = hardware::defaultServiceManager();
253c82b9c335e69b617817dace0ef64ad3df3f5080fJeff Tinker
254abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker    if (manager != NULL) {
255abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker        manager->listByInterface(IDrmFactory::descriptor,
256abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker                [&factories](const hidl_vec<hidl_string> &registered) {
257abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker                    for (const auto &instance : registered) {
258abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker                        auto factory = IDrmFactory::getService(instance);
259abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker                        if (factory != NULL) {
260abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker                            factories.push_back(factory);
261abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker                            ALOGI("makeDrmFactories: factory instance %s is %s",
262abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker                                    instance.c_str(),
263abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker                                    factory->isRemote() ? "Remote" : "Not Remote");
264abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker                        }
265abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker                    }
266abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker                }
267abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker            );
268abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker    }
269a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
270abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker    if (factories.size() == 0) {
271abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker        // must be in passthrough mode, load the default passthrough service
272e309b22bff1719f1fea84b247e4b2bc4c5f09eb5Jeff Tinker        auto passthrough = IDrmFactory::getService();
273abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker        if (passthrough != NULL) {
274abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker            ALOGI("makeDrmFactories: using default drm instance");
275abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker            factories.push_back(passthrough);
276abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker        } else {
277abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker            ALOGE("Failed to find any drm factories");
278abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker        }
279a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    }
280abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker    return factories;
281abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker}
282abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker
283abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinkersp<IDrmPlugin> DrmHal::makeDrmPlugin(const sp<IDrmFactory>& factory,
284abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker        const uint8_t uuid[16], const String8& appPackageName) {
285a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
286a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    sp<IDrmPlugin> plugin;
287abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker    Return<void> hResult = factory->createPlugin(uuid, appPackageName.string(),
288a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            [&](Status status, const sp<IDrmPlugin>& hPlugin) {
289abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker                if (status != Status::OK) {
290abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker                    ALOGE("Failed to make drm plugin");
291abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker                    return;
292abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker                }
293abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker                plugin = hPlugin;
294abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker            }
295abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker        );
296f0e89b0b248976f622fc41da4f678955399def08Jeff Tinker
297f0e89b0b248976f622fc41da4f678955399def08Jeff Tinker    if (!hResult.isOk()) {
298f0e89b0b248976f622fc41da4f678955399def08Jeff Tinker        ALOGE("createPlugin remote call failed");
299f0e89b0b248976f622fc41da4f678955399def08Jeff Tinker    }
300f0e89b0b248976f622fc41da4f678955399def08Jeff Tinker
301a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return plugin;
302a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
303a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
304a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::initCheck() const {
305a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return mInitCheck;
306a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
307a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
308a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::setListener(const sp<IDrmClient>& listener)
309a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker{
310a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock lock(mEventLock);
311a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    if (mListener != NULL){
312a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        IInterface::asBinder(mListener)->unlinkToDeath(this);
313a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    }
314a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    if (listener != NULL) {
315a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        IInterface::asBinder(listener)->linkToDeath(this);
316a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    }
317a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    mListener = listener;
318a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return NO_ERROR;
319a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
320a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
321a53d6553fce1818bdf87833f93633c93ad1b5915Jeff TinkerReturn<void> DrmHal::sendEvent(EventType hEventType,
322a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        const hidl_vec<uint8_t>& sessionId, const hidl_vec<uint8_t>& data) {
323a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
324a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    mEventLock.lock();
325a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    sp<IDrmClient> listener = mListener;
326a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    mEventLock.unlock();
327a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
328a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    if (listener != NULL) {
329a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        Parcel obj;
330a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        writeByteArray(obj, sessionId);
331a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        writeByteArray(obj, data);
332a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
333a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        Mutex::Autolock lock(mNotifyLock);
334a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        DrmPlugin::EventType eventType;
335a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        switch(hEventType) {
336a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        case EventType::PROVISION_REQUIRED:
337a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            eventType = DrmPlugin::kDrmPluginEventProvisionRequired;
338a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            break;
339a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        case EventType::KEY_NEEDED:
340a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            eventType = DrmPlugin::kDrmPluginEventKeyNeeded;
341a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            break;
342a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        case EventType::KEY_EXPIRED:
343a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            eventType = DrmPlugin::kDrmPluginEventKeyExpired;
344a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            break;
345a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        case EventType::VENDOR_DEFINED:
346a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            eventType = DrmPlugin::kDrmPluginEventVendorDefined;
347a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            break;
348b86f4b3ce066eadbfe9c2f420b16aaf2de741edbRahul Frias        case EventType::SESSION_RECLAIMED:
349b86f4b3ce066eadbfe9c2f420b16aaf2de741edbRahul Frias            eventType = DrmPlugin::kDrmPluginEventSessionReclaimed;
350b86f4b3ce066eadbfe9c2f420b16aaf2de741edbRahul Frias            break;
351a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        default:
352a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            return Void();
353a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        }
354a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        listener->notify(eventType, 0, &obj);
355a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    }
356a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return Void();
357a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
358a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
359a53d6553fce1818bdf87833f93633c93ad1b5915Jeff TinkerReturn<void> DrmHal::sendExpirationUpdate(const hidl_vec<uint8_t>& sessionId,
360a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        int64_t expiryTimeInMS) {
361a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
362a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    mEventLock.lock();
363a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    sp<IDrmClient> listener = mListener;
364a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    mEventLock.unlock();
365a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
366a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    if (listener != NULL) {
367a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        Parcel obj;
368a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        writeByteArray(obj, sessionId);
369a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        obj.writeInt64(expiryTimeInMS);
370a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
371a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        Mutex::Autolock lock(mNotifyLock);
372a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        listener->notify(DrmPlugin::kDrmPluginEventExpirationUpdate, 0, &obj);
373a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    }
374a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return Void();
375a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
376a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
377a53d6553fce1818bdf87833f93633c93ad1b5915Jeff TinkerReturn<void> DrmHal::sendKeysChange(const hidl_vec<uint8_t>& sessionId,
378a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        const hidl_vec<KeyStatus>& keyStatusList, bool hasNewUsableKey) {
379a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
380a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    mEventLock.lock();
381a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    sp<IDrmClient> listener = mListener;
382a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    mEventLock.unlock();
383a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
384a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    if (listener != NULL) {
385a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        Parcel obj;
386a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        writeByteArray(obj, sessionId);
387a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
388a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        size_t nKeys = keyStatusList.size();
389a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        obj.writeInt32(nKeys);
390a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        for (size_t i = 0; i < nKeys; ++i) {
391a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            const KeyStatus &keyStatus = keyStatusList[i];
392a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            writeByteArray(obj, keyStatus.keyId);
393a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            uint32_t type;
394a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            switch(keyStatus.type) {
395a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            case KeyStatusType::USABLE:
396a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                type = DrmPlugin::kKeyStatusType_Usable;
397a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                break;
398a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            case KeyStatusType::EXPIRED:
399a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                type = DrmPlugin::kKeyStatusType_Expired;
400a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                break;
401a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            case KeyStatusType::OUTPUTNOTALLOWED:
402a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                type = DrmPlugin::kKeyStatusType_OutputNotAllowed;
403a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                break;
404a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            case KeyStatusType::STATUSPENDING:
405a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                type = DrmPlugin::kKeyStatusType_StatusPending;
406a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                break;
407a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            case KeyStatusType::INTERNALERROR:
408a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            default:
409a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                type = DrmPlugin::kKeyStatusType_InternalError;
410a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                break;
411a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            }
412a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            obj.writeInt32(type);
413a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        }
414a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        obj.writeInt32(hasNewUsableKey);
415a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
416a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        Mutex::Autolock lock(mNotifyLock);
417a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        listener->notify(DrmPlugin::kDrmPluginEventKeysChange, 0, &obj);
418a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    }
419a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return Void();
420a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
421a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
422a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerbool DrmHal::isCryptoSchemeSupported(const uint8_t uuid[16], const String8 &mimeType) {
423a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
424a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
425abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker    for (size_t i = 0; i < mFactories.size(); i++) {
426abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker        if (mFactories[i]->isCryptoSchemeSupported(uuid)) {
427abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker            if (mimeType != "") {
428abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker                if (mFactories[i]->isContentTypeSupported(mimeType.string())) {
429abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker                    return true;
430abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker                }
431abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker            } else {
432abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker                return true;
433abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker            }
434a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        }
435a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    }
436abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker    return false;
437a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
438a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
43968b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wongstatus_t DrmHal::createPlugin(const uint8_t uuid[16],
44068b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong        const String8& appPackageName) {
441a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
442a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
443abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker    for (size_t i = 0; i < mFactories.size(); i++) {
444abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker        if (mFactories[i]->isCryptoSchemeSupported(uuid)) {
445abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker            mPlugin = makeDrmPlugin(mFactories[i], uuid, appPackageName);
4466d998b67be330843f633a563c23c606593060165Jeff Tinker            mPluginV1_1 = drm::V1_1::IDrmPlugin::castFrom(mPlugin);
447abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker        }
448abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinker    }
449a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
450a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    if (mPlugin == NULL) {
451a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        mInitCheck = ERROR_UNSUPPORTED;
452a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    } else {
453319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker        if (!mPlugin->setListener(this).isOk()) {
454319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker            mInitCheck = DEAD_OBJECT;
455319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker        } else {
456319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker            mInitCheck = OK;
457319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker        }
458a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    }
459a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
460a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return mInitCheck;
461a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
462a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
463a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::destroyPlugin() {
464a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
4656d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
466a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
4676133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker    closeOpenSessions();
46833ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce    reportMetrics();
469a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    setListener(NULL);
470319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker    mInitCheck = NO_INIT;
471319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker
47270367f525a7bf5be52115608d190d72756e972eaJeff Tinker    if (mPlugin != NULL) {
473319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker        if (!mPlugin->setListener(NULL).isOk()) {
474319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker            mInitCheck = DEAD_OBJECT;
475319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker        }
47670367f525a7bf5be52115608d190d72756e972eaJeff Tinker    }
477a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    mPlugin.clear();
478a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return OK;
479a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
480a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
481a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::openSession(Vector<uint8_t> &sessionId) {
482a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
4836d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
484a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
485a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    status_t  err = UNKNOWN_ERROR;
486a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
487a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    bool retry = true;
488a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    do {
489a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        hidl_vec<uint8_t> hSessionId;
490a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
491a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        Return<void> hResult = mPlugin->openSession(
492a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                [&](Status status, const hidl_vec<uint8_t>& id) {
493a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    if (status == Status::OK) {
494a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                        sessionId = toVector(id);
495a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    }
496a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    err = toStatusT(status);
497a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                }
498a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            );
499a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
500a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        if (!hResult.isOk()) {
501a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            err = DEAD_OBJECT;
502a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        }
503a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
504a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        if (err == ERROR_DRM_RESOURCE_BUSY && retry) {
505a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            mLock.unlock();
506a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            // reclaimSession may call back to closeSession, since mLock is
507a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            // shared between Drm instances, we should unlock here to avoid
508a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            // deadlock.
509a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            retry = DrmSessionManager::Instance()->reclaimSession(getCallingPid());
510a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            mLock.lock();
511a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        } else {
512a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            retry = false;
513a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        }
514a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    } while (retry);
515a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
516a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    if (err == OK) {
517a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        DrmSessionManager::Instance()->addSession(getCallingPid(),
518a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                mDrmSessionClient, sessionId);
5196133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker        mOpenSessions.push(sessionId);
520a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    }
521a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return err;
522a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
523a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
524a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::closeSession(Vector<uint8_t> const &sessionId) {
525a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
5266d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
527a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
528319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker    Return<Status> status = mPlugin->closeSession(toHidlVec(sessionId));
529319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker    if (status.isOk()) {
530319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker        if (status == Status::OK) {
531319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker            DrmSessionManager::Instance()->removeSession(sessionId);
532319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker            for (size_t i = 0; i < mOpenSessions.size(); i++) {
533319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker                if (mOpenSessions[i] == sessionId) {
534319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker                    mOpenSessions.removeAt(i);
535319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker                    break;
536319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker                }
5376133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker            }
5386133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker        }
539319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker        reportMetrics();
540319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker        return toStatusT(status);
541a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    }
542319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker    return DEAD_OBJECT;
543a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
544a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
545a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::getKeyRequest(Vector<uint8_t> const &sessionId,
546a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        Vector<uint8_t> const &initData, String8 const &mimeType,
547a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        DrmPlugin::KeyType keyType, KeyedVector<String8,
548a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        String8> const &optionalParameters, Vector<uint8_t> &request,
549a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        String8 &defaultUrl, DrmPlugin::KeyRequestType *keyRequestType) {
550a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
5516d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
552a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
553a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    DrmSessionManager::Instance()->useSession(sessionId);
554a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
555a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    KeyType hKeyType;
556a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    if (keyType == DrmPlugin::kKeyType_Streaming) {
557a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        hKeyType = KeyType::STREAMING;
558a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    } else if (keyType == DrmPlugin::kKeyType_Offline) {
559a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        hKeyType = KeyType::OFFLINE;
560a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    } else if (keyType == DrmPlugin::kKeyType_Release) {
561a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        hKeyType = KeyType::RELEASE;
562a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    } else {
563a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        return BAD_VALUE;
564a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    }
565a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
566a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    ::KeyedVector hOptionalParameters = toHidlKeyedVector(optionalParameters);
567a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
568a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    status_t err = UNKNOWN_ERROR;
569a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
570a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Return<void> hResult = mPlugin->getKeyRequest(toHidlVec(sessionId),
571a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            toHidlVec(initData), toHidlString(mimeType), hKeyType, hOptionalParameters,
572a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            [&](Status status, const hidl_vec<uint8_t>& hRequest,
573a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    KeyRequestType hKeyRequestType, const hidl_string& hDefaultUrl) {
574a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
575a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                if (status == Status::OK) {
576a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    request = toVector(hRequest);
577a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    defaultUrl = toString8(hDefaultUrl);
578a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
579a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    switch (hKeyRequestType) {
580a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    case KeyRequestType::INITIAL:
581a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                        *keyRequestType = DrmPlugin::kKeyRequestType_Initial;
582a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                        break;
583a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    case KeyRequestType::RENEWAL:
584a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                        *keyRequestType = DrmPlugin::kKeyRequestType_Renewal;
585a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                        break;
586a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    case KeyRequestType::RELEASE:
587a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                        *keyRequestType = DrmPlugin::kKeyRequestType_Release;
588a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                        break;
589a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    default:
590a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                        *keyRequestType = DrmPlugin::kKeyRequestType_Unknown;
591a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                        break;
592a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    }
593a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    err = toStatusT(status);
594a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                }
595a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            });
596a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
597a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return hResult.isOk() ? err : DEAD_OBJECT;
598a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
599a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
600a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::provideKeyResponse(Vector<uint8_t> const &sessionId,
601a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        Vector<uint8_t> const &response, Vector<uint8_t> &keySetId) {
602a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
6036d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
604a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
605a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    DrmSessionManager::Instance()->useSession(sessionId);
606a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
607a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    status_t err = UNKNOWN_ERROR;
608a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
609a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Return<void> hResult = mPlugin->provideKeyResponse(toHidlVec(sessionId),
610a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            toHidlVec(response),
611a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            [&](Status status, const hidl_vec<uint8_t>& hKeySetId) {
612a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                if (status == Status::OK) {
613a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    keySetId = toVector(hKeySetId);
614a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                }
615a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                err = toStatusT(status);
616a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            }
617a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        );
618a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
619a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return hResult.isOk() ? err : DEAD_OBJECT;
620a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
621a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
622a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::removeKeys(Vector<uint8_t> const &keySetId) {
623a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
6246d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
625a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
626a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return toStatusT(mPlugin->removeKeys(toHidlVec(keySetId)));
627a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
628a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
629a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::restoreKeys(Vector<uint8_t> const &sessionId,
630a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        Vector<uint8_t> const &keySetId) {
631a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
6326d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
633a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
634a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    DrmSessionManager::Instance()->useSession(sessionId);
635a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
636a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return toStatusT(mPlugin->restoreKeys(toHidlVec(sessionId),
637a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    toHidlVec(keySetId)));
638a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
639a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
640a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::queryKeyStatus(Vector<uint8_t> const &sessionId,
641a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        KeyedVector<String8, String8> &infoMap) const {
642a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
6436d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
644a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
645a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    DrmSessionManager::Instance()->useSession(sessionId);
646a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
647a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    ::KeyedVector hInfoMap;
648a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
649a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    status_t err = UNKNOWN_ERROR;
650a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
651a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Return<void> hResult = mPlugin->queryKeyStatus(toHidlVec(sessionId),
652a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            [&](Status status, const hidl_vec<KeyValue>& map) {
653a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                if (status == Status::OK) {
654a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    infoMap = toKeyedVector(map);
655a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                }
656a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                err = toStatusT(status);
657a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            }
658a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        );
659a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
660a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return hResult.isOk() ? err : DEAD_OBJECT;
661a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
662a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
663a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::getProvisionRequest(String8 const &certType,
664a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        String8 const &certAuthority, Vector<uint8_t> &request,
665a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        String8 &defaultUrl) {
666a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
6676d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
668a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
669a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    status_t err = UNKNOWN_ERROR;
670a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
671a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Return<void> hResult = mPlugin->getProvisionRequest(
672a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            toHidlString(certType), toHidlString(certAuthority),
673a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            [&](Status status, const hidl_vec<uint8_t>& hRequest,
674a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    const hidl_string& hDefaultUrl) {
675a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                if (status == Status::OK) {
676a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    request = toVector(hRequest);
677a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    defaultUrl = toString8(hDefaultUrl);
678a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                }
679a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                err = toStatusT(status);
680a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            }
681a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        );
682a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
683a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return hResult.isOk() ? err : DEAD_OBJECT;
684a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
685a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
686a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::provideProvisionResponse(Vector<uint8_t> const &response,
68768b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong        Vector<uint8_t> &certificate, Vector<uint8_t> &wrappedKey) {
688a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
6896d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
690a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
691a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    status_t err = UNKNOWN_ERROR;
692a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
693a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Return<void> hResult = mPlugin->provideProvisionResponse(toHidlVec(response),
694a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            [&](Status status, const hidl_vec<uint8_t>& hCertificate,
695a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    const hidl_vec<uint8_t>& hWrappedKey) {
696a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                if (status == Status::OK) {
697a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    certificate = toVector(hCertificate);
698a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    wrappedKey = toVector(hWrappedKey);
699a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                }
700a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                err = toStatusT(status);
701a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            }
702a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        );
703a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
704a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return hResult.isOk() ? err : DEAD_OBJECT;
705a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
706a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
707abeb36a8c2f044772297536e70340c3b245863e4Jeff Tinkerstatus_t DrmHal::getSecureStops(List<Vector<uint8_t>> &secureStops) {
708a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
7096d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
710a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
711a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    status_t err = UNKNOWN_ERROR;
712a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
713a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Return<void> hResult = mPlugin->getSecureStops(
714a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            [&](Status status, const hidl_vec<SecureStop>& hSecureStops) {
715a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                if (status == Status::OK) {
716a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    secureStops = toSecureStops(hSecureStops);
717a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                }
718a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                err = toStatusT(status);
719a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            }
720a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    );
721a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
722a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return hResult.isOk() ? err : DEAD_OBJECT;
723a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
724a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
725a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
726a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::getSecureStop(Vector<uint8_t> const &ssid, Vector<uint8_t> &secureStop) {
727a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
7286d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
729a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
730a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    status_t err = UNKNOWN_ERROR;
731a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
732a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Return<void> hResult = mPlugin->getSecureStop(toHidlVec(ssid),
733a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            [&](Status status, const SecureStop& hSecureStop) {
734a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                if (status == Status::OK) {
735a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    secureStop = toVector(hSecureStop.opaqueData);
736a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                }
737a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                err = toStatusT(status);
738a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            }
739a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    );
740a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
741a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return hResult.isOk() ? err : DEAD_OBJECT;
742a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
743a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
744a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::releaseSecureStops(Vector<uint8_t> const &ssRelease) {
745a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
7466d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
747a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
748a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return toStatusT(mPlugin->releaseSecureStop(toHidlVec(ssRelease)));
749a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
750a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
751a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::releaseAllSecureStops() {
752a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
7536d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
754a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
7556d998b67be330843f633a563c23c606593060165Jeff Tinker    return toStatusT(mPlugin->releaseAllSecureStops());
7566d998b67be330843f633a563c23c606593060165Jeff Tinker}
7576d998b67be330843f633a563c23c606593060165Jeff Tinker
7586d998b67be330843f633a563c23c606593060165Jeff Tinkerstatus_t DrmHal::getHdcpLevels(DrmPlugin::HdcpLevel *connected,
7596d998b67be330843f633a563c23c606593060165Jeff Tinker            DrmPlugin::HdcpLevel *max) const {
7606d998b67be330843f633a563c23c606593060165Jeff Tinker    Mutex::Autolock autoLock(mLock);
7616d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
7626d998b67be330843f633a563c23c606593060165Jeff Tinker
7636d998b67be330843f633a563c23c606593060165Jeff Tinker    if (connected == NULL || max == NULL) {
7646d998b67be330843f633a563c23c606593060165Jeff Tinker        return BAD_VALUE;
765a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    }
7666d998b67be330843f633a563c23c606593060165Jeff Tinker    status_t err = UNKNOWN_ERROR;
767a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
7686d998b67be330843f633a563c23c606593060165Jeff Tinker    if (mPluginV1_1 == NULL) {
7696d998b67be330843f633a563c23c606593060165Jeff Tinker        return ERROR_DRM_CANNOT_HANDLE;
7706d998b67be330843f633a563c23c606593060165Jeff Tinker    }
7716d998b67be330843f633a563c23c606593060165Jeff Tinker
7726d998b67be330843f633a563c23c606593060165Jeff Tinker    *connected = DrmPlugin::kHdcpLevelUnknown;
7736d998b67be330843f633a563c23c606593060165Jeff Tinker    *max = DrmPlugin::kHdcpLevelUnknown;
7746d998b67be330843f633a563c23c606593060165Jeff Tinker
7756d998b67be330843f633a563c23c606593060165Jeff Tinker    Return<void> hResult = mPluginV1_1->getHdcpLevels(
7766d998b67be330843f633a563c23c606593060165Jeff Tinker            [&](Status status, const HdcpLevel& hConnected, const HdcpLevel& hMax) {
7776d998b67be330843f633a563c23c606593060165Jeff Tinker                if (status == Status::OK) {
7786d998b67be330843f633a563c23c606593060165Jeff Tinker                    *connected = toHdcpLevel(hConnected);
7796d998b67be330843f633a563c23c606593060165Jeff Tinker                    *max = toHdcpLevel(hMax);
7806d998b67be330843f633a563c23c606593060165Jeff Tinker                }
7816d998b67be330843f633a563c23c606593060165Jeff Tinker                err = toStatusT(status);
7826d998b67be330843f633a563c23c606593060165Jeff Tinker            }
7836d998b67be330843f633a563c23c606593060165Jeff Tinker    );
7846d998b67be330843f633a563c23c606593060165Jeff Tinker
7856d998b67be330843f633a563c23c606593060165Jeff Tinker    return hResult.isOk() ? err : DEAD_OBJECT;
7866d998b67be330843f633a563c23c606593060165Jeff Tinker}
7876d998b67be330843f633a563c23c606593060165Jeff Tinker
7886d998b67be330843f633a563c23c606593060165Jeff Tinkerstatus_t DrmHal::getNumberOfSessions(uint32_t *open, uint32_t *max) const {
7896d998b67be330843f633a563c23c606593060165Jeff Tinker    Mutex::Autolock autoLock(mLock);
7906d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
7916d998b67be330843f633a563c23c606593060165Jeff Tinker
7926d998b67be330843f633a563c23c606593060165Jeff Tinker    if (open == NULL || max == NULL) {
7936d998b67be330843f633a563c23c606593060165Jeff Tinker        return BAD_VALUE;
7946d998b67be330843f633a563c23c606593060165Jeff Tinker    }
7956d998b67be330843f633a563c23c606593060165Jeff Tinker    status_t err = UNKNOWN_ERROR;
7966d998b67be330843f633a563c23c606593060165Jeff Tinker
7976d998b67be330843f633a563c23c606593060165Jeff Tinker    *open = 0;
7986d998b67be330843f633a563c23c606593060165Jeff Tinker    *max = 0;
7996d998b67be330843f633a563c23c606593060165Jeff Tinker
8006d998b67be330843f633a563c23c606593060165Jeff Tinker    if (mPluginV1_1 == NULL) {
8016d998b67be330843f633a563c23c606593060165Jeff Tinker        return ERROR_DRM_CANNOT_HANDLE;
8026d998b67be330843f633a563c23c606593060165Jeff Tinker    }
8036d998b67be330843f633a563c23c606593060165Jeff Tinker
8046d998b67be330843f633a563c23c606593060165Jeff Tinker    Return<void> hResult = mPluginV1_1->getNumberOfSessions(
8056d998b67be330843f633a563c23c606593060165Jeff Tinker            [&](Status status, uint32_t hOpen, uint32_t hMax) {
8066d998b67be330843f633a563c23c606593060165Jeff Tinker                if (status == Status::OK) {
8076d998b67be330843f633a563c23c606593060165Jeff Tinker                    *open = hOpen;
8086d998b67be330843f633a563c23c606593060165Jeff Tinker                    *max = hMax;
8096d998b67be330843f633a563c23c606593060165Jeff Tinker                }
8106d998b67be330843f633a563c23c606593060165Jeff Tinker                err = toStatusT(status);
8116d998b67be330843f633a563c23c606593060165Jeff Tinker            }
8126d998b67be330843f633a563c23c606593060165Jeff Tinker    );
8136d998b67be330843f633a563c23c606593060165Jeff Tinker
8146d998b67be330843f633a563c23c606593060165Jeff Tinker    return hResult.isOk() ? err : DEAD_OBJECT;
8156d998b67be330843f633a563c23c606593060165Jeff Tinker}
8166d998b67be330843f633a563c23c606593060165Jeff Tinker
8176d998b67be330843f633a563c23c606593060165Jeff Tinkerstatus_t DrmHal::getSecurityLevel(Vector<uint8_t> const &sessionId,
8186d998b67be330843f633a563c23c606593060165Jeff Tinker        DrmPlugin::SecurityLevel *level) const {
8196d998b67be330843f633a563c23c606593060165Jeff Tinker    Mutex::Autolock autoLock(mLock);
8206d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
8216d998b67be330843f633a563c23c606593060165Jeff Tinker
8226d998b67be330843f633a563c23c606593060165Jeff Tinker    if (level == NULL) {
8236d998b67be330843f633a563c23c606593060165Jeff Tinker        return BAD_VALUE;
8246d998b67be330843f633a563c23c606593060165Jeff Tinker    }
8256d998b67be330843f633a563c23c606593060165Jeff Tinker    status_t err = UNKNOWN_ERROR;
8266d998b67be330843f633a563c23c606593060165Jeff Tinker
8276d998b67be330843f633a563c23c606593060165Jeff Tinker    if (mPluginV1_1 == NULL) {
8286d998b67be330843f633a563c23c606593060165Jeff Tinker        return ERROR_DRM_CANNOT_HANDLE;
8296d998b67be330843f633a563c23c606593060165Jeff Tinker    }
8306d998b67be330843f633a563c23c606593060165Jeff Tinker
8316d998b67be330843f633a563c23c606593060165Jeff Tinker    *level = DrmPlugin::kSecurityLevelUnknown;
8326d998b67be330843f633a563c23c606593060165Jeff Tinker
8336d998b67be330843f633a563c23c606593060165Jeff Tinker    Return<void> hResult = mPluginV1_1->getSecurityLevel(toHidlVec(sessionId),
8346d998b67be330843f633a563c23c606593060165Jeff Tinker            [&](Status status, SecurityLevel hLevel) {
8356d998b67be330843f633a563c23c606593060165Jeff Tinker                if (status == Status::OK) {
8366d998b67be330843f633a563c23c606593060165Jeff Tinker                    *level = toSecurityLevel(hLevel);
8376d998b67be330843f633a563c23c606593060165Jeff Tinker                }
8386d998b67be330843f633a563c23c606593060165Jeff Tinker                err = toStatusT(status);
8396d998b67be330843f633a563c23c606593060165Jeff Tinker            }
8406d998b67be330843f633a563c23c606593060165Jeff Tinker    );
8416d998b67be330843f633a563c23c606593060165Jeff Tinker
8426d998b67be330843f633a563c23c606593060165Jeff Tinker    return hResult.isOk() ? err : DEAD_OBJECT;
8436d998b67be330843f633a563c23c606593060165Jeff Tinker}
8446d998b67be330843f633a563c23c606593060165Jeff Tinker
8456d998b67be330843f633a563c23c606593060165Jeff Tinkerstatus_t DrmHal::setSecurityLevel(Vector<uint8_t> const &sessionId,
8466d998b67be330843f633a563c23c606593060165Jeff Tinker        const DrmPlugin::SecurityLevel& level) {
8476d998b67be330843f633a563c23c606593060165Jeff Tinker    Mutex::Autolock autoLock(mLock);
8486d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
8496d998b67be330843f633a563c23c606593060165Jeff Tinker
8506d998b67be330843f633a563c23c606593060165Jeff Tinker    if (mPluginV1_1 == NULL) {
8516d998b67be330843f633a563c23c606593060165Jeff Tinker        return ERROR_DRM_CANNOT_HANDLE;
8526d998b67be330843f633a563c23c606593060165Jeff Tinker    }
8536d998b67be330843f633a563c23c606593060165Jeff Tinker
8546d998b67be330843f633a563c23c606593060165Jeff Tinker    SecurityLevel hSecurityLevel;
8556d998b67be330843f633a563c23c606593060165Jeff Tinker
8566d998b67be330843f633a563c23c606593060165Jeff Tinker    switch(level) {
8576d998b67be330843f633a563c23c606593060165Jeff Tinker    case DrmPlugin::kSecurityLevelSwSecureCrypto:
8586d998b67be330843f633a563c23c606593060165Jeff Tinker        hSecurityLevel = SecurityLevel::SW_SECURE_CRYPTO;
8596d998b67be330843f633a563c23c606593060165Jeff Tinker        break;
8606d998b67be330843f633a563c23c606593060165Jeff Tinker    case DrmPlugin::kSecurityLevelSwSecureDecode:
8616d998b67be330843f633a563c23c606593060165Jeff Tinker        hSecurityLevel = SecurityLevel::SW_SECURE_DECODE;
8626d998b67be330843f633a563c23c606593060165Jeff Tinker        break;
8636d998b67be330843f633a563c23c606593060165Jeff Tinker    case DrmPlugin::kSecurityLevelHwSecureCrypto:
8646d998b67be330843f633a563c23c606593060165Jeff Tinker        hSecurityLevel = SecurityLevel::HW_SECURE_CRYPTO;
8656d998b67be330843f633a563c23c606593060165Jeff Tinker        break;
8666d998b67be330843f633a563c23c606593060165Jeff Tinker    case DrmPlugin::kSecurityLevelHwSecureDecode:
8676d998b67be330843f633a563c23c606593060165Jeff Tinker        hSecurityLevel = SecurityLevel::HW_SECURE_DECODE;
8686d998b67be330843f633a563c23c606593060165Jeff Tinker        break;
8696d998b67be330843f633a563c23c606593060165Jeff Tinker    case DrmPlugin::kSecurityLevelHwSecureAll:
8706d998b67be330843f633a563c23c606593060165Jeff Tinker        hSecurityLevel = SecurityLevel::HW_SECURE_ALL;
8716d998b67be330843f633a563c23c606593060165Jeff Tinker        break;
8726d998b67be330843f633a563c23c606593060165Jeff Tinker    default:
8736d998b67be330843f633a563c23c606593060165Jeff Tinker        return ERROR_DRM_CANNOT_HANDLE;
8746d998b67be330843f633a563c23c606593060165Jeff Tinker    }
8756d998b67be330843f633a563c23c606593060165Jeff Tinker
8766d998b67be330843f633a563c23c606593060165Jeff Tinker    Status status = mPluginV1_1->setSecurityLevel(toHidlVec(sessionId),
8776d998b67be330843f633a563c23c606593060165Jeff Tinker            hSecurityLevel);
8786d998b67be330843f633a563c23c606593060165Jeff Tinker    return toStatusT(status);
879a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
880a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
881a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::getPropertyString(String8 const &name, String8 &value ) const {
882a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
88333ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce    return getPropertyStringInternal(name, value);
88433ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce}
88533ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce
88633ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Brucestatus_t DrmHal::getPropertyStringInternal(String8 const &name, String8 &value) const {
88733ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce    // This function is internal to the class and should only be called while
88833ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce    // mLock is already held.
8896d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
890a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
891a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    status_t err = UNKNOWN_ERROR;
892a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
893a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Return<void> hResult = mPlugin->getPropertyString(toHidlString(name),
894a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            [&](Status status, const hidl_string& hValue) {
895a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                if (status == Status::OK) {
896a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    value = toString8(hValue);
897a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                }
898a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                err = toStatusT(status);
899a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            }
900a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    );
901a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
902a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return hResult.isOk() ? err : DEAD_OBJECT;
903a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
904a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
905a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::getPropertyByteArray(String8 const &name, Vector<uint8_t> &value ) const {
906a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
90733ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce    return getPropertyByteArrayInternal(name, value);
90833ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce}
90933ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce
91033ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Brucestatus_t DrmHal::getPropertyByteArrayInternal(String8 const &name, Vector<uint8_t> &value ) const {
91133ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce    // This function is internal to the class and should only be called while
91233ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce    // mLock is already held.
9136d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
914a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
915a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    status_t err = UNKNOWN_ERROR;
916a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
917a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Return<void> hResult = mPlugin->getPropertyByteArray(toHidlString(name),
918a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            [&](Status status, const hidl_vec<uint8_t>& hValue) {
919a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                if (status == Status::OK) {
920a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    value = toVector(hValue);
921a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                }
922a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                err = toStatusT(status);
923a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            }
924a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    );
925a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
926a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return hResult.isOk() ? err : DEAD_OBJECT;
927a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
928a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
929a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::setPropertyString(String8 const &name, String8 const &value ) const {
930a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
9316d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
932a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
9336d998b67be330843f633a563c23c606593060165Jeff Tinker    Status status = mPlugin->setPropertyString(toHidlString(name),
934a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            toHidlString(value));
935a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return toStatusT(status);
936a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
937a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
938a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::setPropertyByteArray(String8 const &name,
939a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                                   Vector<uint8_t> const &value ) const {
940a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
9416d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
942a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
943a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Status status = mPlugin->setPropertyByteArray(toHidlString(name),
944a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            toHidlVec(value));
945a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return toStatusT(status);
946a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
947a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
948a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
949a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::setCipherAlgorithm(Vector<uint8_t> const &sessionId,
950a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                                 String8 const &algorithm) {
951a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
9526d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
953a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
954a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    DrmSessionManager::Instance()->useSession(sessionId);
955a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
956a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Status status = mPlugin->setCipherAlgorithm(toHidlVec(sessionId),
957a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            toHidlString(algorithm));
958a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return toStatusT(status);
959a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
960a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
961a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::setMacAlgorithm(Vector<uint8_t> const &sessionId,
962a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                              String8 const &algorithm) {
963a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
9646d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
965a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
966a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    DrmSessionManager::Instance()->useSession(sessionId);
967a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
968a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Status status = mPlugin->setMacAlgorithm(toHidlVec(sessionId),
969a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            toHidlString(algorithm));
970a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return toStatusT(status);
971a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
972a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
973a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::encrypt(Vector<uint8_t> const &sessionId,
97468b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong        Vector<uint8_t> const &keyId, Vector<uint8_t> const &input,
97568b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong        Vector<uint8_t> const &iv, Vector<uint8_t> &output) {
976a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
9776d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
978a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
979a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    DrmSessionManager::Instance()->useSession(sessionId);
980a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
981a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    status_t err = UNKNOWN_ERROR;
982a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
983a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Return<void> hResult = mPlugin->encrypt(toHidlVec(sessionId),
984a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            toHidlVec(keyId), toHidlVec(input), toHidlVec(iv),
985a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            [&](Status status, const hidl_vec<uint8_t>& hOutput) {
986a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                if (status == Status::OK) {
987a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    output = toVector(hOutput);
988a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                }
989a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                err = toStatusT(status);
990a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            }
991a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    );
992a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
993a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return hResult.isOk() ? err : DEAD_OBJECT;
994a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
995a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
996a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::decrypt(Vector<uint8_t> const &sessionId,
99768b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong        Vector<uint8_t> const &keyId, Vector<uint8_t> const &input,
99868b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong        Vector<uint8_t> const &iv, Vector<uint8_t> &output) {
999a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
10006d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
1001a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1002a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    DrmSessionManager::Instance()->useSession(sessionId);
1003a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1004a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    status_t  err = UNKNOWN_ERROR;
1005a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1006a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Return<void> hResult = mPlugin->decrypt(toHidlVec(sessionId),
1007a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            toHidlVec(keyId), toHidlVec(input), toHidlVec(iv),
1008a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            [&](Status status, const hidl_vec<uint8_t>& hOutput) {
1009a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                if (status == Status::OK) {
1010a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    output = toVector(hOutput);
1011a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                }
1012a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                err = toStatusT(status);
1013a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            }
1014a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    );
1015a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1016a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return hResult.isOk() ? err : DEAD_OBJECT;
1017a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
1018a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1019a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::sign(Vector<uint8_t> const &sessionId,
102068b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong        Vector<uint8_t> const &keyId, Vector<uint8_t> const &message,
102168b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong        Vector<uint8_t> &signature) {
1022a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
10236d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
1024a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1025a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    DrmSessionManager::Instance()->useSession(sessionId);
1026a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1027a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    status_t err = UNKNOWN_ERROR;
1028a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1029a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Return<void> hResult = mPlugin->sign(toHidlVec(sessionId),
1030a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            toHidlVec(keyId), toHidlVec(message),
1031a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            [&](Status status, const hidl_vec<uint8_t>& hSignature)  {
1032a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                if (status == Status::OK) {
1033a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    signature = toVector(hSignature);
1034a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                }
1035a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                err = toStatusT(status);
1036a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            }
1037a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    );
1038a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1039a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return hResult.isOk() ? err : DEAD_OBJECT;
1040a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
1041a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1042a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::verify(Vector<uint8_t> const &sessionId,
104368b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong        Vector<uint8_t> const &keyId, Vector<uint8_t> const &message,
104468b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong        Vector<uint8_t> const &signature, bool &match) {
1045a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
10466d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
1047a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1048a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    DrmSessionManager::Instance()->useSession(sessionId);
1049a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1050a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    status_t err = UNKNOWN_ERROR;
1051a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1052a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Return<void> hResult = mPlugin->verify(toHidlVec(sessionId),toHidlVec(keyId),
1053a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            toHidlVec(message), toHidlVec(signature),
1054a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            [&](Status status, bool hMatch) {
1055a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                if (status == Status::OK) {
1056a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    match = hMatch;
1057a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                } else {
1058a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    match = false;
1059a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                }
1060a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                err = toStatusT(status);
1061a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            }
1062a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    );
1063a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1064a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return hResult.isOk() ? err : DEAD_OBJECT;
1065a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
1066a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1067a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkerstatus_t DrmHal::signRSA(Vector<uint8_t> const &sessionId,
106868b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong        String8 const &algorithm, Vector<uint8_t> const &message,
106968b3d9f49e68a11af5225175dc9e60ce88819e84Edwin Wong        Vector<uint8_t> const &wrappedKey, Vector<uint8_t> &signature) {
1070a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
10716d998b67be330843f633a563c23c606593060165Jeff Tinker    INIT_CHECK();
1072a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1073a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    if (!checkPermission("android.permission.ACCESS_DRM_CERTIFICATES")) {
1074a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        return -EPERM;
1075a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    }
1076a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1077a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    DrmSessionManager::Instance()->useSession(sessionId);
1078a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1079a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    status_t err = UNKNOWN_ERROR;
1080a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1081a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Return<void> hResult = mPlugin->signRSA(toHidlVec(sessionId),
1082a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            toHidlString(algorithm), toHidlVec(message), toHidlVec(wrappedKey),
1083a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            [&](Status status, const hidl_vec<uint8_t>& hSignature) {
1084a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                if (status == Status::OK) {
1085a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                    signature = toVector(hSignature);
1086a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                }
1087a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker                err = toStatusT(status);
1088a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker            }
1089a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        );
1090a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1091a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    return hResult.isOk() ? err : DEAD_OBJECT;
1092a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
1093a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1094a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkervoid DrmHal::binderDied(const wp<IBinder> &the_late_who __unused)
1095a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker{
1096a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    Mutex::Autolock autoLock(mLock);
10976133281c9b06c1d1176eca7f07401bba1067081eJeff Tinker    closeOpenSessions();
10983e2891674ef57a74e59ca5e27f89647b3f06861bJeff Tinker    setListener(NULL);
1099319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker    mInitCheck = NO_INIT;
1100319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker
110170367f525a7bf5be52115608d190d72756e972eaJeff Tinker    if (mPlugin != NULL) {
1102319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker        if (!mPlugin->setListener(NULL).isOk()) {
1103319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker            mInitCheck = DEAD_OBJECT;
1104319d5f43d196ca1fc26c5d6169ae0bdd14a81d54Jeff Tinker        }
110570367f525a7bf5be52115608d190d72756e972eaJeff Tinker    }
1106a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    mPlugin.clear();
1107a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
1108a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
1109a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinkervoid DrmHal::writeByteArray(Parcel &obj, hidl_vec<uint8_t> const &vec)
1110a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker{
1111a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    if (vec.size()) {
1112a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        obj.writeInt32(vec.size());
1113a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        obj.write(vec.data(), vec.size());
1114a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    } else {
1115a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker        obj.writeInt32(0);
1116a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    }
1117a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}
1118a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker
111933ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Brucevoid DrmHal::reportMetrics() const
112033ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce{
112133ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce    Vector<uint8_t> metrics;
112233ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce    String8 vendor;
112333ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce    String8 description;
112433ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce    if (getPropertyStringInternal(String8("vendor"), vendor) == OK &&
112533ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce            getPropertyStringInternal(String8("description"), description) == OK &&
112633ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce            getPropertyByteArrayInternal(String8("metrics"), metrics) == OK) {
112733ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce        status_t res = android::reportDrmPluginMetrics(
112833ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce                metrics, vendor, description);
112933ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce        if (res != OK) {
113033ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce            ALOGE("Metrics were retrieved but could not be reported: %i", res);
113133ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce        }
113233ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce    }
113333ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce}
113433ecc4f6b0e53ea7088ff4f151323e29183070c5John W. Bruce
1135a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker}  // namespace android
1136