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