Skip to content

Commit e91a9e5

Browse files
author
Lauris Kaplinski
committed
Merge branch 'master' into libcdoc
2 parents 47b0e40 + e2476d0 commit e91a9e5

File tree

2 files changed

+20
-14
lines changed

2 files changed

+20
-14
lines changed

client/QSmartCard.cpp

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -103,13 +103,13 @@ QPCSCReader::Result Card::transfer(QPCSCReader *reader, bool verify, const QByte
103103
}
104104

105105

106-
QHash<quint8,QByteArray> Card::parseFCI(const QByteArray &data)
106+
QByteArrayView Card::parseFCI(const QByteArray &data, quint8 expectedTag)
107107
{
108-
QHash<quint8,QByteArray> result;
109108
for(auto i = data.constBegin(); i != data.constEnd(); ++i)
110109
{
111110
quint8 tag(*i), size(*++i);
112-
result[tag] = QByteArray(i + 1, size);
111+
if(tag == expectedTag)
112+
return QByteArrayView(i + 1, size);
113113
switch(tag)
114114
{
115115
case 0x6F:
@@ -119,14 +119,16 @@ QHash<quint8,QByteArray> Card::parseFCI(const QByteArray &data)
119119
default: i += size; break;
120120
}
121121
}
122-
return result;
122+
return QByteArrayView();
123123
}
124124

125125

126126

127127
const QByteArray IDEMIACard::AID = APDU("00A4040C 10 A000000077010800070000FE00000100");
128128
const QByteArray IDEMIACard::AID_OT = APDU("00A4040C 0D E828BD080FF2504F5420415750");
129129
const QByteArray IDEMIACard::AID_QSCD = APDU("00A4040C 10 51534344204170706C69636174696F6E");
130+
const QByteArray IDEMIACard::ATR_COSMO8 = QByteArrayLiteral("3BDB960080B1FE451F830012233F536549440F9000F1");
131+
const QByteArray IDEMIACard::ATR_COSMOX = QByteArrayLiteral("3BDC960080B1FE451F830012233F54654944320F9000C3");
130132

131133
QPCSCReader::Result IDEMIACard::change(QPCSCReader *reader, QSmartCardData::PinType type, const QString &pin_, const QString &newpin_) const
132134
{
@@ -153,7 +155,7 @@ QPCSCReader::Result IDEMIACard::change(QPCSCReader *reader, QSmartCardData::PinT
153155

154156
bool IDEMIACard::isSupported(const QByteArray &atr)
155157
{
156-
return atr == "3BDB960080B1FE451F830012233F536549440F9000F1";
158+
return atr == ATR_COSMO8 || atr == ATR_COSMOX;
157159
}
158160

159161
bool IDEMIACard::loadPerso(QPCSCReader *reader, QSmartCardDataPrivate *d) const
@@ -197,15 +199,19 @@ bool IDEMIACard::loadPerso(QPCSCReader *reader, QSmartCardDataPrivate *d) const
197199
QPCSCReader::Result data = reader->transfer(path);
198200
if(!data)
199201
return QSslCertificate();
200-
QHash<quint8,QByteArray> fci = parseFCI(data.data);
201-
if(!fci.contains(0x80))
202+
auto sizeTag = parseFCI(data.data, 0x80);
203+
if(sizeTag.isEmpty())
202204
return QSslCertificate();
203205
QByteArray cert;
204206
QByteArray cmd = READBINARY;
205-
for(int size = quint8(fci[0x80][0]) << 8 | quint8(fci[0x80][1]); cert.size() < size; )
207+
qsizetype maxLe = 0;
208+
if(reader->atr() == ATR_COSMOX)
209+
maxLe = 0xC0;
210+
for(qsizetype size = quint8(sizeTag[0]) << 8 | quint8(sizeTag[1]); cert.size() < size; )
206211
{
207212
cmd[2] = char(cert.size() >> 8);
208213
cmd[3] = char(cert.size());
214+
cmd[4] = char(std::min(size - cert.size(), maxLe));
209215
data = reader->transfer(cmd);
210216
if(!data)
211217
return QSslCertificate();
@@ -319,8 +325,8 @@ QSmartCard::ErrorType QSmartCard::Private::handlePinResult(QPCSCReader *reader,
319325

320326

321327
QSmartCard::QSmartCard(QObject *parent)
322-
: QObject(parent)
323-
, d(new Private)
328+
: QObject(parent)
329+
, d(new Private)
324330
{
325331
}
326332

@@ -471,8 +477,8 @@ QSmartCard::ErrorType QSmartCard::unblock(QSmartCardData::PinType type, QWidget*
471477
PinPopup::PinFlags flags = {};
472478
switch(type)
473479
{
474-
case QSmartCardData::Pin1Type: flags = PinPopup::Pin1Type; break;
475-
case QSmartCardData::Pin2Type: flags = PinPopup::Pin2Type; break;
480+
case QSmartCardData::Pin1Type: flags = PinPopup::Pin1Type; break;
481+
case QSmartCardData::Pin2Type: flags = PinPopup::Pin2Type; break;
476482
default: return UnknownError;
477483
}
478484
QSharedPointer<QPCSCReader> reader(d->connect(d->t.reader()));

client/QSmartCard_p.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ class Card
4141
QSmartCardData::PinType type, quint8 newPINOffset, bool requestCurrentPIN);
4242
virtual bool updateCounters(QPCSCReader *reader, QSmartCardDataPrivate *d) const = 0;
4343

44-
static QHash<quint8,QByteArray> parseFCI(const QByteArray &data);
44+
static QByteArrayView parseFCI(const QByteArray &data, quint8 expectedTag);
4545

4646
static const QByteArray CHANGE;
4747
static const QByteArray READBINARY;
@@ -61,7 +61,7 @@ class IDEMIACard: public Card
6161
static bool isSupported(const QByteArray &atr);
6262
static QByteArray pinTemplate(const QString &pin);
6363

64-
static const QByteArray AID, AID_OT, AID_QSCD;
64+
static const QByteArray AID, AID_OT, AID_QSCD, ATR_COSMO8, ATR_COSMOX;
6565
};
6666

6767
class QSmartCard::Private

0 commit comments

Comments
 (0)