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> 24f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker#include <android/hardware/drm/1.0/IDrmPluginListener.h> 250ea406920af8313875866f13c9104129c08b2d76Jeff Tinker#include <android/hardware/drm/1.0/types.h> 260ea406920af8313875866f13c9104129c08b2d76Jeff Tinker#include <android/hidl/allocator/1.0/IAllocator.h> 270ea406920af8313875866f13c9104129c08b2d76Jeff Tinker#include <gtest/gtest.h> 280ea406920af8313875866f13c9104129c08b2d76Jeff Tinker#include <hidlmemory/mapping.h> 294e7a3077309d33a21b08e9380573019cc7a8cffbSteven Moreland#include <log/log.h> 30f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker#include <openssl/aes.h> 314e7a3077309d33a21b08e9380573019cc7a8cffbSteven Moreland#include <memory> 320ea406920af8313875866f13c9104129c08b2d76Jeff Tinker#include <random> 330ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 340ea406920af8313875866f13c9104129c08b2d76Jeff Tinker#include "drm_hal_vendor_module_api.h" 350ea406920af8313875866f13c9104129c08b2d76Jeff Tinker#include "vendor_modules.h" 363da372af677f8b3f6c9c2905d54e73a6c93e9b07Jeff Tinker#include <VtsHalHidlTargetCallbackBase.h> 373da372af677f8b3f6c9c2905d54e73a6c93e9b07Jeff Tinker#include <VtsHalHidlTargetTestBase.h> 380ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 390ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hardware::drm::V1_0::BufferType; 400ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hardware::drm::V1_0::DestinationBuffer; 41f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinkerusing ::android::hardware::drm::V1_0::EventType; 420ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hardware::drm::V1_0::ICryptoFactory; 430ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hardware::drm::V1_0::ICryptoPlugin; 440ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hardware::drm::V1_0::IDrmFactory; 450ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hardware::drm::V1_0::IDrmPlugin; 46f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinkerusing ::android::hardware::drm::V1_0::IDrmPluginListener; 470ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hardware::drm::V1_0::KeyedVector; 480ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hardware::drm::V1_0::KeyRequestType; 49f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinkerusing ::android::hardware::drm::V1_0::KeyStatus; 50f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinkerusing ::android::hardware::drm::V1_0::KeyStatusType; 510ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hardware::drm::V1_0::KeyType; 52f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinkerusing ::android::hardware::drm::V1_0::KeyValue; 530ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hardware::drm::V1_0::Mode; 540ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hardware::drm::V1_0::Pattern; 550ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hardware::drm::V1_0::SecureStop; 560ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hardware::drm::V1_0::SecureStopId; 570ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hardware::drm::V1_0::SessionId; 580ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hardware::drm::V1_0::SharedBuffer; 590ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hardware::drm::V1_0::Status; 600ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hardware::drm::V1_0::SubSample; 610ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 620ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hardware::hidl_array; 630ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hardware::hidl_memory; 640ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hardware::hidl_string; 650ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hardware::hidl_vec; 660ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hardware::Return; 67f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinkerusing ::android::hardware::Void; 680ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hidl::allocator::V1_0::IAllocator; 690ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hidl::memory::V1_0::IMemory; 700ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::sp; 710ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 720ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing std::string; 730ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing std::unique_ptr; 740ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing std::random_device; 750ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing std::map; 760ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing std::mt19937; 770ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing std::vector; 780ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 79f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinkerusing ContentConfiguration = ::DrmHalVTSVendorModule_V1::ContentConfiguration; 80f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinkerusing Key = ::DrmHalVTSVendorModule_V1::ContentConfiguration::Key; 81cf3916a1fd35685d0dc6867d030edee066c0d271Jeff Tinkerusing VtsTestBase = ::testing::VtsHalHidlTargetTestBase; 82f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 830ea406920af8313875866f13c9104129c08b2d76Jeff Tinker#define ASSERT_OK(ret) ASSERT_TRUE(ret.isOk()) 840ea406920af8313875866f13c9104129c08b2d76Jeff Tinker#define EXPECT_OK(ret) EXPECT_TRUE(ret.isOk()) 850ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 86be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker#define RETURN_IF_SKIPPED \ 87be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker if (!vendorModule->isInstalled()) { \ 88be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker std::cout << "[ SKIPPED ] This drm scheme not supported." << \ 89be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker " library:" << GetParam() << " service-name:" << \ 90be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker vendorModule->getServiceName() << std::endl; \ 91be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker return; \ 92be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker } 93be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker 940ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerstatic const uint8_t kInvalidUUID[16] = { 950ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80, 960ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80, 970ea406920af8313875866f13c9104129c08b2d76Jeff Tinker}; 980ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 990ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerstatic drm_vts::VendorModules* gVendorModules = nullptr; 1000ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 1010ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerclass DrmHalVendorFactoryTest : public testing::TestWithParam<std::string> { 1020ea406920af8313875866f13c9104129c08b2d76Jeff Tinker public: 1030ea406920af8313875866f13c9104129c08b2d76Jeff Tinker DrmHalVendorFactoryTest() 104f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker : vendorModule(static_cast<DrmHalVTSVendorModule_V1*>( 105f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker gVendorModules->getModule(GetParam()))), 106f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker contentConfigurations(vendorModule->getContentConfigurations()) {} 1070ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 1080ea406920af8313875866f13c9104129c08b2d76Jeff Tinker virtual ~DrmHalVendorFactoryTest() {} 1090ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 1100ea406920af8313875866f13c9104129c08b2d76Jeff Tinker virtual void SetUp() { 1110ea406920af8313875866f13c9104129c08b2d76Jeff Tinker const ::testing::TestInfo* const test_info = 1120ea406920af8313875866f13c9104129c08b2d76Jeff Tinker ::testing::UnitTest::GetInstance()->current_test_info(); 1130ea406920af8313875866f13c9104129c08b2d76Jeff Tinker ALOGD("Running test %s.%s from vendor module %s", 1140ea406920af8313875866f13c9104129c08b2d76Jeff Tinker test_info->test_case_name(), test_info->name(), 1150ea406920af8313875866f13c9104129c08b2d76Jeff Tinker GetParam().c_str()); 1160ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 1170ea406920af8313875866f13c9104129c08b2d76Jeff Tinker ASSERT_NE(vendorModule, nullptr); 118cf3916a1fd35685d0dc6867d030edee066c0d271Jeff Tinker 119cf3916a1fd35685d0dc6867d030edee066c0d271Jeff Tinker // First try the binderized service name provided by the vendor module. 120cf3916a1fd35685d0dc6867d030edee066c0d271Jeff Tinker // If that fails, which it can on non-binderized devices, try the default 121cf3916a1fd35685d0dc6867d030edee066c0d271Jeff Tinker // service. 1220ea406920af8313875866f13c9104129c08b2d76Jeff Tinker string name = vendorModule->getServiceName(); 123cf3916a1fd35685d0dc6867d030edee066c0d271Jeff Tinker drmFactory = VtsTestBase::getService<IDrmFactory>(name); 124cf3916a1fd35685d0dc6867d030edee066c0d271Jeff Tinker if (drmFactory == nullptr) { 125a0b44e644a89b1ab6712c549256828fb22820cccJeff Tinker drmFactory = VtsTestBase::getService<IDrmFactory>(); 126cf3916a1fd35685d0dc6867d030edee066c0d271Jeff Tinker } 1270ea406920af8313875866f13c9104129c08b2d76Jeff Tinker ASSERT_NE(drmFactory, nullptr); 128cf3916a1fd35685d0dc6867d030edee066c0d271Jeff Tinker 129a0b44e644a89b1ab6712c549256828fb22820cccJeff Tinker // Do the same for the crypto factory 130cf3916a1fd35685d0dc6867d030edee066c0d271Jeff Tinker cryptoFactory = VtsTestBase::getService<ICryptoFactory>(name); 131cf3916a1fd35685d0dc6867d030edee066c0d271Jeff Tinker if (cryptoFactory == nullptr) { 132a26f27fad9a617687646a437753fa0ba9e69f5adYahan Zhou cryptoFactory = VtsTestBase::getService<ICryptoFactory>(); 133cf3916a1fd35685d0dc6867d030edee066c0d271Jeff Tinker } 1340ea406920af8313875866f13c9104129c08b2d76Jeff Tinker ASSERT_NE(cryptoFactory, nullptr); 135be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker 136be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker // If drm scheme not installed skip subsequent tests 137be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker if (!drmFactory->isCryptoSchemeSupported(getVendorUUID())) { 138be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker vendorModule->setInstalled(false); 139be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker return; 140be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker } 1410ea406920af8313875866f13c9104129c08b2d76Jeff Tinker } 1420ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 1430ea406920af8313875866f13c9104129c08b2d76Jeff Tinker virtual void TearDown() override {} 1440ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 1450ea406920af8313875866f13c9104129c08b2d76Jeff Tinker protected: 1460ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_array<uint8_t, 16> getVendorUUID() { 1470ea406920af8313875866f13c9104129c08b2d76Jeff Tinker vector<uint8_t> uuid = vendorModule->getUUID(); 1480ea406920af8313875866f13c9104129c08b2d76Jeff Tinker return hidl_array<uint8_t, 16>(&uuid[0]); 1490ea406920af8313875866f13c9104129c08b2d76Jeff Tinker } 1500ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 1510ea406920af8313875866f13c9104129c08b2d76Jeff Tinker sp<IDrmFactory> drmFactory; 1520ea406920af8313875866f13c9104129c08b2d76Jeff Tinker sp<ICryptoFactory> cryptoFactory; 1530ea406920af8313875866f13c9104129c08b2d76Jeff Tinker unique_ptr<DrmHalVTSVendorModule_V1> vendorModule; 154f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker const vector<ContentConfiguration> contentConfigurations; 1550ea406920af8313875866f13c9104129c08b2d76Jeff Tinker}; 1560ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 157f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff TinkerTEST_P(DrmHalVendorFactoryTest, ValidateConfigurations) { 158f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker const char* kVendorStr = "Vendor module "; 1596799c3a5c597813154e20837c58703eba7996dfeRyan Campbell size_t count = 0; 160f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker for (auto config : contentConfigurations) { 161f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker ASSERT_TRUE(config.name.size() > 0) << kVendorStr << "has no name"; 162f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker ASSERT_TRUE(config.serverUrl.size() > 0) << kVendorStr 163f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker << "has no serverUrl"; 164f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker ASSERT_TRUE(config.initData.size() > 0) << kVendorStr 165f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker << "has no init data"; 166f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker ASSERT_TRUE(config.mimeType.size() > 0) << kVendorStr 167f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker << "has no mime type"; 168f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker ASSERT_TRUE(config.keys.size() >= 1) << kVendorStr << "has no keys"; 169f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker for (auto key : config.keys) { 170f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker ASSERT_TRUE(key.keyId.size() > 0) << kVendorStr 171f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker << " has zero length keyId"; 172f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker ASSERT_TRUE(key.keyId.size() > 0) << kVendorStr 173f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker << " has zero length key value"; 174f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker } 1756799c3a5c597813154e20837c58703eba7996dfeRyan Campbell count++; 176f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker } 1776799c3a5c597813154e20837c58703eba7996dfeRyan Campbell EXPECT_NE(0u, count); 1780ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 1790ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 1800ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 1810ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Ensure the factory doesn't support an invalid scheme UUID 1820ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 1830ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorFactoryTest, InvalidPluginNotSupported) { 1840ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_FALSE(drmFactory->isCryptoSchemeSupported(kInvalidUUID)); 1850ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_FALSE(cryptoFactory->isCryptoSchemeSupported(kInvalidUUID)); 1860ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 1870ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 1880ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 189f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker * Ensure the factory doesn't support an empty UUID 190f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker */ 191f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff TinkerTEST_P(DrmHalVendorFactoryTest, EmptyPluginUUIDNotSupported) { 192f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker hidl_array<uint8_t, 16> emptyUUID; 193a33256b811e29cd8887c00b671cee1ef5f6de8f8Jeff Tinker memset(emptyUUID.data(), 0, 16); 194f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker EXPECT_FALSE(drmFactory->isCryptoSchemeSupported(emptyUUID)); 195f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker EXPECT_FALSE(cryptoFactory->isCryptoSchemeSupported(emptyUUID)); 196f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker} 197f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 198f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker/** 199be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker * Check if the factory supports the scheme uuid in the config. 200f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker */ 201be310b2b77fbde99af326263a9ee6995225c4284Jeff TinkerTEST_P(DrmHalVendorFactoryTest, PluginConfigUUIDSupported) { 202be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker RETURN_IF_SKIPPED; 203f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker EXPECT_TRUE(drmFactory->isCryptoSchemeSupported(getVendorUUID())); 204f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker EXPECT_TRUE(cryptoFactory->isCryptoSchemeSupported(getVendorUUID())); 205f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker} 206f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 207f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker/** 208f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker * Ensure empty content type is not supported 209f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker */ 210f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff TinkerTEST_P(DrmHalVendorFactoryTest, EmptyContentTypeNotSupported) { 211f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker hidl_string empty; 212f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker EXPECT_FALSE(drmFactory->isContentTypeSupported(empty)); 213f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker} 214f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 215f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker/** 216f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker * Ensure invalid content type is not supported 217f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker */ 218f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff TinkerTEST_P(DrmHalVendorFactoryTest, InvalidContentTypeNotSupported) { 219f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker hidl_string invalid("abcdabcd"); 220f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker EXPECT_FALSE(drmFactory->isContentTypeSupported(invalid)); 221f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker} 222f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 223f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker/** 224f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker * Ensure valid content types in the configs are supported 225f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker */ 226f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff TinkerTEST_P(DrmHalVendorFactoryTest, ValidContentTypeSupported) { 227be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker RETURN_IF_SKIPPED; 228f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker for (auto config : contentConfigurations) { 229f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker EXPECT_TRUE(drmFactory->isContentTypeSupported(config.mimeType)); 230f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker } 231f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker} 232f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 233f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker/** 2340ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Ensure vendor drm plugin can be created 2350ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 2360ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorFactoryTest, CreateVendorDrmPlugin) { 237be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker RETURN_IF_SKIPPED; 2380ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_string packageName("android.hardware.drm.test"); 2390ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmFactory->createPlugin( 2400ea406920af8313875866f13c9104129c08b2d76Jeff Tinker getVendorUUID(), packageName, 2410ea406920af8313875866f13c9104129c08b2d76Jeff Tinker [&](Status status, const sp<IDrmPlugin>& plugin) { 2420ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::OK, status); 2430ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_NE(plugin, nullptr); 2440ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 2450ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 2460ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 2470ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 2480ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 2490ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Ensure vendor crypto plugin can be created 2500ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 2510ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorFactoryTest, CreateVendorCryptoPlugin) { 252be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker RETURN_IF_SKIPPED; 2530ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_vec<uint8_t> initVec; 2540ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = cryptoFactory->createPlugin( 2550ea406920af8313875866f13c9104129c08b2d76Jeff Tinker getVendorUUID(), initVec, 2560ea406920af8313875866f13c9104129c08b2d76Jeff Tinker [&](Status status, const sp<ICryptoPlugin>& plugin) { 2570ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::OK, status); 2580ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_NE(plugin, nullptr); 2590ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 2600ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 2610ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 2620ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 2630ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 2640ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Ensure invalid drm plugin can't be created 2650ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 2660ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorFactoryTest, CreateInvalidDrmPlugin) { 267be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker RETURN_IF_SKIPPED; 2680ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_string packageName("android.hardware.drm.test"); 2690ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmFactory->createPlugin( 2700ea406920af8313875866f13c9104129c08b2d76Jeff Tinker kInvalidUUID, packageName, 2710ea406920af8313875866f13c9104129c08b2d76Jeff Tinker [&](Status status, const sp<IDrmPlugin>& plugin) { 2720ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::ERROR_DRM_CANNOT_HANDLE, status); 2730ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(plugin, nullptr); 2740ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 2750ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 2760ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 2770ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 2780ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 2790ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Ensure invalid crypto plugin can't be created 2800ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 2810ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorFactoryTest, CreateInvalidCryptoPlugin) { 282be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker RETURN_IF_SKIPPED; 2830ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_vec<uint8_t> initVec; 2840ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = cryptoFactory->createPlugin( 2850ea406920af8313875866f13c9104129c08b2d76Jeff Tinker kInvalidUUID, initVec, 2860ea406920af8313875866f13c9104129c08b2d76Jeff Tinker [&](Status status, const sp<ICryptoPlugin>& plugin) { 2870ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::ERROR_DRM_CANNOT_HANDLE, status); 2880ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(plugin, nullptr); 2890ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 2900ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 2910ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 2920ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 2930ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerclass DrmHalVendorPluginTest : public DrmHalVendorFactoryTest { 2940ea406920af8313875866f13c9104129c08b2d76Jeff Tinker public: 2950ea406920af8313875866f13c9104129c08b2d76Jeff Tinker virtual ~DrmHalVendorPluginTest() {} 2960ea406920af8313875866f13c9104129c08b2d76Jeff Tinker virtual void SetUp() override { 2970ea406920af8313875866f13c9104129c08b2d76Jeff Tinker // Create factories 2980ea406920af8313875866f13c9104129c08b2d76Jeff Tinker DrmHalVendorFactoryTest::SetUp(); 299be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker RETURN_IF_SKIPPED; 3000ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 3010ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_string packageName("android.hardware.drm.test"); 3020ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmFactory->createPlugin( 3030ea406920af8313875866f13c9104129c08b2d76Jeff Tinker getVendorUUID(), packageName, 3040ea406920af8313875866f13c9104129c08b2d76Jeff Tinker [this](Status status, const sp<IDrmPlugin>& plugin) { 3050ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::OK, status); 3060ea406920af8313875866f13c9104129c08b2d76Jeff Tinker ASSERT_NE(plugin, nullptr); 3070ea406920af8313875866f13c9104129c08b2d76Jeff Tinker drmPlugin = plugin; 3080ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 3090ea406920af8313875866f13c9104129c08b2d76Jeff Tinker ASSERT_OK(res); 3100ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 3110ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_vec<uint8_t> initVec; 3120ea406920af8313875866f13c9104129c08b2d76Jeff Tinker res = cryptoFactory->createPlugin( 3130ea406920af8313875866f13c9104129c08b2d76Jeff Tinker getVendorUUID(), initVec, 3140ea406920af8313875866f13c9104129c08b2d76Jeff Tinker [this](Status status, const sp<ICryptoPlugin>& plugin) { 3150ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::OK, status); 3160ea406920af8313875866f13c9104129c08b2d76Jeff Tinker ASSERT_NE(plugin, nullptr); 3170ea406920af8313875866f13c9104129c08b2d76Jeff Tinker cryptoPlugin = plugin; 3180ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 3190ea406920af8313875866f13c9104129c08b2d76Jeff Tinker ASSERT_OK(res); 3200ea406920af8313875866f13c9104129c08b2d76Jeff Tinker } 3210ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 3220ea406920af8313875866f13c9104129c08b2d76Jeff Tinker virtual void TearDown() override {} 3230ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 3240ea406920af8313875866f13c9104129c08b2d76Jeff Tinker SessionId openSession(); 3250ea406920af8313875866f13c9104129c08b2d76Jeff Tinker void closeSession(const SessionId& sessionId); 3260ea406920af8313875866f13c9104129c08b2d76Jeff Tinker sp<IMemory> getDecryptMemory(size_t size, size_t index); 3276799c3a5c597813154e20837c58703eba7996dfeRyan Campbell KeyedVector toHidlKeyedVector(const map<string, string>& params); 3286799c3a5c597813154e20837c58703eba7996dfeRyan Campbell hidl_vec<uint8_t> loadKeys(const SessionId& sessionId, 3296799c3a5c597813154e20837c58703eba7996dfeRyan Campbell const ContentConfiguration& configuration, 3306799c3a5c597813154e20837c58703eba7996dfeRyan Campbell const KeyType& type); 3310ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 3320ea406920af8313875866f13c9104129c08b2d76Jeff Tinker protected: 3330ea406920af8313875866f13c9104129c08b2d76Jeff Tinker sp<IDrmPlugin> drmPlugin; 3340ea406920af8313875866f13c9104129c08b2d76Jeff Tinker sp<ICryptoPlugin> cryptoPlugin; 3350ea406920af8313875866f13c9104129c08b2d76Jeff Tinker}; 3360ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 3370ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 3380ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * DrmPlugin tests 3390ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 3400ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 3410ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 3420ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Test that a DRM plugin can handle provisioning. While 3430ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * it is not required that a DRM scheme require provisioning, 3440ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * it should at least return appropriate status values. If 3450ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * a provisioning request is returned, it is passed to the 3460ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * vendor module which should provide a provisioning response 3470ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * that is delivered back to the HAL. 3480ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 3490ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 3500ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, DoProvisioning) { 351be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker RETURN_IF_SKIPPED; 3520ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_string certificateType; 3530ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_string certificateAuthority; 3540ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_vec<uint8_t> provisionRequest; 3550ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_string defaultUrl; 3560ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmPlugin->getProvisionRequest( 3570ea406920af8313875866f13c9104129c08b2d76Jeff Tinker certificateType, certificateAuthority, 3580ea406920af8313875866f13c9104129c08b2d76Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& request, 3590ea406920af8313875866f13c9104129c08b2d76Jeff Tinker const hidl_string& url) { 3600ea406920af8313875866f13c9104129c08b2d76Jeff Tinker if (status == Status::OK) { 3610ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_NE(request.size(), 0u); 3620ea406920af8313875866f13c9104129c08b2d76Jeff Tinker provisionRequest = request; 3630ea406920af8313875866f13c9104129c08b2d76Jeff Tinker defaultUrl = url; 3640ea406920af8313875866f13c9104129c08b2d76Jeff Tinker } else if (status == Status::ERROR_DRM_CANNOT_HANDLE) { 3650ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(0u, request.size()); 3660ea406920af8313875866f13c9104129c08b2d76Jeff Tinker } 3670ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 3680ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 3690ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 3700ea406920af8313875866f13c9104129c08b2d76Jeff Tinker if (provisionRequest.size() > 0) { 3710ea406920af8313875866f13c9104129c08b2d76Jeff Tinker vector<uint8_t> response = vendorModule->handleProvisioningRequest( 3720ea406920af8313875866f13c9104129c08b2d76Jeff Tinker provisionRequest, defaultUrl); 3730ea406920af8313875866f13c9104129c08b2d76Jeff Tinker ASSERT_NE(0u, response.size()); 3740ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 3750ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmPlugin->provideProvisionResponse( 3760ea406920af8313875866f13c9104129c08b2d76Jeff Tinker response, [&](Status status, const hidl_vec<uint8_t>&, 3770ea406920af8313875866f13c9104129c08b2d76Jeff Tinker const hidl_vec<uint8_t>&) { 3780ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::OK, status); 3790ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 3800ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 3810ea406920af8313875866f13c9104129c08b2d76Jeff Tinker } 3820ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 3830ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 3840ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 3850ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * The DRM HAL should return BAD_VALUE if an empty provisioning 3860ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * response is provided. 3870ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 3880ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, ProvideEmptyProvisionResponse) { 389be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker RETURN_IF_SKIPPED; 3900ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_vec<uint8_t> response; 3910ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmPlugin->provideProvisionResponse( 3920ea406920af8313875866f13c9104129c08b2d76Jeff Tinker response, [&](Status status, const hidl_vec<uint8_t>&, 3930ea406920af8313875866f13c9104129c08b2d76Jeff Tinker const hidl_vec<uint8_t>&) { 3940ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::BAD_VALUE, status); 3950ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 3960ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 3970ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 3980ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 3990ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 4000ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Helper method to open a session and verify that a non-empty 4010ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * session ID is returned 4020ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 4030ea406920af8313875866f13c9104129c08b2d76Jeff TinkerSessionId DrmHalVendorPluginTest::openSession() { 4040ea406920af8313875866f13c9104129c08b2d76Jeff Tinker SessionId sessionId; 4050ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 4060ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmPlugin->openSession([&](Status status, const SessionId& id) { 4070ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::OK, status); 4080ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_NE(id.size(), 0u); 4090ea406920af8313875866f13c9104129c08b2d76Jeff Tinker sessionId = id; 4100ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 4110ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 4120ea406920af8313875866f13c9104129c08b2d76Jeff Tinker return sessionId; 4130ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 4140ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 4150ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 4160ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Helper method to close a session 4170ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 4180ea406920af8313875866f13c9104129c08b2d76Jeff Tinkervoid DrmHalVendorPluginTest::closeSession(const SessionId& sessionId) { 4190ea406920af8313875866f13c9104129c08b2d76Jeff Tinker Status status = drmPlugin->closeSession(sessionId); 4200ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::OK, status); 4210ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 4220ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 4236799c3a5c597813154e20837c58703eba7996dfeRyan CampbellKeyedVector DrmHalVendorPluginTest::toHidlKeyedVector( 4246799c3a5c597813154e20837c58703eba7996dfeRyan Campbell const map<string, string>& params) { 4256799c3a5c597813154e20837c58703eba7996dfeRyan Campbell std::vector<KeyValue> stdKeyedVector; 4266799c3a5c597813154e20837c58703eba7996dfeRyan Campbell for (auto it = params.begin(); it != params.end(); ++it) { 4276799c3a5c597813154e20837c58703eba7996dfeRyan Campbell KeyValue keyValue; 4286799c3a5c597813154e20837c58703eba7996dfeRyan Campbell keyValue.key = it->first; 4296799c3a5c597813154e20837c58703eba7996dfeRyan Campbell keyValue.value = it->second; 4306799c3a5c597813154e20837c58703eba7996dfeRyan Campbell stdKeyedVector.push_back(keyValue); 4316799c3a5c597813154e20837c58703eba7996dfeRyan Campbell } 4326799c3a5c597813154e20837c58703eba7996dfeRyan Campbell return KeyedVector(stdKeyedVector); 4336799c3a5c597813154e20837c58703eba7996dfeRyan Campbell} 4346799c3a5c597813154e20837c58703eba7996dfeRyan Campbell 4356799c3a5c597813154e20837c58703eba7996dfeRyan Campbell/** 4366799c3a5c597813154e20837c58703eba7996dfeRyan Campbell * Helper method to load keys for subsequent decrypt tests. 4376799c3a5c597813154e20837c58703eba7996dfeRyan Campbell * These tests use predetermined key request/response to 4386799c3a5c597813154e20837c58703eba7996dfeRyan Campbell * avoid requiring a round trip to a license server. 4396799c3a5c597813154e20837c58703eba7996dfeRyan Campbell */ 4406799c3a5c597813154e20837c58703eba7996dfeRyan Campbellhidl_vec<uint8_t> DrmHalVendorPluginTest::loadKeys( 4416799c3a5c597813154e20837c58703eba7996dfeRyan Campbell const SessionId& sessionId, const ContentConfiguration& configuration, 4426799c3a5c597813154e20837c58703eba7996dfeRyan Campbell const KeyType& type = KeyType::STREAMING) { 4436799c3a5c597813154e20837c58703eba7996dfeRyan Campbell hidl_vec<uint8_t> keyRequest; 4446799c3a5c597813154e20837c58703eba7996dfeRyan Campbell auto res = drmPlugin->getKeyRequest( 4456799c3a5c597813154e20837c58703eba7996dfeRyan Campbell sessionId, configuration.initData, configuration.mimeType, type, 4466799c3a5c597813154e20837c58703eba7996dfeRyan Campbell toHidlKeyedVector(configuration.optionalParameters), 4476799c3a5c597813154e20837c58703eba7996dfeRyan Campbell [&](Status status, const hidl_vec<uint8_t>& request, 4486799c3a5c597813154e20837c58703eba7996dfeRyan Campbell KeyRequestType type, const hidl_string&) { 4496799c3a5c597813154e20837c58703eba7996dfeRyan Campbell EXPECT_EQ(Status::OK, status) << "Failed to get " 4506799c3a5c597813154e20837c58703eba7996dfeRyan Campbell "key request for configuration " 4516799c3a5c597813154e20837c58703eba7996dfeRyan Campbell << configuration.name; 4526799c3a5c597813154e20837c58703eba7996dfeRyan Campbell EXPECT_EQ(type, KeyRequestType::INITIAL); 4536799c3a5c597813154e20837c58703eba7996dfeRyan Campbell EXPECT_NE(request.size(), 0u) << "Expected key request size" 4546799c3a5c597813154e20837c58703eba7996dfeRyan Campbell " to have length > 0 bytes"; 4556799c3a5c597813154e20837c58703eba7996dfeRyan Campbell keyRequest = request; 4566799c3a5c597813154e20837c58703eba7996dfeRyan Campbell }); 4576799c3a5c597813154e20837c58703eba7996dfeRyan Campbell EXPECT_OK(res); 4586799c3a5c597813154e20837c58703eba7996dfeRyan Campbell 4596799c3a5c597813154e20837c58703eba7996dfeRyan Campbell /** 4606799c3a5c597813154e20837c58703eba7996dfeRyan Campbell * Get key response from vendor module 4616799c3a5c597813154e20837c58703eba7996dfeRyan Campbell */ 4626799c3a5c597813154e20837c58703eba7996dfeRyan Campbell hidl_vec<uint8_t> keyResponse = 4636799c3a5c597813154e20837c58703eba7996dfeRyan Campbell vendorModule->handleKeyRequest(keyRequest, configuration.serverUrl); 4646799c3a5c597813154e20837c58703eba7996dfeRyan Campbell 4656799c3a5c597813154e20837c58703eba7996dfeRyan Campbell EXPECT_NE(keyResponse.size(), 0u) << "Expected key response size " 4666799c3a5c597813154e20837c58703eba7996dfeRyan Campbell "to have length > 0 bytes"; 4676799c3a5c597813154e20837c58703eba7996dfeRyan Campbell 4686799c3a5c597813154e20837c58703eba7996dfeRyan Campbell hidl_vec<uint8_t> keySetId; 4696799c3a5c597813154e20837c58703eba7996dfeRyan Campbell res = drmPlugin->provideKeyResponse( 4706799c3a5c597813154e20837c58703eba7996dfeRyan Campbell sessionId, keyResponse, 4716799c3a5c597813154e20837c58703eba7996dfeRyan Campbell [&](Status status, const hidl_vec<uint8_t>& myKeySetId) { 4726799c3a5c597813154e20837c58703eba7996dfeRyan Campbell EXPECT_EQ(Status::OK, status) << "Failure providing " 4736799c3a5c597813154e20837c58703eba7996dfeRyan Campbell "key response for configuration " 4746799c3a5c597813154e20837c58703eba7996dfeRyan Campbell << configuration.name; 4756799c3a5c597813154e20837c58703eba7996dfeRyan Campbell keySetId = myKeySetId; 4766799c3a5c597813154e20837c58703eba7996dfeRyan Campbell }); 4776799c3a5c597813154e20837c58703eba7996dfeRyan Campbell EXPECT_OK(res); 4786799c3a5c597813154e20837c58703eba7996dfeRyan Campbell return keySetId; 4796799c3a5c597813154e20837c58703eba7996dfeRyan Campbell} 4806799c3a5c597813154e20837c58703eba7996dfeRyan Campbell 4810ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 4820ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Test that a session can be opened and closed 4830ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 4840ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, OpenCloseSession) { 485be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker RETURN_IF_SKIPPED; 4860ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto sessionId = openSession(); 4870ea406920af8313875866f13c9104129c08b2d76Jeff Tinker closeSession(sessionId); 4880ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 4890ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 4900ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 4910ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Test that attempting to close an invalid (empty) sessionId 4920ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * is prohibited with the documented error code. 4930ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 4940ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, CloseInvalidSession) { 495be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker RETURN_IF_SKIPPED; 4960ea406920af8313875866f13c9104129c08b2d76Jeff Tinker SessionId invalidSessionId; 4970ea406920af8313875866f13c9104129c08b2d76Jeff Tinker Status status = drmPlugin->closeSession(invalidSessionId); 4980ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::BAD_VALUE, status); 4990ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 5000ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 5010ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 5020ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Test that attempting to close a valid session twice 5030ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * is prohibited with the documented error code. 5040ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 5050ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, CloseClosedSession) { 506be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker RETURN_IF_SKIPPED; 5070ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto sessionId = openSession(); 5080ea406920af8313875866f13c9104129c08b2d76Jeff Tinker closeSession(sessionId); 5090ea406920af8313875866f13c9104129c08b2d76Jeff Tinker Status status = drmPlugin->closeSession(sessionId); 5100ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::ERROR_DRM_SESSION_NOT_OPENED, status); 5110ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 5120ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 5130ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 5140ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * A get key request should fail if no sessionId is provided 5150ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 5160ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, GetKeyRequestNoSession) { 517be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker RETURN_IF_SKIPPED; 5180ea406920af8313875866f13c9104129c08b2d76Jeff Tinker SessionId invalidSessionId; 5190ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_vec<uint8_t> initData; 5200ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_string mimeType = "video/mp4"; 5210ea406920af8313875866f13c9104129c08b2d76Jeff Tinker KeyedVector optionalParameters; 5220ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmPlugin->getKeyRequest( 5230ea406920af8313875866f13c9104129c08b2d76Jeff Tinker invalidSessionId, initData, mimeType, KeyType::STREAMING, 5240ea406920af8313875866f13c9104129c08b2d76Jeff Tinker optionalParameters, 5250ea406920af8313875866f13c9104129c08b2d76Jeff Tinker [&](Status status, const hidl_vec<uint8_t>&, KeyRequestType, 5260ea406920af8313875866f13c9104129c08b2d76Jeff Tinker const hidl_string&) { EXPECT_EQ(Status::BAD_VALUE, status); }); 5270ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 5280ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 5290ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 5300ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 5310ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Test that an empty sessionID returns BAD_VALUE 5320ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 5330ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, ProvideKeyResponseEmptySessionId) { 534be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker RETURN_IF_SKIPPED; 5350ea406920af8313875866f13c9104129c08b2d76Jeff Tinker SessionId session; 5360ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 5370ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_vec<uint8_t> keyResponse = {0x7b, 0x22, 0x6b, 0x65, 5380ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 0x79, 0x73, 0x22, 0x3a}; 5390ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmPlugin->provideKeyResponse( 5400ea406920af8313875866f13c9104129c08b2d76Jeff Tinker session, keyResponse, 5410ea406920af8313875866f13c9104129c08b2d76Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& keySetId) { 5420ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::BAD_VALUE, status); 5430ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(keySetId.size(), 0u); 5440ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 5450ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 5460ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 5470ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 5480ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 5490ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Test that an empty key response returns BAD_VALUE 5500ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 5510ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, ProvideKeyResponseEmptyResponse) { 552be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker RETURN_IF_SKIPPED; 5530ea406920af8313875866f13c9104129c08b2d76Jeff Tinker SessionId session = openSession(); 5540ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_vec<uint8_t> emptyResponse; 5550ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmPlugin->provideKeyResponse( 5560ea406920af8313875866f13c9104129c08b2d76Jeff Tinker session, emptyResponse, 5570ea406920af8313875866f13c9104129c08b2d76Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& keySetId) { 5580ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::BAD_VALUE, status); 5590ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(keySetId.size(), 0u); 5600ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 5610ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 5620ea406920af8313875866f13c9104129c08b2d76Jeff Tinker closeSession(session); 5630ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 5640ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 5650ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 566f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker * Test that a removeKeys on an empty sessionID returns BAD_VALUE 567f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker */ 568f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff TinkerTEST_P(DrmHalVendorPluginTest, RemoveKeysEmptySessionId) { 569be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker RETURN_IF_SKIPPED; 570f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker SessionId sessionId; 571f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker Status status = drmPlugin->removeKeys(sessionId); 572f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker EXPECT_TRUE(status == Status::BAD_VALUE); 573f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker} 574f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 575f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker/** 576f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker * Test that remove keys returns okay on an initialized session 577f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker * that has no keys. 578f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker */ 579f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff TinkerTEST_P(DrmHalVendorPluginTest, RemoveKeysNewSession) { 580be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker RETURN_IF_SKIPPED; 581f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker SessionId sessionId = openSession(); 582f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker Status status = drmPlugin->removeKeys(sessionId); 583f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker EXPECT_TRUE(status == Status::OK); 584f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker closeSession(sessionId); 585f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker} 586f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 587f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker/** 5886799c3a5c597813154e20837c58703eba7996dfeRyan Campbell * Test that keys are successfully restored to a new session 5896799c3a5c597813154e20837c58703eba7996dfeRyan Campbell * for all content having a policy that allows offline use. 5906799c3a5c597813154e20837c58703eba7996dfeRyan Campbell */ 5916799c3a5c597813154e20837c58703eba7996dfeRyan CampbellTEST_P(DrmHalVendorPluginTest, RestoreKeys) { 592be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker RETURN_IF_SKIPPED; 5936799c3a5c597813154e20837c58703eba7996dfeRyan Campbell for (auto config : contentConfigurations) { 5946799c3a5c597813154e20837c58703eba7996dfeRyan Campbell if (config.policy.allowOffline) { 5956799c3a5c597813154e20837c58703eba7996dfeRyan Campbell auto sessionId = openSession(); 5966799c3a5c597813154e20837c58703eba7996dfeRyan Campbell hidl_vec<uint8_t> keySetId = 5976799c3a5c597813154e20837c58703eba7996dfeRyan Campbell loadKeys(sessionId, config, KeyType::OFFLINE); 5986799c3a5c597813154e20837c58703eba7996dfeRyan Campbell closeSession(sessionId); 5996799c3a5c597813154e20837c58703eba7996dfeRyan Campbell sessionId = openSession(); 6006799c3a5c597813154e20837c58703eba7996dfeRyan Campbell EXPECT_NE(0u, keySetId.size()); 6016799c3a5c597813154e20837c58703eba7996dfeRyan Campbell Status status = drmPlugin->restoreKeys(sessionId, keySetId); 6026799c3a5c597813154e20837c58703eba7996dfeRyan Campbell EXPECT_EQ(Status::OK, status); 6036799c3a5c597813154e20837c58703eba7996dfeRyan Campbell closeSession(sessionId); 6046799c3a5c597813154e20837c58703eba7996dfeRyan Campbell } 6056799c3a5c597813154e20837c58703eba7996dfeRyan Campbell } 6066799c3a5c597813154e20837c58703eba7996dfeRyan Campbell} 6076799c3a5c597813154e20837c58703eba7996dfeRyan Campbell 6086799c3a5c597813154e20837c58703eba7996dfeRyan Campbell/** 6096799c3a5c597813154e20837c58703eba7996dfeRyan Campbell * Test that restoreKeys fails with a null key set ID. 6106799c3a5c597813154e20837c58703eba7996dfeRyan Campbell * Error message is expected to be Status::BAD_VALUE. 6116799c3a5c597813154e20837c58703eba7996dfeRyan Campbell */ 6126799c3a5c597813154e20837c58703eba7996dfeRyan CampbellTEST_P(DrmHalVendorPluginTest, RestoreKeysNull) { 613be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker RETURN_IF_SKIPPED; 6146799c3a5c597813154e20837c58703eba7996dfeRyan Campbell SessionId sessionId = openSession(); 6156799c3a5c597813154e20837c58703eba7996dfeRyan Campbell hidl_vec<uint8_t> nullKeySetId; 6166799c3a5c597813154e20837c58703eba7996dfeRyan Campbell Status status = drmPlugin->restoreKeys(sessionId, nullKeySetId); 6176799c3a5c597813154e20837c58703eba7996dfeRyan Campbell EXPECT_EQ(Status::BAD_VALUE, status); 6186799c3a5c597813154e20837c58703eba7996dfeRyan Campbell closeSession(sessionId); 6196799c3a5c597813154e20837c58703eba7996dfeRyan Campbell} 6206799c3a5c597813154e20837c58703eba7996dfeRyan Campbell 6216799c3a5c597813154e20837c58703eba7996dfeRyan Campbell/** 6226799c3a5c597813154e20837c58703eba7996dfeRyan Campbell * Test that restoreKeys fails to restore keys to a closed 6236799c3a5c597813154e20837c58703eba7996dfeRyan Campbell * session. Error message is expected to be 6246799c3a5c597813154e20837c58703eba7996dfeRyan Campbell * Status::ERROR_DRM_SESSION_NOT_OPENED. 6256799c3a5c597813154e20837c58703eba7996dfeRyan Campbell */ 6266799c3a5c597813154e20837c58703eba7996dfeRyan CampbellTEST_P(DrmHalVendorPluginTest, RestoreKeysClosedSession) { 627be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker RETURN_IF_SKIPPED; 6286799c3a5c597813154e20837c58703eba7996dfeRyan Campbell for (auto config : contentConfigurations) { 629779678f559badd6c9f3b1b0b616c3ffc6314fe8bJeff Tinker if (config.policy.allowOffline) { 630779678f559badd6c9f3b1b0b616c3ffc6314fe8bJeff Tinker auto sessionId = openSession(); 631779678f559badd6c9f3b1b0b616c3ffc6314fe8bJeff Tinker hidl_vec<uint8_t> keySetId = 632779678f559badd6c9f3b1b0b616c3ffc6314fe8bJeff Tinker loadKeys(sessionId, config, KeyType::OFFLINE); 633779678f559badd6c9f3b1b0b616c3ffc6314fe8bJeff Tinker EXPECT_NE(0u, keySetId.size()); 634779678f559badd6c9f3b1b0b616c3ffc6314fe8bJeff Tinker closeSession(sessionId); 635779678f559badd6c9f3b1b0b616c3ffc6314fe8bJeff Tinker sessionId = openSession(); 636779678f559badd6c9f3b1b0b616c3ffc6314fe8bJeff Tinker closeSession(sessionId); 637779678f559badd6c9f3b1b0b616c3ffc6314fe8bJeff Tinker Status status = drmPlugin->restoreKeys(sessionId, keySetId); 638779678f559badd6c9f3b1b0b616c3ffc6314fe8bJeff Tinker EXPECT_EQ(Status::ERROR_DRM_SESSION_NOT_OPENED, status); 639779678f559badd6c9f3b1b0b616c3ffc6314fe8bJeff Tinker } 6406799c3a5c597813154e20837c58703eba7996dfeRyan Campbell } 6416799c3a5c597813154e20837c58703eba7996dfeRyan Campbell} 6426799c3a5c597813154e20837c58703eba7996dfeRyan Campbell 6436799c3a5c597813154e20837c58703eba7996dfeRyan Campbell/** 6440ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Test that the plugin either doesn't support getting 6450ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * secure stops, or has no secure stops available after 6460ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * clearing them. 6470ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 6480ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, GetSecureStops) { 649be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker RETURN_IF_SKIPPED; 6500ea406920af8313875866f13c9104129c08b2d76Jeff Tinker // There may be secure stops, depending on if there were keys 6510ea406920af8313875866f13c9104129c08b2d76Jeff Tinker // loaded and unloaded previously. Clear them to get to a known 6520ea406920af8313875866f13c9104129c08b2d76Jeff Tinker // state, then make sure there are none. 6530ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmPlugin->getSecureStops( 6540ea406920af8313875866f13c9104129c08b2d76Jeff Tinker [&](Status status, const hidl_vec<SecureStop>&) { 6550ea406920af8313875866f13c9104129c08b2d76Jeff Tinker if (status != Status::OK) { 6560ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::ERROR_DRM_CANNOT_HANDLE, status); 6570ea406920af8313875866f13c9104129c08b2d76Jeff Tinker } 6580ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 6590ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 6600ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 6610ea406920af8313875866f13c9104129c08b2d76Jeff Tinker res = drmPlugin->getSecureStops( 6620ea406920af8313875866f13c9104129c08b2d76Jeff Tinker [&](Status status, const hidl_vec<SecureStop>& secureStops) { 6630ea406920af8313875866f13c9104129c08b2d76Jeff Tinker if (status == Status::OK) { 6640ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(secureStops.size(), 0u); 6650ea406920af8313875866f13c9104129c08b2d76Jeff Tinker } else { 6660ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::ERROR_DRM_CANNOT_HANDLE, status); 6670ea406920af8313875866f13c9104129c08b2d76Jeff Tinker } 6680ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 6690ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 6700ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 6710ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 6720ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 6730ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Test that the clearkey plugin returns BAD_VALUE if 6740ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * an empty ssid is provided. 6750ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 6760ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, GetSecureStopEmptySSID) { 677be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker RETURN_IF_SKIPPED; 6780ea406920af8313875866f13c9104129c08b2d76Jeff Tinker SecureStopId ssid; 6790ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmPlugin->getSecureStop( 6800ea406920af8313875866f13c9104129c08b2d76Jeff Tinker ssid, [&](Status status, const SecureStop&) { 6810ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::BAD_VALUE, status); 6820ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 6830ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 6840ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 6850ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 6860ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 6870ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Test that releasing all secure stops either isn't supported 6880ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * or is completed successfully 6890ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 6900ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, ReleaseAllSecureStops) { 691be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker RETURN_IF_SKIPPED; 6920ea406920af8313875866f13c9104129c08b2d76Jeff Tinker Status status = drmPlugin->releaseAllSecureStops(); 6930ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_TRUE(status == Status::OK || 6940ea406920af8313875866f13c9104129c08b2d76Jeff Tinker status == Status::ERROR_DRM_CANNOT_HANDLE); 6950ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 6960ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 6970ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 6980ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Releasing a secure stop without first getting one and sending it to the 6990ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * server to get a valid SSID should return ERROR_DRM_INVALID_STATE. 7000ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * This is an optional API so it can also return CANNOT_HANDLE. 7010ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 7020ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, ReleaseSecureStopSequenceError) { 703be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker RETURN_IF_SKIPPED; 7040ea406920af8313875866f13c9104129c08b2d76Jeff Tinker SecureStopId ssid = {1, 2, 3, 4}; 7050ea406920af8313875866f13c9104129c08b2d76Jeff Tinker Status status = drmPlugin->releaseSecureStop(ssid); 7060ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_TRUE(status == Status::ERROR_DRM_INVALID_STATE || 7070ea406920af8313875866f13c9104129c08b2d76Jeff Tinker status == Status::ERROR_DRM_CANNOT_HANDLE); 7080ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 7090ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 7100ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 7110ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Test that releasing a specific secure stop with an empty ssid 7120ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * return BAD_VALUE. This is an optional API so it can also return 7130ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * CANNOT_HANDLE. 7140ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 7150ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, ReleaseSecureStopEmptySSID) { 716be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker RETURN_IF_SKIPPED; 7170ea406920af8313875866f13c9104129c08b2d76Jeff Tinker SecureStopId ssid; 7180ea406920af8313875866f13c9104129c08b2d76Jeff Tinker Status status = drmPlugin->releaseSecureStop(ssid); 7190ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_TRUE(status == Status::BAD_VALUE || 7200ea406920af8313875866f13c9104129c08b2d76Jeff Tinker status == Status::ERROR_DRM_CANNOT_HANDLE); 7210ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 7220ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 7230ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 7240ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * The following five tests verify that the properties 7250ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * defined in the MediaDrm API are supported by 7260ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * the plugin. 7270ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 7280ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, GetVendorProperty) { 729be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker RETURN_IF_SKIPPED; 7300ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmPlugin->getPropertyString( 7310ea406920af8313875866f13c9104129c08b2d76Jeff Tinker "vendor", [&](Status status, const hidl_string& value) { 7320ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::OK, status); 7330ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_NE(value.size(), 0u); 7340ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 7350ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 7360ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 7370ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 7380ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, GetVersionProperty) { 739be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker RETURN_IF_SKIPPED; 7400ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmPlugin->getPropertyString( 7410ea406920af8313875866f13c9104129c08b2d76Jeff Tinker "version", [&](Status status, const hidl_string& value) { 7420ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::OK, status); 7430ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_NE(value.size(), 0u); 7440ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 7450ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 7460ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 7470ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 7480ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, GetDescriptionProperty) { 749be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker RETURN_IF_SKIPPED; 7500ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmPlugin->getPropertyString( 7510ea406920af8313875866f13c9104129c08b2d76Jeff Tinker "description", [&](Status status, const hidl_string& value) { 7520ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::OK, status); 7530ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_NE(value.size(), 0u); 7540ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 7550ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 7560ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 7570ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 7580ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, GetAlgorithmsProperty) { 759be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker RETURN_IF_SKIPPED; 7600ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmPlugin->getPropertyString( 7610ea406920af8313875866f13c9104129c08b2d76Jeff Tinker "algorithms", [&](Status status, const hidl_string& value) { 7620ea406920af8313875866f13c9104129c08b2d76Jeff Tinker if (status == Status::OK) { 7630ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_NE(value.size(), 0u); 7640ea406920af8313875866f13c9104129c08b2d76Jeff Tinker } else { 7650ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::ERROR_DRM_CANNOT_HANDLE, status); 7660ea406920af8313875866f13c9104129c08b2d76Jeff Tinker } 7670ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 7680ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 7690ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 7700ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 7710ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, GetPropertyUniqueDeviceID) { 772be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker RETURN_IF_SKIPPED; 7730ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmPlugin->getPropertyByteArray( 7740ea406920af8313875866f13c9104129c08b2d76Jeff Tinker "deviceUniqueId", 7750ea406920af8313875866f13c9104129c08b2d76Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& value) { 7760ea406920af8313875866f13c9104129c08b2d76Jeff Tinker if (status == Status::OK) { 7770ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_NE(value.size(), 0u); 7780ea406920af8313875866f13c9104129c08b2d76Jeff Tinker } else { 7790ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::ERROR_DRM_CANNOT_HANDLE, status); 7800ea406920af8313875866f13c9104129c08b2d76Jeff Tinker } 7810ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 7820ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 7830ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 7840ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 7850ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 7860ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Test that attempting to read invalid string and byte array 7870ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * properties returns the documented error code. 7880ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 7890ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, GetInvalidStringProperty) { 790be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker RETURN_IF_SKIPPED; 7910ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmPlugin->getPropertyString( 7920ea406920af8313875866f13c9104129c08b2d76Jeff Tinker "invalid", [&](Status status, const hidl_string&) { 7930ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::ERROR_DRM_CANNOT_HANDLE, status); 7940ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 7950ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 7960ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 7970ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 7980ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, GetInvalidByteArrayProperty) { 799be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker RETURN_IF_SKIPPED; 8000ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmPlugin->getPropertyByteArray( 8010ea406920af8313875866f13c9104129c08b2d76Jeff Tinker "invalid", [&](Status status, const hidl_vec<uint8_t>&) { 8020ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::ERROR_DRM_CANNOT_HANDLE, status); 8030ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 8040ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 8050ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 8060ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 8070ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 8080ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Test that setting invalid string and byte array properties returns 8090ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * the expected status value. 8100ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 8110ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, SetStringPropertyNotSupported) { 812be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker RETURN_IF_SKIPPED; 8130ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(drmPlugin->setPropertyString("awefijaeflijwef", "value"), 8140ea406920af8313875866f13c9104129c08b2d76Jeff Tinker Status::ERROR_DRM_CANNOT_HANDLE); 8150ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 8160ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 8170ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, SetByteArrayPropertyNotSupported) { 818be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker RETURN_IF_SKIPPED; 8190ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_vec<uint8_t> value; 8200ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(drmPlugin->setPropertyByteArray("awefijaeflijwef", value), 8210ea406920af8313875866f13c9104129c08b2d76Jeff Tinker Status::ERROR_DRM_CANNOT_HANDLE); 8220ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 8230ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 8240ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 8250ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Test that setting an invalid cipher algorithm returns 8260ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * the expected status value. 8270ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 8280ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, SetCipherInvalidAlgorithm) { 829be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker RETURN_IF_SKIPPED; 8300ea406920af8313875866f13c9104129c08b2d76Jeff Tinker SessionId session = openSession(); 8310ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_string algorithm; 8320ea406920af8313875866f13c9104129c08b2d76Jeff Tinker Status status = drmPlugin->setCipherAlgorithm(session, algorithm); 8330ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::BAD_VALUE, status); 8340ea406920af8313875866f13c9104129c08b2d76Jeff Tinker closeSession(session); 8350ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 8360ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 8370ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 8380ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Test that setting a cipher algorithm with no session returns 8390ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * the expected status value. 8400ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 8410ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, SetCipherAlgorithmNoSession) { 842be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker RETURN_IF_SKIPPED; 8430ea406920af8313875866f13c9104129c08b2d76Jeff Tinker SessionId session; 8440ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_string algorithm = "AES/CBC/NoPadding"; 8450ea406920af8313875866f13c9104129c08b2d76Jeff Tinker Status status = drmPlugin->setCipherAlgorithm(session, algorithm); 8460ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::BAD_VALUE, status); 8470ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 8480ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 8490ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 8500ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Test that setting a valid cipher algorithm returns 8510ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * the expected status value. It is not required that all 8520ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * vendor modules support this algorithm, but they must 8530ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * either accept it or return ERROR_DRM_CANNOT_HANDLE 8540ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 8550ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, SetCipherAlgorithm) { 856be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker RETURN_IF_SKIPPED; 8570ea406920af8313875866f13c9104129c08b2d76Jeff Tinker SessionId session = openSession(); 8580ea406920af8313875866f13c9104129c08b2d76Jeff Tinker ; 8590ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_string algorithm = "AES/CBC/NoPadding"; 8600ea406920af8313875866f13c9104129c08b2d76Jeff Tinker Status status = drmPlugin->setCipherAlgorithm(session, algorithm); 8610ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_TRUE(status == Status::OK || 8620ea406920af8313875866f13c9104129c08b2d76Jeff Tinker status == Status::ERROR_DRM_CANNOT_HANDLE); 8630ea406920af8313875866f13c9104129c08b2d76Jeff Tinker closeSession(session); 8640ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 8650ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 8660ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 8670ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Test that setting an invalid mac algorithm returns 8680ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * the expected status value. 8690ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 8700ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, SetMacInvalidAlgorithm) { 871be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker RETURN_IF_SKIPPED; 8720ea406920af8313875866f13c9104129c08b2d76Jeff Tinker SessionId session = openSession(); 8730ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_string algorithm; 8740ea406920af8313875866f13c9104129c08b2d76Jeff Tinker Status status = drmPlugin->setMacAlgorithm(session, algorithm); 8750ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::BAD_VALUE, status); 8760ea406920af8313875866f13c9104129c08b2d76Jeff Tinker closeSession(session); 8770ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 8780ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 8790ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 8800ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Test that setting a mac algorithm with no session returns 8810ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * the expected status value. 8820ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 8830ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, SetMacNullAlgorithmNoSession) { 884be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker RETURN_IF_SKIPPED; 8850ea406920af8313875866f13c9104129c08b2d76Jeff Tinker SessionId session; 8860ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_string algorithm = "HmacSHA256"; 8870ea406920af8313875866f13c9104129c08b2d76Jeff Tinker Status status = drmPlugin->setMacAlgorithm(session, algorithm); 8880ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::BAD_VALUE, status); 8890ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 8900ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 8910ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 8920ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Test that setting a valid mac algorithm returns 8930ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * the expected status value. It is not required that all 8940ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * vendor modules support this algorithm, but they must 8950ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * either accept it or return ERROR_DRM_CANNOT_HANDLE 8960ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 8970ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, SetMacAlgorithm) { 898be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker RETURN_IF_SKIPPED; 8990ea406920af8313875866f13c9104129c08b2d76Jeff Tinker SessionId session = openSession(); 9000ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_string algorithm = "HmacSHA256"; 9010ea406920af8313875866f13c9104129c08b2d76Jeff Tinker Status status = drmPlugin->setMacAlgorithm(session, algorithm); 9020ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_TRUE(status == Status::OK || 9030ea406920af8313875866f13c9104129c08b2d76Jeff Tinker status == Status::ERROR_DRM_CANNOT_HANDLE); 9040ea406920af8313875866f13c9104129c08b2d76Jeff Tinker closeSession(session); 9050ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 9060ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 9070ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 9080ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * The Generic* methods provide general purpose crypto operations 9090ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * that may be used for applications other than DRM. They leverage 9100ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * the hardware root of trust and secure key distribution mechanisms 9110ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * of a DRM system to enable app-specific crypto functionality where 9120ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * the crypto keys are not exposed outside of the trusted execution 9130ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * environment. 9140ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * 9150ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Generic encrypt/decrypt/sign/verify should fail on invalid 9160ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * inputs, e.g. empty sessionId 9170ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 9180ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, GenericEncryptNoSession) { 919be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker RETURN_IF_SKIPPED; 9200ea406920af8313875866f13c9104129c08b2d76Jeff Tinker SessionId session; 9210ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_vec<uint8_t> keyId, input, iv; 9220ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmPlugin->encrypt( 9230ea406920af8313875866f13c9104129c08b2d76Jeff Tinker session, keyId, input, iv, 9240ea406920af8313875866f13c9104129c08b2d76Jeff Tinker [&](Status status, const hidl_vec<uint8_t>&) { 9250ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::ERROR_DRM_SESSION_NOT_OPENED, status); 9260ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 9270ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 9280ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 9290ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 9300ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, GenericDecryptNoSession) { 931be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker RETURN_IF_SKIPPED; 9320ea406920af8313875866f13c9104129c08b2d76Jeff Tinker SessionId session; 9330ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_vec<uint8_t> keyId, input, iv; 9340ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmPlugin->decrypt( 9350ea406920af8313875866f13c9104129c08b2d76Jeff Tinker session, keyId, input, iv, 9360ea406920af8313875866f13c9104129c08b2d76Jeff Tinker [&](Status status, const hidl_vec<uint8_t>&) { 9370ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::ERROR_DRM_SESSION_NOT_OPENED, status); 9380ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 9390ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 9400ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 9410ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 9420ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, GenericSignNoSession) { 943be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker RETURN_IF_SKIPPED; 9440ea406920af8313875866f13c9104129c08b2d76Jeff Tinker SessionId session; 9450ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_vec<uint8_t> keyId, message; 9460ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmPlugin->sign( 9470ea406920af8313875866f13c9104129c08b2d76Jeff Tinker session, keyId, message, 9480ea406920af8313875866f13c9104129c08b2d76Jeff Tinker [&](Status status, const hidl_vec<uint8_t>&) { 9490ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::ERROR_DRM_SESSION_NOT_OPENED, status); 9500ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 9510ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 9520ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 9530ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 9540ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, GenericVerifyNoSession) { 955be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker RETURN_IF_SKIPPED; 9560ea406920af8313875866f13c9104129c08b2d76Jeff Tinker SessionId session; 9570ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_vec<uint8_t> keyId, message, signature; 9580ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmPlugin->verify( 9590ea406920af8313875866f13c9104129c08b2d76Jeff Tinker session, keyId, message, signature, [&](Status status, bool) { 9600ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::ERROR_DRM_SESSION_NOT_OPENED, status); 9610ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 9620ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 9630ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 9640ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 9650ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, GenericSignRSANoSession) { 966be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker RETURN_IF_SKIPPED; 9670ea406920af8313875866f13c9104129c08b2d76Jeff Tinker SessionId session; 9680ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_string algorithm; 9690ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_vec<uint8_t> message, wrappedKey; 9700ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmPlugin->signRSA(session, algorithm, message, wrappedKey, 9710ea406920af8313875866f13c9104129c08b2d76Jeff Tinker [&](Status status, const hidl_vec<uint8_t>&) { 9720ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::BAD_VALUE, status); 9730ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 9740ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 9750ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 9760ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 9770ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 9780ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Exercise the requiresSecureDecoderComponent method. Additional tests 9790ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * will verify positive cases with specific vendor content configurations. 9800ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Below we just test the negative cases. 9810ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 9820ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 9830ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 9840ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Verify that requiresSecureDecoderComponent handles empty mimetype. 9850ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 9860ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, RequiresSecureDecoderEmptyMimeType) { 987be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker RETURN_IF_SKIPPED; 9880ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_FALSE(cryptoPlugin->requiresSecureDecoderComponent("")); 9890ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 9900ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 9910ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 9920ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Verify that requiresSecureDecoderComponent handles invalid mimetype. 9930ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 9940ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, RequiresSecureDecoderInvalidMimeType) { 995be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker RETURN_IF_SKIPPED; 9960ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_FALSE(cryptoPlugin->requiresSecureDecoderComponent("bad")); 9970ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 9980ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 9990ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 1000f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker * Verify that requiresSecureDecoderComponent returns true for secure 1001f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker * configurations 1002f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker */ 1003f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff TinkerTEST_P(DrmHalVendorPluginTest, RequiresSecureDecoderConfig) { 1004be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker RETURN_IF_SKIPPED; 1005f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker for (auto config : contentConfigurations) { 1006f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker for (auto key : config.keys) { 1007f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker if (key.isSecure) { 1008f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker EXPECT_TRUE(cryptoPlugin->requiresSecureDecoderComponent(config.mimeType)); 1009f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker break; 1010f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker } 1011f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker } 1012f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker } 1013f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker} 1014f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 1015f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker/** 1016f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker * Event Handling tests 1017f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker */ 10183da372af677f8b3f6c9c2905d54e73a6c93e9b07Jeff Tinkerstruct ListenerEventArgs { 10193da372af677f8b3f6c9c2905d54e73a6c93e9b07Jeff Tinker EventType eventType; 10203da372af677f8b3f6c9c2905d54e73a6c93e9b07Jeff Tinker SessionId sessionId; 10213da372af677f8b3f6c9c2905d54e73a6c93e9b07Jeff Tinker hidl_vec<uint8_t> data; 10223da372af677f8b3f6c9c2905d54e73a6c93e9b07Jeff Tinker int64_t expiryTimeInMS; 10233da372af677f8b3f6c9c2905d54e73a6c93e9b07Jeff Tinker hidl_vec<KeyStatus> keyStatusList; 10243da372af677f8b3f6c9c2905d54e73a6c93e9b07Jeff Tinker bool hasNewUsableKey; 10253da372af677f8b3f6c9c2905d54e73a6c93e9b07Jeff Tinker}; 1026f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 10273da372af677f8b3f6c9c2905d54e73a6c93e9b07Jeff Tinkerconst char *kCallbackEvent = "SendEvent"; 10283da372af677f8b3f6c9c2905d54e73a6c93e9b07Jeff Tinkerconst char *kCallbackExpirationUpdate = "SendExpirationUpdate"; 10293da372af677f8b3f6c9c2905d54e73a6c93e9b07Jeff Tinkerconst char *kCallbackKeysChange = "SendKeysChange"; 10303da372af677f8b3f6c9c2905d54e73a6c93e9b07Jeff Tinker 10313da372af677f8b3f6c9c2905d54e73a6c93e9b07Jeff Tinkerclass TestDrmPluginListener 10323da372af677f8b3f6c9c2905d54e73a6c93e9b07Jeff Tinker : public ::testing::VtsHalHidlTargetCallbackBase<ListenerEventArgs>, 10333da372af677f8b3f6c9c2905d54e73a6c93e9b07Jeff Tinker public IDrmPluginListener { 1034f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinkerpublic: 10353da372af677f8b3f6c9c2905d54e73a6c93e9b07Jeff Tinker TestDrmPluginListener() { 10363da372af677f8b3f6c9c2905d54e73a6c93e9b07Jeff Tinker SetWaitTimeoutDefault(std::chrono::milliseconds(500)); 10373da372af677f8b3f6c9c2905d54e73a6c93e9b07Jeff Tinker } 1038f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker virtual ~TestDrmPluginListener() {} 1039f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 1040f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker virtual Return<void> sendEvent(EventType eventType, const hidl_vec<uint8_t>& sessionId, 1041f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker const hidl_vec<uint8_t>& data) override { 10423da372af677f8b3f6c9c2905d54e73a6c93e9b07Jeff Tinker ListenerEventArgs args; 10433da372af677f8b3f6c9c2905d54e73a6c93e9b07Jeff Tinker args.eventType = eventType; 10443da372af677f8b3f6c9c2905d54e73a6c93e9b07Jeff Tinker args.sessionId = sessionId; 10453da372af677f8b3f6c9c2905d54e73a6c93e9b07Jeff Tinker args.data = data; 10463da372af677f8b3f6c9c2905d54e73a6c93e9b07Jeff Tinker NotifyFromCallback(kCallbackEvent, args); 1047f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker return Void(); 1048f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker } 1049f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 1050f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker virtual Return<void> sendExpirationUpdate(const hidl_vec<uint8_t>& sessionId, 1051f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker int64_t expiryTimeInMS) override { 10523da372af677f8b3f6c9c2905d54e73a6c93e9b07Jeff Tinker ListenerEventArgs args; 10533da372af677f8b3f6c9c2905d54e73a6c93e9b07Jeff Tinker args.sessionId = sessionId; 10543da372af677f8b3f6c9c2905d54e73a6c93e9b07Jeff Tinker args.expiryTimeInMS = expiryTimeInMS; 10553da372af677f8b3f6c9c2905d54e73a6c93e9b07Jeff Tinker NotifyFromCallback(kCallbackExpirationUpdate, args); 1056f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker return Void(); 1057f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker } 1058f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 1059f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker virtual Return<void> sendKeysChange(const hidl_vec<uint8_t>& sessionId, 1060f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker const hidl_vec<KeyStatus>& keyStatusList, bool hasNewUsableKey) override { 10613da372af677f8b3f6c9c2905d54e73a6c93e9b07Jeff Tinker ListenerEventArgs args; 10623da372af677f8b3f6c9c2905d54e73a6c93e9b07Jeff Tinker args.sessionId = sessionId; 10633da372af677f8b3f6c9c2905d54e73a6c93e9b07Jeff Tinker args.keyStatusList = keyStatusList; 10643da372af677f8b3f6c9c2905d54e73a6c93e9b07Jeff Tinker args.hasNewUsableKey = hasNewUsableKey; 10653da372af677f8b3f6c9c2905d54e73a6c93e9b07Jeff Tinker NotifyFromCallback(kCallbackKeysChange, args); 1066f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker return Void(); 1067f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker } 1068f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker}; 1069f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 10703da372af677f8b3f6c9c2905d54e73a6c93e9b07Jeff Tinker 1071f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker/** 1072f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker * Simulate the plugin sending events. Make sure the listener 1073f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker * gets them. 1074f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker */ 1075f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff TinkerTEST_P(DrmHalVendorPluginTest, ListenerEvents) { 1076be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker RETURN_IF_SKIPPED; 1077f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker sp<TestDrmPluginListener> listener = new TestDrmPluginListener(); 1078f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker drmPlugin->setListener(listener); 1079f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker auto sessionId = openSession(); 10803da372af677f8b3f6c9c2905d54e73a6c93e9b07Jeff Tinker hidl_vec<uint8_t> data = {0, 1, 2}; 1081f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker EventType eventTypes[] = {EventType::PROVISION_REQUIRED, 1082f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker EventType::KEY_NEEDED, 1083f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker EventType::KEY_EXPIRED, 1084f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker EventType::VENDOR_DEFINED, 1085f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker EventType::SESSION_RECLAIMED}; 1086f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker for (auto eventType : eventTypes) { 1087f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker drmPlugin->sendEvent(eventType, sessionId, data); 10883da372af677f8b3f6c9c2905d54e73a6c93e9b07Jeff Tinker auto result = listener->WaitForCallback(kCallbackEvent); 10893da372af677f8b3f6c9c2905d54e73a6c93e9b07Jeff Tinker EXPECT_TRUE(result.no_timeout); 10903da372af677f8b3f6c9c2905d54e73a6c93e9b07Jeff Tinker EXPECT_TRUE(result.args); 10913da372af677f8b3f6c9c2905d54e73a6c93e9b07Jeff Tinker EXPECT_EQ(eventType, result.args->eventType); 10923da372af677f8b3f6c9c2905d54e73a6c93e9b07Jeff Tinker EXPECT_EQ(sessionId, result.args->sessionId); 10933da372af677f8b3f6c9c2905d54e73a6c93e9b07Jeff Tinker EXPECT_EQ(data, result.args->data); 1094f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker } 1095f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker closeSession(sessionId); 1096f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker} 1097f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 1098f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker/** 1099f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker * Simulate the plugin sending expiration updates and make sure 1100f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker * the listener gets them. 1101f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker */ 1102f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff TinkerTEST_P(DrmHalVendorPluginTest, ListenerExpirationUpdate) { 1103be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker RETURN_IF_SKIPPED; 1104f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker sp<TestDrmPluginListener> listener = new TestDrmPluginListener(); 1105f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker drmPlugin->setListener(listener); 1106f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker auto sessionId = openSession(); 1107f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker drmPlugin->sendExpirationUpdate(sessionId, 100); 11083da372af677f8b3f6c9c2905d54e73a6c93e9b07Jeff Tinker auto result = listener->WaitForCallback(kCallbackExpirationUpdate); 11093da372af677f8b3f6c9c2905d54e73a6c93e9b07Jeff Tinker EXPECT_TRUE(result.no_timeout); 11103da372af677f8b3f6c9c2905d54e73a6c93e9b07Jeff Tinker EXPECT_TRUE(result.args); 11113da372af677f8b3f6c9c2905d54e73a6c93e9b07Jeff Tinker EXPECT_EQ(sessionId, result.args->sessionId); 11123da372af677f8b3f6c9c2905d54e73a6c93e9b07Jeff Tinker EXPECT_EQ(100, result.args->expiryTimeInMS); 1113f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker closeSession(sessionId); 1114f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker} 1115f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 1116f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker/** 1117f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker * Simulate the plugin sending keys change and make sure 1118f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker * the listener gets them. 1119f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker */ 1120f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff TinkerTEST_P(DrmHalVendorPluginTest, ListenerKeysChange) { 1121be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker RETURN_IF_SKIPPED; 1122f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker sp<TestDrmPluginListener> listener = new TestDrmPluginListener(); 1123f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker drmPlugin->setListener(listener); 1124f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker auto sessionId = openSession(); 1125f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker const hidl_vec<KeyStatus> keyStatusList = { 1126f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker {{1}, KeyStatusType::USABLE}, 1127f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker {{2}, KeyStatusType::EXPIRED}, 1128f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker {{3}, KeyStatusType::OUTPUTNOTALLOWED}, 1129f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker {{4}, KeyStatusType::STATUSPENDING}, 1130f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker {{5}, KeyStatusType::INTERNALERROR}, 1131f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker }; 1132f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 1133f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker drmPlugin->sendKeysChange(sessionId, keyStatusList, true); 11343da372af677f8b3f6c9c2905d54e73a6c93e9b07Jeff Tinker auto result = listener->WaitForCallback(kCallbackKeysChange); 11353da372af677f8b3f6c9c2905d54e73a6c93e9b07Jeff Tinker EXPECT_TRUE(result.no_timeout); 11363da372af677f8b3f6c9c2905d54e73a6c93e9b07Jeff Tinker EXPECT_TRUE(result.args); 11373da372af677f8b3f6c9c2905d54e73a6c93e9b07Jeff Tinker EXPECT_EQ(sessionId, result.args->sessionId); 11383da372af677f8b3f6c9c2905d54e73a6c93e9b07Jeff Tinker EXPECT_EQ(keyStatusList, result.args->keyStatusList); 11399dee7287e8f533c14fac292348a45ef70fe1b938Jeff Tinker closeSession(sessionId); 1140f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker} 1141f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 1142f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker/** 1143f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker * Negative listener tests. Call send methods with no 1144f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker * listener set. 1145f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker */ 1146f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff TinkerTEST_P(DrmHalVendorPluginTest, NotListening) { 1147be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker RETURN_IF_SKIPPED; 1148f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker sp<TestDrmPluginListener> listener = new TestDrmPluginListener(); 1149f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker drmPlugin->setListener(listener); 1150f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker drmPlugin->setListener(nullptr); 1151f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 1152f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker SessionId sessionId; 11533da372af677f8b3f6c9c2905d54e73a6c93e9b07Jeff Tinker hidl_vec<uint8_t> data; 1154f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker hidl_vec<KeyStatus> keyStatusList; 1155f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker drmPlugin->sendEvent(EventType::PROVISION_REQUIRED, sessionId, data); 1156f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker drmPlugin->sendExpirationUpdate(sessionId, 100); 1157f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker drmPlugin->sendKeysChange(sessionId, keyStatusList, true); 11583da372af677f8b3f6c9c2905d54e73a6c93e9b07Jeff Tinker auto result = listener->WaitForCallbackAny( 11593da372af677f8b3f6c9c2905d54e73a6c93e9b07Jeff Tinker {kCallbackEvent, kCallbackExpirationUpdate, kCallbackKeysChange}); 11603da372af677f8b3f6c9c2905d54e73a6c93e9b07Jeff Tinker EXPECT_FALSE(result.no_timeout); 1161f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker} 1162f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 1163f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 1164f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker/** 11650ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * CryptoPlugin tests 11660ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 11670ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 11680ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 11690ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Exercise the NotifyResolution API. There is no observable result, 11700ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * just call the method for coverage. 11710ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 11720ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, NotifyResolution) { 1173be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker RETURN_IF_SKIPPED; 11740ea406920af8313875866f13c9104129c08b2d76Jeff Tinker cryptoPlugin->notifyResolution(1920, 1080); 11750ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 11760ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 11770ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 11780ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * getDecryptMemory allocates memory for decryption, then sets it 11790ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * as a shared buffer base in the crypto hal. The allocated and 11800ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * mapped IMemory is returned. 11810ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * 11820ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * @param size the size of the memory segment to allocate 11830ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * @param the index of the memory segment which will be used 11840ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * to refer to it for decryption. 11850ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 11860ea406920af8313875866f13c9104129c08b2d76Jeff Tinkersp<IMemory> DrmHalVendorPluginTest::getDecryptMemory(size_t size, 11870ea406920af8313875866f13c9104129c08b2d76Jeff Tinker size_t index) { 11880ea406920af8313875866f13c9104129c08b2d76Jeff Tinker sp<IAllocator> ashmemAllocator = IAllocator::getService("ashmem"); 11890ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_NE(ashmemAllocator, nullptr); 11900ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 11910ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_memory hidlMemory; 11920ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = ashmemAllocator->allocate( 11930ea406920af8313875866f13c9104129c08b2d76Jeff Tinker size, [&](bool success, const hidl_memory& memory) { 11940ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(success, true); 11950ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(memory.size(), size); 11960ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidlMemory = memory; 11970ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 11980ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 11990ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 12000ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 12010ea406920af8313875866f13c9104129c08b2d76Jeff Tinker sp<IMemory> mappedMemory = mapMemory(hidlMemory); 12020ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_NE(mappedMemory, nullptr); 12030ea406920af8313875866f13c9104129c08b2d76Jeff Tinker res = cryptoPlugin->setSharedBufferBase(hidlMemory, index); 12040ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 12050ea406920af8313875866f13c9104129c08b2d76Jeff Tinker return mappedMemory; 12060ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 12070ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 12080ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 12090ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Exercise the setMediaDrmSession method. setMediaDrmSession 12100ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * is used to associate a drm session with a crypto session. 12110ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 12120ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, SetMediaDrmSession) { 1213be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker RETURN_IF_SKIPPED; 12140ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto sessionId = openSession(); 12150ea406920af8313875866f13c9104129c08b2d76Jeff Tinker Status status = cryptoPlugin->setMediaDrmSession(sessionId); 12160ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::OK, status); 12170ea406920af8313875866f13c9104129c08b2d76Jeff Tinker closeSession(sessionId); 12180ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 12190ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 12200ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 12210ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * setMediaDrmSession with a closed session id 12220ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 12230ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_P(DrmHalVendorPluginTest, SetMediaDrmSessionClosedSession) { 1224be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker RETURN_IF_SKIPPED; 12250ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto sessionId = openSession(); 12260ea406920af8313875866f13c9104129c08b2d76Jeff Tinker closeSession(sessionId); 12270ea406920af8313875866f13c9104129c08b2d76Jeff Tinker Status status = cryptoPlugin->setMediaDrmSession(sessionId); 12280ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::ERROR_DRM_SESSION_NOT_OPENED, status); 12290ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 12300ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 12310ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 1232f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker * setMediaDrmSession with a empty session id: BAD_VALUE 1233f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker */ 1234f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff TinkerTEST_P(DrmHalVendorPluginTest, SetMediaDrmSessionEmptySession) { 1235be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker RETURN_IF_SKIPPED; 1236f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker SessionId sessionId; 1237f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker Status status = cryptoPlugin->setMediaDrmSession(sessionId); 1238f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker EXPECT_EQ(Status::BAD_VALUE, status); 1239f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker} 1240f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 1241f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker/** 12420ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Decrypt tests 12430ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 12440ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 12450ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerclass DrmHalVendorDecryptTest : public DrmHalVendorPluginTest { 12460ea406920af8313875866f13c9104129c08b2d76Jeff Tinker public: 12470ea406920af8313875866f13c9104129c08b2d76Jeff Tinker DrmHalVendorDecryptTest() = default; 12480ea406920af8313875866f13c9104129c08b2d76Jeff Tinker virtual ~DrmHalVendorDecryptTest() {} 12490ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 12500ea406920af8313875866f13c9104129c08b2d76Jeff Tinker protected: 12510ea406920af8313875866f13c9104129c08b2d76Jeff Tinker void fillRandom(const sp<IMemory>& memory); 12520ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_array<uint8_t, 16> toHidlArray(const vector<uint8_t>& vec) { 12530ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(vec.size(), 16u); 12540ea406920af8313875866f13c9104129c08b2d76Jeff Tinker return hidl_array<uint8_t, 16>(&vec[0]); 12550ea406920af8313875866f13c9104129c08b2d76Jeff Tinker } 1256f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker hidl_vec<KeyValue> queryKeyStatus(SessionId sessionId); 1257f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker void removeKeys(SessionId sessionId); 1258f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker uint32_t decrypt(Mode mode, bool isSecure, 1259f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker const hidl_array<uint8_t, 16>& keyId, uint8_t* iv, 1260f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker const hidl_vec<SubSample>& subSamples, const Pattern& pattern, 1261f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker const vector<uint8_t>& key, Status expectedStatus); 1262f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker void aes_ctr_decrypt(uint8_t* dest, uint8_t* src, uint8_t* iv, 1263f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker const hidl_vec<SubSample>& subSamples, const vector<uint8_t>& key); 1264f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker void aes_cbc_decrypt(uint8_t* dest, uint8_t* src, uint8_t* iv, 1265f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker const hidl_vec<SubSample>& subSamples, const vector<uint8_t>& key); 12660ea406920af8313875866f13c9104129c08b2d76Jeff Tinker}; 12670ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 12680ea406920af8313875866f13c9104129c08b2d76Jeff Tinkervoid DrmHalVendorDecryptTest::fillRandom(const sp<IMemory>& memory) { 12690ea406920af8313875866f13c9104129c08b2d76Jeff Tinker random_device rd; 12700ea406920af8313875866f13c9104129c08b2d76Jeff Tinker mt19937 rand(rd()); 12710ea406920af8313875866f13c9104129c08b2d76Jeff Tinker for (size_t i = 0; i < memory->getSize() / sizeof(uint32_t); i++) { 12720ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto p = static_cast<uint32_t*>( 12730ea406920af8313875866f13c9104129c08b2d76Jeff Tinker static_cast<void*>(memory->getPointer())); 12740ea406920af8313875866f13c9104129c08b2d76Jeff Tinker p[i] = rand(); 12750ea406920af8313875866f13c9104129c08b2d76Jeff Tinker } 12760ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 12770ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 1278f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinkerhidl_vec<KeyValue> DrmHalVendorDecryptTest::queryKeyStatus(SessionId sessionId) { 1279f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker hidl_vec<KeyValue> keyStatus; 1280f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker auto res = drmPlugin->queryKeyStatus(sessionId, 1281f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker [&](Status status, KeyedVector info) { 1282f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker EXPECT_EQ(Status::OK, status); 1283f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker keyStatus = info; 1284f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker }); 1285f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker EXPECT_OK(res); 1286f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker return keyStatus; 1287f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker} 1288f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 1289f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinkervoid DrmHalVendorDecryptTest::removeKeys(SessionId sessionId) { 1290f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker auto res = drmPlugin->removeKeys(sessionId); 1291f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker EXPECT_OK(res); 1292f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker} 1293f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 1294f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinkeruint32_t DrmHalVendorDecryptTest::decrypt(Mode mode, bool isSecure, 1295f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker const hidl_array<uint8_t, 16>& keyId, uint8_t* iv, 1296f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker const hidl_vec<SubSample>& subSamples, const Pattern& pattern, 1297f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker const vector<uint8_t>& key, Status expectedStatus) { 1298f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker const size_t kSegmentIndex = 0; 1299f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 1300f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker uint8_t localIv[AES_BLOCK_SIZE]; 1301f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker memcpy(localIv, iv, AES_BLOCK_SIZE); 1302f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 1303f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker size_t totalSize = 0; 1304f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker for (size_t i = 0; i < subSamples.size(); i++) { 1305f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker totalSize += subSamples[i].numBytesOfClearData; 1306f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker totalSize += subSamples[i].numBytesOfEncryptedData; 1307f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker } 1308f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 1309f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker // The first totalSize bytes of shared memory is the encrypted 1310f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker // input, the second totalSize bytes is the decrypted output. 1311f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker sp<IMemory> sharedMemory = 1312f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker getDecryptMemory(totalSize * 2, kSegmentIndex); 1313f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 1314f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker SharedBuffer sourceBuffer = { 1315f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker .bufferId = kSegmentIndex, .offset = 0, .size = totalSize}; 1316f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker fillRandom(sharedMemory); 1317f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 1318f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker DestinationBuffer destBuffer = {.type = BufferType::SHARED_MEMORY, 1319f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker {.bufferId = kSegmentIndex, 1320f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker .offset = totalSize, 1321f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker .size = totalSize}, 1322f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker .secureMemory = nullptr}; 1323f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker uint64_t offset = 0; 1324f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker uint32_t bytesWritten = 0; 1325f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker auto res = cryptoPlugin->decrypt(isSecure, keyId, localIv, mode, pattern, 1326f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker subSamples, sourceBuffer, offset, destBuffer, 1327f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker [&](Status status, uint32_t count, string detailedError) { 1328f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker EXPECT_EQ(expectedStatus, status) << "Unexpected decrypt status " << 1329f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker detailedError; 1330f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker bytesWritten = count; 1331f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker }); 1332f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker EXPECT_OK(res); 1333f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 1334f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker if (bytesWritten != totalSize) { 1335f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker return bytesWritten; 1336f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker } 1337f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker uint8_t* base = static_cast<uint8_t*>( 1338f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker static_cast<void*>(sharedMemory->getPointer())); 1339f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 1340f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker // generate reference vector 1341f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker vector<uint8_t> reference(totalSize); 1342f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 1343f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker memcpy(localIv, iv, AES_BLOCK_SIZE); 1344f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker switch (mode) { 1345f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker case Mode::UNENCRYPTED: 1346f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker memcpy(&reference[0], base, totalSize); 1347f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker break; 1348f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker case Mode::AES_CTR: 1349f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker aes_ctr_decrypt(&reference[0], base, localIv, subSamples, key); 1350f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker break; 1351f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker case Mode::AES_CBC: 1352f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker aes_cbc_decrypt(&reference[0], base, localIv, subSamples, key); 1353f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker break; 1354f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker case Mode::AES_CBC_CTS: 1355f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker EXPECT_TRUE(false) << "AES_CBC_CTS mode not supported"; 1356f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker break; 1357f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker } 1358f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 1359f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker // compare reference to decrypted data which is at base + total size 1360f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker EXPECT_EQ(0, memcmp(static_cast<void*>(&reference[0]), 1361f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker static_cast<void*>(base + totalSize), totalSize)) 1362f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker << "decrypt data mismatch"; 1363f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker return totalSize; 1364f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker} 1365f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 1366f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker/** 1367f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker * Decrypt a list of clear+encrypted subsamples using the specified key 1368f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker * in AES-CTR mode 1369f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker */ 1370f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinkervoid DrmHalVendorDecryptTest::aes_ctr_decrypt(uint8_t* dest, uint8_t* src, 1371f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker uint8_t* iv, const hidl_vec<SubSample>& subSamples, 1372f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker const vector<uint8_t>& key) { 1373f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 1374f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker AES_KEY decryptionKey; 1375f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker AES_set_encrypt_key(&key[0], 128, &decryptionKey); 1376f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 1377f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker size_t offset = 0; 1378f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker unsigned blockOffset = 0; 1379f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker uint8_t previousEncryptedCounter[AES_BLOCK_SIZE]; 1380f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker memset(previousEncryptedCounter, 0, AES_BLOCK_SIZE); 1381f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 1382f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker for (size_t i = 0; i < subSamples.size(); i++) { 1383f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker const SubSample& subSample = subSamples[i]; 1384f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 1385f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker if (subSample.numBytesOfClearData > 0) { 1386f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker memcpy(dest + offset, src + offset, subSample.numBytesOfClearData); 1387f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker offset += subSample.numBytesOfClearData; 1388f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker } 1389f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 1390f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker if (subSample.numBytesOfEncryptedData > 0) { 1391f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker AES_ctr128_encrypt(src + offset, dest + offset, 1392f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker subSample.numBytesOfEncryptedData, &decryptionKey, 1393f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker iv, previousEncryptedCounter, &blockOffset); 1394f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker offset += subSample.numBytesOfEncryptedData; 13950ea406920af8313875866f13c9104129c08b2d76Jeff Tinker } 13960ea406920af8313875866f13c9104129c08b2d76Jeff Tinker } 13970ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 13980ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 13990ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 1400f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker * Decrypt a list of clear+encrypted subsamples using the specified key 1401f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker * in AES-CBC mode 14020ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 1403f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinkervoid DrmHalVendorDecryptTest::aes_cbc_decrypt(uint8_t* dest, uint8_t* src, 1404f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker uint8_t* iv, const hidl_vec<SubSample>& subSamples, 1405f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker const vector<uint8_t>& key) { 1406f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker AES_KEY decryptionKey; 1407f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker AES_set_encrypt_key(&key[0], 128, &decryptionKey); 1408f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 1409f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker size_t offset = 0; 1410f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker size_t num = 0; 1411f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker size_t ecount_buf = 0; 1412f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker for (size_t i = 0; i < subSamples.size(); i++) { 1413f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker const SubSample& subSample = subSamples[i]; 1414f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 1415f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker memcpy(dest + offset, src + offset, subSample.numBytesOfClearData); 1416f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker offset += subSample.numBytesOfClearData; 1417f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 1418f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker AES_cbc_encrypt(src + offset, dest + offset, subSample.numBytesOfEncryptedData, 1419f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker &decryptionKey, iv, 0 /* decrypt */); 1420f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker offset += subSample.numBytesOfEncryptedData; 1421f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker } 1422f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker} 14230ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 1424f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 1425f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker/** 1426f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker * Test key status with empty session id, should return BAD_VALUE 1427f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker */ 1428f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff TinkerTEST_P(DrmHalVendorDecryptTest, QueryKeyStatusInvalidSession) { 1429be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker RETURN_IF_SKIPPED; 1430f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker SessionId sessionId; 1431f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker auto res = drmPlugin->queryKeyStatus(sessionId, 1432f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker [&](Status status, KeyedVector /* info */) { 1433f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker EXPECT_EQ(Status::BAD_VALUE, status); 1434f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker }); 1435f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker EXPECT_OK(res); 1436f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker} 1437f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 1438f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 1439f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker/** 1440f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker * Test key status. There should be no key status prior to loading keys 1441f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker */ 1442f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff TinkerTEST_P(DrmHalVendorDecryptTest, QueryKeyStatusWithNoKeys) { 1443be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker RETURN_IF_SKIPPED; 1444f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker auto sessionId = openSession(); 1445f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker auto keyStatus = queryKeyStatus(sessionId); 1446f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker EXPECT_EQ(0u, keyStatus.size()); 1447f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker closeSession(sessionId); 1448f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker} 1449f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 1450f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 1451f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker/** 1452f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker * Test key status. There should be key status after loading keys. 1453f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker */ 1454f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff TinkerTEST_P(DrmHalVendorDecryptTest, QueryKeyStatus) { 1455be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker RETURN_IF_SKIPPED; 1456f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker for (auto config : contentConfigurations) { 14570ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto sessionId = openSession(); 14580ea406920af8313875866f13c9104129c08b2d76Jeff Tinker loadKeys(sessionId, config); 1459f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker auto keyStatus = queryKeyStatus(sessionId); 1460f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker EXPECT_NE(0u, keyStatus.size()); 1461f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker closeSession(sessionId); 1462f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker } 1463f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker} 14640ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 1465f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker/** 1466f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker * Positive decrypt test. "Decrypt" a single clear segment and verify. 1467f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker */ 1468f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff TinkerTEST_P(DrmHalVendorDecryptTest, ClearSegmentTest) { 1469be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker RETURN_IF_SKIPPED; 1470f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker for (auto config : contentConfigurations) { 1471f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker for (auto key : config.keys) { 1472f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker const size_t kSegmentSize = 1024; 1473f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker vector<uint8_t> iv(AES_BLOCK_SIZE, 0); 1474f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker const Pattern noPattern = {0, 0}; 1475f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker const vector<SubSample> subSamples = {{.numBytesOfClearData = kSegmentSize, 1476f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker .numBytesOfEncryptedData = 0}}; 1477f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker auto sessionId = openSession(); 1478f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker loadKeys(sessionId, config); 1479f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 1480f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker Status status = cryptoPlugin->setMediaDrmSession(sessionId); 1481f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker EXPECT_EQ(Status::OK, status); 1482f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 1483f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker uint32_t byteCount = decrypt(Mode::UNENCRYPTED, key.isSecure, toHidlArray(key.keyId), 1484f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker &iv[0], subSamples, noPattern, key.clearContentKey, Status::OK); 1485f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker EXPECT_EQ(kSegmentSize, byteCount); 1486f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 1487f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker closeSession(sessionId); 1488f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker } 1489f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker } 1490f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker} 14910ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 1492f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker/** 1493f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker * Positive decrypt test. Decrypt a single segment using aes_ctr. 1494f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker * Verify data matches. 1495f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker */ 1496f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff TinkerTEST_P(DrmHalVendorDecryptTest, EncryptedAesCtrSegmentTest) { 1497be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker RETURN_IF_SKIPPED; 1498f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker for (auto config : contentConfigurations) { 1499f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker for (auto key : config.keys) { 1500f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker const size_t kSegmentSize = 1024; 1501f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker vector<uint8_t> iv(AES_BLOCK_SIZE, 0); 1502f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker const Pattern noPattern = {0, 0}; 1503f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker const vector<SubSample> subSamples = {{.numBytesOfClearData = kSegmentSize, 1504f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker .numBytesOfEncryptedData = 0}}; 1505f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker auto sessionId = openSession(); 1506f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker loadKeys(sessionId, config); 1507f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 1508f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker Status status = cryptoPlugin->setMediaDrmSession(sessionId); 1509f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker EXPECT_EQ(Status::OK, status); 1510f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 1511f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker uint32_t byteCount = decrypt(Mode::AES_CTR, key.isSecure, toHidlArray(key.keyId), 1512f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker &iv[0], subSamples, noPattern, key.clearContentKey, Status::OK); 1513f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker EXPECT_EQ(kSegmentSize, byteCount); 1514f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 1515f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker closeSession(sessionId); 1516f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker } 1517f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker } 1518f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker} 15190ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 1520f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker/** 1521f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker * Negative decrypt test. Decrypt without loading keys. 1522f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker */ 1523f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff TinkerTEST_P(DrmHalVendorDecryptTest, EncryptedAesCtrSegmentTestNoKeys) { 1524be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker RETURN_IF_SKIPPED; 1525f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker for (auto config : contentConfigurations) { 1526f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker for (auto key : config.keys) { 1527f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker vector<uint8_t> iv(AES_BLOCK_SIZE, 0); 1528f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker const Pattern noPattern = {0, 0}; 1529f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker const vector<SubSample> subSamples = {{.numBytesOfClearData = 256, 1530f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker .numBytesOfEncryptedData = 256}}; 1531f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker auto sessionId = openSession(); 1532f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 1533f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker Status status = cryptoPlugin->setMediaDrmSession(sessionId); 1534f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker EXPECT_EQ(Status::OK, status); 1535f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 1536f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker uint32_t byteCount = decrypt(Mode::AES_CTR, key.isSecure, 1537f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker toHidlArray(key.keyId), &iv[0], subSamples, noPattern, 1538f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker key.clearContentKey, Status::ERROR_DRM_NO_LICENSE); 1539f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker EXPECT_EQ(0u, byteCount); 1540f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 1541f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker closeSession(sessionId); 1542f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker } 15430ea406920af8313875866f13c9104129c08b2d76Jeff Tinker } 15440ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 15450ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 15460ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 1547f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker * Test key removal. Load keys then remove them and verify that 1548f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker * decryption can't be performed. 1549f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker */ 1550f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff TinkerTEST_P(DrmHalVendorDecryptTest, AttemptDecryptWithKeysRemoved) { 1551be310b2b77fbde99af326263a9ee6995225c4284Jeff Tinker RETURN_IF_SKIPPED; 1552f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker for (auto config : contentConfigurations) { 1553f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker for (auto key : config.keys) { 1554f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker vector<uint8_t> iv(AES_BLOCK_SIZE, 0); 1555f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker const Pattern noPattern = {0, 0}; 1556f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker const vector<SubSample> subSamples = {{.numBytesOfClearData = 256, 1557f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker .numBytesOfEncryptedData = 256}}; 1558f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker auto sessionId = openSession(); 1559f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 1560f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker Status status = cryptoPlugin->setMediaDrmSession(sessionId); 1561f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker EXPECT_EQ(Status::OK, status); 1562f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 1563f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker loadKeys(sessionId, config); 1564f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker removeKeys(sessionId); 1565f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 1566f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker uint32_t byteCount = decrypt(Mode::AES_CTR, key.isSecure, 1567f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker toHidlArray(key.keyId), &iv[0], subSamples, noPattern, 15689dee7287e8f533c14fac292348a45ef70fe1b938Jeff Tinker key.clearContentKey, Status::ERROR_DRM_NO_LICENSE); 1569f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker EXPECT_EQ(0u, byteCount); 1570f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 1571f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker closeSession(sessionId); 1572f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker } 1573f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker } 1574f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker} 1575f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 1576f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 1577f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker/** 15780ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Instantiate the set of test cases for each vendor module 15790ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 15800ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 15810ea406920af8313875866f13c9104129c08b2d76Jeff TinkerINSTANTIATE_TEST_CASE_P( 15820ea406920af8313875866f13c9104129c08b2d76Jeff Tinker DrmHalVendorFactoryTestCases, DrmHalVendorFactoryTest, 1583f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker testing::ValuesIn(gVendorModules->getPathList())); 15840ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 15850ea406920af8313875866f13c9104129c08b2d76Jeff TinkerINSTANTIATE_TEST_CASE_P( 15860ea406920af8313875866f13c9104129c08b2d76Jeff Tinker DrmHalVendorPluginTestCases, DrmHalVendorPluginTest, 1587f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker testing::ValuesIn(gVendorModules->getPathList())); 15880ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 15890ea406920af8313875866f13c9104129c08b2d76Jeff TinkerINSTANTIATE_TEST_CASE_P( 15900ea406920af8313875866f13c9104129c08b2d76Jeff Tinker DrmHalVendorDecryptTestCases, DrmHalVendorDecryptTest, 1591f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker testing::ValuesIn(gVendorModules->getPathList())); 15920ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 15930ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerint main(int argc, char** argv) { 1594f50e7a7495d81f29ed75e4df110e104a7d6de19aJeff Tinker#if defined(__LP64__) 1595f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker const char* kModulePath = "/data/local/tmp/64/lib"; 1596f50e7a7495d81f29ed75e4df110e104a7d6de19aJeff Tinker#else 1597f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker const char* kModulePath = "/data/local/tmp/32/lib"; 1598f50e7a7495d81f29ed75e4df110e104a7d6de19aJeff Tinker#endif 1599f50e7a7495d81f29ed75e4df110e104a7d6de19aJeff Tinker gVendorModules = new drm_vts::VendorModules(kModulePath); 1600f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker if (gVendorModules->getPathList().size() == 0) { 1601f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker std::cerr << "No vendor modules found in " << kModulePath << 1602f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker ", exiting" << std::endl; 1603f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker exit(-1); 1604f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker } 16050ea406920af8313875866f13c9104129c08b2d76Jeff Tinker ::testing::InitGoogleTest(&argc, argv); 16060ea406920af8313875866f13c9104129c08b2d76Jeff Tinker return RUN_ALL_TESTS(); 16070ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 1608