@@ -127,6 +127,8 @@ QHash<quint8,QByteArray> Card::parseFCI(const QByteArray &data)
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
@@ -203,10 +204,15 @@ bool IDEMIACard::loadPerso(QPCSCReader *reader, QSmartCardDataPrivate *d) const
203204 return QSslCertificate ();
204205 QByteArray cert;
205206 QByteArray cmd = READBINARY;
207+ int maxLe = 0 ;
208+ if (reader->atr () == ATR_COSMOX)
209+ maxLe = 0xC0 ;
206210 for (int size = quint8 (fci[0x80 ][0 ]) << 8 | quint8 (fci[0x80 ][1 ]); cert.size () < size; )
207211 {
208212 cmd[2 ] = char (cert.size () >> 8 );
209213 cmd[3 ] = char (cert.size ());
214+ if (maxLe != 0 )
215+ cmd[4 ] = char (std::min<int >(size - cert.size (), maxLe));
210216 data = reader->transfer (cmd);
211217 if (!data)
212218 return QSslCertificate ();
0 commit comments