20#include "ByteArrayUtil.h"
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) {
49 throw IllegalArgumentException(
"Invalid terminal sessionSignature: " +
50 ByteArrayUtil::toHex(terminalSessionSignature));
53 const uint8_t p1 = ratificationAsked ? 0x80 : 0x00;
62 std::make_shared<ApduRequestAdapter>(
64 std::dynamic_pointer_cast<CalypsoCardAdapter>(calypsoCard)
65 ->getCardClass().getValue(),
69 terminalSessionSignature,
78 std::make_shared<ApduRequestAdapter>(
80 std::dynamic_pointer_cast<CalypsoCardAdapter>(calypsoCard)
81 ->getCardClass().getValue(),
94 const std::shared_ptr<ApduResponseApi> apduResponse)
98 const std::vector<uint8_t> responseData =
getApduResponse()->getDataOut();
100 if (mCalypsoCard->isExtendedModeSupported()) {
102 if (responseData.size() == 8) {
104 mSignatureLo = Arrays::copyOfRange(responseData, 0, 8);
105 mPostponedData = std::vector<uint8_t>(0);
106 }
else if (responseData.size() == 12) {
108 mSignatureLo = Arrays::copyOfRange(responseData, 4, 12);
109 mPostponedData = Arrays::copyOfRange(responseData, 1, 4);
110 }
else if (responseData.size() == 15) {
112 mSignatureLo = Arrays::copyOfRange(responseData, 7, 15);
113 mPostponedData = Arrays::copyOfRange(responseData, 1, 7);
115 if (responseData.size() != 0) {
116 throw IllegalArgumentException(
"Unexpected length in response to CloseSecureSession " \
118 std::to_string(responseData.size()));
122 mSignatureLo = std::vector<uint8_t>(0);
123 mPostponedData = std::vector<uint8_t>(0);
127 if (responseData.size() == 4) {
129 mSignatureLo = Arrays::copyOfRange(responseData, 0, 4);
130 mPostponedData = std::vector<uint8_t>(0);
131 }
else if (responseData.size() == 8) {
133 mSignatureLo = Arrays::copyOfRange(responseData, 4, 8);
134 mPostponedData = Arrays::copyOfRange(responseData, 1, 4);
135 }
else if (responseData.size() == 11) {
137 mSignatureLo = Arrays::copyOfRange(responseData, 7, 11);
138 mPostponedData = Arrays::copyOfRange(responseData, 1, 7);
140 if (responseData.size() != 0) {
141 throw IllegalArgumentException(
"Unexpected length in response to CloseSecureSession " \
143 std::to_string(responseData.size()));
147 mSignatureLo = std::vector<uint8_t>(0);
148 mPostponedData = std::vector<uint8_t>(0);
162 return mPostponedData;
165const std::map<const int, const std::shared_ptr<StatusProperties>>
166 CmdCardCloseSession::initStatusTable()
168 std::map<const int, const std::shared_ptr<StatusProperties>> m =
172 std::make_shared<StatusProperties>(
"Lc signatureLo not supported (e.g. Lc=4 with a " \
173 "Revision 3.2 mode for Open Secure Session).",
176 std::make_shared<StatusProperties>(
"P1 or P2 signatureLo not supported.",
177 typeid(CardIllegalParameterException))});
179 std::make_shared<StatusProperties>(
"incorrect signatureLo.",
180 typeid(CardSecurityDataException))});
182 std::make_shared<StatusProperties>(
"No session was opened.",
183 typeid(CardAccessForbiddenException))});
188const 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 CalypsoCardCommand CLOSE_SESSION
uint8_t getInstructionByte() const
const std::vector< uint8_t > & getSignatureLo() const
bool isSessionBufferUsed() const override
const std::map< const int, const std::shared_ptr< StatusProperties > > & getStatusTable() const override
CmdCardCloseSession(const std::shared_ptr< CalypsoCard > calypsoCard, const bool ratificationAsked, const std::vector< uint8_t > terminalSessionSignature)
CmdCardCloseSession & setApduResponse(const std::shared_ptr< ApduResponseApi > apduResponse) override
const std::vector< uint8_t > & getPostponedData() const