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