27#include "IllegalArgumentException.h"
28#include "IllegalStateException.h"
35using namespace keyple::core::util;
36using namespace keyple::core::util::cpp;
37using namespace keyple::core::util::cpp::exception;
39const int CmdCardSvDebitOrUndebit::SV_POSTPONED_DATA_IN_SESSION = 0x6200;
40const std::map<const int, const std::shared_ptr<StatusProperties>>
41 CmdCardSvDebitOrUndebit::STATUS_TABLE = initStatusTable();
47 const std::vector<uint8_t>& date,
48 const std::vector<uint8_t>& time,
49 const bool isExtendedModeAllowed)
54 mCalypsoCardClass(calypsoCardClass),
55 mIsExtendedModeAllowed(isExtendedModeAllowed)
61 if (amount < 0 || amount > 32767) {
62 throw IllegalArgumentException(
"Amount is outside allowed boundaries (0 <= amount <= " \
66 if (date.empty() || time.empty()) {
67 throw IllegalArgumentException(
"date and time cannot be null");
70 if (date.size() != 2 || time.size() != 2) {
71 throw IllegalArgumentException(
"date and time must be 2-byte arrays");
78 mDataIn = std::vector<uint8_t>(15 + (isExtendedModeAllowed ? 10 : 5));
81 const short amountShort =
82 isDebitCommand ?
static_cast<short>(-amount) :
static_cast<short>(amount);
83 mDataIn[1] = ((amountShort >> 8) & 0xFF);
84 mDataIn[2] = (amountShort & 0xFF);
94 const std::vector<uint8_t>& debitOrUndebitComplementaryData)
96 if ((mIsExtendedModeAllowed && debitOrUndebitComplementaryData.size() != 20) ||
97 (!mIsExtendedModeAllowed && debitOrUndebitComplementaryData.size() != 15)) {
98 throw IllegalArgumentException(
"Bad SV prepare load data length.");
101 const uint8_t p1 = debitOrUndebitComplementaryData[4];
102 const uint8_t p2 = debitOrUndebitComplementaryData[5];
104 mDataIn[0] = debitOrUndebitComplementaryData[6];
105 System::arraycopy(debitOrUndebitComplementaryData, 0, mDataIn, 8, 4);
106 System::arraycopy(debitOrUndebitComplementaryData, 7, mDataIn, 12, 3);
107 System::arraycopy(debitOrUndebitComplementaryData,
111 debitOrUndebitComplementaryData.size() - 10);
117 auto apduRequest = std::make_shared<ApduRequestAdapter>(
118 ApduUtil::build(cardClass,
123 apduRequest->addSuccessfulStatusWord(SV_POSTPONED_DATA_IN_SESSION);
129 std::vector<uint8_t> svDebitOrUndebitData(12);
137 svDebitOrUndebitData[3] = mIsExtendedModeAllowed ? 0x19 : 0x14;
140 System::arraycopy(mDataIn, 0, svDebitOrUndebitData, 4, 8);
142 return svDebitOrUndebitData;
151 const std::shared_ptr<ApduResponseApi> apduResponse)
155 const std::vector<uint8_t> dataOut = apduResponse->getDataOut();
156 if (dataOut.size() != 0 && dataOut.size() != 3 && dataOut.size() != 6) {
157 throw IllegalStateException(
"Bad length in response to SV Debit/Undebit command.");
168const std::map<const int, const std::shared_ptr<StatusProperties>>
169 CmdCardSvDebitOrUndebit::initStatusTable()
171 std::map<const int, const std::shared_ptr<StatusProperties>> m =
174 m.insert({SV_POSTPONED_DATA_IN_SESSION,
175 std::make_shared<StatusProperties>(
"Successful execution, response data postponed " \
176 "until session closing.",
179 std::make_shared<StatusProperties>(
"Too many modifications in session.",
180 typeid(CardSessionBufferOverflowException))});
182 std::make_shared<StatusProperties>(
"Lc value not supported.",
183 typeid(CardIllegalParameterException))});
185 std::make_shared<StatusProperties>(
"Transaction counter is 0 or SV TNum is FFFEh or" \
187 typeid(CalypsoSamCounterOverflowException))});
189 std::make_shared<StatusProperties>(
"Preconditions not satisfied.",
190 typeid(CalypsoSamAccessForbiddenException))});
192 std::make_shared<StatusProperties>(
"Incorrect signatureHi.",
193 typeid(CardSecurityDataException))});
198const std::map<const int, const std::shared_ptr<StatusProperties>>&
static const std::map< const int, const std::shared_ptr< StatusProperties > > STATUS_TABLE
virtual const std::shared_ptr< ApduResponseApi > getApduResponse() const final
virtual void setApduRequest(const std::shared_ptr< ApduRequestAdapter > apduRequest) final
const CalypsoCardCommand & getCommandRef() const override
AbstractCardCommand & setApduResponse(const std::shared_ptr< ApduResponseApi > apduResponse) override
static const CalypsoCardClass LEGACY
static const CalypsoCardClass ISO
static const CalypsoCardClass LEGACY_STORED_VALUE
uint8_t getInstructionByte() const
const std::vector< uint8_t > getSvDebitOrUndebitData() const
void finalizeCommand(const std::vector< uint8_t > &debitOrUndebitComplementaryData)
const std::vector< uint8_t > getSignatureLo() const
const std::map< const int, const std::shared_ptr< StatusProperties > > & getStatusTable() const override
bool isSessionBufferUsed() const override
CmdCardSvDebitOrUndebit & setApduResponse(const std::shared_ptr< ApduResponseApi > apduResponse) override
CmdCardSvDebitOrUndebit(const bool isDebitCommand, const CalypsoCardClass calypsoCardClass, const int amount, const uint8_t kvc, const std::vector< uint8_t > &date, const std::vector< uint8_t > &time, const bool isExtendedModeAllowed)