@@ -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
127127const QByteArray IDEMIACard::AID = APDU(" 00A4040C 10 A000000077010800070000FE00000100" );
128128const QByteArray IDEMIACard::AID_OT = APDU(" 00A4040C 0D E828BD080FF2504F5420415750" );
129129const 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
131133QPCSCReader::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
154156bool IDEMIACard::isSupported (const QByteArray &atr)
155157{
156- return atr == " 3BDB960080B1FE451F830012233F536549440F9000F1 " ;
158+ return atr == ATR_COSMO8 || atr == ATR_COSMOX ;
157159}
158160
159161bool 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
321327QSmartCard::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 ()));
0 commit comments