1 /*! 2 * \brief Tests for the class CardConnectionWorker. 3 * 4 * \copyright Copyright (c) 2019-2021 Governikus GmbH & Co. KG, Germany 5 */ 6 7 #include "CardConnectionWorker.h" 8 9 #include "asn1/KnownOIDs.h" 10 11 #include "MockReader.h" 12 13 #include <QtTest> 14 15 using namespace governikus; 16 17 class test_CardConnectionWorker 18 : public QObject 19 { 20 Q_OBJECT 21 QSharedPointer<CardConnectionWorker> mWorker; 22 QScopedPointer<MockReader> mReader; 23 setCard()24 void setCard() 25 { 26 QVector<TransmitConfig> transmitConfigs; 27 transmitConfigs.append(TransmitConfig(CardReturnCode::OK, QByteArray::fromHex("6982"))); 28 transmitConfigs.append(TransmitConfig(CardReturnCode::OK, QByteArray::fromHex("9000"))); 29 MockCardConfig cardConfig(transmitConfigs); 30 mReader->setCard(cardConfig); 31 } 32 33 private Q_SLOTS: init()34 void init() 35 { 36 mReader.reset(new MockReader()); 37 mWorker = CardConnectionWorker::create(mReader.data()); 38 } 39 40 cleanup()41 void cleanup() 42 { 43 mWorker.clear(); 44 mReader.reset(); 45 } 46 47 test_Transmit()48 void test_Transmit() 49 { 50 const CommandApdu emptyCommandApdu(QByteArray("")); 51 52 //no card 53 QCOMPARE(mWorker->transmit(emptyCommandApdu), ResponseApduResult({CardReturnCode::CARD_NOT_FOUND})); 54 55 setCard(); 56 57 //no secure messaging 58 ResponseApdu apdu(QByteArray::fromHex("6982")); 59 QCOMPARE(mWorker->transmit(emptyCommandApdu), ResponseApduResult({CardReturnCode::OK, apdu})); 60 } 61 62 test_EstablishPaceChannel()63 void test_EstablishPaceChannel() 64 { 65 const QByteArray password("111111"); 66 const QByteArray chat = QByteArray::fromHex("7F4C12060904007F00070301020253050000000F0F"); 67 const QByteArray certDescription = QByteArray::fromHex("30 8202A4" 68 " 06 0A 04007F00070301030103" 69 " A1 0E 0C0C442D547275737420476D6248" 70 " A3 3A 0C38476573616D7476657262616E64206465722064657574736368656E20566572736963686572756E67737769727473636861667420652E562E" 71 " A5 820248" 72 " 04 820244 4E616D652C20416E7363687269667420756E6420452D4D61696C2D4164726573736520646573204469656E737465616E626965746572733A0D0A476573616D7476657262616E64206465722064657574736368656E20566572736963686572756E67737769727473636861667420652E562E0D0A57696C68656C6D73747261C39F652034332F3433670D0A3130313137204265726C696E0D0A6265726C696E406764762E64650D0A0D0A4765736368C3A46674737A7765636B3A0D0A2D52656769737472696572756E6720756E64204C6F67696E20616D204744562D4D616B6C6572706F7274616C2D0D0A0D0A48696E7765697320617566206469652066C3BC722064656E204469656E737465616E626965746572207A757374C3A46E646967656E205374656C6C656E2C20646965206469652045696E68616C74756E672064657220566F7273636872696674656E207A756D20446174656E73636875747A206B6F6E74726F6C6C696572656E3A0D0A4265726C696E6572204265617566747261677465722066C3BC7220446174656E73636875747A20756E6420496E666F726D6174696F6E7366726569686569740D0A416E20646572205572616E696120342D31300D0A3130373837204265726C696E0D0A3033302F3133382038392D300D0A6D61696C626F7840646174656E73636875747A2D6265726C696E2E64650D0A687474703A2F2F7777772E646174656E73636875747A2D6265726C696E2E64650D0A416E737072656368706172746E65723A2044722E20416C6578616E64657220446978"); 73 74 //no card 75 QCOMPARE(mWorker->establishPaceChannel(PacePasswordId::PACE_PIN, password, chat, certDescription).getPaceReturnCode(), CardReturnCode::CARD_NOT_FOUND); 76 77 setCard(); 78 79 //basic reader 80 QTest::ignoreMessage(QtInfoMsg, "Starting PACE for PACE_CAN"); 81 QTest::ignoreMessage(QtInfoMsg, "Finished PACE for PACE_CAN with result PROTOCOL_ERROR"); 82 QCOMPARE(mWorker->establishPaceChannel(PacePasswordId::PACE_CAN, password, chat, certDescription).getPaceReturnCode(), CardReturnCode::PROTOCOL_ERROR); 83 84 //comfort reader 85 mReader->getReaderInfo().setBasicReader(false); 86 QTest::ignoreMessage(QtInfoMsg, "Starting PACE for PACE_PIN"); 87 QTest::ignoreMessage(QtInfoMsg, "Finished PACE for PACE_PIN with result COMMAND_FAILED"); 88 QTest::ignoreMessage(QtWarningMsg, "Establishment of PACE channel not supported"); 89 QCOMPARE(mWorker->establishPaceChannel(PacePasswordId::PACE_PIN, QByteArray(), chat, certDescription).getPaceReturnCode(), CardReturnCode::COMMAND_FAILED); 90 } 91 92 test_DestroyPaceChannel()93 void test_DestroyPaceChannel() 94 { 95 //no card 96 QCOMPARE(mWorker->destroyPaceChannel(), CardReturnCode::CARD_NOT_FOUND); 97 98 setCard(); 99 100 //basic reader 101 QTest::ignoreMessage(QtInfoMsg, "Destroying PACE channel"); 102 QTest::ignoreMessage(QtDebugMsg, "Destroying PACE channel with invalid command causing 6700 as return code"); 103 QCOMPARE(mWorker->destroyPaceChannel(), CardReturnCode::OK); 104 105 //comfort reader 106 mReader->getReaderInfo().setBasicReader(false); 107 QTest::ignoreMessage(QtInfoMsg, "Destroying PACE channel"); 108 QTest::ignoreMessage(QtWarningMsg, "Destruction of PACE channel not supported"); 109 QCOMPARE(mWorker->destroyPaceChannel(), CardReturnCode::COMMAND_FAILED); 110 } 111 112 test_SetEidPin()113 void test_SetEidPin() 114 { 115 const QByteArray newPin("111111"); 116 117 //no card 118 QCOMPARE(mWorker->setEidPin(newPin, 5), ResponseApduResult({CardReturnCode::CARD_NOT_FOUND})); 119 120 setCard(); 121 122 //basic reader 123 QTest::ignoreMessage(QtWarningMsg, "Modify PIN failed"); 124 QCOMPARE(mWorker->setEidPin(newPin, 5), ResponseApduResult({CardReturnCode::COMMAND_FAILED})); 125 126 //comfort reader 127 mReader->getReaderInfo().setBasicReader(false); 128 QTest::ignoreMessage(QtWarningMsg, "Setting eID PIN is not supported"); 129 QCOMPARE(mWorker->setEidPin(QByteArray(), 5), ResponseApduResult({CardReturnCode::COMMAND_FAILED})); 130 } 131 132 test_UpdateRetryCounter()133 void test_UpdateRetryCounter() 134 { 135 //no card 136 QCOMPARE(mWorker->updateRetryCounter(), CardReturnCode::CARD_NOT_FOUND); 137 } 138 139 140 }; 141 142 QTEST_GUILESS_MAIN(test_CardConnectionWorker) 143 #include "test_CardConnectionWorker.moc" 144