15#include "keyple/card/calypso/CommandGetDataCertificate.hpp"
22#include "keyple/card/calypso/CalypsoCardAdapter.hpp"
23#include "keyple/card/calypso/CalypsoCardConstant.hpp"
24#include "keyple/card/calypso/CardDataAccessException.hpp"
25#include "keyple/core/util/ApduUtil.hpp"
26#include "keyple/core/util/cpp/Arrays.hpp"
27#include "keyple/core/util/cpp/System.hpp"
33using keyple::core::util::ApduUtil;
34using keyple::core::util::cpp::Arrays;
35using keyple::core::util::cpp::System;
37const std::map<int, const std::shared_ptr<Command::StatusProperties>>
38 CommandGetDataCertificate::STATUS_TABLE = [] {
39 std::map<int, const std::shared_ptr<Command::StatusProperties>> m(
40 Command::STATUS_TABLE);
44 std::make_shared<StatusProperties>(
45 "Data object not found (optional mode not available)",
46 typeid(CardDataAccessException))},
48 std::make_shared<StatusProperties>(
49 "P1 or P2 value not supported",
50 typeid(CardDataAccessException))}});
54CommandGetDataCertificate::CommandGetDataCertificate(
55 const std::shared_ptr<DtoAdapters::TransactionContextDto>&
57 const std::shared_ptr<DtoAdapters::CommandContextDto>& commandContext,
58 bool isCardCertificate,
60: Command(CardCommandRef::GET_DATA, nullptr, transactionContext, commandContext)
61, mIsCardCertificate(isCardCertificate)
62, mIsFirstPart(isFirstPart)
64 const std::uint8_t cardClass
65 = transactionContext->getCard() !=
nullptr
66 ? transactionContext->getCard()->getCardClass().getValue()
67 : CalypsoCardClass::ISO.getValue();
72 if (isCardCertificate) {
73 p1 = CalypsoCardConstant::TAG_CARD_CERTIFICATE_MSB;
74 p2 = CalypsoCardConstant::TAG_CARD_CERTIFICATE_LSB;
76 p1 = CalypsoCardConstant::TAG_CA_CERTIFICATE_MSB;
77 p2 = CalypsoCardConstant::TAG_CA_CERTIFICATE_LSB;
86 std::make_shared<DtoAdapters::ApduRequestAdapter>(ApduUtil::build(
87 cardClass, getCommandRef().getInstructionByte(), p1, p2)));
89 if (isCardCertificate) {
90 addSubName(
"CARD_CERTIFICATE");
92 addSubName(
"CA_CERTIFICATE");
97CommandGetDataCertificate::finalizeRequest()
103CommandGetDataCertificate::isCryptoServiceRequiredToFinalizeRequest()
const
109CommandGetDataCertificate::synchronizeCryptoServiceBeforeCardProcessing()
115CommandGetDataCertificate::parseResponse(
116 std::shared_ptr<ApduResponseApi> apduResponse)
118 Command::setApduResponseAndCheckStatus(apduResponse);
120 const std::vector<std::uint8_t> dataOut = apduResponse->getDataOut();
121 std::vector<std::uint8_t> certificateBytes;
128 certificateBytes = std::vector<std::uint8_t>(
129 dataOut.size() - CalypsoCardConstant::TAG_CERTIFICATE_HEADER_SIZE);
132 CalypsoCardConstant::TAG_CERTIFICATE_HEADER_SIZE,
135 dataOut.size() - CalypsoCardConstant::TAG_CERTIFICATE_HEADER_SIZE);
141 certificateBytes = dataOut;
144 if (mIsCardCertificate) {
145 getTransactionContext()->getCard()->addCardCertificateBytes(
146 certificateBytes, mIsFirstPart);
148 getTransactionContext()->getCard()->addCaCertificateBytes(
149 certificateBytes, mIsFirstPart);
153const std::map<int, const std::shared_ptr<Command::StatusProperties>>&
154CommandGetDataCertificate::getStatusTable()
const