Keyple Card Calypso C++ Library 2.2.2
Reference Terminal Reader API for C++
CardTransactionManagerAdapter.h
Go to the documentation of this file.
1/**************************************************************************************************
2 * Copyright (c) 2022 Calypso Networks Association https://calypsonet.org/ *
3 * *
4 * See the NOTICE file(s) distributed with this work for additional information regarding *
5 * copyright ownership. *
6 * *
7 * This program and the accompanying materials are made available under the terms of the Eclipse *
8 * Public License 2.0 which is available at http://www.eclipse.org/legal/epl-2.0 *
9 * *
10 * SPDX-License-Identifier: EPL-2.0 *
11 **************************************************************************************************/
12
13#pragma once
14
15#include <atomic>
16#include <memory>
17#include <ostream>
18
19/* Calypsonet Terminal Calypso */
20#include "CardSecuritySetting.h"
21#include "CardTransactionManager.h"
22#include "CommonSignatureComputationData.h"
23#include "CommonSignatureVerificationData.h"
24#include "SearchCommandData.h"
25#include "SvAction.h"
26#include "WriteAccessLevel.h"
27
28/* Calypsonet Terminal Card */
29#include "ApduResponseApi.h"
30#include "CardRequestSpi.h"
31#include "CardResponseApi.h"
32#include "ChannelControl.h"
33#include "ProxyReaderApi.h"
34
35/* Keyple Card Calypso */
36#include "CalypsoCardAdapter.h"
39
40/* Keyple Core Util */
41#include "Any.h"
42#include "LoggerFactory.h"
43
44namespace keyple {
45namespace card {
46namespace calypso {
47
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;
53
87: public CommonTransactionManagerAdapter<CardTransactionManager,
88 CardSecuritySetting,
89 CardSecuritySettingAdapter>,
90 public CardTransactionManager {
91public:
103 CardTransactionManagerAdapter(const std::shared_ptr<ProxyReaderApi> cardReader,
104 const std::shared_ptr<CalypsoCardAdapter> card,
105 const std::shared_ptr<CardSecuritySettingAdapter> securitySetting);
106
113 const std::vector<std::vector<uint8_t>>& getTransactionAuditData() const final
114 {
116 }
117
123 const std::shared_ptr<CardReader> getCardReader() const override;
124
130 const std::shared_ptr<CalypsoCard> getCalypsoCard() const override;
131
138 const std::shared_ptr<CardSecuritySetting> getCardSecuritySetting() const override;
139
145 CardTransactionManager& processOpening(const WriteAccessLevel writeAccessLevel) override;
146
152 const std::shared_ptr<CardSecuritySetting> getSecuritySetting() const override;
153
159 CardTransactionManager& prepareComputeSignature(const any data) override;
160
166 CardTransactionManager& prepareVerifySignature(const any data) override;
167
173 CardTransactionManager& processCommands() override;
174
181 CardTransactionManager& processCardCommands() override;
182
188 CardTransactionManager& processClosing() override;
189
195 CardTransactionManager& processCancel() override;
196
202 CardTransactionManager& processVerifyPin(const std::vector<uint8_t>& pin) override;
208 CardTransactionManager& processChangePin(const std::vector<uint8_t>& newPin) override;
209
215 CardTransactionManager& processChangeKey(const uint8_t keyIndex,
216 const uint8_t newKif,
217 const uint8_t newKvc,
218 const uint8_t issuerKif,
219 const uint8_t issuerKvc) override;
220
226 CardTransactionManager& prepareReleaseCardChannel() override;
227
234 CardTransactionManager& prepareSelectFile(const std::vector<uint8_t>& lid) override;
235
241 CardTransactionManager& prepareSelectFile(const uint16_t lid) override;
242
248 CardTransactionManager& prepareSelectFile(const SelectFileControl selectFileControl) override;
249
255 CardTransactionManager& prepareGetData(const GetDataTag tag) override;
256
263 CardTransactionManager& prepareReadRecordFile(const uint8_t sfi, const uint8_t recordNumber)
264 override;
265
272 CardTransactionManager& prepareReadRecordFile(const uint8_t sfi,
273 const uint8_t firstRecordNumber,
274 const uint8_t numberOfRecords,
275 const uint8_t recordSize) override;
276
283 CardTransactionManager& prepareReadCounterFile(const uint8_t sfi, const uint8_t countersNumber)
284 override;
285
291 CardTransactionManager& prepareReadRecord(const uint8_t sfi, const uint8_t recordNumber)
292 override;
293
299 CardTransactionManager& prepareReadRecords(const uint8_t sfi,
300 const uint8_t fromRecordNumber,
301 const uint8_t toRecordNumber,
302 const uint8_t recordSize) override;
303
309 CardTransactionManager& prepareReadRecordsPartially(const uint8_t sfi,
310 const uint8_t fromRecordNumber,
311 const uint8_t toRecordNumber,
312 const uint8_t offset,
313 const uint8_t nbBytesToRead) override;
314
320 CardTransactionManager& prepareReadBinary(const uint8_t sfi,
321 const uint8_t offset,
322 const uint8_t nbBytesToRead) override;
323
329 CardTransactionManager& prepareReadCounter(const uint8_t sfi, const uint8_t nbCountersToRead)
330 override;
331
337 CardTransactionManager& prepareSearchRecords(const std::shared_ptr<SearchCommandData> data)
338 override;
339
345 CardTransactionManager& prepareAppendRecord(const uint8_t sfi,
346 const std::vector<uint8_t>& recordData) override;
347
353 CardTransactionManager& prepareUpdateRecord(const uint8_t sfi,
354 const uint8_t recordNumber,
355 const std::vector<uint8_t>& recordData) override;
356
362 CardTransactionManager& prepareWriteRecord(const uint8_t sfi,
363 const uint8_t recordNumber,
364 const std::vector<uint8_t>& recordData) override;
365
371 CardTransactionManager& prepareUpdateBinary(const uint8_t sfi,
372 const uint8_t offset,
373 const std::vector<uint8_t>& data) final;
374
380 CardTransactionManager& prepareWriteBinary(const uint8_t sfi,
381 const uint8_t offset,
382 const std::vector<uint8_t>& data) final;
383
389 CardTransactionManager& prepareIncreaseCounter(const uint8_t sfi,
390 const uint8_t counterNumber,
391 const int incValue) override;
392
398 CardTransactionManager& prepareDecreaseCounter(const uint8_t sfi,
399 const uint8_t counterNumber,
400 const int decValue) override;
401
407 CardTransactionManager& prepareDecreaseCounters(
408 const uint8_t sfi,
409 const std::map<const int, const int>& counterNumberToDecValueMap) override;
410
416 CardTransactionManager& prepareIncreaseCounters(
417 const uint8_t sfi,
418 const std::map<const int, const int>& counterNumberToIncValueMap) override;
419
425 CardTransactionManager& prepareSetCounter(const uint8_t sfi,
426 const uint8_t counterNumber,
427 const int newValue) override;
428
434 CardTransactionManager& prepareCheckPinStatus() override;
435
441 CardTransactionManager& prepareSvGet(const SvOperation svOperation, const SvAction svAction)
442 override;
443
449 CardTransactionManager& prepareSvReload(const int amount,
450 const std::vector<uint8_t>& date,
451 const std::vector<uint8_t>& time,
452 const std::vector<uint8_t>& free) override;
453
459 CardTransactionManager& prepareSvReload(const int amount) override;
460
466 CardTransactionManager& prepareSvDebit(const int amount,
467 const std::vector<uint8_t>& date,
468 const std::vector<uint8_t>& time) override;
469
475 CardTransactionManager& prepareSvDebit(const int amount) override;
476
482 CardTransactionManager& prepareSvReadAllLogs() override;
483
489 CardTransactionManager& prepareInvalidate() override;
490
496 CardTransactionManager& prepareRehabilitate() override;
497
515 void addStoredValueCommand(const std::shared_ptr<AbstractCardCommand> command,
516 const SvOperation svOperation);
517
526
537
538private:
543 class ApduResponseAdapter final : public ApduResponseApi {
544 public:
549
553 ApduResponseAdapter(const std::vector<uint8_t>& apdu);
554
558 const std::vector<uint8_t>& getApdu() const override;
559
563 const std::vector<uint8_t> getDataOut() const override;
564
568 int getStatusWord() const override;
569
570 private:
574 const std::vector<uint8_t> mApdu;
575
579 const int mStatusWord;
580 };
581
585 const std::unique_ptr<Logger> mLogger =
586 LoggerFactory::getLogger(typeid(CardTransactionManagerAdapter));
587
591 static const std::string PATTERN_1_BYTE_HEX;
592
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;
599
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;
603
604 static const std::string RECORD_NUMBER;
605 static const std::string OFFSET;
606
611 static const int SESSION_BUFFER_CMD_ADDITIONAL_COST;
612 static const int APDU_HEADER_LENGTH;
613
617 static const std::shared_ptr<ApduResponseApi> RESPONSE_OK;
618 static const std::shared_ptr<ApduResponseApi> RESPONSE_OK_POSTPONED;
619
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;
632
636 bool mIsSessionOpen = false;
637 WriteAccessLevel mWriteAccessLevel = WriteAccessLevel::DEBIT; /* MSVC: default value required */
638 ChannelControl mChannelControl = ChannelControl::KEEP_OPEN;
639 int mModificationsCounter = 0;
640 SvOperation mSvOperation;
641 SvAction mSvAction = SvAction::DO; /* MSVC: default value required */
642 CalypsoCardCommand mSvLastCommandRef = CalypsoCardCommand::NONE; /* GCC: default value required */
643 std::shared_ptr<AbstractCardCommand> mSvLastModifyingCommand;
644 bool mIsSvOperationInsideSession = false;
645 bool mIsSvOperationComplete = false;
646
667 void processAtomicCardCommands(
668 const std::vector<std::shared_ptr<AbstractApduCommand>> cardCommands,
669 const ChannelControl channelControl);
670
678 void checkMultipleSessionEnabled(std::shared_ptr<AbstractCardCommand> command) const;
679
688 const std::vector<uint8_t> processSamCardCipherPin(const std::vector<uint8_t>& currentPin,
689 const std::vector<uint8_t>& newPin);
690
741 void processAtomicClosing(
742 const std::vector<std::shared_ptr<AbstractApduCommand>>& cardCommands,
743 const bool isRatificationMechanismEnabled,
744 const ChannelControl channelControl);
745
756 int getCounterValue(const uint8_t sfi, const int counter);
757
768 const std::map<const int, const int> getCounterValues(const uint8_t sfi,
769 const std::vector<int>& counters);
770
780 const std::shared_ptr<ApduResponseApi> buildAnticipatedIncreaseDecreaseResponse(
781 const bool isDecreaseCommand, const int currentCounterValue, const int incDecValue);
782
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);
796
808 const std::vector<std::shared_ptr<ApduResponseApi>> buildAnticipatedResponses(
809 const std::vector<std::shared_ptr<AbstractApduCommand>>& cardCommands);
810
820 void processCommandsOutsideSession(const ChannelControl channelControl);
821
828 void processCommandsInsideSession();
829
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);
844
853 const std::shared_ptr<CardResponseApi> transmitCardRequest(
854 const std::shared_ptr<CardRequestSpi> cardRequest, const ChannelControl channelControl);
855
861 void finalizeSvCommandIfNeeded();
862
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);
884
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);
908
925 const std::vector<uint8_t> computeOperationComplementaryData(
926 const std::vector<uint8_t>& prepareOperationData);
927
938 void processSamSvCheck(const std::vector<uint8_t>& svOperationData);
939
946 const std::vector<uint8_t> processSamGetChallenge();
947
955 const std::vector<uint8_t> processSamSessionClosing();
956
963 void processSamDigestAuthenticate(const std::vector<uint8_t>& cardSignature);
964
971 void checkSession();
972
979 void checkNoSession();
980
988 int computeCommandSessionBufferSize(std::shared_ptr<AbstractCardCommand> command);
989
993 void resetModificationsBufferCounter();
994
1006 CardTransactionManager& prepareUpdateOrWriteBinary(const bool isUpdateCommand,
1007 const uint8_t sfi,
1008 const uint8_t offset,
1009 const std::vector<uint8_t>& data);
1010
1015 CardTransactionManager& prepareIncreaseOrDecreaseCounter(const bool isDecreaseCommand,
1016 const uint8_t sfi,
1017 const uint8_t counterNumber,
1018 const int incDecValue);
1019
1024 CardTransactionManager& prepareIncreaseOrDecreaseCounters(
1025 const bool isDecreaseCommand,
1026 const uint8_t sfi,
1027 const std::map<const int, const int>& counterNumberToIncDecValueMap);
1028
1029
1030
1037 void checkControlSam() const;
1038
1043 void processSamPreparedCommands();
1044
1054 void processAtomicOpening(std::vector<std::shared_ptr<AbstractApduCommand>>& cardCommands);
1055
1060 void abortSecureSessionSilently();
1061
1073 void prepareInternalSvUndebit(const int amount,
1074 const std::vector<uint8_t>& date,
1075 const std::vector<uint8_t>& time,
1076 const bool useExtendedMode);
1077
1084 void checkSvInsideSession();
1085
1093 bool isExtendedModeAllowed() const;
1094
1098 friend std::ostream& operator<<(std::ostream& os, const ApduResponseAdapter& ara);
1099
1103 friend std::ostream& operator<<(std::ostream& os,
1104 const std::shared_ptr<ApduResponseAdapter> ara);
1105};
1106
1107}
1108}
1109}
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 & 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
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 & 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 & 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 & 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)
CardTransactionManager & prepareReadCounter(const uint8_t sfi, const uint8_t nbCountersToRead) 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
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