Keyple Card Calypso C++ Library 2.2.5.6
Reference Terminal Reader API for C++
CardTransactionManagerAdapter.h
Go to the documentation of this file.
1/**************************************************************************************************
2 * Copyright (c) 2023 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"
40
41/* Keyple Core Util */
42#include "Any.h"
43#include "LoggerFactory.h"
44
45namespace keyple {
46namespace card {
47namespace calypso {
48
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;
54
88: public CommonTransactionManagerAdapter<CardTransactionManager,
89 CardSecuritySetting,
90 CardSecuritySettingAdapter>,
91 public CardTransactionManager {
92public:
104 CardTransactionManagerAdapter(const std::shared_ptr<ProxyReaderApi> cardReader,
105 const std::shared_ptr<CalypsoCardAdapter> card,
106 const std::shared_ptr<CardSecuritySettingAdapter> securitySetting);
107
114 const std::vector<std::vector<uint8_t>>& getTransactionAuditData() const final
115 {
117 }
118
124 const std::shared_ptr<CardReader> getCardReader() const override;
125
131 const std::shared_ptr<CalypsoCard> getCalypsoCard() const override;
132
139 const std::shared_ptr<CardSecuritySetting> getCardSecuritySetting() const override;
140
146 CardTransactionManager& processOpening(const WriteAccessLevel writeAccessLevel) override;
147
153 const std::shared_ptr<CommonSecuritySetting> getSecuritySetting() const override;
154
160 CardTransactionManager& prepareComputeSignature(const any data) override;
161
167 CardTransactionManager& prepareVerifySignature(const any data) override;
168
174 CardTransactionManager& processCommands() override;
175
182 CardTransactionManager& processCardCommands() override;
183
189 CardTransactionManager& processClosing() override;
190
196 CardTransactionManager& processCancel() override;
197
203 CardTransactionManager& processVerifyPin(const std::vector<uint8_t>& pin) override;
209 CardTransactionManager& processChangePin(const std::vector<uint8_t>& newPin) override;
210
216 CardTransactionManager& processChangeKey(const uint8_t keyIndex,
217 const uint8_t newKif,
218 const uint8_t newKvc,
219 const uint8_t issuerKif,
220 const uint8_t issuerKvc) override;
221
227 CardTransactionManager& prepareReleaseCardChannel() override;
228
235 CardTransactionManager& prepareSelectFile(const std::vector<uint8_t>& lid) override;
236
242 CardTransactionManager& prepareSelectFile(const uint16_t lid) override;
243
249 CardTransactionManager& prepareSelectFile(const SelectFileControl selectFileControl) override;
250
256 CardTransactionManager& prepareGetData(const GetDataTag tag) override;
257
264 CardTransactionManager& prepareReadRecordFile(const uint8_t sfi, const uint8_t recordNumber)
265 override;
266
273 CardTransactionManager& prepareReadRecordFile(const uint8_t sfi,
274 const uint8_t firstRecordNumber,
275 const uint8_t numberOfRecords,
276 const uint8_t recordSize) override;
277
284 CardTransactionManager& prepareReadCounterFile(const uint8_t sfi, const uint8_t countersNumber)
285 override;
286
292 CardTransactionManager& prepareReadRecord(const uint8_t sfi, const uint8_t recordNumber)
293 override;
294
300 CardTransactionManager& prepareReadRecords(const uint8_t sfi,
301 const uint8_t fromRecordNumber,
302 const uint8_t toRecordNumber,
303 const uint8_t recordSize) override;
304
310 CardTransactionManager& prepareReadRecordsPartially(const uint8_t sfi,
311 const uint8_t fromRecordNumber,
312 const uint8_t toRecordNumber,
313 const uint8_t offset,
314 const uint8_t nbBytesToRead) override;
315
321 CardTransactionManager& prepareReadBinary(const uint8_t sfi,
322 const int offset,
323 const int nbBytesToRead) override;
324
330 CardTransactionManager& prepareReadCounter(const uint8_t sfi, const uint8_t nbCountersToRead)
331 override;
332
338 CardTransactionManager& prepareSearchRecords(const std::shared_ptr<SearchCommandData> data)
339 override;
340
346 CardTransactionManager& prepareAppendRecord(const uint8_t sfi,
347 const std::vector<uint8_t>& recordData) override;
348
354 CardTransactionManager& prepareUpdateRecord(const uint8_t sfi,
355 const uint8_t recordNumber,
356 const std::vector<uint8_t>& recordData) override;
357
363 CardTransactionManager& prepareWriteRecord(const uint8_t sfi,
364 const uint8_t recordNumber,
365 const std::vector<uint8_t>& recordData) override;
366
372 CardTransactionManager& prepareUpdateBinary(const uint8_t sfi,
373 const int offset,
374 const std::vector<uint8_t>& data) final;
375
381 CardTransactionManager& prepareWriteBinary(const uint8_t sfi,
382 const int offset,
383 const std::vector<uint8_t>& data) final;
384
390 CardTransactionManager& prepareIncreaseCounter(const uint8_t sfi,
391 const uint8_t counterNumber,
392 const int incValue) override;
393
399 CardTransactionManager& prepareDecreaseCounter(const uint8_t sfi,
400 const uint8_t counterNumber,
401 const int decValue) override;
402
408 CardTransactionManager& prepareDecreaseCounters(
409 const uint8_t sfi,
410 const std::map<const int, const int>& counterNumberToDecValueMap) override;
411
417 CardTransactionManager& prepareIncreaseCounters(
418 const uint8_t sfi,
419 const std::map<const int, const int>& counterNumberToIncValueMap) override;
420
426 CardTransactionManager& prepareSetCounter(const uint8_t sfi,
427 const uint8_t counterNumber,
428 const int newValue) override;
429
435 CardTransactionManager& prepareCheckPinStatus() override;
436
442 CardTransactionManager& prepareSvGet(const SvOperation svOperation, const SvAction svAction)
443 override;
444
450 CardTransactionManager& prepareSvReload(const int amount,
451 const std::vector<uint8_t>& date,
452 const std::vector<uint8_t>& time,
453 const std::vector<uint8_t>& free) override;
454
460 CardTransactionManager& prepareSvReload(const int amount) override;
461
467 CardTransactionManager& prepareSvDebit(const int amount,
468 const std::vector<uint8_t>& date,
469 const std::vector<uint8_t>& time) override;
470
476 CardTransactionManager& prepareSvDebit(const int amount) override;
477
483 CardTransactionManager& prepareSvReadAllLogs() override;
484
490 CardTransactionManager& prepareInvalidate() override;
491
497 CardTransactionManager& prepareRehabilitate() override;
498
516 void addStoredValueCommand(const std::shared_ptr<AbstractCardCommand> command,
517 const SvOperation svOperation);
518
527
538
539private:
544 class ApduResponseAdapter final : public ApduResponseApi {
545 public:
550
554 ApduResponseAdapter(const std::vector<uint8_t>& apdu);
555
559 const std::vector<uint8_t>& getApdu() const override;
560
564 const std::vector<uint8_t> getDataOut() const override;
565
569 int getStatusWord() const override;
570
571 private:
575 const std::vector<uint8_t> mApdu;
576
580 const int mStatusWord;
581 };
582
586 const std::unique_ptr<Logger> mLogger =
587 LoggerFactory::getLogger(typeid(CardTransactionManagerAdapter));
588
592 static const std::string PATTERN_1_BYTE_HEX;
593
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;
600
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;
604
605 static const std::string RECORD_NUMBER;
606 static const std::string OFFSET;
607
612 static const int SESSION_BUFFER_CMD_ADDITIONAL_COST;
613 static const int APDU_HEADER_LENGTH;
614
618 static const std::shared_ptr<ApduResponseApi> RESPONSE_OK;
619 static const std::shared_ptr<ApduResponseApi> RESPONSE_OK_POSTPONED;
620
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;
633
637 bool mIsSessionOpen = false;
638 WriteAccessLevel mWriteAccessLevel = WriteAccessLevel::DEBIT; /* MSVC: default value required */
639 ChannelControl mChannelControl = ChannelControl::KEEP_OPEN;
640 int mModificationsCounter = 0;
641 SvOperation mSvOperation;
642 SvAction mSvAction = SvAction::DO; /* MSVC: default value required */
643 CalypsoCardCommand mSvLastCommandRef = CalypsoCardCommand::NONE; /* GCC: default value required */
644 std::shared_ptr<AbstractCardCommand> mSvLastModifyingCommand;
645 bool mIsSvOperationInsideSession = false;
646 bool mIsSvOperationComplete = false;
647 int mSvPostponedDataIndex = 0;
648 int mNbPostponedData = 0;
649
670 void processAtomicCardCommands(
671 const std::vector<std::shared_ptr<AbstractApduCommand>> cardCommands,
672 const ChannelControl channelControl);
673
681 void checkMultipleSessionEnabled(std::shared_ptr<AbstractCardCommand> command) const;
682
691 const std::vector<uint8_t> processSamCardCipherPin(const std::vector<uint8_t>& currentPin,
692 const std::vector<uint8_t>& newPin);
693
744 void processAtomicClosing(
745 const std::vector<std::shared_ptr<AbstractApduCommand>>& cardCommands,
746 const bool isRatificationMechanismEnabled,
747 const ChannelControl channelControl);
748
759 int getCounterValue(const uint8_t sfi, const int counter);
760
771 const std::map<const int, const int> getCounterValues(const uint8_t sfi,
772 const std::vector<int>& counters);
773
783 const std::vector<uint8_t> buildAnticipatedIncreaseDecreaseResponseData(
784 const bool isDecreaseCommand,
785 const int currentCounterValue,
786 const int incDecValue);
787
795 const std::shared_ptr<ApduResponseApi> buildAnticipatedIncreaseDecreaseResponse(
796 const std::vector<uint8_t>& data);
797
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);
811
823 const std::vector<std::shared_ptr<ApduResponseApi>> buildAnticipatedResponses(
824 const std::vector<std::shared_ptr<AbstractApduCommand>>& cardCommands);
825
835 void processCommandsOutsideSession(const ChannelControl channelControl);
836
843 void processCommandsInsideSession();
844
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);
859
868 const std::shared_ptr<CardResponseApi> transmitCardRequest(
869 const std::shared_ptr<CardRequestSpi> cardRequest, const ChannelControl channelControl);
870
876 void finalizeSvCommandIfNeeded();
877
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);
899
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);
923
940 const std::vector<uint8_t> computeOperationComplementaryData(
941 const std::vector<uint8_t>& prepareOperationData);
942
953 void processSamSvCheck(const std::vector<uint8_t>& svOperationData);
954
961 const std::vector<uint8_t> processSamGetChallenge();
962
970 const std::vector<uint8_t> processSamSessionClosing();
971
978 void processSamDigestAuthenticate(const std::vector<uint8_t>& cardSignature);
979
986 void checkSession();
987
994 void checkNoSession();
995
1003 int computeCommandSessionBufferSize(std::shared_ptr<AbstractCardCommand> command);
1004
1008 void resetModificationsBufferCounter();
1009
1021 CardTransactionManager& prepareUpdateOrWriteBinary(const bool isUpdateCommand,
1022 const uint8_t sfi,
1023 const int offset,
1024 const std::vector<uint8_t>& data);
1025
1030 CardTransactionManager& prepareIncreaseOrDecreaseCounter(const bool isDecreaseCommand,
1031 const uint8_t sfi,
1032 const uint8_t counterNumber,
1033 const int incDecValue);
1034
1039 CardTransactionManager& prepareIncreaseOrDecreaseCounters(
1040 const bool isDecreaseCommand,
1041 const uint8_t sfi,
1042 const std::map<const int, const int>& counterNumberToIncDecValueMap);
1043
1044
1045
1052 void checkControlSam() const;
1053
1058 void processSamPreparedCommands();
1059
1069 void processAtomicOpening(std::vector<std::shared_ptr<AbstractApduCommand>>& cardCommands);
1070
1075 void abortSecureSessionSilently();
1076
1088 void prepareInternalSvUndebit(const int amount,
1089 const std::vector<uint8_t>& date,
1090 const std::vector<uint8_t>& time,
1091 const bool useExtendedMode);
1092
1099 void checkSvInsideSession();
1100
1108 bool isExtendedModeAllowed() const;
1109
1119 void parseApduResponses(const std::vector<std::shared_ptr<AbstractCardCommand>>& commands,
1120 const std::vector<std::shared_ptr<ApduResponseApi>>& apduResponses);
1121
1129 void checkResponseStatusForStrictAndBestEffortMode(
1130 const std::shared_ptr<AbstractCardCommand> command,
1131 const CardCommandException& e) const;
1132
1136 friend std::ostream& operator<<(std::ostream& os, const ApduResponseAdapter& ara);
1137
1141 friend std::ostream& operator<<(std::ostream& os,
1142 const std::shared_ptr<ApduResponseAdapter> ara);
1143};
1144
1145}
1146}
1147}
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 & 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
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 & 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 & 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 & 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