20#include "CardSecuritySetting.h"
21#include "CardTransactionManager.h"
22#include "CommonSignatureComputationData.h"
23#include "CommonSignatureVerificationData.h"
24#include "SearchCommandData.h"
26#include "WriteAccessLevel.h"
29#include "ApduResponseApi.h"
30#include "CardRequestSpi.h"
31#include "CardResponseApi.h"
32#include "ChannelControl.h"
33#include "ProxyReaderApi.h"
43#include "LoggerFactory.h"
49using namespace calypsonet::terminal::calypso;
50using namespace calypsonet::terminal::calypso::transaction;
51using namespace calypsonet::terminal::card;
52using namespace calypsonet::terminal::card::spi;
53using namespace keyple::core::util::cpp;
90 CardSecuritySettingAdapter>,
91 public CardTransactionManager {
105 const std::shared_ptr<CalypsoCardAdapter> card,
106 const std::shared_ptr<CardSecuritySettingAdapter> securitySetting);
124 const std::shared_ptr<CardReader>
getCardReader()
const override;
131 const std::shared_ptr<CalypsoCard>
getCalypsoCard()
const override;
146 CardTransactionManager&
processOpening(
const WriteAccessLevel writeAccessLevel)
override;
203 CardTransactionManager&
processVerifyPin(
const std::vector<uint8_t>& pin)
override;
209 CardTransactionManager&
processChangePin(
const std::vector<uint8_t>& newPin)
override;
217 const uint8_t newKif,
218 const uint8_t newKvc,
219 const uint8_t issuerKif,
220 const uint8_t issuerKvc)
override;
235 CardTransactionManager&
prepareSelectFile(
const std::vector<uint8_t>& lid)
override;
249 CardTransactionManager&
prepareSelectFile(
const SelectFileControl selectFileControl)
override;
256 CardTransactionManager&
prepareGetData(
const GetDataTag tag)
override;
274 const uint8_t firstRecordNumber,
275 const uint8_t numberOfRecords,
276 const uint8_t recordSize)
override;
292 CardTransactionManager&
prepareReadRecord(
const uint8_t sfi,
const uint8_t recordNumber)
301 const uint8_t fromRecordNumber,
302 const uint8_t toRecordNumber,
303 const uint8_t recordSize)
override;
311 const uint8_t fromRecordNumber,
312 const uint8_t toRecordNumber,
313 const uint8_t offset,
314 const uint8_t nbBytesToRead)
override;
323 const int nbBytesToRead)
override;
330 CardTransactionManager&
prepareReadCounter(
const uint8_t sfi,
const uint8_t nbCountersToRead)
347 const std::vector<uint8_t>& recordData)
override;
355 const uint8_t recordNumber,
356 const std::vector<uint8_t>& recordData)
override;
364 const uint8_t recordNumber,
365 const std::vector<uint8_t>& recordData)
override;
374 const std::vector<uint8_t>& data)
final;
383 const std::vector<uint8_t>& data)
final;
391 const uint8_t counterNumber,
392 const int incValue)
override;
400 const uint8_t counterNumber,
401 const int decValue)
override;
410 const std::map<const int, const int>& counterNumberToDecValueMap)
override;
419 const std::map<const int, const int>& counterNumberToIncValueMap)
override;
427 const uint8_t counterNumber,
428 const int newValue)
override;
442 CardTransactionManager&
prepareSvGet(
const SvOperation svOperation,
const SvAction svAction)
451 const std::vector<uint8_t>& date,
452 const std::vector<uint8_t>& time,
453 const std::vector<uint8_t>& free)
override;
468 const std::vector<uint8_t>& date,
469 const std::vector<uint8_t>& time)
override;
476 CardTransactionManager&
prepareSvDebit(
const int amount)
override;
517 const SvOperation svOperation);
544 class ApduResponseAdapter final :
public ApduResponseApi {
554 ApduResponseAdapter(
const std::vector<uint8_t>& apdu);
559 const std::vector<uint8_t>& getApdu()
const override;
564 const std::vector<uint8_t> getDataOut()
const override;
569 int getStatusWord()
const override;
575 const std::vector<uint8_t> mApdu;
580 const int mStatusWord;
586 const std::unique_ptr<Logger> mLogger =
592 static const std::string PATTERN_1_BYTE_HEX;
597 static const std::string MSG_CARD_READER_COMMUNICATION_ERROR;
598 static const std::string MSG_CARD_COMMUNICATION_ERROR;
599 static const std::string MSG_CARD_COMMAND_ERROR;
601 static const std::string MSG_PIN_NOT_AVAILABLE;
602 static const std::string MSG_CARD_SIGNATURE_NOT_VERIFIABLE;
603 static const std::string MSG_CARD_SIGNATURE_NOT_VERIFIABLE_SV;
605 static const std::string RECORD_NUMBER;
606 static const std::string OFFSET;
612 static const int SESSION_BUFFER_CMD_ADDITIONAL_COST;
613 static const int APDU_HEADER_LENGTH;
618 static const std::shared_ptr<ApduResponseApi> RESPONSE_OK;
619 static const std::shared_ptr<ApduResponseApi> RESPONSE_OK_POSTPONED;
624 const std::shared_ptr<ProxyReaderApi> mCardReader;
625 const std::shared_ptr<CalypsoCardAdapter> mCard;
626 const std::shared_ptr<CardSecuritySettingAdapter> mSecuritySetting;
627 std::shared_ptr<CardControlSamTransactionManagerAdapter> mControlSamTransactionManager;
632 std::vector<std::shared_ptr<AbstractApduCommand>> mCardCommands;
637 bool mIsSessionOpen =
false;
638 WriteAccessLevel mWriteAccessLevel = WriteAccessLevel::DEBIT;
639 ChannelControl mChannelControl = ChannelControl::KEEP_OPEN;
640 int mModificationsCounter = 0;
641 SvOperation mSvOperation;
642 SvAction mSvAction = SvAction::DO;
644 std::shared_ptr<AbstractCardCommand> mSvLastModifyingCommand;
645 bool mIsSvOperationInsideSession =
false;
646 bool mIsSvOperationComplete =
false;
647 int mSvPostponedDataIndex = 0;
648 int mNbPostponedData = 0;
670 void processAtomicCardCommands(
671 const std::vector<std::shared_ptr<AbstractApduCommand>> cardCommands,
672 const ChannelControl channelControl);
681 void checkMultipleSessionEnabled(std::shared_ptr<AbstractCardCommand> command)
const;
691 const std::vector<uint8_t> processSamCardCipherPin(
const std::vector<uint8_t>& currentPin,
692 const std::vector<uint8_t>& newPin);
744 void processAtomicClosing(
745 const std::vector<std::shared_ptr<AbstractApduCommand>>& cardCommands,
746 const bool isRatificationMechanismEnabled,
747 const ChannelControl channelControl);
759 int getCounterValue(
const uint8_t sfi,
const int counter);
771 const std::map<const int, const int> getCounterValues(
const uint8_t sfi,
772 const std::vector<int>& counters);
783 const std::vector<uint8_t> buildAnticipatedIncreaseDecreaseResponseData(
784 const bool isDecreaseCommand,
785 const int currentCounterValue,
786 const int incDecValue);
795 const std::shared_ptr<ApduResponseApi> buildAnticipatedIncreaseDecreaseResponse(
796 const std::vector<uint8_t>& data);
807 const std::shared_ptr<ApduResponseApi> buildAnticipatedIncreaseDecreaseMultipleResponse(
808 const bool isDecreaseCommand,
809 const std::map<const int, const int>& counterNumberToCurrentValueMap,
810 const std::map<const int, const int>& counterNumberToIncDecValueMap);
823 const std::vector<std::shared_ptr<ApduResponseApi>> buildAnticipatedResponses(
824 const std::vector<std::shared_ptr<AbstractApduCommand>>& cardCommands);
835 void processCommandsOutsideSession(
const ChannelControl channelControl);
843 void processCommandsInsideSession();
855 const std::vector<uint8_t> processSamCardGenerateKey(
const uint8_t issuerKif,
856 const uint8_t issuerKvc,
857 const uint8_t newKif,
858 const uint8_t newKvc);
868 const std::shared_ptr<CardResponseApi> transmitCardRequest(
869 const std::shared_ptr<CardRequestSpi> cardRequest,
const ChannelControl channelControl);
876 void finalizeSvCommandIfNeeded();
895 const std::vector<uint8_t> processSamSvPrepareLoad(
896 const std::vector<uint8_t>& svGetHeader,
897 const std::vector<uint8_t>& svGetData,
898 const std::shared_ptr<CmdCardSvReload> cmdCardSvReload);
918 const std::vector<uint8_t> processSamSvPrepareDebitOrUndebit(
919 const bool isDebitCommand,
920 const std::vector<uint8_t> svGetHeader,
921 const std::vector<uint8_t> svGetData,
922 const std::shared_ptr<CmdCardSvDebitOrUndebit> cmdCardSvDebitOrUndebit);
940 const std::vector<uint8_t> computeOperationComplementaryData(
941 const std::vector<uint8_t>& prepareOperationData);
953 void processSamSvCheck(
const std::vector<uint8_t>& svOperationData);
961 const std::vector<uint8_t> processSamGetChallenge();
970 const std::vector<uint8_t> processSamSessionClosing();
978 void processSamDigestAuthenticate(
const std::vector<uint8_t>& cardSignature);
994 void checkNoSession();
1003 int computeCommandSessionBufferSize(std::shared_ptr<AbstractCardCommand> command);
1008 void resetModificationsBufferCounter();
1021 CardTransactionManager& prepareUpdateOrWriteBinary(
const bool isUpdateCommand,
1024 const std::vector<uint8_t>& data);
1030 CardTransactionManager& prepareIncreaseOrDecreaseCounter(
const bool isDecreaseCommand,
1032 const uint8_t counterNumber,
1033 const int incDecValue);
1039 CardTransactionManager& prepareIncreaseOrDecreaseCounters(
1040 const bool isDecreaseCommand,
1042 const std::map<const int, const int>& counterNumberToIncDecValueMap);
1052 void checkControlSam()
const;
1058 void processSamPreparedCommands();
1069 void processAtomicOpening(std::vector<std::shared_ptr<AbstractApduCommand>>& cardCommands);
1075 void abortSecureSessionSilently();
1088 void prepareInternalSvUndebit(
const int amount,
1089 const std::vector<uint8_t>& date,
1090 const std::vector<uint8_t>& time,
1091 const bool useExtendedMode);
1099 void checkSvInsideSession();
1108 bool isExtendedModeAllowed()
const;
1119 void parseApduResponses(
const std::vector<std::shared_ptr<AbstractCardCommand>>& commands,
1120 const std::vector<std::shared_ptr<ApduResponseApi>>& apduResponses);
1129 void checkResponseStatusForStrictAndBestEffortMode(
1130 const std::shared_ptr<AbstractCardCommand> command,
1131 const CardCommandException& e)
const;
1136 friend std::ostream&
operator<<(std::ostream& os,
const ApduResponseAdapter& ara);
1141 friend std::ostream&
operator<<(std::ostream& os,
1142 const std::shared_ptr<ApduResponseAdapter> ara);
static const CalypsoCardCommand NONE
const std::shared_ptr< CalypsoCard > getCalypsoCard() const override
const std::vector< std::vector< uint8_t > > & getTransactionAuditData() const final
CardTransactionManager & processChangePin(const std::vector< uint8_t > &newPin) override
CardTransactionManager & prepareWriteRecord(const uint8_t sfi, const uint8_t recordNumber, const std::vector< uint8_t > &recordData) override
CardTransactionManager & prepareAppendRecord(const uint8_t sfi, const std::vector< uint8_t > &recordData) override
CardTransactionManager & prepareSvGet(const SvOperation svOperation, const SvAction svAction) override
const std::shared_ptr< CardSecuritySetting > getCardSecuritySetting() const override
CardTransactionManager & processCardCommands() override
CardTransactionManager & prepareIncreaseCounter(const uint8_t sfi, const uint8_t counterNumber, const int incValue) override
CardTransactionManagerAdapter(const std::shared_ptr< ProxyReaderApi > cardReader, const std::shared_ptr< CalypsoCardAdapter > card, const std::shared_ptr< CardSecuritySettingAdapter > securitySetting)
CardTransactionManager & prepareUpdateBinary(const uint8_t sfi, const int offset, const std::vector< uint8_t > &data) final
CardTransactionManager & prepareReadRecord(const uint8_t sfi, const uint8_t recordNumber) override
CardTransactionManager & prepareWriteBinary(const uint8_t sfi, const int offset, const std::vector< uint8_t > &data) final
CardTransactionManager & prepareVerifySignature(const any data) override
CardTransactionManager & processOpening(const WriteAccessLevel writeAccessLevel) override
void notifyCommandsProcessed()
CardTransactionManager & processVerifyPin(const std::vector< uint8_t > &pin) override
CardTransactionManager & processChangeKey(const uint8_t keyIndex, const uint8_t newKif, const uint8_t newKvc, const uint8_t issuerKif, const uint8_t issuerKvc) override
CardTransactionManager & prepareCheckPinStatus() override
CardTransactionManager & prepareSvReadAllLogs() override
CardTransactionManager & prepareReadBinary(const uint8_t sfi, const int offset, const int nbBytesToRead) override
CardTransactionManager & prepareReadRecords(const uint8_t sfi, const uint8_t fromRecordNumber, const uint8_t toRecordNumber, const uint8_t recordSize) override
const std::shared_ptr< CardReader > getCardReader() const override
CardTransactionManager & prepareInvalidate() override
CardTransactionManager & prepareReleaseCardChannel() override
CardTransactionManager & prepareGetData(const GetDataTag tag) override
CardTransactionManager & prepareDecreaseCounter(const uint8_t sfi, const uint8_t counterNumber, const int decValue) override
CardTransactionManager & prepareIncreaseCounters(const uint8_t sfi, const std::map< const int, const int > &counterNumberToIncValueMap) override
CardTransactionManager & prepareRehabilitate() override
CardTransactionManager & prepareSvReload(const int amount, const std::vector< uint8_t > &date, const std::vector< uint8_t > &time, const std::vector< uint8_t > &free) override
friend std::ostream & operator<<(std::ostream &os, const ApduResponseAdapter &ara)
bool isSvOperationCompleteOneTime()
CardTransactionManager & prepareReadCounter(const uint8_t sfi, const uint8_t nbCountersToRead) override
CardTransactionManager & processCancel() override
CardTransactionManager & prepareReadRecordsPartially(const uint8_t sfi, const uint8_t fromRecordNumber, const uint8_t toRecordNumber, const uint8_t offset, const uint8_t nbBytesToRead) override
CardTransactionManager & prepareSetCounter(const uint8_t sfi, const uint8_t counterNumber, const int newValue) override
CardTransactionManager & prepareComputeSignature(const any data) override
CardTransactionManager & prepareSvDebit(const int amount, const std::vector< uint8_t > &date, const std::vector< uint8_t > &time) override
CardTransactionManager & processClosing() override
CardTransactionManager & processCommands() override
void addStoredValueCommand(const std::shared_ptr< AbstractCardCommand > command, const SvOperation svOperation)
CardTransactionManager & prepareDecreaseCounters(const uint8_t sfi, const std::map< const int, const int > &counterNumberToDecValueMap) override
CardTransactionManager & prepareReadCounterFile(const uint8_t sfi, const uint8_t countersNumber) override
CardTransactionManager & prepareSearchRecords(const std::shared_ptr< SearchCommandData > data) override
const std::shared_ptr< CommonSecuritySetting > getSecuritySetting() const override
CardTransactionManager & prepareSelectFile(const std::vector< uint8_t > &lid) override
CardTransactionManager & prepareUpdateRecord(const uint8_t sfi, const uint8_t recordNumber, const std::vector< uint8_t > &recordData) override
CardTransactionManager & prepareReadRecordFile(const uint8_t sfi, const uint8_t recordNumber) override
const std::vector< std::vector< uint8_t > > & getTransactionAuditData() const override