Keyple Card Calypso C++ Library - 3.2.2
Component of the Keyple C++ middleware
SymmetricCryptoSecuritySettingAdapter.cpp
Go to the documentation of this file.
1/******************************************************************************
2 * Copyright (c) 2025 Calypso Networks Association https://calypsonet.org/ *
3 * *
4 * See the NOTICE file(s) distributed with this work for additional *
5 * information regarding copyright ownership. *
6 * *
7 * This program and the accompanying materials are made available under the *
8 * terms of the Eclipse Public License 2.0 which is available at *
9 * http://www.eclipse.org/legal/epl-2.0 *
10 * *
11 * SPDX-License-Identifier: EPL-2.0 *
12 ******************************************************************************/
13
14#include "keyple/card/calypso/SymmetricCryptoSecuritySettingAdapter.hpp"
15
16#include <map>
17#include <memory>
18#include <string>
19#include <vector>
20
21#include "keyple/core/util/cpp/Arrays.hpp"
22#include "keypop/calypso/card/transaction/CryptoException.hpp"
23#include "keypop/calypso/card/transaction/CryptoIOException.hpp"
24#include "keypop/calypso/crypto/symmetric/SymmetricCryptoException.hpp"
25#include "keypop/calypso/crypto/symmetric/SymmetricCryptoIOException.hpp"
26
27namespace keyple {
28namespace card {
29namespace calypso {
30
31using keyple::core::util::cpp::Arrays;
32using keypop::calypso::card::transaction::CryptoException;
33using keypop::calypso::card::transaction::CryptoIOException;
34using keypop::calypso::crypto::symmetric::SymmetricCryptoException;
35using keypop::calypso::crypto::symmetric::SymmetricCryptoIOException;
36
37const std::string SymmetricCryptoSecuritySettingAdapter::WRITE_ACCESS_LEVEL
38 = "writeAccessLevel";
39
40SymmetricCryptoSecuritySettingAdapter::SymmetricCryptoSecuritySettingAdapter(
41 std::shared_ptr<SymmetricCryptoCardTransactionManagerFactorySpi>
42 cryptoCardTransactionManagerFactorySpi)
43: mCryptoCardTransactionManagerFactorySpi(
44 cryptoCardTransactionManagerFactorySpi)
45{
46}
47
48SymmetricCryptoSecuritySetting&
49SymmetricCryptoSecuritySettingAdapter::enableMultipleSession()
50{
51 mIsMultipleSessionEnabled = true;
52
53 return *this;
54}
55
56SymmetricCryptoSecuritySetting&
57SymmetricCryptoSecuritySettingAdapter::enableRatificationMechanism()
58{
59 mIsRatificationMechanismEnabled = true;
60
61 return *this;
62}
63SymmetricCryptoSecuritySetting&
64SymmetricCryptoSecuritySettingAdapter::enablePinPlainTransmission()
65{
66 mIsPinPlainTransmissionEnabled = true;
67
68 return *this;
69}
70
71SymmetricCryptoSecuritySetting&
72SymmetricCryptoSecuritySettingAdapter::enableSvLoadAndDebitLog()
73{
74 mIsSvLoadAndDebitLogEnabled = true;
75
76 return *this;
77}
78
79SymmetricCryptoSecuritySetting&
80SymmetricCryptoSecuritySettingAdapter::authorizeSvNegativeBalance()
81{
82 mIsSvNegativeBalanceAuthorized = true;
83
84 return *this;
85}
86
87SymmetricCryptoSecuritySetting&
88SymmetricCryptoSecuritySettingAdapter::disableReadOnSessionOpening()
89{
90 mIsReadOnSessionOpeningDisabled = true;
91
92 return *this;
93}
94
95SymmetricCryptoSecuritySetting&
96SymmetricCryptoSecuritySettingAdapter::assignKif(
97 WriteAccessLevel writeAccessLevel, std::uint8_t kvc, std::uint8_t kif)
98{
99 /*
100 * C++ operator[] auto inserts default value if not present.
101 * Don't need the "if (map == null) Java section.
102 */
103 mKifMap[writeAccessLevel][kvc] = kif;
104
105 return *this;
106}
107
108SymmetricCryptoSecuritySetting&
109SymmetricCryptoSecuritySettingAdapter::assignDefaultKif(
110 WriteAccessLevel writeAccessLevel, std::uint8_t kif)
111{
112 mDefaultKifMap[writeAccessLevel] = kif;
113
114 return *this;
115}
116
117SymmetricCryptoSecuritySetting&
118SymmetricCryptoSecuritySettingAdapter::assignDefaultKvc(
119 WriteAccessLevel writeAccessLevel, std::uint8_t kvc)
120{
121 mDefaultKvcMap[writeAccessLevel] = kvc;
122
123 return *this;
124}
125
126SymmetricCryptoSecuritySetting&
127SymmetricCryptoSecuritySettingAdapter::addAuthorizedSessionKey(
128 std::uint8_t kif, std::uint8_t kvc)
129{
130 mAuthorizedSessionKeys.push_back(((kif << 8) & 0xff00) | (kvc & 0x00ff));
131
132 return *this;
133}
134
135SymmetricCryptoSecuritySetting&
136SymmetricCryptoSecuritySettingAdapter::addAuthorizedSvKey(
137 std::uint8_t kif, std::uint8_t kvc)
138{
139 mAuthorizedSvKeys.push_back(((kif << 8) & 0xff00) | (kvc & 0x00ff));
140
141 return *this;
142}
143
144SymmetricCryptoSecuritySetting&
145SymmetricCryptoSecuritySettingAdapter::setPinVerificationCipheringKey(
146 std::uint8_t kif, std::uint8_t kvc)
147{
148 mPinVerificationCipheringKif = std::make_shared<std::uint8_t>(kif);
149 mPinVerificationCipheringKvc = std::make_shared<std::uint8_t>(kvc);
150
151 return *this;
152}
153
154SymmetricCryptoSecuritySetting&
155SymmetricCryptoSecuritySettingAdapter::setPinModificationCipheringKey(
156 std::uint8_t kif, std::uint8_t kvc)
157{
158 mPinModificationCipheringKif = std::make_shared<std::uint8_t>(kif);
159 mPinModificationCipheringKvc = std::make_shared<std::uint8_t>(kvc);
160
161 return *this;
162}
163
164void
165SymmetricCryptoSecuritySettingAdapter::initCryptoContextForNextTransaction()
166{
167 try {
168 mCryptoCardTransactionManagerFactorySpi
169 ->preInitTerminalSessionContext();
170
171 } catch (const SymmetricCryptoException& e) {
172 throw CryptoException(e.what(), e);
173
174 } catch (const SymmetricCryptoIOException& e) {
175 throw CryptoIOException(e.what(), e);
176 }
177}
178
179bool
180SymmetricCryptoSecuritySettingAdapter::isMultipleSessionEnabled() const
181{
182 return mIsMultipleSessionEnabled;
183}
184
185bool
186SymmetricCryptoSecuritySettingAdapter::isRatificationMechanismEnabled() const
187{
188 return mIsRatificationMechanismEnabled;
189}
190
191bool
192SymmetricCryptoSecuritySettingAdapter::isPinPlainTransmissionEnabled() const
193{
194 return mIsPinPlainTransmissionEnabled;
195}
196
197bool
198SymmetricCryptoSecuritySettingAdapter::isSvLoadAndDebitLogEnabled() const
199{
200 return mIsSvLoadAndDebitLogEnabled;
201}
202
203bool
204SymmetricCryptoSecuritySettingAdapter::isSvNegativeBalanceAuthorized() const
205{
206 return mIsSvNegativeBalanceAuthorized;
207}
208
209bool
210SymmetricCryptoSecuritySettingAdapter::isReadOnSessionOpeningDisabled() const
211{
212 return mIsReadOnSessionOpeningDisabled;
213}
214
215std::unique_ptr<std::uint8_t>
216SymmetricCryptoSecuritySettingAdapter::getKif(
217 WriteAccessLevel writeAccessLevel, std::uint8_t kvc) const
218{
219 const auto it = mKifMap.find(writeAccessLevel);
220 if (it != mKifMap.end()) {
221 const auto _it = it->second.find(kvc);
222 if (_it == it->second.end()) {
223 return nullptr;
224 }
225 return std::unique_ptr<std::uint8_t>(new std::uint8_t(_it->second));
226 } else {
227 return nullptr;
228 }
229}
230
231std::shared_ptr<std::uint8_t>
232SymmetricCryptoSecuritySettingAdapter::getDefaultKif(
233 WriteAccessLevel writeAccessLevel) const
234{
235 const auto it = mDefaultKifMap.find(writeAccessLevel);
236 if (it != mDefaultKifMap.end()) {
237 return std::make_shared<std::uint8_t>(it->second);
238 } else {
239 return nullptr;
240 }
241}
242
243std::shared_ptr<std::uint8_t>
244SymmetricCryptoSecuritySettingAdapter::getDefaultKvc(
245 WriteAccessLevel writeAccessLevel) const
246{
247 const auto it = mDefaultKvcMap.find(writeAccessLevel);
248 if (it != mDefaultKvcMap.end()) {
249 return std::make_shared<std::uint8_t>(it->second);
250 } else {
251 return nullptr;
252 }
253}
254
255bool
256SymmetricCryptoSecuritySettingAdapter::isSessionKeyAuthorized(
257 std::shared_ptr<std::uint8_t> kif, std::shared_ptr<std::uint8_t> kvc) const
258{
259 if (kif == nullptr || kvc == nullptr) {
260 return false;
261 }
262
263 if (mAuthorizedSessionKeys.empty()) {
264 return true;
265 }
266
267 return Arrays::contains(
268 mAuthorizedSessionKeys, ((*kif << 8) & 0xff00) | (*kvc & 0x00ff));
269}
270
271bool
272SymmetricCryptoSecuritySettingAdapter::isSvKeyAuthorized(
273 std::shared_ptr<std::uint8_t> kif, std::shared_ptr<std::uint8_t> kvc) const
274{
275 if (kif == nullptr || kvc == nullptr) {
276 return false;
277 }
278
279 if (mAuthorizedSvKeys.empty()) {
280 return true;
281 }
282
283 return Arrays::contains(
284 mAuthorizedSvKeys, ((*kif << 8) & 0xff00) | (*kvc & 0x00ff));
285}
286
287std::shared_ptr<std::uint8_t>
288SymmetricCryptoSecuritySettingAdapter::getPinVerificationCipheringKif() const
289{
290 return mPinVerificationCipheringKif;
291}
292
293std::shared_ptr<std::uint8_t>
294SymmetricCryptoSecuritySettingAdapter::getPinVerificationCipheringKvc() const
295{
296 return mPinVerificationCipheringKvc;
297}
298
299std::shared_ptr<std::uint8_t>
300SymmetricCryptoSecuritySettingAdapter::getPinModificationCipheringKif() const
301{
302 return mPinModificationCipheringKif;
303}
304
305std::shared_ptr<std::uint8_t>
306SymmetricCryptoSecuritySettingAdapter::getPinModificationCipheringKvc() const
307{
308 return mPinModificationCipheringKvc;
309}
310
311std::shared_ptr<SymmetricCryptoCardTransactionManagerFactorySpi>
312SymmetricCryptoSecuritySettingAdapter ::
313 getCryptoCardTransactionManagerFactorySpi() const
314{
315 return mCryptoCardTransactionManagerFactorySpi;
316}
317
318const std::map<WriteAccessLevel, std::map<std::uint8_t, std::uint8_t>>&
319SymmetricCryptoSecuritySettingAdapter::getKifMap() const
320{
321 return mKifMap;
322}
323
324const std::map<WriteAccessLevel, std::uint8_t>&
325SymmetricCryptoSecuritySettingAdapter::getDefaultKifMap() const
326{
327 return mDefaultKifMap;
328}
329
330const std::map<WriteAccessLevel, std::uint8_t>&
331SymmetricCryptoSecuritySettingAdapter::getDefaultKvcMap() const
332{
333 return mDefaultKvcMap;
334}
335
336const std::vector<int>&
337SymmetricCryptoSecuritySettingAdapter::getAuthorizedSessionKeys() const
338{
339 return mAuthorizedSessionKeys;
340}
341
342const std::vector<int>&
343SymmetricCryptoSecuritySettingAdapter::getAuthorizedSvKeys() const
344{
345 return mAuthorizedSvKeys;
346}
347
348} /* namespace calypso */
349} /* namespace card */
350} /* namespace keyple */