diff --git a/client/Diagnostics.cpp b/client/Diagnostics.cpp index 34fa74e3..9f380b8f 100644 --- a/client/Diagnostics.cpp +++ b/client/Diagnostics.cpp @@ -27,6 +27,12 @@ #include #include +#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0) +namespace Qt { +using ::hex; +} +#endif + void Diagnostics::generalInfo(QTextStream &s) { s << "" << tr("Arguments:") << " " << Application::arguments().join(' ') << "
" @@ -122,10 +128,10 @@ void Diagnostics::generalInfo(QTextStream &s) { constexpr auto APDU = &QByteArray::fromHex; QPCSCReader::Result r = reader.transfer(apdu); - s << label << ": " << r.SW.toHex(); - if (r.SW == APDU("9000")) s << " (OK)"; - if (r.SW == APDU("6A81")) s << " (Locked)"; - if (r.SW == APDU("6A82")) s << " (Not found)"; + s << label << ": " << Qt::hex << r.SW; + if (r.SW == 0x9000) s << " (OK)"; + if (r.SW == 0x6A81) s << " (Locked)"; + if (r.SW == 0x6A82) s << " (Not found)"; s << "
"; return r; }; diff --git a/client/QSmartCard.cpp b/client/QSmartCard.cpp index a65562b6..b5cbd356 100644 --- a/client/QSmartCard.cpp +++ b/client/QSmartCard.cpp @@ -87,8 +87,6 @@ QString QSmartCardData::typeString(QSmartCardData::PinType type) return {}; } -const QByteArray Card::MASTER_FILE = APDU("00A4000C"); -const QByteArray Card::MUTUAL_AUTH = APDU("00880000 00 00"); const QByteArray Card::CHANGE = APDU("00240000 00"); const QByteArray Card::READBINARY = APDU("00B00000 00"); const QByteArray Card::REPLACE = APDU("002C0000 00"); @@ -129,7 +127,7 @@ QHash Card::parseFCI(const QByteArray &data) -const QByteArray IDEMIACard::AID = APDU("00A40400 10 A000000077010800070000FE00000100"); +const QByteArray IDEMIACard::AID = APDU("00A4040C 10 A000000077010800070000FE00000100"); const QByteArray IDEMIACard::AID_OT = APDU("00A4040C 0D E828BD080FF2504F5420415750"); const QByteArray IDEMIACard::AID_QSCD = APDU("00A4040C 10 51534344204170706C69636174696F6E"); @@ -163,10 +161,7 @@ bool IDEMIACard::isSupported(const QByteArray &atr) bool IDEMIACard::loadPerso(QPCSCReader *reader, QSmartCardDataPrivate *d) const { - if(!reader->transfer(AID) || - !reader->transfer(MASTER_FILE)) - return false; - if(d->data.isEmpty() && reader->transfer(APDU("00A4010C025000"))) + if(d->data.isEmpty() && reader->transfer(APDU("00A4090C 04 3F00 5000"))) { QByteArray cmd = APDU("00A4020C025001"); for(char data = 1; data <= 8; ++data) @@ -203,15 +198,13 @@ bool IDEMIACard::loadPerso(QPCSCReader *reader, QSmartCardDataPrivate *d) const } bool readFailed = false; - auto readCert = [&](const QByteArray &file1, const QByteArray &file2) { - if(!reader->transfer(MASTER_FILE) || !reader->transfer(file1)) + auto readCert = [&](const QByteArray &path) { + QPCSCReader::Result data = reader->transfer(path); + if(!data) { readFailed = true; return QSslCertificate(); } - QPCSCReader::Result data = reader->transfer(file2); - if(!data) - return QSslCertificate(); QHash fci = parseFCI(data.data); int size = fci.contains(0x80) ? quint8(fci[0x80][0]) << 8 | quint8(fci[0x80][1]) : 0x0600; QByteArray cert; @@ -231,9 +224,9 @@ bool IDEMIACard::loadPerso(QPCSCReader *reader, QSmartCardDataPrivate *d) const return QSslCertificate(cert, QSsl::Der); }; if(d->authCert.isNull()) - d->authCert = readCert(APDU("00A4010C02ADF1"), APDU("00A4020402340100")); + d->authCert = readCert(APDU("00A40904 06 3F00 ADF1 3401 00")); if(d->signCert.isNull()) - d->signCert = readCert(APDU("00A4010C02ADF2"), APDU("00A4020402341F00")); + d->signCert = readCert(APDU("00A40904 06 3F00 ADF2 341F 00")); if(readFailed) return false; @@ -280,7 +273,7 @@ QByteArray IDEMIACard::sign(QPCSCReader *reader, const QByteArray &dgst) const if(!reader->transfer(AID_OT) || !reader->transfer(APDU("002241A4 09 8004FF200800840181"))) return {}; - QByteArray cmd = MUTUAL_AUTH; + QByteArray cmd = APDU("00880000 00 00"); cmd[4] = char(std::min(size_t(dgst.size()), 0x30)); cmd.insert(5, dgst.left(0x30)); return reader->transfer(cmd).data; @@ -289,12 +282,12 @@ QByteArray IDEMIACard::sign(QPCSCReader *reader, const QByteArray &dgst) const bool IDEMIACard::updateCounters(QPCSCReader *reader, QSmartCardDataPrivate *d) const { reader->transfer(AID); - if(auto data = reader->transfer(APDU("00CB3FFF 0A 4D087006BF810102A08000"))) + if(auto data = reader->transfer(APDU("00CB3FFF 0A 4D087006BF810102A080 00"))) d->retry[QSmartCardData::Pin1Type] = quint8(data.data[13]); - if(auto data = reader->transfer(APDU("00CB3FFF 0A 4D087006BF810202A08000"))) + if(auto data = reader->transfer(APDU("00CB3FFF 0A 4D087006BF810202A080 00"))) d->retry[QSmartCardData::PukType] = quint8(data.data[13]); reader->transfer(AID_QSCD); - if(auto data = reader->transfer(APDU("00CB3FFF 0A 4D087006BF810502A08000"))) + if(auto data = reader->transfer(APDU("00CB3FFF 0A 4D087006BF810502A080 00"))) d->retry[QSmartCardData::Pin2Type] = quint8(data.data[13]); return true; } @@ -314,7 +307,7 @@ QSmartCard::ErrorType QSmartCard::Private::handlePinResult(QPCSCReader *reader, { if(!response || forceUpdate) card->updateCounters(reader, t.d); - switch((quint8(response.SW[0]) << 8) + quint8(response.SW[1])) + switch(response.SW) { case 0x9000: return QSmartCard::NoError; case 0x63C0: return QSmartCard::BlockedError;//pin retry count 0 @@ -471,7 +464,6 @@ void QSmartCard::reloadCard(const TokenData &token, bool reloadCounters) t = d->t.d; t->reader = selectedReader->name(); t->pinpad = selectedReader->isPinPad(); - d->card.reset(); d->card = std::make_unique(); if(d->card->loadPerso(selectedReader.data(), t)) { diff --git a/client/QSmartCard_p.h b/client/QSmartCard_p.h index 13780bad..f9f61a77 100644 --- a/client/QSmartCard_p.h +++ b/client/QSmartCard_p.h @@ -44,8 +44,6 @@ class Card static QHash parseFCI(const QByteArray &data); - static const QByteArray MASTER_FILE; - static const QByteArray MUTUAL_AUTH; static const QByteArray CHANGE; static const QByteArray READBINARY; static const QByteArray REPLACE; @@ -61,7 +59,6 @@ class IDEMIACard: public Card QByteArray sign(QPCSCReader *reader, const QByteArray &dgst) const final; bool updateCounters(QPCSCReader *reader, QSmartCardDataPrivate *d) const final; - static QString cardNR(QPCSCReader *reader); static bool isSupported(const QByteArray &atr); static QByteArray pinTemplate(const QString &pin); diff --git a/common b/common index 8e4034ff..27319130 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit 8e4034fff04708e305d0bc9df8e445d6c3ffc81f +Subproject commit 27319130f517cc085531d59beda5779b5b223b4e