20#include "CardSecuritySetting.h"
21#include "CardTransactionManager.h"
22#include "SearchCommandData.h"
24#include "WriteAccessLevel.h"
27#include "ApduResponseApi.h"
28#include "ChannelControl.h"
29#include "ProxyReaderApi.h"
37#include "LoggerFactory.h"
43using namespace calypsonet::terminal::calypso;
44using namespace calypsonet::terminal::calypso::transaction;
45using namespace calypsonet::terminal::card;
46using namespace keyple::core::util::cpp;
108 const std::shared_ptr<CalypsoCard> calypsoCard,
109 const std::shared_ptr<CardSecuritySetting> cardSecuritySetting);
119 const std::shared_ptr<CalypsoCard> calypsoCard);
126 const std::shared_ptr<CardReader>
getCardReader()
const override;
133 const std::shared_ptr<CalypsoCard>
getCalypsoCard()
const override;
154 CardTransactionManager&
processOpening(
const WriteAccessLevel writeAccessLevel)
final;
182 CardTransactionManager&
processVerifyPin(const std::vector<uint8_t>& pin) final;
188 CardTransactionManager&
processChangePin(const std::vector<uint8_t>& newPin) override;
196 const uint8_t newKif,
197 const uint8_t newKvc,
198 const uint8_t issuerKif,
199 const uint8_t issuerKvc) override;
214 CardTransactionManager&
prepareSelectFile(const std::vector<uint8_t>& lid) final;
228 CardTransactionManager&
prepareSelectFile(const SelectFileControl selectFileControl) final;
235 CardTransactionManager&
prepareGetData(const GetDataTag tag) override;
253 const uint8_t firstRecordNumber,
254 const uint8_t numberOfRecords,
255 const uint8_t recordSize) final;
271 CardTransactionManager&
prepareReadRecord(const uint8_t sfi, const uint8_t recordNumber)
280 const uint8_t fromRecordNumber,
281 const uint8_t toRecordNumber,
282 const uint8_t recordSize) override;
290 const uint8_t fromRecordNumber,
291 const uint8_t toRecordNumber,
292 const uint8_t offset,
293 const uint8_t nbBytesToRead) override;
301 const uint8_t offset,
302 const uint8_t nbBytesToRead) override;
309 CardTransactionManager&
prepareReadCounter(const uint8_t sfi, const uint8_t nbCountersToRead)
326 const std::vector<uint8_t>& recordData) final;
334 const uint8_t recordNumber,
335 const std::vector<uint8_t>& recordData) final;
343 const uint8_t recordNumber,
344 const std::vector<uint8_t>& recordData) final;
352 const uint8_t offset,
353 const std::vector<uint8_t>& data) final;
361 const uint8_t offset,
362 const std::vector<uint8_t>& data) final;
370 const uint8_t counterNumber,
371 const
int incValue) final;
379 const uint8_t counterNumber,
380 const
int decValue) final;
389 const std::map<const
int, const
int>& counterNumberToDecValueMap) final;
398 const std::map<const
int, const
int>& counterNumberToIncValueMap) final;
406 const uint8_t counterNumber,
407 const
int newValue) final;
421 CardTransactionManager&
prepareSvGet(const SvOperation svOperation, const SvAction svAction)
430 const std::vector<uint8_t>& date,
431 const std::vector<uint8_t>& time,
432 const std::vector<uint8_t>& free) final;
447 const std::vector<uint8_t>& date,
448 const std::vector<uint8_t>& time) final;
481 friend std::ostream& operator<<(std::ostream& os, const
SessionState ss);
489 class ApduResponseAdapter final : public ApduResponseApi {
499 ApduResponseAdapter(
const std::vector<uint8_t>& apdu);
504 const std::vector<uint8_t>& getApdu()
const override;
509 const std::vector<uint8_t> getDataOut()
const override;
514 int getStatusWord()
const override;
520 const std::vector<uint8_t> mApdu;
525 const int mStatusWord;
531 const std::unique_ptr<Logger> mLogger =
537 static const std::string CARD_READER_COMMUNICATION_ERROR;
538 static const std::string CARD_COMMUNICATION_ERROR;
539 static const std::string CARD_COMMAND_ERROR;
540 static const std::string SAM_READER_COMMUNICATION_ERROR ;
541 static const std::string SAM_COMMUNICATION_ERROR;
542 static const std::string SAM_COMMAND_ERROR;
543 static const std::string PIN_NOT_AVAILABLE_ERROR;
544 static const std::string GENERATING_OF_THE_PIN_CIPHERED_DATA_ERROR;
545 static const std::string GENERATING_OF_THE_KEY_CIPHERED_DATA_ERROR;
546 static const std::string TRANSMITTING_COMMANDS;
547 static const std::string CHECKING_THE_SV_OPERATION;
548 static const std::string UNEXPECTED_EXCEPTION;
549 static const std::string RECORD_NUMBER;
555 static const int SESSION_BUFFER_CMD_ADDITIONAL_COST;
556 static const int APDU_HEADER_LENGTH;
561 static const std::string OFFSET;
566 const std::shared_ptr<ProxyReaderApi> mCardReader;
571 const std::shared_ptr<CardSecuritySetting> mCardSecuritySettings;
576 std::shared_ptr<SamCommandProcessor> mSamCommandProcessor;
581 const std::shared_ptr<CalypsoCardAdapter> mCalypsoCard;
591 WriteAccessLevel mCurrentWriteAccessLevel;
596 int mModificationsCounter;
601 std::shared_ptr<CardCommandManager> mCardCommandManager;
611 ChannelControl mChannelControl;
616 static const std::shared_ptr<ApduResponseApi> RESPONSE_OK;
617 static const std::shared_ptr<ApduResponseApi> RESPONSE_OK_POSTPONED;
625 const std::vector<std::shared_ptr<ApduRequestSpi>> getApduRequests(
626 const std::vector<std::shared_ptr<AbstractCardCommand>>& cardCommands);
647 void processAtomicCardCommands(
648 const std::vector<std::shared_ptr<AbstractCardCommand>> cardCommands,
649 const ChannelControl channelControl);
703 void processAtomicClosing(
704 const std::vector<std::shared_ptr<AbstractCardCommand>>& cardModificationCommands,
705 const std::vector<std::shared_ptr<ApduResponseApi>>& cardAnticipatedResponses,
706 const bool isRatificationMechanismEnabled,
707 const ChannelControl channelControl);
721 void processAtomicClosing(
722 const std::vector<std::shared_ptr<AbstractCardCommand>>& cardCommands,
723 const bool isRatificationMechanismEnabled,
724 const ChannelControl channelControl);
736 int getCounterValue(
const uint8_t sfi,
const int counter);
748 const std::map<const int, const int> getCounterValues(
const uint8_t sfi,
749 const std::vector<int>& counters);
760 const std::shared_ptr<ApduResponseApi> createIncreaseDecreaseResponse(
761 const bool isDecreaseCommand,
const int currentCounterValue,
const int incDecValue);
772 const std::shared_ptr<ApduResponseApi> createIncreaseDecreaseMultipleResponse(
773 const bool isDecreaseCommand,
774 const std::map<const int, const int>& counterNumberToCurrentValueMap,
775 const std::map<const int, const int>& counterNumberToIncDecValueMap);
786 const std::vector<std::shared_ptr<ApduResponseApi>> getAnticipatedResponses(
787 const std::vector<std::shared_ptr<AbstractCardCommand>>& cardCommands);
800 void processCardCommandsOutOfSession(
const ChannelControl channelControl);
810 void processCardCommandsInSession();
822 const std::shared_ptr<CardResponseApi> safeTransmit(
823 const std::shared_ptr<CardRequestSpi> cardRequest,
const ChannelControl channelControl);
832 const std::vector<uint8_t> getSessionTerminalChallenge();
841 const std::vector<uint8_t> getSessionTerminalSignature();
851 void checkCardSignature(
const std::vector<uint8_t>& cardSignature);
862 void checkSvOperationStatus(
const std::vector<uint8_t>& cardPostponedData);
869 void checkSessionOpen();
876 void checkSessionNotOpen();
886 void checkCommandsResponsesSynchronization(
const size_t commandsNumber,
887 const size_t responsesNumber);
903 bool checkModifyingCommand(
const std::shared_ptr<AbstractCardCommand> command,
904 std::atomic<bool>& overflow,
905 std::atomic<int>& neededSessionBufferSpace);
918 bool isSessionBufferOverflowed(
const int sessionBufferSizeConsumed);
923 void resetModificationsBufferCounter();
936 CardTransactionManager& prepareUpdateOrWriteBinary(
const bool isUpdateCommand,
938 const uint8_t offset,
939 const std::vector<uint8_t>& data);
946 CardTransactionManager& prepareIncreaseOrDecreaseCounter(
const bool isDecreaseCommand,
948 const uint8_t counterNumber,
949 const int incDecValue);
956 CardTransactionManager& prepareIncreaseOrDecreaseCounters(
957 const bool isDecreaseCommand,
959 const std::map<const int, const int>& counterNumberToIncDecValueMap);
970 void processAtomicOpening(
971 const WriteAccessLevel writeAccessLevel,
972 std::vector<std::shared_ptr<AbstractCardCommand>>& cardCommands);
984 void prepareInternalSvUndebit(
const int amount,
985 const std::vector<uint8_t>& date,
986 const std::vector<uint8_t>& time);
999 void prepareInternalSvDebit(
const int amount,
1000 const std::vector<uint8_t>& date,
1001 const std::vector<uint8_t>& time);
1006 friend std::ostream&
operator<<(std::ostream& os,
const ApduResponseAdapter& ara);
1011 friend std::ostream&
operator<<(std::ostream& os,
1012 const std::shared_ptr<ApduResponseAdapter> ara);
const std::shared_ptr< CalypsoCard > getCalypsoCard() const override
CardTransactionManager & processChangePin(const std::vector< uint8_t > &newPin) override
CardTransactionManager & prepareInvalidate() final
CardTransactionManager & prepareUpdateBinary(const uint8_t sfi, const uint8_t offset, const std::vector< uint8_t > &data) final
CardTransactionManager & processClosing() final
const std::shared_ptr< CardSecuritySetting > getCardSecuritySetting() const override
CardTransactionManager & prepareCheckPinStatus() final
CardTransactionManager & prepareSetCounter(const uint8_t sfi, const uint8_t counterNumber, const int newValue) final
CardTransactionManager & prepareReadRecordFile(const uint8_t sfi, const uint8_t recordNumber) final
CardTransactionManager & prepareReadRecord(const uint8_t sfi, const uint8_t recordNumber) override
CardTransactionManager & prepareIncreaseCounters(const uint8_t sfi, const std::map< const int, const int > &counterNumberToIncValueMap) final
friend std::ostream & operator<<(std::ostream &os, const SessionState ss)
const std::string getTransactionAuditData() const override
CardTransactionManager & prepareReleaseCardChannel() final
CardTransactionManager & processChangeKey(const uint8_t keyIndex, const uint8_t newKif, const uint8_t newKvc, const uint8_t issuerKif, const uint8_t issuerKvc) override
CardTransactionManager & prepareDecreaseCounter(const uint8_t sfi, const uint8_t counterNumber, const int decValue) final
CardTransactionManager & prepareReadRecords(const uint8_t sfi, const uint8_t fromRecordNumber, const uint8_t toRecordNumber, const uint8_t recordSize) override
CardTransactionManager & prepareSelectFile(const std::vector< uint8_t > &lid) final
CardTransactionManager & prepareReadBinary(const uint8_t sfi, const uint8_t offset, const uint8_t nbBytesToRead) override
CardTransactionManager & prepareRehabilitate() final
const std::shared_ptr< CardReader > getCardReader() const override
CardTransactionManager & prepareWriteRecord(const uint8_t sfi, const uint8_t recordNumber, const std::vector< uint8_t > &recordData) final
CardTransactionManagerAdapter(const std::shared_ptr< CardReader > cardReader, const std::shared_ptr< CalypsoCard > calypsoCard, const std::shared_ptr< CardSecuritySetting > cardSecuritySetting)
CardTransactionManager & prepareSvReadAllLogs() final
CardTransactionManager & prepareGetData(const GetDataTag tag) override
CardTransactionManager & processOpening(const WriteAccessLevel writeAccessLevel) final
CardTransactionManager & processVerifyPin(const std::vector< uint8_t > &pin) final
CardTransactionManager & prepareReadCounterFile(const uint8_t sfi, const uint8_t countersNumber) final
CardTransactionManager & prepareUpdateRecord(const uint8_t sfi, const uint8_t recordNumber, const std::vector< uint8_t > &recordData) final
CardTransactionManager & prepareIncreaseCounter(const uint8_t sfi, const uint8_t counterNumber, const int incValue) final
CardTransactionManager & processCancel() final
CardTransactionManager & prepareSvDebit(const int amount, const std::vector< uint8_t > &date, const std::vector< uint8_t > &time) final
CardTransactionManager & prepareReadCounter(const uint8_t sfi, const uint8_t nbCountersToRead) override
CardTransactionManager & prepareAppendRecord(const uint8_t sfi, const std::vector< uint8_t > &recordData) final
CardTransactionManager & prepareReadRecordsPartially(const uint8_t sfi, const uint8_t fromRecordNumber, const uint8_t toRecordNumber, const uint8_t offset, const uint8_t nbBytesToRead) override
CardTransactionManager & prepareSvGet(const SvOperation svOperation, const SvAction svAction) final
CardTransactionManager & prepareWriteBinary(const uint8_t sfi, const uint8_t offset, const std::vector< uint8_t > &data) final
CardTransactionManager & prepareSvReload(const int amount, const std::vector< uint8_t > &date, const std::vector< uint8_t > &time, const std::vector< uint8_t > &free) final
CardTransactionManager & prepareSearchRecords(const std::shared_ptr< SearchCommandData > data) override
CardTransactionManager & processCardCommands() final
CardTransactionManager & prepareDecreaseCounters(const uint8_t sfi, const std::map< const int, const int > &counterNumberToDecValueMap) final