drm_hal_vendor_test.cpp revision 0ea406920af8313875866f13c9104129c08b2d76
10ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/* 20ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Copyright (C) 2017 The Android Open Source Project 30ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * 40ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Licensed under the Apache License, Version 2.0 (the "License"); 50ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * you may not use this file except in compliance with the License. 60ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * You may obtain a copy of the License at 70ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * 80ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * http://www.apache.org/licenses/LICENSE-2.0 90ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * 100ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Unless required by applicable law or agreed to in writing, software 110ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * distributed under the License is distributed on an "AS IS" BASIS, 120ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * See the License for the specific language governing permissions and 140ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * limitations under the License. 150ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 160ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 170ea406920af8313875866f13c9104129c08b2d76Jeff Tinker#define LOG_TAG "drm_hal_vendor_test@1.0" 180ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 190ea406920af8313875866f13c9104129c08b2d76Jeff Tinker#include <android-base/logging.h> 200ea406920af8313875866f13c9104129c08b2d76Jeff Tinker#include <android/hardware/drm/1.0/ICryptoFactory.h> 210ea406920af8313875866f13c9104129c08b2d76Jeff Tinker#include <android/hardware/drm/1.0/ICryptoPlugin.h> 220ea406920af8313875866f13c9104129c08b2d76Jeff Tinker#include <android/hardware/drm/1.0/IDrmFactory.h> 230ea406920af8313875866f13c9104129c08b2d76Jeff Tinker#include <android/hardware/drm/1.0/IDrmPlugin.h> 240ea406920af8313875866f13c9104129c08b2d76Jeff Tinker#include <android/hardware/drm/1.0/types.h> 250ea406920af8313875866f13c9104129c08b2d76Jeff Tinker#include <android/hidl/allocator/1.0/IAllocator.h> 260ea406920af8313875866f13c9104129c08b2d76Jeff Tinker#include <gtest/gtest.h> 270ea406920af8313875866f13c9104129c08b2d76Jeff Tinker#include <hidlmemory/mapping.h> 280ea406920af8313875866f13c9104129c08b2d76Jeff Tinker#include <memory> 290ea406920af8313875866f13c9104129c08b2d76Jeff Tinker#include <random> 300ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 310ea406920af8313875866f13c9104129c08b2d76Jeff Tinker#include "VtsHalHidlTargetTestBase.h" 320ea406920af8313875866f13c9104129c08b2d76Jeff Tinker#include "drm_hal_vendor_module_api.h" 330ea406920af8313875866f13c9104129c08b2d76Jeff Tinker#include "vendor_modules.h" 340ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 350ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hardware::drm::V1_0::BufferType; 360ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hardware::drm::V1_0::DestinationBuffer; 370ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hardware::drm::V1_0::ICryptoFactory; 380ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hardware::drm::V1_0::ICryptoPlugin; 390ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hardware::drm::V1_0::IDrmFactory; 400ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hardware::drm::V1_0::IDrmPlugin; 410ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hardware::drm::V1_0::KeyedVector; 420ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hardware::drm::V1_0::KeyValue; 430ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hardware::drm::V1_0::KeyRequestType; 440ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hardware::drm::V1_0::KeyType; 450ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hardware::drm::V1_0::Mode; 460ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hardware::drm::V1_0::Pattern; 470ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hardware::drm::V1_0::SecureStop; 480ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hardware::drm::V1_0::SecureStopId; 490ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hardware::drm::V1_0::SessionId; 500ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hardware::drm::V1_0::SharedBuffer; 510ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hardware::drm::V1_0::Status; 520ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hardware::drm::V1_0::SubSample; 530ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 540ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hardware::hidl_array; 550ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hardware::hidl_memory; 560ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hardware::hidl_string; 570ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hardware::hidl_vec; 580ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hardware::Return; 590ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hidl::allocator::V1_0::IAllocator; 600ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hidl::memory::V1_0::IMemory; 610ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::sp; 620ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 630ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing std::string; 640ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing std::unique_ptr; 650ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing std::random_device; 660ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing std::map; 670ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing std::mt19937; 680ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing std::vector; 690ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 700ea406920af8313875866f13c9104129c08b2d76Jeff Tinker#define ASSERT_OK(ret) ASSERT_TRUE(ret.isOk()) 710ea406920af8313875866f13c9104129c08b2d76Jeff Tinker#define EXPECT_OK(ret) EXPECT_TRUE(ret.isOk()) 720ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 730ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerstatic const uint8_t kInvalidUUID[16] = { 740ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80, 750ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80, 760ea406920af8313875866f13c9104129c08b2d76Jeff Tinker}; 770ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 780ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerstatic drm_vts::VendorModules* gVendorModules = nullptr; 790ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 800ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerclass DrmHalVendorFactoryTest : public testing::TestWithParam<std::string> { 810ea406920af8313875866f13c9104129c08b2d76Jeff Tinker public: 820ea406920af8313875866f13c9104129c08b2d76Jeff Tinker DrmHalVendorFactoryTest() 830ea406920af8313875866f13c9104129c08b2d76Jeff Tinker : vendorModule(gVendorModules ? static_cast<DrmHalVTSVendorModule_V1*>( 840ea406920af8313875866f13c9104129c08b2d76Jeff Tinker gVendorModules->getVendorModule( 850ea406920af8313875866f13c9104129c08b2d76Jeff Tinker GetParam())) 860ea406920af8313875866f13c9104129c08b2d76Jeff Tinker : nullptr) {} 870ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 880ea406920af8313875866f13c9104129c08b2d76Jeff Tinker virtual ~DrmHalVendorFactoryTest() {} 890ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 900ea406920af8313875866f13c9104129c08b2d76Jeff Tinker virtual void SetUp() { 910ea406920af8313875866f13c9104129c08b2d76Jeff Tinker const ::testing::TestInfo* const test_info = 920ea406920af8313875866f13c9104129c08b2d76Jeff Tinker ::testing::UnitTest::GetInstance()->current_test_info(); 930ea406920af8313875866f13c9104129c08b2d76Jeff Tinker ALOGD("Running test %s.%s from vendor module %s", 940ea406920af8313875866f13c9104129c08b2d76Jeff Tinker test_info->test_case_name(), test_info->name(), 950ea406920af8313875866f13c9104129c08b2d76Jeff Tinker GetParam().c_str()); 960ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 970ea406920af8313875866f13c9104129c08b2d76Jeff Tinker ASSERT_NE(vendorModule, nullptr); 980ea406920af8313875866f13c9104129c08b2d76Jeff Tinker string name = vendorModule->getServiceName(); 990ea406920af8313875866f13c9104129c08b2d76Jeff Tinker drmFactory = 1000ea406920af8313875866f13c9104129c08b2d76Jeff Tinker ::testing::VtsHalHidlTargetTestBase::getService<IDrmFactory>( 1010ea406920af8313875866f13c9104129c08b2d76Jeff Tinker name != "default" ? name : "drm"); 1020ea406920af8313875866f13c9104129c08b2d76Jeff Tinker ASSERT_NE(drmFactory, nullptr); 1030ea406920af8313875866f13c9104129c08b2d76Jeff Tinker cryptoFactory = 1040ea406920af8313875866f13c9104129c08b2d76Jeff Tinker ::testing::VtsHalHidlTargetTestBase::getService<ICryptoFactory>( 1050ea406920af8313875866f13c9104129c08b2d76Jeff Tinker name != "default" ? name : "crypto"); 1060ea406920af8313875866f13c9104129c08b2d76Jeff Tinker ASSERT_NE(cryptoFactory, nullptr); 1070ea406920af8313875866f13c9104129c08b2d76Jeff Tinker } 1080ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 1090ea406920af8313875866f13c9104129c08b2d76Jeff Tinker virtual void TearDown() override {} 1100ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 1110ea406920af8313875866f13c9104129c08b2d76Jeff Tinker protected: 1120ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_array<uint8_t, 16> getVendorUUID() { 1130ea406920af8313875866f13c9104129c08b2d76Jeff Tinker vector<uint8_t> uuid = vendorModule->getUUID(); 1140ea406920af8313875866f13c9104129c08b2d76Jeff Tinker return hidl_array<uint8_t, 16>(&uuid[0]); 1150ea406920af8313875866f13c9104129c08b2d76Jeff Tinker } 1160ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 1170ea406920af8313875866f13c9104129c08b2d76Jeff Tinker sp<IDrmFactory> drmFactory; 1180ea406920af8313875866f13c9104129c08b2d76Jeff Tinker sp<ICryptoFactory> cryptoFactory; 1190ea406920af8313875866f13c9104129c08b2d76Jeff Tinker unique_ptr<DrmHalVTSVendorModule_V1> vendorModule; 1200ea406920af8313875866f13c9104129c08b2d76Jeff Tinker}; 1210ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 1220ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 1230ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Ensure the factory supports its scheme UUID 1240ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 1250ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorFactoryTest, VendorPluginSupported) { 1260ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_TRUE(drmFactory->isCryptoSchemeSupported(getVendorUUID())); 1270ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_TRUE(cryptoFactory->isCryptoSchemeSupported(getVendorUUID())); 1280ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 1290ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 1300ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 1310ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Ensure the factory doesn't support an invalid scheme UUID 1320ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 1330ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorFactoryTest, InvalidPluginNotSupported) { 1340ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_FALSE(drmFactory->isCryptoSchemeSupported(kInvalidUUID)); 1350ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_FALSE(cryptoFactory->isCryptoSchemeSupported(kInvalidUUID)); 1360ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 1370ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 1380ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 1390ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Ensure vendor drm plugin can be created 1400ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 1410ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorFactoryTest, CreateVendorDrmPlugin) { 1420ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_string packageName("android.hardware.drm.test"); 1430ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmFactory->createPlugin( 1440ea406920af8313875866f13c9104129c08b2d76Jeff Tinker getVendorUUID(), packageName, 1450ea406920af8313875866f13c9104129c08b2d76Jeff Tinker [&](Status status, const sp<IDrmPlugin>& plugin) { 1460ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::OK, status); 1470ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_NE(plugin, nullptr); 1480ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 1490ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 1500ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 1510ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 1520ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 1530ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Ensure vendor crypto plugin can be created 1540ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 1550ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorFactoryTest, CreateVendorCryptoPlugin) { 1560ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_vec<uint8_t> initVec; 1570ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = cryptoFactory->createPlugin( 1580ea406920af8313875866f13c9104129c08b2d76Jeff Tinker getVendorUUID(), initVec, 1590ea406920af8313875866f13c9104129c08b2d76Jeff Tinker [&](Status status, const sp<ICryptoPlugin>& plugin) { 1600ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::OK, status); 1610ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_NE(plugin, nullptr); 1620ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 1630ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 1640ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 1650ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 1660ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 1670ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Ensure invalid drm plugin can't be created 1680ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 1690ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorFactoryTest, CreateInvalidDrmPlugin) { 1700ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_string packageName("android.hardware.drm.test"); 1710ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmFactory->createPlugin( 1720ea406920af8313875866f13c9104129c08b2d76Jeff Tinker kInvalidUUID, packageName, 1730ea406920af8313875866f13c9104129c08b2d76Jeff Tinker [&](Status status, const sp<IDrmPlugin>& plugin) { 1740ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::ERROR_DRM_CANNOT_HANDLE, status); 1750ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(plugin, nullptr); 1760ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 1770ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 1780ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 1790ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 1800ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 1810ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Ensure invalid crypto plugin can't be created 1820ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 1830ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorFactoryTest, CreateInvalidCryptoPlugin) { 1840ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_vec<uint8_t> initVec; 1850ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = cryptoFactory->createPlugin( 1860ea406920af8313875866f13c9104129c08b2d76Jeff Tinker kInvalidUUID, initVec, 1870ea406920af8313875866f13c9104129c08b2d76Jeff Tinker [&](Status status, const sp<ICryptoPlugin>& plugin) { 1880ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::ERROR_DRM_CANNOT_HANDLE, status); 1890ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(plugin, nullptr); 1900ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 1910ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 1920ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 1930ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 1940ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerclass DrmHalVendorPluginTest : public DrmHalVendorFactoryTest { 1950ea406920af8313875866f13c9104129c08b2d76Jeff Tinker public: 1960ea406920af8313875866f13c9104129c08b2d76Jeff Tinker virtual ~DrmHalVendorPluginTest() {} 1970ea406920af8313875866f13c9104129c08b2d76Jeff Tinker virtual void SetUp() override { 1980ea406920af8313875866f13c9104129c08b2d76Jeff Tinker // Create factories 1990ea406920af8313875866f13c9104129c08b2d76Jeff Tinker DrmHalVendorFactoryTest::SetUp(); 2000ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 2010ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_string packageName("android.hardware.drm.test"); 2020ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmFactory->createPlugin( 2030ea406920af8313875866f13c9104129c08b2d76Jeff Tinker getVendorUUID(), packageName, 2040ea406920af8313875866f13c9104129c08b2d76Jeff Tinker [this](Status status, const sp<IDrmPlugin>& plugin) { 2050ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::OK, status); 2060ea406920af8313875866f13c9104129c08b2d76Jeff Tinker ASSERT_NE(plugin, nullptr); 2070ea406920af8313875866f13c9104129c08b2d76Jeff Tinker drmPlugin = plugin; 2080ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 2090ea406920af8313875866f13c9104129c08b2d76Jeff Tinker ASSERT_OK(res); 2100ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 2110ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_vec<uint8_t> initVec; 2120ea406920af8313875866f13c9104129c08b2d76Jeff Tinker res = cryptoFactory->createPlugin( 2130ea406920af8313875866f13c9104129c08b2d76Jeff Tinker getVendorUUID(), initVec, 2140ea406920af8313875866f13c9104129c08b2d76Jeff Tinker [this](Status status, const sp<ICryptoPlugin>& plugin) { 2150ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::OK, status); 2160ea406920af8313875866f13c9104129c08b2d76Jeff Tinker ASSERT_NE(plugin, nullptr); 2170ea406920af8313875866f13c9104129c08b2d76Jeff Tinker cryptoPlugin = plugin; 2180ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 2190ea406920af8313875866f13c9104129c08b2d76Jeff Tinker ASSERT_OK(res); 2200ea406920af8313875866f13c9104129c08b2d76Jeff Tinker } 2210ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 2220ea406920af8313875866f13c9104129c08b2d76Jeff Tinker virtual void TearDown() override {} 2230ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 2240ea406920af8313875866f13c9104129c08b2d76Jeff Tinker SessionId openSession(); 2250ea406920af8313875866f13c9104129c08b2d76Jeff Tinker void closeSession(const SessionId& sessionId); 2260ea406920af8313875866f13c9104129c08b2d76Jeff Tinker sp<IMemory> getDecryptMemory(size_t size, size_t index); 2270ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 2280ea406920af8313875866f13c9104129c08b2d76Jeff Tinker protected: 2290ea406920af8313875866f13c9104129c08b2d76Jeff Tinker sp<IDrmPlugin> drmPlugin; 2300ea406920af8313875866f13c9104129c08b2d76Jeff Tinker sp<ICryptoPlugin> cryptoPlugin; 2310ea406920af8313875866f13c9104129c08b2d76Jeff Tinker}; 2320ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 2330ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 2340ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * DrmPlugin tests 2350ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 2360ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 2370ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 2380ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Test that a DRM plugin can handle provisioning. While 2390ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * it is not required that a DRM scheme require provisioning, 2400ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * it should at least return appropriate status values. If 2410ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * a provisioning request is returned, it is passed to the 2420ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * vendor module which should provide a provisioning response 2430ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * that is delivered back to the HAL. 2440ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 2450ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 2460ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, DoProvisioning) { 2470ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_string certificateType; 2480ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_string certificateAuthority; 2490ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_vec<uint8_t> provisionRequest; 2500ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_string defaultUrl; 2510ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmPlugin->getProvisionRequest( 2520ea406920af8313875866f13c9104129c08b2d76Jeff Tinker certificateType, certificateAuthority, 2530ea406920af8313875866f13c9104129c08b2d76Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& request, 2540ea406920af8313875866f13c9104129c08b2d76Jeff Tinker const hidl_string& url) { 2550ea406920af8313875866f13c9104129c08b2d76Jeff Tinker if (status == Status::OK) { 2560ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_NE(request.size(), 0u); 2570ea406920af8313875866f13c9104129c08b2d76Jeff Tinker provisionRequest = request; 2580ea406920af8313875866f13c9104129c08b2d76Jeff Tinker defaultUrl = url; 2590ea406920af8313875866f13c9104129c08b2d76Jeff Tinker } else if (status == Status::ERROR_DRM_CANNOT_HANDLE) { 2600ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(0u, request.size()); 2610ea406920af8313875866f13c9104129c08b2d76Jeff Tinker } 2620ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 2630ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 2640ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 2650ea406920af8313875866f13c9104129c08b2d76Jeff Tinker if (provisionRequest.size() > 0) { 2660ea406920af8313875866f13c9104129c08b2d76Jeff Tinker vector<uint8_t> response = vendorModule->handleProvisioningRequest( 2670ea406920af8313875866f13c9104129c08b2d76Jeff Tinker provisionRequest, defaultUrl); 2680ea406920af8313875866f13c9104129c08b2d76Jeff Tinker ASSERT_NE(0u, response.size()); 2690ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 2700ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmPlugin->provideProvisionResponse( 2710ea406920af8313875866f13c9104129c08b2d76Jeff Tinker response, [&](Status status, const hidl_vec<uint8_t>&, 2720ea406920af8313875866f13c9104129c08b2d76Jeff Tinker const hidl_vec<uint8_t>&) { 2730ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::OK, status); 2740ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 2750ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 2760ea406920af8313875866f13c9104129c08b2d76Jeff Tinker } 2770ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 2780ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 2790ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 2800ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * The DRM HAL should return BAD_VALUE if an empty provisioning 2810ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * response is provided. 2820ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 2830ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, ProvideEmptyProvisionResponse) { 2840ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_vec<uint8_t> response; 2850ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmPlugin->provideProvisionResponse( 2860ea406920af8313875866f13c9104129c08b2d76Jeff Tinker response, [&](Status status, const hidl_vec<uint8_t>&, 2870ea406920af8313875866f13c9104129c08b2d76Jeff Tinker const hidl_vec<uint8_t>&) { 2880ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::BAD_VALUE, status); 2890ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 2900ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 2910ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 2920ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 2930ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 2940ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Helper method to open a session and verify that a non-empty 2950ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * session ID is returned 2960ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 2970ea406920af8313875866f13c9104129c08b2d76Jeff TinkerSessionId DrmHalVendorPluginTest::openSession() { 2980ea406920af8313875866f13c9104129c08b2d76Jeff Tinker SessionId sessionId; 2990ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 3000ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmPlugin->openSession([&](Status status, const SessionId& id) { 3010ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::OK, status); 3020ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_NE(id.size(), 0u); 3030ea406920af8313875866f13c9104129c08b2d76Jeff Tinker sessionId = id; 3040ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 3050ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 3060ea406920af8313875866f13c9104129c08b2d76Jeff Tinker return sessionId; 3070ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 3080ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 3090ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 3100ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Helper method to close a session 3110ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 3120ea406920af8313875866f13c9104129c08b2d76Jeff Tinkervoid DrmHalVendorPluginTest::closeSession(const SessionId& sessionId) { 3130ea406920af8313875866f13c9104129c08b2d76Jeff Tinker Status status = drmPlugin->closeSession(sessionId); 3140ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::OK, status); 3150ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 3160ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 3170ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 3180ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Test that a session can be opened and closed 3190ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 3200ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, OpenCloseSession) { 3210ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto sessionId = openSession(); 3220ea406920af8313875866f13c9104129c08b2d76Jeff Tinker closeSession(sessionId); 3230ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 3240ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 3250ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 3260ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Test that attempting to close an invalid (empty) sessionId 3270ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * is prohibited with the documented error code. 3280ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 3290ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, CloseInvalidSession) { 3300ea406920af8313875866f13c9104129c08b2d76Jeff Tinker SessionId invalidSessionId; 3310ea406920af8313875866f13c9104129c08b2d76Jeff Tinker Status status = drmPlugin->closeSession(invalidSessionId); 3320ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::BAD_VALUE, status); 3330ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 3340ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 3350ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 3360ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Test that attempting to close a valid session twice 3370ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * is prohibited with the documented error code. 3380ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 3390ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, CloseClosedSession) { 3400ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto sessionId = openSession(); 3410ea406920af8313875866f13c9104129c08b2d76Jeff Tinker closeSession(sessionId); 3420ea406920af8313875866f13c9104129c08b2d76Jeff Tinker Status status = drmPlugin->closeSession(sessionId); 3430ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::ERROR_DRM_SESSION_NOT_OPENED, status); 3440ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 3450ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 3460ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 3470ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * A get key request should fail if no sessionId is provided 3480ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 3490ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, GetKeyRequestNoSession) { 3500ea406920af8313875866f13c9104129c08b2d76Jeff Tinker SessionId invalidSessionId; 3510ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_vec<uint8_t> initData; 3520ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_string mimeType = "video/mp4"; 3530ea406920af8313875866f13c9104129c08b2d76Jeff Tinker KeyedVector optionalParameters; 3540ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmPlugin->getKeyRequest( 3550ea406920af8313875866f13c9104129c08b2d76Jeff Tinker invalidSessionId, initData, mimeType, KeyType::STREAMING, 3560ea406920af8313875866f13c9104129c08b2d76Jeff Tinker optionalParameters, 3570ea406920af8313875866f13c9104129c08b2d76Jeff Tinker [&](Status status, const hidl_vec<uint8_t>&, KeyRequestType, 3580ea406920af8313875866f13c9104129c08b2d76Jeff Tinker const hidl_string&) { EXPECT_EQ(Status::BAD_VALUE, status); }); 3590ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 3600ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 3610ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 3620ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 3630ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Test that an empty sessionID returns BAD_VALUE 3640ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 3650ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, ProvideKeyResponseEmptySessionId) { 3660ea406920af8313875866f13c9104129c08b2d76Jeff Tinker SessionId session; 3670ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 3680ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_vec<uint8_t> keyResponse = {0x7b, 0x22, 0x6b, 0x65, 3690ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 0x79, 0x73, 0x22, 0x3a}; 3700ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmPlugin->provideKeyResponse( 3710ea406920af8313875866f13c9104129c08b2d76Jeff Tinker session, keyResponse, 3720ea406920af8313875866f13c9104129c08b2d76Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& keySetId) { 3730ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::BAD_VALUE, status); 3740ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(keySetId.size(), 0u); 3750ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 3760ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 3770ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 3780ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 3790ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 3800ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Test that an empty key response returns BAD_VALUE 3810ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 3820ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, ProvideKeyResponseEmptyResponse) { 3830ea406920af8313875866f13c9104129c08b2d76Jeff Tinker SessionId session = openSession(); 3840ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_vec<uint8_t> emptyResponse; 3850ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmPlugin->provideKeyResponse( 3860ea406920af8313875866f13c9104129c08b2d76Jeff Tinker session, emptyResponse, 3870ea406920af8313875866f13c9104129c08b2d76Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& keySetId) { 3880ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::BAD_VALUE, status); 3890ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(keySetId.size(), 0u); 3900ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 3910ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 3920ea406920af8313875866f13c9104129c08b2d76Jeff Tinker closeSession(session); 3930ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 3940ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 3950ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 3960ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Test that the plugin either doesn't support getting 3970ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * secure stops, or has no secure stops available after 3980ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * clearing them. 3990ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 4000ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, GetSecureStops) { 4010ea406920af8313875866f13c9104129c08b2d76Jeff Tinker // There may be secure stops, depending on if there were keys 4020ea406920af8313875866f13c9104129c08b2d76Jeff Tinker // loaded and unloaded previously. Clear them to get to a known 4030ea406920af8313875866f13c9104129c08b2d76Jeff Tinker // state, then make sure there are none. 4040ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmPlugin->getSecureStops( 4050ea406920af8313875866f13c9104129c08b2d76Jeff Tinker [&](Status status, const hidl_vec<SecureStop>&) { 4060ea406920af8313875866f13c9104129c08b2d76Jeff Tinker if (status != Status::OK) { 4070ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::ERROR_DRM_CANNOT_HANDLE, status); 4080ea406920af8313875866f13c9104129c08b2d76Jeff Tinker } 4090ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 4100ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 4110ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 4120ea406920af8313875866f13c9104129c08b2d76Jeff Tinker res = drmPlugin->getSecureStops( 4130ea406920af8313875866f13c9104129c08b2d76Jeff Tinker [&](Status status, const hidl_vec<SecureStop>& secureStops) { 4140ea406920af8313875866f13c9104129c08b2d76Jeff Tinker if (status == Status::OK) { 4150ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(secureStops.size(), 0u); 4160ea406920af8313875866f13c9104129c08b2d76Jeff Tinker } else { 4170ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::ERROR_DRM_CANNOT_HANDLE, status); 4180ea406920af8313875866f13c9104129c08b2d76Jeff Tinker } 4190ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 4200ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 4210ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 4220ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 4230ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 4240ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Test that the clearkey plugin returns BAD_VALUE if 4250ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * an empty ssid is provided. 4260ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 4270ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, GetSecureStopEmptySSID) { 4280ea406920af8313875866f13c9104129c08b2d76Jeff Tinker SecureStopId ssid; 4290ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmPlugin->getSecureStop( 4300ea406920af8313875866f13c9104129c08b2d76Jeff Tinker ssid, [&](Status status, const SecureStop&) { 4310ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::BAD_VALUE, status); 4320ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 4330ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 4340ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 4350ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 4360ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 4370ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Test that releasing all secure stops either isn't supported 4380ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * or is completed successfully 4390ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 4400ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, ReleaseAllSecureStops) { 4410ea406920af8313875866f13c9104129c08b2d76Jeff Tinker Status status = drmPlugin->releaseAllSecureStops(); 4420ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_TRUE(status == Status::OK || 4430ea406920af8313875866f13c9104129c08b2d76Jeff Tinker status == Status::ERROR_DRM_CANNOT_HANDLE); 4440ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 4450ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 4460ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 4470ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Releasing a secure stop without first getting one and sending it to the 4480ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * server to get a valid SSID should return ERROR_DRM_INVALID_STATE. 4490ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * This is an optional API so it can also return CANNOT_HANDLE. 4500ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 4510ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, ReleaseSecureStopSequenceError) { 4520ea406920af8313875866f13c9104129c08b2d76Jeff Tinker SecureStopId ssid = {1, 2, 3, 4}; 4530ea406920af8313875866f13c9104129c08b2d76Jeff Tinker Status status = drmPlugin->releaseSecureStop(ssid); 4540ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_TRUE(status == Status::ERROR_DRM_INVALID_STATE || 4550ea406920af8313875866f13c9104129c08b2d76Jeff Tinker status == Status::ERROR_DRM_CANNOT_HANDLE); 4560ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 4570ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 4580ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 4590ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Test that releasing a specific secure stop with an empty ssid 4600ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * return BAD_VALUE. This is an optional API so it can also return 4610ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * CANNOT_HANDLE. 4620ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 4630ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, ReleaseSecureStopEmptySSID) { 4640ea406920af8313875866f13c9104129c08b2d76Jeff Tinker SecureStopId ssid; 4650ea406920af8313875866f13c9104129c08b2d76Jeff Tinker Status status = drmPlugin->releaseSecureStop(ssid); 4660ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_TRUE(status == Status::BAD_VALUE || 4670ea406920af8313875866f13c9104129c08b2d76Jeff Tinker status == Status::ERROR_DRM_CANNOT_HANDLE); 4680ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 4690ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 4700ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 4710ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * The following five tests verify that the properties 4720ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * defined in the MediaDrm API are supported by 4730ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * the plugin. 4740ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 4750ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, GetVendorProperty) { 4760ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmPlugin->getPropertyString( 4770ea406920af8313875866f13c9104129c08b2d76Jeff Tinker "vendor", [&](Status status, const hidl_string& value) { 4780ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::OK, status); 4790ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_NE(value.size(), 0u); 4800ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 4810ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 4820ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 4830ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 4840ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, GetVersionProperty) { 4850ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmPlugin->getPropertyString( 4860ea406920af8313875866f13c9104129c08b2d76Jeff Tinker "version", [&](Status status, const hidl_string& value) { 4870ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::OK, status); 4880ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_NE(value.size(), 0u); 4890ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 4900ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 4910ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 4920ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 4930ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, GetDescriptionProperty) { 4940ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmPlugin->getPropertyString( 4950ea406920af8313875866f13c9104129c08b2d76Jeff Tinker "description", [&](Status status, const hidl_string& value) { 4960ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::OK, status); 4970ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_NE(value.size(), 0u); 4980ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 4990ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 5000ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 5010ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 5020ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, GetAlgorithmsProperty) { 5030ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmPlugin->getPropertyString( 5040ea406920af8313875866f13c9104129c08b2d76Jeff Tinker "algorithms", [&](Status status, const hidl_string& value) { 5050ea406920af8313875866f13c9104129c08b2d76Jeff Tinker if (status == Status::OK) { 5060ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_NE(value.size(), 0u); 5070ea406920af8313875866f13c9104129c08b2d76Jeff Tinker } else { 5080ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::ERROR_DRM_CANNOT_HANDLE, status); 5090ea406920af8313875866f13c9104129c08b2d76Jeff Tinker } 5100ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 5110ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 5120ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 5130ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 5140ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, GetPropertyUniqueDeviceID) { 5150ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmPlugin->getPropertyByteArray( 5160ea406920af8313875866f13c9104129c08b2d76Jeff Tinker "deviceUniqueId", 5170ea406920af8313875866f13c9104129c08b2d76Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& value) { 5180ea406920af8313875866f13c9104129c08b2d76Jeff Tinker if (status == Status::OK) { 5190ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_NE(value.size(), 0u); 5200ea406920af8313875866f13c9104129c08b2d76Jeff Tinker } else { 5210ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::ERROR_DRM_CANNOT_HANDLE, status); 5220ea406920af8313875866f13c9104129c08b2d76Jeff Tinker } 5230ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 5240ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 5250ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 5260ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 5270ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 5280ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Test that attempting to read invalid string and byte array 5290ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * properties returns the documented error code. 5300ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 5310ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, GetInvalidStringProperty) { 5320ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmPlugin->getPropertyString( 5330ea406920af8313875866f13c9104129c08b2d76Jeff Tinker "invalid", [&](Status status, const hidl_string&) { 5340ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::ERROR_DRM_CANNOT_HANDLE, status); 5350ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 5360ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 5370ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 5380ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 5390ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, GetInvalidByteArrayProperty) { 5400ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmPlugin->getPropertyByteArray( 5410ea406920af8313875866f13c9104129c08b2d76Jeff Tinker "invalid", [&](Status status, const hidl_vec<uint8_t>&) { 5420ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::ERROR_DRM_CANNOT_HANDLE, status); 5430ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 5440ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 5450ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 5460ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 5470ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 5480ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Test that setting invalid string and byte array properties returns 5490ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * the expected status value. 5500ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 5510ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, SetStringPropertyNotSupported) { 5520ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(drmPlugin->setPropertyString("awefijaeflijwef", "value"), 5530ea406920af8313875866f13c9104129c08b2d76Jeff Tinker Status::ERROR_DRM_CANNOT_HANDLE); 5540ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 5550ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 5560ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, SetByteArrayPropertyNotSupported) { 5570ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_vec<uint8_t> value; 5580ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(drmPlugin->setPropertyByteArray("awefijaeflijwef", value), 5590ea406920af8313875866f13c9104129c08b2d76Jeff Tinker Status::ERROR_DRM_CANNOT_HANDLE); 5600ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 5610ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 5620ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 5630ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Test that setting an invalid cipher algorithm returns 5640ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * the expected status value. 5650ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 5660ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, SetCipherInvalidAlgorithm) { 5670ea406920af8313875866f13c9104129c08b2d76Jeff Tinker SessionId session = openSession(); 5680ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_string algorithm; 5690ea406920af8313875866f13c9104129c08b2d76Jeff Tinker Status status = drmPlugin->setCipherAlgorithm(session, algorithm); 5700ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::BAD_VALUE, status); 5710ea406920af8313875866f13c9104129c08b2d76Jeff Tinker closeSession(session); 5720ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 5730ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 5740ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 5750ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Test that setting a cipher algorithm with no session returns 5760ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * the expected status value. 5770ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 5780ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, SetCipherAlgorithmNoSession) { 5790ea406920af8313875866f13c9104129c08b2d76Jeff Tinker SessionId session; 5800ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_string algorithm = "AES/CBC/NoPadding"; 5810ea406920af8313875866f13c9104129c08b2d76Jeff Tinker Status status = drmPlugin->setCipherAlgorithm(session, algorithm); 5820ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::BAD_VALUE, status); 5830ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 5840ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 5850ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 5860ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Test that setting a valid cipher algorithm returns 5870ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * the expected status value. It is not required that all 5880ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * vendor modules support this algorithm, but they must 5890ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * either accept it or return ERROR_DRM_CANNOT_HANDLE 5900ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 5910ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, SetCipherAlgorithm) { 5920ea406920af8313875866f13c9104129c08b2d76Jeff Tinker SessionId session = openSession(); 5930ea406920af8313875866f13c9104129c08b2d76Jeff Tinker ; 5940ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_string algorithm = "AES/CBC/NoPadding"; 5950ea406920af8313875866f13c9104129c08b2d76Jeff Tinker Status status = drmPlugin->setCipherAlgorithm(session, algorithm); 5960ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_TRUE(status == Status::OK || 5970ea406920af8313875866f13c9104129c08b2d76Jeff Tinker status == Status::ERROR_DRM_CANNOT_HANDLE); 5980ea406920af8313875866f13c9104129c08b2d76Jeff Tinker closeSession(session); 5990ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 6000ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 6010ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 6020ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Test that setting an invalid mac algorithm returns 6030ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * the expected status value. 6040ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 6050ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, SetMacInvalidAlgorithm) { 6060ea406920af8313875866f13c9104129c08b2d76Jeff Tinker SessionId session = openSession(); 6070ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_string algorithm; 6080ea406920af8313875866f13c9104129c08b2d76Jeff Tinker Status status = drmPlugin->setMacAlgorithm(session, algorithm); 6090ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::BAD_VALUE, status); 6100ea406920af8313875866f13c9104129c08b2d76Jeff Tinker closeSession(session); 6110ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 6120ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 6130ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 6140ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Test that setting a mac algorithm with no session returns 6150ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * the expected status value. 6160ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 6170ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, SetMacNullAlgorithmNoSession) { 6180ea406920af8313875866f13c9104129c08b2d76Jeff Tinker SessionId session; 6190ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_string algorithm = "HmacSHA256"; 6200ea406920af8313875866f13c9104129c08b2d76Jeff Tinker Status status = drmPlugin->setMacAlgorithm(session, algorithm); 6210ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::BAD_VALUE, status); 6220ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 6230ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 6240ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 6250ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Test that setting a valid mac algorithm returns 6260ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * the expected status value. It is not required that all 6270ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * vendor modules support this algorithm, but they must 6280ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * either accept it or return ERROR_DRM_CANNOT_HANDLE 6290ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 6300ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, SetMacAlgorithm) { 6310ea406920af8313875866f13c9104129c08b2d76Jeff Tinker SessionId session = openSession(); 6320ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_string algorithm = "HmacSHA256"; 6330ea406920af8313875866f13c9104129c08b2d76Jeff Tinker Status status = drmPlugin->setMacAlgorithm(session, algorithm); 6340ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_TRUE(status == Status::OK || 6350ea406920af8313875866f13c9104129c08b2d76Jeff Tinker status == Status::ERROR_DRM_CANNOT_HANDLE); 6360ea406920af8313875866f13c9104129c08b2d76Jeff Tinker closeSession(session); 6370ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 6380ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 6390ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 6400ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * The Generic* methods provide general purpose crypto operations 6410ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * that may be used for applications other than DRM. They leverage 6420ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * the hardware root of trust and secure key distribution mechanisms 6430ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * of a DRM system to enable app-specific crypto functionality where 6440ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * the crypto keys are not exposed outside of the trusted execution 6450ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * environment. 6460ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * 6470ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Generic encrypt/decrypt/sign/verify should fail on invalid 6480ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * inputs, e.g. empty sessionId 6490ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 6500ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, GenericEncryptNoSession) { 6510ea406920af8313875866f13c9104129c08b2d76Jeff Tinker SessionId session; 6520ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_vec<uint8_t> keyId, input, iv; 6530ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmPlugin->encrypt( 6540ea406920af8313875866f13c9104129c08b2d76Jeff Tinker session, keyId, input, iv, 6550ea406920af8313875866f13c9104129c08b2d76Jeff Tinker [&](Status status, const hidl_vec<uint8_t>&) { 6560ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::ERROR_DRM_SESSION_NOT_OPENED, status); 6570ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 6580ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 6590ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 6600ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 6610ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, GenericDecryptNoSession) { 6620ea406920af8313875866f13c9104129c08b2d76Jeff Tinker SessionId session; 6630ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_vec<uint8_t> keyId, input, iv; 6640ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmPlugin->decrypt( 6650ea406920af8313875866f13c9104129c08b2d76Jeff Tinker session, keyId, input, iv, 6660ea406920af8313875866f13c9104129c08b2d76Jeff Tinker [&](Status status, const hidl_vec<uint8_t>&) { 6670ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::ERROR_DRM_SESSION_NOT_OPENED, status); 6680ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 6690ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 6700ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 6710ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 6720ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, GenericSignNoSession) { 6730ea406920af8313875866f13c9104129c08b2d76Jeff Tinker SessionId session; 6740ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_vec<uint8_t> keyId, message; 6750ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmPlugin->sign( 6760ea406920af8313875866f13c9104129c08b2d76Jeff Tinker session, keyId, message, 6770ea406920af8313875866f13c9104129c08b2d76Jeff Tinker [&](Status status, const hidl_vec<uint8_t>&) { 6780ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::ERROR_DRM_SESSION_NOT_OPENED, status); 6790ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 6800ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 6810ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 6820ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 6830ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, GenericVerifyNoSession) { 6840ea406920af8313875866f13c9104129c08b2d76Jeff Tinker SessionId session; 6850ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_vec<uint8_t> keyId, message, signature; 6860ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmPlugin->verify( 6870ea406920af8313875866f13c9104129c08b2d76Jeff Tinker session, keyId, message, signature, [&](Status status, bool) { 6880ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::ERROR_DRM_SESSION_NOT_OPENED, status); 6890ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 6900ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 6910ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 6920ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 6930ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, GenericSignRSANoSession) { 6940ea406920af8313875866f13c9104129c08b2d76Jeff Tinker SessionId session; 6950ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_string algorithm; 6960ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_vec<uint8_t> message, wrappedKey; 6970ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmPlugin->signRSA(session, algorithm, message, wrappedKey, 6980ea406920af8313875866f13c9104129c08b2d76Jeff Tinker [&](Status status, const hidl_vec<uint8_t>&) { 6990ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::BAD_VALUE, status); 7000ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 7010ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 7020ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 7030ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 7040ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 7050ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Exercise the requiresSecureDecoderComponent method. Additional tests 7060ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * will verify positive cases with specific vendor content configurations. 7070ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Below we just test the negative cases. 7080ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 7090ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 7100ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 7110ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Verify that requiresSecureDecoderComponent handles empty mimetype. 7120ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 7130ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, RequiresSecureDecoderEmptyMimeType) { 7140ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_FALSE(cryptoPlugin->requiresSecureDecoderComponent("")); 7150ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 7160ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 7170ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 7180ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Verify that requiresSecureDecoderComponent handles invalid mimetype. 7190ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 7200ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, RequiresSecureDecoderInvalidMimeType) { 7210ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_FALSE(cryptoPlugin->requiresSecureDecoderComponent("bad")); 7220ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 7230ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 7240ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 7250ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * CryptoPlugin tests 7260ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 7270ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 7280ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 7290ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Exercise the NotifyResolution API. There is no observable result, 7300ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * just call the method for coverage. 7310ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 7320ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, NotifyResolution) { 7330ea406920af8313875866f13c9104129c08b2d76Jeff Tinker cryptoPlugin->notifyResolution(1920, 1080); 7340ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 7350ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 7360ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 7370ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * getDecryptMemory allocates memory for decryption, then sets it 7380ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * as a shared buffer base in the crypto hal. The allocated and 7390ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * mapped IMemory is returned. 7400ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * 7410ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * @param size the size of the memory segment to allocate 7420ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * @param the index of the memory segment which will be used 7430ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * to refer to it for decryption. 7440ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 7450ea406920af8313875866f13c9104129c08b2d76Jeff Tinkersp<IMemory> DrmHalVendorPluginTest::getDecryptMemory(size_t size, 7460ea406920af8313875866f13c9104129c08b2d76Jeff Tinker size_t index) { 7470ea406920af8313875866f13c9104129c08b2d76Jeff Tinker sp<IAllocator> ashmemAllocator = IAllocator::getService("ashmem"); 7480ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_NE(ashmemAllocator, nullptr); 7490ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 7500ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_memory hidlMemory; 7510ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = ashmemAllocator->allocate( 7520ea406920af8313875866f13c9104129c08b2d76Jeff Tinker size, [&](bool success, const hidl_memory& memory) { 7530ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(success, true); 7540ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(memory.size(), size); 7550ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidlMemory = memory; 7560ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 7570ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 7580ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 7590ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 7600ea406920af8313875866f13c9104129c08b2d76Jeff Tinker sp<IMemory> mappedMemory = mapMemory(hidlMemory); 7610ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_NE(mappedMemory, nullptr); 7620ea406920af8313875866f13c9104129c08b2d76Jeff Tinker res = cryptoPlugin->setSharedBufferBase(hidlMemory, index); 7630ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 7640ea406920af8313875866f13c9104129c08b2d76Jeff Tinker return mappedMemory; 7650ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 7660ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 7670ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 7680ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Exercise the setMediaDrmSession method. setMediaDrmSession 7690ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * is used to associate a drm session with a crypto session. 7700ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 7710ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, SetMediaDrmSession) { 7720ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto sessionId = openSession(); 7730ea406920af8313875866f13c9104129c08b2d76Jeff Tinker Status status = cryptoPlugin->setMediaDrmSession(sessionId); 7740ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::OK, status); 7750ea406920af8313875866f13c9104129c08b2d76Jeff Tinker closeSession(sessionId); 7760ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 7770ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 7780ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 7790ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * setMediaDrmSession with a closed session id 7800ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 7810ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, SetMediaDrmSessionClosedSession) { 7820ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto sessionId = openSession(); 7830ea406920af8313875866f13c9104129c08b2d76Jeff Tinker closeSession(sessionId); 7840ea406920af8313875866f13c9104129c08b2d76Jeff Tinker Status status = cryptoPlugin->setMediaDrmSession(sessionId); 7850ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::ERROR_DRM_SESSION_NOT_OPENED, status); 7860ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 7870ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 7880ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 7890ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Decrypt tests 7900ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 7910ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 7920ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerclass DrmHalVendorDecryptTest : public DrmHalVendorPluginTest { 7930ea406920af8313875866f13c9104129c08b2d76Jeff Tinker public: 7940ea406920af8313875866f13c9104129c08b2d76Jeff Tinker DrmHalVendorDecryptTest() = default; 7950ea406920af8313875866f13c9104129c08b2d76Jeff Tinker virtual ~DrmHalVendorDecryptTest() {} 7960ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 7970ea406920af8313875866f13c9104129c08b2d76Jeff Tinker protected: 7980ea406920af8313875866f13c9104129c08b2d76Jeff Tinker void loadKeys(const SessionId& sessionId, 7990ea406920af8313875866f13c9104129c08b2d76Jeff Tinker const DrmHalVTSVendorModule_V1::ContentConfiguration& 8000ea406920af8313875866f13c9104129c08b2d76Jeff Tinker configuration); 8010ea406920af8313875866f13c9104129c08b2d76Jeff Tinker void fillRandom(const sp<IMemory>& memory); 8020ea406920af8313875866f13c9104129c08b2d76Jeff Tinker KeyedVector toHidlKeyedVector(const map<string, string>& params); 8030ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_array<uint8_t, 16> toHidlArray(const vector<uint8_t>& vec) { 8040ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(vec.size(), 16u); 8050ea406920af8313875866f13c9104129c08b2d76Jeff Tinker return hidl_array<uint8_t, 16>(&vec[0]); 8060ea406920af8313875866f13c9104129c08b2d76Jeff Tinker } 8070ea406920af8313875866f13c9104129c08b2d76Jeff Tinker}; 8080ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 8090ea406920af8313875866f13c9104129c08b2d76Jeff TinkerKeyedVector DrmHalVendorDecryptTest::toHidlKeyedVector( 8100ea406920af8313875866f13c9104129c08b2d76Jeff Tinker const map<string, string>& params) { 8110ea406920af8313875866f13c9104129c08b2d76Jeff Tinker std::vector<KeyValue> stdKeyedVector; 8120ea406920af8313875866f13c9104129c08b2d76Jeff Tinker for (auto it = params.begin(); it != params.end(); ++it) { 8130ea406920af8313875866f13c9104129c08b2d76Jeff Tinker KeyValue keyValue; 8140ea406920af8313875866f13c9104129c08b2d76Jeff Tinker keyValue.key = it->first; 8150ea406920af8313875866f13c9104129c08b2d76Jeff Tinker keyValue.value = it->second; 8160ea406920af8313875866f13c9104129c08b2d76Jeff Tinker stdKeyedVector.push_back(keyValue); 8170ea406920af8313875866f13c9104129c08b2d76Jeff Tinker } 8180ea406920af8313875866f13c9104129c08b2d76Jeff Tinker return KeyedVector(stdKeyedVector); 8190ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 8200ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 8210ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 8220ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Helper method to load keys for subsequent decrypt tests. 8230ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * These tests use predetermined key request/response to 8240ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * avoid requiring a round trip to a license server. 8250ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 8260ea406920af8313875866f13c9104129c08b2d76Jeff Tinkervoid DrmHalVendorDecryptTest::loadKeys( 8270ea406920af8313875866f13c9104129c08b2d76Jeff Tinker const SessionId& sessionId, 8280ea406920af8313875866f13c9104129c08b2d76Jeff Tinker const DrmHalVTSVendorModule_V1::ContentConfiguration& configuration) { 8290ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_vec<uint8_t> keyRequest; 8300ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmPlugin->getKeyRequest( 8310ea406920af8313875866f13c9104129c08b2d76Jeff Tinker sessionId, configuration.initData, configuration.mimeType, 8320ea406920af8313875866f13c9104129c08b2d76Jeff Tinker KeyType::STREAMING, 8330ea406920af8313875866f13c9104129c08b2d76Jeff Tinker toHidlKeyedVector(configuration.optionalParameters), 8340ea406920af8313875866f13c9104129c08b2d76Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& request, 8350ea406920af8313875866f13c9104129c08b2d76Jeff Tinker KeyRequestType type, const hidl_string&) { 8360ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::OK, status) 8370ea406920af8313875866f13c9104129c08b2d76Jeff Tinker << "Failed to get " 8380ea406920af8313875866f13c9104129c08b2d76Jeff Tinker "key request for configuration " 8390ea406920af8313875866f13c9104129c08b2d76Jeff Tinker << configuration.name; 8400ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(type, KeyRequestType::INITIAL); 8410ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_NE(request.size(), 0u) << "Expected key request size" 8420ea406920af8313875866f13c9104129c08b2d76Jeff Tinker " to have length > 0 bytes"; 8430ea406920af8313875866f13c9104129c08b2d76Jeff Tinker keyRequest = request; 8440ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 8450ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 8460ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 8470ea406920af8313875866f13c9104129c08b2d76Jeff Tinker /** 8480ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Get key response from vendor module 8490ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 8500ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_vec<uint8_t> keyResponse = 8510ea406920af8313875866f13c9104129c08b2d76Jeff Tinker vendorModule->handleKeyRequest(keyRequest, configuration.serverUrl); 8520ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 8530ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_NE(keyResponse.size(), 0u) << "Expected key response size " 8540ea406920af8313875866f13c9104129c08b2d76Jeff Tinker "to have length > 0 bytes"; 8550ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 8560ea406920af8313875866f13c9104129c08b2d76Jeff Tinker res = drmPlugin->provideKeyResponse( 8570ea406920af8313875866f13c9104129c08b2d76Jeff Tinker sessionId, keyResponse, 8580ea406920af8313875866f13c9104129c08b2d76Jeff Tinker [&](Status status, const hidl_vec<uint8_t>&) { 8590ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::OK, status) 8600ea406920af8313875866f13c9104129c08b2d76Jeff Tinker << "Failure providing " 8610ea406920af8313875866f13c9104129c08b2d76Jeff Tinker "key response for configuration " 8620ea406920af8313875866f13c9104129c08b2d76Jeff Tinker << configuration.name; 8630ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 8640ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 8650ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 8660ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 8670ea406920af8313875866f13c9104129c08b2d76Jeff Tinkervoid DrmHalVendorDecryptTest::fillRandom(const sp<IMemory>& memory) { 8680ea406920af8313875866f13c9104129c08b2d76Jeff Tinker random_device rd; 8690ea406920af8313875866f13c9104129c08b2d76Jeff Tinker mt19937 rand(rd()); 8700ea406920af8313875866f13c9104129c08b2d76Jeff Tinker for (size_t i = 0; i < memory->getSize() / sizeof(uint32_t); i++) { 8710ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto p = static_cast<uint32_t*>( 8720ea406920af8313875866f13c9104129c08b2d76Jeff Tinker static_cast<void*>(memory->getPointer())); 8730ea406920af8313875866f13c9104129c08b2d76Jeff Tinker p[i] = rand(); 8740ea406920af8313875866f13c9104129c08b2d76Jeff Tinker } 8750ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 8760ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 8770ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorDecryptTest, ValidateConfigurations) { 8780ea406920af8313875866f13c9104129c08b2d76Jeff Tinker vector<DrmHalVTSVendorModule_V1::ContentConfiguration> configurations = 8790ea406920af8313875866f13c9104129c08b2d76Jeff Tinker vendorModule->getContentConfigurations(); 8800ea406920af8313875866f13c9104129c08b2d76Jeff Tinker const char* kVendorStr = "Vendor module "; 8810ea406920af8313875866f13c9104129c08b2d76Jeff Tinker for (auto config : configurations) { 8820ea406920af8313875866f13c9104129c08b2d76Jeff Tinker ASSERT_TRUE(config.name.size() > 0) << kVendorStr << "has no name"; 8830ea406920af8313875866f13c9104129c08b2d76Jeff Tinker ASSERT_TRUE(config.serverUrl.size() > 0) << kVendorStr 8840ea406920af8313875866f13c9104129c08b2d76Jeff Tinker << "has no serverUrl"; 8850ea406920af8313875866f13c9104129c08b2d76Jeff Tinker ASSERT_TRUE(config.initData.size() > 0) << kVendorStr 8860ea406920af8313875866f13c9104129c08b2d76Jeff Tinker << "has no init data"; 8870ea406920af8313875866f13c9104129c08b2d76Jeff Tinker ASSERT_TRUE(config.mimeType.size() > 0) << kVendorStr 8880ea406920af8313875866f13c9104129c08b2d76Jeff Tinker << "has no mime type"; 8890ea406920af8313875866f13c9104129c08b2d76Jeff Tinker ASSERT_TRUE(config.keys.size() >= 1) << kVendorStr << "has no keys"; 8900ea406920af8313875866f13c9104129c08b2d76Jeff Tinker for (auto key : config.keys) { 8910ea406920af8313875866f13c9104129c08b2d76Jeff Tinker ASSERT_TRUE(key.keyId.size() > 0) << kVendorStr 8920ea406920af8313875866f13c9104129c08b2d76Jeff Tinker << " has zero length keyId"; 8930ea406920af8313875866f13c9104129c08b2d76Jeff Tinker ASSERT_TRUE(key.keyId.size() > 0) << kVendorStr 8940ea406920af8313875866f13c9104129c08b2d76Jeff Tinker << " has zero length key value"; 8950ea406920af8313875866f13c9104129c08b2d76Jeff Tinker } 8960ea406920af8313875866f13c9104129c08b2d76Jeff Tinker } 8970ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 8980ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 8990ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 9000ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Positive decrypt test. "Decrypt" a single clear 9010ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * segment. Verify data matches. 9020ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 9030ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorDecryptTest, ClearSegmentTest) { 9040ea406920af8313875866f13c9104129c08b2d76Jeff Tinker vector<DrmHalVTSVendorModule_V1::ContentConfiguration> configurations = 9050ea406920af8313875866f13c9104129c08b2d76Jeff Tinker vendorModule->getContentConfigurations(); 9060ea406920af8313875866f13c9104129c08b2d76Jeff Tinker for (auto config : configurations) { 9070ea406920af8313875866f13c9104129c08b2d76Jeff Tinker const size_t kSegmentSize = 1024; 9080ea406920af8313875866f13c9104129c08b2d76Jeff Tinker const size_t kSegmentIndex = 0; 9090ea406920af8313875866f13c9104129c08b2d76Jeff Tinker uint8_t iv[16] = {0}; 9100ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 9110ea406920af8313875866f13c9104129c08b2d76Jeff Tinker sp<IMemory> sharedMemory = 9120ea406920af8313875866f13c9104129c08b2d76Jeff Tinker getDecryptMemory(kSegmentSize * 2, kSegmentIndex); 9130ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 9140ea406920af8313875866f13c9104129c08b2d76Jeff Tinker SharedBuffer sourceBuffer = { 9150ea406920af8313875866f13c9104129c08b2d76Jeff Tinker .bufferId = kSegmentIndex, .offset = 0, .size = kSegmentSize}; 9160ea406920af8313875866f13c9104129c08b2d76Jeff Tinker fillRandom(sharedMemory); 9170ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 9180ea406920af8313875866f13c9104129c08b2d76Jeff Tinker DestinationBuffer destBuffer = {.type = BufferType::SHARED_MEMORY, 9190ea406920af8313875866f13c9104129c08b2d76Jeff Tinker {.bufferId = kSegmentIndex, 9200ea406920af8313875866f13c9104129c08b2d76Jeff Tinker .offset = kSegmentSize, 9210ea406920af8313875866f13c9104129c08b2d76Jeff Tinker .size = kSegmentSize}, 9220ea406920af8313875866f13c9104129c08b2d76Jeff Tinker .secureMemory = nullptr}; 9230ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 9240ea406920af8313875866f13c9104129c08b2d76Jeff Tinker Pattern noPattern = {0, 0}; 9250ea406920af8313875866f13c9104129c08b2d76Jeff Tinker vector<SubSample> subSamples = {{.numBytesOfClearData = kSegmentSize, 9260ea406920af8313875866f13c9104129c08b2d76Jeff Tinker .numBytesOfEncryptedData = 0}}; 9270ea406920af8313875866f13c9104129c08b2d76Jeff Tinker uint64_t offset = 0; 9280ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 9290ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto sessionId = openSession(); 9300ea406920af8313875866f13c9104129c08b2d76Jeff Tinker loadKeys(sessionId, config); 9310ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 9320ea406920af8313875866f13c9104129c08b2d76Jeff Tinker Status status = cryptoPlugin->setMediaDrmSession(sessionId); 9330ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::OK, status); 9340ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 9350ea406920af8313875866f13c9104129c08b2d76Jeff Tinker const bool kNotSecure = false; 9360ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = cryptoPlugin->decrypt( 9370ea406920af8313875866f13c9104129c08b2d76Jeff Tinker kNotSecure, toHidlArray(config.keys[0].keyId), iv, 9380ea406920af8313875866f13c9104129c08b2d76Jeff Tinker Mode::UNENCRYPTED, noPattern, subSamples, sourceBuffer, offset, 9390ea406920af8313875866f13c9104129c08b2d76Jeff Tinker destBuffer, [&](Status status, uint32_t bytesWritten, 9400ea406920af8313875866f13c9104129c08b2d76Jeff Tinker string detailedError) { 9410ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::OK, status) << "Failure in decryption " 9420ea406920af8313875866f13c9104129c08b2d76Jeff Tinker "for configuration " 9430ea406920af8313875866f13c9104129c08b2d76Jeff Tinker << config.name << ": " 9440ea406920af8313875866f13c9104129c08b2d76Jeff Tinker << detailedError; 9450ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(bytesWritten, kSegmentSize); 9460ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 9470ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 9480ea406920af8313875866f13c9104129c08b2d76Jeff Tinker uint8_t* base = static_cast<uint8_t*>( 9490ea406920af8313875866f13c9104129c08b2d76Jeff Tinker static_cast<void*>(sharedMemory->getPointer())); 9500ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 9510ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(0, 9520ea406920af8313875866f13c9104129c08b2d76Jeff Tinker memcmp(static_cast<void*>(base), 9530ea406920af8313875866f13c9104129c08b2d76Jeff Tinker static_cast<void*>(base + kSegmentSize), kSegmentSize)) 9540ea406920af8313875866f13c9104129c08b2d76Jeff Tinker << "decrypt data mismatch"; 9550ea406920af8313875866f13c9104129c08b2d76Jeff Tinker closeSession(sessionId); 9560ea406920af8313875866f13c9104129c08b2d76Jeff Tinker } 9570ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 9580ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 9590ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 9600ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Instantiate the set of test cases for each vendor module 9610ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 9620ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 9630ea406920af8313875866f13c9104129c08b2d76Jeff TinkerINSTANTIATE_TEST_CASE_P( 9640ea406920af8313875866f13c9104129c08b2d76Jeff Tinker DrmHalVendorFactoryTestCases, DrmHalVendorFactoryTest, 9650ea406920af8313875866f13c9104129c08b2d76Jeff Tinker testing::ValuesIn(gVendorModules->getVendorModulePaths())); 9660ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 9670ea406920af8313875866f13c9104129c08b2d76Jeff TinkerINSTANTIATE_TEST_CASE_P( 9680ea406920af8313875866f13c9104129c08b2d76Jeff Tinker DrmHalVendorPluginTestCases, DrmHalVendorPluginTest, 9690ea406920af8313875866f13c9104129c08b2d76Jeff Tinker testing::ValuesIn(gVendorModules->getVendorModulePaths())); 9700ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 9710ea406920af8313875866f13c9104129c08b2d76Jeff TinkerINSTANTIATE_TEST_CASE_P( 9720ea406920af8313875866f13c9104129c08b2d76Jeff Tinker DrmHalVendorDecryptTestCases, DrmHalVendorDecryptTest, 9730ea406920af8313875866f13c9104129c08b2d76Jeff Tinker testing::ValuesIn(gVendorModules->getVendorModulePaths())); 9740ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 9750ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerint main(int argc, char** argv) { 9760ea406920af8313875866f13c9104129c08b2d76Jeff Tinker gVendorModules = 9770ea406920af8313875866f13c9104129c08b2d76Jeff Tinker new drm_vts::VendorModules("/data/nativetest/drm_hidl_test/vendor"); 9780ea406920af8313875866f13c9104129c08b2d76Jeff Tinker ::testing::InitGoogleTest(&argc, argv); 9790ea406920af8313875866f13c9104129c08b2d76Jeff Tinker return RUN_ALL_TESTS(); 9800ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 981