21#include "IllegalArgumentException.h"
33using namespace keyple::core::util;
34using namespace keyple::core::util::cpp;
37const std::map<const int, const std::shared_ptr<StatusProperties>>
38 CmdCardCloseSession::STATUS_TABLE = initStatusTable();
41 const bool ratificationAsked,
42 const std::vector<uint8_t> terminalSessionSignature)
46 if (!terminalSessionSignature.empty() &&
47 terminalSessionSignature.size() != 4 &&
48 terminalSessionSignature.size() != 8) {
50 throw IllegalArgumentException(
"Invalid terminal sessionSignature: " +
51 HexUtil::toHex(terminalSessionSignature));
54 const uint8_t p1 = ratificationAsked ? 0x80 : 0x00;
61 std::make_shared<ApduRequestAdapter>(
62 ApduUtil::build(calypsoCard->getCardClass().getValue(),
66 terminalSessionSignature,
76 std::make_shared<ApduRequestAdapter>(
77 ApduUtil::build(calypsoCard->getCardClass().getValue(),
93 const std::vector<uint8_t> responseData =
getApduResponse()->getDataOut();
95 if (responseData.size() > 0) {
97 int signatureLength =
getCalypsoCard()->isExtendedModeSupported() ? 8 : 4;
100 while (i <
static_cast<int>(responseData.size() - signatureLength)) {
102 const std::vector<uint8_t> data =
103 Arrays::copyOfRange(responseData, i + 1, i + responseData[i]);
104 mPostponedData.push_back(data);
105 i += responseData[i];
108 mSignatureLo = Arrays::copyOfRange(responseData, i, responseData.size());
113 mSignatureLo = std::vector<uint8_t>(0);
124 return mPostponedData;
127const std::map<const int, const std::shared_ptr<StatusProperties>>
128 CmdCardCloseSession::initStatusTable()
130 std::map<const int, const std::shared_ptr<StatusProperties>> m =
134 std::make_shared<StatusProperties>(
"Lc signatureLo not supported (e.g. Lc=4 with a " \
135 "Revision 3.2 mode for Open Secure Session).",
138 std::make_shared<StatusProperties>(
"P1 or P2 signatureLo not supported.",
139 typeid(CardIllegalParameterException))});
141 std::make_shared<StatusProperties>(
"No session was opened.",
142 typeid(CardAccessForbiddenException))});
144 std::make_shared<StatusProperties>(
"incorrect signatureLo.",
145 typeid(CardSecurityDataException))});
150const 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
void parseApduResponse(const std::shared_ptr< ApduResponseApi > apduResponse) override
std::shared_ptr< CalypsoCardAdapter > getCalypsoCard() const
static const CalypsoCardCommand CLOSE_SESSION
uint8_t getInstructionByte() const
void parseApduResponse(const std::shared_ptr< ApduResponseApi > apduResponse) override
const std::vector< uint8_t > & getSignatureLo() const
const std::vector< std::vector< uint8_t > > & getPostponedData() const
CmdCardCloseSession(const std::shared_ptr< CalypsoCardAdapter > calypsoCard, const bool ratificationAsked, const std::vector< uint8_t > terminalSessionSignature)
bool isSessionBufferUsed() const override
const std::map< const int, const std::shared_ptr< StatusProperties > > & getStatusTable() const override