AusweisApp2/src/card/base/GeneralAuthenticateResponse...

315 lines
7.2 KiB
C++

/*!
* GeneralAuthenticateResponse.cpp
*
* \copyright Copyright (c) 2015 Governikus GmbH & Co. KG
*/
#include "asn1/ASN1Util.h"
#include "GeneralAuthenticateResponse.h"
#include <QLoggingCategory>
using namespace governikus;
Q_DECLARE_LOGGING_CATEGORY(card)
GAResponseApdu::GAResponseApdu()
: ResponseApdu()
{
}
GAResponseApdu::~GAResponseApdu()
{
}
void GAResponseApdu::setBuffer(const QByteArray& pBuffer)
{
ResponseApdu::setBuffer(pBuffer);
parseDynamicAuthenticationData(getData());
}
namespace governikus
{
ASN1_SEQUENCE(ga_encryptednoncedata_st) = {
ASN1_IMP(ga_encryptednoncedata_st, mEncryptedNonce, ASN1_OCTET_STRING, 0x00)
}
ASN1_SEQUENCE_END(ga_encryptednoncedata_st)
ASN1_ITEM_TEMPLATE(GA_ENCRYPTEDNONCEDATA) =
ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_IMPTAG | ASN1_TFLG_APPLICATION, 0x1C, GA_ENCRYPTEDNONCEDATA, ga_encryptednoncedata_st)
ASN1_ITEM_TEMPLATE_END(GA_ENCRYPTEDNONCEDATA)
IMPLEMENT_ASN1_FUNCTIONS(GA_ENCRYPTEDNONCEDATA)
IMPLEMENT_ASN1_OBJECT(GA_ENCRYPTEDNONCEDATA)
} // namespace governikus
void GAEncryptedNonceResponse::parseDynamicAuthenticationData(const QByteArray& pDynamicAuthenticationData)
{
auto data = decodeObject<GA_ENCRYPTEDNONCEDATA>(pDynamicAuthenticationData);
if (data == nullptr)
{
qCCritical(card) << "Cannot parse encrypted nonce, return empty byte array";
return;
}
mEncryptedNonce = Asn1OctetStringUtil::getValue(data->mEncryptedNonce);
}
GAEncryptedNonceResponse::GAEncryptedNonceResponse()
: GAResponseApdu()
, mEncryptedNonce()
{
}
GAEncryptedNonceResponse::~GAEncryptedNonceResponse()
{
}
const QByteArray& GAEncryptedNonceResponse::getEncryptedNonce()
{
return mEncryptedNonce;
}
namespace governikus
{
ASN1_SEQUENCE(ga_mapnoncedata_st) = {
ASN1_IMP(ga_mapnoncedata_st, mMappingData, ASN1_OCTET_STRING, 0x02)
}
ASN1_SEQUENCE_END(ga_mapnoncedata_st)
ASN1_ITEM_TEMPLATE(GA_MAPNONCEDATA) =
ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_IMPTAG | ASN1_TFLG_APPLICATION, 0x1C, GA_MAPNONCEDATA, ga_mapnoncedata_st)
ASN1_ITEM_TEMPLATE_END(GA_MAPNONCEDATA)
IMPLEMENT_ASN1_FUNCTIONS(GA_MAPNONCEDATA)
IMPLEMENT_ASN1_OBJECT(GA_MAPNONCEDATA)
} // namespace governikus
void GAMapNonceResponse::parseDynamicAuthenticationData(const QByteArray& pDynamicAuthenticationData)
{
auto data = decodeObject<GA_MAPNONCEDATA>(pDynamicAuthenticationData);
if (data == nullptr)
{
qCCritical(card) << "Cannot parse mapping data, return empty byte array";
return;
}
mMappingData = Asn1OctetStringUtil::getValue(data->mMappingData);
}
GAMapNonceResponse::GAMapNonceResponse()
: GAResponseApdu()
, mMappingData()
{
}
GAMapNonceResponse::~GAMapNonceResponse()
{
}
const QByteArray& GAMapNonceResponse::getMappingData()
{
return mMappingData;
}
namespace governikus
{
ASN1_SEQUENCE(ga_performkeyagreementdata_st) = {
ASN1_IMP(ga_performkeyagreementdata_st, mEphemeralPublicKey, ASN1_OCTET_STRING, 0x04)
}
ASN1_SEQUENCE_END(ga_performkeyagreementdata_st)
ASN1_ITEM_TEMPLATE(GA_PERFORMKEYAGREEMENTDATA) =
ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_IMPTAG | ASN1_TFLG_APPLICATION, 0x1C, GA_PERFORMKEYAGREEMENTDATA, ga_performkeyagreementdata_st)
ASN1_ITEM_TEMPLATE_END(GA_PERFORMKEYAGREEMENTDATA)
IMPLEMENT_ASN1_FUNCTIONS(GA_PERFORMKEYAGREEMENTDATA)
IMPLEMENT_ASN1_OBJECT(GA_PERFORMKEYAGREEMENTDATA)
} // namespace governikus
void GAPerformKeyAgreementResponse::parseDynamicAuthenticationData(const QByteArray& pDynamicAuthenticationData)
{
auto data = decodeObject<GA_PERFORMKEYAGREEMENTDATA>(pDynamicAuthenticationData);
if (data == nullptr)
{
qCCritical(card) << "Cannot parse ephemeral public key, return empty byte array";
return;
}
mEphemeralPublicKey = Asn1OctetStringUtil::getValue(data->mEphemeralPublicKey);
}
GAPerformKeyAgreementResponse::GAPerformKeyAgreementResponse()
: GAResponseApdu()
, mEphemeralPublicKey()
{
}
GAPerformKeyAgreementResponse::~GAPerformKeyAgreementResponse()
{
}
const QByteArray& GAPerformKeyAgreementResponse::getEphemeralPublicKey()
{
return mEphemeralPublicKey;
}
namespace governikus
{
ASN1_SEQUENCE(ga_mutualauthenticationdata_st) = {
ASN1_IMP(ga_mutualauthenticationdata_st, mAuthenticationToken, ASN1_OCTET_STRING, 0x06),
ASN1_IMP_OPT(ga_mutualauthenticationdata_st, mCarCurr, ASN1_OCTET_STRING, 0x07),
ASN1_IMP_OPT(ga_mutualauthenticationdata_st, mCarPrev, ASN1_OCTET_STRING, 0x08),
}
ASN1_SEQUENCE_END(ga_mutualauthenticationdata_st)
ASN1_ITEM_TEMPLATE(GA_MUTUALAUTHENTICATIONDATA) =
ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_IMPTAG | ASN1_TFLG_APPLICATION, 0x1C, GA_MUTUALAUTHENTICATIONDATA, ga_mutualauthenticationdata_st)
ASN1_ITEM_TEMPLATE_END(GA_MUTUALAUTHENTICATIONDATA)
IMPLEMENT_ASN1_FUNCTIONS(GA_MUTUALAUTHENTICATIONDATA)
IMPLEMENT_ASN1_OBJECT(GA_MUTUALAUTHENTICATIONDATA)
} // namespace governikus
void GAMutualAuthenticationResponse::parseDynamicAuthenticationData(const QByteArray& pDynamicAuthenticationData)
{
auto data = decodeObject<GA_MUTUALAUTHENTICATIONDATA>(pDynamicAuthenticationData);
if (data == nullptr)
{
qCCritical(card) << "Cannot parse authentication token, return empty byte array";
return;
}
mAuthenticationToken = Asn1OctetStringUtil::getValue(data->mAuthenticationToken);
mCarCurr = Asn1OctetStringUtil::getValue(data->mCarCurr);
mCarPrev = Asn1OctetStringUtil::getValue(data->mCarPrev);
qDebug() << "mCarCurr" << mCarCurr;
qDebug() << "mCarPrev" << mCarPrev;
}
GAMutualAuthenticationResponse::GAMutualAuthenticationResponse()
: GAResponseApdu()
, mAuthenticationToken()
, mCarCurr()
, mCarPrev()
{
}
GAMutualAuthenticationResponse::~GAMutualAuthenticationResponse()
{
}
const QByteArray& GAMutualAuthenticationResponse::getAuthenticationToken()
{
return mAuthenticationToken;
}
const QByteArray& GAMutualAuthenticationResponse::getCarCurr()
{
return mCarCurr;
}
const QByteArray& GAMutualAuthenticationResponse::getCarPrev()
{
return mCarPrev;
}
namespace governikus
{
ASN1_SEQUENCE(ga_chipauthenticationdata_st) = {
ASN1_IMP(ga_chipauthenticationdata_st, mNonce, ASN1_OCTET_STRING, 0x01),
ASN1_IMP(ga_chipauthenticationdata_st, mAuthenticationToken, ASN1_OCTET_STRING, 0x02),
}
ASN1_SEQUENCE_END(ga_chipauthenticationdata_st)
ASN1_ITEM_TEMPLATE(GA_CHIPAUTHENTICATIONDATA) =
ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_IMPTAG | ASN1_TFLG_APPLICATION, 0x1C, GA_CHIPAUTHENTICATIONDATA, ga_chipauthenticationdata_st)
ASN1_ITEM_TEMPLATE_END(GA_CHIPAUTHENTICATIONDATA)
IMPLEMENT_ASN1_FUNCTIONS(GA_CHIPAUTHENTICATIONDATA)
IMPLEMENT_ASN1_OBJECT(GA_CHIPAUTHENTICATIONDATA)
} // namespace governikus
void GAChipAuthenticationResponse::parseDynamicAuthenticationData(const QByteArray& pDynamicAuthenticationData)
{
auto data = decodeObject<GA_CHIPAUTHENTICATIONDATA>(pDynamicAuthenticationData);
if (data == nullptr)
{
qCCritical(card) << "Cannot parse chip authentication token, return empty byte array";
return;
}
mNonce = Asn1OctetStringUtil::getValue(data->mNonce);
mAuthenticationToken = Asn1OctetStringUtil::getValue(data->mAuthenticationToken);
}
GAChipAuthenticationResponse::GAChipAuthenticationResponse()
: GAResponseApdu()
, mNonce()
, mAuthenticationToken()
{
}
GAChipAuthenticationResponse::~GAChipAuthenticationResponse()
{
}
const QByteArray& GAChipAuthenticationResponse::getNonce()
{
return mNonce;
}
const QByteArray& GAChipAuthenticationResponse::getAuthenticationToken()
{
return mAuthenticationToken;
}