AusweisApp
Lade ...
Suche ...
Keine Treffer
ASN1TemplateUtil.h
gehe zur Dokumentation dieser Datei
1
9#pragma once
10
11#include <openssl/asn1t.h>
12#include <openssl/err.h>
13
14#include <QByteArray>
15#include <QLoggingCategory>
16#include <QScopeGuard>
17#include <QSharedPointer>
18
19Q_DECLARE_LOGGING_CATEGORY(card)
20
21namespace governikus
22{
23
25
29template<typename T>
31{
32 static_assert(std::is_void_v<T>, "Implement specialization of newAsn1Object");
33 return 0;
34}
35
36
40template<typename T>
49
50
54template<typename T>
55int encodeAsn1Object(const T*, uchar**)
56{
57 static_assert(std::is_void_v<T>, "Implement specialization of encodeObject");
58 return 0;
59}
60
61
65template<typename T>
67{
68 if (!pObject)
69 {
70 return QByteArray();
71 }
72
74 uchar* encoded = nullptr;
76 const auto guard = qScopeGuard([encoded] {
78 });
79 if (length < 0)
80 {
81 qCWarning(card) << "Cannot encode ASN.1 object:" << getOpenSslError();
82 return QByteArray();
83 }
84
85 return QByteArray(reinterpret_cast<char*>(encoded), length);
86}
87
88
92template<typename T>
93T* decodeAsn1Object(T**, const uchar**, long)
94{
95 static_assert(std::is_void_v<T>, "Implement specialization of decodeObject");
96 return 0;
97}
98
99
103template<typename T>
105{
106 static_assert(std::is_void_v<T>, "Implement specialization of freeObject");
107}
108
109
113template<typename T>
115{
117
118 T* object = nullptr;
119 const auto* dataPointer = reinterpret_cast<const unsigned char*>(pData.constData());
120 if (!decodeAsn1Object(&object, &dataPointer, static_cast<long>(pData.length())) && pLogging)
121 {
122 qCWarning(card) << "Cannot decode ASN.1 object:" << getOpenSslError();
123 }
124
125 static auto deleter = [](T* pTypeObject)
126 {
128 };
129 return QSharedPointer<T>(object, deleter);
130}
131
132
136static const int CB_SUCCESS = 1;
137
138
142static const int CB_ERROR = 0;
143
144
145#if OPENSSL_VERSION_NUMBER < 0x30000000L
146 #define i2d_const_cast(name, object) const_cast<name*>(object)
147#else
148 #define i2d_const_cast(name, object) object
149#endif
150
151
152#define IMPLEMENT_ASN1_OBJECT(name)\
153 template<>\
154 name * newAsn1Object<name>()\
155 {\
156 return name##_new();\
157 }\
158\
159 template<>\
160 int encodeAsn1Object<name>(const name * pObject, uchar** encoded)\
161 {\
162 return i2d_##name(i2d_const_cast(name, pObject), encoded);\
163 }\
164\
165 template<>\
166 name * decodeAsn1Object<name>(name** pObject, const uchar** pData, long pDataLen)\
167 {\
168 return d2i_##name(pObject, pData, pDataLen);\
169 }\
170\
171 template<>\
172 void freeAsn1Object<name>(name * pObject)\
173 {\
174 name##_free(pObject);\
175 }
176
177#define DECLARE_ASN1_OBJECT(name)\
178 template<> name * newAsn1Object<name>();\
179 template<> int encodeAsn1Object<name>(const name * pObject, uchar** encoded);\
180 template<> name * decodeAsn1Object<name>(name** pObject, const uchar** pData, long pDataLen);\
181 template<> void freeAsn1Object<name>(name * pObject);
182
183
184} // namespace governikus
#define T(v)
Definition http_parser.cpp:237
Implementation of GeneralAuthenticate response APDUs.
Definition CommandApdu.h:17
T * newAsn1Object()
Default template function for creating an OpenSSL type.
Definition ASN1TemplateUtil.h:30
QSharedPointer< T > newObject(T *pObject=newAsn1Object< T >())
Template function for creating a SharedPointer holding an ASN.1 OpenSSL type.
Definition ASN1TemplateUtil.h:41
T * decodeAsn1Object(T **, const uchar **, long)
Default template function for decoding an OpenSSL type.
Definition ASN1TemplateUtil.h:93
int encodeAsn1Object(const T *, uchar **)
Default template function for encoding an OpenSSL type.
Definition ASN1TemplateUtil.h:55
QByteArray getOpenSslError()
Definition ASN1TemplateUtil.cpp:7
QSharedPointer< T > decodeObject(const QByteArray &pData, bool pLogging=true)
Template function for decoding an OpenSSL type from DER encoded QByteArray.
Definition ASN1TemplateUtil.h:114
QByteArray encodeObject(T *pObject)
Template function for encoding an OpenSSL type as DER encoded QByteArray.
Definition ASN1TemplateUtil.h:66
void freeAsn1Object(T *)
Default template function for freeing an OpenSSL type.
Definition ASN1TemplateUtil.h:104