AusweisApp
 
Lade ...
Suche ...
Keine Treffer
CardConnection.h
gehe zur Dokumentation dieser Datei
1
4
5#pragma once
6
8#include "InputAPDUInfo.h"
9#include "ReaderInfo.h"
13
17
23
24#include <QByteArray>
25#include <QLoggingCategory>
26
27
28class test_CardConnection;
29
30
31namespace governikus
32{
34 : public QObject
35{
36 Q_OBJECT
37 friend class MockCardConnection;
38 friend class ::test_CardConnection;
39
40 private:
41 static const QLoggingCategory& getLoggingCategory();
42
46 QSharedPointer<CardConnectionWorker> mCardConnectionWorker;
47 ReaderInfo mReaderInfo;
48
49 bool mPaceCanSuccessful;
50 bool mPacePinSuccessful;
51
52 TransmitCommand* createTransmitCommand(const QList<InputAPDUInfo>& pInputApduInfos, const QString& pSlotHandle);
53 UpdateRetryCounterCommand* createUpdateRetryCounterCommand(const QString& pSlotHandle);
54 ResetRetryCounterCommand* createResetRetryCounterCommand();
55
56 EstablishPaceChannelCommand* createEstablishPaceChannelCommand(PacePasswordId pPacePasswordId, const QByteArray& pPacePassword, const QByteArray& pEffectiveChat, const QByteArray& pCertificateDescription);
57 SetEidPinCommand* createSetEidPinCommand(const QByteArray& pNewPin, quint8 pTimeoutSeconds);
58 DestroyPaceChannelCommand* createDestroyPaceChannelCommand(const QString& pSlotHandle);
59
60 DidAuthenticateEAC1Command* createDidAuthenticateEAC1Command();
61 DidAuthenticateEAC2Command* createDidAuthenticateEAC2Command(const CVCertificateChain& pCvcChain,
62 const QByteArray& pEphemeralPublicKeyAsHex,
63 const QByteArray& pSignatureAsHex,
64 const QByteArray& pAuthenticatedAuxiliaryDataAsBinary,
65 const QByteArray& pPin);
66
67 template<typename T>
68 QMetaObject::Connection call(BaseCardCommand* pCommand, const typename QtPrivate::FunctionPointer<T>::Object* pReceiver, T pFunc)
69 {
70 pCommand->moveToThread(mCardConnectionWorker->thread());
71
72 QMetaObject::Connection resultConnection = connect(pCommand, &BaseCardCommand::commandDone, pReceiver, pFunc);
73
74 if (resultConnection)
75 {
76 pCommand->run();
77 }
78 else
79 {
80 qCCritical(getLoggingCategory()) << "Cannot invoke card command:" << pCommand->metaObject()->className();
81 pCommand->deleteLater();
82 }
83
84 return resultConnection;
85 }
86
87 private Q_SLOTS:
88 void onReaderInfoChanged(const ReaderInfo& pReaderInfo);
89
90 protected:
92
93 public:
94 explicit CardConnection(const QSharedPointer<CardConnectionWorker>& pCardConnectionWorker);
95
99 ~CardConnection() override = default;
100
107 virtual const ReaderInfo& getReaderInfo();
108
109 [[nodiscard]] bool getPaceCanSuccessful() const;
110 [[nodiscard]] bool getPacePinSuccessful() const;
111
112 void setKeepAlive(bool pEnabled);
113 void setProgressMessage(const QString& pMessage, int pProgress = -1);
114 void setErrorMessage(const QString& pMessage);
115
116 template<typename T>
117 QMetaObject::Connection callDidAuthenticateEAC1Command(const typename QtPrivate::FunctionPointer<T>::Object* pReceiver, T pFunc)
118 {
119 auto command = createDidAuthenticateEAC1Command();
120 return call(command, pReceiver, pFunc);
121 }
122
123
124 template<typename T>
125 QMetaObject::Connection callDidAuthenticateEAC2Command(const typename QtPrivate::FunctionPointer<T>::Object* pReceiver, T pFunc,
126 const CVCertificateChain& pCvcChain,
127 const QByteArray& pEphemeralPublicKeyAsHex,
128 const QByteArray& pSignatureAsHex,
129 const QByteArray& pAuthenticatedAuxiliaryDataAsBinary,
130 const QByteArray& pPin)
131 {
132 auto command = createDidAuthenticateEAC2Command(pCvcChain, pEphemeralPublicKeyAsHex, pSignatureAsHex, pAuthenticatedAuxiliaryDataAsBinary, pPin);
133 return call(command, pReceiver, pFunc);
134 }
135
136
137 template<typename T>
138 QMetaObject::Connection callEstablishPaceChannelCommand(const typename QtPrivate::FunctionPointer<T>::Object* pReceiver, T pFunc,
139 PacePasswordId pPacePasswordId, const QByteArray& pPacePassword, const QByteArray& pEffectiveChat = QByteArray(), const QByteArray& pCertificateDescription = QByteArray())
140 {
141 EstablishPaceChannelCommand* command = createEstablishPaceChannelCommand(pPacePasswordId, pPacePassword, pEffectiveChat, pCertificateDescription);
142
143 if (pPacePasswordId == PacePasswordId::PACE_CAN)
144 {
145 connect(command, &BaseCardCommand::commandDone, this, [this](QSharedPointer<BaseCardCommand> pCommand){
146 mPaceCanSuccessful = pCommand->getReturnCode() == CardReturnCode::OK;
147 });
148 }
149 else if (pPacePasswordId == PacePasswordId::PACE_PIN)
150 {
151 connect(command, &BaseCardCommand::commandDone, this, [this](QSharedPointer<BaseCardCommand> pCommand){
152 mPacePinSuccessful = pCommand->getReturnCode() == CardReturnCode::OK;
153 if (!mPacePinSuccessful)
154 {
155 mPaceCanSuccessful = false;
156 }
157 });
158 }
159
160 return call(command, pReceiver, pFunc);
161 }
162
163
164 template<typename T>
165 QMetaObject::Connection callSetEidPinCommand(const typename QtPrivate::FunctionPointer<T>::Object* pReceiver, T pFunc,
166 const QByteArray& pNewPin,
167 quint8 pTimeoutSeconds = Card::DEFAULT_PINPAD_TIMEOUT)
168 {
169 auto command = createSetEidPinCommand(pNewPin, pTimeoutSeconds);
170 return call(command, pReceiver, pFunc);
171 }
172
173
174 template<typename T>
175 QMetaObject::Connection callDestroyPaceChannelCommand(const typename QtPrivate::FunctionPointer<T>::Object* pReceiver, T pFunc,
176 const QString& pSlotHandle = QString())
177 {
178 auto command = createDestroyPaceChannelCommand(pSlotHandle);
179 return call(command, pReceiver, pFunc);
180 }
181
182
183 template<typename T>
184 QMetaObject::Connection callTransmitCommand(const typename QtPrivate::FunctionPointer<T>::Object* pReceiver, T pFunc,
185 const QList<InputAPDUInfo>& pInputApduInfos, const QString& pSlotHandle = QString())
186 {
187 auto command = createTransmitCommand(pInputApduInfos, pSlotHandle);
188 return call(command, pReceiver, pFunc);
189 }
190
191
192 template<typename T>
193 QMetaObject::Connection callUpdateRetryCounterCommand(const typename QtPrivate::FunctionPointer<T>::Object* pReceiver, T pFunc,
194 const QString& pSlotHandle = QString())
195 {
196 auto command = createUpdateRetryCounterCommand(pSlotHandle);
197 return call(command, pReceiver, pFunc);
198 }
199
200
201 template<typename T>
202 QMetaObject::Connection callResetRetryCounterCommand(const typename QtPrivate::FunctionPointer<T>::Object* pReceiver, T pFunc)
203 {
204 auto command = createResetRetryCounterCommand();
205 return call(command, pReceiver, pFunc);
206 }
207
208 Q_SIGNALS:
209 void fireReaderInfoChanged(const ReaderInfo& pReaderInfo);
210};
211
212} // namespace governikus
Definition BaseCardCommand.h:21
void commandDone(QSharedPointer< BaseCardCommand > pCommand)
void run()
Definition BaseCardCommand.cpp:30
Definition CVCertificateChain.h:24
QMetaObject::Connection callResetRetryCounterCommand(const typename QtPrivate::FunctionPointer< T >::Object *pReceiver, T pFunc)
Definition CardConnection.h:202
void fireReaderInfoChanged(const ReaderInfo &pReaderInfo)
friend class MockCardConnection
Definition CardConnection.h:37
QMetaObject::Connection callDestroyPaceChannelCommand(const typename QtPrivate::FunctionPointer< T >::Object *pReceiver, T pFunc, const QString &pSlotHandle=QString())
Definition CardConnection.h:175
void setErrorMessage(const QString &pMessage)
Definition CardConnection.cpp:78
QMetaObject::Connection callSetEidPinCommand(const typename QtPrivate::FunctionPointer< T >::Object *pReceiver, T pFunc, const QByteArray &pNewPin, quint8 pTimeoutSeconds=Card::DEFAULT_PINPAD_TIMEOUT)
Definition CardConnection.h:165
~CardConnection() override=default
Destroys the CardConnection and disconnects from the card.
bool getPacePinSuccessful() const
Definition CardConnection.cpp:56
virtual const ReaderInfo & getReaderInfo()
This method returns a stored copy of the reader info object.
Definition CardConnection.cpp:44
QMetaObject::Connection callUpdateRetryCounterCommand(const typename QtPrivate::FunctionPointer< T >::Object *pReceiver, T pFunc, const QString &pSlotHandle=QString())
Definition CardConnection.h:193
QMetaObject::Connection callTransmitCommand(const typename QtPrivate::FunctionPointer< T >::Object *pReceiver, T pFunc, const QList< InputAPDUInfo > &pInputApduInfos, const QString &pSlotHandle=QString())
Definition CardConnection.h:184
bool getPaceCanSuccessful() const
Definition CardConnection.cpp:50
CardConnection()
Definition CardConnection.cpp:34
QMetaObject::Connection callEstablishPaceChannelCommand(const typename QtPrivate::FunctionPointer< T >::Object *pReceiver, T pFunc, PacePasswordId pPacePasswordId, const QByteArray &pPacePassword, const QByteArray &pEffectiveChat=QByteArray(), const QByteArray &pCertificateDescription=QByteArray())
Definition CardConnection.h:138
QMetaObject::Connection callDidAuthenticateEAC1Command(const typename QtPrivate::FunctionPointer< T >::Object *pReceiver, T pFunc)
Definition CardConnection.h:117
QMetaObject::Connection callDidAuthenticateEAC2Command(const typename QtPrivate::FunctionPointer< T >::Object *pReceiver, T pFunc, const CVCertificateChain &pCvcChain, const QByteArray &pEphemeralPublicKeyAsHex, const QByteArray &pSignatureAsHex, const QByteArray &pAuthenticatedAuxiliaryDataAsBinary, const QByteArray &pPin)
Definition CardConnection.h:125
void setProgressMessage(const QString &pMessage, int pProgress=-1)
Definition CardConnection.cpp:70
void setKeepAlive(bool pEnabled)
Definition CardConnection.cpp:62
static constexpr int DEFAULT_PINPAD_TIMEOUT
Definition Card.h:47
Definition DestroyPaceChannelCommand.h:21
Definition DidAuthenticateEAC1Command.h:20
Definition DidAuthenticateEAC2Command.h:20
Definition EstablishPaceChannelCommand.h:19
Definition ReaderInfo.h:18
Definition ResetRetryCounterCommand.h:16
Definition SetEidPinCommand.h:19
Definition TransmitCommand.h:20
Definition UpdateRetryCounterCommand.h:18
#define T(v)
Definition http_parser.cpp:237
Defines the AccessRight and AccessRole enum.
Definition CommandApdu.h:17
quint8
Definition ResponseApdu.h:65
const QLoggingCategory & getLoggingCategory()
Definition ASN1TemplateUtil.cpp:11