@@ -50,21 +50,38 @@ inline pcsc_cpp::byte_vector addPaddingToPin(pcsc_cpp::byte_vector&& pin, size_t
5050 return std::move (pin);
5151}
5252
53+ struct VerifyPinCommandAPDU : public pcsc_cpp ::CommandApdu
54+ {
55+ public:
56+ // Make it move-only
57+ VerifyPinCommandAPDU (const VerifyPinCommandAPDU&) = delete ;
58+ VerifyPinCommandAPDU& operator =(const VerifyPinCommandAPDU&) = delete ;
59+
60+ VerifyPinCommandAPDU (VerifyPinCommandAPDU&&) noexcept = default ;
61+ VerifyPinCommandAPDU& operator =(VerifyPinCommandAPDU&&) noexcept = default ;
62+
63+ VerifyPinCommandAPDU (pcsc_cpp::byte_type p2, pcsc_cpp::byte_vector&& pin, size_t paddingLength,
64+ pcsc_cpp::byte_type paddingChar) :
65+ CommandApdu (0x00 , 0x20 , 0x00 , p2,
66+ addPaddingToPin (std::move(pin), paddingLength, paddingChar))
67+ {
68+ }
69+
70+ ~VerifyPinCommandAPDU () { std::fill (d.begin (), d.end (), 0 ); }
71+ };
72+
5373inline void verifyPin (pcsc_cpp::SmartCard& card, pcsc_cpp::byte_type p2,
5474 pcsc_cpp::byte_vector&& pin, uint8_t pinMinLength, size_t paddingLength,
5575 pcsc_cpp::byte_type paddingChar)
5676{
5777 pcsc_cpp::ResponseApdu response;
5878
5979 if (card.readerHasPinPad ()) {
60- const pcsc_cpp::CommandApdu verifyPin {0x00 , 0x20 , 0x00 , p2,
61- addPaddingToPin ({}, paddingLength, paddingChar)};
80+ VerifyPinCommandAPDU verifyPin {p2, {}, paddingLength, paddingChar};
6281 response = card.transmitCTL (verifyPin, 0 , pinMinLength);
6382
6483 } else {
65- const pcsc_cpp::CommandApdu verifyPin {
66- 0x00 , 0x20 , 0x00 , p2, addPaddingToPin (std::move (pin), paddingLength, paddingChar)};
67-
84+ VerifyPinCommandAPDU verifyPin {p2, std::move (pin), paddingLength, paddingChar};
6885 response = card.transmit (verifyPin);
6986 }
7087
0 commit comments