1*4d7e907cSAndroid Build Coastguard Worker /*
2*4d7e907cSAndroid Build Coastguard Worker * Copyright (C) 2022 The Android Open Source Project
3*4d7e907cSAndroid Build Coastguard Worker *
4*4d7e907cSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*4d7e907cSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*4d7e907cSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*4d7e907cSAndroid Build Coastguard Worker *
8*4d7e907cSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*4d7e907cSAndroid Build Coastguard Worker *
10*4d7e907cSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*4d7e907cSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*4d7e907cSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*4d7e907cSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*4d7e907cSAndroid Build Coastguard Worker * limitations under the License.
15*4d7e907cSAndroid Build Coastguard Worker */
16*4d7e907cSAndroid Build Coastguard Worker
17*4d7e907cSAndroid Build Coastguard Worker #include <aidl/Gtest.h>
18*4d7e907cSAndroid Build Coastguard Worker #include <aidl/Vintf.h>
19*4d7e907cSAndroid Build Coastguard Worker #include <aidl/android/hardware/secure_element/BnSecureElementCallback.h>
20*4d7e907cSAndroid Build Coastguard Worker #include <aidl/android/hardware/secure_element/ISecureElement.h>
21*4d7e907cSAndroid Build Coastguard Worker #include <android-base/logging.h>
22*4d7e907cSAndroid Build Coastguard Worker #include <android/binder_manager.h>
23*4d7e907cSAndroid Build Coastguard Worker #include <android/binder_process.h>
24*4d7e907cSAndroid Build Coastguard Worker #include <gmock/gmock.h>
25*4d7e907cSAndroid Build Coastguard Worker #include <gtest/gtest.h>
26*4d7e907cSAndroid Build Coastguard Worker
27*4d7e907cSAndroid Build Coastguard Worker #include <chrono>
28*4d7e907cSAndroid Build Coastguard Worker #include <condition_variable>
29*4d7e907cSAndroid Build Coastguard Worker #include <mutex>
30*4d7e907cSAndroid Build Coastguard Worker
31*4d7e907cSAndroid Build Coastguard Worker using namespace std::chrono_literals;
32*4d7e907cSAndroid Build Coastguard Worker
33*4d7e907cSAndroid Build Coastguard Worker using aidl::android::hardware::secure_element::BnSecureElementCallback;
34*4d7e907cSAndroid Build Coastguard Worker using aidl::android::hardware::secure_element::ISecureElement;
35*4d7e907cSAndroid Build Coastguard Worker using aidl::android::hardware::secure_element::LogicalChannelResponse;
36*4d7e907cSAndroid Build Coastguard Worker using ndk::ScopedAStatus;
37*4d7e907cSAndroid Build Coastguard Worker using ndk::SharedRefBase;
38*4d7e907cSAndroid Build Coastguard Worker using ndk::SpAIBinder;
39*4d7e907cSAndroid Build Coastguard Worker using testing::ElementsAre;
40*4d7e907cSAndroid Build Coastguard Worker using testing::ElementsAreArray;
41*4d7e907cSAndroid Build Coastguard Worker
42*4d7e907cSAndroid Build Coastguard Worker #define EXPECT_OK(status) \
43*4d7e907cSAndroid Build Coastguard Worker do { \
44*4d7e907cSAndroid Build Coastguard Worker auto status_impl = (status); \
45*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(status_impl.isOk()) << status_impl.getDescription(); \
46*4d7e907cSAndroid Build Coastguard Worker } while (false)
47*4d7e907cSAndroid Build Coastguard Worker
48*4d7e907cSAndroid Build Coastguard Worker #define EXPECT_ERR(status) \
49*4d7e907cSAndroid Build Coastguard Worker do { \
50*4d7e907cSAndroid Build Coastguard Worker auto status_impl = (status); \
51*4d7e907cSAndroid Build Coastguard Worker EXPECT_FALSE(status_impl.isOk()) << status_impl.getDescription(); \
52*4d7e907cSAndroid Build Coastguard Worker } while (false)
53*4d7e907cSAndroid Build Coastguard Worker
54*4d7e907cSAndroid Build Coastguard Worker // APDU defined in CTS tests.
55*4d7e907cSAndroid Build Coastguard Worker // The applet selected with kSelectableAid will return 256 bytes of data
56*4d7e907cSAndroid Build Coastguard Worker // in response.
57*4d7e907cSAndroid Build Coastguard Worker static const std::vector<uint8_t> kDataApdu = {
58*4d7e907cSAndroid Build Coastguard Worker 0x00, 0x08, 0x00, 0x00, 0x00,
59*4d7e907cSAndroid Build Coastguard Worker };
60*4d7e907cSAndroid Build Coastguard Worker
61*4d7e907cSAndroid Build Coastguard Worker // Selectable test AID defined in CTS tests.
62*4d7e907cSAndroid Build Coastguard Worker static const std::vector<uint8_t> kSelectableAid = {
63*4d7e907cSAndroid Build Coastguard Worker 0xA0, 0x00, 0x00, 0x04, 0x76, 0x41, 0x6E, 0x64,
64*4d7e907cSAndroid Build Coastguard Worker 0x72, 0x6F, 0x69, 0x64, 0x43, 0x54, 0x53, 0x31,
65*4d7e907cSAndroid Build Coastguard Worker };
66*4d7e907cSAndroid Build Coastguard Worker // Non-selectable test AID defined in CTS tests.
67*4d7e907cSAndroid Build Coastguard Worker static const std::vector<uint8_t> kNonSelectableAid = {
68*4d7e907cSAndroid Build Coastguard Worker 0xA0, 0x00, 0x00, 0x04, 0x76, 0x41, 0x6E, 0x64,
69*4d7e907cSAndroid Build Coastguard Worker 0x72, 0x6F, 0x69, 0x64, 0x43, 0x54, 0x53, 0xFF,
70*4d7e907cSAndroid Build Coastguard Worker };
71*4d7e907cSAndroid Build Coastguard Worker
72*4d7e907cSAndroid Build Coastguard Worker class MySecureElementCallback : public BnSecureElementCallback {
73*4d7e907cSAndroid Build Coastguard Worker public:
onStateChange(bool state,const std::string & debugReason)74*4d7e907cSAndroid Build Coastguard Worker ScopedAStatus onStateChange(bool state, const std::string& debugReason) override {
75*4d7e907cSAndroid Build Coastguard Worker {
76*4d7e907cSAndroid Build Coastguard Worker std::unique_lock<std::mutex> l(m);
77*4d7e907cSAndroid Build Coastguard Worker (void)debugReason;
78*4d7e907cSAndroid Build Coastguard Worker history.push_back(state);
79*4d7e907cSAndroid Build Coastguard Worker }
80*4d7e907cSAndroid Build Coastguard Worker cv.notify_one();
81*4d7e907cSAndroid Build Coastguard Worker return ScopedAStatus::ok();
82*4d7e907cSAndroid Build Coastguard Worker };
83*4d7e907cSAndroid Build Coastguard Worker
expectCallbackHistory(std::vector<bool> && want)84*4d7e907cSAndroid Build Coastguard Worker void expectCallbackHistory(std::vector<bool>&& want) {
85*4d7e907cSAndroid Build Coastguard Worker std::unique_lock<std::mutex> l(m);
86*4d7e907cSAndroid Build Coastguard Worker cv.wait_for(l, 5s, [&]() { return history.size() >= want.size(); });
87*4d7e907cSAndroid Build Coastguard Worker EXPECT_THAT(history, ElementsAreArray(want));
88*4d7e907cSAndroid Build Coastguard Worker }
89*4d7e907cSAndroid Build Coastguard Worker
resetCallbackHistory()90*4d7e907cSAndroid Build Coastguard Worker void resetCallbackHistory() {
91*4d7e907cSAndroid Build Coastguard Worker std::unique_lock<std::mutex> l(m);
92*4d7e907cSAndroid Build Coastguard Worker history.clear();
93*4d7e907cSAndroid Build Coastguard Worker }
94*4d7e907cSAndroid Build Coastguard Worker
95*4d7e907cSAndroid Build Coastguard Worker private:
96*4d7e907cSAndroid Build Coastguard Worker std::mutex m; // guards history
97*4d7e907cSAndroid Build Coastguard Worker std::condition_variable cv;
98*4d7e907cSAndroid Build Coastguard Worker std::vector<bool> history;
99*4d7e907cSAndroid Build Coastguard Worker };
100*4d7e907cSAndroid Build Coastguard Worker
101*4d7e907cSAndroid Build Coastguard Worker class SecureElementAidl : public ::testing::TestWithParam<std::string> {
102*4d7e907cSAndroid Build Coastguard Worker public:
SetUp()103*4d7e907cSAndroid Build Coastguard Worker void SetUp() override {
104*4d7e907cSAndroid Build Coastguard Worker SpAIBinder binder = SpAIBinder(AServiceManager_waitForService(GetParam().c_str()));
105*4d7e907cSAndroid Build Coastguard Worker
106*4d7e907cSAndroid Build Coastguard Worker secure_element_ = ISecureElement::fromBinder(binder);
107*4d7e907cSAndroid Build Coastguard Worker ASSERT_NE(secure_element_, nullptr);
108*4d7e907cSAndroid Build Coastguard Worker
109*4d7e907cSAndroid Build Coastguard Worker secure_element_callback_ = SharedRefBase::make<MySecureElementCallback>();
110*4d7e907cSAndroid Build Coastguard Worker ASSERT_NE(secure_element_callback_, nullptr);
111*4d7e907cSAndroid Build Coastguard Worker
112*4d7e907cSAndroid Build Coastguard Worker EXPECT_OK(secure_element_->init(secure_element_callback_));
113*4d7e907cSAndroid Build Coastguard Worker secure_element_callback_->expectCallbackHistory({true});
114*4d7e907cSAndroid Build Coastguard Worker
115*4d7e907cSAndroid Build Coastguard Worker // Check if the basic channel is supported by the bound SE.
116*4d7e907cSAndroid Build Coastguard Worker std::vector<uint8_t> basic_channel_response;
117*4d7e907cSAndroid Build Coastguard Worker auto status =
118*4d7e907cSAndroid Build Coastguard Worker secure_element_->openBasicChannel(kSelectableAid, 0x00, &basic_channel_response);
119*4d7e907cSAndroid Build Coastguard Worker if (status.isOk()) {
120*4d7e907cSAndroid Build Coastguard Worker basic_channel_supported_ = true;
121*4d7e907cSAndroid Build Coastguard Worker secure_element_->closeChannel(0);
122*4d7e907cSAndroid Build Coastguard Worker }
123*4d7e907cSAndroid Build Coastguard Worker }
124*4d7e907cSAndroid Build Coastguard Worker
TearDown()125*4d7e907cSAndroid Build Coastguard Worker void TearDown() override {
126*4d7e907cSAndroid Build Coastguard Worker secure_element_callback_->resetCallbackHistory();
127*4d7e907cSAndroid Build Coastguard Worker EXPECT_OK(secure_element_->reset());
128*4d7e907cSAndroid Build Coastguard Worker secure_element_callback_->expectCallbackHistory({false, true});
129*4d7e907cSAndroid Build Coastguard Worker secure_element_ = nullptr;
130*4d7e907cSAndroid Build Coastguard Worker secure_element_callback_ = nullptr;
131*4d7e907cSAndroid Build Coastguard Worker }
132*4d7e907cSAndroid Build Coastguard Worker
133*4d7e907cSAndroid Build Coastguard Worker // Call transmit with kDataApdu and the selected channel number.
134*4d7e907cSAndroid Build Coastguard Worker // Return the response sstatus code.
transmit(uint8_t channel_number)135*4d7e907cSAndroid Build Coastguard Worker uint16_t transmit(uint8_t channel_number) {
136*4d7e907cSAndroid Build Coastguard Worker std::vector<uint8_t> apdu = kDataApdu;
137*4d7e907cSAndroid Build Coastguard Worker std::vector<uint8_t> response;
138*4d7e907cSAndroid Build Coastguard Worker
139*4d7e907cSAndroid Build Coastguard Worker // Edit the channel number into the CLA header byte.
140*4d7e907cSAndroid Build Coastguard Worker if (channel_number < 4) {
141*4d7e907cSAndroid Build Coastguard Worker apdu[0] |= channel_number;
142*4d7e907cSAndroid Build Coastguard Worker } else {
143*4d7e907cSAndroid Build Coastguard Worker apdu[0] |= (channel_number - 4) | 0x40;
144*4d7e907cSAndroid Build Coastguard Worker }
145*4d7e907cSAndroid Build Coastguard Worker
146*4d7e907cSAndroid Build Coastguard Worker // transmit() will return an empty response with the error
147*4d7e907cSAndroid Build Coastguard Worker // code CHANNEL_NOT_AVAILABLE when the SE cannot be
148*4d7e907cSAndroid Build Coastguard Worker // communicated with.
149*4d7e907cSAndroid Build Coastguard Worker auto status = secure_element_->transmit(apdu, &response);
150*4d7e907cSAndroid Build Coastguard Worker if (!status.isOk()) {
151*4d7e907cSAndroid Build Coastguard Worker return 0x6881;
152*4d7e907cSAndroid Build Coastguard Worker }
153*4d7e907cSAndroid Build Coastguard Worker
154*4d7e907cSAndroid Build Coastguard Worker // transmit() will return a response containing at least
155*4d7e907cSAndroid Build Coastguard Worker // the APDU response status otherwise.
156*4d7e907cSAndroid Build Coastguard Worker EXPECT_GE(response.size(), 2u);
157*4d7e907cSAndroid Build Coastguard Worker uint16_t apdu_status =
158*4d7e907cSAndroid Build Coastguard Worker (response[response.size() - 2] << 8) | (response[response.size() - 1] << 0);
159*4d7e907cSAndroid Build Coastguard Worker
160*4d7e907cSAndroid Build Coastguard Worker // When the command is successful the response
161*4d7e907cSAndroid Build Coastguard Worker // must contain 256 bytes of data.
162*4d7e907cSAndroid Build Coastguard Worker if (apdu_status == 0x9000) {
163*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(response.size(), 258);
164*4d7e907cSAndroid Build Coastguard Worker }
165*4d7e907cSAndroid Build Coastguard Worker
166*4d7e907cSAndroid Build Coastguard Worker return apdu_status;
167*4d7e907cSAndroid Build Coastguard Worker }
168*4d7e907cSAndroid Build Coastguard Worker
169*4d7e907cSAndroid Build Coastguard Worker std::shared_ptr<ISecureElement> secure_element_;
170*4d7e907cSAndroid Build Coastguard Worker std::shared_ptr<MySecureElementCallback> secure_element_callback_;
171*4d7e907cSAndroid Build Coastguard Worker bool basic_channel_supported_{false};
172*4d7e907cSAndroid Build Coastguard Worker };
173*4d7e907cSAndroid Build Coastguard Worker
TEST_P(SecureElementAidl,init)174*4d7e907cSAndroid Build Coastguard Worker TEST_P(SecureElementAidl, init) {
175*4d7e907cSAndroid Build Coastguard Worker // init(nullptr) shall fail.
176*4d7e907cSAndroid Build Coastguard Worker EXPECT_ERR(secure_element_->init(nullptr));
177*4d7e907cSAndroid Build Coastguard Worker
178*4d7e907cSAndroid Build Coastguard Worker // init with a valid callback pointer shall succeed.
179*4d7e907cSAndroid Build Coastguard Worker EXPECT_OK(secure_element_->init(secure_element_callback_));
180*4d7e907cSAndroid Build Coastguard Worker secure_element_callback_->expectCallbackHistory({true, true});
181*4d7e907cSAndroid Build Coastguard Worker }
182*4d7e907cSAndroid Build Coastguard Worker
TEST_P(SecureElementAidl,reset)183*4d7e907cSAndroid Build Coastguard Worker TEST_P(SecureElementAidl, reset) {
184*4d7e907cSAndroid Build Coastguard Worker std::vector<uint8_t> basic_channel_response;
185*4d7e907cSAndroid Build Coastguard Worker LogicalChannelResponse logical_channel_response;
186*4d7e907cSAndroid Build Coastguard Worker
187*4d7e907cSAndroid Build Coastguard Worker // reset called after init shall succeed.
188*4d7e907cSAndroid Build Coastguard Worker if (basic_channel_supported_) {
189*4d7e907cSAndroid Build Coastguard Worker EXPECT_OK(secure_element_->openBasicChannel(kSelectableAid, 0x00, &basic_channel_response));
190*4d7e907cSAndroid Build Coastguard Worker }
191*4d7e907cSAndroid Build Coastguard Worker EXPECT_OK(secure_element_->openLogicalChannel(kSelectableAid, 0x00, &logical_channel_response));
192*4d7e907cSAndroid Build Coastguard Worker
193*4d7e907cSAndroid Build Coastguard Worker EXPECT_OK(secure_element_->reset());
194*4d7e907cSAndroid Build Coastguard Worker secure_element_callback_->expectCallbackHistory({true, false, true});
195*4d7e907cSAndroid Build Coastguard Worker
196*4d7e907cSAndroid Build Coastguard Worker // All opened channels must be closed.
197*4d7e907cSAndroid Build Coastguard Worker if (basic_channel_supported_) {
198*4d7e907cSAndroid Build Coastguard Worker EXPECT_NE(transmit(0), 0x9000);
199*4d7e907cSAndroid Build Coastguard Worker }
200*4d7e907cSAndroid Build Coastguard Worker EXPECT_NE(transmit(logical_channel_response.channelNumber), 0x9000);
201*4d7e907cSAndroid Build Coastguard Worker }
202*4d7e907cSAndroid Build Coastguard Worker
TEST_P(SecureElementAidl,isCardPresent)203*4d7e907cSAndroid Build Coastguard Worker TEST_P(SecureElementAidl, isCardPresent) {
204*4d7e907cSAndroid Build Coastguard Worker bool res = false;
205*4d7e907cSAndroid Build Coastguard Worker
206*4d7e907cSAndroid Build Coastguard Worker // isCardPresent called after init shall succeed.
207*4d7e907cSAndroid Build Coastguard Worker EXPECT_OK(secure_element_->isCardPresent(&res));
208*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(res);
209*4d7e907cSAndroid Build Coastguard Worker }
210*4d7e907cSAndroid Build Coastguard Worker
TEST_P(SecureElementAidl,getAtr)211*4d7e907cSAndroid Build Coastguard Worker TEST_P(SecureElementAidl, getAtr) {
212*4d7e907cSAndroid Build Coastguard Worker std::vector<uint8_t> atr;
213*4d7e907cSAndroid Build Coastguard Worker
214*4d7e907cSAndroid Build Coastguard Worker // getAtr called after init shall succeed.
215*4d7e907cSAndroid Build Coastguard Worker // The ATR has size between 0 and 32 bytes.
216*4d7e907cSAndroid Build Coastguard Worker EXPECT_OK(secure_element_->getAtr(&atr));
217*4d7e907cSAndroid Build Coastguard Worker EXPECT_LE(atr.size(), 32u);
218*4d7e907cSAndroid Build Coastguard Worker }
219*4d7e907cSAndroid Build Coastguard Worker
TEST_P(SecureElementAidl,openBasicChannel)220*4d7e907cSAndroid Build Coastguard Worker TEST_P(SecureElementAidl, openBasicChannel) {
221*4d7e907cSAndroid Build Coastguard Worker std::vector<uint8_t> response;
222*4d7e907cSAndroid Build Coastguard Worker
223*4d7e907cSAndroid Build Coastguard Worker if (!basic_channel_supported_) {
224*4d7e907cSAndroid Build Coastguard Worker return;
225*4d7e907cSAndroid Build Coastguard Worker }
226*4d7e907cSAndroid Build Coastguard Worker
227*4d7e907cSAndroid Build Coastguard Worker // openBasicChannel called with an invalid AID shall fail.
228*4d7e907cSAndroid Build Coastguard Worker EXPECT_ERR(secure_element_->openBasicChannel(kNonSelectableAid, 0x00, &response));
229*4d7e907cSAndroid Build Coastguard Worker
230*4d7e907cSAndroid Build Coastguard Worker // openBasicChannel called after init shall succeed.
231*4d7e907cSAndroid Build Coastguard Worker // The response size must be larger than 2 bytes as it includes the
232*4d7e907cSAndroid Build Coastguard Worker // status code.
233*4d7e907cSAndroid Build Coastguard Worker EXPECT_OK(secure_element_->openBasicChannel(kSelectableAid, 0x00, &response));
234*4d7e907cSAndroid Build Coastguard Worker EXPECT_GE(response.size(), 2u);
235*4d7e907cSAndroid Build Coastguard Worker
236*4d7e907cSAndroid Build Coastguard Worker // transmit called on the basic channel should succeed.
237*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(transmit(0), 0x9000);
238*4d7e907cSAndroid Build Coastguard Worker
239*4d7e907cSAndroid Build Coastguard Worker // openBasicChannel called a second time shall fail.
240*4d7e907cSAndroid Build Coastguard Worker // The basic channel can only be opened once.
241*4d7e907cSAndroid Build Coastguard Worker EXPECT_ERR(secure_element_->openBasicChannel(kSelectableAid, 0x00, &response));
242*4d7e907cSAndroid Build Coastguard Worker
243*4d7e907cSAndroid Build Coastguard Worker // openBasicChannel called after closing the basic channel shall succeed.
244*4d7e907cSAndroid Build Coastguard Worker EXPECT_OK(secure_element_->closeChannel(0));
245*4d7e907cSAndroid Build Coastguard Worker EXPECT_OK(secure_element_->openBasicChannel(kSelectableAid, 0x00, &response));
246*4d7e907cSAndroid Build Coastguard Worker }
247*4d7e907cSAndroid Build Coastguard Worker
TEST_P(SecureElementAidl,openLogicalChannel)248*4d7e907cSAndroid Build Coastguard Worker TEST_P(SecureElementAidl, openLogicalChannel) {
249*4d7e907cSAndroid Build Coastguard Worker LogicalChannelResponse response;
250*4d7e907cSAndroid Build Coastguard Worker
251*4d7e907cSAndroid Build Coastguard Worker // openLogicalChannel called with an invalid AID shall fail.
252*4d7e907cSAndroid Build Coastguard Worker EXPECT_ERR(secure_element_->openLogicalChannel(kNonSelectableAid, 0x00, &response));
253*4d7e907cSAndroid Build Coastguard Worker
254*4d7e907cSAndroid Build Coastguard Worker // openLogicalChannel called after init shall succeed.
255*4d7e907cSAndroid Build Coastguard Worker // The response size must be larger than 2 bytes as it includes the
256*4d7e907cSAndroid Build Coastguard Worker // status code. The channel number must be in the range 1-19.
257*4d7e907cSAndroid Build Coastguard Worker EXPECT_OK(secure_element_->openLogicalChannel(kSelectableAid, 0x00, &response));
258*4d7e907cSAndroid Build Coastguard Worker EXPECT_GE(response.selectResponse.size(), 2u);
259*4d7e907cSAndroid Build Coastguard Worker EXPECT_GE(response.channelNumber, 1u);
260*4d7e907cSAndroid Build Coastguard Worker EXPECT_LE(response.channelNumber, 19u);
261*4d7e907cSAndroid Build Coastguard Worker
262*4d7e907cSAndroid Build Coastguard Worker // transmit called on the logical channel should succeed.
263*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(transmit(response.channelNumber), 0x9000);
264*4d7e907cSAndroid Build Coastguard Worker }
265*4d7e907cSAndroid Build Coastguard Worker
TEST_P(SecureElementAidl,closeChannel)266*4d7e907cSAndroid Build Coastguard Worker TEST_P(SecureElementAidl, closeChannel) {
267*4d7e907cSAndroid Build Coastguard Worker std::vector<uint8_t> basic_channel_response;
268*4d7e907cSAndroid Build Coastguard Worker LogicalChannelResponse logical_channel_response;
269*4d7e907cSAndroid Build Coastguard Worker
270*4d7e907cSAndroid Build Coastguard Worker // closeChannel called on non-existing basic or logical channel
271*4d7e907cSAndroid Build Coastguard Worker // shall fail.
272*4d7e907cSAndroid Build Coastguard Worker EXPECT_ERR(secure_element_->closeChannel(0));
273*4d7e907cSAndroid Build Coastguard Worker EXPECT_ERR(secure_element_->closeChannel(1));
274*4d7e907cSAndroid Build Coastguard Worker
275*4d7e907cSAndroid Build Coastguard Worker // closeChannel called on basic channel closes the basic channel.
276*4d7e907cSAndroid Build Coastguard Worker if (basic_channel_supported_) {
277*4d7e907cSAndroid Build Coastguard Worker EXPECT_OK(secure_element_->openBasicChannel(kSelectableAid, 0x00, &basic_channel_response));
278*4d7e907cSAndroid Build Coastguard Worker EXPECT_OK(secure_element_->closeChannel(0));
279*4d7e907cSAndroid Build Coastguard Worker
280*4d7e907cSAndroid Build Coastguard Worker // transmit called on the basic channel should fail.
281*4d7e907cSAndroid Build Coastguard Worker EXPECT_NE(transmit(0), 0x9000);
282*4d7e907cSAndroid Build Coastguard Worker }
283*4d7e907cSAndroid Build Coastguard Worker
284*4d7e907cSAndroid Build Coastguard Worker // closeChannel called on logical channel closes the logical channel.
285*4d7e907cSAndroid Build Coastguard Worker EXPECT_OK(secure_element_->openLogicalChannel(kSelectableAid, 0x00, &logical_channel_response));
286*4d7e907cSAndroid Build Coastguard Worker EXPECT_OK(secure_element_->closeChannel(logical_channel_response.channelNumber));
287*4d7e907cSAndroid Build Coastguard Worker
288*4d7e907cSAndroid Build Coastguard Worker // transmit called on the logical channel should fail.
289*4d7e907cSAndroid Build Coastguard Worker EXPECT_NE(transmit(logical_channel_response.channelNumber), 0x9000);
290*4d7e907cSAndroid Build Coastguard Worker }
291*4d7e907cSAndroid Build Coastguard Worker
TEST_P(SecureElementAidl,transmit)292*4d7e907cSAndroid Build Coastguard Worker TEST_P(SecureElementAidl, transmit) {
293*4d7e907cSAndroid Build Coastguard Worker std::vector<uint8_t> response;
294*4d7e907cSAndroid Build Coastguard Worker LogicalChannelResponse logical_channel_response;
295*4d7e907cSAndroid Build Coastguard Worker
296*4d7e907cSAndroid Build Coastguard Worker /* Temporaly disable this check to clarify Basic Channel behavior (b/300502872)
297*4d7e907cSAndroid Build Coastguard Worker // Note: no channel is opened for this test
298*4d7e907cSAndroid Build Coastguard Worker // transmit() will return an empty response with the error
299*4d7e907cSAndroid Build Coastguard Worker // code CHANNEL_NOT_AVAILABLE when the SE cannot be
300*4d7e907cSAndroid Build Coastguard Worker // communicated with.
301*4d7e907cSAndroid Build Coastguard Worker EXPECT_ERR(secure_element_->transmit(kDataApdu, &response));
302*4d7e907cSAndroid Build Coastguard Worker */
303*4d7e907cSAndroid Build Coastguard Worker
304*4d7e907cSAndroid Build Coastguard Worker EXPECT_OK(secure_element_->openLogicalChannel(kSelectableAid, 0x00, &logical_channel_response));
305*4d7e907cSAndroid Build Coastguard Worker EXPECT_GE(logical_channel_response.selectResponse.size(), 2u);
306*4d7e907cSAndroid Build Coastguard Worker EXPECT_GE(logical_channel_response.channelNumber, 1u);
307*4d7e907cSAndroid Build Coastguard Worker EXPECT_LE(logical_channel_response.channelNumber, 19u);
308*4d7e907cSAndroid Build Coastguard Worker
309*4d7e907cSAndroid Build Coastguard Worker // transmit called on the logical channel should succeed.
310*4d7e907cSAndroid Build Coastguard Worker EXPECT_EQ(transmit(logical_channel_response.channelNumber), 0x9000);
311*4d7e907cSAndroid Build Coastguard Worker }
312*4d7e907cSAndroid Build Coastguard Worker
313*4d7e907cSAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(SecureElementAidl);
314*4d7e907cSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
315*4d7e907cSAndroid Build Coastguard Worker SecureElement, SecureElementAidl,
316*4d7e907cSAndroid Build Coastguard Worker testing::ValuesIn(android::getAidlHalInstanceNames(ISecureElement::descriptor)),
317*4d7e907cSAndroid Build Coastguard Worker android::PrintInstanceNameToString);
318*4d7e907cSAndroid Build Coastguard Worker
main(int argc,char ** argv)319*4d7e907cSAndroid Build Coastguard Worker int main(int argc, char** argv) {
320*4d7e907cSAndroid Build Coastguard Worker ::testing::InitGoogleTest(&argc, argv);
321*4d7e907cSAndroid Build Coastguard Worker ABinderProcess_setThreadPoolMaxThreadCount(1);
322*4d7e907cSAndroid Build Coastguard Worker ABinderProcess_startThreadPool();
323*4d7e907cSAndroid Build Coastguard Worker return RUN_ALL_TESTS();
324*4d7e907cSAndroid Build Coastguard Worker }
325