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