AusweisApp
Lade ...
Suche ...
Keine Treffer
ASN1TemplateUtil.h
gehe zur Dokumentation dieser Datei
1
5#pragma once
6
7#include <openssl/asn1t.h>
8#include <openssl/err.h>
9
10#include <QByteArray>
11#include <QLoggingCategory>
12#include <QScopeGuard>
13#include <QSharedPointer>
14
15
16Q_DECLARE_LOGGING_CATEGORY(card)
17
18
19namespace governikus
20{
21
23
27template<typename T>
29{
30 static_assert(std::is_void_v<T>, "Implement specialization of newAsn1Object");
31 return 0;
32}
33
34
38template<typename T>
47
48
52template<typename T>
53int encodeAsn1Object(const T*, uchar**)
54{
55 static_assert(std::is_void_v<T>, "Implement specialization of encodeObject");
56 return 0;
57}
58
59
63template<typename T>
65{
66 if (!pObject)
67 {
68 return QByteArray();
69 }
70
72 uchar* encoded = nullptr;
74 const auto guard = qScopeGuard([encoded] {
76 });
77 if (length < 0)
78 {
79 qCWarning(card) << "Cannot encode ASN.1 object:" << getOpenSslError();
80 return QByteArray();
81 }
82
83 return QByteArray(reinterpret_cast<char*>(encoded), length);
84}
85
86
90template<typename T>
91T* decodeAsn1Object(T**, const uchar**, long)
92{
93 static_assert(std::is_void_v<T>, "Implement specialization of decodeObject");
94 return 0;
95}
96
97
101template<typename T>
103{
104 static_assert(std::is_void_v<T>, "Implement specialization of freeObject");
105}
106
107
111template<typename T>
113{
115
116 T* object = nullptr;
117 const auto* dataPointer = reinterpret_cast<const unsigned char*>(pData.constData());
118 if (!decodeAsn1Object(&object, &dataPointer, static_cast<long>(pData.length())) && pLogging)
119 {
120 qCWarning(card) << "Cannot decode ASN.1 object:" << getOpenSslError();
121 }
122
123 static auto deleter = [](T* pTypeObject)
124 {
126 };
127 return QSharedPointer<T>(object, deleter);
128}
129
130
134static const int CB_SUCCESS = 1;
135
136
140static const int CB_ERROR = 0;
141
142
143#if OPENSSL_VERSION_NUMBER < 0x30000000L
144 #define i2d_const_cast(name, object) const_cast<name*>(object)
145#else
146 #define i2d_const_cast(name, object) object
147#endif
148
149
150#define IMPLEMENT_ASN1_OBJECT(name)\
151 template<>\
152 name * newAsn1Object<name>()\
153 {\
154 return name##_new();\
155 }\
156\
157 template<>\
158 int encodeAsn1Object<name>(const name * pObject, uchar * *encoded)\
159 {\
160 return i2d_##name(i2d_const_cast(name, pObject), encoded);\
161 }\
162\
163 template<>\
164 name * decodeAsn1Object<name>(name * *pObject, const uchar * *pData, long pDataLen)\
165 {\
166 return d2i_##name(pObject, pData, pDataLen);\
167 }\
168\
169 template<>\
170 void freeAsn1Object<name>(name * pObject)\
171 {\
172 name##_free(pObject);\
173 }
174
175#define DECLARE_ASN1_OBJECT(name)\
176 template<> name * newAsn1Object<name>();\
177 template<> int encodeAsn1Object<name>(const name * pObject, uchar * *encoded);\
178 template<> name * decodeAsn1Object<name>(name * *pObject, const uchar * *pData, long pDataLen);\
179 template<> void freeAsn1Object<name>(name * pObject);
180
181
182} // namespace governikus
#define T(v)
Definition http_parser.cpp:237
Defines the AccessRight and AccessRole enum.
Definition CommandApdu.h:17
T * newAsn1Object()
Default template function for creating an OpenSSL type.
Definition ASN1TemplateUtil.h:28
QSharedPointer< T > newObject(T *pObject=newAsn1Object< T >())
Template function for creating a SharedPointer holding an ASN.1 OpenSSL type.
Definition ASN1TemplateUtil.h:39
T * decodeAsn1Object(T **, const uchar **, long)
Default template function for decoding an OpenSSL type.
Definition ASN1TemplateUtil.h:91
int encodeAsn1Object(const T *, uchar **)
Default template function for encoding an OpenSSL type.
Definition ASN1TemplateUtil.h:53
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:112
QByteArray encodeObject(T *pObject)
Template function for encoding an OpenSSL type as DER encoded QByteArray.
Definition ASN1TemplateUtil.h:64
void freeAsn1Object(T *)
Default template function for freeing an OpenSSL type.
Definition ASN1TemplateUtil.h:102