AusweisApp2
 Alle Klassen Namensbereiche Dateien Funktionen Variablen Typdefinitionen Aufzählungen Aufzählungswerte Propertys Freundbeziehungen Makrodefinitionen
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 <QDebug>
14 #include <QSharedPointer>
15 
16 namespace governikus
17 {
18 
19 
23 template<typename T>
25 {
26  static_assert(std::is_void<T>::value, "Implement specialization of newAsn1Object");
27  return 0;
28 }
29 
30 
34 template<typename T>
35 QSharedPointer<T> newObject(T* pObject = newAsn1Object<T>())
36 {
37  static auto deleter = [](T* pObjectToDelete)
38  {
39  freeAsn1Object(pObjectToDelete);
40  };
41  return QSharedPointer<T>(pObject, deleter);
42 }
43 
44 
48 template<typename T>
49 int encodeAsn1Object(T*, unsigned char**)
50 {
51  static_assert(std::is_void<T>::value, "Implement specialization of encodeObject");
52  return 0;
53 }
54 
55 
59 template<typename T>
60 QByteArray encodeObject(T* pObject)
61 {
62  unsigned char* encoded = nullptr;
63  int length = encodeAsn1Object(pObject, &encoded);
64  if (length < 0)
65  {
66  BIO* bio_err = BIO_new_fp(stderr, BIO_NOCLOSE);
67  ERR_print_errors(bio_err);
68  BIO_free(bio_err);
69  length = 0;
70  }
71  return QByteArray(reinterpret_cast<char*>(encoded), length);
72 }
73 
74 
78 template<typename T>
79 T* decodeAsn1Object(T**, const unsigned char**, long)
80 {
81  static_assert(std::is_void<T>::value, "Implement specialization of decodeObject");
82  return 0;
83 }
84 
85 
89 template<typename T>
91 {
92  static_assert(std::is_void<T>::value, "Implement specialization of freeObject");
93 }
94 
95 
99 template<typename T>
100 QSharedPointer<T> decodeObject(const QByteArray& pData)
101 {
102  const char* tmp = pData.constData();
103  const unsigned char** dataPointer = reinterpret_cast<unsigned const char**>(&tmp);
104 
105  T* object = nullptr;
106  decodeAsn1Object(&object, dataPointer, pData.length());
107  static auto deleter = [](T* pTypeObject)
108  {
109  freeAsn1Object(pTypeObject);
110  };
111  return QSharedPointer<T>(object, deleter);
112 }
113 
114 
118 static const int CB_SUCCESS = 1;
119 
120 
124 static const int CB_ERROR = 0;
125 
126 
127 #define IMPLEMENT_ASN1_OBJECT(name)\
128  template<>\
129  name * newAsn1Object<name>()\
130  {\
131  return name##_new();\
132  }\
133 \
134  template<>\
135  int encodeAsn1Object<name>(name * pObject, unsigned char** encoded)\
136  {\
137  return i2d_##name(pObject, encoded);\
138  }\
139 \
140  template<>\
141  name * decodeAsn1Object<name>(name** pObject, const unsigned char** pData, long pDataLen)\
142  {\
143  return d2i_##name(pObject, pData, pDataLen);\
144  }\
145 \
146  template<>\
147  void freeAsn1Object<name>(name * pObject)\
148  {\
149  name##_free(pObject);\
150  }
151 
152 #define DECLARE_ASN1_OBJECT(name)\
153  template<> name * newAsn1Object<name>();\
154  template<> int encodeAsn1Object<name>(name * pObject, unsigned char** encoded);\
155  template<> name * decodeAsn1Object<name>(name** pObject, const unsigned char** pData, long pDataLen);\
156  template<> void freeAsn1Object<name>(name * pObject);
157 
158 
159 }
T * decodeAsn1Object(T **, const unsigned char **, long)
Default template function for decoding an OpenSSL type.
Definition: ASN1TemplateUtil.h:79
#define T(v)
Definition: http_parser.cpp:234
QSharedPointer< T > newObject(T *pObject=newAsn1Object< T >())
Template function for creating a SharedPointer holding an ASN.1 OpenSSL type.
Definition: ASN1TemplateUtil.h:35
void freeAsn1Object(T *)
Default template function for freeing an OpenSSL type.
Definition: ASN1TemplateUtil.h:90
T * newAsn1Object()
Default template function for creating an OpenSSL type.
Definition: ASN1TemplateUtil.h:24
QSharedPointer< T > decodeObject(const QByteArray &pData)
Template function for decoding an OpenSSL type from DER encoded QByteArray.
Definition: ASN1TemplateUtil.h:100
int encodeAsn1Object(T *, unsigned char **)
Default template function for encoding an OpenSSL type.
Definition: ASN1TemplateUtil.h:49
QByteArray encodeObject(T *pObject)
Template function for encoding an OpenSSL type as DER encoded QByteArray.
Definition: ASN1TemplateUtil.h:60