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 HexUtil::toHex(terminalSessionSignature));
53 const uint8_t p1 = ratificationAsked ? 0x80 : 0x00;
60 std::make_shared<ApduRequestAdapter>(
62 std::dynamic_pointer_cast<CalypsoCardAdapter>(calypsoCard)
63 ->getCardClass().getValue(),
67 terminalSessionSignature,
76 std::make_shared<ApduRequestAdapter>(
78 std::dynamic_pointer_cast<CalypsoCardAdapter>(calypsoCard)
79 ->getCardClass().getValue(),
92 const std::shared_ptr<ApduResponseApi> apduResponse)
96 const std::vector<uint8_t> responseData =
getApduResponse()->getDataOut();
98 if (mCalypsoCard->isExtendedModeSupported()) {
100 if (responseData.size() == 8) {
102 mSignatureLo = Arrays::copyOfRange(responseData, 0, 8);
103 mPostponedData = std::vector<uint8_t>(0);
104 }
else if (responseData.size() == 12) {
106 mSignatureLo = Arrays::copyOfRange(responseData, 4, 12);
107 mPostponedData = Arrays::copyOfRange(responseData, 1, 4);
108 }
else if (responseData.size() == 15) {
110 mSignatureLo = Arrays::copyOfRange(responseData, 7, 15);
111 mPostponedData = Arrays::copyOfRange(responseData, 1, 7);
113 if (responseData.size() != 0) {
114 throw IllegalArgumentException(
"Unexpected length in response to CloseSecureSession " \
116 std::to_string(responseData.size()));
120 mSignatureLo = std::vector<uint8_t>(0);
121 mPostponedData = std::vector<uint8_t>(0);
125 if (responseData.size() == 4) {
127 mSignatureLo = Arrays::copyOfRange(responseData, 0, 4);
128 mPostponedData = std::vector<uint8_t>(0);
129 }
else if (responseData.size() == 8) {
131 mSignatureLo = Arrays::copyOfRange(responseData, 4, 8);
132 mPostponedData = Arrays::copyOfRange(responseData, 1, 4);
133 }
else if (responseData.size() == 11) {
135 mSignatureLo = Arrays::copyOfRange(responseData, 7, 11);
136 mPostponedData = Arrays::copyOfRange(responseData, 1, 7);
138 if (responseData.size() != 0) {
139 throw IllegalArgumentException(
"Unexpected length in response to CloseSecureSession " \
141 std::to_string(responseData.size()));
145 mSignatureLo = std::vector<uint8_t>(0);
146 mPostponedData = std::vector<uint8_t>(0);
160 return mPostponedData;
163const std::map<const int, const std::shared_ptr<StatusProperties>>
164 CmdCardCloseSession::initStatusTable()
166 std::map<const int, const std::shared_ptr<StatusProperties>> m =
170 std::make_shared<StatusProperties>(
"Lc signatureLo not supported (e.g. Lc=4 with a " \
171 "Revision 3.2 mode for Open Secure Session).",
174 std::make_shared<StatusProperties>(
"P1 or P2 signatureLo not supported.",
175 typeid(CardIllegalParameterException))});
177 std::make_shared<StatusProperties>(
"No session was opened.",
178 typeid(CardAccessForbiddenException))});
180 std::make_shared<StatusProperties>(
"incorrect signatureLo.",
181 typeid(CardSecurityDataException))});
186const 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