Skip to content

Commit b7648da

Browse files
authored
Fix hash for ECC keys (#1367)
IB-8107 Signed-off-by: Raul Metsma <[email protected]>
1 parent d086099 commit b7648da

File tree

3 files changed

+30
-37
lines changed

3 files changed

+30
-37
lines changed

client/QSigner.cpp

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,7 @@
4242
#include <openssl/obj_mac.h>
4343
#include <openssl/rsa.h>
4444

45-
#include <memory>
46-
47-
Q_LOGGING_CATEGORY(SLog, "qdigidoc4.QSigner")
45+
static Q_LOGGING_CATEGORY(SLog, "qdigidoc4.QSigner")
4846

4947
class QSigner::Private final
5048
{
@@ -123,10 +121,10 @@ QSigner::QSigner(QObject *parent)
123121
WarningDialog::show(msg);
124122
});
125123
connect(this, &QSigner::signDataChanged, this, [this](const TokenData &token) {
126-
std::string method = (CONF(signatureDigestUri));
124+
std::string method;
127125
if(token.data(QStringLiteral("PSS")).toBool())
128126
{
129-
switch(methodToNID(method))
127+
switch(methodToNID(CONF(signatureDigestUri)))
130128
{
131129
case QCryptographicHash::Sha224: method = "http://www.w3.org/2007/05/xmldsig-more#sha224-rsa-MGF1"; break;
132130
case QCryptographicHash::Sha256: method = "http://www.w3.org/2007/05/xmldsig-more#sha256-rsa-MGF1"; break;
@@ -266,7 +264,8 @@ quint8 QSigner::login(const TokenData &cert) const
266264
return login(cert);
267265
default:
268266
d->lock.unlock();
269-
d->smartcard->reloadCounters(); // QSmartCard should also know that PIN is blocked.
267+
// QSmartCard should also know that PIN is blocked.
268+
std::thread(&QSmartCard::reloadCard, d->smartcard, d->smartcard->tokenData(), true).detach();
270269
return status;
271270
}
272271
}
@@ -275,7 +274,8 @@ void QSigner::logout() const
275274
{
276275
d->backend->logout();
277276
d->lock.unlock();
278-
d->smartcard->reloadCounters(); // QSmartCard should also know that PIN1 info is updated
277+
// QSmartCard should also know that PIN1 info is updated
278+
std::thread(&QSmartCard::reloadCard, d->smartcard, d->smartcard->tokenData(), true).detach();
279279
}
280280

281281
QCryptographicHash::Algorithm QSigner::methodToNID(const std::string &method)
@@ -320,8 +320,6 @@ void QSigner::run()
320320
return;
321321
}
322322

323-
TokenData aold = d->auth, at = aold;
324-
TokenData sold = d->sign, st = sold;
325323
QList<TokenData> acards, scards;
326324
QList<TokenData> cache = d->backend->tokens();
327325
std::sort(cache.begin(), cache.end(), cardsOrder);
@@ -340,33 +338,35 @@ void QSigner::run()
340338
scards.append(t);
341339
}
342340

341+
TokenData aold = d->auth;
342+
TokenData sold = d->sign;
343343
// check if selected card is still in slot
344-
if(!at.isNull() && !acards.contains(at))
344+
if(!d->auth.isNull() && !acards.contains(d->auth))
345345
{
346-
qCDebug(SLog) << "Disconnected from auth card" << st.card();
347-
at.clear();
346+
qCDebug(SLog) << "Disconnected from auth card" << d->auth.card();
347+
d->auth.clear();
348348
}
349-
if(!st.isNull() && !scards.contains(st))
349+
if(!d->sign.isNull() && !scards.contains(d->sign))
350350
{
351-
qCDebug(SLog) << "Disconnected from sign card" << st.card();
352-
st.clear();
351+
qCDebug(SLog) << "Disconnected from sign card" << d->sign.card();
352+
d->sign.clear();
353353
}
354354

355355
// if none is selected then pick first card with signing cert;
356356
// if no signing certs then pick first card with auth cert
357-
if(st.isNull() && !scards.isEmpty())
358-
st = scards.first();
359-
if(at.isNull() && !acards.isEmpty())
360-
at = acards.first();
357+
if(d->sign.isNull() && !scards.isEmpty())
358+
d->sign = scards.first();
359+
if(d->auth.isNull() && !acards.isEmpty())
360+
d->auth = acards.first();
361361

362362
// update data if something has changed
363363
TokenData update;
364-
if(aold != at)
365-
Q_EMIT authDataChanged(d->auth = update = at);
366-
if(sold != st)
367-
Q_EMIT signDataChanged(d->sign = update = st);
368-
if(aold != at || sold != st)
369-
d->smartcard->reloadCard(update);
364+
if(aold != d->auth)
365+
Q_EMIT authDataChanged(update = d->auth);
366+
if(sold != d->sign)
367+
Q_EMIT signDataChanged(update = d->sign);
368+
if(aold != d->auth || sold != d->sign)
369+
d->smartcard->reloadCard(update, false);
370370
d->lock.unlock();
371371
}
372372

@@ -394,7 +394,7 @@ void QSigner::selectCard(const TokenData &token)
394394
Q_EMIT signDataChanged(d->sign = other);
395395
break;
396396
}
397-
d->smartcard->reloadCard(token);
397+
std::thread(&QSmartCard::reloadCard, d->smartcard, token, false).detach();
398398
}
399399

400400
std::vector<unsigned char> QSigner::sign(const std::string &method, const std::vector<unsigned char> &digest ) const

client/QSmartCard.cpp

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -609,11 +609,6 @@ QSmartCard::ErrorType QSmartCard::pinUnblock(QSmartCardData::PinType type, QSmar
609609
return UnknownError;
610610
}
611611

612-
void QSmartCard::reloadCounters()
613-
{
614-
QMetaObject::invokeMethod(this, [this] { reloadCard(d->token, true); });
615-
}
616-
617612
void QSmartCard::reloadCard(const TokenData &token, bool reloadCounters)
618613
{
619614
qCDebug(CLog) << "Polling";
@@ -662,8 +657,7 @@ void QSmartCard::reloadCard(const TokenData &token, bool reloadCounters)
662657
}
663658

664659
qCDebug(CLog) << "Read card" << token.card() << "info";
665-
QSharedDataPointer<QSmartCardDataPrivate> t;
666-
t = d->t.d;
660+
QSharedDataPointer<QSmartCardDataPrivate> t = d->t.d;
667661
t->reader = selectedReader->name();
668662
t->pinpad = selectedReader->isPinPad();
669663
if(d->card->loadPerso(selectedReader.get(), t))

client/QSmartCard.h

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -112,17 +112,16 @@ class QSmartCard final: public QObject
112112

113113
QSmartCardData data() const;
114114
TokenData tokenData() const;
115-
void reloadCard(const TokenData &token, bool reloadCounters = false);
116-
void reloadCounters();
115+
void reloadCard(const TokenData &token, bool reloadCounters);
117116

118117
ErrorType pinUnblock(QSmartCardData::PinType type, PinAction action = UnblockWithPuk, QWidget* parent = nullptr);
119118
ErrorType pinChange(QSmartCardData::PinType type, PinAction action = ChangeWithPin, QWidget* parent = nullptr);
120119

121-
signals:
120+
Q_SIGNALS:
122121
void dataChanged(const QSmartCardData &data);
123122

124123
private:
125-
Q_DISABLE_COPY(QSmartCard)
124+
Q_DISABLE_COPY_MOVE(QSmartCard)
126125

127126
class Private;
128127
std::unique_ptr<Private> d;

0 commit comments

Comments
 (0)