AusweisApp2
Lade ...
Suche ...
Keine Treffer
CardConnection.h
gehe zur Dokumentation dieser Datei
1
7#pragma once
8
9#include "asn1/Chat.h"
10#include "asn1/CVCertificate.h"
14#include "InputAPDUInfo.h"
15#include "ReaderInfo.h"
17
21
27
28#include <QByteArray>
29
30class test_CardConnection;
31
32namespace governikus
33{
34
39 : public QObject
40{
41 private:
42 friend class MockCardConnection;
43 friend class ::test_CardConnection;
44
45 Q_OBJECT
46
50 QSharedPointer<CardConnectionWorker> mCardConnectionWorker;
51 ReaderInfo mReaderInfo;
52
53 bool mPaceCanSuccessful;
54 bool mPacePinSuccessful;
55
56 TransmitCommand* createTransmitCommand(const QVector<InputAPDUInfo>& pInputApduInfos, const QString& pSlotHandle);
57 UpdateRetryCounterCommand* createUpdateRetryCounterCommand();
58 UnblockPinCommand* createUnblockPinCommand(const QByteArray& pPuk);
59
60 EstablishPaceChannelCommand* createEstablishPaceChannelCommand(PacePasswordId pPacePasswordId, const QByteArray& pPacePassword, const QByteArray& pEffectiveChat, const QByteArray& pCertificateDescription);
61 SetEidPinCommand* createSetEidPinCommand(const QByteArray& pNewPin, quint8 pTimeoutSeconds);
62 DestroyPaceChannelCommand* createDestroyPaceChannelCommand();
63
64 DidAuthenticateEAC1Command* createDidAuthenticateEAC1Command();
65 DidAuthenticateEAC2Command* createDidAuthenticateEAC2Command(const CVCertificateChain& pCvcChain,
66 const QByteArray& pEphemeralPublicKeyAsHex,
67 const QByteArray& pSignatureAsHex,
68 const QByteArray& pAuthenticatedAuxiliaryDataAsBinary);
69
70 template<typename T>
71 QMetaObject::Connection call(BaseCardCommand* pCommand, const typename QtPrivate::FunctionPointer<T>::Object* pReceiver, T pFunc)
72 {
73 pCommand->moveToThread(mCardConnectionWorker->thread());
74
75 QMetaObject::Connection resultConnection = connect(pCommand, &BaseCardCommand::commandDone, pReceiver, pFunc, Qt::UniqueConnection);
76
77 if (resultConnection)
78 {
79 pCommand->run();
80 }
81 else
82 {
83 qCCritical(card) << "Cannot invoke card command:" << pCommand->metaObject()->className();
84 pCommand->deleteLater();
85 }
86
87 return resultConnection;
88 }
89
90 private Q_SLOTS:
91 void onReaderInfoChanged(const ReaderInfo& pReaderInfo);
92
93 protected:
95
96 public:
97 explicit CardConnection(const QSharedPointer<CardConnectionWorker>& pCardConnectionWorker);
98
102 ~CardConnection() override = default;
103
110 virtual const ReaderInfo& getReaderInfo();
111
112 [[nodiscard]] bool getPaceCanSuccessful() const;
113 [[nodiscard]] bool getPacePinSuccessful() const;
114
115 void setProgressMessage(const QString& pMessage, int pProgress = -1);
116 bool stopSecureMessaging();
117
118 template<typename T>
119 QMetaObject::Connection callDidAuthenticateEAC1Command(const typename QtPrivate::FunctionPointer<T>::Object* pReceiver, T pFunc)
120 {
121 auto command = createDidAuthenticateEAC1Command();
122 return call(command, pReceiver, pFunc);
123 }
124
125
126 template<typename T>
127 QMetaObject::Connection callDidAuthenticateEAC2Command(const typename QtPrivate::FunctionPointer<T>::Object* pReceiver, T pFunc,
128 const CVCertificateChain& pCvcChain,
129 const QByteArray& pEphemeralPublicKeyAsHex,
130 const QByteArray& pSignatureAsHex,
131 const QByteArray& pAuthenticatedAuxiliaryDataAsBinary)
132 {
133 auto command = createDidAuthenticateEAC2Command(pCvcChain, pEphemeralPublicKeyAsHex, pSignatureAsHex, pAuthenticatedAuxiliaryDataAsBinary);
134 return call(command, pReceiver, pFunc);
135 }
136
137
138 template<typename T>
139 QMetaObject::Connection callUnblockPinCommand(const typename QtPrivate::FunctionPointer<T>::Object* pReceiver, T pFunc,
140 const QByteArray& pPuk)
141 {
142 auto command = createUnblockPinCommand(pPuk);
143 return call(command, pReceiver, pFunc);
144 }
145
146
147 template<typename T>
148 QMetaObject::Connection callEstablishPaceChannelCommand(const typename QtPrivate::FunctionPointer<T>::Object* pReceiver, T pFunc,
149 PacePasswordId pPacePasswordId, const QByteArray& pPacePassword, const QByteArray& pEffectiveChat = QByteArray(), const QByteArray& pCertificateDescription = QByteArray())
150 {
151 EstablishPaceChannelCommand* command = createEstablishPaceChannelCommand(pPacePasswordId, pPacePassword, pEffectiveChat, pCertificateDescription);
152
153 if (pPacePasswordId == PacePasswordId::PACE_CAN)
154 {
155 connect(command, &BaseCardCommand::commandDone, this, [this](QSharedPointer<BaseCardCommand> pCommand){
156 mPaceCanSuccessful = pCommand->getReturnCode() == CardReturnCode::OK;
157 });
158 }
159 else if (pPacePasswordId == PacePasswordId::PACE_PIN)
160 {
161 connect(command, &BaseCardCommand::commandDone, this, [this](QSharedPointer<BaseCardCommand> pCommand){
162 mPacePinSuccessful = pCommand->getReturnCode() == CardReturnCode::OK;
163 if (!mPacePinSuccessful)
164 {
165 mPaceCanSuccessful = false;
166 }
167 });
168 }
169
170 return call(command, pReceiver, pFunc);
171 }
172
173
174 template<typename T>
175 QMetaObject::Connection callSetEidPinCommand(const typename QtPrivate::FunctionPointer<T>::Object* pReceiver, T pFunc,
176 const QByteArray& pNewPin,
177 quint8 pTimeoutSeconds = 60)
178 {
179 auto command = createSetEidPinCommand(pNewPin, pTimeoutSeconds);
180 return call(command, pReceiver, pFunc);
181 }
182
183
184 template<typename T>
185 QMetaObject::Connection callDestroyPaceChannelCommand(const typename QtPrivate::FunctionPointer<T>::Object* pReceiver, T pFunc)
186 {
187 auto command = createDestroyPaceChannelCommand();
188 return call(command, pReceiver, pFunc);
189 }
190
191
192 template<typename T>
193 QMetaObject::Connection callTransmitCommand(const typename QtPrivate::FunctionPointer<T>::Object* pReceiver, T pFunc,
194 const QVector<InputAPDUInfo>& pInputApduInfos, const QString& pSlotHandle = QString())
195 {
196 auto command = createTransmitCommand(pInputApduInfos, pSlotHandle);
197 return call(command, pReceiver, pFunc);
198 }
199
200
201 template<typename T>
202 QMetaObject::Connection callUpdateRetryCounterCommand(const typename QtPrivate::FunctionPointer<T>::Object* pReceiver, T pFunc)
203 {
204 auto command = createUpdateRetryCounterCommand();
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:37
Definition: CVCertificateChain.h:22
This class represents a connection to a smart card.
Definition: CardConnection.h:40
QMetaObject::Connection callDestroyPaceChannelCommand(const typename QtPrivate::FunctionPointer< T >::Object *pReceiver, T pFunc)
Definition: CardConnection.h:185
void fireReaderInfoChanged(const ReaderInfo &pReaderInfo)
friend class MockCardConnection
Definition: CardConnection.h:42
QMetaObject::Connection callSetEidPinCommand(const typename QtPrivate::FunctionPointer< T >::Object *pReceiver, T pFunc, const QByteArray &pNewPin, quint8 pTimeoutSeconds=60)
Definition: CardConnection.h:175
QMetaObject::Connection callUpdateRetryCounterCommand(const typename QtPrivate::FunctionPointer< T >::Object *pReceiver, T pFunc)
Definition: CardConnection.h:202
~CardConnection() override=default
Destroys the CardConnection and disconnects from the card.
bool getPacePinSuccessful() const
Definition: CardConnection.cpp:45
virtual const ReaderInfo & getReaderInfo()
This method returns a stored copy of the reader info object.
Definition: CardConnection.cpp:33
QMetaObject::Connection callDidAuthenticateEAC2Command(const typename QtPrivate::FunctionPointer< T >::Object *pReceiver, T pFunc, const CVCertificateChain &pCvcChain, const QByteArray &pEphemeralPublicKeyAsHex, const QByteArray &pSignatureAsHex, const QByteArray &pAuthenticatedAuxiliaryDataAsBinary)
Definition: CardConnection.h:127
QMetaObject::Connection callUnblockPinCommand(const typename QtPrivate::FunctionPointer< T >::Object *pReceiver, T pFunc, const QByteArray &pPuk)
Definition: CardConnection.h:139
QMetaObject::Connection callTransmitCommand(const typename QtPrivate::FunctionPointer< T >::Object *pReceiver, T pFunc, const QVector< InputAPDUInfo > &pInputApduInfos, const QString &pSlotHandle=QString())
Definition: CardConnection.h:193
bool getPaceCanSuccessful() const
Definition: CardConnection.cpp:39
CardConnection()
Definition: CardConnection.cpp:23
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:148
QMetaObject::Connection callDidAuthenticateEAC1Command(const typename QtPrivate::FunctionPointer< T >::Object *pReceiver, T pFunc)
Definition: CardConnection.h:119
bool stopSecureMessaging()
Definition: CardConnection.cpp:59
void setProgressMessage(const QString &pMessage, int pProgress=-1)
Definition: CardConnection.cpp:51
Definition: DestroyPaceChannelCommand.h:18
Definition: DidAuthenticateEAC1Command.h:20
Definition: DidAuthenticateEAC2Command.h:20
Definition: EstablishPaceChannelCommand.h:19
Definition: ReaderInfo.h:17
Definition: SetEidPinCommand.h:19
Definition: TransmitCommand.h:20
Definition: UnblockPinCommand.h:18
Definition: UpdateRetryCounterCommand.h:18
#define T(v)
Definition: http_parser.cpp:237
Implementation of ActivationContext for Intent based activation on Android systems.
Definition: ActivationContext.h:15
quint8
Definition: ResponseApdu.h:62