xref: /aosp_15_r20/hardware/interfaces/secure_element/aidl/vts/VtsHalSecureElementTargetTest.cpp (revision 4d7e907c777eeecc4c5bd7cf640a754fac206ff7)
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