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 "CryptoFactory.h" 19*4d7e907cSAndroid Build Coastguard Worker #include <log/log.h> 20*4d7e907cSAndroid Build Coastguard Worker #include "CryptoPlugin.h" 21*4d7e907cSAndroid Build Coastguard Worker #include "LegacyPluginPath.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 CryptoFactory()30*4d7e907cSAndroid Build Coastguard Worker CryptoFactory::CryptoFactory() : 31*4d7e907cSAndroid Build Coastguard Worker loader(getDrmPluginPath(), "createCryptoFactory") { 32*4d7e907cSAndroid Build Coastguard Worker } 33*4d7e907cSAndroid Build Coastguard Worker 34*4d7e907cSAndroid Build Coastguard Worker // Methods from ::android::hardware::drm::V1_0::ICryptoFactory follow. isCryptoSchemeSupported(const hidl_array<uint8_t,16> & uuid)35*4d7e907cSAndroid Build Coastguard Worker Return<bool> CryptoFactory::isCryptoSchemeSupported( 36*4d7e907cSAndroid Build Coastguard Worker const hidl_array<uint8_t, 16>& uuid) { 37*4d7e907cSAndroid Build Coastguard Worker for (size_t i = 0; i < loader.factoryCount(); i++) { 38*4d7e907cSAndroid Build Coastguard Worker if (loader.getFactory(i)->isCryptoSchemeSupported(uuid.data())) { 39*4d7e907cSAndroid Build Coastguard Worker return true; 40*4d7e907cSAndroid Build Coastguard Worker } 41*4d7e907cSAndroid Build Coastguard Worker } 42*4d7e907cSAndroid Build Coastguard Worker return false; 43*4d7e907cSAndroid Build Coastguard Worker } 44*4d7e907cSAndroid Build Coastguard Worker createPlugin(const hidl_array<uint8_t,16> & uuid,const hidl_vec<uint8_t> & initData,createPlugin_cb _hidl_cb)45*4d7e907cSAndroid Build Coastguard Worker Return<void> CryptoFactory::createPlugin(const hidl_array<uint8_t, 16>& uuid, 46*4d7e907cSAndroid Build Coastguard Worker const hidl_vec<uint8_t>& initData, createPlugin_cb _hidl_cb) { 47*4d7e907cSAndroid Build Coastguard Worker for (size_t i = 0; i < loader.factoryCount(); i++) { 48*4d7e907cSAndroid Build Coastguard Worker if (loader.getFactory(i)->isCryptoSchemeSupported(uuid.data())) { 49*4d7e907cSAndroid Build Coastguard Worker android::CryptoPlugin *legacyPlugin = NULL; 50*4d7e907cSAndroid Build Coastguard Worker status_t status = loader.getFactory(i)->createPlugin(uuid.data(), 51*4d7e907cSAndroid Build Coastguard Worker initData.data(), initData.size(), &legacyPlugin); 52*4d7e907cSAndroid Build Coastguard Worker CryptoPlugin *newPlugin = NULL; 53*4d7e907cSAndroid Build Coastguard Worker if (legacyPlugin == NULL) { 54*4d7e907cSAndroid Build Coastguard Worker ALOGE("Crypto legacy HAL: failed to create crypto plugin"); 55*4d7e907cSAndroid Build Coastguard Worker } else { 56*4d7e907cSAndroid Build Coastguard Worker newPlugin = new CryptoPlugin(legacyPlugin); 57*4d7e907cSAndroid Build Coastguard Worker } 58*4d7e907cSAndroid Build Coastguard Worker _hidl_cb(toStatus(status), newPlugin); 59*4d7e907cSAndroid Build Coastguard Worker return Void(); 60*4d7e907cSAndroid Build Coastguard Worker } 61*4d7e907cSAndroid Build Coastguard Worker } 62*4d7e907cSAndroid Build Coastguard Worker _hidl_cb(Status::ERROR_DRM_CANNOT_HANDLE, NULL); 63*4d7e907cSAndroid Build Coastguard Worker return Void(); 64*4d7e907cSAndroid Build Coastguard Worker } 65*4d7e907cSAndroid Build Coastguard Worker HIDL_FETCH_ICryptoFactory(const char *)66*4d7e907cSAndroid Build Coastguard Worker ICryptoFactory* HIDL_FETCH_ICryptoFactory(const char* /* name */) { 67*4d7e907cSAndroid Build Coastguard Worker return new CryptoFactory(); 68*4d7e907cSAndroid Build Coastguard Worker } 69*4d7e907cSAndroid Build Coastguard Worker 70*4d7e907cSAndroid Build Coastguard Worker } // namespace implementation 71*4d7e907cSAndroid Build Coastguard Worker } // namespace V1_0 72*4d7e907cSAndroid Build Coastguard Worker } // namespace drm 73*4d7e907cSAndroid Build Coastguard Worker } // namespace hardware 74*4d7e907cSAndroid Build Coastguard Worker } // namespace android 75