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