diff --git a/lib/libpcsc-cpp/include/pcsc-cpp/pcsc-cpp.hpp b/lib/libpcsc-cpp/include/pcsc-cpp/pcsc-cpp.hpp index 0e226ce..fa6f4af 100644 --- a/lib/libpcsc-cpp/include/pcsc-cpp/pcsc-cpp.hpp +++ b/lib/libpcsc-cpp/include/pcsc-cpp/pcsc-cpp.hpp @@ -180,6 +180,8 @@ struct CommandApdu constexpr operator const byte_vector&() const { return d; } + virtual ~CommandApdu() = default; + /** * A helper function to create a SELECT command APDU. * diff --git a/src/electronic-ids/pcsc/pcsc-common.hpp b/src/electronic-ids/pcsc/pcsc-common.hpp index 3b4342e..416fa17 100644 --- a/src/electronic-ids/pcsc/pcsc-common.hpp +++ b/src/electronic-ids/pcsc/pcsc-common.hpp @@ -56,6 +56,26 @@ addPaddingToPin(pcsc_cpp::byte_vector&& pin, size_t paddingLength, pcsc_cpp::byt return std::move(pin); } +struct VerifyPinCommandAPDU : public pcsc_cpp::CommandApdu +{ +public: + // Make it move-only + VerifyPinCommandAPDU(const VerifyPinCommandAPDU&) = delete; + VerifyPinCommandAPDU& operator=(const VerifyPinCommandAPDU&) = delete; + + VerifyPinCommandAPDU(VerifyPinCommandAPDU&&) noexcept = default; + VerifyPinCommandAPDU& operator=(VerifyPinCommandAPDU&&) noexcept = default; + + VerifyPinCommandAPDU(pcsc_cpp::byte_type p2, pcsc_cpp::byte_vector&& pin, size_t paddingLength, + pcsc_cpp::byte_type paddingChar) : + CommandApdu(0x00, 0x20, 0x00, p2, + addPaddingToPin(std::move(pin), paddingLength, paddingChar)) + { + } + + ~VerifyPinCommandAPDU() { std::fill(d.begin(), d.end(), 0); } +}; + inline void verifyPin(pcsc_cpp::SmartCard& card, pcsc_cpp::byte_type p2, pcsc_cpp::byte_vector&& pin, uint8_t pinMinLength, size_t paddingLength, pcsc_cpp::byte_type paddingChar) @@ -63,14 +83,11 @@ inline void verifyPin(pcsc_cpp::SmartCard& card, pcsc_cpp::byte_type p2, pcsc_cpp::ResponseApdu response; if (card.readerHasPinPad()) { - const pcsc_cpp::CommandApdu verifyPin {0x00, 0x20, 0x00, p2, - addPaddingToPin({}, paddingLength, paddingChar)}; + VerifyPinCommandAPDU verifyPin {p2, {}, paddingLength, paddingChar}; response = card.transmitCTL(verifyPin, 0, pinMinLength); } else { - const pcsc_cpp::CommandApdu verifyPin { - 0x00, 0x20, 0x00, p2, addPaddingToPin(std::move(pin), paddingLength, paddingChar)}; - + VerifyPinCommandAPDU verifyPin {p2, std::move(pin), paddingLength, paddingChar}; response = card.transmit(verifyPin); }