25#include "BerTlvUtil.h"
26#include "ByteArrayUtil.h"
28#include "IllegalStateException.h"
29#include "KeypleAssert.h"
30#include "StringUtils.h"
37using namespace calypsonet::terminal::calypso;
38using namespace keyple::core::util;
39using namespace keyple::core::util::cpp::exception;
41const int CmdCardSelectFile::TAG_PROPRIETARY_INFORMATION = 0x85;
43const std::map<const int, const std::shared_ptr<StatusProperties>>
44 CmdCardSelectFile::STATUS_TABLE = initStatusTable();
47 const SelectFileControl selectFileControl)
50 buildCommand(calypsoCard->getCardClass(), selectFileControl);
54 const SelectFileControl selectFileControl)
57 buildCommand(calypsoCardClass, selectFileControl);
64 buildCommand(calypsoCard->getCardClass(), calypsoCard->getProductType(), lid);
72 buildCommand(calypsoCardClass, productType, lid);
76 const SelectFileControl selectFileControl)
78 const uint8_t cla = calypsoCardClass.
getValue();
81 const std::vector<uint8_t> selectData = {0x00, 0x00};
83 switch (selectFileControl) {
85 case SelectFileControl::FIRST_EF:
90 case SelectFileControl::NEXT_EF:
95 case SelectFileControl::CURRENT_DF:
102 throw IllegalStateException(
"Unsupported selectFileControl parameter " \
103 "FIXME: selectFileControl.name()");
108 std::make_shared<ApduRequestAdapter>(
112 addSubName(
"SELECTIONCONTROL FIXME: selectFileControl");
115void CmdCardSelectFile::buildCommand(
const CalypsoCardClass calypsoCardClass,
127 productType == CalypsoCard::ProductType::PRIME_REVISION_2) {
140 const std::vector<uint8_t> dataIn = ByteArrayUtil::extractBytes(lid, 2);
143 std::make_shared<ApduRequestAdapter>(
144 ApduUtil::build(calypsoCardClass.getValue(),
162 const std::vector<uint8_t>& dataOut,
163 const std::shared_ptr<CalypsoCardAdapter> calypsoCard)
172 std::shared_ptr<DirectoryHeader> directoryHeader =
173 createDirectoryHeader(proprietaryInformation, calypsoCard);
174 calypsoCard->setDirectoryHeader(directoryHeader);
178 std::shared_ptr<FileHeaderAdapter> fileHeader =
179 createFileHeader(proprietaryInformation, calypsoCard);
180 calypsoCard->setFileHeader(sfi, fileHeader);
184 throw IllegalStateException(StringUtils::format(
"Unknown file type: %02Xh", fileType));
194 const std::vector<uint8_t>& dataOut)
196 std::vector<uint8_t> proprietaryInformation;
197 const std::map<const int, const std::vector<uint8_t>> tags =
198 BerTlvUtil::parseSimple(dataOut,
true);
200 const auto& it = tags.find(TAG_PROPRIETARY_INFORMATION);
202 if (it == tags.end()) {
204 throw IllegalStateException(
"Proprietary information: tag not found.");
207 proprietaryInformation = it->second;
209 Assert::getInstance().isEqual(proprietaryInformation.size(), 23,
"proprietaryInformation");
211 return proprietaryInformation;
214const std::shared_ptr<DirectoryHeader> CmdCardSelectFile::createDirectoryHeader(
215 const std::vector<uint8_t>& proprietaryInformation,
216 const std::shared_ptr<CalypsoCardAdapter> calypsoCard)
220 System::arraycopy(proprietaryInformation,
227 System::arraycopy(proprietaryInformation,
235 const int lidOffset =
236 calypsoCard->getProductType() == CalypsoCard::ProductType::PRIME_REVISION_2 ?
239 const uint8_t lid = ByteArrayUtil::extractShort(proprietaryInformation, lidOffset);
243 .accessConditions(accessConditions)
244 .keyIndexes(keyIndexes)
246 .kvc(WriteAccessLevel::PERSONALIZATION,
248 .kvc(WriteAccessLevel::LOAD,
250 .kvc(WriteAccessLevel::DEBIT,
252 .kif(WriteAccessLevel::PERSONALIZATION,
254 .kif(WriteAccessLevel::LOAD,
256 .kif(WriteAccessLevel::DEBIT,
261const std::shared_ptr<FileHeaderAdapter> CmdCardSelectFile::createFileHeader(
262 const std::vector<uint8_t>& proprietaryInformation,
263 const std::shared_ptr<CalypsoCardAdapter> calypsoCard)
265 const ElementaryFile::Type fileType =
271 if (fileType == ElementaryFile::Type::BINARY) {
273 recordSize = ByteArrayUtil::extractInt(proprietaryInformation,
286 System::arraycopy(proprietaryInformation,
293 System::arraycopy(proprietaryInformation,
301 const uint16_t sharedReference =
302 ByteArrayUtil::extractShort(proprietaryInformation,
305 const int lidOffset =
306 calypsoCard->getProductType() == CalypsoCard::ProductType::PRIME_REVISION_2 ?
309 const uint16_t lid = ByteArrayUtil::extractShort(proprietaryInformation, lidOffset);
313 .recordsNumber(recordsNumber)
314 .recordSize(recordSize)
316 .accessConditions(Arrays::copyOf(accessConditions, accessConditions.size()))
317 .keyIndexes(Arrays::copyOf(keyIndexes, keyIndexes.size()))
319 .sharedReference(sharedReference)
323ElementaryFile::Type CmdCardSelectFile::getEfTypeFromCardValue(
const uint8_t efType)
327 return ElementaryFile::Type::BINARY;
331 return ElementaryFile::Type::LINEAR;
335 return ElementaryFile::Type::CYCLIC;
339 return ElementaryFile::Type::SIMULATED_COUNTERS;
343 return ElementaryFile::Type::COUNTERS;
347 throw IllegalStateException(
"Unknown EF Type: " + std::to_string(efType));
351const std::map<const int, const std::shared_ptr<StatusProperties>>
352 CmdCardSelectFile::initStatusTable()
354 std::map<const int, const std::shared_ptr<StatusProperties>> m =
358 std::make_shared<StatusProperties>(
"Lc value not supported.",
359 typeid(CardIllegalParameterException))});
361 std::make_shared<StatusProperties>(
"File not found.",
362 typeid(CardDataAccessException))});
364 std::make_shared<StatusProperties>(
"Correct execution (ISO7816 T=0).",
370const std::map<const int, const std::shared_ptr<StatusProperties>>&
static const std::map< const int, const std::shared_ptr< StatusProperties > > STATUS_TABLE
virtual void addSubName(const std::string &subName) 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 CalypsoCardClass LEGACY
static const CalypsoCardCommand SELECT_FILE
uint8_t getInstructionByte() const
static const int SEL_DF_STATUS_OFFSET
static const int EF_TYPE_CYCLIC
static const int SEL_DATA_REF_OFFSET
static const int SEL_TYPE_OFFSET
static const int SEL_REC_SIZE_OFFSET
static const int SEL_EF_TYPE_OFFSET
static const int FILE_TYPE_EF
static const int SEL_NKEY_LENGTH
static const int SEL_KVCS_OFFSET
static const int FILE_TYPE_MF
static const int SEL_NUM_REC_OFFSET
static const int SEL_LID_OFFSET_REV2
static const int EF_TYPE_LINEAR
static const int SEL_SFI_OFFSET
static const int EF_TYPE_SIMULATED_COUNTERS
static const int FILE_TYPE_DF
static const int SEL_AC_LENGTH
static const int SEL_LID_OFFSET
static const int SEL_KIFS_OFFSET
static const int SEL_AC_OFFSET
static const int EF_TYPE_BINARY
static const int EF_TYPE_COUNTERS
static const int SEL_NKEY_OFFSET
CmdCardSelectFile(const std::shared_ptr< CalypsoCardAdapter > calypsoCard, const SelectFileControl selectFileControl)
const std::map< const int, const std::shared_ptr< StatusProperties > > & getStatusTable() const override
static void parseProprietaryInformation(const std::vector< uint8_t > &dataOut, const std::shared_ptr< CalypsoCardAdapter > calypsoCard)
static const std::vector< uint8_t > getProprietaryInformation(const std::vector< uint8_t > &dataOut)
void parseApduResponse(const std::shared_ptr< ApduResponseApi > apduResponse) override
bool isSessionBufferUsed() const override
CalypsoSam::ProductType ProductType