Keyple Card Calypso C++ Library 2.1.0
Reference Terminal Reader API for C++
CardTransactionManagerAdapter.h
Go to the documentation of this file.
1/**************************************************************************************************
2 * Copyright (c) 2021 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 "SearchCommandData.h"
23#include "SvAction.h"
24#include "WriteAccessLevel.h"
25
26/* Calypsonet Terminal Card */
27#include "ApduResponseApi.h"
28#include "ChannelControl.h"
29#include "ProxyReaderApi.h"
30
31/* Keyple Card Calypso */
32#include "CalypsoCardAdapter.h"
33#include "CardCommandManager.h"
34#include "SamCommandProcessor.h"
35
36/* Keyple Core Util */
37#include "LoggerFactory.h"
38
39namespace keyple {
40namespace card {
41namespace calypso {
42
43using namespace calypsonet::terminal::calypso;
44using namespace calypsonet::terminal::calypso::transaction;
45using namespace calypsonet::terminal::card;
46using namespace keyple::core::util::cpp;
47
75class CardTransactionManagerAdapter final : public CardTransactionManager {
76public:
80 enum class SessionState {
85
90
95 };
96
107 CardTransactionManagerAdapter(const std::shared_ptr<CardReader> cardReader,
108 const std::shared_ptr<CalypsoCard> calypsoCard,
109 const std::shared_ptr<CardSecuritySetting> cardSecuritySetting);
110
118 CardTransactionManagerAdapter(const std::shared_ptr<CardReader> cardReader,
119 const std::shared_ptr<CalypsoCard> calypsoCard);
120
126 const std::shared_ptr<CardReader> getCardReader() const override;
127
133 const std::shared_ptr<CalypsoCard> getCalypsoCard() const override;
134
140 const std::shared_ptr<CardSecuritySetting> getCardSecuritySetting() const override;
141
147 const std::string getTransactionAuditData() const override;
148
154 CardTransactionManager& processOpening(const WriteAccessLevel writeAccessLevel) final;
155
161 CardTransactionManager& processCardCommands() final;
162
168 CardTransactionManager& processClosing() final;
169
175 CardTransactionManager& processCancel() final;
176
182 CardTransactionManager& processVerifyPin(const std::vector<uint8_t>& pin) final;
188 CardTransactionManager& processChangePin(const std::vector<uint8_t>& newPin) override;
189
195 CardTransactionManager& processChangeKey(const uint8_t keyIndex,
196 const uint8_t newKif,
197 const uint8_t newKvc,
198 const uint8_t issuerKif,
199 const uint8_t issuerKvc) override;
200
206 CardTransactionManager& prepareReleaseCardChannel() final;
207
214 CardTransactionManager& prepareSelectFile(const std::vector<uint8_t>& lid) final;
215
221 CardTransactionManager& prepareSelectFile(const uint16_t lid) override;
222
228 CardTransactionManager& prepareSelectFile(const SelectFileControl selectFileControl) final;
229
235 CardTransactionManager& prepareGetData(const GetDataTag tag) override;
236
243 CardTransactionManager& prepareReadRecordFile(const uint8_t sfi, const uint8_t recordNumber)
244 final;
245
252 CardTransactionManager& prepareReadRecordFile(const uint8_t sfi,
253 const uint8_t firstRecordNumber,
254 const uint8_t numberOfRecords,
255 const uint8_t recordSize) final;
256
263 CardTransactionManager& prepareReadCounterFile(const uint8_t sfi, const uint8_t countersNumber)
264 final;
265
271 CardTransactionManager& prepareReadRecord(const uint8_t sfi, const uint8_t recordNumber)
272 override;
273
279 CardTransactionManager& prepareReadRecords(const uint8_t sfi,
280 const uint8_t fromRecordNumber,
281 const uint8_t toRecordNumber,
282 const uint8_t recordSize) override;
283
289 CardTransactionManager& prepareReadRecordsPartially(const uint8_t sfi,
290 const uint8_t fromRecordNumber,
291 const uint8_t toRecordNumber,
292 const uint8_t offset,
293 const uint8_t nbBytesToRead) override;
294
300 CardTransactionManager& prepareReadBinary(const uint8_t sfi,
301 const uint8_t offset,
302 const uint8_t nbBytesToRead) override;
303
309 CardTransactionManager& prepareReadCounter(const uint8_t sfi, const uint8_t nbCountersToRead)
310 override;
311
317 CardTransactionManager& prepareSearchRecords(const std::shared_ptr<SearchCommandData> data)
318 override;
319
325 CardTransactionManager& prepareAppendRecord(const uint8_t sfi,
326 const std::vector<uint8_t>& recordData) final;
327
333 CardTransactionManager& prepareUpdateRecord(const uint8_t sfi,
334 const uint8_t recordNumber,
335 const std::vector<uint8_t>& recordData) final;
336
342 CardTransactionManager& prepareWriteRecord(const uint8_t sfi,
343 const uint8_t recordNumber,
344 const std::vector<uint8_t>& recordData) final;
345
351 CardTransactionManager& prepareUpdateBinary(const uint8_t sfi,
352 const uint8_t offset,
353 const std::vector<uint8_t>& data) final;
354
360 CardTransactionManager& prepareWriteBinary(const uint8_t sfi,
361 const uint8_t offset,
362 const std::vector<uint8_t>& data) final;
363
369 CardTransactionManager& prepareIncreaseCounter(const uint8_t sfi,
370 const uint8_t counterNumber,
371 const int incValue) final;
372
378 CardTransactionManager& prepareDecreaseCounter(const uint8_t sfi,
379 const uint8_t counterNumber,
380 const int decValue) final;
381
387 CardTransactionManager& prepareDecreaseCounters(
388 const uint8_t sfi,
389 const std::map<const int, const int>& counterNumberToDecValueMap) final;
390
396 CardTransactionManager& prepareIncreaseCounters(
397 const uint8_t sfi,
398 const std::map<const int, const int>& counterNumberToIncValueMap) final;
399
405 CardTransactionManager& prepareSetCounter(const uint8_t sfi,
406 const uint8_t counterNumber,
407 const int newValue) final;
408
414 CardTransactionManager& prepareCheckPinStatus() final;
415
421 CardTransactionManager& prepareSvGet(const SvOperation svOperation, const SvAction svAction)
422 final;
423
429 CardTransactionManager& prepareSvReload(const int amount,
430 const std::vector<uint8_t>& date,
431 const std::vector<uint8_t>& time,
432 const std::vector<uint8_t>& free) final;
433
439 CardTransactionManager& prepareSvReload(const int amount) final;
440
446 CardTransactionManager& prepareSvDebit(const int amount,
447 const std::vector<uint8_t>& date,
448 const std::vector<uint8_t>& time) final;
449
455 CardTransactionManager& prepareSvDebit(const int amount) final;
456
462 CardTransactionManager& prepareSvReadAllLogs() final;
463
469 CardTransactionManager& prepareInvalidate() final;
470
476 CardTransactionManager& prepareRehabilitate() final;
477
481 friend std::ostream& operator<<(std::ostream& os, const SessionState ss);
482
483
484private:
489 class ApduResponseAdapter final : public ApduResponseApi {
490 public:
495
499 ApduResponseAdapter(const std::vector<uint8_t>& apdu);
500
504 const std::vector<uint8_t>& getApdu() const override;
505
509 const std::vector<uint8_t> getDataOut() const override;
510
514 int getStatusWord() const override;
515
516 private:
520 const std::vector<uint8_t> mApdu;
521
525 const int mStatusWord;
526 };
527
531 const std::unique_ptr<Logger> mLogger =
532 LoggerFactory::getLogger(typeid(CardTransactionManagerAdapter));
533
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;
550
555 static const int SESSION_BUFFER_CMD_ADDITIONAL_COST;
556 static const int APDU_HEADER_LENGTH;
557
561 static const std::string OFFSET;
562
566 const std::shared_ptr<ProxyReaderApi> mCardReader;
567
571 const std::shared_ptr<CardSecuritySetting> mCardSecuritySettings;
572
576 std::shared_ptr<SamCommandProcessor> mSamCommandProcessor;
577
581 const std::shared_ptr<CalypsoCardAdapter> mCalypsoCard;
582
586 SessionState mSessionState;
587
591 WriteAccessLevel mCurrentWriteAccessLevel;
592
596 int mModificationsCounter;
597
601 std::shared_ptr<CardCommandManager> mCardCommandManager;
602
606 SvAction mSvAction;
607
611 ChannelControl mChannelControl;
612
616 static const std::shared_ptr<ApduResponseApi> RESPONSE_OK;
617 static const std::shared_ptr<ApduResponseApi> RESPONSE_OK_POSTPONED;
618
625 const std::vector<std::shared_ptr<ApduRequestSpi>> getApduRequests(
626 const std::vector<std::shared_ptr<AbstractCardCommand>>& cardCommands);
627
647 void processAtomicCardCommands(
648 const std::vector<std::shared_ptr<AbstractCardCommand>> cardCommands,
649 const ChannelControl channelControl);
650
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);
708
721 void processAtomicClosing(
722 const std::vector<std::shared_ptr<AbstractCardCommand>>& cardCommands,
723 const bool isRatificationMechanismEnabled,
724 const ChannelControl channelControl);
725
736 int getCounterValue(const uint8_t sfi, const int counter);
737
748 const std::map<const int, const int> getCounterValues(const uint8_t sfi,
749 const std::vector<int>& counters);
750
760 const std::shared_ptr<ApduResponseApi> createIncreaseDecreaseResponse(
761 const bool isDecreaseCommand, const int currentCounterValue, const int incDecValue);
762
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);
776
786 const std::vector<std::shared_ptr<ApduResponseApi>> getAnticipatedResponses(
787 const std::vector<std::shared_ptr<AbstractCardCommand>>& cardCommands);
788
800 void processCardCommandsOutOfSession(const ChannelControl channelControl);
801
810 void processCardCommandsInSession();
811
822 const std::shared_ptr<CardResponseApi> safeTransmit(
823 const std::shared_ptr<CardRequestSpi> cardRequest, const ChannelControl channelControl);
824
832 const std::vector<uint8_t> getSessionTerminalChallenge();
833
841 const std::vector<uint8_t> getSessionTerminalSignature();
842
851 void checkCardSignature(const std::vector<uint8_t>& cardSignature);
852
862 void checkSvOperationStatus(const std::vector<uint8_t>& cardPostponedData);
863
869 void checkSessionOpen();
870
876 void checkSessionNotOpen();
877
886 void checkCommandsResponsesSynchronization(const size_t commandsNumber,
887 const size_t responsesNumber);
888
903 bool checkModifyingCommand(const std::shared_ptr<AbstractCardCommand> command,
904 std::atomic<bool>& overflow,
905 std::atomic<int>& neededSessionBufferSpace);
906
918 bool isSessionBufferOverflowed(const int sessionBufferSizeConsumed);
919
923 void resetModificationsBufferCounter();
924
936 CardTransactionManager& prepareUpdateOrWriteBinary(const bool isUpdateCommand,
937 const uint8_t sfi,
938 const uint8_t offset,
939 const std::vector<uint8_t>& data);
940
946 CardTransactionManager& prepareIncreaseOrDecreaseCounter(const bool isDecreaseCommand,
947 const uint8_t sfi,
948 const uint8_t counterNumber,
949 const int incDecValue);
950
956 CardTransactionManager& prepareIncreaseOrDecreaseCounters(
957 const bool isDecreaseCommand,
958 const uint8_t sfi,
959 const std::map<const int, const int>& counterNumberToIncDecValueMap);
960
970 void processAtomicOpening(
971 const WriteAccessLevel writeAccessLevel,
972 std::vector<std::shared_ptr<AbstractCardCommand>>& cardCommands);
973
984 void prepareInternalSvUndebit(const int amount,
985 const std::vector<uint8_t>& date,
986 const std::vector<uint8_t>& time);
987
999 void prepareInternalSvDebit(const int amount,
1000 const std::vector<uint8_t>& date,
1001 const std::vector<uint8_t>& time);
1002
1006 friend std::ostream& operator<<(std::ostream& os, const ApduResponseAdapter& ara);
1007
1011 friend std::ostream& operator<<(std::ostream& os,
1012 const std::shared_ptr<ApduResponseAdapter> ara);
1013};
1014
1015}
1016}
1017}
const std::shared_ptr< CalypsoCard > getCalypsoCard() const override
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
const std::shared_ptr< CardSecuritySetting > getCardSecuritySetting() const override
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)
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
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 & 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 & 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 & prepareDecreaseCounters(const uint8_t sfi, const std::map< const int, const int > &counterNumberToDecValueMap) final