Keyple Card Calypso C++ Library 2.1.0
Reference Terminal Reader API for C++
CardSecuritySettingAdapter.cpp
Go to the documentation of this file.
1/**************************************************************************************************
2 * Copyright (c) 2022 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
14
15/* Keyple Core Util */
16#include "Arrays.h"
17#include "KeypleAssert.h"
18
19namespace keyple {
20namespace card {
21namespace calypso {
22
23using namespace keyple::core::util;
24using namespace keyple::core::util::cpp;
25
27
28const std::string CardSecuritySettingAdapter::WRITE_ACCESS_LEVEL = "writeAccessLevel";
29
31: mIsMultipleSessionEnabled(false),
32 mIsRatificationMechanismEnabled(false),
33 mIsPinPlainTransmissionEnabled(false),
34 mIsTransactionAuditEnabled(false),
35 mIsSvLoadAndDebitLogEnabled(false),
36 mIsSvNegativeBalanceAuthorized(false) {}
37
39 const std::shared_ptr<CardReader> samReader, const std::shared_ptr<CalypsoSam> calypsoSam)
40{
41
42 Assert::getInstance().notNull(samReader, "samReader")
43 .notNull(calypsoSam, "calypsoSam")
44 .isTrue(calypsoSam->getProductType() != ProductType::UNKNOWN, "productType");
45
46 mSamReader = samReader;
47 mCalypsoSam = calypsoSam;
48
49 return *this;
50}
51
53{
54 mIsMultipleSessionEnabled = true;
55
56 return *this;
57}
58
60{
61 mIsRatificationMechanismEnabled = true;
62
63 return *this;
64}
65
67{
68 mIsPinPlainTransmissionEnabled = true;
69
70 return *this;
71}
72
74{
75 mIsTransactionAuditEnabled = true;
76
77 return *this;
78}
79
81{
82 mIsSvLoadAndDebitLogEnabled = true;
83
84 return *this;
85}
86
88{
89 mIsSvNegativeBalanceAuthorized = true;
90
91 return *this;
92}
93
95 const WriteAccessLevel writeAccessLevel, const uint8_t kvc, const uint8_t kif)
96{
97 /* Map will be auto-created if not existing */
98 mKifMap[writeAccessLevel].insert({kvc, kif});
99
100 return *this;
101}
102
104 const WriteAccessLevel writeAccessLevel, const uint8_t kif)
105{
106 mDefaultKifMap.insert({writeAccessLevel, kif});
107
108 return *this;
109}
110
112 const WriteAccessLevel writeAccessLevel, const uint8_t kvc)
113{
114 mDefaultKvcMap.insert({writeAccessLevel, kvc});
115
116 return *this;
117}
118
120 const uint8_t kvc)
121{
122 mAuthorizedSessionKeys.push_back(((kif << 8) & 0xff00) | (kvc & 0x00ff));
123
124 return *this;
125}
126
128 const uint8_t kvc)
129{
130 mAuthorizedSvKeys.push_back(((kif << 8) & 0xff00) | (kvc & 0x00ff));
131
132 return *this;
133}
134
136 const uint8_t kif, const uint8_t kvc)
137{
138 mPinVerificationCipheringKif = std::make_shared<uint8_t>(kif);
139 mPinVerificationCipheringKvc = std::make_shared<uint8_t>(kvc);
140
141 return *this;
142}
143
145 const uint8_t kif, const uint8_t kvc)
146{
147 mPinModificationCipheringKif = std::make_shared<uint8_t>(kif);
148 mPinModificationCipheringKvc = std::make_shared<uint8_t>(kvc);
149
150 return *this;
151}
152
153std::shared_ptr<CardReader> CardSecuritySettingAdapter::getSamReader() const
154{
155 return mSamReader;
156}
157
158std::shared_ptr<CalypsoSam> CardSecuritySettingAdapter::getCalypsoSam() const
159{
160 return mCalypsoSam;
161}
162
164{
165 return mIsMultipleSessionEnabled;
166}
167
169{
170 return mIsRatificationMechanismEnabled;
171}
172
174{
175 return mIsPinPlainTransmissionEnabled;
176}
177
179{
180 return mIsTransactionAuditEnabled;
181}
182
184{
185 return mIsSvLoadAndDebitLogEnabled;
186}
187
189{
190 return mIsSvNegativeBalanceAuthorized;
191}
192
193const std::shared_ptr<uint8_t> CardSecuritySettingAdapter::getKif(
194 const WriteAccessLevel writeAccessLevel, const uint8_t kvc) const
195{
196 const auto it = mKifMap.find(writeAccessLevel);
197 if (it == mKifMap.end()) {
198 return nullptr;
199 } else {
200 const auto itt = it->second.find(kvc);
201 if (itt == it->second.end()) {
202 return nullptr;
203 } else {
204 return std::make_shared<uint8_t>(itt->second);
205 }
206 }
207}
208
209const std::shared_ptr<uint8_t> CardSecuritySettingAdapter::getDefaultKif(
210 const WriteAccessLevel writeAccessLevel) const
211{
212 const auto it = mDefaultKifMap.find(writeAccessLevel);
213 if (it == mDefaultKifMap.end()) {
214 return nullptr;
215 } else {
216 return std::make_shared<uint8_t>(it->second);
217 }
218}
219
220const std::shared_ptr<uint8_t> CardSecuritySettingAdapter::getDefaultKvc(
221 const WriteAccessLevel writeAccessLevel) const
222{
223 const auto it = mDefaultKvcMap.find(writeAccessLevel);
224 if (it == mDefaultKvcMap.end()) {
225 return nullptr;
226 } else {
227 return std::make_shared<uint8_t>(it->second);
228 }
229}
230
231bool CardSecuritySettingAdapter::isSessionKeyAuthorized(const std::shared_ptr<uint8_t> kif,
232 const std::shared_ptr<uint8_t> kvc) const
233{
234 if (kif == nullptr || kvc == nullptr) {
235 return false;
236 }
237
238 if (mAuthorizedSessionKeys.empty()) {
239 return true;
240 }
241
242 return Arrays::contains(mAuthorizedSessionKeys,
243 ((*kif.get() << 8) & 0xff00) | (*kvc.get() & 0x00ff));
244}
245
246bool CardSecuritySettingAdapter::isSvKeyAuthorized(const std::shared_ptr<uint8_t> kif,
247 const std::shared_ptr<uint8_t> kvc) const
248{
249 if (kif == nullptr || kvc == nullptr) {
250 return false;
251 }
252
253 if (mAuthorizedSvKeys.empty()) {
254 return true;
255 }
256
257 return Arrays::contains(mAuthorizedSvKeys,
258 ((*kif.get() << 8) & 0xff00) | (*kvc.get() & 0x00ff));
259}
260
262{
263 return mPinVerificationCipheringKif;
264}
265
267{
268 return mPinVerificationCipheringKvc;
269}
270
272{
273 return mPinModificationCipheringKif;
274}
275
277{
278 return mPinModificationCipheringKvc;
279}
280
281}
282}
283}
CardSecuritySettingAdapter & addAuthorizedSvKey(const uint8_t kif, const uint8_t kvc) override
CardSecuritySettingAdapter & enableMultipleSession() override
CardSecuritySettingAdapter & addAuthorizedSessionKey(const uint8_t kif, const uint8_t kvc) override
const std::shared_ptr< uint8_t > getPinModificationCipheringKvc() const
CardSecuritySettingAdapter & enableSvLoadAndDebitLog() override
bool isSvKeyAuthorized(const std::shared_ptr< uint8_t > kif, const std::shared_ptr< uint8_t > kvc) const
const std::shared_ptr< uint8_t > getKif(const WriteAccessLevel writeAccessLevel, const uint8_t kvc) const
const std::shared_ptr< uint8_t > getPinVerificationCipheringKvc() const
bool isSessionKeyAuthorized(const std::shared_ptr< uint8_t > kif, const std::shared_ptr< uint8_t > kvc) const
CardSecuritySettingAdapter & enableRatificationMechanism() override
CardSecuritySettingAdapter & assignDefaultKvc(const WriteAccessLevel writeAccessLevel, const uint8_t kvc) override
CardSecuritySettingAdapter & enableTransactionAudit() override
CardSecuritySettingAdapter & enablePinPlainTransmission() override
const std::shared_ptr< uint8_t > getPinModificationCipheringKif() const
CardSecuritySettingAdapter & setPinModificationCipheringKey(const uint8_t kif, const uint8_t kvc) override
CardSecuritySettingAdapter & authorizeSvNegativeBalance() override
const std::shared_ptr< uint8_t > getDefaultKif(const WriteAccessLevel writeAccessLevel) const
CardSecuritySetting & setSamResource(const std::shared_ptr< CardReader > samReader, const std::shared_ptr< CalypsoSam > calypsoSam) override
CardSecuritySettingAdapter & assignDefaultKif(const WriteAccessLevel writeAccessLevel, const uint8_t kif) override
CardSecuritySettingAdapter & assignKif(const WriteAccessLevel writeAccessLevel, const uint8_t kvc, const uint8_t kif) override
const std::shared_ptr< uint8_t > getDefaultKvc(const WriteAccessLevel writeAccessLevel) const
const std::shared_ptr< uint8_t > getPinVerificationCipheringKif() const
CardSecuritySettingAdapter & setPinVerificationCipheringKey(const uint8_t kif, const uint8_t kvc) override
CalypsoSam::ProductType ProductType