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_clearkey_test@1.0" 180ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 190ea406920af8313875866f13c9104129c08b2d76Jeff Tinker#include <android-base/logging.h> 200ea406920af8313875866f13c9104129c08b2d76Jeff Tinker#include <android/hardware/drm/1.0/ICryptoFactory.h> 210ea406920af8313875866f13c9104129c08b2d76Jeff Tinker#include <android/hardware/drm/1.0/ICryptoPlugin.h> 220ea406920af8313875866f13c9104129c08b2d76Jeff Tinker#include <android/hardware/drm/1.0/IDrmFactory.h> 230ea406920af8313875866f13c9104129c08b2d76Jeff Tinker#include <android/hardware/drm/1.0/IDrmPlugin.h> 240ea406920af8313875866f13c9104129c08b2d76Jeff Tinker#include <android/hardware/drm/1.0/types.h> 250ea406920af8313875866f13c9104129c08b2d76Jeff Tinker#include <android/hidl/allocator/1.0/IAllocator.h> 260ea406920af8313875866f13c9104129c08b2d76Jeff Tinker#include <gtest/gtest.h> 270ea406920af8313875866f13c9104129c08b2d76Jeff Tinker#include <hidl/HidlSupport.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 "VtsHalHidlTargetTestBase.h" 350ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 360ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hardware::drm::V1_0::BufferType; 370ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hardware::drm::V1_0::DestinationBuffer; 380ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hardware::drm::V1_0::ICryptoFactory; 390ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hardware::drm::V1_0::ICryptoPlugin; 400ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hardware::drm::V1_0::IDrmFactory; 410ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hardware::drm::V1_0::IDrmPlugin; 420ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hardware::drm::V1_0::KeyedVector; 430ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hardware::drm::V1_0::KeyValue; 440ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hardware::drm::V1_0::KeyRequestType; 450ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hardware::drm::V1_0::KeyType; 460ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hardware::drm::V1_0::Mode; 470ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hardware::drm::V1_0::Pattern; 480ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hardware::drm::V1_0::SecureStop; 490ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hardware::drm::V1_0::SecureStopId; 500ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hardware::drm::V1_0::SessionId; 510ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hardware::drm::V1_0::SharedBuffer; 520ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hardware::drm::V1_0::Status; 530ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hardware::drm::V1_0::SubSample; 540ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 550ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hardware::hidl_array; 560ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hardware::hidl_string; 570ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hardware::hidl_memory; 580ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hardware::hidl_vec; 590ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hardware::Return; 600ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hidl::allocator::V1_0::IAllocator; 610ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::hidl::memory::V1_0::IMemory; 620ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing ::android::sp; 630ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 640ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing std::string; 650ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing std::unique_ptr; 660ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing std::random_device; 670ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing std::map; 680ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing std::mt19937; 690ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerusing std::vector; 700ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 710ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 720ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * These clearkey tests use white box knowledge of the legacy clearkey 730ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * plugin to verify that the HIDL HAL services and interfaces are working. 740ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * It is not intended to verify any vendor's HAL implementation. If you 750ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * are looking for vendor HAL tests, see drm_hal_vendor_test.cpp 760ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 770ea406920af8313875866f13c9104129c08b2d76Jeff Tinker#define ASSERT_OK(ret) ASSERT_TRUE(ret.isOk()) 780ea406920af8313875866f13c9104129c08b2d76Jeff Tinker#define EXPECT_OK(ret) EXPECT_TRUE(ret.isOk()) 790ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 800ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerstatic const uint8_t kClearKeyUUID[16] = { 810ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 0x10, 0x77, 0xEF, 0xEC, 0xC0, 0xB2, 0x4D, 0x02, 820ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 0xAC, 0xE3, 0x3C, 0x1E, 0x52, 0xE2, 0xFB, 0x4B}; 830ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 840ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerstatic const uint8_t kInvalidUUID[16] = { 850ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80, 860ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80}; 870ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 880ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerclass DrmHalClearkeyFactoryTest : public ::testing::VtsHalHidlTargetTestBase { 890ea406920af8313875866f13c9104129c08b2d76Jeff Tinker public: 900ea406920af8313875866f13c9104129c08b2d76Jeff Tinker virtual void SetUp() override { 910ea406920af8313875866f13c9104129c08b2d76Jeff Tinker const ::testing::TestInfo* const test_info = 920ea406920af8313875866f13c9104129c08b2d76Jeff Tinker ::testing::UnitTest::GetInstance()->current_test_info(); 930ea406920af8313875866f13c9104129c08b2d76Jeff Tinker ALOGD("Running test %s.%s", test_info->test_case_name(), 940ea406920af8313875866f13c9104129c08b2d76Jeff Tinker test_info->name()); 950ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 960ea406920af8313875866f13c9104129c08b2d76Jeff Tinker drmFactory = 97a0b44e644a89b1ab6712c549256828fb22820cccJeff Tinker ::testing::VtsHalHidlTargetTestBase::getService<IDrmFactory>(); 980ea406920af8313875866f13c9104129c08b2d76Jeff Tinker ASSERT_NE(drmFactory, nullptr); 990ea406920af8313875866f13c9104129c08b2d76Jeff Tinker cryptoFactory = 100a0b44e644a89b1ab6712c549256828fb22820cccJeff Tinker ::testing::VtsHalHidlTargetTestBase::getService<ICryptoFactory>(); 1010ea406920af8313875866f13c9104129c08b2d76Jeff Tinker ASSERT_NE(cryptoFactory, nullptr); 1020ea406920af8313875866f13c9104129c08b2d76Jeff Tinker } 1030ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 1040ea406920af8313875866f13c9104129c08b2d76Jeff Tinker virtual void TearDown() override {} 1050ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 1060ea406920af8313875866f13c9104129c08b2d76Jeff Tinker protected: 1070ea406920af8313875866f13c9104129c08b2d76Jeff Tinker sp<IDrmFactory> drmFactory; 1080ea406920af8313875866f13c9104129c08b2d76Jeff Tinker sp<ICryptoFactory> cryptoFactory; 1090ea406920af8313875866f13c9104129c08b2d76Jeff Tinker}; 1100ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 1110ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 1120ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Ensure the factory supports the clearkey scheme UUID 1130ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 1140ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_F(DrmHalClearkeyFactoryTest, ClearKeyPluginSupported) { 1150ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_TRUE(drmFactory->isCryptoSchemeSupported(kClearKeyUUID)); 1160ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_TRUE(cryptoFactory->isCryptoSchemeSupported(kClearKeyUUID)); 1170ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 1180ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 1190ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 1200ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Ensure the factory doesn't support an invalid scheme UUID 1210ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 1220ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_F(DrmHalClearkeyFactoryTest, InvalidPluginNotSupported) { 1230ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_FALSE(drmFactory->isCryptoSchemeSupported(kInvalidUUID)); 1240ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_FALSE(cryptoFactory->isCryptoSchemeSupported(kInvalidUUID)); 1250ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 1260ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 1270ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 128f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker * Ensure the factory doesn't support an empty UUID 129f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker */ 130f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff TinkerTEST_F(DrmHalClearkeyFactoryTest, EmptyPluginUUIDNotSupported) { 131f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker hidl_array<uint8_t, 16> emptyUUID; 132a33256b811e29cd8887c00b671cee1ef5f6de8f8Jeff Tinker memset(emptyUUID.data(), 0, 16); 133f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker EXPECT_FALSE(drmFactory->isCryptoSchemeSupported(emptyUUID)); 134f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker EXPECT_FALSE(cryptoFactory->isCryptoSchemeSupported(emptyUUID)); 135f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker} 136f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 137f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker/** 138f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker * Ensure empty content type is not supported 139f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker */ 140f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff TinkerTEST_F(DrmHalClearkeyFactoryTest, EmptyContentTypeNotSupported) { 141f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker hidl_string empty; 142f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker EXPECT_FALSE(drmFactory->isContentTypeSupported(empty)); 143f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker} 144f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 145f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker/** 146f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker * Ensure invalid content type is not supported 147f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker */ 148f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff TinkerTEST_F(DrmHalClearkeyFactoryTest, InvalidContentTypeNotSupported) { 149f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker hidl_string invalid("abcdabcd"); 150f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker EXPECT_FALSE(drmFactory->isContentTypeSupported(invalid)); 151f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker} 152f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 153f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker/** 154f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker * Ensure valid content type is supported 155f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker */ 156f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff TinkerTEST_F(DrmHalClearkeyFactoryTest, ValidContentTypeSupported) { 157f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker hidl_string cencType("cenc"); 158f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker EXPECT_TRUE(drmFactory->isContentTypeSupported(cencType)); 159f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker} 160f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 161f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker/** 1620ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Ensure clearkey drm plugin can be created 1630ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 1640ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_F(DrmHalClearkeyFactoryTest, CreateClearKeyDrmPlugin) { 1650ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_string packageName("android.hardware.drm.test"); 1660ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmFactory->createPlugin( 1670ea406920af8313875866f13c9104129c08b2d76Jeff Tinker kClearKeyUUID, packageName, 1680ea406920af8313875866f13c9104129c08b2d76Jeff Tinker [&](Status status, const sp<IDrmPlugin>& plugin) { 1690ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::OK, status); 1700ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_NE(plugin, nullptr); 1710ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 1720ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 1730ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 1740ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 1750ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 1760ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Ensure clearkey crypto plugin can be created 1770ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 1780ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_F(DrmHalClearkeyFactoryTest, CreateClearKeyCryptoPlugin) { 1790ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_vec<uint8_t> initVec; 1800ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = cryptoFactory->createPlugin( 1810ea406920af8313875866f13c9104129c08b2d76Jeff Tinker kClearKeyUUID, initVec, 1820ea406920af8313875866f13c9104129c08b2d76Jeff Tinker [&](Status status, const sp<ICryptoPlugin>& plugin) { 1830ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::OK, status); 1840ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_NE(plugin, nullptr); 1850ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 1860ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 1870ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 1880ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 1890ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 1900ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Ensure invalid drm plugin can't be created 1910ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 1920ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_F(DrmHalClearkeyFactoryTest, CreateInvalidDrmPlugin) { 1930ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_string packageName("android.hardware.drm.test"); 1940ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmFactory->createPlugin( 1950ea406920af8313875866f13c9104129c08b2d76Jeff Tinker kInvalidUUID, packageName, 1960ea406920af8313875866f13c9104129c08b2d76Jeff Tinker [&](Status status, const sp<IDrmPlugin>& plugin) { 1970ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::ERROR_DRM_CANNOT_HANDLE, status); 1980ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(plugin, nullptr); 1990ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 2000ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 2010ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 2020ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 2030ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 2040ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Ensure invalid crypto plugin can't be created 2050ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 2060ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_F(DrmHalClearkeyFactoryTest, CreateInvalidCryptoPlugin) { 2070ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_vec<uint8_t> initVec; 2080ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = cryptoFactory->createPlugin( 2090ea406920af8313875866f13c9104129c08b2d76Jeff Tinker kInvalidUUID, initVec, 2100ea406920af8313875866f13c9104129c08b2d76Jeff Tinker [&](Status status, const sp<ICryptoPlugin>& plugin) { 2110ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::ERROR_DRM_CANNOT_HANDLE, status); 2120ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(plugin, nullptr); 2130ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 2140ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 2150ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 2160ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 2170ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerclass DrmHalClearkeyPluginTest : public DrmHalClearkeyFactoryTest { 2180ea406920af8313875866f13c9104129c08b2d76Jeff Tinker public: 2190ea406920af8313875866f13c9104129c08b2d76Jeff Tinker virtual void SetUp() override { 2200ea406920af8313875866f13c9104129c08b2d76Jeff Tinker // Create factories 2210ea406920af8313875866f13c9104129c08b2d76Jeff Tinker DrmHalClearkeyFactoryTest::SetUp(); 2220ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 2230ea406920af8313875866f13c9104129c08b2d76Jeff Tinker ASSERT_NE(drmFactory, nullptr); 2240ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_string packageName("android.hardware.drm.test"); 2250ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmFactory->createPlugin( 2260ea406920af8313875866f13c9104129c08b2d76Jeff Tinker kClearKeyUUID, packageName, 2270ea406920af8313875866f13c9104129c08b2d76Jeff Tinker [this](Status status, const sp<IDrmPlugin>& plugin) { 2280ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::OK, status); 2290ea406920af8313875866f13c9104129c08b2d76Jeff Tinker ASSERT_NE(plugin, nullptr); 2300ea406920af8313875866f13c9104129c08b2d76Jeff Tinker drmPlugin = plugin; 2310ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 2320ea406920af8313875866f13c9104129c08b2d76Jeff Tinker ASSERT_OK(res); 2330ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 2340ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_vec<uint8_t> initVec; 2350ea406920af8313875866f13c9104129c08b2d76Jeff Tinker res = cryptoFactory->createPlugin( 2360ea406920af8313875866f13c9104129c08b2d76Jeff Tinker kClearKeyUUID, initVec, 2370ea406920af8313875866f13c9104129c08b2d76Jeff Tinker [this](Status status, const sp<ICryptoPlugin>& plugin) { 2380ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::OK, status); 2390ea406920af8313875866f13c9104129c08b2d76Jeff Tinker ASSERT_NE(plugin, nullptr); 2400ea406920af8313875866f13c9104129c08b2d76Jeff Tinker cryptoPlugin = plugin; 2410ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 2420ea406920af8313875866f13c9104129c08b2d76Jeff Tinker ASSERT_OK(res); 2430ea406920af8313875866f13c9104129c08b2d76Jeff Tinker } 2440ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 2450ea406920af8313875866f13c9104129c08b2d76Jeff Tinker virtual void TearDown() override {} 2460ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 2470ea406920af8313875866f13c9104129c08b2d76Jeff Tinker SessionId openSession(); 2480ea406920af8313875866f13c9104129c08b2d76Jeff Tinker void closeSession(const SessionId& sessionId); 2496799c3a5c597813154e20837c58703eba7996dfeRyan Campbell hidl_vec<uint8_t> loadKeys(const SessionId& sessionId, const KeyType& type); 2500ea406920af8313875866f13c9104129c08b2d76Jeff Tinker sp<IMemory> getDecryptMemory(size_t size, size_t index); 2510ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 2520ea406920af8313875866f13c9104129c08b2d76Jeff Tinker protected: 2530ea406920af8313875866f13c9104129c08b2d76Jeff Tinker sp<IDrmPlugin> drmPlugin; 2540ea406920af8313875866f13c9104129c08b2d76Jeff Tinker sp<ICryptoPlugin> cryptoPlugin; 2550ea406920af8313875866f13c9104129c08b2d76Jeff Tinker}; 2560ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 2570ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 2580ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * DrmPlugin tests 2590ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 2600ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 2610ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 2620ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Test that the plugin can return a provision request. Since 2630ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * the clearkey plugin doesn't support provisioning, it is 2640ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * expected to return Status::ERROR_DRM_CANNOT_HANDLE. 2650ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 2660ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_F(DrmHalClearkeyPluginTest, GetProvisionRequest) { 2670ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_string certificateType; 2680ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_string certificateAuthority; 2690ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmPlugin->getProvisionRequest( 2700ea406920af8313875866f13c9104129c08b2d76Jeff Tinker certificateType, certificateAuthority, 2710ea406920af8313875866f13c9104129c08b2d76Jeff Tinker [&](Status status, const hidl_vec<uint8_t>&, const hidl_string&) { 2720ea406920af8313875866f13c9104129c08b2d76Jeff Tinker // clearkey doesn't require provisioning 2730ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::ERROR_DRM_CANNOT_HANDLE, status); 2740ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 2750ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 2760ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 2770ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 2780ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 2790ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * The DRM HAL should return BAD_VALUE if an empty provisioning 2800ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * response is provided. 2810ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 2820ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_F(DrmHalClearkeyPluginTest, ProvideEmptyProvisionResponse) { 2830ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_vec<uint8_t> response; 2840ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmPlugin->provideProvisionResponse( 2850ea406920af8313875866f13c9104129c08b2d76Jeff Tinker response, [&](Status status, const hidl_vec<uint8_t>&, 2860ea406920af8313875866f13c9104129c08b2d76Jeff Tinker const hidl_vec<uint8_t>&) { 2870ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::BAD_VALUE, status); 2880ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 2890ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 2900ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 2910ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 2920ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 2930ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Helper method to open a session and verify that a non-empty 2940ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * session ID is returned 2950ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 2960ea406920af8313875866f13c9104129c08b2d76Jeff TinkerSessionId DrmHalClearkeyPluginTest::openSession() { 2970ea406920af8313875866f13c9104129c08b2d76Jeff Tinker SessionId sessionId; 2980ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 2990ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmPlugin->openSession( 3000ea406920af8313875866f13c9104129c08b2d76Jeff Tinker [&sessionId](Status status, const SessionId& id) { 3010ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::OK, status); 3020ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_NE(0u, id.size()); 3030ea406920af8313875866f13c9104129c08b2d76Jeff Tinker sessionId = id; 3040ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 3050ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 3060ea406920af8313875866f13c9104129c08b2d76Jeff Tinker return sessionId; 3070ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 3080ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 3090ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 3100ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Helper method to close a session 3110ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 3120ea406920af8313875866f13c9104129c08b2d76Jeff Tinkervoid DrmHalClearkeyPluginTest::closeSession(const SessionId& sessionId) { 3130ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto result = drmPlugin->closeSession(sessionId); 3140ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::OK, result); 3150ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 3160ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 3170ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 3186799c3a5c597813154e20837c58703eba7996dfeRyan Campbell * Helper method to load keys for subsequent decrypt tests. 3196799c3a5c597813154e20837c58703eba7996dfeRyan Campbell * These tests use predetermined key request/response to 3206799c3a5c597813154e20837c58703eba7996dfeRyan Campbell * avoid requiring a round trip to a license server. 3216799c3a5c597813154e20837c58703eba7996dfeRyan Campbell */ 3226799c3a5c597813154e20837c58703eba7996dfeRyan Campbellhidl_vec<uint8_t> DrmHalClearkeyPluginTest::loadKeys( 3236799c3a5c597813154e20837c58703eba7996dfeRyan Campbell const SessionId& sessionId, const KeyType& type = KeyType::STREAMING) { 3246799c3a5c597813154e20837c58703eba7996dfeRyan Campbell hidl_vec<uint8_t> initData = { 3256799c3a5c597813154e20837c58703eba7996dfeRyan Campbell // BMFF box header (4 bytes size + 'pssh') 3266799c3a5c597813154e20837c58703eba7996dfeRyan Campbell 0x00, 0x00, 0x00, 0x34, 0x70, 0x73, 0x73, 0x68, 3276799c3a5c597813154e20837c58703eba7996dfeRyan Campbell // full box header (version = 1 flags = 0) 3286799c3a5c597813154e20837c58703eba7996dfeRyan Campbell 0x01, 0x00, 0x00, 0x00, 3296799c3a5c597813154e20837c58703eba7996dfeRyan Campbell // system id 3306799c3a5c597813154e20837c58703eba7996dfeRyan Campbell 0x10, 0x77, 0xef, 0xec, 0xc0, 0xb2, 0x4d, 0x02, 0xac, 0xe3, 0x3c, 0x1e, 3316799c3a5c597813154e20837c58703eba7996dfeRyan Campbell 0x52, 0xe2, 0xfb, 0x4b, 3326799c3a5c597813154e20837c58703eba7996dfeRyan Campbell // number of key ids 3336799c3a5c597813154e20837c58703eba7996dfeRyan Campbell 0x00, 0x00, 0x00, 0x01, 3346799c3a5c597813154e20837c58703eba7996dfeRyan Campbell // key id 3356799c3a5c597813154e20837c58703eba7996dfeRyan Campbell 0x60, 0x06, 0x1e, 0x01, 0x7e, 0x47, 0x7e, 0x87, 0x7e, 0x57, 0xd0, 0x0d, 3366799c3a5c597813154e20837c58703eba7996dfeRyan Campbell 0x1e, 0xd0, 0x0d, 0x1e, 3376799c3a5c597813154e20837c58703eba7996dfeRyan Campbell // size of data, must be zero 3386799c3a5c597813154e20837c58703eba7996dfeRyan Campbell 0x00, 0x00, 0x00, 0x00}; 3396799c3a5c597813154e20837c58703eba7996dfeRyan Campbell 3406799c3a5c597813154e20837c58703eba7996dfeRyan Campbell hidl_vec<uint8_t> expectedKeyRequest = { 3416799c3a5c597813154e20837c58703eba7996dfeRyan Campbell 0x7b, 0x22, 0x6b, 0x69, 0x64, 0x73, 0x22, 0x3a, 0x5b, 0x22, 0x59, 3426799c3a5c597813154e20837c58703eba7996dfeRyan Campbell 0x41, 0x59, 0x65, 0x41, 0x58, 0x35, 0x48, 0x66, 0x6f, 0x64, 0x2b, 3436799c3a5c597813154e20837c58703eba7996dfeRyan Campbell 0x56, 0x39, 0x41, 0x4e, 0x48, 0x74, 0x41, 0x4e, 0x48, 0x67, 0x22, 3446799c3a5c597813154e20837c58703eba7996dfeRyan Campbell 0x5d, 0x2c, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x22, 0x74, 3456799c3a5c597813154e20837c58703eba7996dfeRyan Campbell 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x72, 0x79, 0x22, 0x7d}; 3466799c3a5c597813154e20837c58703eba7996dfeRyan Campbell 3476799c3a5c597813154e20837c58703eba7996dfeRyan Campbell hidl_vec<uint8_t> knownKeyResponse = { 3486799c3a5c597813154e20837c58703eba7996dfeRyan Campbell 0x7b, 0x22, 0x6b, 0x65, 0x79, 0x73, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 3496799c3a5c597813154e20837c58703eba7996dfeRyan Campbell 0x6b, 0x74, 0x79, 0x22, 0x3a, 0x22, 0x6f, 0x63, 0x74, 0x22, 0x2c, 3506799c3a5c597813154e20837c58703eba7996dfeRyan Campbell 0x22, 0x6b, 0x69, 0x64, 0x22, 0x3a, 0x22, 0x59, 0x41, 0x59, 0x65, 3516799c3a5c597813154e20837c58703eba7996dfeRyan Campbell 0x41, 0x58, 0x35, 0x48, 0x66, 0x6f, 0x64, 0x2b, 0x56, 0x39, 0x41, 3526799c3a5c597813154e20837c58703eba7996dfeRyan Campbell 0x4e, 0x48, 0x74, 0x41, 0x4e, 0x48, 0x67, 0x22, 0x2c, 0x22, 0x6b, 3536799c3a5c597813154e20837c58703eba7996dfeRyan Campbell 0x22, 0x3a, 0x22, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x54, 0x65, 3546799c3a5c597813154e20837c58703eba7996dfeRyan Campbell 0x73, 0x74, 0x4b, 0x65, 0x79, 0x42, 0x61, 0x73, 0x65, 0x36, 0x34, 3556799c3a5c597813154e20837c58703eba7996dfeRyan Campbell 0x67, 0x67, 0x67, 0x22, 0x7d, 0x5d, 0x7d, 0x0a}; 3566799c3a5c597813154e20837c58703eba7996dfeRyan Campbell 3576799c3a5c597813154e20837c58703eba7996dfeRyan Campbell hidl_string mimeType = "video/mp4"; 3586799c3a5c597813154e20837c58703eba7996dfeRyan Campbell KeyedVector optionalParameters; 3596799c3a5c597813154e20837c58703eba7996dfeRyan Campbell auto res = drmPlugin->getKeyRequest( 3606799c3a5c597813154e20837c58703eba7996dfeRyan Campbell sessionId, initData, mimeType, type, optionalParameters, 3616799c3a5c597813154e20837c58703eba7996dfeRyan Campbell [&](Status status, const hidl_vec<uint8_t>& request, 3626799c3a5c597813154e20837c58703eba7996dfeRyan Campbell KeyRequestType requestType, const hidl_string&) { 3636799c3a5c597813154e20837c58703eba7996dfeRyan Campbell EXPECT_EQ(Status::OK, status); 3646799c3a5c597813154e20837c58703eba7996dfeRyan Campbell EXPECT_EQ(KeyRequestType::INITIAL, requestType); 3656799c3a5c597813154e20837c58703eba7996dfeRyan Campbell EXPECT_EQ(request, expectedKeyRequest); 3666799c3a5c597813154e20837c58703eba7996dfeRyan Campbell }); 3676799c3a5c597813154e20837c58703eba7996dfeRyan Campbell EXPECT_OK(res); 3686799c3a5c597813154e20837c58703eba7996dfeRyan Campbell 3696799c3a5c597813154e20837c58703eba7996dfeRyan Campbell hidl_vec<uint8_t> keySetId; 3706799c3a5c597813154e20837c58703eba7996dfeRyan Campbell res = drmPlugin->provideKeyResponse( 3716799c3a5c597813154e20837c58703eba7996dfeRyan Campbell sessionId, knownKeyResponse, 3726799c3a5c597813154e20837c58703eba7996dfeRyan Campbell [&](Status status, const hidl_vec<uint8_t>& myKeySetId) { 3736799c3a5c597813154e20837c58703eba7996dfeRyan Campbell EXPECT_EQ(Status::OK, status); 3746799c3a5c597813154e20837c58703eba7996dfeRyan Campbell EXPECT_EQ(0u, myKeySetId.size()); 3756799c3a5c597813154e20837c58703eba7996dfeRyan Campbell keySetId = myKeySetId; 3766799c3a5c597813154e20837c58703eba7996dfeRyan Campbell }); 3776799c3a5c597813154e20837c58703eba7996dfeRyan Campbell EXPECT_OK(res); 3786799c3a5c597813154e20837c58703eba7996dfeRyan Campbell return keySetId; 3796799c3a5c597813154e20837c58703eba7996dfeRyan Campbell} 3806799c3a5c597813154e20837c58703eba7996dfeRyan Campbell 3816799c3a5c597813154e20837c58703eba7996dfeRyan Campbell/** 3820ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Test that a session can be opened and closed 3830ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 3840ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_F(DrmHalClearkeyPluginTest, OpenCloseSession) { 3850ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto sessionId = openSession(); 3860ea406920af8313875866f13c9104129c08b2d76Jeff Tinker closeSession(sessionId); 3870ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 3880ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 3890ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 3900ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Test that attempting to close an invalid (empty) sessionId 3910ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * is prohibited with the documented error code. 3920ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 3930ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_F(DrmHalClearkeyPluginTest, CloseInvalidSession) { 3940ea406920af8313875866f13c9104129c08b2d76Jeff Tinker SessionId invalidSessionId; 3950ea406920af8313875866f13c9104129c08b2d76Jeff Tinker Status result = drmPlugin->closeSession(invalidSessionId); 3960ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::BAD_VALUE, result); 3970ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 3980ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 3990ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 4000ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Test that attempting to close a session that is already closed 4010ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * is prohibited with the documented error code. 4020ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 4030ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_F(DrmHalClearkeyPluginTest, CloseClosedSession) { 4040ea406920af8313875866f13c9104129c08b2d76Jeff Tinker SessionId sessionId = openSession(); 4050ea406920af8313875866f13c9104129c08b2d76Jeff Tinker closeSession(sessionId); 4060ea406920af8313875866f13c9104129c08b2d76Jeff Tinker Status result = drmPlugin->closeSession(sessionId); 4070ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::ERROR_DRM_SESSION_NOT_OPENED, result); 4080ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 4090ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 4100ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 4110ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * A get key request should fail if no sessionId is provided 4120ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 4130ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_F(DrmHalClearkeyPluginTest, GetKeyRequestNoSession) { 4140ea406920af8313875866f13c9104129c08b2d76Jeff Tinker SessionId invalidSessionId; 4150ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_vec<uint8_t> initData; 4160ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_string mimeType = "video/mp4"; 4170ea406920af8313875866f13c9104129c08b2d76Jeff Tinker KeyedVector optionalParameters; 4180ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmPlugin->getKeyRequest( 4190ea406920af8313875866f13c9104129c08b2d76Jeff Tinker invalidSessionId, initData, mimeType, KeyType::STREAMING, 4200ea406920af8313875866f13c9104129c08b2d76Jeff Tinker optionalParameters, 4210ea406920af8313875866f13c9104129c08b2d76Jeff Tinker [&](Status status, const hidl_vec<uint8_t>&, KeyRequestType, 4220ea406920af8313875866f13c9104129c08b2d76Jeff Tinker const hidl_string&) { EXPECT_EQ(Status::BAD_VALUE, status); }); 4230ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 4240ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 4250ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 4260ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 4270ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * The clearkey plugin doesn't support offline key requests. 4280ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Test that the plugin returns the expected error code in 4290ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * this case. 4300ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 4310ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_F(DrmHalClearkeyPluginTest, GetKeyRequestOfflineKeyTypeNotSupported) { 4320ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto sessionId = openSession(); 4330ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_vec<uint8_t> initData; 4340ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_string mimeType = "video/mp4"; 4350ea406920af8313875866f13c9104129c08b2d76Jeff Tinker KeyedVector optionalParameters; 4360ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 4370ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmPlugin->getKeyRequest( 4380ea406920af8313875866f13c9104129c08b2d76Jeff Tinker sessionId, initData, mimeType, KeyType::OFFLINE, optionalParameters, 4390ea406920af8313875866f13c9104129c08b2d76Jeff Tinker [&](Status status, const hidl_vec<uint8_t>&, KeyRequestType, 4400ea406920af8313875866f13c9104129c08b2d76Jeff Tinker const hidl_string&) { 4410ea406920af8313875866f13c9104129c08b2d76Jeff Tinker // Clearkey plugin doesn't support offline key type 4420ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::ERROR_DRM_CANNOT_HANDLE, status); 4430ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 4440ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 4450ea406920af8313875866f13c9104129c08b2d76Jeff Tinker closeSession(sessionId); 4460ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 4470ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 4480ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 4490ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Test that the plugin returns the documented error for the 4500ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * case of attempting to generate a key request using an 4510ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * invalid mime type 4520ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 4530ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_F(DrmHalClearkeyPluginTest, GetKeyRequestBadMime) { 4540ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto sessionId = openSession(); 4550ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_vec<uint8_t> initData; 4560ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_string mimeType = "video/unknown"; 4570ea406920af8313875866f13c9104129c08b2d76Jeff Tinker KeyedVector optionalParameters; 4580ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmPlugin->getKeyRequest( 4590ea406920af8313875866f13c9104129c08b2d76Jeff Tinker sessionId, initData, mimeType, KeyType::STREAMING, 4600ea406920af8313875866f13c9104129c08b2d76Jeff Tinker optionalParameters, [&](Status status, const hidl_vec<uint8_t>&, 4610ea406920af8313875866f13c9104129c08b2d76Jeff Tinker KeyRequestType, const hidl_string&) { 4620ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::ERROR_DRM_CANNOT_HANDLE, status); 4630ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 4640ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 4650ea406920af8313875866f13c9104129c08b2d76Jeff Tinker closeSession(sessionId); 4660ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 4670ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 4680ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 4690ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Test that a closed sessionID returns SESSION_NOT_OPENED 4700ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 4710ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_F(DrmHalClearkeyPluginTest, ProvideKeyResponseClosedSession) { 4720ea406920af8313875866f13c9104129c08b2d76Jeff Tinker SessionId session = openSession(); 4730ea406920af8313875866f13c9104129c08b2d76Jeff Tinker closeSession(session); 4740ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 4750ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_vec<uint8_t> keyResponse = {0x7b, 0x22, 0x6b, 0x65, 4760ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 0x79, 0x73, 0x22, 0x3a}; 4770ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmPlugin->provideKeyResponse( 4780ea406920af8313875866f13c9104129c08b2d76Jeff Tinker session, keyResponse, 4790ea406920af8313875866f13c9104129c08b2d76Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& keySetId) { 4800ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::ERROR_DRM_SESSION_NOT_OPENED, status); 4810ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(0u, keySetId.size()); 4820ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 4830ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 4840ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 4850ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 4860ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 4870ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Test that an empty sessionID returns BAD_VALUE 4880ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 4890ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_F(DrmHalClearkeyPluginTest, ProvideKeyResponseInvalidSessionId) { 4900ea406920af8313875866f13c9104129c08b2d76Jeff Tinker SessionId session; 4910ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 4920ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_vec<uint8_t> keyResponse = {0x7b, 0x22, 0x6b, 0x65, 4930ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 0x79, 0x73, 0x22, 0x3a}; 4940ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmPlugin->provideKeyResponse( 4950ea406920af8313875866f13c9104129c08b2d76Jeff Tinker session, keyResponse, 4960ea406920af8313875866f13c9104129c08b2d76Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& keySetId) { 4970ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::BAD_VALUE, status); 4980ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(0u, keySetId.size()); 4990ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 5000ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 5010ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 5020ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 5030ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 5040ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Test that an empty key response returns BAD_VALUE 5050ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 5060ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_F(DrmHalClearkeyPluginTest, ProvideKeyResponseEmptyResponse) { 5070ea406920af8313875866f13c9104129c08b2d76Jeff Tinker SessionId session = openSession(); 5080ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_vec<uint8_t> emptyResponse; 5090ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmPlugin->provideKeyResponse( 5100ea406920af8313875866f13c9104129c08b2d76Jeff Tinker session, emptyResponse, 5110ea406920af8313875866f13c9104129c08b2d76Jeff Tinker [&](Status status, const hidl_vec<uint8_t>& keySetId) { 5120ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::BAD_VALUE, status); 5130ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(0u, keySetId.size()); 5140ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 5150ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 5160ea406920af8313875866f13c9104129c08b2d76Jeff Tinker closeSession(session); 5170ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 5180ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 5190ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 520f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker * Test that a removeKeys on an empty sessionID returns BAD_VALUE 521f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker */ 522f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff TinkerTEST_F(DrmHalClearkeyPluginTest, RemoveKeysEmptySessionId) { 523f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker SessionId sessionId; 524f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker Status status = drmPlugin->removeKeys(sessionId); 525f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker EXPECT_TRUE(status == Status::BAD_VALUE); 526f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker} 527f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 528f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker/** 529f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker * Remove keys is not supported for clearkey. 530f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker */ 531f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff TinkerTEST_F(DrmHalClearkeyPluginTest, RemoveKeysNewSession) { 532f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker SessionId sessionId = openSession(); 533f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker Status status = drmPlugin->removeKeys(sessionId); 534f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker // Clearkey plugin doesn't support remove keys 535f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker EXPECT_EQ(Status::ERROR_DRM_CANNOT_HANDLE, status); 536f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker closeSession(sessionId); 537f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker} 538f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 539f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker/** 5406799c3a5c597813154e20837c58703eba7996dfeRyan Campbell * Test that ClearKey cannot handle key restoring. 5416799c3a5c597813154e20837c58703eba7996dfeRyan Campbell * Expected message is Status::ERROR_DRM_CANNOT_HANDLE. 5426799c3a5c597813154e20837c58703eba7996dfeRyan Campbell */ 5436799c3a5c597813154e20837c58703eba7996dfeRyan CampbellTEST_F(DrmHalClearkeyPluginTest, RestoreKeysCannotHandle) { 5446799c3a5c597813154e20837c58703eba7996dfeRyan Campbell hidl_vec<uint8_t> keySetId = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}; 5456799c3a5c597813154e20837c58703eba7996dfeRyan Campbell SessionId sessionId = openSession(); 5466799c3a5c597813154e20837c58703eba7996dfeRyan Campbell Status status = drmPlugin->restoreKeys(sessionId, keySetId); 5476799c3a5c597813154e20837c58703eba7996dfeRyan Campbell EXPECT_EQ(Status::ERROR_DRM_CANNOT_HANDLE, status); 5486799c3a5c597813154e20837c58703eba7996dfeRyan Campbell closeSession(sessionId); 5496799c3a5c597813154e20837c58703eba7996dfeRyan Campbell} 5506799c3a5c597813154e20837c58703eba7996dfeRyan Campbell 5516799c3a5c597813154e20837c58703eba7996dfeRyan Campbell/** 5526799c3a5c597813154e20837c58703eba7996dfeRyan Campbell * Test that restoreKeys fails with a null key set ID. 5536799c3a5c597813154e20837c58703eba7996dfeRyan Campbell * Error message is expected to be Status::BAD_VALUE. 5546799c3a5c597813154e20837c58703eba7996dfeRyan Campbell */ 5556799c3a5c597813154e20837c58703eba7996dfeRyan CampbellTEST_F(DrmHalClearkeyPluginTest, RestoreKeysNull) { 5566799c3a5c597813154e20837c58703eba7996dfeRyan Campbell SessionId sessionId = openSession(); 5576799c3a5c597813154e20837c58703eba7996dfeRyan Campbell hidl_vec<uint8_t> nullKeySetId; 5586799c3a5c597813154e20837c58703eba7996dfeRyan Campbell Status status = drmPlugin->restoreKeys(sessionId, nullKeySetId); 5596799c3a5c597813154e20837c58703eba7996dfeRyan Campbell EXPECT_EQ(Status::BAD_VALUE, status); 5606799c3a5c597813154e20837c58703eba7996dfeRyan Campbell closeSession(sessionId); 5616799c3a5c597813154e20837c58703eba7996dfeRyan Campbell} 5626799c3a5c597813154e20837c58703eba7996dfeRyan Campbell 5636799c3a5c597813154e20837c58703eba7996dfeRyan Campbell/** 5640ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Test that the clearkey plugin doesn't support getting 5650ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * secure stops. 5660ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 5670ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_F(DrmHalClearkeyPluginTest, GetSecureStops) { 5680ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmPlugin->getSecureStops( 5690ea406920af8313875866f13c9104129c08b2d76Jeff Tinker [&](Status status, const hidl_vec<SecureStop>&) { 5700ea406920af8313875866f13c9104129c08b2d76Jeff Tinker // Clearkey plugin doesn't support secure stops 5710ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::ERROR_DRM_CANNOT_HANDLE, status); 5720ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 5730ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 5740ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 5750ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 5760ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 5770ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Test that the clearkey plugin returns BAD_VALUE if 5780ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * an empty ssid is provided. 5790ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 5800ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_F(DrmHalClearkeyPluginTest, GetSecureStopEmptySSID) { 5810ea406920af8313875866f13c9104129c08b2d76Jeff Tinker SecureStopId ssid; 5820ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmPlugin->getSecureStop( 5830ea406920af8313875866f13c9104129c08b2d76Jeff Tinker ssid, [&](Status status, const SecureStop&) { 5840ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::BAD_VALUE, status); 5850ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 5860ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 5870ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 5880ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 5890ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 5900ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Test that releasing all secure stops isn't handled by 5910ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * clearkey. 5920ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 5930ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_F(DrmHalClearkeyPluginTest, ReleaseAllSecureStops) { 5940ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::ERROR_DRM_CANNOT_HANDLE, 5950ea406920af8313875866f13c9104129c08b2d76Jeff Tinker drmPlugin->releaseAllSecureStops()); 5960ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 5970ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 5980ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 5990ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Test that releasing a specific secure stop with an empty 6000ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * SSID returns BAD_VALUE. 6010ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 6020ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_F(DrmHalClearkeyPluginTest, ReleaseSecureStopEmptySSID) { 6030ea406920af8313875866f13c9104129c08b2d76Jeff Tinker SecureStopId ssid; 6040ea406920af8313875866f13c9104129c08b2d76Jeff Tinker Status status = drmPlugin->releaseSecureStop(ssid); 6050ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::BAD_VALUE, status); 6060ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 6070ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 6080ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 6090ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * The following four tests verify that the properties 6100ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * defined in the MediaDrm API are supported by 6110ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * the plugin. 6120ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 6130ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_F(DrmHalClearkeyPluginTest, GetVendorProperty) { 6140ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmPlugin->getPropertyString( 6150ea406920af8313875866f13c9104129c08b2d76Jeff Tinker "vendor", [&](Status status, const hidl_string& value) { 6160ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::OK, status); 6170ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ("Google", value); 6180ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 6190ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 6200ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 6210ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 6220ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_F(DrmHalClearkeyPluginTest, GetVersionProperty) { 6230ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmPlugin->getPropertyString( 6240ea406920af8313875866f13c9104129c08b2d76Jeff Tinker "version", [&](Status status, const hidl_string& value) { 6250ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::OK, status); 6260ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ("1.0", value); 6270ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 6280ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 6290ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 6300ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 6310ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_F(DrmHalClearkeyPluginTest, GetDescriptionProperty) { 6320ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmPlugin->getPropertyString( 6330ea406920af8313875866f13c9104129c08b2d76Jeff Tinker "description", [&](Status status, const hidl_string& value) { 6340ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::OK, status); 6350ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ("ClearKey CDM", value); 6360ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 6370ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 6380ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 6390ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 6400ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_F(DrmHalClearkeyPluginTest, GetAlgorithmsProperty) { 6410ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmPlugin->getPropertyString( 6420ea406920af8313875866f13c9104129c08b2d76Jeff Tinker "algorithms", [&](Status status, const hidl_string& value) { 6430ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::OK, status); 6440ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ("", value); 6450ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 6460ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 6470ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 6480ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 6490ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 6500ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Test that attempting to read invalid string and byte array 6510ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * properties returns the documented error code. 6520ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 6530ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_F(DrmHalClearkeyPluginTest, GetInvalidStringProperty) { 6540ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmPlugin->getPropertyString( 6550ea406920af8313875866f13c9104129c08b2d76Jeff Tinker "invalid", [&](Status status, const hidl_string&) { 6560ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::ERROR_DRM_CANNOT_HANDLE, status); 6570ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 6580ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 6590ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 6600ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 6610ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_F(DrmHalClearkeyPluginTest, GetByteArrayPropertyNotSupported) { 6620ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmPlugin->getPropertyByteArray( 6630ea406920af8313875866f13c9104129c08b2d76Jeff Tinker "deviceUniqueId", [&](Status status, const hidl_vec<uint8_t>&) { 6640ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::ERROR_DRM_CANNOT_HANDLE, status); 6650ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 6660ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 6670ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 6680ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 6690ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 6700ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Clearkey doesn't support setting string or byte array properties, 6710ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * particularly an undefined one. 6720ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 6730ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_F(DrmHalClearkeyPluginTest, SetStringPropertyNotSupported) { 6740ea406920af8313875866f13c9104129c08b2d76Jeff Tinker Status status = drmPlugin->setPropertyString("property", "value"); 6750ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::ERROR_DRM_CANNOT_HANDLE, status); 6760ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 6770ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 6780ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_F(DrmHalClearkeyPluginTest, SetByteArrayPropertyNotSupported) { 6790ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_vec<uint8_t> value; 6800ea406920af8313875866f13c9104129c08b2d76Jeff Tinker Status status = drmPlugin->setPropertyByteArray("property", value); 6810ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::ERROR_DRM_CANNOT_HANDLE, status); 6820ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 6830ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 6840ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 6850ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Clearkey doesn't support setting cipher algorithms, verify it 6860ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 6870ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_F(DrmHalClearkeyPluginTest, SetCipherAlgorithmNotSupported) { 6880ea406920af8313875866f13c9104129c08b2d76Jeff Tinker SessionId session = openSession(); 6890ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_string algorithm = "AES/CBC/NoPadding"; 6900ea406920af8313875866f13c9104129c08b2d76Jeff Tinker Status status = drmPlugin->setCipherAlgorithm(session, algorithm); 6910ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::ERROR_DRM_CANNOT_HANDLE, status); 6920ea406920af8313875866f13c9104129c08b2d76Jeff Tinker closeSession(session); 6930ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 6940ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 6950ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 6960ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Setting an empty algorithm should return BAD_VALUE 6970ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 6980ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_F(DrmHalClearkeyPluginTest, SetCipherEmptyAlgorithm) { 6990ea406920af8313875866f13c9104129c08b2d76Jeff Tinker SessionId session = openSession(); 7000ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_string algorithm; 7010ea406920af8313875866f13c9104129c08b2d76Jeff Tinker Status status = drmPlugin->setCipherAlgorithm(session, algorithm); 7020ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::BAD_VALUE, status); 7030ea406920af8313875866f13c9104129c08b2d76Jeff Tinker closeSession(session); 7040ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 7050ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 7060ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 7070ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Setting a cipher algorithm with no session returns BAD_VALUE 7080ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 7090ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_F(DrmHalClearkeyPluginTest, SetCipherAlgorithmNoSession) { 7100ea406920af8313875866f13c9104129c08b2d76Jeff Tinker SessionId session; 7110ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_string algorithm = "AES/CBC/NoPadding"; 7120ea406920af8313875866f13c9104129c08b2d76Jeff Tinker Status status = drmPlugin->setCipherAlgorithm(session, algorithm); 7130ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::BAD_VALUE, status); 7140ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 7150ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 7160ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 7170ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Clearkey doesn't support setting mac algorithms, verify it 7180ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 7190ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_F(DrmHalClearkeyPluginTest, SetMacAlgorithmNotSupported) { 7200ea406920af8313875866f13c9104129c08b2d76Jeff Tinker SessionId session = openSession(); 7210ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_string algorithm = "HmacSHA256"; 7220ea406920af8313875866f13c9104129c08b2d76Jeff Tinker Status status = drmPlugin->setMacAlgorithm(session, algorithm); 7230ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::ERROR_DRM_CANNOT_HANDLE, status); 7240ea406920af8313875866f13c9104129c08b2d76Jeff Tinker closeSession(session); 7250ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 7260ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 7270ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 7280ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Setting an empty algorithm should return BAD_VALUE 7290ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 7300ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_F(DrmHalClearkeyPluginTest, SetMacEmptyAlgorithm) { 7310ea406920af8313875866f13c9104129c08b2d76Jeff Tinker SessionId session = openSession(); 7320ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_string algorithm; 7330ea406920af8313875866f13c9104129c08b2d76Jeff Tinker Status status = drmPlugin->setMacAlgorithm(session, algorithm); 7340ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::BAD_VALUE, status); 7350ea406920af8313875866f13c9104129c08b2d76Jeff Tinker closeSession(session); 7360ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 7370ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 7380ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 7390ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Setting a mac algorithm with no session should return BAD_VALUE 7400ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 7410ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_F(DrmHalClearkeyPluginTest, SetMacAlgorithmNoSession) { 7420ea406920af8313875866f13c9104129c08b2d76Jeff Tinker SessionId session; 7430ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_string algorithm = "HmacSHA256"; 7440ea406920af8313875866f13c9104129c08b2d76Jeff Tinker Status status = drmPlugin->setMacAlgorithm(session, algorithm); 7450ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::BAD_VALUE, status); 7460ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 7470ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 7480ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 7490ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * The Generic* methods provide general purpose crypto operations 7500ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * that may be used for applications other than DRM. They leverage 7510ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * the hardware root of trust and secure key distribution mechanisms 7520ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * of a DRM system to enable app-specific crypto functionality where 7530ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * the crypto keys are not exposed outside of the trusted execution 7540ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * environment. 7550ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * 7560ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Clearkey doesn't support generic encrypt/decrypt/sign/verify. 7570ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 7580ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_F(DrmHalClearkeyPluginTest, GenericEncryptNotSupported) { 7590ea406920af8313875866f13c9104129c08b2d76Jeff Tinker SessionId session = openSession(); 7600ea406920af8313875866f13c9104129c08b2d76Jeff Tinker ; 7610ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_vec<uint8_t> keyId = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}; 7620ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_vec<uint8_t> input = {1, 2, 3, 4, 5}; 763f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker hidl_vec<uint8_t> iv = std::vector<uint8_t>(AES_BLOCK_SIZE, 0); 7640ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmPlugin->encrypt(session, keyId, input, iv, 7650ea406920af8313875866f13c9104129c08b2d76Jeff Tinker [&](Status status, const hidl_vec<uint8_t>&) { 7660ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::ERROR_DRM_CANNOT_HANDLE, 7670ea406920af8313875866f13c9104129c08b2d76Jeff Tinker status); 7680ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 7690ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 7700ea406920af8313875866f13c9104129c08b2d76Jeff Tinker closeSession(session); 7710ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 7720ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 7730ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_F(DrmHalClearkeyPluginTest, GenericDecryptNotSupported) { 7740ea406920af8313875866f13c9104129c08b2d76Jeff Tinker SessionId session = openSession(); 7750ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_vec<uint8_t> keyId = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}; 7760ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_vec<uint8_t> input = {1, 2, 3, 4, 5}; 777f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker hidl_vec<uint8_t> iv = std::vector<uint8_t>(AES_BLOCK_SIZE, 0); 7780ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmPlugin->decrypt(session, keyId, input, iv, 7790ea406920af8313875866f13c9104129c08b2d76Jeff Tinker [&](Status status, const hidl_vec<uint8_t>&) { 7800ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::ERROR_DRM_CANNOT_HANDLE, 7810ea406920af8313875866f13c9104129c08b2d76Jeff Tinker status); 7820ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 7830ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 7840ea406920af8313875866f13c9104129c08b2d76Jeff Tinker closeSession(session); 7850ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 7860ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 7870ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_F(DrmHalClearkeyPluginTest, GenericSignNotSupported) { 7880ea406920af8313875866f13c9104129c08b2d76Jeff Tinker SessionId session = openSession(); 7890ea406920af8313875866f13c9104129c08b2d76Jeff Tinker ; 7900ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_vec<uint8_t> keyId = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}; 7910ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_vec<uint8_t> message = {1, 2, 3, 4, 5}; 7920ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmPlugin->sign(session, keyId, message, 7930ea406920af8313875866f13c9104129c08b2d76Jeff Tinker [&](Status status, const hidl_vec<uint8_t>&) { 7940ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::ERROR_DRM_CANNOT_HANDLE, 7950ea406920af8313875866f13c9104129c08b2d76Jeff Tinker status); 7960ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 7970ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 7980ea406920af8313875866f13c9104129c08b2d76Jeff Tinker closeSession(session); 7990ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 8000ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 8010ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_F(DrmHalClearkeyPluginTest, GenericVerifyNotSupported) { 8020ea406920af8313875866f13c9104129c08b2d76Jeff Tinker SessionId session = openSession(); 8030ea406920af8313875866f13c9104129c08b2d76Jeff Tinker ; 8040ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_vec<uint8_t> keyId = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}; 8050ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_vec<uint8_t> message = {1, 2, 3, 4, 5}; 8060ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_vec<uint8_t> signature = {0, 0, 0, 0, 0, 0, 0, 0, 8070ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 0, 0, 0, 0, 0, 0, 0, 0}; 8080ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmPlugin->verify( 8090ea406920af8313875866f13c9104129c08b2d76Jeff Tinker session, keyId, message, signature, [&](Status status, bool) { 8100ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::ERROR_DRM_CANNOT_HANDLE, status); 8110ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 8120ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 8130ea406920af8313875866f13c9104129c08b2d76Jeff Tinker closeSession(session); 8140ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 8150ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 8160ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_F(DrmHalClearkeyPluginTest, GenericSignRSANotSupported) { 8170ea406920af8313875866f13c9104129c08b2d76Jeff Tinker SessionId session = openSession(); 8180ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_string algorithm = "RSASSA-PSS-SHA1"; 8190ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_vec<uint8_t> message = {1, 2, 3, 4, 5}; 8200ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_vec<uint8_t> wrappedKey = {0, 0, 0, 0, 0, 0, 0, 0, 8210ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 0, 0, 0, 0, 0, 0, 0, 0}; 8220ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = drmPlugin->signRSA(session, algorithm, message, wrappedKey, 8230ea406920af8313875866f13c9104129c08b2d76Jeff Tinker [&](Status status, const hidl_vec<uint8_t>&) { 8240ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::ERROR_DRM_CANNOT_HANDLE, 8250ea406920af8313875866f13c9104129c08b2d76Jeff Tinker status); 8260ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 8270ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 8280ea406920af8313875866f13c9104129c08b2d76Jeff Tinker closeSession(session); 8290ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 8300ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 8310ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 8320ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * CryptoPlugin tests 8330ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 8340ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 8350ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 8360ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Clearkey doesn't support secure decoder and is expected to 8370ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * return false. 8380ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 8390ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_F(DrmHalClearkeyPluginTest, RequiresSecureDecoder) { 8400ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_FALSE(cryptoPlugin->requiresSecureDecoderComponent("cenc")); 8410ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 8420ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 8430ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 8440ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Verify that requiresSecureDecoderComponent handles empty mimetype 8450ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 8460ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_F(DrmHalClearkeyPluginTest, RequiresSecureDecoderEmptyMimeType) { 8470ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_FALSE(cryptoPlugin->requiresSecureDecoderComponent("")); 8480ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 8490ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 8500ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 8510ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Exercise the NotifyResolution API. There is no observable result, 8520ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * just call the method for coverage. 8530ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 8540ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_F(DrmHalClearkeyPluginTest, NotifyResolution) { 8550ea406920af8313875866f13c9104129c08b2d76Jeff Tinker cryptoPlugin->notifyResolution(1920, 1080); 8560ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 8570ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 8580ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 8590ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * getDecryptMemory allocates memory for decryption, then sets it 8600ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * as a shared buffer base in the crypto hal. The allocated and 8610ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * mapped IMemory is returned. 8620ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * 8630ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * @param size the size of the memory segment to allocate 8640ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * @param the index of the memory segment which will be used 8650ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * to refer to it for decryption. 8660ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 8670ea406920af8313875866f13c9104129c08b2d76Jeff Tinkersp<IMemory> DrmHalClearkeyPluginTest::getDecryptMemory(size_t size, 8680ea406920af8313875866f13c9104129c08b2d76Jeff Tinker size_t index) { 8690ea406920af8313875866f13c9104129c08b2d76Jeff Tinker sp<IAllocator> ashmemAllocator = IAllocator::getService("ashmem"); 8700ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_NE(ashmemAllocator, nullptr); 8710ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 8720ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_memory hidlMemory; 8730ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto res = ashmemAllocator->allocate( 8740ea406920af8313875866f13c9104129c08b2d76Jeff Tinker size, [&](bool success, const hidl_memory& memory) { 8750ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(true, success); 8760ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(cryptoPlugin->setSharedBufferBase(memory, index)); 8770ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidlMemory = memory; 8780ea406920af8313875866f13c9104129c08b2d76Jeff Tinker }); 8790ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(res); 8800ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 8810ea406920af8313875866f13c9104129c08b2d76Jeff Tinker sp<IMemory> mappedMemory = mapMemory(hidlMemory); 8820ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_OK(cryptoPlugin->setSharedBufferBase(hidlMemory, index)); 8830ea406920af8313875866f13c9104129c08b2d76Jeff Tinker return mappedMemory; 8840ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 8850ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 8860ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 8870ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Exercise the setMediaDrmSession method. setMediaDrmSession 8880ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * is used to associate a drm session with a crypto session. 8890ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 8900ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_F(DrmHalClearkeyPluginTest, SetMediaDrmSession) { 8910ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto sessionId = openSession(); 8920ea406920af8313875866f13c9104129c08b2d76Jeff Tinker Status status = cryptoPlugin->setMediaDrmSession(sessionId); 8930ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::OK, status); 8940ea406920af8313875866f13c9104129c08b2d76Jeff Tinker closeSession(sessionId); 8950ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 8960ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 8970ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 8980ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * setMediaDrmSession with a closed session id 8990ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 9000ea406920af8313875866f13c9104129c08b2d76Jeff TinkerTEST_F(DrmHalClearkeyPluginTest, SetMediaDrmSessionClosedSession) { 9010ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto sessionId = openSession(); 9020ea406920af8313875866f13c9104129c08b2d76Jeff Tinker closeSession(sessionId); 9030ea406920af8313875866f13c9104129c08b2d76Jeff Tinker Status status = cryptoPlugin->setMediaDrmSession(sessionId); 9040ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::ERROR_DRM_SESSION_NOT_OPENED, status); 9050ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 9060ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 9070ea406920af8313875866f13c9104129c08b2d76Jeff Tinker/** 908f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker * setMediaDrmSession with an empty session id: BAD_VALUE. An 909f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker * empty session clears the previously set session and should 910f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker * return OK. 911f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker */ 912f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff TinkerTEST_F(DrmHalClearkeyPluginTest, SetMediaDrmSessionEmptySession) { 913f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker SessionId sessionId; 914f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker Status status = cryptoPlugin->setMediaDrmSession(sessionId); 915f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker EXPECT_EQ(Status::OK, status); 916f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker} 917f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 918f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker/** 9190ea406920af8313875866f13c9104129c08b2d76Jeff Tinker * Decrypt tests 9200ea406920af8313875866f13c9104129c08b2d76Jeff Tinker */ 9210ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 9220ea406920af8313875866f13c9104129c08b2d76Jeff Tinkerclass DrmHalClearkeyDecryptTest : public DrmHalClearkeyPluginTest { 9230ea406920af8313875866f13c9104129c08b2d76Jeff Tinker public: 9240ea406920af8313875866f13c9104129c08b2d76Jeff Tinker void fillRandom(const sp<IMemory>& memory); 9250ea406920af8313875866f13c9104129c08b2d76Jeff Tinker hidl_array<uint8_t, 16> toHidlArray(const vector<uint8_t>& vec) { 926f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker EXPECT_EQ(16u, vec.size()); 9270ea406920af8313875866f13c9104129c08b2d76Jeff Tinker return hidl_array<uint8_t, 16>(&vec[0]); 9280ea406920af8313875866f13c9104129c08b2d76Jeff Tinker } 929f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker uint32_t decrypt(Mode mode, uint8_t* iv, const hidl_vec<SubSample>& subSamples, 930f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker const Pattern& pattern, Status status); 931f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker void aes_ctr_decrypt(uint8_t* dest, uint8_t* src, uint8_t* iv, 932f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker const hidl_vec<SubSample>& subSamples, const vector<uint8_t>& key); 933f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker void aes_cbc_decrypt(uint8_t* dest, uint8_t* src, uint8_t* iv, 934f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker const hidl_vec<SubSample>& subSamples, const vector<uint8_t>& key); 9350ea406920af8313875866f13c9104129c08b2d76Jeff Tinker}; 9360ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 9370ea406920af8313875866f13c9104129c08b2d76Jeff Tinkervoid DrmHalClearkeyDecryptTest::fillRandom(const sp<IMemory>& memory) { 9380ea406920af8313875866f13c9104129c08b2d76Jeff Tinker random_device rd; 9390ea406920af8313875866f13c9104129c08b2d76Jeff Tinker mt19937 rand(rd()); 9400ea406920af8313875866f13c9104129c08b2d76Jeff Tinker for (size_t i = 0; i < memory->getSize() / sizeof(uint32_t); i++) { 9410ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto p = static_cast<uint32_t*>( 9420ea406920af8313875866f13c9104129c08b2d76Jeff Tinker static_cast<void*>(memory->getPointer())); 9430ea406920af8313875866f13c9104129c08b2d76Jeff Tinker p[i] = rand(); 9440ea406920af8313875866f13c9104129c08b2d76Jeff Tinker } 9450ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 9460ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 947f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinkeruint32_t DrmHalClearkeyDecryptTest::decrypt(Mode mode, 948f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker uint8_t* iv, const hidl_vec<SubSample>& subSamples, 949f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker const Pattern& pattern, Status expectedStatus) { 9500ea406920af8313875866f13c9104129c08b2d76Jeff Tinker const size_t kSegmentIndex = 0; 9510ea406920af8313875866f13c9104129c08b2d76Jeff Tinker const vector<uint8_t> keyId = {0x60, 0x06, 0x1e, 0x01, 0x7e, 0x47, 9520ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 0x7e, 0x87, 0x7e, 0x57, 0xd0, 0x0d, 9530ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 0x1e, 0xd0, 0x0d, 0x1e}; 954f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker const vector<uint8_t> contentKey = {0x1a, 0x8a, 0x20, 0x95, 0xe4, 955f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 0xde, 0xb2, 0xd2, 0x9e, 0xc8, 956f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 0x16, 0xac, 0x7b, 0xae, 0x20, 0x82}; 957f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker uint8_t localIv[AES_BLOCK_SIZE]; 958f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker memcpy(localIv, iv, AES_BLOCK_SIZE); 959f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 960f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker size_t totalSize = 0; 961f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker for (size_t i = 0; i < subSamples.size(); i++) { 962f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker totalSize += subSamples[i].numBytesOfClearData; 963f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker totalSize += subSamples[i].numBytesOfEncryptedData; 964f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker } 9650ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 966f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker // The first totalSize bytes of shared memory is the encrypted 967f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker // input, the second totalSize bytes is the decrypted output. 9680ea406920af8313875866f13c9104129c08b2d76Jeff Tinker sp<IMemory> sharedMemory = 969f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker getDecryptMemory(totalSize * 2, kSegmentIndex); 9700ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 971f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker const SharedBuffer sourceBuffer = { 972f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker .bufferId = kSegmentIndex, .offset = 0, .size = totalSize}; 9730ea406920af8313875866f13c9104129c08b2d76Jeff Tinker fillRandom(sharedMemory); 9740ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 975f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker const DestinationBuffer destBuffer = {.type = BufferType::SHARED_MEMORY, 976f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker {.bufferId = kSegmentIndex, 977f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker .offset = totalSize, 978f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker .size = totalSize}, 979f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker .secureMemory = nullptr}; 980f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker const uint64_t offset = 0; 981f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker const bool kNotSecure = false; 982f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker uint32_t bytesWritten = 0; 983f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker auto res = cryptoPlugin->decrypt(kNotSecure, toHidlArray(keyId), localIv, mode, 984f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker pattern, subSamples, sourceBuffer, offset, destBuffer, 985f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker [&](Status status, uint32_t count, string detailedError) { 986f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker EXPECT_EQ(expectedStatus, status) << "Unexpected decrypt status " << 987f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker detailedError; 988f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker bytesWritten = count; 989f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker }); 990f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker EXPECT_OK(res); 991f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 992f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker if (bytesWritten != totalSize) { 993f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker return bytesWritten; 994f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker } 995f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker uint8_t* base = static_cast<uint8_t*>( 996f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker static_cast<void*>(sharedMemory->getPointer())); 997f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 998f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker // generate reference vector 999f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker vector<uint8_t> reference(totalSize); 1000f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 1001f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker memcpy(localIv, iv, AES_BLOCK_SIZE); 1002f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker switch (mode) { 1003f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker case Mode::UNENCRYPTED: 1004f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker memcpy(&reference[0], base, totalSize); 1005f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker break; 1006f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker case Mode::AES_CTR: 1007f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker aes_ctr_decrypt(&reference[0], base, localIv, subSamples, contentKey); 1008f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker break; 1009f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker case Mode::AES_CBC: 1010f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker aes_cbc_decrypt(&reference[0], base, localIv, subSamples, contentKey); 1011f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker break; 1012f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker case Mode::AES_CBC_CTS: 1013f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker EXPECT_TRUE(false) << "AES_CBC_CTS mode not supported"; 1014f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker break; 1015f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker } 10160ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 1017f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker // compare reference to decrypted data which is at base + total size 1018f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker EXPECT_EQ(0, memcmp(static_cast<void *>(&reference[0]), 1019f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker static_cast<void*>(base + totalSize), totalSize)) 1020f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker << "decrypt data mismatch"; 1021f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker return totalSize; 1022f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker} 10230ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 1024f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker/** 1025f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker * Decrypt a list of clear+encrypted subsamples using the specified key 1026f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker * in AES-CTR mode 1027f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker */ 1028f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinkervoid DrmHalClearkeyDecryptTest::aes_ctr_decrypt(uint8_t* dest, uint8_t* src, 1029f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker uint8_t* iv, const hidl_vec<SubSample>& subSamples, 1030f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker const vector<uint8_t>& key) { 1031f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker AES_KEY decryptionKey; 1032f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker AES_set_encrypt_key(&key[0], 128, &decryptionKey); 1033f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 1034f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker size_t offset = 0; 1035f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker unsigned int blockOffset = 0; 1036f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker uint8_t previousEncryptedCounter[AES_BLOCK_SIZE]; 1037f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker memset(previousEncryptedCounter, 0, AES_BLOCK_SIZE); 1038f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 1039f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker for (size_t i = 0; i < subSamples.size(); i++) { 1040f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker const SubSample& subSample = subSamples[i]; 1041f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 1042f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker if (subSample.numBytesOfClearData > 0) { 1043f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker memcpy(dest + offset, src + offset, subSample.numBytesOfClearData); 1044f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker offset += subSample.numBytesOfClearData; 1045f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker } 1046f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 1047f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker if (subSample.numBytesOfEncryptedData > 0) { 1048f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker AES_ctr128_encrypt(src + offset, dest + offset, 1049f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker subSample.numBytesOfEncryptedData, &decryptionKey, 1050f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker iv, previousEncryptedCounter, &blockOffset); 1051f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker offset += subSample.numBytesOfEncryptedData; 1052f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker } 1053f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker } 1054f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker} 1055f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 1056f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker/** 1057f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker * Decrypt a list of clear+encrypted subsamples using the specified key 1058f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker * in AES-CBC mode 1059f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker */ 1060f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinkervoid DrmHalClearkeyDecryptTest::aes_cbc_decrypt(uint8_t* dest, uint8_t* src, 1061f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker uint8_t* iv, const hidl_vec<SubSample>& subSamples, 1062f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker const vector<uint8_t>& key) { 1063f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker AES_KEY decryptionKey; 1064f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker AES_set_encrypt_key(&key[0], 128, &decryptionKey); 1065f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 1066f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker size_t offset = 0; 1067f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker size_t num = 0; 1068f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker size_t ecount_buf = 0; 1069f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker for (size_t i = 0; i < subSamples.size(); i++) { 1070f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker memcpy(dest + offset, src + offset, subSamples[i].numBytesOfClearData); 1071f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker offset += subSamples[i].numBytesOfClearData; 1072f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 1073f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker AES_cbc_encrypt(src + offset, dest + offset, subSamples[i].numBytesOfEncryptedData, 1074f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker &decryptionKey, iv, 0 /* decrypt */); 1075f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker offset += subSamples[i].numBytesOfEncryptedData; 1076f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker } 1077f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker} 1078f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 1079f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker/** 1080f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker * Test query key status 1081f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker */ 1082f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff TinkerTEST_F(DrmHalClearkeyDecryptTest, TestQueryKeyStatus) { 1083f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker auto sessionId = openSession(); 1084f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker auto res = drmPlugin->queryKeyStatus(sessionId, 1085f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker [&](Status status, KeyedVector /* info */) { 1086f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker // clearkey doesn't support this method 1087f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker EXPECT_EQ(Status::ERROR_DRM_CANNOT_HANDLE, status); 1088f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker }); 1089f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker EXPECT_OK(res); 1090f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker} 1091f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 1092f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 1093f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker/** 1094f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker * Positive decrypt test. "Decrypt" a single clear segment 1095f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker */ 1096f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff TinkerTEST_F(DrmHalClearkeyDecryptTest, ClearSegmentTest) { 1097f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker vector<uint8_t> iv(AES_BLOCK_SIZE, 0); 1098f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker const Pattern noPattern = {0, 0}; 1099f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker const uint32_t kByteCount = 256; 1100f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker const vector<SubSample> subSamples = { 1101f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker {.numBytesOfClearData = kByteCount, 1102f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker .numBytesOfEncryptedData = 0}}; 11030ea406920af8313875866f13c9104129c08b2d76Jeff Tinker auto sessionId = openSession(); 11040ea406920af8313875866f13c9104129c08b2d76Jeff Tinker loadKeys(sessionId); 11050ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 11060ea406920af8313875866f13c9104129c08b2d76Jeff Tinker Status status = cryptoPlugin->setMediaDrmSession(sessionId); 11070ea406920af8313875866f13c9104129c08b2d76Jeff Tinker EXPECT_EQ(Status::OK, status); 11080ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 11090ea406920af8313875866f13c9104129c08b2d76Jeff Tinker const bool kNotSecure = false; 1110f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker uint32_t byteCount = decrypt(Mode::UNENCRYPTED, &iv[0], subSamples, 1111f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker noPattern, Status::OK); 1112f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker EXPECT_EQ(kByteCount, byteCount); 11130ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 1114f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker closeSession(sessionId); 1115f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker} 1116f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 1117f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker/** 1118f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker * Positive decrypt test. Decrypt a single segment using AES_CTR. 1119f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker * Verify data matches. 1120f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker */ 1121f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff TinkerTEST_F(DrmHalClearkeyDecryptTest, EncryptedAesCtrSegmentTest) { 1122f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker vector<uint8_t> iv(AES_BLOCK_SIZE, 0); 1123f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker const Pattern noPattern = {0, 0}; 1124f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker const uint32_t kClearBytes = 512; 1125f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker const uint32_t kEncryptedBytes = 512; 1126f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker const vector<SubSample> subSamples = { 1127f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker {.numBytesOfClearData = kClearBytes, 1128f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker .numBytesOfEncryptedData = kEncryptedBytes 1129f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker }}; 1130f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker auto sessionId = openSession(); 1131f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker loadKeys(sessionId); 1132f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 1133f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker Status status = cryptoPlugin->setMediaDrmSession(sessionId); 1134f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker EXPECT_EQ(Status::OK, status); 1135f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 1136f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker const bool kNotSecure = false; 1137f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker uint32_t byteCount = decrypt(Mode::AES_CTR, &iv[0], subSamples, 1138f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker noPattern, Status::OK); 1139f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker EXPECT_EQ(kClearBytes + kEncryptedBytes, byteCount); 1140f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 1141f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker closeSession(sessionId); 1142f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker} 1143f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker/** 1144f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker * Negative decrypt test. Decrypt without loading keys. 1145f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker */ 1146f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff TinkerTEST_F(DrmHalClearkeyDecryptTest, EncryptedAesCtrSegmentTestNoKeys) { 1147f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker vector<uint8_t> iv(AES_BLOCK_SIZE, 0); 1148f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker const Pattern noPattern = {0, 0}; 1149f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker const vector<SubSample> subSamples = { 1150f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker {.numBytesOfClearData = 256, 1151f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker .numBytesOfEncryptedData = 256}}; 1152f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker auto sessionId = openSession(); 1153f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 1154f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker Status status = cryptoPlugin->setMediaDrmSession(sessionId); 1155f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker EXPECT_EQ(Status::OK, status); 1156f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker 1157f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker const bool kNotSecure = false; 1158f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker uint32_t byteCount = decrypt(Mode::AES_CTR, &iv[0], subSamples, 1159f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker noPattern, Status::ERROR_DRM_NO_LICENSE); 1160f20aa0c48524a890f2fcf08f249bafe62bb6db45Jeff Tinker EXPECT_EQ(0u, byteCount); 11610ea406920af8313875866f13c9104129c08b2d76Jeff Tinker 11620ea406920af8313875866f13c9104129c08b2d76Jeff Tinker closeSession(sessionId); 11630ea406920af8313875866f13c9104129c08b2d76Jeff Tinker} 1164