AusweisApp2
 Alle Klassen Namensbereiche Dateien Funktionen Variablen Typdefinitionen Aufzählungen Aufzählungswerte Propertys Freundbeziehungen Makrodefinitionen
EcUtil.h
gehe zur Dokumentation dieser Datei
1 
7 #pragma once
8 
9 #include <QByteArray>
10 #include <QLoggingCategory>
11 #include <QSharedPointer>
12 
13 #include <openssl/ec.h>
14 #include <openssl/ecdsa.h>
15 #include <openssl/evp.h>
16 
17 
18 Q_DECLARE_LOGGING_CATEGORY(card)
19 
20 
21 namespace governikus
22 {
23 
24 class EcUtil
25 {
26  public:
27  static QByteArray point2oct(const QSharedPointer<const EC_GROUP>& pCurve, const EC_POINT* pPoint);
28 
29  static QSharedPointer<EC_POINT> oct2point(const QSharedPointer<const EC_GROUP>& pCurve, const QByteArray& pCompressedData);
30 
31  static QSharedPointer<EC_GROUP> create(EC_GROUP* pEcGroup);
32 
33  static QSharedPointer<EC_KEY> create(EC_KEY* pEcKey);
34 
35  static QSharedPointer<EC_POINT> create(EC_POINT* pEcPoint);
36 
37  static QSharedPointer<BIGNUM> create(BIGNUM* pBigNum);
38 
39  static QSharedPointer<ECDSA_SIG> create(ECDSA_SIG* pEcdsaSignature);
40 
41 };
42 
43 inline QByteArray EcUtil::point2oct(const QSharedPointer<const EC_GROUP>& pCurve, const EC_POINT* pPoint)
44 {
45  if (pCurve.isNull() || pPoint == nullptr)
46  {
47  qCCritical(card) << "Invalid input data, cannot encode elliptic curve point";
48  return QByteArray();
49  }
50 
51  size_t buf_size = EC_POINT_point2oct(pCurve.data(), pPoint, POINT_CONVERSION_UNCOMPRESSED, nullptr, 0, nullptr);
52 
53  if (buf_size == 0)
54  {
55  qCCritical(card) << "Cannot encode elliptic curve point";
56  Q_ASSERT(buf_size != 0);
57  return QByteArray();
58  }
59  if (buf_size > INT_MAX)
60  {
61  qCCritical(card) << "Cannot encode elliptic curve point";
62  Q_ASSERT(buf_size <= INT_MAX);
63  return QByteArray();
64  }
65 
66  QVector<uchar> buf(static_cast<int>(buf_size));
67  if (!EC_POINT_point2oct(pCurve.data(), pPoint, POINT_CONVERSION_UNCOMPRESSED, buf.data(), buf_size, nullptr))
68  {
69  qCCritical(card) << "Cannot encode elliptic curve point";
70  return QByteArray();
71  }
72 
73  QByteArray uncompressed(reinterpret_cast<char*>(buf.data()), static_cast<int>(buf_size));
74  return uncompressed;
75 }
76 
77 
78 inline QSharedPointer<EC_POINT> EcUtil::oct2point(const QSharedPointer<const EC_GROUP>& pCurve, const QByteArray& pCompressedData)
79 {
80  QSharedPointer<EC_POINT> point = EcUtil::create(EC_POINT_new(pCurve.data()));
81  if (!EC_POINT_oct2point(pCurve.data(), point.data(), reinterpret_cast<const uchar*>(pCompressedData.constData()), static_cast<size_t>(pCompressedData.size()), nullptr))
82  {
83  qCCritical(card) << "Cannot decode elliptic curve point";
84  return QSharedPointer<EC_POINT>();
85  }
86  if (!EC_POINT_is_on_curve(pCurve.data(), point.data(), nullptr))
87  {
88  qCCritical(card) << "Decoded point is not on curve";
89  return QSharedPointer<EC_POINT>();
90  }
91  return point;
92 }
93 
94 
95 inline QSharedPointer<EC_GROUP> EcUtil::create(EC_GROUP* pEcGroup)
96 {
97  static auto deleter = [](EC_GROUP* ecCurve)
98  {
99  EC_GROUP_clear_free(ecCurve);
100  };
101 
102  return QSharedPointer<EC_GROUP>(pEcGroup, deleter);
103 }
104 
105 
106 inline QSharedPointer<EC_KEY> EcUtil::create(EC_KEY* pEcKey)
107 {
108  static auto deleter = [](EC_KEY* ecKey)
109  {
110  EC_KEY_free(ecKey);
111  };
112 
113  return QSharedPointer<EC_KEY>(pEcKey, deleter);
114 }
115 
116 
117 inline QSharedPointer<EC_POINT> EcUtil::create(EC_POINT* pEcPoint)
118 {
119  static auto deleter = [](EC_POINT* ecPoint)
120  {
121  EC_POINT_clear_free(ecPoint);
122  };
123 
124  return QSharedPointer<EC_POINT>(pEcPoint, deleter);
125 }
126 
127 
128 inline QSharedPointer<BIGNUM> EcUtil::create(BIGNUM* pBigNum)
129 {
130  static auto deleter = [](BIGNUM* bigNum)
131  {
132  BN_clear_free(bigNum);
133  };
134 
135  return QSharedPointer<BIGNUM>(pBigNum, deleter);
136 }
137 
138 
139 inline QSharedPointer<ECDSA_SIG> EcUtil::create(ECDSA_SIG* pEcdsaSignature)
140 {
141  static auto deleter = [](ECDSA_SIG* ecdsaSignature)
142  {
143  ECDSA_SIG_free(ecdsaSignature);
144  };
145 
146  return QSharedPointer<ECDSA_SIG>(pEcdsaSignature, deleter);
147 }
148 
149 
150 } /* namespace governikus */
Definition: EcUtil.h:24