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