16#include "ParseException.h"
30#include "UnsupportedOperationException.h"
36#include "ByteArrayUtil.h"
37#include "IllegalArgumentException.h"
38#include "KeypleAssert.h"
40#include "PatternSyntaxException.h"
46using namespace calypsonet::terminal::card::spi;
47using namespace keyple::core::util;
48using namespace keyple::core::util::cpp;
49using namespace keyple::core::util::cpp::exception;
51const int CalypsoCardSelectionAdapter::AID_MIN_LENGTH = 5;
52const int CalypsoCardSelectionAdapter::AID_MAX_LENGTH = 16;
53const int CalypsoCardSelectionAdapter::SW_CARD_INVALIDATED = 0x6283;
59 const std::string& cardProtocol)
61 Assert::getInstance().notEmpty(cardProtocol,
"cardProtocol");
63 mCardSelector->filterByCardProtocol(cardProtocol);
69 const std::string& powerOnDataRegex)
71 Assert::getInstance().notEmpty(powerOnDataRegex,
"powerOnDataRegex");
74 Pattern::compile(powerOnDataRegex);
75 }
catch (
const PatternSyntaxException& exception) {
77 throw IllegalArgumentException(
"Invalid regular expression: '" +
82 mCardSelector->filterByPowerOnData(powerOnDataRegex);
89 Assert::getInstance().notEmpty(aid,
"aid")
90 .isInRange(aid.size(), AID_MIN_LENGTH, AID_MAX_LENGTH,
"aid");
92 mCardSelector->filterByDfName(aid);
99 Assert::getInstance().isTrue(ByteArrayUtil::isValidHexString(aid),
"aid format");
109 switch (fileOccurrence) {
110 case FileOccurrence::FIRST:
111 mCardSelector->setFileOccurrence(CardSelectorSpi::FileOccurrence::FIRST);
113 case FileOccurrence::LAST:
114 mCardSelector->setFileOccurrence(CardSelectorSpi::FileOccurrence::LAST);
116 case FileOccurrence::NEXT:
117 mCardSelector->setFileOccurrence(CardSelectorSpi::FileOccurrence::NEXT);
119 case FileOccurrence::PREVIOUS:
120 mCardSelector->setFileOccurrence(CardSelectorSpi::FileOccurrence::PREVIOUS);
130 if (fileControlInformation == FileControlInformation::FCI) {
131 mCardSelector->setFileControlInformation(CardSelectorSpi::FileControlInformation::FCI);
132 }
else if (fileControlInformation == FileControlInformation::NO_RESPONSE) {
133 mCardSelector->setFileControlInformation(
134 CardSelectorSpi::FileControlInformation::NO_RESPONSE);
142 Assert::getInstance().isInRange(statusWord, 0, 0xFFFF,
"statusWord");
144 mCardSelector->addSuccessfulStatusWord(statusWord);
151 mCardSelector->addSuccessfulStatusWord(SW_CARD_INVALIDATED);
157 const uint8_t sfi,
const uint8_t recordNumber)
163 const uint8_t recordNumber)
165 Assert::getInstance().isInRange(sfi,
169 .isInRange(recordNumber,
179 static_cast<uint8_t
>(0)));
188 case GetDataTag::FCI_FOR_CURRENT_DF:
191 case GetDataTag::FCP_FOR_CURRENT_FILE:
194 case GetDataTag::EF_LIST:
197 case GetDataTag::TRACEABILITY_INFORMATION:
202 throw UnsupportedOperationException(
"Unsupported Get Data tag: ");
209 const std::vector<uint8_t>& lid)
211 Assert::getInstance().isEqual(lid.size(), 2,
"lid length");
213 return prepareSelectFile(
static_cast<uint16_t
>(ByteArrayUtil::twoBytesToInt(lid, 0)));
220 CalypsoCard::ProductType::PRIME_REVISION_3, lid));
226 const SelectFileControl selectControl)
233const std::shared_ptr<CardSelectionRequestSpi>
236 std::vector<std::shared_ptr<ApduRequestSpi>> cardSelectionApduRequests;
238 if (!mCommands.empty()) {
239 for (
const auto& command : mCommands) {
240 cardSelectionApduRequests.push_back(command->getApduRequest());
243 return std::make_shared<CardSelectionRequestAdapter>(
245 std::make_shared<CardRequestAdapter>(cardSelectionApduRequests,
false));
247 return std::make_shared<CardSelectionRequestAdapter>(mCardSelector,
nullptr);
252 const std::shared_ptr<CardSelectionResponseApi> cardSelectionResponse)
254 const std::shared_ptr<CardResponseApi> cardResponse = cardSelectionResponse->getCardResponse();
255 std::vector<std::shared_ptr<ApduResponseApi>> apduResponses;
257 if (cardResponse !=
nullptr) {
258 apduResponses = cardResponse->getApduResponses();
263 if (mCommands.size() != apduResponses.size()) {
264 throw ParseException(
"Mismatch in the number of requests/responses.");
267 std::shared_ptr<CalypsoCardAdapter> calypsoCard;
269 calypsoCard = std::make_shared<CalypsoCardAdapter>();
270 if (cardSelectionResponse->getSelectApplicationResponse() !=
nullptr) {
271 calypsoCard->initializeWithFci(cardSelectionResponse->getSelectApplicationResponse());
272 }
else if (cardSelectionResponse->getPowerOnData() !=
"") {
273 calypsoCard->initializeWithPowerOnData(cardSelectionResponse->getPowerOnData());
276 if (!mCommands.empty()) {
280 }
catch (
const Exception& e) {
281 throw ParseException(
"Invalid card response: " + e.getMessage(),
282 std::make_shared<Exception>(e));
285 if (calypsoCard->getProductType() == CalypsoCard::ProductType::UNKNOWN &&
286 cardSelectionResponse->getSelectApplicationResponse() ==
nullptr &&
287 cardSelectionResponse->getPowerOnData() ==
"") {
288 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