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"
42#include "LoggerFactory.h"
48using namespace calypsonet::terminal::calypso;
49using namespace calypsonet::terminal::calypso::transaction;
50using namespace calypsonet::terminal::card;
51using namespace calypsonet::terminal::card::spi;
52using namespace keyple::core::util::cpp;
89 CardSecuritySettingAdapter>,
90 public CardTransactionManager {
104 const std::shared_ptr<CalypsoCardAdapter> card,
105 const std::shared_ptr<CardSecuritySettingAdapter> securitySetting);
123 const std::shared_ptr<CardReader>
getCardReader()
const override;
130 const std::shared_ptr<CalypsoCard>
getCalypsoCard()
const override;
145 CardTransactionManager&
processOpening(
const WriteAccessLevel writeAccessLevel)
override;
202 CardTransactionManager&
processVerifyPin(
const std::vector<uint8_t>& pin)
override;
208 CardTransactionManager&
processChangePin(
const std::vector<uint8_t>& newPin)
override;
216 const uint8_t newKif,
217 const uint8_t newKvc,
218 const uint8_t issuerKif,
219 const uint8_t issuerKvc)
override;
234 CardTransactionManager&
prepareSelectFile(
const std::vector<uint8_t>& lid)
override;
248 CardTransactionManager&
prepareSelectFile(
const SelectFileControl selectFileControl)
override;
255 CardTransactionManager&
prepareGetData(
const GetDataTag tag)
override;
273 const uint8_t firstRecordNumber,
274 const uint8_t numberOfRecords,
275 const uint8_t recordSize)
override;
291 CardTransactionManager&
prepareReadRecord(
const uint8_t sfi,
const uint8_t recordNumber)
300 const uint8_t fromRecordNumber,
301 const uint8_t toRecordNumber,
302 const uint8_t recordSize)
override;
310 const uint8_t fromRecordNumber,
311 const uint8_t toRecordNumber,
312 const uint8_t offset,
313 const uint8_t nbBytesToRead)
override;
321 const uint8_t offset,
322 const uint8_t nbBytesToRead)
override;
329 CardTransactionManager&
prepareReadCounter(
const uint8_t sfi,
const uint8_t nbCountersToRead)
346 const std::vector<uint8_t>& recordData)
override;
354 const uint8_t recordNumber,
355 const std::vector<uint8_t>& recordData)
override;
363 const uint8_t recordNumber,
364 const std::vector<uint8_t>& recordData)
override;
372 const uint8_t offset,
373 const std::vector<uint8_t>& data)
final;
381 const uint8_t offset,
382 const std::vector<uint8_t>& data)
final;
390 const uint8_t counterNumber,
391 const int incValue)
override;
399 const uint8_t counterNumber,
400 const int decValue)
override;
409 const std::map<const int, const int>& counterNumberToDecValueMap)
override;
418 const std::map<const int, const int>& counterNumberToIncValueMap)
override;
426 const uint8_t counterNumber,
427 const int newValue)
override;
441 CardTransactionManager&
prepareSvGet(
const SvOperation svOperation,
const SvAction svAction)
450 const std::vector<uint8_t>& date,
451 const std::vector<uint8_t>& time,
452 const std::vector<uint8_t>& free)
override;
467 const std::vector<uint8_t>& date,
468 const std::vector<uint8_t>& time)
override;
475 CardTransactionManager&
prepareSvDebit(
const int amount)
override;
516 const SvOperation svOperation);
543 class ApduResponseAdapter final :
public ApduResponseApi {
553 ApduResponseAdapter(
const std::vector<uint8_t>& apdu);
558 const std::vector<uint8_t>& getApdu()
const override;
563 const std::vector<uint8_t> getDataOut()
const override;
568 int getStatusWord()
const override;
574 const std::vector<uint8_t> mApdu;
579 const int mStatusWord;
585 const std::unique_ptr<Logger> mLogger =
591 static const std::string PATTERN_1_BYTE_HEX;
596 static const std::string MSG_CARD_READER_COMMUNICATION_ERROR;
597 static const std::string MSG_CARD_COMMUNICATION_ERROR;
598 static const std::string MSG_CARD_COMMAND_ERROR;
600 static const std::string MSG_PIN_NOT_AVAILABLE;
601 static const std::string MSG_CARD_SIGNATURE_NOT_VERIFIABLE;
602 static const std::string MSG_CARD_SIGNATURE_NOT_VERIFIABLE_SV;
604 static const std::string RECORD_NUMBER;
605 static const std::string OFFSET;
611 static const int SESSION_BUFFER_CMD_ADDITIONAL_COST;
612 static const int APDU_HEADER_LENGTH;
617 static const std::shared_ptr<ApduResponseApi> RESPONSE_OK;
618 static const std::shared_ptr<ApduResponseApi> RESPONSE_OK_POSTPONED;
623 const std::shared_ptr<ProxyReaderApi> mCardReader;
624 const std::shared_ptr<CalypsoCardAdapter> mCard;
625 const std::shared_ptr<CardSecuritySettingAdapter> mSecuritySetting;
626 std::shared_ptr<CardControlSamTransactionManagerAdapter> mControlSamTransactionManager;
631 std::vector<std::shared_ptr<AbstractApduCommand>> mCardCommands;
636 bool mIsSessionOpen =
false;
637 WriteAccessLevel mWriteAccessLevel = WriteAccessLevel::DEBIT;
638 ChannelControl mChannelControl = ChannelControl::KEEP_OPEN;
639 int mModificationsCounter = 0;
640 SvOperation mSvOperation;
641 SvAction mSvAction = SvAction::DO;
643 std::shared_ptr<AbstractCardCommand> mSvLastModifyingCommand;
644 bool mIsSvOperationInsideSession =
false;
645 bool mIsSvOperationComplete =
false;
667 void processAtomicCardCommands(
668 const std::vector<std::shared_ptr<AbstractApduCommand>> cardCommands,
669 const ChannelControl channelControl);
678 void checkMultipleSessionEnabled(std::shared_ptr<AbstractCardCommand> command)
const;
688 const std::vector<uint8_t> processSamCardCipherPin(
const std::vector<uint8_t>& currentPin,
689 const std::vector<uint8_t>& newPin);
741 void processAtomicClosing(
742 const std::vector<std::shared_ptr<AbstractApduCommand>>& cardCommands,
743 const bool isRatificationMechanismEnabled,
744 const ChannelControl channelControl);
756 int getCounterValue(
const uint8_t sfi,
const int counter);
768 const std::map<const int, const int> getCounterValues(
const uint8_t sfi,
769 const std::vector<int>& counters);
780 const std::shared_ptr<ApduResponseApi> buildAnticipatedIncreaseDecreaseResponse(
781 const bool isDecreaseCommand,
const int currentCounterValue,
const int incDecValue);
792 const std::shared_ptr<ApduResponseApi> buildAnticipatedIncreaseDecreaseMultipleResponse(
793 const bool isDecreaseCommand,
794 const std::map<const int, const int>& counterNumberToCurrentValueMap,
795 const std::map<const int, const int>& counterNumberToIncDecValueMap);
808 const std::vector<std::shared_ptr<ApduResponseApi>> buildAnticipatedResponses(
809 const std::vector<std::shared_ptr<AbstractApduCommand>>& cardCommands);
820 void processCommandsOutsideSession(
const ChannelControl channelControl);
828 void processCommandsInsideSession();
840 const std::vector<uint8_t> processSamCardGenerateKey(
const uint8_t issuerKif,
841 const uint8_t issuerKvc,
842 const uint8_t newKif,
843 const uint8_t newKvc);
853 const std::shared_ptr<CardResponseApi> transmitCardRequest(
854 const std::shared_ptr<CardRequestSpi> cardRequest,
const ChannelControl channelControl);
861 void finalizeSvCommandIfNeeded();
880 const std::vector<uint8_t> processSamSvPrepareLoad(
881 const std::vector<uint8_t>& svGetHeader,
882 const std::vector<uint8_t>& svGetData,
883 const std::shared_ptr<CmdCardSvReload> cmdCardSvReload);
903 const std::vector<uint8_t> processSamSvPrepareDebitOrUndebit(
904 const bool isDebitCommand,
905 const std::vector<uint8_t> svGetHeader,
906 const std::vector<uint8_t> svGetData,
907 const std::shared_ptr<CmdCardSvDebitOrUndebit> cmdCardSvDebitOrUndebit);
925 const std::vector<uint8_t> computeOperationComplementaryData(
926 const std::vector<uint8_t>& prepareOperationData);
938 void processSamSvCheck(
const std::vector<uint8_t>& svOperationData);
946 const std::vector<uint8_t> processSamGetChallenge();
955 const std::vector<uint8_t> processSamSessionClosing();
963 void processSamDigestAuthenticate(
const std::vector<uint8_t>& cardSignature);
979 void checkNoSession();
988 int computeCommandSessionBufferSize(std::shared_ptr<AbstractCardCommand> command);
993 void resetModificationsBufferCounter();
1006 CardTransactionManager& prepareUpdateOrWriteBinary(
const bool isUpdateCommand,
1008 const uint8_t offset,
1009 const std::vector<uint8_t>& data);
1015 CardTransactionManager& prepareIncreaseOrDecreaseCounter(
const bool isDecreaseCommand,
1017 const uint8_t counterNumber,
1018 const int incDecValue);
1024 CardTransactionManager& prepareIncreaseOrDecreaseCounters(
1025 const bool isDecreaseCommand,
1027 const std::map<const int, const int>& counterNumberToIncDecValueMap);
1037 void checkControlSam()
const;
1043 void processSamPreparedCommands();
1054 void processAtomicOpening(std::vector<std::shared_ptr<AbstractApduCommand>>& cardCommands);
1060 void abortSecureSessionSilently();
1073 void prepareInternalSvUndebit(
const int amount,
1074 const std::vector<uint8_t>& date,
1075 const std::vector<uint8_t>& time,
1076 const bool useExtendedMode);
1084 void checkSvInsideSession();
1093 bool isExtendedModeAllowed()
const;
1098 friend std::ostream&
operator<<(std::ostream& os,
const ApduResponseAdapter& ara);
1103 friend std::ostream&
operator<<(std::ostream& os,
1104 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 & prepareUpdateBinary(const uint8_t sfi, const uint8_t offset, const std::vector< uint8_t > &data) final
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
const std::shared_ptr< CardSecuritySetting > getSecuritySetting() 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 & prepareReadRecord(const uint8_t sfi, const uint8_t recordNumber) override
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 & prepareReadRecords(const uint8_t sfi, const uint8_t fromRecordNumber, const uint8_t toRecordNumber, const uint8_t recordSize) override
CardTransactionManager & prepareReadBinary(const uint8_t sfi, const uint8_t offset, const uint8_t nbBytesToRead) 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 & prepareWriteBinary(const uint8_t sfi, const uint8_t offset, const std::vector< uint8_t > &data) final
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
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