10 #include <QLoggingCategory> 11 #include <QSharedPointer> 13 #include <openssl/bn.h> 14 #include <openssl/ec.h> 15 #include <openssl/ecdsa.h> 16 #include <openssl/evp.h> 19 Q_DECLARE_LOGGING_CATEGORY(card)
28 static QByteArray
point2oct(
const QSharedPointer<const EC_GROUP>& pCurve,
const EC_POINT* pPoint);
30 static QSharedPointer<EC_POINT>
oct2point(
const QSharedPointer<const EC_GROUP>& pCurve,
const QByteArray& pCompressedData);
32 static QSharedPointer<EC_GROUP>
create(EC_GROUP* pEcGroup);
34 static QSharedPointer<EC_KEY>
create(EC_KEY* pEcKey);
36 static QSharedPointer<EC_POINT>
create(EC_POINT* pEcPoint);
38 static QSharedPointer<BIGNUM>
create(BIGNUM* pBigNum);
40 static QSharedPointer<ECDSA_SIG>
create(ECDSA_SIG* pEcdsaSignature);
44 inline QByteArray
EcUtil::point2oct(
const QSharedPointer<const EC_GROUP>& pCurve,
const EC_POINT* pPoint)
46 if (pCurve.isNull() || pPoint ==
nullptr)
48 qCCritical(card) <<
"Invalid input data, cannot encode elliptic curve point";
52 size_t buf_size = EC_POINT_point2oct(pCurve.data(), pPoint, POINT_CONVERSION_UNCOMPRESSED,
nullptr, 0,
nullptr);
56 qCCritical(card) <<
"Cannot encode elliptic curve point";
57 Q_ASSERT(buf_size != 0);
60 if (buf_size > INT_MAX)
62 qCCritical(card) <<
"Cannot encode elliptic curve point";
63 Q_ASSERT(buf_size <= INT_MAX);
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))
70 qCCritical(card) <<
"Cannot encode elliptic curve point";
74 QByteArray uncompressed(reinterpret_cast<char*>(buf.data()), static_cast<int>(buf_size));
79 inline QSharedPointer<EC_POINT>
EcUtil::oct2point(
const QSharedPointer<const EC_GROUP>& pCurve,
const QByteArray& pCompressedData)
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))
84 qCCritical(card) <<
"Cannot decode elliptic curve point";
85 return QSharedPointer<EC_POINT>();
87 if (!EC_POINT_is_on_curve(pCurve.data(), point.data(),
nullptr))
89 qCCritical(card) <<
"Decoded point is not on curve";
90 return QSharedPointer<EC_POINT>();
98 static auto deleter = [](EC_GROUP* ecCurve)
100 EC_GROUP_clear_free(ecCurve);
103 return QSharedPointer<EC_GROUP>(pEcGroup, deleter);
109 static auto deleter = [](EC_KEY* ecKey)
114 return QSharedPointer<EC_KEY>(pEcKey, deleter);
120 static auto deleter = [](EC_POINT* ecPoint)
122 EC_POINT_clear_free(ecPoint);
125 return QSharedPointer<EC_POINT>(pEcPoint, deleter);
131 static auto deleter = [](BIGNUM* bigNum)
133 BN_clear_free(bigNum);
136 return QSharedPointer<BIGNUM>(pBigNum, deleter);
142 static auto deleter = [](ECDSA_SIG* ecdsaSignature)
144 ECDSA_SIG_free(ecdsaSignature);
147 return QSharedPointer<ECDSA_SIG>(pEcdsaSignature, deleter);
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