@@ -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,8 +155,7 @@ QPCSCReader::Result IDEMIACard::change(QPCSCReader *reader, QSmartCardData::PinT
153155
154156bool IDEMIACard::isSupported (const QByteArray &atr)
155157{
156- return atr == " 3BDB960080B1FE451F830012233F536549440F9000F1" ||
157- atr == " 3BDC960080B1FE451F830012233F54654944320F9000C3" ;
158+ return atr == ATR_COSMO8 || atr == ATR_COSMOX;
158159}
159160
160161bool 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 ();
0 commit comments