14#include "keyple/card/calypso/SymmetricCryptoSecuritySettingAdapter.hpp"
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"
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;
37const std::string SymmetricCryptoSecuritySettingAdapter::WRITE_ACCESS_LEVEL
40SymmetricCryptoSecuritySettingAdapter::SymmetricCryptoSecuritySettingAdapter(
41 std::shared_ptr<SymmetricCryptoCardTransactionManagerFactorySpi>
42 cryptoCardTransactionManagerFactorySpi)
43: mCryptoCardTransactionManagerFactorySpi(
44 cryptoCardTransactionManagerFactorySpi)
48SymmetricCryptoSecuritySetting&
49SymmetricCryptoSecuritySettingAdapter::enableMultipleSession()
51 mIsMultipleSessionEnabled =
true;
56SymmetricCryptoSecuritySetting&
57SymmetricCryptoSecuritySettingAdapter::enableRatificationMechanism()
59 mIsRatificationMechanismEnabled =
true;
63SymmetricCryptoSecuritySetting&
64SymmetricCryptoSecuritySettingAdapter::enablePinPlainTransmission()
66 mIsPinPlainTransmissionEnabled =
true;
71SymmetricCryptoSecuritySetting&
72SymmetricCryptoSecuritySettingAdapter::enableSvLoadAndDebitLog()
74 mIsSvLoadAndDebitLogEnabled =
true;
79SymmetricCryptoSecuritySetting&
80SymmetricCryptoSecuritySettingAdapter::authorizeSvNegativeBalance()
82 mIsSvNegativeBalanceAuthorized =
true;
87SymmetricCryptoSecuritySetting&
88SymmetricCryptoSecuritySettingAdapter::disableReadOnSessionOpening()
90 mIsReadOnSessionOpeningDisabled =
true;
95SymmetricCryptoSecuritySetting&
96SymmetricCryptoSecuritySettingAdapter::assignKif(
97 WriteAccessLevel writeAccessLevel, std::uint8_t kvc, std::uint8_t kif)
103 mKifMap[writeAccessLevel][kvc] = kif;
108SymmetricCryptoSecuritySetting&
109SymmetricCryptoSecuritySettingAdapter::assignDefaultKif(
110 WriteAccessLevel writeAccessLevel, std::uint8_t kif)
112 mDefaultKifMap[writeAccessLevel] = kif;
117SymmetricCryptoSecuritySetting&
118SymmetricCryptoSecuritySettingAdapter::assignDefaultKvc(
119 WriteAccessLevel writeAccessLevel, std::uint8_t kvc)
121 mDefaultKvcMap[writeAccessLevel] = kvc;
126SymmetricCryptoSecuritySetting&
127SymmetricCryptoSecuritySettingAdapter::addAuthorizedSessionKey(
128 std::uint8_t kif, std::uint8_t kvc)
130 mAuthorizedSessionKeys.push_back(((kif << 8) & 0xff00) | (kvc & 0x00ff));
135SymmetricCryptoSecuritySetting&
136SymmetricCryptoSecuritySettingAdapter::addAuthorizedSvKey(
137 std::uint8_t kif, std::uint8_t kvc)
139 mAuthorizedSvKeys.push_back(((kif << 8) & 0xff00) | (kvc & 0x00ff));
144SymmetricCryptoSecuritySetting&
145SymmetricCryptoSecuritySettingAdapter::setPinVerificationCipheringKey(
146 std::uint8_t kif, std::uint8_t kvc)
148 mPinVerificationCipheringKif = std::make_shared<std::uint8_t>(kif);
149 mPinVerificationCipheringKvc = std::make_shared<std::uint8_t>(kvc);
154SymmetricCryptoSecuritySetting&
155SymmetricCryptoSecuritySettingAdapter::setPinModificationCipheringKey(
156 std::uint8_t kif, std::uint8_t kvc)
158 mPinModificationCipheringKif = std::make_shared<std::uint8_t>(kif);
159 mPinModificationCipheringKvc = std::make_shared<std::uint8_t>(kvc);
165SymmetricCryptoSecuritySettingAdapter::initCryptoContextForNextTransaction()
168 mCryptoCardTransactionManagerFactorySpi
169 ->preInitTerminalSessionContext();
171 }
catch (
const SymmetricCryptoException& e) {
172 throw CryptoException(e.what(), e);
174 }
catch (
const SymmetricCryptoIOException& e) {
175 throw CryptoIOException(e.what(), e);
180SymmetricCryptoSecuritySettingAdapter::isMultipleSessionEnabled()
const
182 return mIsMultipleSessionEnabled;
186SymmetricCryptoSecuritySettingAdapter::isRatificationMechanismEnabled()
const
188 return mIsRatificationMechanismEnabled;
192SymmetricCryptoSecuritySettingAdapter::isPinPlainTransmissionEnabled()
const
194 return mIsPinPlainTransmissionEnabled;
198SymmetricCryptoSecuritySettingAdapter::isSvLoadAndDebitLogEnabled()
const
200 return mIsSvLoadAndDebitLogEnabled;
204SymmetricCryptoSecuritySettingAdapter::isSvNegativeBalanceAuthorized()
const
206 return mIsSvNegativeBalanceAuthorized;
210SymmetricCryptoSecuritySettingAdapter::isReadOnSessionOpeningDisabled()
const
212 return mIsReadOnSessionOpeningDisabled;
215std::unique_ptr<std::uint8_t>
216SymmetricCryptoSecuritySettingAdapter::getKif(
217 WriteAccessLevel writeAccessLevel, std::uint8_t kvc)
const
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()) {
225 return std::unique_ptr<std::uint8_t>(
new std::uint8_t(_it->second));
231std::shared_ptr<std::uint8_t>
232SymmetricCryptoSecuritySettingAdapter::getDefaultKif(
233 WriteAccessLevel writeAccessLevel)
const
235 const auto it = mDefaultKifMap.find(writeAccessLevel);
236 if (it != mDefaultKifMap.end()) {
237 return std::make_shared<std::uint8_t>(it->second);
243std::shared_ptr<std::uint8_t>
244SymmetricCryptoSecuritySettingAdapter::getDefaultKvc(
245 WriteAccessLevel writeAccessLevel)
const
247 const auto it = mDefaultKvcMap.find(writeAccessLevel);
248 if (it != mDefaultKvcMap.end()) {
249 return std::make_shared<std::uint8_t>(it->second);
256SymmetricCryptoSecuritySettingAdapter::isSessionKeyAuthorized(
257 std::shared_ptr<std::uint8_t> kif, std::shared_ptr<std::uint8_t> kvc)
const
259 if (kif ==
nullptr || kvc ==
nullptr) {
263 if (mAuthorizedSessionKeys.empty()) {
267 return Arrays::contains(
268 mAuthorizedSessionKeys, ((*kif << 8) & 0xff00) | (*kvc & 0x00ff));
272SymmetricCryptoSecuritySettingAdapter::isSvKeyAuthorized(
273 std::shared_ptr<std::uint8_t> kif, std::shared_ptr<std::uint8_t> kvc)
const
275 if (kif ==
nullptr || kvc ==
nullptr) {
279 if (mAuthorizedSvKeys.empty()) {
283 return Arrays::contains(
284 mAuthorizedSvKeys, ((*kif << 8) & 0xff00) | (*kvc & 0x00ff));
287std::shared_ptr<std::uint8_t>
288SymmetricCryptoSecuritySettingAdapter::getPinVerificationCipheringKif()
const
290 return mPinVerificationCipheringKif;
293std::shared_ptr<std::uint8_t>
294SymmetricCryptoSecuritySettingAdapter::getPinVerificationCipheringKvc()
const
296 return mPinVerificationCipheringKvc;
299std::shared_ptr<std::uint8_t>
300SymmetricCryptoSecuritySettingAdapter::getPinModificationCipheringKif()
const
302 return mPinModificationCipheringKif;
305std::shared_ptr<std::uint8_t>
306SymmetricCryptoSecuritySettingAdapter::getPinModificationCipheringKvc()
const
308 return mPinModificationCipheringKvc;
311std::shared_ptr<SymmetricCryptoCardTransactionManagerFactorySpi>
312SymmetricCryptoSecuritySettingAdapter ::
313 getCryptoCardTransactionManagerFactorySpi()
const
315 return mCryptoCardTransactionManagerFactorySpi;
318const std::map<WriteAccessLevel, std::map<std::uint8_t, std::uint8_t>>&
319SymmetricCryptoSecuritySettingAdapter::getKifMap()
const
324const std::map<WriteAccessLevel, std::uint8_t>&
325SymmetricCryptoSecuritySettingAdapter::getDefaultKifMap()
const
327 return mDefaultKifMap;
330const std::map<WriteAccessLevel, std::uint8_t>&
331SymmetricCryptoSecuritySettingAdapter::getDefaultKvcMap()
const
333 return mDefaultKvcMap;
336const std::vector<int>&
337SymmetricCryptoSecuritySettingAdapter::getAuthorizedSessionKeys()
const
339 return mAuthorizedSessionKeys;
342const std::vector<int>&
343SymmetricCryptoSecuritySettingAdapter::getAuthorizedSvKeys()
const
345 return mAuthorizedSvKeys;