xref: /aosp_15_r20/external/libese/libapdu/tests/apdu_test.cpp (revision 5c4dab75aa57366379dce576b1a9e082a44e2b3a)
1*5c4dab75SAndroid Build Coastguard Worker /*
2*5c4dab75SAndroid Build Coastguard Worker  * Copyright (C) 2017 The Android Open Source Project
3*5c4dab75SAndroid Build Coastguard Worker  *
4*5c4dab75SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*5c4dab75SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*5c4dab75SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*5c4dab75SAndroid Build Coastguard Worker  *
8*5c4dab75SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*5c4dab75SAndroid Build Coastguard Worker  *
10*5c4dab75SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*5c4dab75SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*5c4dab75SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*5c4dab75SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*5c4dab75SAndroid Build Coastguard Worker  * limitations under the License.
15*5c4dab75SAndroid Build Coastguard Worker  */
16*5c4dab75SAndroid Build Coastguard Worker 
17*5c4dab75SAndroid Build Coastguard Worker #include <algorithm>
18*5c4dab75SAndroid Build Coastguard Worker #include <iterator>
19*5c4dab75SAndroid Build Coastguard Worker #include <iostream>
20*5c4dab75SAndroid Build Coastguard Worker 
21*5c4dab75SAndroid Build Coastguard Worker #include <gtest/gtest.h>
22*5c4dab75SAndroid Build Coastguard Worker 
23*5c4dab75SAndroid Build Coastguard Worker #include <apdu/apdu.h>
24*5c4dab75SAndroid Build Coastguard Worker 
25*5c4dab75SAndroid Build Coastguard Worker using android::CommandApdu;
26*5c4dab75SAndroid Build Coastguard Worker using android::ResponseApdu;
27*5c4dab75SAndroid Build Coastguard Worker 
28*5c4dab75SAndroid Build Coastguard Worker /* CommandApdu */
29*5c4dab75SAndroid Build Coastguard Worker 
TEST(CommandApduTest,Case1)30*5c4dab75SAndroid Build Coastguard Worker TEST(CommandApduTest, Case1) {
31*5c4dab75SAndroid Build Coastguard Worker     const CommandApdu apdu{1, 2, 3, 4};
32*5c4dab75SAndroid Build Coastguard Worker     const std::vector<uint8_t> expected{1, 2, 3, 4};
33*5c4dab75SAndroid Build Coastguard Worker     ASSERT_EQ(expected.size(), apdu.size());
34*5c4dab75SAndroid Build Coastguard Worker     ASSERT_TRUE(std::equal(apdu.begin(), apdu.end(), expected.begin(), expected.end()));
35*5c4dab75SAndroid Build Coastguard Worker }
36*5c4dab75SAndroid Build Coastguard Worker 
TEST(CommandApduTest,Case2s)37*5c4dab75SAndroid Build Coastguard Worker TEST(CommandApduTest, Case2s) {
38*5c4dab75SAndroid Build Coastguard Worker     const CommandApdu apdu{4, 3, 2, 1, 0, 3};
39*5c4dab75SAndroid Build Coastguard Worker     const std::vector<uint8_t> expected{4, 3, 2, 1, 3};
40*5c4dab75SAndroid Build Coastguard Worker     ASSERT_EQ(expected.size(), apdu.size());
41*5c4dab75SAndroid Build Coastguard Worker     ASSERT_TRUE(std::equal(apdu.begin(), apdu.end(), expected.begin(), expected.end()));
42*5c4dab75SAndroid Build Coastguard Worker }
43*5c4dab75SAndroid Build Coastguard Worker 
TEST(CommandApduTest,Case2s_maxLe)44*5c4dab75SAndroid Build Coastguard Worker TEST(CommandApduTest, Case2s_maxLe) {
45*5c4dab75SAndroid Build Coastguard Worker     const CommandApdu apdu{4, 3, 2, 1, 0, 256};
46*5c4dab75SAndroid Build Coastguard Worker     const std::vector<uint8_t> expected{4, 3, 2, 1, 0};
47*5c4dab75SAndroid Build Coastguard Worker     ASSERT_EQ(expected.size(), apdu.size());
48*5c4dab75SAndroid Build Coastguard Worker     ASSERT_TRUE(std::equal(apdu.begin(), apdu.end(), expected.begin(), expected.end()));
49*5c4dab75SAndroid Build Coastguard Worker }
50*5c4dab75SAndroid Build Coastguard Worker 
TEST(CommandApduTest,Case2e)51*5c4dab75SAndroid Build Coastguard Worker TEST(CommandApduTest, Case2e) {
52*5c4dab75SAndroid Build Coastguard Worker     const CommandApdu apdu{5, 6, 7, 8, 0, 258};
53*5c4dab75SAndroid Build Coastguard Worker     const std::vector<uint8_t> expected{5, 6, 7, 8, 0, 1, 2};
54*5c4dab75SAndroid Build Coastguard Worker     ASSERT_EQ(expected.size(), apdu.size());
55*5c4dab75SAndroid Build Coastguard Worker     ASSERT_TRUE(std::equal(apdu.begin(), apdu.end(), expected.begin(), expected.end()));
56*5c4dab75SAndroid Build Coastguard Worker }
57*5c4dab75SAndroid Build Coastguard Worker 
TEST(CommandApduTest,Case2e_maxLe)58*5c4dab75SAndroid Build Coastguard Worker TEST(CommandApduTest, Case2e_maxLe) {
59*5c4dab75SAndroid Build Coastguard Worker     const CommandApdu apdu{5, 6, 7, 8, 0, 65536};
60*5c4dab75SAndroid Build Coastguard Worker     const std::vector<uint8_t> expected{5, 6, 7, 8, 0, 0, 0};
61*5c4dab75SAndroid Build Coastguard Worker     ASSERT_EQ(expected.size(), apdu.size());
62*5c4dab75SAndroid Build Coastguard Worker     ASSERT_TRUE(std::equal(apdu.begin(), apdu.end(), expected.begin(), expected.end()));
63*5c4dab75SAndroid Build Coastguard Worker }
64*5c4dab75SAndroid Build Coastguard Worker 
TEST(CommandApduTest,Case3s)65*5c4dab75SAndroid Build Coastguard Worker TEST(CommandApduTest, Case3s) {
66*5c4dab75SAndroid Build Coastguard Worker     const CommandApdu apdu{8, 7, 6, 5, 5, 0};
67*5c4dab75SAndroid Build Coastguard Worker     const std::vector<uint8_t> expected{8, 7, 6, 5, 5, 0, 0, 0, 0, 0};
68*5c4dab75SAndroid Build Coastguard Worker     ASSERT_EQ(expected.size(), apdu.size());
69*5c4dab75SAndroid Build Coastguard Worker     ASSERT_TRUE(std::equal(apdu.begin(), apdu.end(), expected.begin(), expected.end()));
70*5c4dab75SAndroid Build Coastguard Worker }
71*5c4dab75SAndroid Build Coastguard Worker 
TEST(CommandApduTest,Case3s_data)72*5c4dab75SAndroid Build Coastguard Worker TEST(CommandApduTest, Case3s_data) {
73*5c4dab75SAndroid Build Coastguard Worker     CommandApdu apdu{8, 7, 6, 5, 3, 0};
74*5c4dab75SAndroid Build Coastguard Worker     auto it = apdu.dataBegin();
75*5c4dab75SAndroid Build Coastguard Worker     *it++ = 10;
76*5c4dab75SAndroid Build Coastguard Worker     *it++ = 11;
77*5c4dab75SAndroid Build Coastguard Worker     *it++ = 12;
78*5c4dab75SAndroid Build Coastguard Worker     ASSERT_EQ(apdu.dataEnd(), it);
79*5c4dab75SAndroid Build Coastguard Worker 
80*5c4dab75SAndroid Build Coastguard Worker     const std::vector<uint8_t> expected{8, 7, 6, 5, 3, 10, 11, 12};
81*5c4dab75SAndroid Build Coastguard Worker     ASSERT_EQ(expected.size(), apdu.size());
82*5c4dab75SAndroid Build Coastguard Worker     ASSERT_TRUE(std::equal(apdu.begin(), apdu.end(), expected.begin(), expected.end()));
83*5c4dab75SAndroid Build Coastguard Worker }
84*5c4dab75SAndroid Build Coastguard Worker 
TEST(CommandApduTest,Case3e)85*5c4dab75SAndroid Build Coastguard Worker TEST(CommandApduTest, Case3e) {
86*5c4dab75SAndroid Build Coastguard Worker     const CommandApdu apdu{8, 7, 6, 5, 256, 0};
87*5c4dab75SAndroid Build Coastguard Worker     std::vector<uint8_t> expected{8, 7, 6, 5, 0, 1, 0};
88*5c4dab75SAndroid Build Coastguard Worker     expected.resize(expected.size() + 256, 0);
89*5c4dab75SAndroid Build Coastguard Worker     ASSERT_EQ(expected.size(), apdu.size());
90*5c4dab75SAndroid Build Coastguard Worker     ASSERT_TRUE(std::equal(apdu.begin(), apdu.end(), expected.begin(), expected.end()));
91*5c4dab75SAndroid Build Coastguard Worker }
92*5c4dab75SAndroid Build Coastguard Worker 
TEST(CommandApduTest,Case3e_data)93*5c4dab75SAndroid Build Coastguard Worker TEST(CommandApduTest, Case3e_data) {
94*5c4dab75SAndroid Build Coastguard Worker     CommandApdu apdu{8, 7, 6, 5, 65535, 0};
95*5c4dab75SAndroid Build Coastguard Worker     ASSERT_EQ(size_t{65535}, apdu.dataSize());
96*5c4dab75SAndroid Build Coastguard Worker     std::fill(apdu.dataBegin(), apdu.dataEnd(), 7);
97*5c4dab75SAndroid Build Coastguard Worker     std::vector<uint8_t> expected{8, 7, 6, 5, 0, 255, 255};
98*5c4dab75SAndroid Build Coastguard Worker     expected.resize(expected.size() + 65535, 7);
99*5c4dab75SAndroid Build Coastguard Worker     ASSERT_EQ(expected.size(), apdu.size());
100*5c4dab75SAndroid Build Coastguard Worker     ASSERT_TRUE(std::equal(apdu.begin(), apdu.end(), expected.begin(), expected.end()));
101*5c4dab75SAndroid Build Coastguard Worker }
102*5c4dab75SAndroid Build Coastguard Worker 
TEST(CommandApduTest,Case4s)103*5c4dab75SAndroid Build Coastguard Worker TEST(CommandApduTest, Case4s) {
104*5c4dab75SAndroid Build Coastguard Worker     const CommandApdu apdu{1, 3, 5, 7, 2, 3};
105*5c4dab75SAndroid Build Coastguard Worker     const std::vector<uint8_t> expected{1, 3, 5, 7, 2, 0, 0, 3};
106*5c4dab75SAndroid Build Coastguard Worker     ASSERT_EQ(expected.size(), apdu.size());
107*5c4dab75SAndroid Build Coastguard Worker     ASSERT_TRUE(std::equal(apdu.begin(), apdu.end(), expected.begin(), expected.end()));
108*5c4dab75SAndroid Build Coastguard Worker }
109*5c4dab75SAndroid Build Coastguard Worker 
TEST(CommandApduTest,Case4s_data)110*5c4dab75SAndroid Build Coastguard Worker TEST(CommandApduTest, Case4s_data) {
111*5c4dab75SAndroid Build Coastguard Worker     CommandApdu apdu{1, 3, 5, 7, 1, 90};
112*5c4dab75SAndroid Build Coastguard Worker     auto it = apdu.dataBegin();
113*5c4dab75SAndroid Build Coastguard Worker     *it++ = 8;
114*5c4dab75SAndroid Build Coastguard Worker     ASSERT_EQ(apdu.dataEnd(), it);
115*5c4dab75SAndroid Build Coastguard Worker 
116*5c4dab75SAndroid Build Coastguard Worker     const std::vector<uint8_t> expected{1, 3, 5, 7, 1, 8, 90};
117*5c4dab75SAndroid Build Coastguard Worker     ASSERT_EQ(expected.size(), apdu.size());
118*5c4dab75SAndroid Build Coastguard Worker     ASSERT_TRUE(std::equal(apdu.begin(), apdu.end(), expected.begin(), expected.end()));
119*5c4dab75SAndroid Build Coastguard Worker }
120*5c4dab75SAndroid Build Coastguard Worker 
TEST(CommandApduTest,Case4s_maxLe)121*5c4dab75SAndroid Build Coastguard Worker TEST(CommandApduTest, Case4s_maxLe) {
122*5c4dab75SAndroid Build Coastguard Worker     const CommandApdu apdu{1, 3, 5, 7, 2, 256};
123*5c4dab75SAndroid Build Coastguard Worker     const std::vector<uint8_t> expected{1, 3, 5, 7, 2, 0, 0, 0};
124*5c4dab75SAndroid Build Coastguard Worker     ASSERT_EQ(expected.size(), apdu.size());
125*5c4dab75SAndroid Build Coastguard Worker     ASSERT_TRUE(std::equal(apdu.begin(), apdu.end(), expected.begin(), expected.end()));
126*5c4dab75SAndroid Build Coastguard Worker }
127*5c4dab75SAndroid Build Coastguard Worker 
TEST(CommandApduTest,Case4e)128*5c4dab75SAndroid Build Coastguard Worker TEST(CommandApduTest, Case4e) {
129*5c4dab75SAndroid Build Coastguard Worker     const CommandApdu apdu{1, 3, 5, 7, 527, 349};
130*5c4dab75SAndroid Build Coastguard Worker     std::vector<uint8_t> expected{1, 3, 5, 7, 0, 2, 15};
131*5c4dab75SAndroid Build Coastguard Worker     expected.resize(expected.size() + 527, 0);
132*5c4dab75SAndroid Build Coastguard Worker     expected.push_back(1);
133*5c4dab75SAndroid Build Coastguard Worker     expected.push_back(93);
134*5c4dab75SAndroid Build Coastguard Worker     ASSERT_EQ(expected.size(), apdu.size());
135*5c4dab75SAndroid Build Coastguard Worker     ASSERT_TRUE(std::equal(apdu.begin(), apdu.end(), expected.begin(), expected.end()));
136*5c4dab75SAndroid Build Coastguard Worker }
137*5c4dab75SAndroid Build Coastguard Worker 
TEST(CommandApduTest,Case4e_maxLe)138*5c4dab75SAndroid Build Coastguard Worker TEST(CommandApduTest, Case4e_maxLe) {
139*5c4dab75SAndroid Build Coastguard Worker     const CommandApdu apdu{1, 3, 5, 7, 20, 65536};
140*5c4dab75SAndroid Build Coastguard Worker     std::vector<uint8_t> expected{1, 3, 5, 7, 0, 0, 20};
141*5c4dab75SAndroid Build Coastguard Worker     expected.resize(expected.size() + 20, 0);
142*5c4dab75SAndroid Build Coastguard Worker     expected.push_back(0);
143*5c4dab75SAndroid Build Coastguard Worker     expected.push_back(0);
144*5c4dab75SAndroid Build Coastguard Worker     ASSERT_EQ(expected.size(), apdu.size());
145*5c4dab75SAndroid Build Coastguard Worker     ASSERT_TRUE(std::equal(apdu.begin(), apdu.end(), expected.begin(), expected.end()));
146*5c4dab75SAndroid Build Coastguard Worker }
147*5c4dab75SAndroid Build Coastguard Worker 
148*5c4dab75SAndroid Build Coastguard Worker /* ResponseApdu */
149*5c4dab75SAndroid Build Coastguard Worker 
TEST(ResponseApduTest,bad)150*5c4dab75SAndroid Build Coastguard Worker TEST(ResponseApduTest, bad) {
151*5c4dab75SAndroid Build Coastguard Worker     const std::vector<uint8_t> empty{};
152*5c4dab75SAndroid Build Coastguard Worker     const ResponseApdu<std::vector<uint8_t>> apdu{empty};
153*5c4dab75SAndroid Build Coastguard Worker     ASSERT_FALSE(apdu.ok());
154*5c4dab75SAndroid Build Coastguard Worker }
155*5c4dab75SAndroid Build Coastguard Worker 
TEST(ResponseApduTest,statusOnly)156*5c4dab75SAndroid Build Coastguard Worker TEST(ResponseApduTest, statusOnly) {
157*5c4dab75SAndroid Build Coastguard Worker     const std::vector<uint8_t> statusOnly{0x90, 0x37};
158*5c4dab75SAndroid Build Coastguard Worker     const ResponseApdu<std::vector<uint8_t>> apdu{statusOnly};
159*5c4dab75SAndroid Build Coastguard Worker     ASSERT_TRUE(apdu.ok());
160*5c4dab75SAndroid Build Coastguard Worker     ASSERT_EQ(0x90, apdu.sw1());
161*5c4dab75SAndroid Build Coastguard Worker     ASSERT_EQ(0x37, apdu.sw2());
162*5c4dab75SAndroid Build Coastguard Worker     ASSERT_EQ(0x9037, apdu.status());
163*5c4dab75SAndroid Build Coastguard Worker     ASSERT_EQ(size_t{0}, apdu.dataSize());
164*5c4dab75SAndroid Build Coastguard Worker }
165*5c4dab75SAndroid Build Coastguard Worker 
TEST(ResponseApduTest,data)166*5c4dab75SAndroid Build Coastguard Worker TEST(ResponseApduTest, data) {
167*5c4dab75SAndroid Build Coastguard Worker     const std::vector<uint8_t> data{1, 2, 3, 9, 8, 7, 0x3a, 0xbc};
168*5c4dab75SAndroid Build Coastguard Worker     const ResponseApdu<std::vector<uint8_t>> apdu{data};
169*5c4dab75SAndroid Build Coastguard Worker     ASSERT_TRUE(apdu.ok());
170*5c4dab75SAndroid Build Coastguard Worker     ASSERT_EQ(0x3abc, apdu.status());
171*5c4dab75SAndroid Build Coastguard Worker     ASSERT_EQ(size_t{6}, apdu.dataSize());
172*5c4dab75SAndroid Build Coastguard Worker 
173*5c4dab75SAndroid Build Coastguard Worker     const uint8_t expected[] = {1, 2, 3, 9, 8, 7};
174*5c4dab75SAndroid Build Coastguard Worker     ASSERT_TRUE(std::equal(apdu.dataBegin(), apdu.dataEnd(),
175*5c4dab75SAndroid Build Coastguard Worker                            std::begin(expected), std::end(expected)));
176*5c4dab75SAndroid Build Coastguard Worker }
177*5c4dab75SAndroid Build Coastguard Worker 
TEST(ResponseApduTest,remainingBytes)178*5c4dab75SAndroid Build Coastguard Worker TEST(ResponseApduTest, remainingBytes) {
179*5c4dab75SAndroid Build Coastguard Worker     const std::vector<uint8_t> remainingBytes{0x61, 23};
180*5c4dab75SAndroid Build Coastguard Worker     const ResponseApdu<std::vector<uint8_t>> apdu{remainingBytes};
181*5c4dab75SAndroid Build Coastguard Worker     ASSERT_EQ(23, apdu.remainingBytes());
182*5c4dab75SAndroid Build Coastguard Worker     ASSERT_FALSE(apdu.isWarning());
183*5c4dab75SAndroid Build Coastguard Worker     ASSERT_FALSE(apdu.isExecutionError());
184*5c4dab75SAndroid Build Coastguard Worker     ASSERT_FALSE(apdu.isCheckingError());
185*5c4dab75SAndroid Build Coastguard Worker     ASSERT_FALSE(apdu.isError());
186*5c4dab75SAndroid Build Coastguard Worker }
187*5c4dab75SAndroid Build Coastguard Worker 
TEST(ResponseApduTest,warning)188*5c4dab75SAndroid Build Coastguard Worker TEST(ResponseApduTest, warning) {
189*5c4dab75SAndroid Build Coastguard Worker     const std::vector<uint8_t> warning{0x62, 0};
190*5c4dab75SAndroid Build Coastguard Worker     const ResponseApdu<std::vector<uint8_t>> apdu{warning};
191*5c4dab75SAndroid Build Coastguard Worker     ASSERT_TRUE(apdu.isWarning());
192*5c4dab75SAndroid Build Coastguard Worker     ASSERT_FALSE(apdu.isExecutionError());
193*5c4dab75SAndroid Build Coastguard Worker     ASSERT_FALSE(apdu.isCheckingError());
194*5c4dab75SAndroid Build Coastguard Worker     ASSERT_FALSE(apdu.isError());
195*5c4dab75SAndroid Build Coastguard Worker }
196*5c4dab75SAndroid Build Coastguard Worker 
TEST(ResponseApduTest,executionError)197*5c4dab75SAndroid Build Coastguard Worker TEST(ResponseApduTest, executionError) {
198*5c4dab75SAndroid Build Coastguard Worker     const std::vector<uint8_t> executionError{0x66, 0};
199*5c4dab75SAndroid Build Coastguard Worker     const ResponseApdu<std::vector<uint8_t>> apdu{executionError};
200*5c4dab75SAndroid Build Coastguard Worker     ASSERT_FALSE(apdu.isWarning());
201*5c4dab75SAndroid Build Coastguard Worker     ASSERT_TRUE(apdu.isExecutionError());
202*5c4dab75SAndroid Build Coastguard Worker     ASSERT_FALSE(apdu.isCheckingError());
203*5c4dab75SAndroid Build Coastguard Worker     ASSERT_TRUE(apdu.isError());
204*5c4dab75SAndroid Build Coastguard Worker }
205*5c4dab75SAndroid Build Coastguard Worker 
TEST(ResponseApduTest,checkingError)206*5c4dab75SAndroid Build Coastguard Worker TEST(ResponseApduTest, checkingError) {
207*5c4dab75SAndroid Build Coastguard Worker     const std::vector<uint8_t> checkingError{0x67, 0};
208*5c4dab75SAndroid Build Coastguard Worker     const ResponseApdu<std::vector<uint8_t>> apdu{checkingError};
209*5c4dab75SAndroid Build Coastguard Worker     ASSERT_FALSE(apdu.isWarning());
210*5c4dab75SAndroid Build Coastguard Worker     ASSERT_FALSE(apdu.isExecutionError());
211*5c4dab75SAndroid Build Coastguard Worker     ASSERT_TRUE(apdu.isCheckingError());
212*5c4dab75SAndroid Build Coastguard Worker     ASSERT_TRUE(apdu.isError());
213*5c4dab75SAndroid Build Coastguard Worker }
214