229 lines
4.7 KiB
C++
229 lines
4.7 KiB
C++
/*!
|
|
* \copyright Copyright (c) 2014 Governikus GmbH & Co. KG
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include "asn1/Chat.h"
|
|
#include "Apdu.h"
|
|
#include "CardReturnCode.h"
|
|
#include "FileRef.h"
|
|
#include "SmartCardDefinitions.h"
|
|
|
|
#include <QtEndian>
|
|
|
|
|
|
namespace governikus
|
|
{
|
|
|
|
// TODO: brauchen wir das wirklich?
|
|
template<typename T> QByteArray toBigEndian(T pDataToConvert)
|
|
{
|
|
uchar converted[sizeof(T)];
|
|
qToBigEndian(pDataToConvert, converted);
|
|
|
|
unsigned long position;
|
|
for (position = 0; position < sizeof(T) - 1; ++position)
|
|
{
|
|
if (converted[position] != 0)
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
return QByteArray(reinterpret_cast<char*>(&converted[position]), static_cast<int>(sizeof(T) - position));
|
|
}
|
|
|
|
|
|
class CommandApduBuilder
|
|
{
|
|
private:
|
|
Q_DISABLE_COPY(CommandApduBuilder)
|
|
|
|
public:
|
|
CommandApduBuilder();
|
|
virtual ~CommandApduBuilder();
|
|
virtual CommandApdu build() = 0;
|
|
};
|
|
|
|
class SelectBuilder
|
|
: public CommandApduBuilder
|
|
{
|
|
private:
|
|
const FileRef mFileRef;
|
|
|
|
public:
|
|
enum class P1 : char
|
|
{
|
|
SELECT_MF = 0x00, CHILD_DF = 0x01, CHILD_EF = 0x02, PARENT_DF = 0x03, APPLICATION_ID = 0x04, ABS_PATH = 0x08, REL_PATH = 0x09,
|
|
};
|
|
|
|
enum class P2 : char
|
|
{
|
|
FCI = 0x00, FCP = 0x04, FMD = 0x08, NONE = 0x0c,
|
|
};
|
|
|
|
SelectBuilder(const FileRef& pFileRef);
|
|
CommandApdu build() override;
|
|
};
|
|
|
|
class GetChallengeBuilder
|
|
: public CommandApduBuilder
|
|
{
|
|
public:
|
|
GetChallengeBuilder();
|
|
CommandApdu build() override;
|
|
};
|
|
|
|
class GetChallengeResponse
|
|
: public ResponseApdu
|
|
{
|
|
public:
|
|
GetChallengeResponse();
|
|
virtual ~GetChallengeResponse();
|
|
QByteArray getChallenge() const;
|
|
};
|
|
|
|
class MSEBuilder
|
|
: public CommandApduBuilder
|
|
{
|
|
public:
|
|
enum class P1 : int
|
|
{
|
|
COMPUTE_DIGITAL_SIGNATURE = 0x41, PUT_HASH = 0xa0, PERFORM_SECURITY_OPERATION = 0xc1, SET_DST = 0x81, ERASE = 0xF3,
|
|
};
|
|
|
|
enum class P2 : int
|
|
{
|
|
SET_AT = 0xa4, HASH_ALGORITHM = 0xaa, COMPUTE_DIGITAL_SIGNATURE = 0xb6, ENCRYPTION_OPERATION = 0xb8, DEFAULT_CHANNEL = 0x00,
|
|
};
|
|
|
|
MSEBuilder(P1 p1, P2 p2);
|
|
void setAuxiliaryData(const QByteArray& pData);
|
|
void setOid(const QByteArray& pData);
|
|
void setPublicKey(const QByteArray& pData);
|
|
void setPublicKey(PACE_PIN_ID pPin);
|
|
void setPrivateKey(const QByteArray& pData);
|
|
void setEphemeralPublicKey(const QByteArray& pData);
|
|
void setChat(const QByteArray& pData);
|
|
CommandApdu build() override;
|
|
|
|
private:
|
|
P1 mP1;
|
|
P2 mP2;
|
|
QByteArray mAuxiliaryData;
|
|
QByteArray mOid;
|
|
QByteArray mPublicKey;
|
|
QByteArray mPrivateKey;
|
|
QByteArray mEphemeralPublicKey;
|
|
QByteArray mChat;
|
|
};
|
|
|
|
class PSOBuilder
|
|
: public CommandApduBuilder
|
|
{
|
|
public:
|
|
enum class P1 : int
|
|
{
|
|
DECRYPT = 0x80, ENCRYPT = 0x86, SIGN_HASH = 0x9e, VERIFY = 0x00,
|
|
};
|
|
|
|
enum class P2 : int
|
|
{
|
|
UNCRYPTED_DATA = 0x80, ENCRYPTED_DATA = 0x86, HASH_VALUE = 0x9a, CERTIFICATE = 0xbe,
|
|
};
|
|
|
|
PSOBuilder(P1 p1, P2 p2);
|
|
void setCertificateBody(const QByteArray& pData);
|
|
void setSignature(const QByteArray& pData);
|
|
CommandApdu build() override;
|
|
|
|
private:
|
|
P1 mP1;
|
|
P2 mP2;
|
|
QByteArray mCertificateBody;
|
|
QByteArray mSignature;
|
|
};
|
|
|
|
class EABuilder
|
|
: public CommandApduBuilder
|
|
{
|
|
public:
|
|
EABuilder();
|
|
void setSignature(const QByteArray& pData);
|
|
CommandApdu build() override;
|
|
|
|
private:
|
|
QByteArray mSignature;
|
|
};
|
|
|
|
class GABuilder
|
|
: public CommandApduBuilder
|
|
{
|
|
public:
|
|
GABuilder(char pClassByte = CommandApdu::CLA);
|
|
void setCaEphemeralPublicKey(const QByteArray& pData);
|
|
void setPaceMappingData(const QByteArray& pData);
|
|
void setPaceEphemeralPublicKey(const QByteArray& pData);
|
|
void setPaceAuthenticationToken(const QByteArray& pData);
|
|
CommandApdu build() override;
|
|
|
|
private:
|
|
char mClassByte;
|
|
QByteArray mCaEphemeralPublicKey;
|
|
QByteArray mPaceMappingData;
|
|
QByteArray mPaceEphemeralPublicKey;
|
|
QByteArray mPaceAuthenticationToken;
|
|
};
|
|
|
|
class ReadBinaryBuilder
|
|
: public CommandApduBuilder
|
|
{
|
|
private:
|
|
uint mOffset;
|
|
int mLe;
|
|
|
|
public:
|
|
ReadBinaryBuilder(uint pOffset, int pLe);
|
|
CommandApdu build() override;
|
|
};
|
|
|
|
class ResetRetryCounterBuilder
|
|
: public CommandApduBuilder
|
|
{
|
|
public:
|
|
ResetRetryCounterBuilder(const QByteArray& pPin = QByteArray());
|
|
CommandApdu build() override;
|
|
|
|
private:
|
|
QByteArray mPin;
|
|
};
|
|
|
|
|
|
class PinModifyBuilder
|
|
{
|
|
private:
|
|
QByteArray createCommandData(quint8 pTimeoutSeconds, char pMsgIndex1, char pMsgIndex2, char pMsgIndex3, const QByteArray& pAbData) const;
|
|
|
|
public:
|
|
QByteArray createChangeEidPinCommandData(quint8 pTimeoutSeconds) const;
|
|
|
|
/**
|
|
* According to DWG_Smart-Card_CCID_Rev110.pdf as mentioned in [TR-03110].
|
|
*/
|
|
CommandApdu createCommandDataCcid(quint8 pTimeoutSeconds) const;
|
|
};
|
|
|
|
class PinModifyOutput
|
|
{
|
|
private:
|
|
CardReturnCode mReturnCode;
|
|
|
|
public:
|
|
void parse(const QByteArray& pData);
|
|
void parseFromCcid(const QByteArray& pData);
|
|
CardReturnCode getReturnCode() const;
|
|
};
|
|
|
|
} /* namespace governikus */
|