14#include "keyple/card/calypso/DtoAdapters.hpp"
21#include "keyple/core/util/ByteArrayUtil.hpp"
22#include "keyple/core/util/HexUtil.hpp"
23#include "keyple/core/util/cpp/KeypleStd.hpp"
24#include "keyple/core/util/cpp/System.hpp"
30using keyple::core::util::ByteArrayUtil;
31using keyple::core::util::HexUtil;
32using keyple::core::util::cpp::System;
34const int DtoAdapters::ApduRequestAdapter::DEFAULT_SUCCESSFUL_CODE = 0x9000;
35const int DtoAdapters::CardSelectionRequestAdapter::SW_DEFAULT_SUCCESSFUL
38DtoAdapters::ApduRequestAdapter::ApduRequestAdapter(
39 const std::vector<std::uint8_t>& apdu)
41, mSuccessfulStatusWords({DEFAULT_SUCCESSFUL_CODE})
45DtoAdapters::ApduRequestAdapter&
46DtoAdapters::ApduRequestAdapter::addSuccessfulStatusWord(
47 int successfulStatusWord)
49 mSuccessfulStatusWords.push_back(successfulStatusWord);
54const std::vector<int>&
55DtoAdapters::ApduRequestAdapter::getSuccessfulStatusWords()
const
57 return mSuccessfulStatusWords;
60DtoAdapters::ApduRequestAdapter&
61DtoAdapters::ApduRequestAdapter::setInfo(
const std::string& info)
69DtoAdapters::ApduRequestAdapter::getInfo()
const
74const std::vector<std::uint8_t>&
75DtoAdapters::ApduRequestAdapter::getApdu()
const
81DtoAdapters::ApduRequestAdapter::setApdu(
const std::vector<std::uint8_t>& apdu)
87operator<<(std::ostream& os,
const DtoAdapters::ApduRequestAdapter& ara)
89 os <<
"APDU_REQUEST_ADAPTER: {"
90 <<
"APDU = " << ara.getApdu() <<
", "
91 <<
"SUCCESSFUL_STATUS_WORDS = " << ara.getSuccessfulStatusWords() <<
", "
92 <<
"INFO = " << ara.getInfo() <<
"}";
100 const std::shared_ptr<DtoAdapters::ApduRequestAdapter>& ara)
102 if (ara ==
nullptr) {
103 os <<
"APDU_REQUEST_ADAPTER: {null}";
111DtoAdapters::CardRequestAdapter::CardRequestAdapter(
112 const std::vector<std::shared_ptr<ApduRequestSpi>>& apduRequests,
113 bool stopOnUnsuccessfulStatusWord)
114: mApduRequests(apduRequests)
115, mStopOnUnsuccessfulStatusWord(stopOnUnsuccessfulStatusWord)
119const std::vector<std::shared_ptr<ApduRequestSpi>>&
120DtoAdapters::CardRequestAdapter::getApduRequests()
const
122 return mApduRequests;
126DtoAdapters::CardRequestAdapter::stopOnUnsuccessfulStatusWord()
const
128 return mStopOnUnsuccessfulStatusWord;
132operator<<(std::ostream& os,
const DtoAdapters::CardRequestAdapter& cra)
134 os <<
"CARD_REQUEST_ADAPTER: {"
135 <<
"APDU_REQUESTS: {";
137 for (
const auto& apduRequest : cra.getApduRequests()) {
138 os << apduRequest <<
", ";
141 os <<
"}, STOP_ON_UNSUCCESSFUL_STATUS_WORD: "
142 << cra.stopOnUnsuccessfulStatusWord() <<
"}";
150 const std::shared_ptr<DtoAdapters::CardRequestAdapter>& cra)
152 if (cra ==
nullptr) {
153 os <<
"CARD_REQUEST_ADAPTER: {null}";
161DtoAdapters::CardSelectionRequestAdapter::CardSelectionRequestAdapter(
162 std::unique_ptr<CardRequestSpi> cardRequest)
163: mCardRequest(std::move(cardRequest))
164, mSuccessfulSelectionStatusWords({SW_DEFAULT_SUCCESSFUL})
169DtoAdapters::CardSelectionRequestAdapter::addSuccessfulSelectionStatusWord(
170 int successfulStatusWord)
172 mSuccessfulSelectionStatusWords.push_back(successfulStatusWord);
175const std::vector<int>&
176DtoAdapters::CardSelectionRequestAdapter::getSuccessfulSelectionStatusWords()
179 return mSuccessfulSelectionStatusWords;
182const std::shared_ptr<CardRequestSpi>
183DtoAdapters::CardSelectionRequestAdapter::getCardRequest()
const
190 std::ostream& os,
const DtoAdapters::CardSelectionRequestAdapter& csra)
192 os <<
"CARD_SELECTION_REQUEST_ADAPTER: {"
193 <<
"CARD_REQUEST: " << csra.getCardRequest() <<
", "
194 <<
"SUCCESSFUL_SELECTION_STATUS_WORDS: "
195 << csra.getSuccessfulSelectionStatusWords() <<
"}";
203 const std::shared_ptr<DtoAdapters::CardSelectionRequestAdapter>& csra)
205 if (csra ==
nullptr) {
206 os <<
"CARD_SELECTION_REQUEST_ADAPTER: {null}";
214DtoAdapters::SearchCommandDataAdapter::SearchCommandDataAdapter()
219, mEnableRepeatedOffset(false)
224DtoAdapters::SearchCommandDataAdapter::setSfi(std::uint8_t sfi)
232DtoAdapters::SearchCommandDataAdapter::startAtRecord(
int recordNumber)
234 mRecordNumber = recordNumber;
240DtoAdapters::SearchCommandDataAdapter::setOffset(
int offset)
248DtoAdapters::SearchCommandDataAdapter::enableRepeatedOffset()
250 mEnableRepeatedOffset =
true;
256DtoAdapters::SearchCommandDataAdapter::setSearchData(
257 const std::vector<std::uint8_t>& data)
265DtoAdapters::SearchCommandDataAdapter::setMask(
266 const std::vector<std::uint8_t>& mask)
274DtoAdapters::SearchCommandDataAdapter::fetchFirstMatchingResult()
276 mFetchFirstMatchingResult =
true;
282DtoAdapters::SearchCommandDataAdapter::getMatchingRecordNumbers()
284 return mMatchingRecordNumbers;
288DtoAdapters::SearchCommandDataAdapter::getSfi()
const
294DtoAdapters::SearchCommandDataAdapter::getRecordNumber()
const
296 return mRecordNumber;
300DtoAdapters::SearchCommandDataAdapter::getOffset()
const
306DtoAdapters::SearchCommandDataAdapter::isEnableRepeatedOffset()
const
308 return mEnableRepeatedOffset;
311const std::vector<std::uint8_t>&
312DtoAdapters::SearchCommandDataAdapter::getSearchData()
const
317const std::vector<std::uint8_t>&
318DtoAdapters::SearchCommandDataAdapter::getMask()
const
324DtoAdapters::SearchCommandDataAdapter::isFetchFirstMatchingResult()
const
326 return mFetchFirstMatchingResult;
329const std::vector<std::uint8_t>&
330DtoAdapters::SvCommandSecurityDataApiAdapter::getSvGetRequest()
const
332 return mSvGetRequest;
335const std::vector<std::uint8_t>&
336DtoAdapters::SvCommandSecurityDataApiAdapter::getSvGetResponse()
const
338 return mSvGetResponse;
341const std::vector<std::uint8_t>&
342DtoAdapters::SvCommandSecurityDataApiAdapter::getSvCommandPartialRequest()
const
344 return mSvCommandPartialRequest;
347DtoAdapters::SvCommandSecurityDataApiAdapter&
348DtoAdapters::SvCommandSecurityDataApiAdapter::setSerialNumber(
349 const std::vector<std::uint8_t>& serialNumber)
351 mSerialNumber = serialNumber;
356DtoAdapters::SvCommandSecurityDataApiAdapter&
357DtoAdapters::SvCommandSecurityDataApiAdapter::setTransactionNumber(
358 const std::vector<std::uint8_t>& transactionNumber)
360 mTransactionNumber = transactionNumber;
365DtoAdapters::SvCommandSecurityDataApiAdapter&
366DtoAdapters::SvCommandSecurityDataApiAdapter::setTerminalChallenge(
367 const std::vector<std::uint8_t>& terminalChallenge)
369 mTerminalChallenge = terminalChallenge;
374DtoAdapters::SvCommandSecurityDataApiAdapter&
375DtoAdapters::SvCommandSecurityDataApiAdapter::setTerminalSvMac(
376 const std::vector<std::uint8_t>& terminalSvMac)
378 mTerminalSvMac = terminalSvMac;
383SvCommandSecurityDataApi&
384DtoAdapters::SvCommandSecurityDataApiAdapter::setSvGetRequest(
385 const std::vector<std::uint8_t>& svGetRequest)
387 mSvGetRequest = svGetRequest;
391SvCommandSecurityDataApi&
392DtoAdapters::SvCommandSecurityDataApiAdapter::setSvGetResponse(
393 const std::vector<std::uint8_t>& svGetResponse)
395 mSvGetResponse = svGetResponse;
399SvCommandSecurityDataApi&
400DtoAdapters::SvCommandSecurityDataApiAdapter::setSvCommandPartialRequest(
401 const std::vector<std::uint8_t>& svCommandPartialRequest)
403 mSvCommandPartialRequest = svCommandPartialRequest;
408const std::vector<std::uint8_t>&
409DtoAdapters::SvCommandSecurityDataApiAdapter::getSerialNumber()
const
411 return mSerialNumber;
414const std::vector<std::uint8_t>&
415DtoAdapters::SvCommandSecurityDataApiAdapter::getTransactionNumber()
const
417 return mTransactionNumber;
420const std::vector<std::uint8_t>&
421DtoAdapters::SvCommandSecurityDataApiAdapter::getTerminalChallenge()
const
423 return mTerminalChallenge;
426const std::vector<std::uint8_t>&
427DtoAdapters::SvCommandSecurityDataApiAdapter::getTerminalSvMac()
const
429 return mTerminalSvMac;
432DtoAdapters::SvDebitLogRecordAdapter::SvDebitLogRecordAdapter(
433 const std::vector<std::uint8_t>& cardResponse,
int offset)
435, mCardResponse(cardResponse)
439const std::vector<std::uint8_t>&
440DtoAdapters::SvDebitLogRecordAdapter::getRawData()
const
442 return mCardResponse;
446DtoAdapters::SvDebitLogRecordAdapter::getAmount()
const
448 return ByteArrayUtil::extractInt(mCardResponse, mOffset, 2,
true);
452DtoAdapters::SvDebitLogRecordAdapter::getBalance()
const
454 return ByteArrayUtil::extractInt(mCardResponse, mOffset + 14, 3,
true);
457std::vector<std::uint8_t>
458DtoAdapters::SvDebitLogRecordAdapter::getDebitTime()
const
460 std::vector<std::uint8_t> time(2);
462 time[0] = mCardResponse[mOffset + 4];
463 time[1] = mCardResponse[mOffset + 5];
468std::vector<std::uint8_t>
469DtoAdapters::SvDebitLogRecordAdapter::getDebitDate()
const
471 std::vector<std::uint8_t> date(2);
473 date[0] = mCardResponse[mOffset + 2];
474 date[1] = mCardResponse[mOffset + 3];
480DtoAdapters::SvDebitLogRecordAdapter::getKvc()
const
482 return mCardResponse[mOffset + 6];
485std::vector<std::uint8_t>
486DtoAdapters::SvDebitLogRecordAdapter::getSamId()
const
488 std::vector<std::uint8_t> samId(4);
490 System::arraycopy(mCardResponse, mOffset + 7, samId, 0, 4);
496DtoAdapters::SvDebitLogRecordAdapter::getSvTNum()
const
498 std::vector<std::uint8_t> tnNum(2);
500 tnNum[0] = mCardResponse[mOffset + 17];
501 tnNum[1] = mCardResponse[mOffset + 18];
503 return ByteArrayUtil::extractInt(tnNum, 0, 2,
false);
507DtoAdapters::SvDebitLogRecordAdapter::getSamTNum()
const
509 std::vector<std::uint8_t> samTNum(3);
511 System::arraycopy(mCardResponse, mOffset + 11, samTNum, 0, 3);
513 return ByteArrayUtil::extractInt(samTNum, 0, 3,
false);
517operator<<(std::ostream& os,
const DtoAdapters::SvDebitLogRecordAdapter& sdlra)
519 os <<
"SV_DEBIT_LOG_RECORD_ADAPTER: {"
520 <<
"AMOUNT: " << sdlra.getAmount() <<
", "
521 <<
"BALANCE: " << sdlra.getBalance() <<
", "
522 <<
"DEBIT_DATE: " << HexUtil::toHex(sdlra.getDebitDate()) <<
", "
523 <<
"DEBIT_TIME: " << HexUtil::toHex(sdlra.getDebitTime()) <<
", "
524 <<
"KVC: " << HexUtil::toHex(sdlra.getKvc()) <<
", "
525 <<
"SAM_ID: " << HexUtil::toHex(sdlra.getSamId()) <<
", "
526 <<
"SV_TRANSACTION_NUMBER: " << sdlra.getSvTNum() <<
", "
527 <<
"SAM_TRANSACTION_NUMBER: " << sdlra.getSamTNum() <<
"}";
535 const std::shared_ptr<DtoAdapters::SvDebitLogRecordAdapter>& sdlra)
537 if (sdlra ==
nullptr) {
538 os <<
"SV_DEBIT_LOG_RECORD_ADAPTER: {null}";
546DtoAdapters::SvLoadLogRecordAdapter::SvLoadLogRecordAdapter(
547 const std::vector<std::uint8_t>& cardResponse,
int offset)
549, mCardResponse(cardResponse)
553const std::vector<std::uint8_t>&
554DtoAdapters::SvLoadLogRecordAdapter::getRawData()
const
556 return mCardResponse;
560DtoAdapters::SvLoadLogRecordAdapter::getAmount()
const
562 return ByteArrayUtil::extractInt(mCardResponse, mOffset + 8, 3,
true);
566DtoAdapters::SvLoadLogRecordAdapter::getBalance()
const
568 return ByteArrayUtil::extractInt(mCardResponse, mOffset + 5, 3,
true);
571std::vector<std::uint8_t>
572DtoAdapters::SvLoadLogRecordAdapter::getLoadTime()
const
574 std::vector<std::uint8_t> time(2);
576 time[0] = mCardResponse[mOffset + 11];
577 time[1] = mCardResponse[mOffset + 12];
582std::vector<std::uint8_t>
583DtoAdapters::SvLoadLogRecordAdapter::getLoadDate()
const
585 std::vector<std::uint8_t> date(2);
587 date[0] = mCardResponse[mOffset];
588 date[1] = mCardResponse[mOffset + 1];
593std::vector<std::uint8_t>
594DtoAdapters::SvLoadLogRecordAdapter::getFreeData()
const
596 std::vector<std::uint8_t> free(2);
598 free[0] = mCardResponse[mOffset + 2];
599 free[1] = mCardResponse[mOffset + 4];
605DtoAdapters::SvLoadLogRecordAdapter::getKvc()
const
607 return mCardResponse[mOffset + 3];
610std::vector<std::uint8_t>
611DtoAdapters::SvLoadLogRecordAdapter::getSamId()
const
613 std::vector<std::uint8_t> samId(4);
615 System::arraycopy(mCardResponse, mOffset + 13, samId, 0, 4);
621DtoAdapters::SvLoadLogRecordAdapter::getSvTNum()
const
623 std::vector<std::uint8_t> tnNum(2);
625 tnNum[0] = mCardResponse[mOffset + 20];
626 tnNum[1] = mCardResponse[mOffset + 21];
628 return ByteArrayUtil::extractInt(tnNum, 0, 2,
false);
632DtoAdapters::SvLoadLogRecordAdapter::getSamTNum()
const
634 std::vector<std::uint8_t> samTNum(3);
636 System::arraycopy(mCardResponse, mOffset + 17, samTNum, 0, 3);
638 return ByteArrayUtil::extractInt(samTNum, 0, 3,
false);
642operator<<(std::ostream& os,
const DtoAdapters::SvLoadLogRecordAdapter& sllra)
644 os <<
"SV_LOAD_LOG_RECORD_ADAPTER: {"
645 <<
"AMOUNT: " << sllra.getAmount() <<
", "
646 <<
"BALANCE: " << sllra.getBalance() <<
", "
647 <<
"LOAD_DATE: " << HexUtil::toHex(sllra.getLoadDate()) <<
", "
648 <<
"LOAD_TIME: " << HexUtil::toHex(sllra.getLoadTime()) <<
", "
649 <<
"FREE_BYTES: " << HexUtil::toHex(sllra.getFreeData()) <<
", "
650 <<
"KVC: " << HexUtil::toHex(sllra.getKvc()) <<
", "
651 <<
"SAM_ID: " << HexUtil::toHex(sllra.getSamId()) <<
", "
652 <<
"SV_TRANSACTION_NUMBER: " << sllra.getSvTNum() <<
", "
653 <<
"SAM_TRANSACTION_NUMBER: " << sllra.getSamTNum() <<
"}";
661 const std::shared_ptr<DtoAdapters::SvLoadLogRecordAdapter>& sllra)
663 if (sllra ==
nullptr) {
664 os <<
"SV_LOAD_LOG_RECORD_ADAPTER: {null}";
672DtoAdapters::CommandContextDto::CommandContextDto(
673 bool isSecureSessionOpen,
bool isEncryptionActive)
674: mIsSecureSessionOpen(isSecureSessionOpen)
675, mIsEncryptionActive(isEncryptionActive)
680DtoAdapters::CommandContextDto::isSecureSessionOpen()
const
682 return mIsSecureSessionOpen;
686DtoAdapters::CommandContextDto::isEncryptionActive()
const
688 return mIsEncryptionActive;
691DtoAdapters::TransactionContextDto::TransactionContextDto(
692 std::shared_ptr<CalypsoCardAdapter> card,
693 std::shared_ptr<SymmetricCryptoCardTransactionManagerSpi>
694 symmetricCryptoCardTransactionManagerSpi)
696, mSymmetricCryptoCardTransactionManagerSpi(
697 symmetricCryptoCardTransactionManagerSpi)
698, mAsymmetricCryptoCardTransactionManagerSpi(nullptr)
699, mIsSecureSessionOpen(false)
703DtoAdapters::TransactionContextDto::TransactionContextDto(
704 std::shared_ptr<CalypsoCardAdapter> card,
705 std::shared_ptr<AsymmetricCryptoCardTransactionManagerSpi>
706 asymmetricCryptoCardTransactionManagerSpi)
708, mSymmetricCryptoCardTransactionManagerSpi(nullptr)
709, mAsymmetricCryptoCardTransactionManagerSpi(
710 asymmetricCryptoCardTransactionManagerSpi)
711, mIsSecureSessionOpen(false)
715DtoAdapters::TransactionContextDto::TransactionContextDto(
716 std::shared_ptr<CalypsoCardAdapter> card)
718, mSymmetricCryptoCardTransactionManagerSpi(nullptr)
719, mAsymmetricCryptoCardTransactionManagerSpi(nullptr)
720, mIsSecureSessionOpen(false)
724DtoAdapters::TransactionContextDto::TransactionContextDto()
726, mSymmetricCryptoCardTransactionManagerSpi(nullptr)
727, mAsymmetricCryptoCardTransactionManagerSpi(nullptr)
728, mIsSecureSessionOpen(false)
732std::shared_ptr<CalypsoCardAdapter>
733DtoAdapters::TransactionContextDto::getCard()
const
738std::shared_ptr<SymmetricCryptoCardTransactionManagerSpi>
739DtoAdapters::TransactionContextDto ::
740 getSymmetricCryptoCardTransactionManagerSpi()
const
742 return mSymmetricCryptoCardTransactionManagerSpi;
745std::shared_ptr<AsymmetricCryptoCardTransactionManagerSpi>
746DtoAdapters::TransactionContextDto ::
747 getAsymmetricCryptoCardTransactionManagerSpi()
const
749 return mAsymmetricCryptoCardTransactionManagerSpi;
753DtoAdapters::TransactionContextDto::isSecureSessionOpen()
const
755 return mIsSecureSessionOpen;
759DtoAdapters::TransactionContextDto::isPkiMode()
const
761 return mAsymmetricCryptoCardTransactionManagerSpi !=
nullptr;
765DtoAdapters::TransactionContextDto::setCard(
766 std::shared_ptr<CalypsoCardAdapter> card)
772DtoAdapters::TransactionContextDto::setSecureSessionOpen(
773 bool isSecureSessionOpen)
775 mIsSecureSessionOpen = isSecureSessionOpen;
std::ostream & operator<<(std::ostream &os, const std::shared_ptr< DtoAdapters::SvLoadLogRecordAdapter > &sllra)