1 /*!
2  * \copyright Copyright (c) 2014-2021 Governikus GmbH & Co. KG, Germany
3  */
4 
5 #include "ASN1TemplateUtil.h"
6 #include "SecurityInfos.h"
7 
8 #include <QLoggingCategory>
9 
10 
11 using namespace governikus;
12 
13 
14 Q_DECLARE_LOGGING_CATEGORY(card)
15 
16 
17 namespace governikus
18 {
19 ASN1_ITEM_TEMPLATE(securityinfos_st) =
20 			ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_SET_OF, 0x00, securityinfos_st, securityinfo_st)
21 ASN1_ITEM_TEMPLATE_END(securityinfos_st)
22 
23 
24 IMPLEMENT_ASN1_FUNCTIONS(securityinfos_st)
25 
26 IMPLEMENT_ASN1_OBJECT(securityinfos_st)
27 
28 #if OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER)
29 	#define sk_securityinfo_st_num(data) SKM_sk_num(securityinfo_st, data)
30 	#define sk_securityinfo_st_value(data, i) SKM_sk_value(securityinfo_st, data, i)
31 #endif
32 
33 } // namespace governikus
34 
35 
fromHex(const QByteArray & pHexString)36 QSharedPointer<SecurityInfos> SecurityInfos::fromHex(const QByteArray& pHexString)
37 {
38 	return SecurityInfos::decode(QByteArray::fromHex(pHexString));
39 }
40 
41 
decode(const QByteArray & pBytes)42 QSharedPointer<SecurityInfos> SecurityInfos::decode(const QByteArray& pBytes)
43 {
44 	auto securityInfosStruct = decodeObject<securityinfos_st>(pBytes);
45 	if (securityInfosStruct == nullptr)
46 	{
47 		return QSharedPointer<SecurityInfos>();
48 	}
49 
50 	QVector<QSharedPointer<const SecurityInfo> > securityInfos;
51 	QVector<QSharedPointer<const PaceInfo> > paceInfos;
52 	QVector<QSharedPointer<const ChipAuthenticationInfo> > chipAuthenticationInfos;
53 
54 	for (int i = 0; i < sk_securityinfo_st_num(securityInfosStruct.data()); ++i)
55 	{
56 		securityinfo_st* secInfoStruct = sk_securityinfo_st_value(securityInfosStruct.data(), i);
57 		QByteArray bytes = encodeObject(secInfoStruct);
58 
59 		if (auto pi = PaceInfo::decode(bytes))
60 		{
61 			qCDebug(card) << "Parsed PACEInfo";
62 			paceInfos << pi;
63 			securityInfos << pi;
64 		}
65 		else if (auto cai = ChipAuthenticationInfo::decode(bytes))
66 		{
67 			qCDebug(card) << "Parsed ChipAuthenticationInfo";
68 			chipAuthenticationInfos << cai;
69 			securityInfos << cai;
70 		}
71 		else if (auto secInfo = SecurityInfo::decode(bytes))
72 		{
73 			qCDebug(card) << "Parsed SecurityInfo for protocol" << secInfo->getProtocol();
74 			securityInfos << secInfo;
75 		}
76 		else
77 		{
78 			qCCritical(card) << "Cannot parse as SecurityInfo" << pBytes.toHex();
79 			return QSharedPointer<SecurityInfos>();
80 		}
81 	}
82 
83 	return QSharedPointer<SecurityInfos>::create(pBytes, securityInfos, paceInfos, chipAuthenticationInfos);
84 }
85 
86 
SecurityInfos(const QByteArray & pBytes,const QVector<QSharedPointer<const SecurityInfo>> & pSecurityInfos,const QVector<QSharedPointer<const PaceInfo>> & pPaceInfos,const QVector<QSharedPointer<const ChipAuthenticationInfo>> & pChipAuthenticationInfos)87 SecurityInfos::SecurityInfos(const QByteArray& pBytes,
88 		const QVector<QSharedPointer<const SecurityInfo> >& pSecurityInfos,
89 		const QVector<QSharedPointer<const PaceInfo> >& pPaceInfos,
90 		const QVector<QSharedPointer<const ChipAuthenticationInfo> >& pChipAuthenticationInfos)
91 	: mContentBytes(pBytes)
92 	, mSecurityInfos(pSecurityInfos)
93 	, mPaceInfos(pPaceInfos)
94 	, mChipAuthenticationInfos(pChipAuthenticationInfos)
95 {
96 }
97 
98 
getContentBytes() const99 const QByteArray& SecurityInfos::getContentBytes() const
100 {
101 	return mContentBytes;
102 }
103 
104 
getSecurityInfos() const105 const QVector<QSharedPointer<const SecurityInfo> >& SecurityInfos::getSecurityInfos() const
106 {
107 	return mSecurityInfos;
108 }
109 
110 
getPaceInfos() const111 const QVector<QSharedPointer<const PaceInfo> >& SecurityInfos::getPaceInfos() const
112 {
113 	return mPaceInfos;
114 }
115 
116 
getChipAuthenticationInfos() const117 const QVector<QSharedPointer<const ChipAuthenticationInfo> >& SecurityInfos::getChipAuthenticationInfos() const
118 {
119 	return mChipAuthenticationInfos;
120 }
121