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