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