19#include "IllegalStateException.h"
27using namespace keyple::core::util;
28using namespace keyple::core::util::cpp;
29using namespace keyple::core::util::cpp::exception;
32 const std::shared_ptr<CardSelectionResponseApi> cardSelectionResponse)
35 mPowerOnData = cardSelectionResponse->getPowerOnData();
36 if (mPowerOnData.empty()) {
37 throw IllegalStateException(
"ATR should not be empty.");
40 mSerialNumber = std::vector<uint8_t>(4);
46 const std::string extractRegex =
"3B(.{6}|.{10})805A(.{20})829000";
47 std::unique_ptr<Pattern> pattern = Pattern::compile(extractRegex);
50 std::unique_ptr<Matcher> matcher = pattern->matcher(mPowerOnData);
51 if (matcher->find(0)) {
52 const std::vector<uint8_t> atrSubElements = HexUtil::toByteArray(matcher->group(2));
53 mPlatform = atrSubElements[0];
54 mApplicationType = atrSubElements[1];
55 mApplicationSubType = atrSubElements[2];
56 mSoftwareIssuer = atrSubElements[3];
57 mSoftwareVersion = atrSubElements[4];
58 mSoftwareRevision = atrSubElements[5];
61 switch (mApplicationSubType) {
63 mSamProductType = mSoftwareIssuer == 0x08 ? ProductType::HSM_C1 : ProductType::SAM_C1;
68 mSamProductType = ProductType::SAM_S1DX;
71 mSamProductType = ProductType::SAM_S1E1;
74 mSamProductType = ProductType::UNKNOWN;
79 System::arraycopy(atrSubElements, 6, mSerialNumber, 0, 4);
82 ss <<
"SAM " << mSamProductType <<
", "
83 <<
"PLATFORM = " << mPlatform <<
", "
84 <<
"APPTYPE = " << mApplicationType <<
"h, "
85 <<
"APPSUBTYPE = " << mApplicationSubType <<
"h, "
86 <<
"SWISSUER = " << mSoftwareIssuer <<
"h, "
87 <<
"SWVERSION = " << mSoftwareVersion <<
"h, "
88 <<
"SWREVISION = " << mSoftwareRevision;
89 mLogger->trace(
"%\n", ss.str());
90 mLogger->trace(
"SAM SERIALNUMBER = %\n", HexUtil::toHex(mSerialNumber));
94 mSamProductType = ProductType::UNKNOWN;
97 mApplicationSubType = 0;
100 mSoftwareRevision = 0;
107 if (type == CalypsoSam::ProductType::SAM_S1DX ||
108 type == CalypsoSam::ProductType::CSAM_F) {
122 switch (mSamProductType) {
123 case CalypsoSam::ProductType::SAM_C1:
124 case CalypsoSam::ProductType::HSM_C1:
126 case CalypsoSam::ProductType::SAM_S1DX:
128 case CalypsoSam::ProductType::SAM_S1E1:
130 case CalypsoSam::ProductType::CSAM_F:
139 return std::vector<uint8_t>(0);
149 return mSamProductType;
154 std::stringstream ss;
162 return mSerialNumber;
172 return mApplicationType;
177 return mApplicationSubType;
182 return mSoftwareIssuer;
187 return mSoftwareVersion;
192 return mSoftwareRevision;
197 mEventCounters.insert({eventCounterNumber, eventCounterValue});
202 mEventCeilings.insert({eventCeilingNumber, eventCeilingValue});
uint8_t getApplicationType() const override
uint8_t getClassByte() const
uint8_t getPlatform() const override
const std::vector< uint8_t > & getSerialNumber() const override
uint8_t getSoftwareVersion() const override
uint8_t getApplicationSubType() const override
void putEventCounter(const int eventCounterNumber, const int eventCounterValue)
const std::string & getPowerOnData() const override
int getMaxDigestDataLength() const
CalypsoSamAdapter(const std::shared_ptr< CardSelectionResponseApi > cardSelectionResponse)
uint8_t getSoftwareRevision() const override
uint8_t getSoftwareIssuer() const override
const std::vector< uint8_t > getSelectApplicationResponse() const override
const std::string getProductInfo() const override
void putEventCeiling(const int eventCeilingNumber, const int eventCeilingValue)
CalypsoSam::ProductType getProductType() const override
CalypsoSam::ProductType ProductType