27#include "ByteArrayUtil.h"
28#include "IllegalArgumentException.h"
29#include "IllegalStateException.h"
36using namespace keyple::core::util;
37using namespace keyple::core::util::cpp;
38using namespace keyple::core::util::cpp::exception;
40const int CmdCardSvReload::SW_POSTPONED_DATA = 0x6200;
43const std::map<const int, const std::shared_ptr<StatusProperties>>
44 CmdCardSvReload::STATUS_TABLE = initStatusTable();
48 const std::vector<uint8_t>& date,
49 const std::vector<uint8_t>& time,
50 const std::vector<uint8_t>& free,
51 const bool isSessionOpen,
52 const bool isExtendedModeAllowed)
55 mIsSessionOpen(isSessionOpen),
56 mIsExtendedModeAllowed(isExtendedModeAllowed)
58 if (amount < -8388608 || amount > 8388607) {
60 throw IllegalArgumentException(
"Amount is outside allowed boundaries (-8388608 <= amount " \
64 if (date.empty() || time.empty() || free.empty()) {
66 throw IllegalArgumentException(
"date, time and free cannot be null");
69 if (date.size() != 2 || time.size() != 2 || free.size() != 2) {
71 throw IllegalArgumentException(
"date, time and free must be 2-byte arrays");
78 mDataIn = std::vector<uint8_t>(18 + (isExtendedModeAllowed ? 10 : 5));
84 mDataIn[4] = calypsoCard->getSvKvc();
86 ByteArrayUtil::copyBytes(amount, mDataIn, 6, 3);
88 mDataIn[10] = time[1];
94 if ((mIsExtendedModeAllowed && reloadComplementaryData.size() != 20) ||
95 (!mIsExtendedModeAllowed && reloadComplementaryData.size() != 15)) {
96 throw IllegalArgumentException(
"Bad SV prepare load data length.");
101 if (mIsSessionOpen) {
104 if(mIsExtendedModeAllowed) {
113 const uint8_t p1 = reloadComplementaryData[4];
114 const uint8_t p2 = reloadComplementaryData[5];
116 mDataIn[0] = reloadComplementaryData[6];
117 System::arraycopy(reloadComplementaryData, 0, mDataIn, 11, 4);
118 System::arraycopy(reloadComplementaryData, 7, mDataIn, 15, 3);
119 System::arraycopy(reloadComplementaryData, 10, mDataIn, 18, reloadComplementaryData.size()-10);
125 std::shared_ptr<ApduRequestAdapter> apduRequest;
128 apduRequest = std::make_shared<ApduRequestAdapter>(
129 ApduUtil::build(cardClass,
136 apduRequest = std::make_shared<ApduRequestAdapter>(
137 ApduUtil::build(cardClass,
144 apduRequest->addSuccessfulStatusWord(SW_POSTPONED_DATA);
150 std::vector<uint8_t> svReloadData(15);
158 svReloadData[3] = mIsExtendedModeAllowed ? 0x1C : 0x17;
161 System::arraycopy(mDataIn, 0, svReloadData, 4, 11);
175 const std::vector<uint8_t> dataOut = apduResponse->getDataOut();
177 if (dataOut.size() != 0 && dataOut.size() != 3 && dataOut.size() != 6) {
179 throw IllegalStateException(
"Bad length in response to SV Reload command.");
182 getCalypsoCard()->setSvOperationSignature(apduResponse->getDataOut());
190const std::map<const int, const std::shared_ptr<StatusProperties>>
191 CmdCardSvReload::initStatusTable()
193 std::map<const int, const std::shared_ptr<StatusProperties>> m =
196 m.insert({SW_POSTPONED_DATA,
197 std::make_shared<StatusProperties>(
"Successful execution, response data postponed " \
198 "until session closing.",
201 std::make_shared<StatusProperties>(
"Too many modifications in session.",
202 typeid(CardSessionBufferOverflowException))});
204 std::make_shared<StatusProperties>(
"Lc value not supported.",
205 typeid(CardIllegalParameterException))});
207 std::make_shared<StatusProperties>(
"Transaction counter is 0 or SV TNum is FFFEh or" \
209 typeid(CalypsoSamCounterOverflowException))});
211 std::make_shared<StatusProperties>(
"Preconditions not satisfied.",
212 typeid(CalypsoSamAccessForbiddenException))});
214 std::make_shared<StatusProperties>(
"Incorrect signatureHi.",
215 typeid(CardSecurityDataException))});
220const 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
virtual void setExpectedResponseLength(const int expectedResponseLength) final
void parseApduResponse(const std::shared_ptr< ApduResponseApi > apduResponse) override
std::shared_ptr< CalypsoCardAdapter > getCalypsoCard() const
static const CalypsoCardClass LEGACY
static const CalypsoCardClass ISO
static const CalypsoCardClass LEGACY_STORED_VALUE
static const CalypsoCardCommand SV_RELOAD
uint8_t getInstructionByte() const
bool isSessionBufferUsed() const override
void parseApduResponse(const std::shared_ptr< ApduResponseApi > apduResponse) override
const std::vector< uint8_t > getSvReloadData() const
const std::vector< uint8_t > getSignatureLo() const
CmdCardSvReload(const std::shared_ptr< CalypsoCardAdapter > calypsoCard, const int amount, const std::vector< uint8_t > &date, const std::vector< uint8_t > &time, const std::vector< uint8_t > &free, const bool isSessionOpen, const bool isExtendedModeAllowed)
const std::map< const int, const std::shared_ptr< StatusProperties > > & getStatusTable() const override
void finalizeCommand(const std::vector< uint8_t > &reloadComplementaryData)