AusweisApp2
CardConnection.h
gehe zur Dokumentation dieser Datei
1 
7 #pragma once
8 
9 #include "CardConnectionWorker.h"
10 #include "InputAPDUInfo.h"
11 #include "ReaderInfo.h"
12 #include "SmartCardDefinitions.h"
13 #include "asn1/CVCertificate.h"
15 #include "asn1/Chat.h"
17 
21 
26 
27 #include <QByteArray>
28 
29 class test_CardConnection;
30 
31 namespace governikus
32 {
33 
38  : public QObject
39 {
40  Q_OBJECT
41  friend class MockCardConnection;
42  friend class ::test_CardConnection;
43 
44  private:
48  QSharedPointer<CardConnectionWorker> mCardConnectionWorker;
49  ReaderInfo mReaderInfo;
50 
51  bool mPaceCanSuccessful;
52  bool mPacePinSuccessful;
53 
54  TransmitCommand* createTransmitCommand(const QVector<InputAPDUInfo>& pInputApduInfos, const QString& pSlotHandle);
55  UpdateRetryCounterCommand* createUpdateRetryCounterCommand();
56 
57  EstablishPaceChannelCommand* createEstablishPaceChannelCommand(PacePasswordId pPacePasswordId, const QByteArray& pPacePassword, const QByteArray& pEffectiveChat, const QByteArray& pCertificateDescription);
58  SetEidPinCommand* createSetEidPinCommand(const QByteArray& pNewPin, quint8 pTimeoutSeconds);
59  DestroyPaceChannelCommand* createDestroyPaceChannelCommand();
60 
61  DidAuthenticateEAC1Command* createDidAuthenticateEAC1Command();
62  DidAuthenticateEAC2Command* createDidAuthenticateEAC2Command(const CVCertificateChain& pCvcChain,
63  const QByteArray& pEphemeralPublicKeyAsHex,
64  const QByteArray& pSignatureAsHex,
65  const QByteArray& pAuthenticatedAuxiliaryDataAsBinary,
66  const QByteArray& pPin);
67 
68  template<typename T>
69  QMetaObject::Connection call(BaseCardCommand* pCommand, const typename QtPrivate::FunctionPointer<T>::Object* pReceiver, T pFunc)
70  {
71  pCommand->moveToThread(mCardConnectionWorker->thread());
72 
73  QMetaObject::Connection resultConnection = connect(pCommand, &BaseCardCommand::commandDone, pReceiver, pFunc, Qt::UniqueConnection);
74 
75  if (resultConnection)
76  {
77  pCommand->run();
78  }
79  else
80  {
81  qCCritical(card) << "Cannot invoke card command:" << pCommand->metaObject()->className();
82  pCommand->deleteLater();
83  }
84 
85  return resultConnection;
86  }
87 
88  private Q_SLOTS:
89  void onReaderInfoChanged(const ReaderInfo& pReaderInfo);
90 
91  protected:
93 
94  public:
95  explicit CardConnection(const QSharedPointer<CardConnectionWorker>& pCardConnectionWorker);
96 
100  ~CardConnection() override = default;
101 
108  virtual const ReaderInfo& getReaderInfo();
109 
110  [[nodiscard]] bool getPaceCanSuccessful() const;
111  [[nodiscard]] bool getPacePinSuccessful() const;
112 
113  void setKeepAlive(bool pEnabled);
114  void setProgressMessage(const QString& pMessage, int pProgress = -1);
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 = 60)
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  {
177  auto command = createDestroyPaceChannelCommand();
178  return call(command, pReceiver, pFunc);
179  }
180 
181 
182  template<typename T>
183  QMetaObject::Connection callTransmitCommand(const typename QtPrivate::FunctionPointer<T>::Object* pReceiver, T pFunc,
184  const QVector<InputAPDUInfo>& pInputApduInfos, const QString& pSlotHandle = QString())
185  {
186  auto command = createTransmitCommand(pInputApduInfos, pSlotHandle);
187  return call(command, pReceiver, pFunc);
188  }
189 
190 
191  template<typename T>
192  QMetaObject::Connection callUpdateRetryCounterCommand(const typename QtPrivate::FunctionPointer<T>::Object* pReceiver, T pFunc)
193  {
194  auto command = createUpdateRetryCounterCommand();
195  return call(command, pReceiver, pFunc);
196  }
197 
198  Q_SIGNALS:
199  void fireReaderInfoChanged(const ReaderInfo& pReaderInfo);
200 };
201 
202 } // namespace governikus
Definition: BaseCardCommand.h:21
void commandDone(QSharedPointer< BaseCardCommand > pCommand)
void run()
Definition: BaseCardCommand.cpp:32
Definition: CVCertificateChain.h:22
This class represents a connection to a smart card.
Definition: CardConnection.h:39
QMetaObject::Connection callDestroyPaceChannelCommand(const typename QtPrivate::FunctionPointer< T >::Object *pReceiver, T pFunc)
Definition: CardConnection.h:175
void fireReaderInfoChanged(const ReaderInfo &pReaderInfo)
friend class MockCardConnection
Definition: CardConnection.h:41
QMetaObject::Connection callSetEidPinCommand(const typename QtPrivate::FunctionPointer< T >::Object *pReceiver, T pFunc, const QByteArray &pNewPin, quint8 pTimeoutSeconds=60)
Definition: CardConnection.h:165
QMetaObject::Connection callUpdateRetryCounterCommand(const typename QtPrivate::FunctionPointer< T >::Object *pReceiver, T pFunc)
Definition: CardConnection.h:192
~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 callTransmitCommand(const typename QtPrivate::FunctionPointer< T >::Object *pReceiver, T pFunc, const QVector< InputAPDUInfo > &pInputApduInfos, const QString &pSlotHandle=QString())
Definition: CardConnection.h:183
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: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:59
void setKeepAlive(bool pEnabled)
Definition: CardConnection.cpp:51
Definition: DestroyPaceChannelCommand.h:18
Definition: DidAuthenticateEAC1Command.h:20
Definition: DidAuthenticateEAC2Command.h:20
Definition: EstablishPaceChannelCommand.h:19
Definition: ReaderInfo.h:18
Definition: SetEidPinCommand.h:19
Definition: TransmitCommand.h:20
Definition: UpdateRetryCounterCommand.h:18
#define T(v)
Definition: http_parser.cpp:237
Implementation of GeneralAuthenticate response APDUs.
Definition: CommandApdu.h:16
quint8
Definition: ResponseApdu.h:62
PACE_PIN
Definition: SmartCardDefinitions.h:21
PACE_CAN
Definition: SmartCardDefinitions.h:20