16#include "ParseException.h"
30#include "UnsupportedOperationException.h"
36#include "ByteArrayUtil.h"
38#include "IllegalArgumentException.h"
39#include "KeypleAssert.h"
41#include "PatternSyntaxException.h"
47using namespace calypsonet::terminal::card::spi;
48using namespace keyple::core::util;
49using namespace keyple::core::util::cpp;
50using namespace keyple::core::util::cpp::exception;
52const int CalypsoCardSelectionAdapter::AID_MIN_LENGTH = 5;
53const int CalypsoCardSelectionAdapter::AID_MAX_LENGTH = 16;
54const int CalypsoCardSelectionAdapter::SW_CARD_INVALIDATED = 0x6283;
60 const std::string& cardProtocol)
62 Assert::getInstance().notEmpty(cardProtocol,
"cardProtocol");
64 mCardSelector->filterByCardProtocol(cardProtocol);
70 const std::string& powerOnDataRegex)
72 Assert::getInstance().notEmpty(powerOnDataRegex,
"powerOnDataRegex");
75 Pattern::compile(powerOnDataRegex);
76 }
catch (
const PatternSyntaxException& exception) {
78 throw IllegalArgumentException(
"Invalid regular expression: '" +
83 mCardSelector->filterByPowerOnData(powerOnDataRegex);
90 Assert::getInstance().notEmpty(aid,
"aid")
91 .isInRange(aid.size(), AID_MIN_LENGTH, AID_MAX_LENGTH,
"aid");
93 mCardSelector->filterByDfName(aid);
100 Assert::getInstance().isHexString(aid,
"aid format");
110 switch (fileOccurrence) {
111 case FileOccurrence::FIRST:
112 mCardSelector->setFileOccurrence(CardSelectorSpi::FileOccurrence::FIRST);
114 case FileOccurrence::LAST:
115 mCardSelector->setFileOccurrence(CardSelectorSpi::FileOccurrence::LAST);
117 case FileOccurrence::NEXT:
118 mCardSelector->setFileOccurrence(CardSelectorSpi::FileOccurrence::NEXT);
120 case FileOccurrence::PREVIOUS:
121 mCardSelector->setFileOccurrence(CardSelectorSpi::FileOccurrence::PREVIOUS);
131 if (fileControlInformation == FileControlInformation::FCI) {
132 mCardSelector->setFileControlInformation(CardSelectorSpi::FileControlInformation::FCI);
133 }
else if (fileControlInformation == FileControlInformation::NO_RESPONSE) {
134 mCardSelector->setFileControlInformation(
135 CardSelectorSpi::FileControlInformation::NO_RESPONSE);
143 Assert::getInstance().isInRange(statusWord, 0, 0xFFFF,
"statusWord");
145 mCardSelector->addSuccessfulStatusWord(statusWord);
152 mCardSelector->addSuccessfulStatusWord(SW_CARD_INVALIDATED);
158 const uint8_t sfi,
const uint8_t recordNumber)
164 const uint8_t recordNumber)
166 Assert::getInstance().isInRange(sfi,
170 .isInRange(recordNumber,
180 static_cast<uint8_t
>(0)));
189 case GetDataTag::FCI_FOR_CURRENT_DF:
192 case GetDataTag::FCP_FOR_CURRENT_FILE:
195 case GetDataTag::EF_LIST:
198 case GetDataTag::TRACEABILITY_INFORMATION:
203 throw UnsupportedOperationException(
"Unsupported Get Data tag: ");
210 const std::vector<uint8_t>& lid)
212 Assert::getInstance().isEqual(lid.size(), 2,
"lid length");
214 return prepareSelectFile(
static_cast<uint16_t
>(ByteArrayUtil::extractInt(lid, 0, 2,
false)));
221 CalypsoCard::ProductType::PRIME_REVISION_3, lid));
227 const SelectFileControl selectControl)
234const std::shared_ptr<CardSelectionRequestSpi>
237 std::vector<std::shared_ptr<ApduRequestSpi>> cardSelectionApduRequests;
239 if (!mCommands.empty()) {
240 for (
const auto& command : mCommands) {
241 cardSelectionApduRequests.push_back(command->getApduRequest());
244 return std::make_shared<CardSelectionRequestAdapter>(
246 std::make_shared<CardRequestAdapter>(cardSelectionApduRequests,
false));
248 return std::make_shared<CardSelectionRequestAdapter>(mCardSelector,
nullptr);
253 const std::shared_ptr<CardSelectionResponseApi> cardSelectionResponse)
255 const std::shared_ptr<CardResponseApi> cardResponse = cardSelectionResponse->getCardResponse();
256 std::vector<std::shared_ptr<ApduResponseApi>> apduResponses;
258 if (cardResponse !=
nullptr) {
259 apduResponses = cardResponse->getApduResponses();
264 if (mCommands.size() != apduResponses.size()) {
265 throw ParseException(
"Mismatch in the number of requests/responses.");
268 std::shared_ptr<CalypsoCardAdapter> calypsoCard;
270 calypsoCard = std::make_shared<CalypsoCardAdapter>();
271 if (cardSelectionResponse->getSelectApplicationResponse() !=
nullptr) {
272 calypsoCard->initializeWithFci(cardSelectionResponse->getSelectApplicationResponse());
273 }
else if (cardSelectionResponse->getPowerOnData() !=
"") {
274 calypsoCard->initializeWithPowerOnData(cardSelectionResponse->getPowerOnData());
277 if (!mCommands.empty()) {
281 }
catch (
const Exception& e) {
282 throw ParseException(
"Invalid card response: " + e.getMessage(),
283 std::make_shared<Exception>(e));
286 if (calypsoCard->getProductType() == CalypsoCard::ProductType::UNKNOWN &&
287 cardSelectionResponse->getSelectApplicationResponse() ==
nullptr &&
288 cardSelectionResponse->getPowerOnData() ==
"") {
289 throw ParseException(
"Unable to create a CalypsoCard: no power-on data and no FCI " \
static const CalypsoCardClass ISO
static const int NB_REC_MAX
static const int NB_REC_MIN
CalypsoCardSelection & filterByPowerOnData(const std::string &powerOnDataRegex) override
CalypsoCardSelection & addSuccessfulStatusWord(const int statusWord) override
CalypsoCardSelection & prepareGetData(const GetDataTag tag) override
CalypsoCardSelection & prepareReadRecordFile(const uint8_t sfi, const uint8_t recordNumber) override
CalypsoCardSelection & setFileOccurrence(const FileOccurrence fileOccurrence) override
CalypsoCardSelectionAdapter()
CalypsoCardSelection & acceptInvalidatedCard() override
CalypsoCardSelection & setFileControlInformation(const FileControlInformation fileControlInformation) override
const std::shared_ptr< SmartCardSpi > parse(const std::shared_ptr< CardSelectionResponseApi > cardSelectionResponse) override
const std::shared_ptr< CardSelectionRequestSpi > getCardSelectionRequest() override
CalypsoCardSelection & prepareReadRecord(const uint8_t sfi, const uint8_t recordNumber) override
CalypsoCardSelection & filterByDfName(const std::vector< uint8_t > &aid) override
CalypsoCardSelection & filterByCardProtocol(const std::string &cardProtocol) override
CalypsoCardSelection & prepareSelectFile(const std::vector< uint8_t > &lid) override
static void updateCalypsoCard(std::shared_ptr< CalypsoCardAdapter > calypsoCard, const std::shared_ptr< AbstractCardCommand > command, const std::shared_ptr< ApduResponseApi > apduResponse, const bool isSessionOpen)
CardSelectorSpi::FileOccurrence FileOccurrence
CardSelectorSpi::FileControlInformation FileControlInformation