1 /*!
2  * \brief Tests for the class CommandApdu.
3  *
4  * \copyright Copyright (c) 2014-2021 Governikus GmbH & Co. KG, Germany
5  */
6 
7 #include "CommandApdu.h"
8 
9 #include "LogHandler.h"
10 
11 #include <QtCore>
12 #include <QtTest>
13 
14 using namespace governikus;
15 
16 class test_CommandApdu
17 	: public QObject
18 {
19 	Q_OBJECT
20 
21 	private Q_SLOTS:
initTestCase()22 		void initTestCase()
23 		{
24 			Env::getSingleton<LogHandler>()->init();
25 		}
26 
27 
cleanup()28 		void cleanup()
29 		{
30 			Env::getSingleton<LogHandler>()->resetBacklog();
31 		}
32 
33 
testGetLc()34 		void testGetLc()
35 		{
36 			QByteArray data1 = QByteArray::fromHex(
37 					"7f4e82016e5f290100420e44454356434165494430303130327f4982011d060a04007f000702020202038120a9fb57d"
38 					"ba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e537782207d5a0975fc2c3057eef67530417affe7fb"
39 					"8055c126dc5c6ce94a4b44f330b5d9832026dc5c6ce94a4b44f330b5d9bbd77cbf958416295cf7e1ce6bccdc18ff8c0"
40 					"7b68441048bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace3262547ef835c3dac4fd97f846"
41 					"1a14611dc9c27745132ded8e545c1d54c72f0469978520a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f79"
42 					"01e0e82974856a78641048925419fc7f194922cfc6b8dd25ae6a19c1b59216e6cf06270e5d75cfd64205f55cf867bbf"
43 					"efeefd6e680e1fd197f18ab684484901362568efc9adb5c6018d728701015f200e44454356434165494430303130337"
44 					"f4c12060904007f0007030102025305fc0f13ffff5f25060102010200035f24060105010200035f37404d6f08a86a4f"
45 					"18409f6685387dd3c6a7ff5d68ea4f7714a861bbb3bb721d05d3014adf1763c9292f715d8e94ee9b3e1b73ab1382414"
46 					"ebf39dfb3b0fb6c09dbeb");
47 
48 			CommandApdu apdu1(CommandApdu::CLA, 0x2a, 0, char(190), data1);
49 
50 			QCOMPARE(apdu1.getLc(), 438);
51 			QCOMPARE(apdu1.getLe(), 0);
52 		}
53 
54 
test_getLc_data()55 		void test_getLc_data()
56 		{
57 			QTest::addColumn<QByteArray>("data");
58 			QTest::addColumn<int>("lc");
59 
60 			QTest::newRow("abc") << QByteArray("abc") << 0;
61 			QTest::newRow("abcdef") << QByteArray("abcdef") << 101;
62 		}
63 
64 
test_getLc()65 		void test_getLc()
66 		{
67 			QFETCH(QByteArray, data);
68 			QFETCH(int, lc);
69 
70 			CommandApdu apdu = CommandApdu(data);
71 			QCOMPARE(apdu.getLc(), lc);
72 		}
73 
74 
test_LcExtendedLength()75 		void test_LcExtendedLength()
76 		{
77 			QSignalSpy logSpy(Env::getSingleton<LogHandler>()->getEventHandler(), &LogEventHandler::fireLog);
78 
79 			QByteArray array = QByteArray::fromHex("010101010001");
80 			CommandApdu apdu = CommandApdu(array);
81 			QCOMPARE(apdu.getLc(), 0);
82 			QCOMPARE(logSpy.count(), 1);
83 			QVERIFY(logSpy.takeFirst().at(0).toString().contains("Cannot determine Lc, returning 0"));
84 		}
85 
86 
test_getLe()87 		void test_getLe()
88 		{
89 			QByteArray array(7, 0);
90 			CommandApdu apdu = CommandApdu(array);
91 			QCOMPARE(apdu.getLe(), 0x010000);
92 		}
93 
94 
test_getP2_data()95 		void test_getP2_data()
96 		{
97 			QTest::addColumn<char>("p2");
98 			QTest::addColumn<QByteArray>("data");
99 
100 			QTest::newRow("empty") << '\0' << QByteArray();
101 			QTest::newRow("abc") << '\0' << QByteArray("abc");
102 			QTest::newRow("input") << 'u' << QByteArray("input");
103 		}
104 
105 
test_getP2()106 		void test_getP2()
107 		{
108 			QFETCH(QByteArray, data);
109 			QFETCH(char, p2);
110 
111 			CommandApdu apdu = CommandApdu(data);
112 			QCOMPARE(apdu.getP2(), p2);
113 		}
114 
115 
test_getP1_data()116 		void test_getP1_data()
117 		{
118 			QTest::addColumn<char>("p1");
119 			QTest::addColumn<QByteArray>("data");
120 
121 			QTest::newRow("empty") << '\0' << QByteArray();
122 			QTest::newRow("abc") << 'c' << QByteArray("abc");
123 			QTest::newRow("input") << 'p' << QByteArray("input");
124 		}
125 
126 
test_getP1()127 		void test_getP1()
128 		{
129 			QFETCH(QByteArray, data);
130 			QFETCH(char, p1);
131 
132 			CommandApdu apdu = CommandApdu(data);
133 			QCOMPARE(apdu.getP1(), p1);
134 		}
135 
136 
test_getINS_data()137 		void test_getINS_data()
138 		{
139 			QTest::addColumn<char>("ins");
140 			QTest::addColumn<QByteArray>("data");
141 
142 			QTest::newRow("empty") << '\0' << QByteArray();
143 			QTest::newRow("abc") << 'b' << QByteArray("abc");
144 			QTest::newRow("input") << 'n' << QByteArray("input");
145 		}
146 
147 
test_getINS()148 		void test_getINS()
149 		{
150 			QFETCH(QByteArray, data);
151 			QFETCH(char, ins);
152 
153 			CommandApdu apdu = CommandApdu(data);
154 			QCOMPARE(apdu.getINS(), ins);
155 		}
156 
157 
test_getCLA_data()158 		void test_getCLA_data()
159 		{
160 			QTest::addColumn<char>("cla");
161 			QTest::addColumn<QByteArray>("data");
162 
163 			QTest::newRow("empty") << '\0' << QByteArray();
164 			QTest::newRow("abc") << 'a' << QByteArray("abc");
165 			QTest::newRow("input") << 'i' << QByteArray("input");
166 		}
167 
168 
test_getCLA()169 		void test_getCLA()
170 		{
171 			QFETCH(QByteArray, data);
172 			QFETCH(char, cla);
173 
174 			CommandApdu apdu = CommandApdu(data);
175 			QCOMPARE(apdu.getCLA(), cla);
176 		}
177 
178 
test_SecureMessaging_data()179 		void test_SecureMessaging_data()
180 		{
181 			QTest::addColumn<bool>("secure");
182 			QTest::addColumn<QByteArray>("data");
183 
184 			QTest::newRow("null") << false << QByteArray();
185 			QTest::newRow("empty") << false << QByteArray("");
186 			QTest::newRow("data") << false << QByteArray("data");
187 			QTest::newRow("0c") << true << QByteArray::fromHex("0c");
188 		}
189 
190 
test_SecureMessaging()191 		void test_SecureMessaging()
192 		{
193 			CommandApdu apdu = CommandApdu(QByteArray());
194 			QFETCH(bool, secure);
195 			QFETCH(QByteArray, data);
196 
197 			QCOMPARE(apdu.isSecureMessaging(data), secure);
198 		}
199 
200 
test_InvalidCommandApdu()201 		void test_InvalidCommandApdu()
202 		{
203 			QSignalSpy logSpy(Env::getSingleton<LogHandler>()->getEventHandler(), &LogEventHandler::fireLog);
204 
205 			CommandApdu apdu1 = CommandApdu('a', 'i', 'c', 'd', QByteArray(65536, 'w'), 1);
206 			QCOMPARE(logSpy.count(), 1);
207 			QVERIFY(logSpy.takeFirst().at(0).toString().contains("Command data exceeds maximum of 0xFFFF bytes"));
208 
209 			CommandApdu apdu2 = CommandApdu('a', 'i', 'c', 'd', QByteArray("abc"), 65539);
210 			QCOMPARE(logSpy.count(), 1);
211 			QVERIFY(logSpy.takeFirst().at(0).toString().contains("Expected length exceeds maximum value of 0x010000"));
212 		}
213 
214 
215 };
216 
217 QTEST_GUILESS_MAIN(test_CommandApdu)
218 #include "test_CommandApdu.moc"
219