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
16namespace governikus
17{
18
19const QLoggingCategory& getLoggingCategory();
20QByteArray getOpenSslError();
21
25template<typename T>
27{
28 static_assert(std::is_void_v<T>, "Implement specialization of newAsn1Object");
29 return 0;
30}
31
32
36template<typename T>
37QSharedPointer<T> newObject(T* pObject = newAsn1Object<T>())
38{
39 static auto deleter = [](T* pObjectToDelete)
40 {
41 freeAsn1Object(pObjectToDelete);
42 };
43 return QSharedPointer<T>(pObject, deleter);
44}
45
46
50template<typename T>
51int encodeAsn1Object(const T*, uchar**)
52{
53 static_assert(std::is_void_v<T>, "Implement specialization of encodeObject");
54 return 0;
55}
56
57
61template<typename T>
62QByteArray encodeObject(T* pObject)
63{
64 if (!pObject)
65 {
66 return QByteArray();
67 }
68
69 ERR_clear_error();
70 uchar* encoded = nullptr;
71 const int length = encodeAsn1Object(pObject, &encoded);
72 const auto guard = qScopeGuard([encoded] {
73 OPENSSL_free(encoded);
74 });
75 if (length < 0)
76 {
77 qCWarning(governikus::getLoggingCategory()) << "Cannot encode ASN.1 object:" << getOpenSslError();
78 return QByteArray();
79 }
80
81 return QByteArray(reinterpret_cast<char*>(encoded), length);
82}
83
84
88template<typename T>
89T* decodeAsn1Object(T**, const uchar**, long)
90{
91 static_assert(std::is_void_v<T>, "Implement specialization of decodeObject");
92 return 0;
93}
94
95
99template<typename T>
101{
102 static_assert(std::is_void_v<T>, "Implement specialization of freeObject");
103}
104
105
109template<typename T>
110QSharedPointer<T> decodeObject(const QByteArray& pData, bool pLogging = true)
111{
112 ERR_clear_error();
113
114 T* object = nullptr;
115 const auto* dataPointer = reinterpret_cast<const unsigned char*>(pData.constData());
116 if (!decodeAsn1Object(&object, &dataPointer, static_cast<long>(pData.length())) && pLogging)
117 {
118 qCWarning(governikus::getLoggingCategory()) << "Cannot decode ASN.1 object:" << getOpenSslError();
119 }
120
121 static auto deleter = [](T* pTypeObject)
122 {
123 freeAsn1Object(pTypeObject);
124 };
125 return QSharedPointer<T>(object, deleter);
126}
127
128
132static const int CB_SUCCESS = 1;
133
134
138static const int CB_ERROR = 0;
139
140
141#if OPENSSL_VERSION_NUMBER < 0x30000000L
142 #define i2d_const_cast(name, object) const_cast<name*>(object)
143#else
144 #define i2d_const_cast(name, object) object
145#endif
146
147
148#define IMPLEMENT_ASN1_OBJECT(name)\
149 template<>\
150 name * newAsn1Object<name>()\
151 {\
152 return name##_new();\
153 }\
154\
155 template<>\
156 int encodeAsn1Object<name>(const name * pObject, uchar * *encoded)\
157 {\
158 return i2d_##name(i2d_const_cast(name, pObject), encoded);\
159 }\
160\
161 template<>\
162 name * decodeAsn1Object<name>(name * *pObject, const uchar * *pData, long pDataLen)\
163 {\
164 return d2i_##name(pObject, pData, pDataLen);\
165 }\
166\
167 template<>\
168 void freeAsn1Object<name>(name * pObject)\
169 {\
170 name##_free(pObject);\
171 }
172
173#define DECLARE_ASN1_OBJECT(name)\
174 template<> name * newAsn1Object<name>();\
175 template<> int encodeAsn1Object<name>(const name * pObject, uchar * *encoded);\
176 template<> name * decodeAsn1Object<name>(name * *pObject, const uchar * *pData, long pDataLen);\
177 template<> void freeAsn1Object<name>(name * pObject);
178
179
180} // 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:26
QSharedPointer< T > newObject(T *pObject=newAsn1Object< T >())
Template function for creating a SharedPointer holding an ASN.1 OpenSSL type.
Definition ASN1TemplateUtil.h:37
T * decodeAsn1Object(T **, const uchar **, long)
Default template function for decoding an OpenSSL type.
Definition ASN1TemplateUtil.h:89
int encodeAsn1Object(const T *, uchar **)
Default template function for encoding an OpenSSL type.
Definition ASN1TemplateUtil.h:51
const QLoggingCategory & getLoggingCategory()
Definition ASN1TemplateUtil.cpp:11
QByteArray getOpenSslError()
Definition ASN1TemplateUtil.cpp:16
QSharedPointer< T > decodeObject(const QByteArray &pData, bool pLogging=true)
Template function for decoding an OpenSSL type from DER encoded QByteArray.
Definition ASN1TemplateUtil.h:110
QByteArray encodeObject(T *pObject)
Template function for encoding an OpenSSL type as DER encoded QByteArray.
Definition ASN1TemplateUtil.h:62
void freeAsn1Object(T *)
Default template function for freeing an OpenSSL type.
Definition ASN1TemplateUtil.h:100