Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 26 additions & 26 deletions client/QSigner.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -42,9 +42,7 @@
#include <openssl/obj_mac.h>
#include <openssl/rsa.h>

#include <memory>

Q_LOGGING_CATEGORY(SLog, "qdigidoc4.QSigner")
static Q_LOGGING_CATEGORY(SLog, "qdigidoc4.QSigner")

class QSigner::Private final
{
Expand Down Expand Up @@ -123,10 +121,10 @@ QSigner::QSigner(QObject *parent)
WarningDialog::show(msg);
});
connect(this, &QSigner::signDataChanged, this, [this](const TokenData &token) {
std::string method = (CONF(signatureDigestUri));
std::string method;
if(token.data(QStringLiteral("PSS")).toBool())
{
switch(methodToNID(method))
switch(methodToNID(CONF(signatureDigestUri)))
{
case QCryptographicHash::Sha224: method = "http://www.w3.org/2007/05/xmldsig-more#sha224-rsa-MGF1"; break;
case QCryptographicHash::Sha256: method = "http://www.w3.org/2007/05/xmldsig-more#sha256-rsa-MGF1"; break;
Expand Down Expand Up @@ -266,7 +264,8 @@ quint8 QSigner::login(const TokenData &cert) const
return login(cert);
default:
d->lock.unlock();
d->smartcard->reloadCounters(); // QSmartCard should also know that PIN is blocked.
// QSmartCard should also know that PIN is blocked.
std::thread(&QSmartCard::reloadCard, d->smartcard, d->smartcard->tokenData(), true).detach();
return status;
}
}
Expand All @@ -275,7 +274,8 @@ void QSigner::logout() const
{
d->backend->logout();
d->lock.unlock();
d->smartcard->reloadCounters(); // QSmartCard should also know that PIN1 info is updated
// QSmartCard should also know that PIN1 info is updated
std::thread(&QSmartCard::reloadCard, d->smartcard, d->smartcard->tokenData(), true).detach();
}

QCryptographicHash::Algorithm QSigner::methodToNID(const std::string &method)
Expand Down Expand Up @@ -320,8 +320,6 @@ void QSigner::run()
return;
}

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

TokenData aold = d->auth;
TokenData sold = d->sign;
// check if selected card is still in slot
if(!at.isNull() && !acards.contains(at))
if(!d->auth.isNull() && !acards.contains(d->auth))
{
qCDebug(SLog) << "Disconnected from auth card" << st.card();
at.clear();
qCDebug(SLog) << "Disconnected from auth card" << d->auth.card();
d->auth.clear();
}
if(!st.isNull() && !scards.contains(st))
if(!d->sign.isNull() && !scards.contains(d->sign))
{
qCDebug(SLog) << "Disconnected from sign card" << st.card();
st.clear();
qCDebug(SLog) << "Disconnected from sign card" << d->sign.card();
d->sign.clear();
}

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

// update data if something has changed
TokenData update;
if(aold != at)
Q_EMIT authDataChanged(d->auth = update = at);
if(sold != st)
Q_EMIT signDataChanged(d->sign = update = st);
if(aold != at || sold != st)
d->smartcard->reloadCard(update);
if(aold != d->auth)
Q_EMIT authDataChanged(update = d->auth);
if(sold != d->sign)
Q_EMIT signDataChanged(update = d->sign);
if(aold != d->auth || sold != d->sign)
d->smartcard->reloadCard(update, false);
d->lock.unlock();
}

Expand Down Expand Up @@ -394,7 +394,7 @@ void QSigner::selectCard(const TokenData &token)
Q_EMIT signDataChanged(d->sign = other);
break;
}
d->smartcard->reloadCard(token);
std::thread(&QSmartCard::reloadCard, d->smartcard, token, false).detach();
}

std::vector<unsigned char> QSigner::sign(const std::string &method, const std::vector<unsigned char> &digest ) const
Expand Down
8 changes: 1 addition & 7 deletions client/QSmartCard.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -610,11 +610,6 @@ QSmartCard::ErrorType QSmartCard::pinUnblock(QSmartCardData::PinType type, QSmar
return UnknownError;
}

void QSmartCard::reloadCounters()
{
QMetaObject::invokeMethod(this, [this] { reloadCard(d->token, true); });
}

void QSmartCard::reloadCard(const TokenData &token, bool reloadCounters)
{
qCDebug(CLog) << "Polling";
Expand Down Expand Up @@ -663,8 +658,7 @@ void QSmartCard::reloadCard(const TokenData &token, bool reloadCounters)
}

qCDebug(CLog) << "Read card" << token.card() << "info";
QSharedDataPointer<QSmartCardDataPrivate> t;
t = d->t.d;
QSharedDataPointer<QSmartCardDataPrivate> t = d->t.d;
t->reader = selectedReader->name();
t->pinpad = selectedReader->isPinPad();
if(d->card->loadPerso(selectedReader.get(), t))
Expand Down
7 changes: 3 additions & 4 deletions client/QSmartCard.h
Original file line number Diff line number Diff line change
Expand Up @@ -112,17 +112,16 @@ class QSmartCard final: public QObject

QSmartCardData data() const;
TokenData tokenData() const;
void reloadCard(const TokenData &token, bool reloadCounters = false);
void reloadCounters();
void reloadCard(const TokenData &token, bool reloadCounters);

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

signals:
Q_SIGNALS:
void dataChanged(const QSmartCardData &data);

private:
Q_DISABLE_COPY(QSmartCard)
Q_DISABLE_COPY_MOVE(QSmartCard)

class Private;
std::unique_ptr<Private> d;
Expand Down
Loading