AusweisApp2
Lade ...
Suche ...
Keine Treffer
ASN1TemplateUtil.h
gehe zur Dokumentation dieser Datei
1
7#pragma once
8
9#include <openssl/asn1t.h>
10#include <openssl/err.h>
11
12#include <QByteArray>
13#include <QLoggingCategory>
14#include <QScopeGuard>
15#include <QSharedPointer>
16
17Q_DECLARE_LOGGING_CATEGORY(card)
18
19namespace governikus
20{
21
22QByteArray getOpenSslError();
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>
39QSharedPointer<T> newObject(T* pObject = newAsn1Object<T>())
40{
41 static auto deleter = [](T* pObjectToDelete)
42 {
43 freeAsn1Object(pObjectToDelete);
44 };
45 return QSharedPointer<T>(pObject, deleter);
46}
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>
64QByteArray encodeObject(T* pObject)
65{
66 if (!pObject)
67 {
68 return QByteArray();
69 }
70
71 ERR_clear_error();
72 uchar* encoded = nullptr;
73 const int length = encodeAsn1Object(pObject, &encoded);
74 const auto guard = qScopeGuard([encoded] {
75 OPENSSL_free(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>
112QSharedPointer<T> decodeObject(const QByteArray& pData, bool pLogging = true)
113{
114 ERR_clear_error();
115 const char* tmp = pData.constData();
116 const auto** dataPointer = reinterpret_cast<unsigned const char**>(&tmp);
117
118 T* object = nullptr;
119 if (!decodeAsn1Object(&object, dataPointer, pData.length()) && pLogging)
120 {
121 qCWarning(card) << "Cannot decode ASN.1 object:" << getOpenSslError();
122 }
123
124 static auto deleter = [](T* pTypeObject)
125 {
126 freeAsn1Object(pTypeObject);
127 };
128 return QSharedPointer<T>(object, deleter);
129}
130
131
135static const int CB_SUCCESS = 1;
136
137
141static const int CB_ERROR = 0;
142
143
144#if OPENSSL_VERSION_NUMBER < 0x30000000L
145 #define i2d_const_cast(name, object) const_cast<name*>(object)
146#else
147 #define i2d_const_cast(name, object) object
148#endif
149
150
151#define IMPLEMENT_ASN1_OBJECT(name)\
152 template<>\
153 name * newAsn1Object<name>()\
154 {\
155 return name##_new();\
156 }\
157\
158 template<>\
159 int encodeAsn1Object<name>(const name * pObject, uchar** encoded)\
160 {\
161 return i2d_##name(i2d_const_cast(name, pObject), encoded);\
162 }\
163\
164 template<>\
165 name * decodeAsn1Object<name>(name** pObject, const uchar** pData, long pDataLen)\
166 {\
167 return d2i_##name(pObject, pData, pDataLen);\
168 }\
169\
170 template<>\
171 void freeAsn1Object<name>(name * pObject)\
172 {\
173 name##_free(pObject);\
174 }
175
176#define DECLARE_ASN1_OBJECT(name)\
177 template<> name * newAsn1Object<name>();\
178 template<> int encodeAsn1Object<name>(const name * pObject, uchar** encoded);\
179 template<> name * decodeAsn1Object<name>(name** pObject, const uchar** pData, long pDataLen);\
180 template<> void freeAsn1Object<name>(name * pObject);
181
182
183} // namespace governikus
#define T(v)
Definition: http_parser.cpp:237
Implementation of GeneralAuthenticate response APDUs.
Definition: CommandApdu.h:16
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