Keyple Card Calypso C++ Library 2.1.0
Reference Terminal Reader API for C++
SamCommandProcessor.h
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
13#pragma once
14
15#include <cstdint>
16#include <memory>
17#include <string>
18#include <vector>
19
20/* Calypsonet Terminal Calypso */
21#include "CalypsoSam.h"
22#include "CardSecuritySetting.h"
23
24/* Calypsonet Terminal Card */
25#include "ProxyReaderApi.h"
26
27/* Keyple Card Calypso */
28#include "AbstractSamCommand.h"
29#include "CalypsoCardAdapter.h"
30#include "CmdCardSvDebit.h"
31#include "CmdCardSvUndebit.h"
32#include "CmdCardSvReload.h"
33
34/* Keyple Core Util */
35#include "LoggerFactory.h"
36
37namespace keyple {
38namespace card {
39namespace calypso {
40
41using namespace calypsonet::terminal::calypso;
42using namespace calypsonet::terminal::calypso::sam;
43using namespace calypsonet::terminal::calypso::transaction;
44using namespace calypsonet::terminal::card;
45using namespace keyple::core::util::cpp;
46
60public:
68 SamCommandProcessor(const std::shared_ptr<CalypsoCard> calypsoCard,
69 const std::shared_ptr<CardSecuritySetting> cardSecuritySetting);
70
90 const std::vector<uint8_t> getSessionTerminalChallenge();
91
101 const std::shared_ptr<uint8_t> computeKvc(const WriteAccessLevel writeAccessLevel,
102 const std::shared_ptr<uint8_t> kvc) const;
103
114 const std::shared_ptr<uint8_t> computeKif(const WriteAccessLevel writeAccessLevel,
115 const std::shared_ptr<uint8_t> kif,
116 const std::shared_ptr<uint8_t> kvc);
117
135 void initializeDigester(const bool sessionEncryption,
136 const bool verificationMode,
137 const uint8_t kif,
138 const uint8_t kvc,
139 const std::vector<uint8_t>& digestData);
140
151 void pushCardExchangedData(const std::vector<std::shared_ptr<ApduRequestSpi>>& requests,
152 const std::vector<std::shared_ptr<ApduResponseApi>>& responses,
153 const int startIndex);
154
168 const std::vector<uint8_t> getTerminalSignature();
169
182 void authenticateCardSignature(const std::vector<uint8_t>& cardSignatureLo);
183
199 const std::vector<uint8_t> getEncryptedKey(const std::vector<uint8_t>& poChallenge,
200 const uint8_t cipheringKif,
201 const uint8_t cipheringKvc,
202 const uint8_t sourceKif,
203 const uint8_t sourceKvc);
204
218 const std::vector<uint8_t> getCipheredPinData(const std::vector<uint8_t>& poChallenge,
219 const std::vector<uint8_t>& currentPin,
220 const std::vector<uint8_t>& newPin);
221
240 const std::vector<uint8_t> getSvReloadComplementaryData(
241 const std::shared_ptr<CmdCardSvReload> cmdCardSvReload,
242 const std::vector<uint8_t>& svGetHeader,
243 const std::vector<uint8_t>& svGetData);
244
262 const std::vector<uint8_t> getSvDebitComplementaryData(
263 const std::shared_ptr<CmdCardSvDebit> cmdCardSvDebit,
264 const std::vector<uint8_t>& svGetHeader,
265 const std::vector<uint8_t>& svGetData);
266
285 const std::vector<uint8_t> getSvUndebitComplementaryData(
286 const std::shared_ptr<CmdCardSvUndebit> cmdCardSvUndebit,
287 const std::vector<uint8_t>& svGetHeader,
288 const std::vector<uint8_t>& svGetData);
289
302 void checkSvStatus(const std::vector<uint8_t>& svOperationResponseData);
303
304private:
308 const std::unique_ptr<Logger> mLogger = LoggerFactory::getLogger(typeid(SamCommandProcessor));
309
313 static const uint8_t KIF_UNDEFINED;
314 static const uint8_t CHALLENGE_LENGTH_REV_INF_32;
315 static const uint8_t CHALLENGE_LENGTH_REV32;
316 static const uint8_t SIGNATURE_LENGTH_REV_INF_32;
317 static const uint8_t SIGNATURE_LENGTH_REV32;
318 static const std::string UNEXPECTED_EXCEPTION;
319
322 std::shared_ptr<ProxyReaderApi> mSamReader;
323
327 const std::shared_ptr<CardSecuritySetting> mCardSecuritySettings;
328
332 static std::vector<std::vector<uint8_t>> mCardDigestDataCache;
333
337 const std::shared_ptr<CalypsoCardAdapter> mCalypsoCard;
338
342 std::vector<uint8_t> mSamSerialNumber;
343
347 CalypsoSam::ProductType mSamProductType;
348
352 bool mSessionEncryption;
353
357 bool mVerificationMode;
358
362 uint8_t mKif;
363
367 uint8_t mKvc;
368
372 bool mIsDiversificationDone;
373
377 bool mIsDigestInitDone;
378
382 bool mIsDigesterInitialized;
383
391 void pushCardExchangedData(const std::shared_ptr<ApduRequestSpi> request,
392 const std::shared_ptr<ApduResponseApi> response);
393
410 const std::vector<std::shared_ptr<AbstractSamCommand>> getPendingSamCommands(
411 const bool addDigestClose);
412
420 const std::vector<std::shared_ptr<ApduRequestSpi>> getApduRequests(
421 const std::vector<std::shared_ptr<AbstractSamCommand>> samCommands) const;
422
446 const std::vector<uint8_t> getSvComplementaryData(
447 const std::shared_ptr<AbstractSamCommand> cmdSamSvPrepare);
448};
449
450}
451}
452}
const std::vector< uint8_t > getEncryptedKey(const std::vector< uint8_t > &poChallenge, const uint8_t cipheringKif, const uint8_t cipheringKvc, const uint8_t sourceKif, const uint8_t sourceKvc)
const std::vector< uint8_t > getSvReloadComplementaryData(const std::shared_ptr< CmdCardSvReload > cmdCardSvReload, const std::vector< uint8_t > &svGetHeader, const std::vector< uint8_t > &svGetData)
const std::shared_ptr< uint8_t > computeKvc(const WriteAccessLevel writeAccessLevel, const std::shared_ptr< uint8_t > kvc) const
const std::vector< uint8_t > getCipheredPinData(const std::vector< uint8_t > &poChallenge, const std::vector< uint8_t > &currentPin, const std::vector< uint8_t > &newPin)
const std::vector< uint8_t > getTerminalSignature()
const std::vector< uint8_t > getSessionTerminalChallenge()
void pushCardExchangedData(const std::vector< std::shared_ptr< ApduRequestSpi > > &requests, const std::vector< std::shared_ptr< ApduResponseApi > > &responses, const int startIndex)
const std::shared_ptr< uint8_t > computeKif(const WriteAccessLevel writeAccessLevel, const std::shared_ptr< uint8_t > kif, const std::shared_ptr< uint8_t > kvc)
const std::vector< uint8_t > getSvUndebitComplementaryData(const std::shared_ptr< CmdCardSvUndebit > cmdCardSvUndebit, const std::vector< uint8_t > &svGetHeader, const std::vector< uint8_t > &svGetData)
const std::vector< uint8_t > getSvDebitComplementaryData(const std::shared_ptr< CmdCardSvDebit > cmdCardSvDebit, const std::vector< uint8_t > &svGetHeader, const std::vector< uint8_t > &svGetData)
SamCommandProcessor(const std::shared_ptr< CalypsoCard > calypsoCard, const std::shared_ptr< CardSecuritySetting > cardSecuritySetting)
void authenticateCardSignature(const std::vector< uint8_t > &cardSignatureLo)
void initializeDigester(const bool sessionEncryption, const bool verificationMode, const uint8_t kif, const uint8_t kvc, const std::vector< uint8_t > &digestData)
void checkSvStatus(const std::vector< uint8_t > &svOperationResponseData)
CalypsoSam::ProductType ProductType