Skip to content

Commit e2476d0

Browse files
authored
Fix reading certificate with some readers (#1340)
IB-8468 Signed-off-by: Raul Metsma <[email protected]>
1 parent dce63fe commit e2476d0

File tree

2 files changed

+16
-11
lines changed

2 files changed

+16
-11
lines changed

client/QSmartCard.cpp

Lines changed: 14 additions & 9 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,8 +155,7 @@ QPCSCReader::Result IDEMIACard::change(QPCSCReader *reader, QSmartCardData::PinT
153155

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

160161
bool IDEMIACard::loadPerso(QPCSCReader *reader, QSmartCardDataPrivate *d) const
@@ -198,15 +199,19 @@ bool IDEMIACard::loadPerso(QPCSCReader *reader, QSmartCardDataPrivate *d) const
198199
QPCSCReader::Result data = reader->transfer(path);
199200
if(!data)
200201
return QSslCertificate();
201-
QHash<quint8,QByteArray> fci = parseFCI(data.data);
202-
if(!fci.contains(0x80))
202+
auto sizeTag = parseFCI(data.data, 0x80);
203+
if(sizeTag.isEmpty())
203204
return QSslCertificate();
204205
QByteArray cert;
205206
QByteArray cmd = READBINARY;
206-
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; )
207211
{
208212
cmd[2] = char(cert.size() >> 8);
209213
cmd[3] = char(cert.size());
214+
cmd[4] = char(std::min(size - cert.size(), maxLe));
210215
data = reader->transfer(cmd);
211216
if(!data)
212217
return QSslCertificate();

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)