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;
41const std::map<const int, const std::shared_ptr<StatusProperties>>
42 CmdCardSvUndebit::STATUS_TABLE = initStatusTable();
47 const std::vector<uint8_t>& date,
48 const std::vector<uint8_t>& time)
55 if (amount < 0 || amount > 32767) {
56 throw IllegalArgumentException(
"Amount is outside allowed boundaries (0 <= amount <= " \
60 if (date.empty() || time.empty()) {
61 throw IllegalArgumentException(
"date and time cannot be null");
64 if (date.size() != 2 || time.size() != 2) {
65 throw IllegalArgumentException(
"date and time must be 2-byte arrays");
69 mCalypsoCard = calypsoCard;
75 mDataIn = std::vector<uint8_t>(15 + (mCalypsoCard->isExtendedModeSupported() ? 10 : 5));
78 const short amountShort =
static_cast<short>(amount);
79 mDataIn[1] = ((amountShort >> 8) & 0xFF);
80 mDataIn[2] = (amountShort & 0xFF);
91 if ((mCalypsoCard->isExtendedModeSupported() && undebitComplementaryData.size() != 20) ||
92 (!mCalypsoCard->isExtendedModeSupported() && undebitComplementaryData.size() != 15)) {
93 throw IllegalArgumentException(
"Bad SV prepare load data length.");
96 const uint8_t p1 = undebitComplementaryData[4];
97 const uint8_t p2 = undebitComplementaryData[5];
99 mDataIn[0] = undebitComplementaryData[6];
100 System::arraycopy(undebitComplementaryData, 0, mDataIn, 8, 4);
101 System::arraycopy(undebitComplementaryData, 7, mDataIn, 12, 3);
102 System::arraycopy(undebitComplementaryData,
106 undebitComplementaryData.size() - 10);
108 const auto adapter = std::dynamic_pointer_cast<CalypsoCardAdapter>(mCalypsoCard);
114 std::make_shared<ApduRequestAdapter>(
115 ApduUtil::build(cardClass,
124 std::vector<uint8_t> svUndebitData(12);
132 svUndebitData[3] = mCalypsoCard->isExtendedModeSupported() ? 0x19 : 0x14;
135 System::arraycopy(mDataIn, 0, svUndebitData, 4, 8);
137 return svUndebitData;
146 const std::shared_ptr<ApduResponseApi> apduResponse)
150 const std::vector<uint8_t> dataOut = apduResponse->getDataOut();
151 if (dataOut.size() != 0 && dataOut.size() != 3 && dataOut.size() != 6) {
152 throw IllegalStateException(
"Bad length in response to SV Reload command.");
163const std::map<const int, const std::shared_ptr<StatusProperties>>
164 CmdCardSvUndebit::initStatusTable()
166 std::map<const int, const std::shared_ptr<StatusProperties>> m =
170 std::make_shared<StatusProperties>(
"Too many modifications in session.",
173 std::make_shared<StatusProperties>(
"Lc value not supported.",
174 typeid(CardIllegalParameterException))});
176 std::make_shared<StatusProperties>(
"Transaction counter is 0 or SV TNum is FFFEh or" \
178 typeid(CalypsoSamCounterOverflowException))});
180 std::make_shared<StatusProperties>(
"Preconditions not satisfied.",
181 typeid(CalypsoSamAccessForbiddenException))});
183 std::make_shared<StatusProperties>(
"Incorrect signatureHi.",
184 typeid(CardSecurityDataException))});
186 std::make_shared<StatusProperties>(
"Successful execution, response data postponed " \
187 "until session closing.",
193const 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
AbstractCardCommand & setApduResponse(const std::shared_ptr< ApduResponseApi > apduResponse) override
static const CalypsoCardClass LEGACY
static const CalypsoCardClass ISO
static const CalypsoCardClass LEGACY_STORED_VALUE
static const CalypsoCardCommand SV_UNDEBIT
uint8_t getInstructionByte() const
void finalizeCommand(const std::vector< uint8_t > &undebitComplementaryData)
CmdCardSvUndebit & setApduResponse(const std::shared_ptr< ApduResponseApi > apduResponse) override
const std::vector< uint8_t > getSvUndebitData() const
CmdCardSvUndebit(const std::shared_ptr< CalypsoCard > calypsoCard, const int amount, const uint8_t kvc, const std::vector< uint8_t > &date, const std::vector< uint8_t > &time)
const std::map< const int, const std::shared_ptr< StatusProperties > > & getStatusTable() const override
const std::vector< uint8_t > getSignatureLo() const
bool isSessionBufferUsed() const override