19#include "IllegalArgumentException.h"
20#include "IllegalStateException.h"
35using namespace keyple::core::util;
36using namespace keyple::core::util::cpp;
37using namespace keyple::core::util::cpp::exception;
40const std::map<const int, const std::shared_ptr<StatusProperties>>
41 CmdCardVerifyPin::STATUS_TABLE = initStatusTable();
45 const bool encryptPinTransmission,
46 const std::vector<uint8_t>& pin)
50 (!encryptPinTransmission && pin.size() != 4) ||
51 (encryptPinTransmission && pin.size() != 8)) {
52 throw IllegalArgumentException(
"The PIN must be 4 bytes long");
56 const uint8_t p1 = 0x00;
57 const uint8_t p2 = 0x00;
60 std::make_shared<ApduRequestAdapter>(
63 addSubName(encryptPinTransmission ?
"ENCRYPTED" :
"PLAIN");
65 mReadCounterOnly =
false;
71 const uint8_t p1 = 0x00;
72 const uint8_t p2 = 0x00;
75 std::make_shared<ApduRequestAdapter>(
80 mReadCounterOnly =
true;
90 return mReadCounterOnly;
111 std::stringstream ss;
112 ss << std::setfill (
'0') << std::setw(4) << std::hex <<
getApduResponse()->getStatusWord();
113 throw IllegalStateException(
"Incorrect status word: " + ss.str());
116 return attemptCounter;
119const std::map<const int, const std::shared_ptr<StatusProperties>>
120 CmdCardVerifyPin::initStatusTable()
122 std::map<const int, const std::shared_ptr<StatusProperties>> m =
126 std::make_shared<StatusProperties>(
"Lc value not supported (only 00h, 04h or 08h " \
130 std::make_shared<StatusProperties>(
"Transaction Counter is 0.",
131 typeid(CardTerminatedException))});
133 std::make_shared<StatusProperties>(
"Security conditions not fulfilled (Get " \
134 "Challenge not done: challenge unavailable).",
135 typeid(CardSecurityContextException))});
137 std::make_shared<StatusProperties>(
"Access forbidden (a session is open or DF is " \
139 typeid(CardAccessForbiddenException))});
141 std::make_shared<StatusProperties>(
"Incorrect PIN (1 attempt remaining).",
142 typeid(CardPinException))});
144 std::make_shared<StatusProperties>(
"Incorrect PIN (2 attempt remaining).",
145 typeid(CardPinException))});
147 std::make_shared<StatusProperties>(
"Presentation rejected (PIN is blocked).",
148 typeid(CardPinException))});
150 std::make_shared<StatusProperties>(
"PIN function not present.",
151 typeid(CardIllegalParameterException))});
156const std::map<const int, const std::shared_ptr<StatusProperties>>&
static const std::map< const int, const std::shared_ptr< StatusProperties > > STATUS_TABLE
virtual void addSubName(const std::string &subName) final
virtual const std::shared_ptr< ApduResponseApi > getApduResponse() const final
virtual void setApduRequest(const std::shared_ptr< ApduRequestAdapter > apduRequest) final
static const CalypsoCardCommand VERIFY_PIN
uint8_t getInstructionByte() const
int getRemainingAttemptCounter() const
const std::map< const int, const std::shared_ptr< StatusProperties > > & getStatusTable() const override
CmdCardVerifyPin(const CalypsoCardClass calypsoCardClass, const bool encryptPinTransmission, const std::vector< uint8_t > &pin)
bool isReadCounterOnly() const
bool isSessionBufferUsed() const override