AusweisApp2
CardConnection.h
gehe zur Dokumentation dieser Datei
1 
7 #pragma once
8 
9 #include "asn1/Chat.h"
10 #include "asn1/CVCertificate.h"
13 #include "CardConnectionWorker.h"
14 #include "InputAPDUInfo.h"
15 #include "ReaderInfo.h"
16 #include "SmartCardDefinitions.h"
17 
21 
27 
28 #include <QByteArray>
29 
32 
33 namespace governikus
34 {
35 
40  : public QObject
41 {
42  private:
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 QString& pPuk);
59 
60  EstablishPaceChannelCommand* createEstablishPaceChannelCommand(PacePasswordId pPacePasswordId, const QString& pPacePassword, const QByteArray& pEffectiveChat, const QByteArray& pCertificateDescription);
61  SetEidPinCommand* createSetEidPinCommand(const QString& pNewPin, quint8 pTimeoutSeconds);
62  DestroyPaceChannelCommand* createDestroyPaceChannelCommand();
63 
64  DidAuthenticateEAC1Command* createDidAuthenticateEAC1Command();
65  DidAuthenticateEAC2Command* createDidAuthenticateEAC2Command(const CVCertificateChain& pCvcChain,
66  const QString& pEphemeralPublicKeyAsHex,
67  const QString& 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  virtual ~CardConnection() = default;
103 
110  virtual const ReaderInfo& getReaderInfo();
111 
112  bool getPaceCanSuccessful() const;
113  bool getPacePinSuccessful() const;
114 
115  void setProgressMessage(const QString& pMessage);
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 QString& pEphemeralPublicKeyAsHex,
130  const QString& 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 QString& 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 QString& 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 QString& 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
governikus::CardConnectionWorker::getReaderInfo
Q_INVOKABLE ReaderInfo getReaderInfo() const
Definition: CardConnectionWorker.cpp:48
governikus::UpdateRetryCounterCommand
Definition: UpdateRetryCounterCommand.h:18
DestroyPaceChannelCommand.h
governikus::BaseCardCommand::run
void run()
Definition: BaseCardCommand.cpp:37
EstablishPaceChannelCommand.h
governikus::DidAuthenticateEAC1Command
Definition: DidAuthenticateEAC1Command.h:20
governikus::CardConnection::getPacePinSuccessful
bool getPacePinSuccessful() const
Definition: CardConnection.cpp:45
CardConnectionWorker.h
governikus::UnblockPinCommand
Definition: UnblockPinCommand.h:18
governikus::BaseCardCommand::commandDone
void commandDone(QSharedPointer< BaseCardCommand > pCommand)
Definition: moc_BaseCardCommand.cpp:152
governikus::DestroyPaceChannelCommand
Definition: DestroyPaceChannelCommand.h:18
governikus::CardConnection::callDidAuthenticateEAC1Command
QMetaObject::Connection callDidAuthenticateEAC1Command(const typename QtPrivate::FunctionPointer< T >::Object *pReceiver, T pFunc)
Definition: CardConnection.h:119
governikus::quint8
quint8
Definition: ResponseApdu.h:62
InputAPDUInfo.h
governikus::SetEidPinCommand
Definition: SetEidPinCommand.h:19
SetEidPinCommand.h
governikus::ReaderInfo
Definition: ReaderInfo.h:17
UnblockPinCommand.h
ReaderInfo.h
DidAuthenticateEAC2Command.h
governikus::BaseCardCommand
Definition: BaseCardCommand.h:21
governikus::CardConnection
This class represents a connection to a smart card.
Definition: CardConnection.h:41
governikus::CardConnectionWorker::fireReaderInfoChanged
void fireReaderInfoChanged(const ReaderInfo &pReaderInfo)
Definition: moc_CardConnectionWorker.cpp:158
governikus::CardConnection::callSetEidPinCommand
QMetaObject::Connection callSetEidPinCommand(const typename QtPrivate::FunctionPointer< T >::Object *pReceiver, T pFunc, const QString &pNewPin, quint8 pTimeoutSeconds=60)
Definition: CardConnection.h:175
governikus::PACE_CAN
PACE_CAN
Definition: SmartCardDefinitions.h:20
governikus::DidAuthenticateEAC2Command
Definition: DidAuthenticateEAC2Command.h:20
test_StatePreparePace
Definition: test_StatePreparePace.cpp:21
governikus::CardConnection::getPaceCanSuccessful
bool getPaceCanSuccessful() const
Definition: CardConnection.cpp:39
governikus::CardConnection::fireReaderInfoChanged
void fireReaderInfoChanged(const ReaderInfo &pReaderInfo)
Definition: moc_CardConnection.cpp:140
UpdateRetryCounterCommand.h
BaseCardCommand.h
governikus::EstablishPaceChannelCommand
Definition: EstablishPaceChannelCommand.h:19
governikus
Implementation of ActivationContext for Intent based activation on Android systems.
Definition: ActivationContext.h:15
governikus::CardConnection::callUnblockPinCommand
QMetaObject::Connection callUnblockPinCommand(const typename QtPrivate::FunctionPointer< T >::Object *pReceiver, T pFunc, const QString &pPuk)
Definition: CardConnection.h:139
SmartCardDefinitions.h
governikus::PACE_PIN
PACE_PIN
Definition: SmartCardDefinitions.h:21
TransmitCommand.h
test_CardConnection
Definition: test_CardConnection.cpp:17
governikus::CardConnection::callDidAuthenticateEAC2Command
QMetaObject::Connection callDidAuthenticateEAC2Command(const typename QtPrivate::FunctionPointer< T >::Object *pReceiver, T pFunc, const CVCertificateChain &pCvcChain, const QString &pEphemeralPublicKeyAsHex, const QString &pSignatureAsHex, const QByteArray &pAuthenticatedAuxiliaryDataAsBinary)
Definition: CardConnection.h:127
governikus::CardConnection::stopSecureMessaging
bool stopSecureMessaging()
Definition: CardConnection.cpp:59
DidAuthenticateEAC1Command.h
governikus::CardConnection::~CardConnection
virtual ~CardConnection()=default
Destroys the CardConnection and disconnects from the card.
governikus::CardConnection::callUpdateRetryCounterCommand
QMetaObject::Connection callUpdateRetryCounterCommand(const typename QtPrivate::FunctionPointer< T >::Object *pReceiver, T pFunc)
Definition: CardConnection.h:202
governikus::CardConnection::callEstablishPaceChannelCommand
QMetaObject::Connection callEstablishPaceChannelCommand(const typename QtPrivate::FunctionPointer< T >::Object *pReceiver, T pFunc, PacePasswordId pPacePasswordId, const QString &pPacePassword, const QByteArray &pEffectiveChat=QByteArray(), const QByteArray &pCertificateDescription=QByteArray())
Definition: CardConnection.h:148
CVCertificate.h
T
#define T(v)
Definition: http_parser.cpp:237
governikus::CardConnection::CardConnection
CardConnection()
Definition: CardConnection.cpp:23
Chat.h
governikus::CardConnection::setProgressMessage
void setProgressMessage(const QString &pMessage)
Definition: CardConnection.cpp:51
governikus::TransmitCommand
Definition: TransmitCommand.h:20
governikus::CVCertificateChain
Definition: CVCertificateChain.h:22
CVCertificateChain.h
governikus::CardConnection::getReaderInfo
virtual const ReaderInfo & getReaderInfo()
This method returns a stored copy of the reader info object.
Definition: CardConnection.cpp:33
governikus::CardConnection::callTransmitCommand
QMetaObject::Connection callTransmitCommand(const typename QtPrivate::FunctionPointer< T >::Object *pReceiver, T pFunc, const QVector< InputAPDUInfo > &pInputApduInfos, const QString &pSlotHandle=QString())
Definition: CardConnection.h:193
governikus::CardConnectionWorker::stopSecureMessaging
virtual Q_INVOKABLE bool stopSecureMessaging()
Destroys an established secure messaging channel, if there is one.
Definition: CardConnectionWorker.cpp:154
CardConnection.h
governikus::CardConnection::callDestroyPaceChannelCommand
QMetaObject::Connection callDestroyPaceChannelCommand(const typename QtPrivate::FunctionPointer< T >::Object *pReceiver, T pFunc)
Definition: CardConnection.h:185