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