7#include <openssl/asn1t.h>
8#include <openssl/err.h>
11#include <QLoggingCategory>
13#include <QSharedPointer>
28 static_assert(std::is_void_v<T>,
"Implement specialization of newAsn1Object");
39 static auto deleter = [](
T* pObjectToDelete)
43 return QSharedPointer<T>(pObject, deleter);
53 static_assert(std::is_void_v<T>,
"Implement specialization of encodeObject");
70 uchar* encoded =
nullptr;
72 const auto guard = qScopeGuard([encoded] {
73 OPENSSL_free(encoded);
81 return QByteArray(
reinterpret_cast<char*
>(encoded), length);
91 static_assert(std::is_void_v<T>,
"Implement specialization of decodeObject");
102 static_assert(std::is_void_v<T>,
"Implement specialization of freeObject");
110QSharedPointer<T>
decodeObject(
const QByteArray& pData,
bool pLogging =
true)
115 const auto* dataPointer =
reinterpret_cast<const unsigned char*
>(pData.constData());
116 if (!
decodeAsn1Object(&
object, &dataPointer,
static_cast<long>(pData.length())) && pLogging)
121 static auto deleter = [](
T* pTypeObject)
125 return QSharedPointer<T>(
object, deleter);
132static const int CB_SUCCESS = 1;
138static const int CB_ERROR = 0;
141#if OPENSSL_VERSION_NUMBER < 0x30000000L
142 #define i2d_const_cast(name, object) const_cast<name*>(object)
144 #define i2d_const_cast(name, object) object
148#define IMPLEMENT_ASN1_OBJECT(name)\
150 name * newAsn1Object<name>()\
152 return name##_new();\
156 int encodeAsn1Object<name>(const name * pObject, uchar * *encoded)\
158 return i2d_##name(i2d_const_cast(name, pObject), encoded);\
162 name * decodeAsn1Object<name>(name * *pObject, const uchar * *pData, long pDataLen)\
164 return d2i_##name(pObject, pData, pDataLen);\
168 void freeAsn1Object<name>(name * pObject)\
170 name##_free(pObject);\
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);
#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