xref: /aosp_15_r20/hardware/interfaces/drm/1.0/default/DrmPlugin.cpp (revision 4d7e907c777eeecc4c5bd7cf640a754fac206ff7)
1*4d7e907cSAndroid Build Coastguard Worker /*
2*4d7e907cSAndroid Build Coastguard Worker  * Copyright (C) 2016 The Android Open Source Project
3*4d7e907cSAndroid Build Coastguard Worker  *
4*4d7e907cSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*4d7e907cSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*4d7e907cSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*4d7e907cSAndroid Build Coastguard Worker  *
8*4d7e907cSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*4d7e907cSAndroid Build Coastguard Worker  *
10*4d7e907cSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*4d7e907cSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*4d7e907cSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*4d7e907cSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*4d7e907cSAndroid Build Coastguard Worker  * limitations under the License.
15*4d7e907cSAndroid Build Coastguard Worker  */
16*4d7e907cSAndroid Build Coastguard Worker #define LOG_TAG "[email protected]"
17*4d7e907cSAndroid Build Coastguard Worker 
18*4d7e907cSAndroid Build Coastguard Worker #include <utils/KeyedVector.h>
19*4d7e907cSAndroid Build Coastguard Worker #include <utils/String8.h>
20*4d7e907cSAndroid Build Coastguard Worker 
21*4d7e907cSAndroid Build Coastguard Worker #include "DrmPlugin.h"
22*4d7e907cSAndroid Build Coastguard Worker #include "TypeConvert.h"
23*4d7e907cSAndroid Build Coastguard Worker 
24*4d7e907cSAndroid Build Coastguard Worker namespace android {
25*4d7e907cSAndroid Build Coastguard Worker namespace hardware {
26*4d7e907cSAndroid Build Coastguard Worker namespace drm {
27*4d7e907cSAndroid Build Coastguard Worker namespace V1_0 {
28*4d7e907cSAndroid Build Coastguard Worker namespace implementation {
29*4d7e907cSAndroid Build Coastguard Worker 
30*4d7e907cSAndroid Build Coastguard Worker     // Methods from ::android::hardware::drm::V1_0::IDrmPlugin follow.
31*4d7e907cSAndroid Build Coastguard Worker 
openSession(openSession_cb _hidl_cb)32*4d7e907cSAndroid Build Coastguard Worker     Return<void> DrmPlugin::openSession(openSession_cb _hidl_cb) {
33*4d7e907cSAndroid Build Coastguard Worker         Vector<uint8_t> legacySessionId;
34*4d7e907cSAndroid Build Coastguard Worker         status_t status = mLegacyPlugin->openSession(legacySessionId);
35*4d7e907cSAndroid Build Coastguard Worker         _hidl_cb(toStatus(status), toHidlVec(legacySessionId));
36*4d7e907cSAndroid Build Coastguard Worker         return Void();
37*4d7e907cSAndroid Build Coastguard Worker     }
38*4d7e907cSAndroid Build Coastguard Worker 
closeSession(const hidl_vec<uint8_t> & sessionId)39*4d7e907cSAndroid Build Coastguard Worker     Return<Status> DrmPlugin::closeSession(const hidl_vec<uint8_t>& sessionId) {
40*4d7e907cSAndroid Build Coastguard Worker         return toStatus(mLegacyPlugin->closeSession(toVector(sessionId)));
41*4d7e907cSAndroid Build Coastguard Worker     }
42*4d7e907cSAndroid Build Coastguard Worker 
getKeyRequest(const hidl_vec<uint8_t> & scope,const hidl_vec<uint8_t> & initData,const hidl_string & mimeType,KeyType keyType,const hidl_vec<KeyValue> & optionalParameters,getKeyRequest_cb _hidl_cb)43*4d7e907cSAndroid Build Coastguard Worker     Return<void> DrmPlugin::getKeyRequest(const hidl_vec<uint8_t>& scope,
44*4d7e907cSAndroid Build Coastguard Worker             const hidl_vec<uint8_t>& initData, const hidl_string& mimeType,
45*4d7e907cSAndroid Build Coastguard Worker             KeyType keyType, const hidl_vec<KeyValue>& optionalParameters,
46*4d7e907cSAndroid Build Coastguard Worker             getKeyRequest_cb _hidl_cb) {
47*4d7e907cSAndroid Build Coastguard Worker 
48*4d7e907cSAndroid Build Coastguard Worker         status_t status = android::OK;
49*4d7e907cSAndroid Build Coastguard Worker 
50*4d7e907cSAndroid Build Coastguard Worker         android::DrmPlugin::KeyType legacyKeyType;
51*4d7e907cSAndroid Build Coastguard Worker         switch(keyType) {
52*4d7e907cSAndroid Build Coastguard Worker         case KeyType::OFFLINE:
53*4d7e907cSAndroid Build Coastguard Worker             legacyKeyType = android::DrmPlugin::kKeyType_Offline;
54*4d7e907cSAndroid Build Coastguard Worker             break;
55*4d7e907cSAndroid Build Coastguard Worker         case KeyType::STREAMING:
56*4d7e907cSAndroid Build Coastguard Worker             legacyKeyType = android::DrmPlugin::kKeyType_Streaming;
57*4d7e907cSAndroid Build Coastguard Worker             break;
58*4d7e907cSAndroid Build Coastguard Worker         case KeyType::RELEASE:
59*4d7e907cSAndroid Build Coastguard Worker             legacyKeyType = android::DrmPlugin::kKeyType_Release;
60*4d7e907cSAndroid Build Coastguard Worker             break;
61*4d7e907cSAndroid Build Coastguard Worker         default:
62*4d7e907cSAndroid Build Coastguard Worker             status = android::BAD_VALUE;
63*4d7e907cSAndroid Build Coastguard Worker             break;
64*4d7e907cSAndroid Build Coastguard Worker         }
65*4d7e907cSAndroid Build Coastguard Worker 
66*4d7e907cSAndroid Build Coastguard Worker         Vector<uint8_t> legacyRequest;
67*4d7e907cSAndroid Build Coastguard Worker         KeyRequestType requestType = KeyRequestType::UNKNOWN;
68*4d7e907cSAndroid Build Coastguard Worker         String8 defaultUrl;
69*4d7e907cSAndroid Build Coastguard Worker 
70*4d7e907cSAndroid Build Coastguard Worker         if (status == android::OK) {
71*4d7e907cSAndroid Build Coastguard Worker             android::KeyedVector<String8, String8> legacyOptionalParameters;
72*4d7e907cSAndroid Build Coastguard Worker             for (size_t i = 0; i < optionalParameters.size(); i++) {
73*4d7e907cSAndroid Build Coastguard Worker                 legacyOptionalParameters.add(String8(optionalParameters[i].key.c_str()),
74*4d7e907cSAndroid Build Coastguard Worker                         String8(optionalParameters[i].value.c_str()));
75*4d7e907cSAndroid Build Coastguard Worker             }
76*4d7e907cSAndroid Build Coastguard Worker 
77*4d7e907cSAndroid Build Coastguard Worker             android::DrmPlugin::KeyRequestType legacyRequestType =
78*4d7e907cSAndroid Build Coastguard Worker                     android::DrmPlugin::kKeyRequestType_Unknown;
79*4d7e907cSAndroid Build Coastguard Worker 
80*4d7e907cSAndroid Build Coastguard Worker             status = mLegacyPlugin->getKeyRequest(toVector(scope),
81*4d7e907cSAndroid Build Coastguard Worker                     toVector(initData), String8(mimeType.c_str()), legacyKeyType,
82*4d7e907cSAndroid Build Coastguard Worker                     legacyOptionalParameters, legacyRequest, defaultUrl,
83*4d7e907cSAndroid Build Coastguard Worker                     &legacyRequestType);
84*4d7e907cSAndroid Build Coastguard Worker 
85*4d7e907cSAndroid Build Coastguard Worker             switch(legacyRequestType) {
86*4d7e907cSAndroid Build Coastguard Worker             case android::DrmPlugin::kKeyRequestType_Initial:
87*4d7e907cSAndroid Build Coastguard Worker                 requestType = KeyRequestType::INITIAL;
88*4d7e907cSAndroid Build Coastguard Worker                 break;
89*4d7e907cSAndroid Build Coastguard Worker             case android::DrmPlugin::kKeyRequestType_Renewal:
90*4d7e907cSAndroid Build Coastguard Worker                 requestType = KeyRequestType::RENEWAL;
91*4d7e907cSAndroid Build Coastguard Worker                 break;
92*4d7e907cSAndroid Build Coastguard Worker             case android::DrmPlugin::kKeyRequestType_Release:
93*4d7e907cSAndroid Build Coastguard Worker                 requestType = KeyRequestType::RELEASE;
94*4d7e907cSAndroid Build Coastguard Worker                 break;
95*4d7e907cSAndroid Build Coastguard Worker             case android::DrmPlugin::kKeyRequestType_Unknown:
96*4d7e907cSAndroid Build Coastguard Worker             default:
97*4d7e907cSAndroid Build Coastguard Worker                 requestType = KeyRequestType::UNKNOWN;
98*4d7e907cSAndroid Build Coastguard Worker                 break;
99*4d7e907cSAndroid Build Coastguard Worker             }
100*4d7e907cSAndroid Build Coastguard Worker         }
101*4d7e907cSAndroid Build Coastguard Worker         _hidl_cb(toStatus(status), toHidlVec(legacyRequest), requestType, defaultUrl.c_str());
102*4d7e907cSAndroid Build Coastguard Worker         return Void();
103*4d7e907cSAndroid Build Coastguard Worker     }
104*4d7e907cSAndroid Build Coastguard Worker 
provideKeyResponse(const hidl_vec<uint8_t> & scope,const hidl_vec<uint8_t> & response,provideKeyResponse_cb _hidl_cb)105*4d7e907cSAndroid Build Coastguard Worker     Return<void> DrmPlugin::provideKeyResponse(const hidl_vec<uint8_t>& scope,
106*4d7e907cSAndroid Build Coastguard Worker             const hidl_vec<uint8_t>& response, provideKeyResponse_cb _hidl_cb) {
107*4d7e907cSAndroid Build Coastguard Worker 
108*4d7e907cSAndroid Build Coastguard Worker         Vector<uint8_t> keySetId;
109*4d7e907cSAndroid Build Coastguard Worker         status_t status = mLegacyPlugin->provideKeyResponse(toVector(scope),
110*4d7e907cSAndroid Build Coastguard Worker                 toVector(response), keySetId);
111*4d7e907cSAndroid Build Coastguard Worker         _hidl_cb(toStatus(status), toHidlVec(keySetId));
112*4d7e907cSAndroid Build Coastguard Worker         return Void();
113*4d7e907cSAndroid Build Coastguard Worker     }
114*4d7e907cSAndroid Build Coastguard Worker 
removeKeys(const hidl_vec<uint8_t> & sessionId)115*4d7e907cSAndroid Build Coastguard Worker     Return<Status> DrmPlugin::removeKeys(const hidl_vec<uint8_t>& sessionId) {
116*4d7e907cSAndroid Build Coastguard Worker         return toStatus(mLegacyPlugin->removeKeys(toVector(sessionId)));
117*4d7e907cSAndroid Build Coastguard Worker     }
118*4d7e907cSAndroid Build Coastguard Worker 
restoreKeys(const hidl_vec<uint8_t> & sessionId,const hidl_vec<uint8_t> & keySetId)119*4d7e907cSAndroid Build Coastguard Worker     Return<Status> DrmPlugin::restoreKeys(const hidl_vec<uint8_t>& sessionId,
120*4d7e907cSAndroid Build Coastguard Worker             const hidl_vec<uint8_t>& keySetId) {
121*4d7e907cSAndroid Build Coastguard Worker         status_t legacyStatus = mLegacyPlugin->restoreKeys(toVector(sessionId),
122*4d7e907cSAndroid Build Coastguard Worker                 toVector(keySetId));
123*4d7e907cSAndroid Build Coastguard Worker         return toStatus(legacyStatus);
124*4d7e907cSAndroid Build Coastguard Worker     }
125*4d7e907cSAndroid Build Coastguard Worker 
queryKeyStatus(const hidl_vec<uint8_t> & sessionId,queryKeyStatus_cb _hidl_cb)126*4d7e907cSAndroid Build Coastguard Worker     Return<void> DrmPlugin::queryKeyStatus(const hidl_vec<uint8_t>& sessionId,
127*4d7e907cSAndroid Build Coastguard Worker             queryKeyStatus_cb _hidl_cb) {
128*4d7e907cSAndroid Build Coastguard Worker 
129*4d7e907cSAndroid Build Coastguard Worker         android::KeyedVector<String8, String8> legacyInfoMap;
130*4d7e907cSAndroid Build Coastguard Worker         status_t status = mLegacyPlugin->queryKeyStatus(toVector(sessionId),
131*4d7e907cSAndroid Build Coastguard Worker                 legacyInfoMap);
132*4d7e907cSAndroid Build Coastguard Worker 
133*4d7e907cSAndroid Build Coastguard Worker         Vector<KeyValue> infoMapVec;
134*4d7e907cSAndroid Build Coastguard Worker         for (size_t i = 0; i < legacyInfoMap.size(); i++) {
135*4d7e907cSAndroid Build Coastguard Worker             KeyValue keyValuePair;
136*4d7e907cSAndroid Build Coastguard Worker             keyValuePair.key = legacyInfoMap.keyAt(i);
137*4d7e907cSAndroid Build Coastguard Worker             keyValuePair.value = legacyInfoMap.valueAt(i);
138*4d7e907cSAndroid Build Coastguard Worker             infoMapVec.push_back(keyValuePair);
139*4d7e907cSAndroid Build Coastguard Worker         }
140*4d7e907cSAndroid Build Coastguard Worker         _hidl_cb(toStatus(status), toHidlVec(infoMapVec));
141*4d7e907cSAndroid Build Coastguard Worker         return Void();
142*4d7e907cSAndroid Build Coastguard Worker     }
143*4d7e907cSAndroid Build Coastguard Worker 
getProvisionRequest(const hidl_string & certificateType,const hidl_string & certificateAuthority,getProvisionRequest_cb _hidl_cb)144*4d7e907cSAndroid Build Coastguard Worker     Return<void> DrmPlugin::getProvisionRequest(
145*4d7e907cSAndroid Build Coastguard Worker             const hidl_string& certificateType,
146*4d7e907cSAndroid Build Coastguard Worker             const hidl_string& certificateAuthority,
147*4d7e907cSAndroid Build Coastguard Worker             getProvisionRequest_cb _hidl_cb) {
148*4d7e907cSAndroid Build Coastguard Worker 
149*4d7e907cSAndroid Build Coastguard Worker         Vector<uint8_t> legacyRequest;
150*4d7e907cSAndroid Build Coastguard Worker         String8 legacyDefaultUrl;
151*4d7e907cSAndroid Build Coastguard Worker         status_t status = mLegacyPlugin->getProvisionRequest(
152*4d7e907cSAndroid Build Coastguard Worker                 String8(certificateType.c_str()), String8(certificateAuthority.c_str()),
153*4d7e907cSAndroid Build Coastguard Worker                 legacyRequest, legacyDefaultUrl);
154*4d7e907cSAndroid Build Coastguard Worker 
155*4d7e907cSAndroid Build Coastguard Worker         _hidl_cb(toStatus(status), toHidlVec(legacyRequest),
156*4d7e907cSAndroid Build Coastguard Worker                 hidl_string(legacyDefaultUrl));
157*4d7e907cSAndroid Build Coastguard Worker         return Void();
158*4d7e907cSAndroid Build Coastguard Worker     }
159*4d7e907cSAndroid Build Coastguard Worker 
provideProvisionResponse(const hidl_vec<uint8_t> & response,provideProvisionResponse_cb _hidl_cb)160*4d7e907cSAndroid Build Coastguard Worker     Return<void> DrmPlugin::provideProvisionResponse(
161*4d7e907cSAndroid Build Coastguard Worker             const hidl_vec<uint8_t>& response,
162*4d7e907cSAndroid Build Coastguard Worker             provideProvisionResponse_cb _hidl_cb) {
163*4d7e907cSAndroid Build Coastguard Worker 
164*4d7e907cSAndroid Build Coastguard Worker         Vector<uint8_t> certificate;
165*4d7e907cSAndroid Build Coastguard Worker         Vector<uint8_t> wrappedKey;
166*4d7e907cSAndroid Build Coastguard Worker 
167*4d7e907cSAndroid Build Coastguard Worker         status_t legacyStatus = mLegacyPlugin->provideProvisionResponse(
168*4d7e907cSAndroid Build Coastguard Worker                 toVector(response), certificate, wrappedKey);
169*4d7e907cSAndroid Build Coastguard Worker 
170*4d7e907cSAndroid Build Coastguard Worker         _hidl_cb(toStatus(legacyStatus), toHidlVec(certificate),
171*4d7e907cSAndroid Build Coastguard Worker                 toHidlVec(wrappedKey));
172*4d7e907cSAndroid Build Coastguard Worker         return Void();
173*4d7e907cSAndroid Build Coastguard Worker     }
174*4d7e907cSAndroid Build Coastguard Worker 
getSecureStops(getSecureStops_cb _hidl_cb)175*4d7e907cSAndroid Build Coastguard Worker     Return<void> DrmPlugin::getSecureStops(getSecureStops_cb _hidl_cb) {
176*4d7e907cSAndroid Build Coastguard Worker         List<Vector<uint8_t> > legacySecureStops;
177*4d7e907cSAndroid Build Coastguard Worker         status_t status = mLegacyPlugin->getSecureStops(legacySecureStops);
178*4d7e907cSAndroid Build Coastguard Worker 
179*4d7e907cSAndroid Build Coastguard Worker         Vector<SecureStop> secureStopsVec;
180*4d7e907cSAndroid Build Coastguard Worker         List<Vector<uint8_t> >::iterator iter = legacySecureStops.begin();
181*4d7e907cSAndroid Build Coastguard Worker 
182*4d7e907cSAndroid Build Coastguard Worker         while (iter != legacySecureStops.end()) {
183*4d7e907cSAndroid Build Coastguard Worker             SecureStop secureStop;
184*4d7e907cSAndroid Build Coastguard Worker             secureStop.opaqueData = toHidlVec(*iter++);
185*4d7e907cSAndroid Build Coastguard Worker             secureStopsVec.push_back(secureStop);
186*4d7e907cSAndroid Build Coastguard Worker         }
187*4d7e907cSAndroid Build Coastguard Worker 
188*4d7e907cSAndroid Build Coastguard Worker         _hidl_cb(toStatus(status), toHidlVec(secureStopsVec));
189*4d7e907cSAndroid Build Coastguard Worker         return Void();
190*4d7e907cSAndroid Build Coastguard Worker     }
191*4d7e907cSAndroid Build Coastguard Worker 
getSecureStop(const hidl_vec<uint8_t> & secureStopId,getSecureStop_cb _hidl_cb)192*4d7e907cSAndroid Build Coastguard Worker     Return<void> DrmPlugin::getSecureStop(const hidl_vec<uint8_t>& secureStopId,
193*4d7e907cSAndroid Build Coastguard Worker             getSecureStop_cb _hidl_cb) {
194*4d7e907cSAndroid Build Coastguard Worker 
195*4d7e907cSAndroid Build Coastguard Worker         Vector<uint8_t> legacySecureStop;
196*4d7e907cSAndroid Build Coastguard Worker         status_t status = mLegacyPlugin->getSecureStop(toVector(secureStopId),
197*4d7e907cSAndroid Build Coastguard Worker                 legacySecureStop);
198*4d7e907cSAndroid Build Coastguard Worker 
199*4d7e907cSAndroid Build Coastguard Worker         SecureStop secureStop;
200*4d7e907cSAndroid Build Coastguard Worker         secureStop.opaqueData = toHidlVec(legacySecureStop);
201*4d7e907cSAndroid Build Coastguard Worker         _hidl_cb(toStatus(status), secureStop);
202*4d7e907cSAndroid Build Coastguard Worker         return Void();
203*4d7e907cSAndroid Build Coastguard Worker     }
204*4d7e907cSAndroid Build Coastguard Worker 
releaseAllSecureStops()205*4d7e907cSAndroid Build Coastguard Worker     Return<Status> DrmPlugin::releaseAllSecureStops() {
206*4d7e907cSAndroid Build Coastguard Worker         return toStatus(mLegacyPlugin->releaseAllSecureStops());
207*4d7e907cSAndroid Build Coastguard Worker     }
208*4d7e907cSAndroid Build Coastguard Worker 
releaseSecureStop(const hidl_vec<uint8_t> & secureStopId)209*4d7e907cSAndroid Build Coastguard Worker     Return<Status> DrmPlugin::releaseSecureStop(
210*4d7e907cSAndroid Build Coastguard Worker             const hidl_vec<uint8_t>& secureStopId) {
211*4d7e907cSAndroid Build Coastguard Worker         status_t legacyStatus =
212*4d7e907cSAndroid Build Coastguard Worker             mLegacyPlugin->releaseSecureStops(toVector(secureStopId));
213*4d7e907cSAndroid Build Coastguard Worker         return toStatus(legacyStatus);
214*4d7e907cSAndroid Build Coastguard Worker     }
215*4d7e907cSAndroid Build Coastguard Worker 
getPropertyString(const hidl_string & propertyName,getPropertyString_cb _hidl_cb)216*4d7e907cSAndroid Build Coastguard Worker     Return<void> DrmPlugin::getPropertyString(const hidl_string& propertyName,
217*4d7e907cSAndroid Build Coastguard Worker             getPropertyString_cb _hidl_cb) {
218*4d7e907cSAndroid Build Coastguard Worker         String8 legacyValue;
219*4d7e907cSAndroid Build Coastguard Worker         status_t status = mLegacyPlugin->getPropertyString(
220*4d7e907cSAndroid Build Coastguard Worker                 String8(propertyName.c_str()), legacyValue);
221*4d7e907cSAndroid Build Coastguard Worker         _hidl_cb(toStatus(status), legacyValue.c_str());
222*4d7e907cSAndroid Build Coastguard Worker         return Void();
223*4d7e907cSAndroid Build Coastguard Worker     }
224*4d7e907cSAndroid Build Coastguard Worker 
getPropertyByteArray(const hidl_string & propertyName,getPropertyByteArray_cb _hidl_cb)225*4d7e907cSAndroid Build Coastguard Worker     Return<void> DrmPlugin::getPropertyByteArray(const hidl_string& propertyName,
226*4d7e907cSAndroid Build Coastguard Worker             getPropertyByteArray_cb _hidl_cb) {
227*4d7e907cSAndroid Build Coastguard Worker         Vector<uint8_t> legacyValue;
228*4d7e907cSAndroid Build Coastguard Worker         status_t status = mLegacyPlugin->getPropertyByteArray(
229*4d7e907cSAndroid Build Coastguard Worker                 String8(propertyName.c_str()), legacyValue);
230*4d7e907cSAndroid Build Coastguard Worker         _hidl_cb(toStatus(status), toHidlVec(legacyValue));
231*4d7e907cSAndroid Build Coastguard Worker         return Void();
232*4d7e907cSAndroid Build Coastguard Worker     }
233*4d7e907cSAndroid Build Coastguard Worker 
setPropertyString(const hidl_string & propertyName,const hidl_string & value)234*4d7e907cSAndroid Build Coastguard Worker     Return<Status> DrmPlugin::setPropertyString(const hidl_string& propertyName,
235*4d7e907cSAndroid Build Coastguard Worker             const hidl_string& value) {
236*4d7e907cSAndroid Build Coastguard Worker         status_t legacyStatus =
237*4d7e907cSAndroid Build Coastguard Worker             mLegacyPlugin->setPropertyString(String8(propertyName.c_str()),
238*4d7e907cSAndroid Build Coastguard Worker                     String8(value.c_str()));
239*4d7e907cSAndroid Build Coastguard Worker         return toStatus(legacyStatus);
240*4d7e907cSAndroid Build Coastguard Worker     }
241*4d7e907cSAndroid Build Coastguard Worker 
setPropertyByteArray(const hidl_string & propertyName,const hidl_vec<uint8_t> & value)242*4d7e907cSAndroid Build Coastguard Worker     Return<Status> DrmPlugin::setPropertyByteArray(
243*4d7e907cSAndroid Build Coastguard Worker             const hidl_string& propertyName, const hidl_vec<uint8_t>& value) {
244*4d7e907cSAndroid Build Coastguard Worker         status_t legacyStatus =
245*4d7e907cSAndroid Build Coastguard Worker             mLegacyPlugin->setPropertyByteArray(String8(propertyName.c_str()),
246*4d7e907cSAndroid Build Coastguard Worker                     toVector(value));
247*4d7e907cSAndroid Build Coastguard Worker         return toStatus(legacyStatus);
248*4d7e907cSAndroid Build Coastguard Worker     }
249*4d7e907cSAndroid Build Coastguard Worker 
setCipherAlgorithm(const hidl_vec<uint8_t> & sessionId,const hidl_string & algorithm)250*4d7e907cSAndroid Build Coastguard Worker     Return<Status> DrmPlugin::setCipherAlgorithm(
251*4d7e907cSAndroid Build Coastguard Worker             const hidl_vec<uint8_t>& sessionId, const hidl_string& algorithm) {
252*4d7e907cSAndroid Build Coastguard Worker         status_t legacyStatus =
253*4d7e907cSAndroid Build Coastguard Worker             mLegacyPlugin->setCipherAlgorithm(toVector(sessionId),
254*4d7e907cSAndroid Build Coastguard Worker                 String8(algorithm.c_str()));
255*4d7e907cSAndroid Build Coastguard Worker         return toStatus(legacyStatus);
256*4d7e907cSAndroid Build Coastguard Worker     }
257*4d7e907cSAndroid Build Coastguard Worker 
setMacAlgorithm(const hidl_vec<uint8_t> & sessionId,const hidl_string & algorithm)258*4d7e907cSAndroid Build Coastguard Worker     Return<Status> DrmPlugin::setMacAlgorithm(
259*4d7e907cSAndroid Build Coastguard Worker             const hidl_vec<uint8_t>& sessionId, const hidl_string& algorithm) {
260*4d7e907cSAndroid Build Coastguard Worker         status_t legacyStatus =
261*4d7e907cSAndroid Build Coastguard Worker             mLegacyPlugin->setMacAlgorithm(toVector(sessionId),
262*4d7e907cSAndroid Build Coastguard Worker                 String8(algorithm.c_str()));
263*4d7e907cSAndroid Build Coastguard Worker         return toStatus(legacyStatus);
264*4d7e907cSAndroid Build Coastguard Worker     }
265*4d7e907cSAndroid Build Coastguard Worker 
encrypt(const hidl_vec<uint8_t> & sessionId,const hidl_vec<uint8_t> & keyId,const hidl_vec<uint8_t> & input,const hidl_vec<uint8_t> & iv,encrypt_cb _hidl_cb)266*4d7e907cSAndroid Build Coastguard Worker     Return<void> DrmPlugin::encrypt(const hidl_vec<uint8_t>& sessionId,
267*4d7e907cSAndroid Build Coastguard Worker             const hidl_vec<uint8_t>& keyId, const hidl_vec<uint8_t>& input,
268*4d7e907cSAndroid Build Coastguard Worker             const hidl_vec<uint8_t>& iv, encrypt_cb _hidl_cb) {
269*4d7e907cSAndroid Build Coastguard Worker 
270*4d7e907cSAndroid Build Coastguard Worker         Vector<uint8_t> legacyOutput;
271*4d7e907cSAndroid Build Coastguard Worker         status_t status = mLegacyPlugin->encrypt(toVector(sessionId),
272*4d7e907cSAndroid Build Coastguard Worker                 toVector(keyId), toVector(input), toVector(iv), legacyOutput);
273*4d7e907cSAndroid Build Coastguard Worker         _hidl_cb(toStatus(status), toHidlVec(legacyOutput));
274*4d7e907cSAndroid Build Coastguard Worker         return Void();
275*4d7e907cSAndroid Build Coastguard Worker     }
276*4d7e907cSAndroid Build Coastguard Worker 
decrypt(const hidl_vec<uint8_t> & sessionId,const hidl_vec<uint8_t> & keyId,const hidl_vec<uint8_t> & input,const hidl_vec<uint8_t> & iv,decrypt_cb _hidl_cb)277*4d7e907cSAndroid Build Coastguard Worker     Return<void> DrmPlugin::decrypt(const hidl_vec<uint8_t>& sessionId,
278*4d7e907cSAndroid Build Coastguard Worker             const hidl_vec<uint8_t>& keyId, const hidl_vec<uint8_t>& input,
279*4d7e907cSAndroid Build Coastguard Worker             const hidl_vec<uint8_t>& iv, decrypt_cb _hidl_cb) {
280*4d7e907cSAndroid Build Coastguard Worker 
281*4d7e907cSAndroid Build Coastguard Worker         Vector<uint8_t> legacyOutput;
282*4d7e907cSAndroid Build Coastguard Worker         status_t status = mLegacyPlugin->decrypt(toVector(sessionId),
283*4d7e907cSAndroid Build Coastguard Worker                 toVector(keyId), toVector(input), toVector(iv), legacyOutput);
284*4d7e907cSAndroid Build Coastguard Worker         _hidl_cb(toStatus(status), toHidlVec(legacyOutput));
285*4d7e907cSAndroid Build Coastguard Worker         return Void();
286*4d7e907cSAndroid Build Coastguard Worker     }
287*4d7e907cSAndroid Build Coastguard Worker 
sign(const hidl_vec<uint8_t> & sessionId,const hidl_vec<uint8_t> & keyId,const hidl_vec<uint8_t> & message,sign_cb _hidl_cb)288*4d7e907cSAndroid Build Coastguard Worker     Return<void> DrmPlugin::sign(const hidl_vec<uint8_t>& sessionId,
289*4d7e907cSAndroid Build Coastguard Worker             const hidl_vec<uint8_t>& keyId, const hidl_vec<uint8_t>& message,
290*4d7e907cSAndroid Build Coastguard Worker             sign_cb _hidl_cb) {
291*4d7e907cSAndroid Build Coastguard Worker         Vector<uint8_t> legacySignature;
292*4d7e907cSAndroid Build Coastguard Worker         status_t status = mLegacyPlugin->sign(toVector(sessionId),
293*4d7e907cSAndroid Build Coastguard Worker                 toVector(keyId), toVector(message), legacySignature);
294*4d7e907cSAndroid Build Coastguard Worker         _hidl_cb(toStatus(status), toHidlVec(legacySignature));
295*4d7e907cSAndroid Build Coastguard Worker         return Void();
296*4d7e907cSAndroid Build Coastguard Worker     }
297*4d7e907cSAndroid Build Coastguard Worker 
verify(const hidl_vec<uint8_t> & sessionId,const hidl_vec<uint8_t> & keyId,const hidl_vec<uint8_t> & message,const hidl_vec<uint8_t> & signature,verify_cb _hidl_cb)298*4d7e907cSAndroid Build Coastguard Worker     Return<void> DrmPlugin::verify(const hidl_vec<uint8_t>& sessionId,
299*4d7e907cSAndroid Build Coastguard Worker             const hidl_vec<uint8_t>& keyId, const hidl_vec<uint8_t>& message,
300*4d7e907cSAndroid Build Coastguard Worker             const hidl_vec<uint8_t>& signature, verify_cb _hidl_cb) {
301*4d7e907cSAndroid Build Coastguard Worker 
302*4d7e907cSAndroid Build Coastguard Worker         bool match;
303*4d7e907cSAndroid Build Coastguard Worker         status_t status = mLegacyPlugin->verify(toVector(sessionId),
304*4d7e907cSAndroid Build Coastguard Worker                 toVector(keyId), toVector(message), toVector(signature),
305*4d7e907cSAndroid Build Coastguard Worker                 match);
306*4d7e907cSAndroid Build Coastguard Worker         _hidl_cb(toStatus(status), match);
307*4d7e907cSAndroid Build Coastguard Worker         return Void();
308*4d7e907cSAndroid Build Coastguard Worker     }
309*4d7e907cSAndroid Build Coastguard Worker 
signRSA(const hidl_vec<uint8_t> & sessionId,const hidl_string & algorithm,const hidl_vec<uint8_t> & message,const hidl_vec<uint8_t> & wrappedKey,signRSA_cb _hidl_cb)310*4d7e907cSAndroid Build Coastguard Worker     Return<void> DrmPlugin::signRSA(const hidl_vec<uint8_t>& sessionId,
311*4d7e907cSAndroid Build Coastguard Worker             const hidl_string& algorithm, const hidl_vec<uint8_t>& message,
312*4d7e907cSAndroid Build Coastguard Worker             const hidl_vec<uint8_t>& wrappedKey, signRSA_cb _hidl_cb) {
313*4d7e907cSAndroid Build Coastguard Worker 
314*4d7e907cSAndroid Build Coastguard Worker         Vector<uint8_t> legacySignature;
315*4d7e907cSAndroid Build Coastguard Worker         status_t status = mLegacyPlugin->signRSA(toVector(sessionId),
316*4d7e907cSAndroid Build Coastguard Worker                 String8(algorithm.c_str()), toVector(message), toVector(wrappedKey),
317*4d7e907cSAndroid Build Coastguard Worker                 legacySignature);
318*4d7e907cSAndroid Build Coastguard Worker         _hidl_cb(toStatus(status), toHidlVec(legacySignature));
319*4d7e907cSAndroid Build Coastguard Worker         return Void();
320*4d7e907cSAndroid Build Coastguard Worker     }
321*4d7e907cSAndroid Build Coastguard Worker 
setListener(const sp<IDrmPluginListener> & listener)322*4d7e907cSAndroid Build Coastguard Worker     Return<void> DrmPlugin::setListener(const sp<IDrmPluginListener>& listener) {
323*4d7e907cSAndroid Build Coastguard Worker         mListener = listener;
324*4d7e907cSAndroid Build Coastguard Worker         mLegacyPlugin->setListener(listener == NULL ? NULL : this);
325*4d7e907cSAndroid Build Coastguard Worker         return Void();
326*4d7e907cSAndroid Build Coastguard Worker     }
327*4d7e907cSAndroid Build Coastguard Worker 
sendEvent(EventType eventType,const hidl_vec<uint8_t> & sessionId,const hidl_vec<uint8_t> & data)328*4d7e907cSAndroid Build Coastguard Worker     Return<void> DrmPlugin::sendEvent(EventType eventType,
329*4d7e907cSAndroid Build Coastguard Worker             const hidl_vec<uint8_t>& sessionId, const hidl_vec<uint8_t>& data) {
330*4d7e907cSAndroid Build Coastguard Worker         if (mListener != nullptr) {
331*4d7e907cSAndroid Build Coastguard Worker             mListener->sendEvent(eventType, sessionId, data);
332*4d7e907cSAndroid Build Coastguard Worker         }
333*4d7e907cSAndroid Build Coastguard Worker         return Void();
334*4d7e907cSAndroid Build Coastguard Worker     }
335*4d7e907cSAndroid Build Coastguard Worker 
sendExpirationUpdate(const hidl_vec<uint8_t> & sessionId,int64_t expiryTimeInMS)336*4d7e907cSAndroid Build Coastguard Worker     Return<void> DrmPlugin::sendExpirationUpdate(
337*4d7e907cSAndroid Build Coastguard Worker             const hidl_vec<uint8_t>& sessionId, int64_t expiryTimeInMS) {
338*4d7e907cSAndroid Build Coastguard Worker         if (mListener != nullptr) {
339*4d7e907cSAndroid Build Coastguard Worker             mListener->sendExpirationUpdate(sessionId, expiryTimeInMS);
340*4d7e907cSAndroid Build Coastguard Worker         }
341*4d7e907cSAndroid Build Coastguard Worker         return Void();
342*4d7e907cSAndroid Build Coastguard Worker     }
343*4d7e907cSAndroid Build Coastguard Worker 
sendKeysChange(const hidl_vec<uint8_t> & sessionId,const hidl_vec<KeyStatus> & keyStatusList,bool hasNewUsableKey)344*4d7e907cSAndroid Build Coastguard Worker     Return<void> DrmPlugin::sendKeysChange(const hidl_vec<uint8_t>& sessionId,
345*4d7e907cSAndroid Build Coastguard Worker             const hidl_vec<KeyStatus>& keyStatusList, bool hasNewUsableKey) {
346*4d7e907cSAndroid Build Coastguard Worker         if (mListener != nullptr) {
347*4d7e907cSAndroid Build Coastguard Worker             mListener->sendKeysChange(sessionId, keyStatusList, hasNewUsableKey);
348*4d7e907cSAndroid Build Coastguard Worker         }
349*4d7e907cSAndroid Build Coastguard Worker         return Void();
350*4d7e907cSAndroid Build Coastguard Worker     }
351*4d7e907cSAndroid Build Coastguard Worker 
352*4d7e907cSAndroid Build Coastguard Worker 
353*4d7e907cSAndroid Build Coastguard Worker     // Methods from android::DrmPluginListener
354*4d7e907cSAndroid Build Coastguard Worker 
sendEvent(android::DrmPlugin::EventType legacyEventType,int,Vector<uint8_t> const * sessionId,Vector<uint8_t> const * data)355*4d7e907cSAndroid Build Coastguard Worker     void DrmPlugin::sendEvent(android::DrmPlugin::EventType legacyEventType,
356*4d7e907cSAndroid Build Coastguard Worker             int /*unused*/, Vector<uint8_t> const *sessionId,
357*4d7e907cSAndroid Build Coastguard Worker             Vector<uint8_t> const *data) {
358*4d7e907cSAndroid Build Coastguard Worker 
359*4d7e907cSAndroid Build Coastguard Worker         EventType eventType;
360*4d7e907cSAndroid Build Coastguard Worker         bool sendEvent = true;
361*4d7e907cSAndroid Build Coastguard Worker         switch(legacyEventType) {
362*4d7e907cSAndroid Build Coastguard Worker         case android::DrmPlugin::kDrmPluginEventProvisionRequired:
363*4d7e907cSAndroid Build Coastguard Worker             eventType = EventType::PROVISION_REQUIRED;
364*4d7e907cSAndroid Build Coastguard Worker             break;
365*4d7e907cSAndroid Build Coastguard Worker         case android::DrmPlugin::kDrmPluginEventKeyNeeded:
366*4d7e907cSAndroid Build Coastguard Worker             eventType = EventType::KEY_NEEDED;
367*4d7e907cSAndroid Build Coastguard Worker             break;
368*4d7e907cSAndroid Build Coastguard Worker         case android::DrmPlugin::kDrmPluginEventKeyExpired:
369*4d7e907cSAndroid Build Coastguard Worker             eventType = EventType::KEY_EXPIRED;
370*4d7e907cSAndroid Build Coastguard Worker             break;
371*4d7e907cSAndroid Build Coastguard Worker         case android::DrmPlugin::kDrmPluginEventVendorDefined:
372*4d7e907cSAndroid Build Coastguard Worker             eventType = EventType::VENDOR_DEFINED;
373*4d7e907cSAndroid Build Coastguard Worker             break;
374*4d7e907cSAndroid Build Coastguard Worker         case android::DrmPlugin::kDrmPluginEventSessionReclaimed:
375*4d7e907cSAndroid Build Coastguard Worker             eventType = EventType::SESSION_RECLAIMED;
376*4d7e907cSAndroid Build Coastguard Worker             break;
377*4d7e907cSAndroid Build Coastguard Worker         default:
378*4d7e907cSAndroid Build Coastguard Worker             sendEvent = false;
379*4d7e907cSAndroid Build Coastguard Worker             break;
380*4d7e907cSAndroid Build Coastguard Worker         }
381*4d7e907cSAndroid Build Coastguard Worker         if (sendEvent) {
382*4d7e907cSAndroid Build Coastguard Worker             Vector<uint8_t> emptyVector;
383*4d7e907cSAndroid Build Coastguard Worker             mListener->sendEvent(eventType,
384*4d7e907cSAndroid Build Coastguard Worker                     toHidlVec(sessionId == NULL ? emptyVector: *sessionId),
385*4d7e907cSAndroid Build Coastguard Worker                     toHidlVec(data == NULL ? emptyVector: *data));
386*4d7e907cSAndroid Build Coastguard Worker         }
387*4d7e907cSAndroid Build Coastguard Worker     }
388*4d7e907cSAndroid Build Coastguard Worker 
sendExpirationUpdate(Vector<uint8_t> const * sessionId,int64_t expiryTimeInMS)389*4d7e907cSAndroid Build Coastguard Worker     void DrmPlugin::sendExpirationUpdate(Vector<uint8_t> const *sessionId,
390*4d7e907cSAndroid Build Coastguard Worker             int64_t expiryTimeInMS) {
391*4d7e907cSAndroid Build Coastguard Worker         mListener->sendExpirationUpdate(toHidlVec(*sessionId), expiryTimeInMS);
392*4d7e907cSAndroid Build Coastguard Worker     }
393*4d7e907cSAndroid Build Coastguard Worker 
sendKeysChange(Vector<uint8_t> const * sessionId,Vector<android::DrmPlugin::KeyStatus> const * legacyKeyStatusList,bool hasNewUsableKey)394*4d7e907cSAndroid Build Coastguard Worker     void DrmPlugin::sendKeysChange(Vector<uint8_t> const *sessionId,
395*4d7e907cSAndroid Build Coastguard Worker             Vector<android::DrmPlugin::KeyStatus> const *legacyKeyStatusList,
396*4d7e907cSAndroid Build Coastguard Worker             bool hasNewUsableKey) {
397*4d7e907cSAndroid Build Coastguard Worker 
398*4d7e907cSAndroid Build Coastguard Worker         Vector<KeyStatus> keyStatusVec;
399*4d7e907cSAndroid Build Coastguard Worker         for (size_t i = 0; i < legacyKeyStatusList->size(); i++) {
400*4d7e907cSAndroid Build Coastguard Worker             const android::DrmPlugin::KeyStatus &legacyKeyStatus =
401*4d7e907cSAndroid Build Coastguard Worker                 legacyKeyStatusList->itemAt(i);
402*4d7e907cSAndroid Build Coastguard Worker 
403*4d7e907cSAndroid Build Coastguard Worker             KeyStatus keyStatus;
404*4d7e907cSAndroid Build Coastguard Worker 
405*4d7e907cSAndroid Build Coastguard Worker             switch(legacyKeyStatus.mType) {
406*4d7e907cSAndroid Build Coastguard Worker             case android::DrmPlugin::kKeyStatusType_Usable:
407*4d7e907cSAndroid Build Coastguard Worker                 keyStatus.type = KeyStatusType::USABLE;
408*4d7e907cSAndroid Build Coastguard Worker                 break;
409*4d7e907cSAndroid Build Coastguard Worker             case android::DrmPlugin::kKeyStatusType_Expired:
410*4d7e907cSAndroid Build Coastguard Worker                 keyStatus.type = KeyStatusType::EXPIRED;
411*4d7e907cSAndroid Build Coastguard Worker                 break;
412*4d7e907cSAndroid Build Coastguard Worker             case android::DrmPlugin::kKeyStatusType_OutputNotAllowed:
413*4d7e907cSAndroid Build Coastguard Worker                 keyStatus.type = KeyStatusType::OUTPUTNOTALLOWED;
414*4d7e907cSAndroid Build Coastguard Worker                 break;
415*4d7e907cSAndroid Build Coastguard Worker             case android::DrmPlugin::kKeyStatusType_StatusPending:
416*4d7e907cSAndroid Build Coastguard Worker                 keyStatus.type = KeyStatusType::STATUSPENDING;
417*4d7e907cSAndroid Build Coastguard Worker                 break;
418*4d7e907cSAndroid Build Coastguard Worker             case android::DrmPlugin::kKeyStatusType_InternalError:
419*4d7e907cSAndroid Build Coastguard Worker             default:
420*4d7e907cSAndroid Build Coastguard Worker                 keyStatus.type = KeyStatusType::INTERNALERROR;
421*4d7e907cSAndroid Build Coastguard Worker                 break;
422*4d7e907cSAndroid Build Coastguard Worker             }
423*4d7e907cSAndroid Build Coastguard Worker 
424*4d7e907cSAndroid Build Coastguard Worker             keyStatus.keyId = toHidlVec(legacyKeyStatus.mKeyId);
425*4d7e907cSAndroid Build Coastguard Worker             keyStatusVec.push_back(keyStatus);
426*4d7e907cSAndroid Build Coastguard Worker         }
427*4d7e907cSAndroid Build Coastguard Worker         mListener->sendKeysChange(toHidlVec(*sessionId),
428*4d7e907cSAndroid Build Coastguard Worker                 toHidlVec(keyStatusVec), hasNewUsableKey);
429*4d7e907cSAndroid Build Coastguard Worker     }
430*4d7e907cSAndroid Build Coastguard Worker 
431*4d7e907cSAndroid Build Coastguard Worker }  // namespace implementation
432*4d7e907cSAndroid Build Coastguard Worker }  // namespace V1_0
433*4d7e907cSAndroid Build Coastguard Worker }  // namespace drm
434*4d7e907cSAndroid Build Coastguard Worker }  // namespace hardware
435*4d7e907cSAndroid Build Coastguard Worker }  // namespace android
436