32using namespace keyple::core::util;
33using namespace keyple::core::util::cpp;
35const std::map<const int, const std::shared_ptr<StatusProperties>>
36 CmdSamPsoVerifySignature::STATUS_TABLE = initStatusTable();
40 const std::shared_ptr<TraceableSignatureVerificationDataAdapter> data)
46 const uint8_t p1 = 0x00;
47 const uint8_t p2 = 0xA8;
50 const int messageOffset = data->isSamTraceabilityMode() ? 6 : 4;
51 const int messageSize =
static_cast<int>(data->getData().size());
52 const int signatureSize =
static_cast<int>(data->getSignature().size());
53 std::vector<uint8_t> dataIn(
static_cast<uint64_t
>(messageOffset) +
54 static_cast<uint64_t
>(messageSize) +
55 static_cast<uint64_t
>(signatureSize));
61 dataIn[1] = data->getKif();
62 dataIn[2] = data->getKvc();
69 if (data->isSamTraceabilityMode()) {
70 if (data->isPartialSamSerialNumber()) {
76 if (data->isBusyMode()) {
82 opMode |= signatureSize;
86 if (data->isSamTraceabilityMode()) {
87 dataIn[4] =
static_cast<uint8_t
>(data->getTraceabilityOffset() >> 8);
88 dataIn[5] =
static_cast<uint8_t
>(data->getTraceabilityOffset());
92 System::arraycopy(data->getData(), 0, dataIn, messageOffset, messageSize);
95 System::arraycopy(data->getSignature(),
98 dataIn.size() - signatureSize,
101 setApduRequest(std::make_shared<ApduRequestAdapter>(ApduUtil::build(cla, ins, p1, p2, dataIn)));
105 const std::shared_ptr<ApduResponseApi> apduResponse)
110 mData->setSignatureValid(
true);
111 }
else if (apduResponse->getStatusWord() == 0x6988) {
112 mData->setSignatureValid(
false);
118const std::map<const int, const std::shared_ptr<StatusProperties>>&
124const std::map<const int, const std::shared_ptr<StatusProperties>>
125 CmdSamPsoVerifySignature::initStatusTable()
127 std::map<const int, const std::shared_ptr<StatusProperties>> m =
131 std::make_shared<StatusProperties>(
"Busy status: the command is temporarily" \
135 std::make_shared<StatusProperties>(
"Preconditions not satisfied.",
136 typeid(CalypsoSamAccessForbiddenException))});
138 std::make_shared<StatusProperties>(
"Incorrect signature.",
139 typeid(CalypsoSamSecurityDataException))});
141 std::make_shared<StatusProperties>(
"Incorrect parameters in incoming data.",
142 typeid(CalypsoSamIncorrectInputDataException))});
144 std::make_shared<StatusProperties>(
"Record not found: signing key not found.",
145 typeid(CalypsoSamDataAccessException))});
147 std::make_shared<StatusProperties>(
"Incorrect P1 or P2.",
148 typeid(CalypsoSamIllegalParameterException))});
virtual bool isSuccessful() const final
virtual void setApduRequest(const std::shared_ptr< ApduRequestAdapter > apduRequest) final
AbstractSamCommand & setApduResponse(const std::shared_ptr< ApduResponseApi > apduResponse) override
static const std::map< const int, const std::shared_ptr< StatusProperties > > STATUS_TABLE
const CalypsoSamCommand & getCommandRef() const override
uint8_t getInstructionByte() const override
CmdSamPsoVerifySignature(const CalypsoSam::ProductType productType, const std::shared_ptr< TraceableSignatureVerificationDataAdapter > data)
const std::map< const int, const std::shared_ptr< StatusProperties > > & getStatusTable() const override
AbstractSamCommand & setApduResponse(const std::shared_ptr< ApduResponseApi > apduResponse) override
static uint8_t getClassByte(const ProductType productType)
CalypsoSam::ProductType ProductType