Skip to content

Commit 0501517

Browse files
committed
Fix hash for ECC keys
IB-8107 Signed-off-by: Raul Metsma <raul@metsma.ee>
1 parent 62f084e commit 0501517

3 files changed

Lines changed: 28 additions & 34 deletions

File tree

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 & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
#include <QtCore/QScopedPointer>
3131
#include <QtNetwork/QSslKey>
3232

33-
Q_LOGGING_CATEGORY(CLog, "qdigidoc4.QSmartCard")
33+
static Q_LOGGING_CATEGORY(CLog, "qdigidoc4.QSmartCard")
3434

3535
QSmartCardData::QSmartCardData(): d(new QSmartCardDataPrivate) {}
3636
QSmartCardData::QSmartCardData(const QSmartCardData &other) = default;
@@ -632,11 +632,6 @@ QSmartCard::ErrorType QSmartCard::pinUnblock(QSmartCardData::PinType type, QSmar
632632
return unblock(type, parent, newPin, puk, title, textBody);
633633
}
634634

635-
void QSmartCard::reloadCounters()
636-
{
637-
QMetaObject::invokeMethod(this, [this] { reloadCard(d->token, true); });
638-
}
639-
640635
void QSmartCard::reloadCard(const TokenData &token, bool reloadCounters)
641636
{
642637
qCDebug(CLog) << "Polling";

client/QSmartCard.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,8 +113,7 @@ class QSmartCard final: public QObject
113113
ErrorType change( QSmartCardData::PinType type, QWidget* parent, const QString &newpin, const QString &pin, const QString &title, const QString &bodyText );
114114
QSmartCardData data() const;
115115
TokenData tokenData() const;
116-
void reloadCard(const TokenData &token, bool reloadCounters = false);
117-
void reloadCounters();
116+
void reloadCard(const TokenData &token, bool reloadCounters);
118117
ErrorType unblock( QSmartCardData::PinType type, QWidget* parent, const QString &pin, const QString &puk, const QString &title, const QString &bodyText );
119118

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

0 commit comments

Comments
 (0)