Fix a rather sloppy test case in tst_QSslKey
It's not guaranteed that all curves we want to use are supported by a specific build of OpenSSL library we have to link with. Filter out files that contain EC, which is not among the curves, reported by QSslConfiguration::supportedEllipticCurves. Fixes: QTBUG-46203 Pick-to: 5.15 Change-Id: I70d7e6fcacb3d81f8c771e4a8d6cca06295e7474 Reviewed-by: Timur Pocheptsov <timur.pocheptsov@qt.io>
This commit is contained in:
parent
781ecbfc6f
commit
4f658d04da
@ -31,10 +31,16 @@
|
|||||||
#include <qsslkey.h>
|
#include <qsslkey.h>
|
||||||
#include <qsslsocket.h>
|
#include <qsslsocket.h>
|
||||||
#include <QScopeGuard>
|
#include <QScopeGuard>
|
||||||
|
#include <qsslconfiguration.h>
|
||||||
|
#include <qsslellipticcurve.h>
|
||||||
|
|
||||||
#include <QtNetwork/qhostaddress.h>
|
#include <QtNetwork/qhostaddress.h>
|
||||||
#include <QtNetwork/qnetworkproxy.h>
|
#include <QtNetwork/qnetworkproxy.h>
|
||||||
|
|
||||||
|
#include <QtCore/qstring.h>
|
||||||
|
#include <QtCore/qdebug.h>
|
||||||
|
#include <QtCore/qlist.h>
|
||||||
|
|
||||||
#ifdef QT_BUILD_INTERNAL
|
#ifdef QT_BUILD_INTERNAL
|
||||||
#ifndef QT_NO_SSL
|
#ifndef QT_NO_SSL
|
||||||
#include "private/qsslkey_p.h"
|
#include "private/qsslkey_p.h"
|
||||||
@ -45,6 +51,8 @@
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
class tst_QSslKey : public QObject
|
class tst_QSslKey : public QObject
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
@ -65,6 +73,8 @@ class tst_QSslKey : public QObject
|
|||||||
QList<KeyInfo> keyInfoList;
|
QList<KeyInfo> keyInfoList;
|
||||||
|
|
||||||
void createPlainTestRows(bool pemOnly = false);
|
void createPlainTestRows(bool pemOnly = false);
|
||||||
|
public:
|
||||||
|
tst_QSslKey();
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void initTestCase();
|
void initTestCase();
|
||||||
@ -100,8 +110,46 @@ private slots:
|
|||||||
#endif
|
#endif
|
||||||
private:
|
private:
|
||||||
QString testDataDir;
|
QString testDataDir;
|
||||||
|
|
||||||
|
bool fileContainsUnsupportedEllipticCurve(const QString &fileName) const;
|
||||||
|
QVector<QString> unsupportedCurves;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
tst_QSslKey::tst_QSslKey()
|
||||||
|
{
|
||||||
|
const QString expectedCurves[] = {
|
||||||
|
// See how we generate them in keys/genkey.sh.
|
||||||
|
QStringLiteral("secp224r1"),
|
||||||
|
QStringLiteral("prime256v1"),
|
||||||
|
QStringLiteral("secp384r1"),
|
||||||
|
QStringLiteral("brainpoolP256r1"),
|
||||||
|
QStringLiteral("brainpoolP384r1"),
|
||||||
|
QStringLiteral("brainpoolP512r1")
|
||||||
|
};
|
||||||
|
const auto supportedCurves = QSslConfiguration::supportedEllipticCurves();
|
||||||
|
|
||||||
|
for (const auto &requestedEc : expectedCurves) {
|
||||||
|
auto pos = std::find_if(supportedCurves.begin(), supportedCurves.end(),
|
||||||
|
[&requestedEc](const auto &supported) {
|
||||||
|
return requestedEc == supported.shortName();
|
||||||
|
});
|
||||||
|
if (pos == supportedCurves.end()) {
|
||||||
|
qWarning() << "EC with the name:" << requestedEc
|
||||||
|
<< "is not supported by your build of OpenSSL and will not be tested.";
|
||||||
|
unsupportedCurves.push_back(requestedEc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool tst_QSslKey::fileContainsUnsupportedEllipticCurve(const QString &fileName) const
|
||||||
|
{
|
||||||
|
for (const auto &name : unsupportedCurves) {
|
||||||
|
if (fileName.contains(name))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
void tst_QSslKey::initTestCase()
|
void tst_QSslKey::initTestCase()
|
||||||
{
|
{
|
||||||
testDataDir = QFileInfo(QFINDTESTDATA("rsa-without-passphrase.pem")).absolutePath();
|
testDataDir = QFileInfo(QFINDTESTDATA("rsa-without-passphrase.pem")).absolutePath();
|
||||||
@ -114,6 +162,8 @@ void tst_QSslKey::initTestCase()
|
|||||||
const QFileInfoList fileInfoList = dir.entryInfoList(QDir::Files | QDir::Readable);
|
const QFileInfoList fileInfoList = dir.entryInfoList(QDir::Files | QDir::Readable);
|
||||||
QRegularExpression rx(QLatin1String("^(rsa|dsa|dh|ec)-(pub|pri)-(\\d+)-?[\\w-]*\\.(pem|der)$"));
|
QRegularExpression rx(QLatin1String("^(rsa|dsa|dh|ec)-(pub|pri)-(\\d+)-?[\\w-]*\\.(pem|der)$"));
|
||||||
for (const QFileInfo &fileInfo : fileInfoList) {
|
for (const QFileInfo &fileInfo : fileInfoList) {
|
||||||
|
if (fileContainsUnsupportedEllipticCurve(fileInfo.fileName()))
|
||||||
|
continue;
|
||||||
auto match = rx.match(fileInfo.fileName());
|
auto match = rx.match(fileInfo.fileName());
|
||||||
if (match.hasMatch()) {
|
if (match.hasMatch()) {
|
||||||
keyInfoList << KeyInfo(
|
keyInfoList << KeyInfo(
|
||||||
@ -239,14 +289,9 @@ void tst_QSslKey::constructorHandle()
|
|||||||
BIO* bio = q_BIO_new(q_BIO_s_mem());
|
BIO* bio = q_BIO_new(q_BIO_s_mem());
|
||||||
q_BIO_write(bio, pem.constData(), pem.length());
|
q_BIO_write(bio, pem.constData(), pem.length());
|
||||||
EVP_PKEY *origin = func(bio, nullptr, nullptr, static_cast<void *>(passphrase.data()));
|
EVP_PKEY *origin = func(bio, nullptr, nullptr, static_cast<void *>(passphrase.data()));
|
||||||
#if QT_CONFIG(opensslv11)
|
Q_ASSERT(origin);
|
||||||
q_EVP_PKEY_up_ref(origin);
|
q_EVP_PKEY_up_ref(origin);
|
||||||
#endif
|
|
||||||
QSslKey key(origin, type);
|
QSslKey key(origin, type);
|
||||||
#if !QT_CONFIG(opensslv11)
|
|
||||||
q_BIO_write(bio, pem.constData(), pem.length());
|
|
||||||
origin = func(bio, nullptr, nullptr, static_cast<void *>(passphrase.data()));
|
|
||||||
#endif
|
|
||||||
q_BIO_free(bio);
|
q_BIO_free(bio);
|
||||||
|
|
||||||
EVP_PKEY *handle = q_EVP_PKEY_new();
|
EVP_PKEY *handle = q_EVP_PKEY_new();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user