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 <QSharedPointer>
15 
16 #if (QT_VERSION >= QT_VERSION_CHECK(5, 12, 0))
17 #include <QScopeGuard>
18 #else
19 #include "ScopeGuard.h"
20 #endif
21 
22 Q_DECLARE_LOGGING_CATEGORY(card)
23 
24 namespace governikus
25 {
26 
27 QByteArray getOpenSslError();
28 
32 template<typename T>
34 {
35  static_assert(std::is_void<T>::value, "Implement specialization of newAsn1Object");
36  return 0;
37 }
38 
39 
43 template<typename T>
44 QSharedPointer<T> newObject(T* pObject = newAsn1Object<T>())
45 {
46  static auto deleter = [](T* pObjectToDelete)
47  {
48  freeAsn1Object(pObjectToDelete);
49  };
50  return QSharedPointer<T>(pObject, deleter);
51 }
52 
53 
57 template<typename T>
58 int encodeAsn1Object(T*, unsigned char**)
59 {
60  static_assert(std::is_void<T>::value, "Implement specialization of encodeObject");
61  return 0;
62 }
63 
64 
68 template<typename T>
69 QByteArray encodeObject(T* pObject)
70 {
71  ERR_clear_error();
72  unsigned char* 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 
90 template<typename T>
91 T* decodeAsn1Object(T**, const unsigned char**, long)
92 {
93  static_assert(std::is_void<T>::value, "Implement specialization of decodeObject");
94  return 0;
95 }
96 
97 
101 template<typename T>
103 {
104  static_assert(std::is_void<T>::value, "Implement specialization of freeObject");
105 }
106 
107 
111 template<typename T>
112 QSharedPointer<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 
135 static const int CB_SUCCESS = 1;
136 
137 
141 static const int CB_ERROR = 0;
142 
143 
144 #define IMPLEMENT_ASN1_OBJECT(name)\
145  template<>\
146  name * newAsn1Object<name>()\
147  {\
148  return name##_new();\
149  }\
150 \
151  template<>\
152  int encodeAsn1Object<name>(name * pObject, unsigned char** encoded)\
153  {\
154  return i2d_##name(pObject, encoded);\
155  }\
156 \
157  template<>\
158  name * decodeAsn1Object<name>(name** pObject, const unsigned char** pData, long pDataLen)\
159  {\
160  return d2i_##name(pObject, pData, pDataLen);\
161  }\
162 \
163  template<>\
164  void freeAsn1Object<name>(name * pObject)\
165  {\
166  name##_free(pObject);\
167  }
168 
169 #define DECLARE_ASN1_OBJECT(name)\
170  template<> name * newAsn1Object<name>();\
171  template<> int encodeAsn1Object<name>(name * pObject, unsigned char** encoded);\
172  template<> name * decodeAsn1Object<name>(name** pObject, const unsigned char** pData, long pDataLen);\
173  template<> void freeAsn1Object<name>(name * pObject);
174 
175 
176 } // namespace governikus
QSharedPointer< T > decodeObject(const QByteArray &pData, bool pLogging=true)
Template function for decoding an OpenSSL type from DER encoded QByteArray.
Definition: ASN1TemplateUtil.h:112
T * decodeAsn1Object(T **, const unsigned char **, long)
Default template function for decoding an OpenSSL type.
Definition: ASN1TemplateUtil.h:91
QByteArray getOpenSslError()
Definition: ASN1TemplateUtil.cpp:7
Implementation of ActivationContext for Intent based activation on Android systems.
Definition: ActivationContext.h:14
#define T(v)
Definition: http_parser.cpp:237
QSharedPointer< T > newObject(T *pObject=newAsn1Object< T >())
Template function for creating a SharedPointer holding an ASN.1 OpenSSL type.
Definition: ASN1TemplateUtil.h:44
void freeAsn1Object(T *)
Default template function for freeing an OpenSSL type.
Definition: ASN1TemplateUtil.h:102
T * newAsn1Object()
Default template function for creating an OpenSSL type.
Definition: ASN1TemplateUtil.h:33
int encodeAsn1Object(T *, unsigned char **)
Default template function for encoding an OpenSSL type.
Definition: ASN1TemplateUtil.h:58
QByteArray encodeObject(T *pObject)
Template function for encoding an OpenSSL type as DER encoded QByteArray.
Definition: ASN1TemplateUtil.h:69