AusweisApp2
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 
17 Q_DECLARE_LOGGING_CATEGORY(card)
18 
19 namespace governikus
20 {
21 
22 QByteArray getOpenSslError();
23 
27 template<typename T>
29 {
30  static_assert(std::is_void<T>::value, "Implement specialization of newAsn1Object");
31  return 0;
32 }
33 
34 
38 template<typename T>
39 QSharedPointer<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 
52 template<typename T>
53 int encodeAsn1Object(T*, unsigned char**)
54 {
55  static_assert(std::is_void<T>::value, "Implement specialization of encodeObject");
56  return 0;
57 }
58 
59 
63 template<typename T>
64 QByteArray encodeObject(T* pObject)
65 {
66  ERR_clear_error();
67  unsigned char* encoded = nullptr;
68  const int length = encodeAsn1Object(pObject, &encoded);
69  const auto guard = qScopeGuard([encoded] {
70  OPENSSL_free(encoded);
71  });
72  if (length < 0)
73  {
74  qCWarning(card) << "Cannot encode ASN.1 object:" << getOpenSslError();
75  return QByteArray();
76  }
77 
78  return QByteArray(reinterpret_cast<char*>(encoded), length);
79 }
80 
81 
85 template<typename T>
86 T* decodeAsn1Object(T**, const unsigned char**, long)
87 {
88  static_assert(std::is_void<T>::value, "Implement specialization of decodeObject");
89  return 0;
90 }
91 
92 
96 template<typename T>
98 {
99  static_assert(std::is_void<T>::value, "Implement specialization of freeObject");
100 }
101 
102 
106 template<typename T>
107 QSharedPointer<T> decodeObject(const QByteArray& pData, bool pLogging = true)
108 {
109  ERR_clear_error();
110  const char* tmp = pData.constData();
111  const auto** dataPointer = reinterpret_cast<unsigned const char**>(&tmp);
112 
113  T* object = nullptr;
114  if (!decodeAsn1Object(&object, dataPointer, pData.length()) && pLogging)
115  {
116  qCWarning(card) << "Cannot decode ASN.1 object:" << getOpenSslError();
117  }
118 
119  static auto deleter = [](T* pTypeObject)
120  {
121  freeAsn1Object(pTypeObject);
122  };
123  return QSharedPointer<T>(object, deleter);
124 }
125 
126 
130 static const int CB_SUCCESS = 1;
131 
132 
136 static const int CB_ERROR = 0;
137 
138 
139 #define IMPLEMENT_ASN1_OBJECT(name)\
140  template<>\
141  name * newAsn1Object<name>()\
142  {\
143  return name##_new();\
144  }\
145 \
146  template<>\
147  int encodeAsn1Object<name>(name * pObject, unsigned char** encoded)\
148  {\
149  return i2d_##name(pObject, encoded);\
150  }\
151 \
152  template<>\
153  name * decodeAsn1Object<name>(name** pObject, const unsigned char** pData, long pDataLen)\
154  {\
155  return d2i_##name(pObject, pData, pDataLen);\
156  }\
157 \
158  template<>\
159  void freeAsn1Object<name>(name * pObject)\
160  {\
161  name##_free(pObject);\
162  }
163 
164 #define DECLARE_ASN1_OBJECT(name)\
165  template<> name * newAsn1Object<name>();\
166  template<> int encodeAsn1Object<name>(name * pObject, unsigned char** encoded);\
167  template<> name * decodeAsn1Object<name>(name** pObject, const unsigned char** pData, long pDataLen);\
168  template<> void freeAsn1Object<name>(name * pObject);
169 
170 
171 } // namespace governikus
#define T(v)
Definition: http_parser.cpp:237
Implementation of ActivationContext for Intent based activation on Android systems.
Definition: ActivationContext.h:15
int encodeAsn1Object(T *, unsigned char **)
Default template function for encoding an OpenSSL type.
Definition: ASN1TemplateUtil.h:53
T * decodeAsn1Object(T **, const unsigned char **, long)
Default template function for decoding an OpenSSL type.
Definition: ASN1TemplateUtil.h:86
QSharedPointer< T > decodeObject(const QByteArray &pData, bool pLogging=true)
Template function for decoding an OpenSSL type from DER encoded QByteArray.
Definition: ASN1TemplateUtil.h:107
T * newAsn1Object()
Default template function for creating an OpenSSL type.
Definition: ASN1TemplateUtil.h:28
QByteArray getOpenSslError()
Definition: ASN1TemplateUtil.cpp:7
QByteArray encodeObject(T *pObject)
Template function for encoding an OpenSSL type as DER encoded QByteArray.
Definition: ASN1TemplateUtil.h:64
QSharedPointer< T > newObject(T *pObject=newAsn1Object< T >())
Template function for creating a SharedPointer holding an ASN.1 OpenSSL type.
Definition: ASN1TemplateUtil.h:39
void freeAsn1Object(T *)
Default template function for freeing an OpenSSL type.
Definition: ASN1TemplateUtil.h:97