@@ -92,9 +92,12 @@ const QByteArray Card::READBINARY = APDU("00B00000 00");
9292const QByteArray Card::REPLACE = APDU(" 002C0000 00" );
9393const QByteArray Card::VERIFY = APDU(" 00200000 00" );
9494
95- QPCSCReader::Result Card::transfer (QPCSCReader *reader, bool verify, const QByteArray &apdu,
95+ QPCSCReader::Result Card::transfer (QPCSCReader *reader, bool verify, QByteArray & &apdu,
9696 QSmartCardData::PinType type, quint8 newPINOffset, bool requestCurrentPIN)
9797{
98+ auto clean = qScopeGuard ([&apdu] {
99+ apdu.fill (' 0' );
100+ });
98101 if (!reader->isPinPad ())
99102 return reader->transfer (apdu);
100103 quint16 language = 0x0000 ;
@@ -191,11 +194,9 @@ const QByteArray IDEMIACard::AID_QSCD = APDU("00A4040C 10 51534344204170706C6963
191194const QByteArray IDEMIACard::ATR_COSMO8 = QByteArrayLiteral(" 3BDB960080B1FE451F830012233F536549440F9000F1" );
192195const QByteArray IDEMIACard::ATR_COSMOX = QByteArrayLiteral(" 3BDC960080B1FE451F830012233F54654944320F9000C3" );
193196
194- QPCSCReader::Result IDEMIACard::change (QPCSCReader *reader, QSmartCardData::PinType type, QByteArray && pin, QByteArray & &newpin) const
197+ QPCSCReader::Result IDEMIACard::change (QPCSCReader *reader, QSmartCardData::PinType type, const QByteArray &pin, const QByteArray &newpin) const
195198{
196199 QByteArray cmd = CHANGE;
197- newpin = pinTemplate (std::move (newpin));
198- pin = pinTemplate (std::move (pin));
199200 switch (type) {
200201 case QSmartCardData::Pin1Type:
201202 cmd[3 ] = 1 ;
@@ -210,7 +211,9 @@ QPCSCReader::Result IDEMIACard::change(QPCSCReader *reader, QSmartCardData::PinT
210211 break ;
211212 }
212213 cmd[4 ] = char (pin.size () + newpin.size ());
213- return transfer (reader, false , cmd + pin + newpin, type, quint8 (pin.size ()), true );
214+ cmd += pin;
215+ cmd += newpin;
216+ return transfer (reader, false , std::move (cmd), type, quint8 (pin.size ()), true );
214217}
215218
216219bool IDEMIACard::isSupported (const QByteArray &atr)
@@ -291,23 +294,24 @@ bool IDEMIACard::loadPerso(QPCSCReader *reader, QSmartCardDataPrivate *d) const
291294 return updateCounters (reader, d);
292295}
293296
294- QByteArray IDEMIACard::pinTemplate (QByteArray &&pin)
297+ QByteArray IDEMIACard::pinTemplate (const QString &data) const
295298{
299+ QByteArray pin = data.toUtf8 ();
296300#if QT_VERSION >= QT_VERSION_CHECK(6, 4, 0)
297301 pin.resize (12 , char (0xFF ));
298302#else
299303 pin += QByteArray (12 - pin.size (), char (0xFF ));
300304#endif
301- return std::move ( pin) ;
305+ return pin;
302306}
303307
304- QPCSCReader::Result IDEMIACard::replace (QPCSCReader *reader, QSmartCardData::PinType type, QByteArray && puk, QByteArray & &pin) const
308+ QPCSCReader::Result IDEMIACard::replace (QPCSCReader *reader, QSmartCardData::PinType type, const QByteArray &puk, const QByteArray &pin) const
305309{
306- puk = pinTemplate (std::move (puk));
307310 QByteArray cmd = VERIFY;
308311 cmd[3 ] = 2 ;
309312 cmd[4 ] = char (puk.size ());
310- if (auto result = transfer (reader, true , cmd + puk, QSmartCardData::PukType, 0 , true ); !result)
313+ cmd += puk;
314+ if (auto result = transfer (reader, true , std::move (cmd), QSmartCardData::PukType, 0 , true ); !result)
311315 return result;
312316
313317 cmd = Card::REPLACE;
@@ -320,9 +324,9 @@ QPCSCReader::Result IDEMIACard::replace(QPCSCReader *reader, QSmartCardData::Pin
320324 }
321325 else
322326 cmd[3 ] = char (type);
323- pin = pinTemplate (std::move (pin));
324327 cmd[4 ] = char (pin.size ());
325- return transfer (reader, false , cmd + pin, type, 0 , false );
328+ cmd += pin;
329+ return transfer (reader, false , std::move (cmd), type, 0 , false );
326330}
327331
328332bool IDEMIACard::updateCounters (QPCSCReader *reader, QSmartCardDataPrivate *d) const
@@ -351,14 +355,14 @@ bool IDEMIACard::updateCounters(QPCSCReader *reader, QSmartCardDataPrivate *d) c
351355
352356const QByteArray THALESCard::AID = APDU(" 00A4040C 0C A000000063504B43532D3135" );
353357
354- QPCSCReader::Result THALESCard::change (QPCSCReader *reader, QSmartCardData::PinType type, QByteArray && pin, QByteArray & &newpin) const
358+ QPCSCReader::Result THALESCard::change (QPCSCReader *reader, QSmartCardData::PinType type, const QByteArray &pin, const QByteArray &newpin) const
355359{
356360 QByteArray cmd = CHANGE;
357- newpin = pinTemplate (std::move (newpin));
358- pin = pinTemplate (std::move (pin));
359361 cmd[3 ] = char (0x80 | type);
360362 cmd[4 ] = char (pin.size () + newpin.size ());
361- return transfer (reader, false , cmd + pin + newpin, type, quint8 (pin.size ()), true );
363+ cmd += pin;
364+ cmd += newpin;
365+ return transfer (reader, false , std::move (cmd), type, quint8 (pin.size ()), true );
362366}
363367
364368bool THALESCard::isSupported (const QByteArray &atr)
@@ -441,25 +445,25 @@ bool THALESCard::loadPerso(QPCSCReader *reader, QSmartCardDataPrivate *d) const
441445 return updateCounters (reader, d);
442446}
443447
444- QByteArray THALESCard::pinTemplate (const QString &pin)
448+ QByteArray THALESCard::pinTemplate (const QString &data) const
445449{
446- QByteArray result = pin .toUtf8 ();
450+ QByteArray pin = data .toUtf8 ();
447451#if QT_VERSION >= QT_VERSION_CHECK(6, 4, 0)
448- result .resize (12 , char (0x00 ));
452+ pin .resize (12 , char (0x00 ));
449453#else
450- result += QByteArray (12 - result.size (), char (0x00 ));
454+ pin += QByteArray (12 - result.size (), char (0x00 ));
451455#endif
452- return result ;
456+ return pin ;
453457}
454458
455- QPCSCReader::Result THALESCard::replace (QPCSCReader *reader, QSmartCardData::PinType type, QByteArray && puk, QByteArray & &pin) const
459+ QPCSCReader::Result THALESCard::replace (QPCSCReader *reader, QSmartCardData::PinType type, const QByteArray &puk, const QByteArray &pin) const
456460{
457- puk = pinTemplate (std::move (puk));
458- pin = pinTemplate (std::move (pin));
459461 QByteArray cmd = REPLACE;
460462 cmd[3 ] = char (0x80 | type);
461463 cmd[4 ] = char (puk.size () + pin.size ());
462- return transfer (reader, false , cmd + puk + pin, type, quint8 (puk.size ()), true );
464+ cmd += puk;
465+ cmd += pin;
466+ return transfer (reader, false , std::move (cmd), type, quint8 (puk.size ()), true );
463467}
464468
465469bool THALESCard::updateCounters (QPCSCReader *reader, QSmartCardDataPrivate *d) const
@@ -533,16 +537,31 @@ bool QSmartCard::pinChange(QSmartCardData::PinType type, QSmartCard::PinAction a
533537 }
534538 popup.reset (new PinPopup (src, flags, d->t .authCert (), parent, bodyText));
535539 popup->open ();
540+ oldPin = d->card ->pinTemplate ({});
541+ newPin = d->card ->pinTemplate ({});
536542 }
537543 else
538544 {
539545 PinUnblock p (type, action, d->t .retryCount (src), d->t .data (QSmartCardData::BirthDate).toDate (),
540546 d->t .data (QSmartCardData::Id).toString (), d->t .isPUKReplacable (), parent);
541547 if (!p.exec ())
542548 return false ;
543- oldPin = p.firstCodeText ().toUtf8 ();
544- newPin = p.newCodeText ().toUtf8 ();
549+ QString oldPinString = p.firstCodeText ();
550+ QString newPinString = p.newCodeText ();
551+ oldPin = d->card ->pinTemplate (oldPinString);
552+ newPin = d->card ->pinTemplate (newPinString);
553+ // Try to clean QLineEdit internal PIN copy using constData that does not detach memory
554+ auto chars = const_cast <QChar*>(oldPinString.constData ());
555+ for (int i = 0 ; i < oldPinString.length (); ++i)
556+ chars[i] = ' \0 ' ;
557+ chars = const_cast <QChar*>(newPinString.constData ());
558+ for (int i = 0 ; i < newPinString.length (); ++i)
559+ chars[i] = ' \0 ' ;
545560 }
561+ auto clean = qScopeGuard ([&oldPin, &newPin] {
562+ oldPin.fill (' \0 ' );
563+ newPin.fill (' \0 ' );
564+ });
546565
547566 QPCSCReader reader (d->t .reader (), &QPCSC::instance ());
548567 if (!reader.connect ())
@@ -551,8 +570,8 @@ bool QSmartCard::pinChange(QSmartCardData::PinType type, QSmartCard::PinAction a
551570 return false ;
552571 }
553572 auto response = action == QSmartCard::ChangeWithPin || action == QSmartCard::ActivateWithPin ?
554- d->card ->change (&reader, type, std::move ( oldPin), std::move ( newPin) ) :
555- d->card ->replace (&reader, type, std::move ( oldPin), std::move ( newPin) );
573+ d->card ->change (&reader, type, oldPin, newPin) :
574+ d->card ->replace (&reader, type, oldPin, newPin);
556575 switch (response.SW )
557576 {
558577 case 0x9000 :
0 commit comments