1203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker/*
2203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker * Copyright (C) 2017 The Android Open Source Project
3203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker *
4203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker * Licensed under the Apache License, Version 2.0 (the "License");
5203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker * you may not use this file except in compliance with the License.
6203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker * You may obtain a copy of the License at
7203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker *
8203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker *      http://www.apache.org/licenses/LICENSE-2.0
9203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker *
10203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker * Unless required by applicable law or agreed to in writing, software
11203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker * distributed under the License is distributed on an "AS IS" BASIS,
12203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker * See the License for the specific language governing permissions and
14203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker * limitations under the License.
15203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker */
16203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker
17203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker#define LOG_TAG "drm_hal_clearkey_test@1.1"
18203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker
19203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker#include <android/hardware/drm/1.1/ICryptoFactory.h>
20203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker#include <android/hardware/drm/1.0/ICryptoPlugin.h>
21203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker#include <android/hardware/drm/1.1/IDrmFactory.h>
22203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker#include <android/hardware/drm/1.0/IDrmPlugin.h>
23203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker#include <android/hardware/drm/1.1/IDrmPlugin.h>
24203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker#include <android/hardware/drm/1.0/types.h>
25203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker#include <android/hardware/drm/1.1/types.h>
26203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker#include <android/hidl/allocator/1.0/IAllocator.h>
27203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker#include <android/hidl/manager/1.0/IServiceManager.h>
28203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker#include <gtest/gtest.h>
29203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker#include <hidl/HidlSupport.h>
30203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker#include <hidl/ServiceManagement.h>
31203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker#include <hidlmemory/mapping.h>
32203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker#include <log/log.h>
33203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker#include <memory>
34203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker#include <openssl/aes.h>
35203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker#include <random>
36203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker
37203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker#include "VtsHalHidlTargetTestBase.h"
38203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker#include "VtsHalHidlTargetTestEnvBase.h"
39203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker
40203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinkernamespace drm = ::android::hardware::drm;
41203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinkerusing ::android::hardware::drm::V1_0::BufferType;
42203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinkerusing ::android::hardware::drm::V1_0::DestinationBuffer;
43203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinkerusing ::android::hardware::drm::V1_0::ICryptoPlugin;
44203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinkerusing ::android::hardware::drm::V1_0::KeyedVector;
45203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinkerusing ::android::hardware::drm::V1_0::KeyValue;
46203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinkerusing ::android::hardware::drm::V1_0::KeyType;
47203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinkerusing ::android::hardware::drm::V1_0::Mode;
48203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinkerusing ::android::hardware::drm::V1_0::Pattern;
49203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinkerusing ::android::hardware::drm::V1_0::SecureStop;
50203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinkerusing ::android::hardware::drm::V1_0::SecureStopId;
51203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinkerusing ::android::hardware::drm::V1_0::SessionId;
52203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinkerusing ::android::hardware::drm::V1_0::SharedBuffer;
53203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinkerusing ::android::hardware::drm::V1_0::Status;
54203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinkerusing ::android::hardware::drm::V1_0::SubSample;
55203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinkerusing ::android::hardware::drm::V1_0::SubSample;
56203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker
579d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stoneusing ::android::hardware::drm::V1_1::DrmMetricGroup;
58203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinkerusing ::android::hardware::drm::V1_1::HdcpLevel;
59203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinkerusing ::android::hardware::drm::V1_1::ICryptoFactory;
60203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinkerusing ::android::hardware::drm::V1_1::IDrmFactory;
61203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinkerusing ::android::hardware::drm::V1_1::IDrmPlugin;
622b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinkerusing ::android::hardware::drm::V1_1::KeyRequestType;
632b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinkerusing ::android::hardware::drm::V1_1::SecureStopRelease;
64203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinkerusing ::android::hardware::drm::V1_1::SecurityLevel;
65203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinkerusing ::android::hardware::drm::V1_1::SecurityLevel;
66203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker
67203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinkerusing ::android::hardware::hidl_array;
68203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinkerusing ::android::hardware::hidl_string;
69203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinkerusing ::android::hardware::hidl_memory;
70203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinkerusing ::android::hardware::hidl_vec;
71203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinkerusing ::android::hardware::Return;
72203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinkerusing ::android::hidl::allocator::V1_0::IAllocator;
73203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinkerusing ::android::hidl::memory::V1_0::IMemory;
74203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinkerusing ::android::sp;
75203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker
76203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinkerusing std::string;
77203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinkerusing std::unique_ptr;
78203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinkerusing std::random_device;
79203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinkerusing std::map;
80203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinkerusing std::mt19937;
81203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinkerusing std::vector;
82203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker
83203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker/**
84203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker * These clearkey tests use white box knowledge of the legacy clearkey
85203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker * plugin to verify that the HIDL HAL services and interfaces are working.
86203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker * It is not intended to verify any vendor's HAL implementation. If you
87203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker * are looking for vendor HAL tests, see drm_hal_vendor_test.cpp
88203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker */
89203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker#define ASSERT_OK(ret) ASSERT_TRUE(ret.isOk())
90203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker#define EXPECT_OK(ret) EXPECT_TRUE(ret.isOk())
91203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker
92203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker// To be used in mpd to specify drm scheme for players
93203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinkerstatic const uint8_t kClearKeyUUID[16] = {
94203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker    0xE2, 0x71, 0x9D, 0x58, 0xA9, 0x85, 0xB3, 0xC9,
95203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker    0x78, 0x1A, 0xB0, 0x30, 0xAF, 0x78, 0xD3, 0x0E};
96203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker
97203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker// Test environment for drm
98203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinkerclass DrmHidlEnvironment : public ::testing::VtsHalHidlTargetTestEnvBase {
99203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker   public:
100203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker    // get the test environment singleton
101203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker    static DrmHidlEnvironment* Instance() {
102203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker        static DrmHidlEnvironment* instance = new DrmHidlEnvironment;
103203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker        return instance;
104203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker    }
105203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker
106203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker    virtual void HidlSetUp() override { ALOGI("SetUp DrmHidlEnvironment"); }
107203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker
108203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker    virtual void HidlTearDown() override { ALOGI("TearDown DrmHidlEnvironment"); }
109203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker
110cf50a32e57140b29d65e370cf0808ad91978d969Zhuoyao Zhang    void registerTestServices() override {
111cf50a32e57140b29d65e370cf0808ad91978d969Zhuoyao Zhang        registerTestService<ICryptoFactory>();
112cf50a32e57140b29d65e370cf0808ad91978d969Zhuoyao Zhang        registerTestService<IDrmFactory>();
113cf50a32e57140b29d65e370cf0808ad91978d969Zhuoyao Zhang        setServiceCombMode(::testing::HalServiceCombMode::NO_COMBINATION);
114cf50a32e57140b29d65e370cf0808ad91978d969Zhuoyao Zhang    }
115cf50a32e57140b29d65e370cf0808ad91978d969Zhuoyao Zhang
116203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker   private:
117203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker    DrmHidlEnvironment() {}
118203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker
119203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker    GTEST_DISALLOW_COPY_AND_ASSIGN_(DrmHidlEnvironment);
120203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker};
121203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker
122203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker
123203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinkerclass DrmHalClearkeyTest : public ::testing::VtsHalHidlTargetTestBase {
124203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinkerpublic:
125203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker    virtual void SetUp() override {
126203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker        const ::testing::TestInfo* const test_info =
127203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker                ::testing::UnitTest::GetInstance()->current_test_info();
128203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker
129203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker        ALOGD("DrmHalClearkeyTest: Running test %s.%s", test_info->test_case_name(),
130203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker                test_info->name());
131203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker
132203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker        auto manager = android::hardware::defaultServiceManager();
133203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker        ASSERT_NE(nullptr, manager.get());
134203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker        manager->listByInterface(IDrmFactory::descriptor,
135203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker                [&](const hidl_vec<hidl_string> &registered) {
136203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker                    for (const auto &instance : registered) {
137203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker                        sp<IDrmFactory> drmFactory =
138203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker                                ::testing::VtsHalHidlTargetTestBase::getService<IDrmFactory>(instance);
139203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker                        drmPlugin = createDrmPlugin(drmFactory);
140203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker                        if (drmPlugin != nullptr) {
141203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker                            break;
142203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker                        }
143203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker                    }
144203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker                }
145203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker            );
146203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker
147203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker        manager->listByInterface(ICryptoFactory::descriptor,
148203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker                [&](const hidl_vec<hidl_string> &registered) {
149203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker                    for (const auto &instance : registered) {
150203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker                        sp<ICryptoFactory> cryptoFactory =
151203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker                                ::testing::VtsHalHidlTargetTestBase::getService<ICryptoFactory>(instance);
152203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker                        cryptoPlugin = createCryptoPlugin(cryptoFactory);
153203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker                        if (cryptoPlugin != nullptr) {
154203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker                            break;
155203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker                        }
156203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker                    }
157203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker                }
158203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker            );
159203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker
160203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker        ASSERT_NE(nullptr, drmPlugin.get()) << "Can't find clearkey drm@1.1 plugin";
161203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker        ASSERT_NE(nullptr, cryptoPlugin.get()) << "Can't find clearkey crypto@1.1 plugin";
162203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker    }
163203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker
164203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker
165203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker    virtual void TearDown() override {}
166203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker
167203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker    SessionId openSession();
1686c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker    SessionId openSession(SecurityLevel level);
169203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker    void closeSession(const SessionId& sessionId);
170203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker    hidl_vec<uint8_t> loadKeys(const SessionId& sessionId, const KeyType& type);
171203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker
172203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker  private:
173203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker    sp<IDrmPlugin> createDrmPlugin(sp<IDrmFactory> drmFactory) {
174203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker        if (drmFactory == nullptr) {
175203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker            return nullptr;
176203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker        }
177203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker        sp<IDrmPlugin> plugin = nullptr;
178203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker        auto res = drmFactory->createPlugin(
179203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker                kClearKeyUUID, "",
180203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker                        [&](Status status, const sp<drm::V1_0::IDrmPlugin>& pluginV1_0) {
181203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker                    EXPECT_EQ(Status::OK, status);
182203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker                    plugin = IDrmPlugin::castFrom(pluginV1_0);
183203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker                });
184203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker
185203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker        if (!res.isOk()) {
186203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker            ALOGE("createDrmPlugin remote call failed");
187203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker        }
188203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker        return plugin;
189203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker    }
190203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker
191203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker    sp<ICryptoPlugin> createCryptoPlugin(sp<ICryptoFactory> cryptoFactory) {
192203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker        if (cryptoFactory == nullptr) {
193203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker            return nullptr;
194203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker        }
195203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker        sp<ICryptoPlugin> plugin = nullptr;
196203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker        hidl_vec<uint8_t> initVec;
197203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker        auto res = cryptoFactory->createPlugin(
198203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker                kClearKeyUUID, initVec,
199203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker                        [&](Status status, const sp<drm::V1_0::ICryptoPlugin>& pluginV1_0) {
200203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker                    EXPECT_EQ(Status::OK, status);
201203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker                    plugin = pluginV1_0;
202203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker                });
203203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker        if (!res.isOk()) {
204203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker            ALOGE("createCryptoPlugin remote call failed");
205203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker        }
206203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker        return plugin;
207203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker    }
208203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker
209203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinkerprotected:
2109d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone template <typename CT>
2119d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone bool ValueEquals(DrmMetricGroup::ValueType type, const std::string& expected, const CT& actual) {
2129d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone     return type == DrmMetricGroup::ValueType::STRING_TYPE && expected == actual.stringValue;
2139d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone }
2149d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone
2159d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone template <typename CT>
2169d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone bool ValueEquals(DrmMetricGroup::ValueType type, const int64_t expected, const CT& actual) {
2179d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone     return type == DrmMetricGroup::ValueType::INT64_TYPE && expected == actual.int64Value;
2189d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone }
2199d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone
2209d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone template <typename CT>
2219d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone bool ValueEquals(DrmMetricGroup::ValueType type, const double expected, const CT& actual) {
2229d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone     return type == DrmMetricGroup::ValueType::DOUBLE_TYPE && expected == actual.doubleValue;
2239d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone }
2249d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone
2259d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone template <typename AT, typename VT>
2269d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone bool ValidateMetricAttributeAndValue(const DrmMetricGroup::Metric& metric,
2279d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone                                      const std::string& attributeName, const AT& attributeValue,
2289d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone                                      const std::string& componentName, const VT& componentValue) {
2299d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone     bool validAttribute = false;
2309d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone     bool validComponent = false;
2319d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone     for (DrmMetricGroup::Attribute attribute : metric.attributes) {
2329d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone         if (attribute.name == attributeName &&
2339d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone             ValueEquals(attribute.type, attributeValue, attribute)) {
2349d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone             validAttribute = true;
2359d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone         }
2369d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone     }
2379d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone     for (DrmMetricGroup::Value value : metric.values) {
2389d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone         if (value.componentName == componentName &&
2399d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone             ValueEquals(value.type, componentValue, value)) {
2409d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone             validComponent = true;
2419d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone         }
2429d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone     }
2439d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone     return validAttribute && validComponent;
2449d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone }
2459d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone
2469d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone template <typename AT, typename VT>
2479d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone bool ValidateMetricAttributeAndValue(const hidl_vec<DrmMetricGroup>& metricGroups,
2489d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone                                      const std::string& metricName,
2499d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone                                      const std::string& attributeName, const AT& attributeValue,
2509d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone                                      const std::string& componentName, const VT& componentValue) {
2519d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone     bool foundMetric = false;
2529d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone     for (const auto& group : metricGroups) {
2539d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone         for (const auto& metric : group.metrics) {
2549d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone             if (metric.name == metricName) {
2559d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone                 foundMetric = foundMetric || ValidateMetricAttributeAndValue(
2569d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone                                                  metric, attributeName, attributeValue,
2579d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone                                                  componentName, componentValue);
2589d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone             }
2599d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone         }
2609d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone     }
2619d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone     return foundMetric;
2629d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone }
2639d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone
2649d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone sp<IDrmPlugin> drmPlugin;
2659d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone sp<ICryptoPlugin> cryptoPlugin;
266203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker};
267203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker
268203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker
269203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker/**
270203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker * Helper method to open a session and verify that a non-empty
271203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker * session ID is returned
272203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker */
273203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff TinkerSessionId DrmHalClearkeyTest::openSession() {
274203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker    SessionId sessionId;
275203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker
276203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker    auto res = drmPlugin->openSession(
277203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker            [&sessionId](Status status, const SessionId& id) {
278203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker                EXPECT_EQ(Status::OK, status);
279203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker                EXPECT_NE(0u, id.size());
280203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker                sessionId = id;
281203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker            });
282203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker    EXPECT_OK(res);
283203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker    return sessionId;
284203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker}
285203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker
286203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker/**
2876c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker * Helper method to open as session using V1.1 API
2886c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker */
2896c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff TinkerSessionId DrmHalClearkeyTest::openSession(SecurityLevel level) {
2906c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker    SessionId sessionId;
2916c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker
2926c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker    auto res = drmPlugin->openSession_1_1(level,
2936c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker            [&sessionId](Status status, const SessionId& id) {
2946c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker                EXPECT_EQ(Status::OK, status);
2956c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker                EXPECT_NE(0u, id.size());
2966c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker                sessionId = id;
2976c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker            });
2986c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker    EXPECT_OK(res);
2996c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker    return sessionId;
3006c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker}
3016c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker
3026c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker
3036c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker/**
304203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker * Helper method to close a session
305203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker */
306203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinkervoid DrmHalClearkeyTest::closeSession(const SessionId& sessionId) {
307203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker    EXPECT_TRUE(drmPlugin->closeSession(sessionId).isOk());
308203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker}
309203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker
310203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker/**
3112b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker * Helper method to load keys for subsequent decrypt tests.
3122b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker * These tests use predetermined key request/response to
3132b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker * avoid requiring a round trip to a license server.
3142b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker */
3152b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinkerhidl_vec<uint8_t> DrmHalClearkeyTest::loadKeys(
3162b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    const SessionId& sessionId, const KeyType& type = KeyType::STREAMING) {
3172b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    hidl_vec<uint8_t> initData = {
3182b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker        // BMFF box header (4 bytes size + 'pssh')
3192b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker        0x00, 0x00, 0x00, 0x34, 0x70, 0x73, 0x73, 0x68,
3202b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker        // full box header (version = 1 flags = 0)
3212b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker        0x01, 0x00, 0x00, 0x00,
3222b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker        // system id
3232b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker        0x10, 0x77, 0xef, 0xec, 0xc0, 0xb2, 0x4d, 0x02, 0xac, 0xe3, 0x3c,
3242b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker        0x1e, 0x52, 0xe2, 0xfb, 0x4b,
3252b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker        // number of key ids
3262b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker        0x00, 0x00, 0x00, 0x01,
3272b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker        // key id
3282b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker        0x60, 0x06, 0x1e, 0x01, 0x7e, 0x47, 0x7e, 0x87, 0x7e, 0x57, 0xd0,
3292b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker        0x0d, 0x1e, 0xd0, 0x0d, 0x1e,
3302b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker        // size of data, must be zero
3312b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker        0x00, 0x00, 0x00, 0x00};
3322b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker
3332b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    hidl_vec<uint8_t> expectedKeyRequest = {
3342b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker        0x7b, 0x22, 0x6b, 0x69, 0x64, 0x73, 0x22, 0x3a, 0x5b, 0x22, 0x59, 0x41, 0x59, 0x65,
3352b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker        0x41, 0x58, 0x35, 0x48, 0x66, 0x6f, 0x64, 0x2d, 0x56, 0x39, 0x41, 0x4e, 0x48, 0x74,
3362b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker        0x41, 0x4e, 0x48, 0x67, 0x22, 0x5d, 0x2c, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a,
3372b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker        0x22, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x72, 0x79, 0x22, 0x7d};
3382b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker
3392b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    hidl_vec<uint8_t> knownKeyResponse = {
3402b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker        0x7b, 0x22, 0x6b, 0x65, 0x79, 0x73, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x6b, 0x74, 0x79, 0x22,
3412b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker        0x3a, 0x22, 0x6f, 0x63, 0x74, 0x22, 0x2c, 0x22, 0x6b, 0x69, 0x64, 0x22, 0x3a, 0x22, 0x59,
3422b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker        0x41, 0x59, 0x65, 0x41, 0x58, 0x35, 0x48, 0x66, 0x6f, 0x64, 0x2d, 0x56, 0x39, 0x41, 0x4e,
3432b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker        0x48, 0x74, 0x41, 0x4e, 0x48, 0x67, 0x22, 0x2c, 0x22, 0x6b, 0x22, 0x3a, 0x22, 0x47, 0x6f,
3442b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker        0x6f, 0x67, 0x6c, 0x65, 0x54, 0x65, 0x73, 0x74, 0x4b, 0x65, 0x79, 0x42, 0x61, 0x73, 0x65,
3452b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker        0x36, 0x34, 0x67, 0x67, 0x67, 0x22, 0x7d, 0x5d, 0x7d, 0x0a};
3462b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker
3472b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    hidl_string mimeType = "video/mp4";
3482b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    KeyedVector optionalParameters;
3492b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    auto res = drmPlugin->getKeyRequest_1_1(
3502b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker        sessionId, initData, mimeType, type, optionalParameters,
3512b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker        [&](Status status, const hidl_vec<uint8_t>& request,
3522b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker            KeyRequestType requestType, const hidl_string&) {
3532b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker            EXPECT_EQ(Status::OK, status);
3542b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker            EXPECT_EQ(KeyRequestType::INITIAL, requestType);
3552b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker            EXPECT_EQ(request, expectedKeyRequest);
3562b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker        });
3572b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    EXPECT_OK(res);
3582b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker
3592b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    hidl_vec<uint8_t> keySetId;
3602b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    res = drmPlugin->provideKeyResponse(
3612b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker        sessionId, knownKeyResponse,
3622b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker        [&](Status status, const hidl_vec<uint8_t>& myKeySetId) {
3632b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker            EXPECT_EQ(Status::OK, status);
3642b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker            EXPECT_EQ(0u, myKeySetId.size());
3652b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker            keySetId = myKeySetId;
3662b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker        });
3672b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    EXPECT_OK(res);
3682b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    return keySetId;
3692b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker}
3702b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker
3712b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker/**
3722b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker * Test openSession negative case: security level higher than supported
3732b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker */
3742b46111ec8c45f560a68c1f7589869ad22544002Jeff TinkerTEST_F(DrmHalClearkeyTest, OpenSessionBadLevel) {
3752b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    auto res = drmPlugin->openSession_1_1(SecurityLevel::HW_SECURE_ALL,
3762b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker            [&](Status status, const SessionId& /* id */) {
3772b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker                EXPECT_EQ(Status::ERROR_DRM_CANNOT_HANDLE, status);
3782b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker            });
3792b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    EXPECT_OK(res);
3802b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker}
3812b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker
3822b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker/**
3832b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker * Test getKeyRequest_1_1 via loadKeys
3842b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker */
3852b46111ec8c45f560a68c1f7589869ad22544002Jeff TinkerTEST_F(DrmHalClearkeyTest, GetKeyRequest) {
3862b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    auto sessionId = openSession();
3872b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    loadKeys(sessionId);
3882b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    closeSession(sessionId);
3892b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker}
3902b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker
3912b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker/**
3922b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker * A get key request should fail if no sessionId is provided
3932b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker */
3942b46111ec8c45f560a68c1f7589869ad22544002Jeff TinkerTEST_F(DrmHalClearkeyTest, GetKeyRequestNoSession) {
3952b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    SessionId invalidSessionId;
3962b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    hidl_vec<uint8_t> initData;
3972b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    hidl_string mimeType = "video/mp4";
3982b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    KeyedVector optionalParameters;
3992b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    auto res = drmPlugin->getKeyRequest_1_1(
4002b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker            invalidSessionId, initData, mimeType, KeyType::STREAMING,
4012b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker            optionalParameters,
4022b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker            [&](Status status, const hidl_vec<uint8_t>&, KeyRequestType,
4032b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker                const hidl_string&) { EXPECT_EQ(Status::BAD_VALUE, status); });
4042b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    EXPECT_OK(res);
4052b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker}
4062b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker
4072b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker/**
4082b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker * The clearkey plugin doesn't support offline key requests.
4092b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker * Test that the plugin returns the expected error code in
4102b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker * this case.
4112b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker */
4122b46111ec8c45f560a68c1f7589869ad22544002Jeff TinkerTEST_F(DrmHalClearkeyTest, GetKeyRequestOfflineKeyTypeNotSupported) {
4132b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    auto sessionId = openSession();
4142b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    hidl_vec<uint8_t> initData;
4152b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    hidl_string mimeType = "video/mp4";
4162b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    KeyedVector optionalParameters;
4172b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker
4182b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    auto res = drmPlugin->getKeyRequest_1_1(
4192b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker            sessionId, initData, mimeType, KeyType::OFFLINE, optionalParameters,
4202b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker            [&](Status status, const hidl_vec<uint8_t>&, KeyRequestType,
4212b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker                const hidl_string&) {
4222b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker                // Clearkey plugin doesn't support offline key type
4232b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker                EXPECT_EQ(Status::ERROR_DRM_CANNOT_HANDLE, status);
4242b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker            });
4252b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    EXPECT_OK(res);
4262b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    closeSession(sessionId);
4272b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker}
4282b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker
4292b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker/**
430203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker * Test that the plugin returns valid connected and max HDCP levels
431203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker */
432203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff TinkerTEST_F(DrmHalClearkeyTest, GetHdcpLevels) {
433203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker    auto res = drmPlugin->getHdcpLevels(
434203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker            [&](Status status, const HdcpLevel &connectedLevel,
435203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker                const HdcpLevel &maxLevel) {
436203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker                EXPECT_EQ(Status::OK, status);
437203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker                EXPECT_GE(connectedLevel, HdcpLevel::HDCP_NONE);
438203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker                EXPECT_LE(maxLevel, HdcpLevel::HDCP_NO_OUTPUT);
439203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker            });
440203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker    EXPECT_OK(res);
441203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker}
442203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker
443203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker/**
4442b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker * Since getHdcpLevels only queries information there are no
4452b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker * negative cases.
4462b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker */
4472b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker
4482b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker/**
4496c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker * Test that the plugin returns default open and max session counts
450203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker */
4516c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff TinkerTEST_F(DrmHalClearkeyTest, GetDefaultSessionCounts) {
452203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker    auto res = drmPlugin->getNumberOfSessions(
453203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker            [&](Status status, uint32_t currentSessions,
454203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker                    uint32_t maxSessions) {
455203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker                EXPECT_EQ(Status::OK, status);
4566c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker                EXPECT_GE(maxSessions, (uint32_t)8);
457203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker                EXPECT_GE(currentSessions, (uint32_t)0);
458203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker                EXPECT_LE(currentSessions, maxSessions);
459203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker            });
460203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker    EXPECT_OK(res);
461203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker}
462203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker
463203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker/**
4646c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker * Test that the plugin returns valid open and max session counts
4656c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker * after a session is opened.
466203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker */
4676c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff TinkerTEST_F(DrmHalClearkeyTest, GetOpenSessionCounts) {
4686c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker    uint32_t initialSessions = 0;
4696c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker    auto res = drmPlugin->getNumberOfSessions(
4706c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker            [&](Status status, uint32_t currentSessions,
4716c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker                    uint32_t maxSessions) {
4726c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker                EXPECT_EQ(Status::OK, status);
4736c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker                EXPECT_GE(maxSessions, (uint32_t)8);
4746c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker                EXPECT_GE(currentSessions, (uint32_t)0);
4756c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker                EXPECT_LE(currentSessions, maxSessions);
4766c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker                initialSessions = currentSessions;
4776c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker            });
4786c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker    EXPECT_OK(res);
4796c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker
480203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker    SessionId session = openSession();
4816c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker    res = drmPlugin->getNumberOfSessions(
4826c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker            [&](Status status, uint32_t currentSessions,
4836c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker                    uint32_t /*maxSessions*/) {
484203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker                EXPECT_EQ(Status::OK, status);
4856c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker                EXPECT_EQ(currentSessions, initialSessions + 1);
486203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker            });
487203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker    EXPECT_OK(res);
488203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker
4896c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker    closeSession(session);
4906c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker    res = drmPlugin->getNumberOfSessions(
4916c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker            [&](Status status, uint32_t currentSessions,
4926c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker                    uint32_t /*maxSessions*/) {
4936c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker                EXPECT_EQ(Status::OK, status);
4946c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker                EXPECT_EQ(currentSessions, initialSessions);
49545c3855f4fc04fc80f354139b7f084ca817f3db1Jeff Tinker            });
49645c3855f4fc04fc80f354139b7f084ca817f3db1Jeff Tinker    EXPECT_OK(res);
4976ec159b78041506efd7467672b5fd4c89f3d90c1Tobias Thierer}
498203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker
4996ec159b78041506efd7467672b5fd4c89f3d90c1Tobias Thierer/**
5002b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker * Since getNumberOfSessions only queries information there are no
5012b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker * negative cases.
5022b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker */
5032b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker
5042b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker/**
5056c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker * Test that the plugin returns the same security level
5066c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker * by default as when it is requested explicitly
5076ec159b78041506efd7467672b5fd4c89f3d90c1Tobias Thierer */
5086c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff TinkerTEST_F(DrmHalClearkeyTest, GetDefaultSecurityLevel) {
5096ec159b78041506efd7467672b5fd4c89f3d90c1Tobias Thierer    SessionId session = openSession();
5106c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker    SecurityLevel defaultLevel;
5116c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker    auto res = drmPlugin->getSecurityLevel(session,
5126c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker            [&](Status status, SecurityLevel level) {
5136c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker                EXPECT_EQ(Status::OK, status);
5146c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker                defaultLevel = level;
5156c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker            });
5166c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker    EXPECT_OK(res);
5176c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker    closeSession(session);
5186ec159b78041506efd7467672b5fd4c89f3d90c1Tobias Thierer
5196c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker    session = openSession(defaultLevel);
5206c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker    res = drmPlugin->getSecurityLevel(session,
5216c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker            [&](Status status, SecurityLevel level) {
5226c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker                EXPECT_EQ(Status::OK, status);
5236c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker                EXPECT_EQ(level, defaultLevel);
5246c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker            });
5256c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker    EXPECT_OK(res);
526203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker    closeSession(session);
527203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker}
528203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker
529203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker/**
5306c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker * Test that the plugin returns the lowest security level
5316c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker * when it is requested
532203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker */
5336c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff TinkerTEST_F(DrmHalClearkeyTest, GetSecurityLevel) {
5346c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker    SessionId session = openSession(SecurityLevel::SW_SECURE_CRYPTO);
5356c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker    auto res = drmPlugin->getSecurityLevel(session,
5366c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker            [&](Status status, SecurityLevel level) {
5376c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker                EXPECT_EQ(Status::OK, status);
5386c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker                EXPECT_EQ(level, SecurityLevel::SW_SECURE_CRYPTO);
5396c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker            });
5406c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker    EXPECT_OK(res);
541203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker    closeSession(session);
542203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker}
543203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker
544203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker/**
5456c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker * Test that the plugin returns the documented error
5466c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker * when requesting the security level for an invalid sessionId
547203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker */
5486c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff TinkerTEST_F(DrmHalClearkeyTest, GetSecurityLevelInvalidSessionId) {
549203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker    SessionId session;
5506c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker    auto res = drmPlugin->getSecurityLevel(session,
5516c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker            [&](Status status, SecurityLevel /*level*/) {
5526c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker                EXPECT_EQ(Status::BAD_VALUE, status);
5536c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker            });
5546c2589f524eeeb44e8d90610dcc42f6f3cedc447Jeff Tinker    EXPECT_OK(res);
555203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker}
556203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker
5579d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone/**
5589d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone * Test metrics are set appropriately for open and close operations.
5599d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone */
5602b46111ec8c45f560a68c1f7589869ad22544002Jeff TinkerTEST_F(DrmHalClearkeyTest, GetMetricsOpenClose) {
5619d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone    SessionId sessionId = openSession();
5629d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone    // The first close should be successful.
5639d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone    closeSession(sessionId);
5649d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone    // The second close should fail (not opened).
5659d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone    EXPECT_EQ(Status::ERROR_DRM_SESSION_NOT_OPENED, drmPlugin->closeSession(sessionId));
5669d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone
5679d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone    auto res = drmPlugin->getMetrics([this](Status status, hidl_vec<DrmMetricGroup> metricGroups) {
5689d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone        EXPECT_EQ(Status::OK, status);
5699d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone
5709d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone        // Verify the open_session metric.
5719d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone        EXPECT_TRUE(ValidateMetricAttributeAndValue(metricGroups, "open_session", "status",
5729d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone                                                    (int64_t)0, "count", (int64_t)1));
5739d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone        // Verify the close_session - success metric.
5749d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone        EXPECT_TRUE(ValidateMetricAttributeAndValue(metricGroups, "close_session", "status",
5759d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone                                                    (int64_t)0, "count", (int64_t)1));
5769d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone        // Verify the close_session - error metric.
5779d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone        EXPECT_TRUE(ValidateMetricAttributeAndValue(metricGroups, "close_session", "status",
5789d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone                                                    (int64_t)Status::ERROR_DRM_SESSION_NOT_OPENED,
5799d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone                                                    "count", (int64_t)1));
5809d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone    });
5812b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    EXPECT_OK(res);
5822b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker}
5832b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker
5842b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker/**
5852b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker * Since getMetrics only queries information there are no
5862b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker * negative cases.
5872b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker */
5882b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker
5892b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker/**
5902b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker * Test that there are no secure stop ids after clearing them
5912b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker */
5922b46111ec8c45f560a68c1f7589869ad22544002Jeff TinkerTEST_F(DrmHalClearkeyTest, GetSecureStopIdsCleared) {
5932b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    auto stat = drmPlugin->removeAllSecureStops();
5942b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    EXPECT_OK(stat);
5952b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker
5962b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    bool ok = drmPlugin->getSecureStopIds(
5972b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker            [&](Status status, const hidl_vec<SecureStopId>& ids) {
5982b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker                EXPECT_EQ(Status::OK, status);
5992b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker                EXPECT_EQ(0u, ids.size());
6002b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker            }).isOk();
6012b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    EXPECT_TRUE(ok);
6022b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker}
6032b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker
6042b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker/**
6052b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker * Test that there are secure stop ids after loading keys once
6062b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker */
6072b46111ec8c45f560a68c1f7589869ad22544002Jeff TinkerTEST_F(DrmHalClearkeyTest, GetSecureStopIdsOnce) {
6082b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    auto stat = drmPlugin->removeAllSecureStops();
6092b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    EXPECT_OK(stat);
6102b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker
6112b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    auto sessionId = openSession();
6122b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    loadKeys(sessionId);
6132b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    closeSession(sessionId);
6142b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker
6152b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    auto res = drmPlugin->getSecureStopIds(
6162b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker            [&](Status status, const hidl_vec<SecureStopId>& ids) {
6172b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker                EXPECT_EQ(Status::OK, status);
6182b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker                EXPECT_EQ(1u, ids.size());
6192b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker            });
6202b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    EXPECT_OK(res);
6212b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker
6222b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    stat = drmPlugin->removeAllSecureStops();
6232b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    EXPECT_OK(stat);
6242b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker
6252b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    res = drmPlugin->getSecureStopIds(
6262b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker            [&](Status status, const hidl_vec<SecureStopId>& ids) {
6272b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker                EXPECT_EQ(Status::OK, status);
6282b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker                EXPECT_EQ(0u, ids.size());
6292b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker            });
6302b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    EXPECT_OK(res);
6312b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker}
6322b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker
6332b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker/**
6342b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker * Since getSecureStopIds only queries information there are no
6352b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker * negative cases.
6362b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker */
6372b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker
6382b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker/**
6392b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker * Test that the clearkey plugin reports no secure stops when
6402b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker * there are none.
6412b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker */
6422b46111ec8c45f560a68c1f7589869ad22544002Jeff TinkerTEST_F(DrmHalClearkeyTest, GetNoSecureStops) {
6432b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    auto stat = drmPlugin->removeAllSecureStops();
6442b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    EXPECT_OK(stat);
6452b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker
6462b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    auto res = drmPlugin->getSecureStops(
6472b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker            [&](Status status, const hidl_vec<SecureStop>& stops) {
6482b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker                EXPECT_EQ(Status::OK, status);
6492b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker                EXPECT_EQ(0u, stops.size());
6502b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker            });
6512b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    EXPECT_OK(res);
6522b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker}
6532b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker
6542b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker/**
6552b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker * Test get/remove of one secure stop
6562b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker */
6572b46111ec8c45f560a68c1f7589869ad22544002Jeff TinkerTEST_F(DrmHalClearkeyTest, GetOneSecureStopAndRemoveIt) {
6582b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    auto stat = drmPlugin->removeAllSecureStops();
6592b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    EXPECT_OK(stat);
6602b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker
6612b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    auto sessionId = openSession();
6622b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    loadKeys(sessionId);
6632b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    closeSession(sessionId);
6642b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker
6652b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    auto res = drmPlugin->getSecureStops(
6662b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker            [&](Status status, const hidl_vec<SecureStop>& stops) {
6672b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker                EXPECT_EQ(Status::OK, status);
6682b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker                EXPECT_EQ(1u, stops.size());
6692b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker            });
6702b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    EXPECT_OK(res);
6712b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker
6722b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    stat = drmPlugin->removeAllSecureStops();
6732b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    EXPECT_OK(stat);
6742b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker
6752b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    res = drmPlugin->getSecureStops(
6762b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker            [&](Status status, const hidl_vec<SecureStop>& stops) {
6772b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker                EXPECT_EQ(Status::OK, status);
6782b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker                EXPECT_EQ(0u, stops.size());
6792b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker            });
6802b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    EXPECT_OK(res);
6819d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone}
6829d127768d13ff19ece86ef2c9962e9c7db6dcca0Adam Stone
6832b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker/**
6842b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker * Since getSecureStops only queries information there are no
6852b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker * negative cases.
6862b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker */
6872b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker
6882b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker/**
6892b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker * Test that there are no secure stops after clearing them
6902b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker */
6912b46111ec8c45f560a68c1f7589869ad22544002Jeff TinkerTEST_F(DrmHalClearkeyTest, GetSecureStopsCleared) {
6922b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    auto stat = drmPlugin->removeAllSecureStops();
6932b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    EXPECT_OK(stat);
6942b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker
6952b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    auto res = drmPlugin->getSecureStops(
6962b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker            [&](Status status, const hidl_vec<SecureStop>& stops) {
6972b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker                EXPECT_EQ(Status::OK, status);
6982b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker                EXPECT_EQ(0u, stops.size());
6992b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker            });
7002b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    EXPECT_OK(res);
7012b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker}
7022b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker
7032b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker/**
7042b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker * Test that there are secure stops after loading keys once
7052b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker */
7062b46111ec8c45f560a68c1f7589869ad22544002Jeff TinkerTEST_F(DrmHalClearkeyTest, GetSecureStopsOnce) {
7072b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    auto stat = drmPlugin->removeAllSecureStops();
7082b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    EXPECT_OK(stat);
7092b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker
7102b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    auto sessionId = openSession();
7112b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    loadKeys(sessionId);
7122b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    closeSession(sessionId);
7132b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker
7142b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    auto res = drmPlugin->getSecureStops(
7152b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker            [&](Status status, const hidl_vec<SecureStop>& stops) {
7162b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker                EXPECT_EQ(Status::OK, status);
7172b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker                EXPECT_EQ(1u, stops.size());
7182b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker            });
7192b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    EXPECT_OK(res);
7202b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker
7212b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    stat = drmPlugin->removeAllSecureStops();
7222b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    EXPECT_OK(stat);
7232b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker
7242b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    res = drmPlugin->getSecureStops(
7252b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker            [&](Status status, const hidl_vec<SecureStop>& stops) {
7262b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker                EXPECT_EQ(Status::OK, status);
7272b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker                EXPECT_EQ(0u, stops.size());
7282b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker            });
7292b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    EXPECT_OK(res);
7302b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker}
7312b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker
7322b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker/**
7332b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker * Since getSecureStops only queries information there are no
7342b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker * negative cases.
7352b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker */
7362b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker
7372b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker/**
7382b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker * Test that releasing a secure stop with empty
7392b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker * release message fails with the documented error
7402b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker */
7412b46111ec8c45f560a68c1f7589869ad22544002Jeff TinkerTEST_F(DrmHalClearkeyTest, ReleaseEmptySecureStop) {
7422b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    SecureStopRelease emptyRelease = {.opaqueData = hidl_vec<uint8_t>()};
7432b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    Status status = drmPlugin->releaseSecureStops(emptyRelease);
7442b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    EXPECT_EQ(Status::BAD_VALUE, status);
7452b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker}
7462b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker
7472b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker/**
7482b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker * Helper function to create a secure release message for
7492b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker * a secure stop. The clearkey secure stop release format
7502b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker * is just a count followed by the secure stop opaque data.
7512b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker */
7522b46111ec8c45f560a68c1f7589869ad22544002Jeff TinkerSecureStopRelease makeSecureRelease(const SecureStop &stop) {
7532b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    std::vector<uint8_t> stopData = stop.opaqueData;
7542b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    std::vector<uint8_t> buffer;
7552b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    std::string count = "0001";
7562b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker
7572b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    auto it = buffer.insert(buffer.begin(), count.begin(), count.end());
7582b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    buffer.insert(it + count.size(), stopData.begin(), stopData.end());
7592b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    SecureStopRelease release = { .opaqueData = hidl_vec<uint8_t>(buffer) };
7602b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    return release;
7612b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker}
7622b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker
7632b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker/**
7642b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker * Test that releasing one secure stop works
7652b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker */
7662b46111ec8c45f560a68c1f7589869ad22544002Jeff TinkerTEST_F(DrmHalClearkeyTest, ReleaseOneSecureStop) {
7672b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker
7682b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    auto stat = drmPlugin->removeAllSecureStops();
7692b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    EXPECT_OK(stat);
7702b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker
7712b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    auto sessionId = openSession();
7722b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    loadKeys(sessionId);
7732b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    closeSession(sessionId);
7742b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker
7752b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    SecureStopRelease release;
7762b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    auto res = drmPlugin->getSecureStops(
7772b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker            [&](Status status, const hidl_vec<SecureStop>& stops) {
7782b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker                EXPECT_EQ(Status::OK, status);
7792b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker                EXPECT_EQ(1u, stops.size());
7802b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker                release = makeSecureRelease(stops[0]);
7812b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker            });
7822b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    EXPECT_OK(res);
7832b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker
7842b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    stat = drmPlugin->releaseSecureStops(release);
7852b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    EXPECT_OK(stat);
7862b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker
7872b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    res = drmPlugin->getSecureStops(
7882b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker            [&](Status status, const hidl_vec<SecureStop>& stops) {
7892b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker                EXPECT_EQ(Status::OK, status);
7902b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker                EXPECT_EQ(0u, stops.size());
7912b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker            });
7922b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    EXPECT_OK(res);
7932b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker}
7942b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker
7952b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker
7962b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker/**
7972b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker * Test that removing a secure stop with an empty ID returns
7982b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker * documented error
7992b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker */
8002b46111ec8c45f560a68c1f7589869ad22544002Jeff TinkerTEST_F(DrmHalClearkeyTest, RemoveEmptySecureStopId) {
8012b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    hidl_vec<uint8_t> emptyId;
8022b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    auto stat = drmPlugin->removeSecureStop(emptyId);
8032b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    EXPECT_OK(stat);
8042b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    EXPECT_EQ(Status::BAD_VALUE, stat);
8052b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker}
8062b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker
8072b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker/**
8082b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker * Test that removing a secure stop after it has already
8092b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker * been removed fails with the documented error code.
8102b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker */
8112b46111ec8c45f560a68c1f7589869ad22544002Jeff TinkerTEST_F(DrmHalClearkeyTest, RemoveRemovedSecureStopId) {
8122b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    auto stat = drmPlugin->removeAllSecureStops();
8132b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    EXPECT_OK(stat);
8142b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker
8152b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    auto sessionId = openSession();
8162b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    loadKeys(sessionId);
8172b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    closeSession(sessionId);
8182b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    SecureStopId ssid;
8192b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker
8202b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    auto res = drmPlugin->getSecureStopIds(
8212b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker            [&](Status status, const hidl_vec<SecureStopId>& ids) {
8222b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker                EXPECT_EQ(Status::OK, status);
8232b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker                EXPECT_EQ(1u, ids.size());
8242b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker                ssid = ids[0];
8252b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker            });
8262b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    EXPECT_OK(res);
8272b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker
8282b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    stat = drmPlugin->removeAllSecureStops();
8292b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    EXPECT_OK(stat);
8302b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker
8312b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    Status status = drmPlugin->removeSecureStop(ssid);
8322b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    EXPECT_EQ(Status::BAD_VALUE, status);
8332b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker}
8342b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker
8352b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker/**
8362b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker * Test that removing a secure stop by id works
8372b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker */
8382b46111ec8c45f560a68c1f7589869ad22544002Jeff TinkerTEST_F(DrmHalClearkeyTest, RemoveSecureStopById) {
8392b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    auto stat = drmPlugin->removeAllSecureStops();
8402b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    EXPECT_OK(stat);
8412b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker
8422b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    auto sessionId = openSession();
8432b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    loadKeys(sessionId);
8442b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    closeSession(sessionId);
8452b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    SecureStopId ssid;
8462b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker
8472b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    auto res = drmPlugin->getSecureStopIds(
8482b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker            [&](Status status, const hidl_vec<SecureStopId>& ids) {
8492b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker                EXPECT_EQ(Status::OK, status);
8502b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker                EXPECT_EQ(1u, ids.size());
8512b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker                ssid = ids[0];
8522b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker            });
8532b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    EXPECT_OK(res);
8542b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker
8552b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    stat = drmPlugin->removeSecureStop(ssid);
8562b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    EXPECT_OK(stat);
8572b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker
8582b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    res = drmPlugin->getSecureStopIds(
8592b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker            [&](Status status, const hidl_vec<SecureStopId>& ids) {
8602b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker                EXPECT_EQ(Status::OK, status);
8612b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker                EXPECT_EQ(0u, ids.size());
8622b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker            });
8632b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker    EXPECT_OK(res);
8642b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker}
8652b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker
8662b46111ec8c45f560a68c1f7589869ad22544002Jeff Tinker
867203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinkerint main(int argc, char** argv) {
868203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker    ::testing::AddGlobalTestEnvironment(DrmHidlEnvironment::Instance());
869203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker    ::testing::InitGoogleTest(&argc, argv);
870203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker    DrmHidlEnvironment::Instance()->init(&argc, argv);
871203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker    int status = RUN_ALL_TESTS();
872203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker    ALOGI("Test result = %d", status);
873203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker    return status;
874203c8514e25f34a54aa5984fc3523fb4a9e8c8ebJeff Tinker}
875