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);
42 static QSharedPointer<EVP_PKEY>
create(EVP_PKEY* pEcGroup);
44 static QSharedPointer<EVP_PKEY_CTX>
create(EVP_PKEY_CTX* pEcGroup);
47 inline QByteArray
EcUtil::point2oct(
const QSharedPointer<const EC_GROUP>& pCurve,
const EC_POINT* pPoint)
49 if (pCurve.isNull() || pPoint ==
nullptr)
51 qCCritical(card) <<
"Invalid input data, cannot encode elliptic curve point";
55 size_t buf_size = EC_POINT_point2oct(pCurve.data(), pPoint, POINT_CONVERSION_UNCOMPRESSED,
nullptr, 0,
nullptr);
59 qCCritical(card) <<
"Cannot encode elliptic curve point";
60 Q_ASSERT(buf_size != 0);
63 if (buf_size > INT_MAX)
65 qCCritical(card) <<
"Cannot encode elliptic curve point";
66 Q_ASSERT(buf_size <= INT_MAX);
70 QVector<uchar> buf(static_cast<int>(buf_size));
71 if (!EC_POINT_point2oct(pCurve.data(), pPoint, POINT_CONVERSION_UNCOMPRESSED, buf.data(), buf_size,
nullptr))
73 qCCritical(card) <<
"Cannot encode elliptic curve point";
77 QByteArray uncompressed(reinterpret_cast<char*>(buf.data()), static_cast<int>(buf_size));
82 inline QSharedPointer<EC_POINT>
EcUtil::oct2point(
const QSharedPointer<const EC_GROUP>& pCurve,
const QByteArray& pCompressedData)
84 QSharedPointer<EC_POINT> point =
EcUtil::create(EC_POINT_new(pCurve.data()));
85 if (!EC_POINT_oct2point(pCurve.data(), point.data(),
reinterpret_cast<const uchar*
>(pCompressedData.constData()), static_cast<size_t>(pCompressedData.size()),
nullptr))
87 qCCritical(card) <<
"Cannot decode elliptic curve point";
88 return QSharedPointer<EC_POINT>();
90 if (!EC_POINT_is_on_curve(pCurve.data(), point.data(),
nullptr))
92 qCCritical(card) <<
"Decoded point is not on curve";
93 return QSharedPointer<EC_POINT>();
101 static auto deleter = [](EC_GROUP* ecCurve)
103 EC_GROUP_free(ecCurve);
106 return QSharedPointer<EC_GROUP>(pEcGroup, deleter);
112 static auto deleter = [](EC_KEY* ecKey)
117 return QSharedPointer<EC_KEY>(pEcKey, deleter);
123 static auto deleter = [](EC_POINT* ecPoint)
125 EC_POINT_clear_free(ecPoint);
128 return QSharedPointer<EC_POINT>(pEcPoint, deleter);
134 static auto deleter = [](BIGNUM* bigNum)
136 BN_clear_free(bigNum);
139 return QSharedPointer<BIGNUM>(pBigNum, deleter);
145 static auto deleter = [](ECDSA_SIG* ecdsaSignature)
147 ECDSA_SIG_free(ecdsaSignature);
150 return QSharedPointer<ECDSA_SIG>(pEcdsaSignature, deleter);
156 static auto deleter = [](EVP_PKEY* key)
161 return QSharedPointer<EVP_PKEY>(pKey, deleter);
167 static auto deleter = [](EVP_PKEY_CTX* ctx)
169 EVP_PKEY_CTX_free(ctx);
172 return QSharedPointer<EVP_PKEY_CTX>(pCtx, deleter);
static QByteArray point2oct(const QSharedPointer< const EC_GROUP > &pCurve, const EC_POINT *pPoint)
Definition: EcUtil.h:47
static QSharedPointer< EC_POINT > oct2point(const QSharedPointer< const EC_GROUP > &pCurve, const QByteArray &pCompressedData)
Definition: EcUtil.h:82
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:99