@@ -48,17 +48,15 @@ namespace
4848
4949constexpr byte_type PIN_PADDING_CHAR = 0x00 ;
5050constexpr byte_type ECDSA_ALGO = 0x04 ;
51- constexpr byte_type SIGNING_PIN_REFERENCE = 0x82 ;
5251
5352const auto SELECT_MAIN_AID = CommandApdu::select(
5453 0x04 , {0xa0 , 0x00 , 0x00 , 0x00 , 0x63 , 0x50 , 0x4b , 0x43 , 0x53 , 0x2d , 0x31 , 0x35 });
5554
5655} // namespace
5756
58- ElectronicID::PinRetriesRemainingAndMax
59- EIDThales::authPinRetriesLeftImpl (const SmartCard::Session& session) const
57+ ElectronicID::PinInfo EIDThales::authPinInfoImpl (const SmartCard::Session& session) const
6058{
61- return pinRetriesLeft (session, authPinReference ());
59+ return pinRetriesLeft (session, authPinReference (), true );
6260}
6361
6462byte_vector EIDThales::getCertificateImpl (const SmartCard::Session& session,
@@ -68,8 +66,8 @@ byte_vector EIDThales::getCertificateImpl(const SmartCard::Session& session,
6866 return readFile (session, type.isAuthentication () ? authCertFile () : signCertFile ());
6967}
7068
71- ElectronicID::PinRetriesRemainingAndMax EIDThales::pinRetriesLeft (const SmartCard::Session& session,
72- byte_type pinReference) const
69+ ElectronicID::PinInfo EIDThales::pinRetriesLeft (const SmartCard::Session& session,
70+ byte_type pinReference, bool pinActive ) const
7371{
7472 const auto GET_DATA = smartcard ().protocol () == SmartCard::Protocol::T1
7573 ? CommandApdu {0x00 , 0xCB , 0x00 , 0xFF , {0xA0 , 0x03 , 0x83 , 0x01 , pinReference}, 0x00 }
@@ -78,8 +76,9 @@ ElectronicID::PinRetriesRemainingAndMax EIDThales::pinRetriesLeft(const SmartCar
7876 if (!response.isOK ()) {
7977 THROW (SmartCardError, " Command GET DATA failed with error " + response);
8078 }
81- if (TLV info = TLV (response.data ).find (0xA0 )[0xdf21 ]) {
82- return {*info.begin , maximumPinRetries ()};
79+ if (TLV info = TLV (response.data ).find (0xA0 ); TLV count = info[0xdf21 ]) {
80+ TLV pinChanged = info[0xdf2f ];
81+ return {*count.begin , maximumPinRetries (), pinActive || !pinChanged || *pinChanged.begin };
8382 }
8483 THROW (SmartCardError,
8584 " Command GET DATA failed: received data does not contain the PIN remaining retries info" );
@@ -147,10 +146,9 @@ byte_vector EIDThales::sign(const SmartCard::Session& session, const HashAlgorit
147146 return std::move (signature.data );
148147}
149148
150- ElectronicID::PinRetriesRemainingAndMax
151- EIDThales::signingPinRetriesLeftImpl (const SmartCard::Session& session) const
149+ ElectronicID::PinInfo EIDThales::signingPinInfoImpl (const SmartCard::Session& session) const
152150{
153- return pinRetriesLeft (session, SIGNING_PIN_REFERENCE);
151+ return pinRetriesLeft (session, SIGNING_PIN_REFERENCE, true );
154152}
155153
156154byte_vector EIDThales::signWithAuthKeyImpl (const SmartCard::Session& session, byte_vector&& pin,
0 commit comments