@@ -56,21 +56,38 @@ addPaddingToPin(pcsc_cpp::byte_vector&& pin, size_t paddingLength, pcsc_cpp::byt
5656 return std::move (pin);
5757}
5858
59+ struct VerifyPinCommandAPDU : public pcsc_cpp ::CommandApdu
60+ {
61+ public:
62+ // Make it move-only
63+ VerifyPinCommandAPDU (const VerifyPinCommandAPDU&) = delete ;
64+ VerifyPinCommandAPDU& operator =(const VerifyPinCommandAPDU&) = delete ;
65+
66+ VerifyPinCommandAPDU (VerifyPinCommandAPDU&&) noexcept = default ;
67+ VerifyPinCommandAPDU& operator =(VerifyPinCommandAPDU&&) noexcept = default ;
68+
69+ VerifyPinCommandAPDU (pcsc_cpp::byte_type p2, pcsc_cpp::byte_vector&& pin, size_t paddingLength,
70+ pcsc_cpp::byte_type paddingChar) :
71+ CommandApdu (0x00 , 0x20 , 0x00 , p2,
72+ addPaddingToPin (std::move(pin), paddingLength, paddingChar))
73+ {
74+ }
75+
76+ ~VerifyPinCommandAPDU () { std::fill (d.begin (), d.end (), 0 ); }
77+ };
78+
5979inline void verifyPin (pcsc_cpp::SmartCard& card, pcsc_cpp::byte_type p2,
6080 pcsc_cpp::byte_vector&& pin, uint8_t pinMinLength, size_t paddingLength,
6181 pcsc_cpp::byte_type paddingChar)
6282{
6383 pcsc_cpp::ResponseApdu response;
6484
6585 if (card.readerHasPinPad ()) {
66- const pcsc_cpp::CommandApdu verifyPin {0x00 , 0x20 , 0x00 , p2,
67- addPaddingToPin ({}, paddingLength, paddingChar)};
86+ VerifyPinCommandAPDU verifyPin {p2, {}, paddingLength, paddingChar};
6887 response = card.transmitCTL (verifyPin, 0 , pinMinLength);
6988
7089 } else {
71- const pcsc_cpp::CommandApdu verifyPin {
72- 0x00 , 0x20 , 0x00 , p2, addPaddingToPin (std::move (pin), paddingLength, paddingChar)};
73-
90+ VerifyPinCommandAPDU verifyPin {p2, std::move (pin), paddingLength, paddingChar};
7491 response = card.transmit (verifyPin);
7592 }
7693
0 commit comments