diff options
Diffstat (limited to 'tests/auto/network/ssl/qsslkey')
-rw-r--r-- | tests/auto/network/ssl/qsslkey/BLACKLIST | 9 | ||||
-rw-r--r-- | tests/auto/network/ssl/qsslkey/CMakeLists.txt | 23 | ||||
-rwxr-xr-x | tests/auto/network/ssl/qsslkey/keys/genkeys.sh | 29 | ||||
-rw-r--r-- | tests/auto/network/ssl/qsslkey/qsslkey.pro | 12 | ||||
-rw-r--r-- | tests/auto/network/ssl/qsslkey/tst_qsslkey.cpp | 268 |
5 files changed, 181 insertions, 160 deletions
diff --git a/tests/auto/network/ssl/qsslkey/BLACKLIST b/tests/auto/network/ssl/qsslkey/BLACKLIST deleted file mode 100644 index 19fb15cd1f..0000000000 --- a/tests/auto/network/ssl/qsslkey/BLACKLIST +++ /dev/null @@ -1,9 +0,0 @@ -[constructor] -rhel -[length] -rhel -[toEncryptedPemOrDer] -rhel -[toPemOrDer] -rhel - diff --git a/tests/auto/network/ssl/qsslkey/CMakeLists.txt b/tests/auto/network/ssl/qsslkey/CMakeLists.txt index e83f4c1f40..aae017562a 100644 --- a/tests/auto/network/ssl/qsslkey/CMakeLists.txt +++ b/tests/auto/network/ssl/qsslkey/CMakeLists.txt @@ -1,9 +1,16 @@ -# Generated from qsslkey.pro. +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause ##################################################################### ## tst_qsslkey Test: ##################################################################### +if(NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT) + cmake_minimum_required(VERSION 3.16) + project(tst_qsslkey LANGUAGES CXX) + find_package(Qt6BuildInternals REQUIRED COMPONENTS STANDALONE_TEST) +endif() + # Collect test data file(GLOB_RECURSE test_data_glob RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} @@ -14,19 +21,25 @@ file(GLOB_RECURSE test_data_glob rsa-*.pem) list(APPEND test_data ${test_data_glob}) -qt_add_test(tst_qsslkey +qt_internal_add_test(tst_qsslkey SOURCES tst_qsslkey.cpp - PUBLIC_LIBRARIES + LIBRARIES Qt::Network TESTDATA ${test_data} + BUNDLE_ANDROID_OPENSSL_LIBS +) + +qt_internal_extend_target(tst_qsslkey CONDITION QT_FEATURE_developer_build AND QT_FEATURE_openssl_linked + LIBRARIES + WrapOpenSSL::WrapOpenSSL ) ## Scopes: ##################################################################### -qt_extend_target(tst_qsslkey CONDITION QT_FEATURE_private_tests - PUBLIC_LIBRARIES +qt_internal_extend_target(tst_qsslkey CONDITION QT_FEATURE_developer_build + LIBRARIES Qt::CorePrivate Qt::NetworkPrivate ) diff --git a/tests/auto/network/ssl/qsslkey/keys/genkeys.sh b/tests/auto/network/ssl/qsslkey/keys/genkeys.sh index 0106953bff..afa4b7fe84 100755 --- a/tests/auto/network/ssl/qsslkey/keys/genkeys.sh +++ b/tests/auto/network/ssl/qsslkey/keys/genkeys.sh @@ -1,31 +1,6 @@ #!/bin/sh -############################################################################# -## -## Copyright (C) 2016 The Qt Company Ltd. -## Contact: https://www.qt.io/licensing/ -## -## This file is the build configuration utility of the Qt Toolkit. -## -## $QT_BEGIN_LICENSE:GPL-EXCEPT$ -## Commercial License Usage -## Licensees holding valid commercial Qt licenses may use this file in -## accordance with the commercial license agreement provided with the -## Software or, alternatively, in accordance with the terms contained in -## a written agreement between you and The Qt Company. For licensing terms -## and conditions see https://www.qt.io/terms-conditions. For further -## information use the contact form at https://www.qt.io/contact-us. -## -## GNU General Public License Usage -## Alternatively, this file may be used under the terms of the GNU -## General Public License version 3 as published by the Free Software -## Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -## included in the packaging of this file. Please review the following -## information to ensure the GNU General Public License requirements will -## be met: https://www.gnu.org/licenses/gpl-3.0.html. -## -## $QT_END_LICENSE$ -## -############################################################################# +# Copyright (C) 2016 The Qt Company Ltd. +# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 # This script generates cryptographic keys of different types. diff --git a/tests/auto/network/ssl/qsslkey/qsslkey.pro b/tests/auto/network/ssl/qsslkey/qsslkey.pro deleted file mode 100644 index 8ed65e68ad..0000000000 --- a/tests/auto/network/ssl/qsslkey/qsslkey.pro +++ /dev/null @@ -1,12 +0,0 @@ -CONFIG += testcase - -SOURCES += tst_qsslkey.cpp -QT = core network testlib -qtConfig(private_tests) { - QT += core-private network-private -} - -TARGET = tst_qsslkey - -TESTDATA += keys/* \ - rsa-*.pem diff --git a/tests/auto/network/ssl/qsslkey/tst_qsslkey.cpp b/tests/auto/network/ssl/qsslkey/tst_qsslkey.cpp index b1dbd2773b..79bae3c270 100644 --- a/tests/auto/network/ssl/qsslkey/tst_qsslkey.cpp +++ b/tests/auto/network/ssl/qsslkey/tst_qsslkey.cpp @@ -1,33 +1,7 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - - -#include <QtTest/QtTest> +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#include <QTest> #include <qsslkey.h> #include <qsslsocket.h> #include <QScopeGuard> @@ -41,16 +15,22 @@ #include <QtCore/qdebug.h> #include <QtCore/qlist.h> +using namespace Qt::StringLiterals; + #ifdef QT_BUILD_INTERNAL - #ifndef QT_NO_SSL + #if QT_CONFIG(ssl) #include "private/qsslkey_p.h" #define TEST_CRYPTO #endif #ifndef QT_NO_OPENSSL - #include "private/qsslsocket_openssl_symbols_p.h" + #include "../shared/qopenssl_symbols.h" #endif #endif +#if QT_CONFIG(ssl) +#include <QtNetwork/qsslsocket.h> +#endif // QT_CONFIG(ssl) + #include <algorithm> class tst_QSslKey : public QObject @@ -79,7 +59,7 @@ public: public slots: void initTestCase(); -#ifndef QT_NO_SSL +#if QT_CONFIG(ssl) private slots: void emptyConstructor(); @@ -107,16 +87,23 @@ private slots: void encrypt(); #endif -#endif +#endif // ssl private: QString testDataDir; bool fileContainsUnsupportedEllipticCurve(const QString &fileName) const; + bool algorithmsSupported(const QString &fileName) const; QVector<QString> unsupportedCurves; + + bool isOpenSsl = false; + bool isOpenSslResolved = false; + bool isSecureTransport = false; + bool isSchannel = false; }; tst_QSslKey::tst_QSslKey() { +#if QT_CONFIG(ssl) const QString expectedCurves[] = { // See how we generate them in keys/genkey.sh. QStringLiteral("secp224r1"), @@ -139,6 +126,25 @@ tst_QSslKey::tst_QSslKey() unsupportedCurves.push_back(requestedEc); } } + // Alas, we don't use network-private (and why?). + const auto backendName = QSslSocket::activeBackend(); + isOpenSsl = backendName == QStringLiteral("openssl"); + + if (isOpenSsl) { +#if !defined(QT_NO_OPENSSL) && defined(QT_BUILD_INTERNAL) + isOpenSslResolved = qt_auto_test_resolve_OpenSSL_symbols(); +#else + isOpenSslResolved = false; // not 'unused variable' anymore. +#endif + } else { + isSecureTransport = backendName == QStringLiteral("securetransport"); + } + + if (!isOpenSsl && !isSecureTransport) + isSchannel = backendName == QStringLiteral("schannel"); +#else + unsupportedCurves = {}; // not unsued anymore. +#endif } bool tst_QSslKey::fileContainsUnsupportedEllipticCurve(const QString &fileName) const @@ -150,6 +156,37 @@ bool tst_QSslKey::fileContainsUnsupportedEllipticCurve(const QString &fileName) return false; } +bool tst_QSslKey::algorithmsSupported(const QString &fileName) const +{ +#if QT_CONFIG(ssl) + if (isSchannel && fileName.contains("RC2-64")) // Schannel treats RC2 as 128 bit + return false; + + if (isSchannel || isSecureTransport) { + // No AES support in the generic back-end, PKCS#12 algorithms not supported either. + return !(fileName.contains(QRegularExpression("-aes\\d\\d\\d-")) || fileName.contains("pkcs8-pkcs12")); + } + + if (!isOpenSsl || QSslSocket::sslLibraryVersionNumber() >> 28 < 3) + return true; + + // OpenSSL v3 first introduced the notion of 'providers'. Many algorithms + // were moved into the 'legacy' provider. While they are still supported in theory, + // the 'legacy' provider is NOT loaded by default and we are not loading it either. + // Thus, some of the keys we are using in tst_QSslKey would fail the test. We + // have to filter them out. + const auto name = fileName.toLower(); + if (name.contains("-des.")) + return false; + + return !name.contains("-rc2-") && !name.contains("-rc4-"); +#else + Q_UNUSED(fileName); + return false; +#endif // QT_CONFIG(ssl) +} + + void tst_QSslKey::initTestCase() { testDataDir = QFileInfo(QFINDTESTDATA("rsa-without-passphrase.pem")).absolutePath(); @@ -178,13 +215,13 @@ void tst_QSslKey::initTestCase() } } -#ifndef QT_NO_SSL +#if QT_CONFIG(ssl) static QByteArray readFile(const QString &absFilePath) { QFile file(absFilePath); if (!file.open(QIODevice::ReadOnly)) { - QWARN("failed to open file"); + qWarning("failed to open file"); return QByteArray(); } return file.readAll(); @@ -214,19 +251,12 @@ void tst_QSslKey::createPlainTestRows(bool pemOnly) QTest::addColumn<QSsl::KeyType>("type"); QTest::addColumn<int>("length"); QTest::addColumn<QSsl::EncodingFormat>("format"); - foreach (KeyInfo keyInfo, keyInfoList) { + for (const KeyInfo &keyInfo : std::as_const(keyInfoList)) { if (pemOnly && keyInfo.format != QSsl::EncodingFormat::Pem) continue; -#if QT_CONFIG(schannel) - if (keyInfo.fileInfo.fileName().contains("RC2-64")) - continue; // Schannel treats RC2 as 128 bit -#endif -#if !defined(QT_NO_SSL) && defined(QT_NO_OPENSSL) // generic backend - if (keyInfo.fileInfo.fileName().contains(QRegularExpression("-aes\\d\\d\\d-"))) - continue; // No AES support in the generic back-end - if (keyInfo.fileInfo.fileName().contains("pkcs8-pkcs12")) - continue; // The generic back-end doesn't support PKCS#12 algorithms -#endif + + if (!algorithmsSupported(keyInfo.fileInfo.fileName())) + continue; QTest::newRow(keyInfo.fileInfo.fileName().toLatin1()) << keyInfo.fileInfo.absoluteFilePath() << keyInfo.algorithm << keyInfo.type @@ -269,7 +299,7 @@ void tst_QSslKey::constructorHandle() #ifndef QT_BUILD_INTERNAL QSKIP("This test requires -developer-build."); #else - if (!QSslSocket::supportsSsl()) + if (!isOpenSslResolved) return; QFETCH(QString, absFilePath); @@ -287,7 +317,7 @@ void tst_QSslKey::constructorHandle() passphrase = "1234"; BIO* bio = q_BIO_new(q_BIO_s_mem()); - q_BIO_write(bio, pem.constData(), pem.length()); + q_BIO_write(bio, pem.constData(), pem.size()); EVP_PKEY *origin = func(bio, nullptr, nullptr, static_cast<void *>(passphrase.data())); Q_ASSERT(origin); q_EVP_PKEY_up_ref(origin); @@ -327,7 +357,7 @@ void tst_QSslKey::constructorHandle() #endif } -#endif +#endif // !QT_NO_OPENSSL void tst_QSslKey::copyAndAssign_data() { @@ -415,13 +445,13 @@ void tst_QSslKey::toPemOrDer() QByteArray dataTag = QByteArray(QTest::currentDataTag()); if (dataTag.contains("-pkcs8-")) // these are encrypted QSKIP("Encrypted PKCS#8 keys gets decrypted when loaded. So we can't compare it to the encrypted version."); -#ifndef QT_NO_OPENSSL - if (dataTag.contains("pkcs8")) - QSKIP("OpenSSL converts PKCS#8 keys to other formats, invalidating comparisons."); -#else // !openssl - if (dataTag.contains("pkcs8") && dataTag.contains("rsa")) - QSKIP("PKCS#8 RSA keys are changed into a different format in the generic back-end, meaning the comparison fails."); -#endif // openssl + + if (dataTag.contains("pkcs8")) { + if (isOpenSsl) + QSKIP("OpenSSL converts PKCS#8 keys to other formats, invalidating comparisons."); + else if (dataTag.contains("rsa")) + QSKIP("PKCS#8 RSA keys are changed into a different format in the generic back-end, meaning the comparison fails."); + } QByteArray encoded = readFile(absFilePath); QSslKey key(encoded, algorithm, format, type); @@ -439,13 +469,18 @@ void tst_QSslKey::toEncryptedPemOrDer_data() QTest::addColumn<QSsl::EncodingFormat>("format"); QTest::addColumn<QString>("password"); - QStringList passwords; - passwords << " " << "foobar" << "foo bar" - << "aAzZ`1234567890-=~!@#$%^&*()_+[]{}\\|;:'\",.<>/?"; // ### add more (?) - foreach (KeyInfo keyInfo, keyInfoList) { + const QString passwords[] = { + u" "_s, + u"foobar"_s, + u"foo bar"_s, + u"aAzZ`1234567890-=~!@#$%^&*()_+[]{}\\|;:'\",.<>/?"_s, + // ### add more (?) + }; + + for (const KeyInfo &keyInfo : std::as_const(keyInfoList)) { if (keyInfo.fileInfo.fileName().contains("pkcs8")) continue; // pkcs8 keys are encrypted in a different way than the other keys - foreach (QString password, passwords) { + for (const QString &password : passwords) { const QByteArray testName = keyInfo.fileInfo.fileName().toLatin1() + '-' + (keyInfo.algorithm == QSsl::Rsa ? "RSA" : (keyInfo.algorithm == QSsl::Dsa ? "DSA" : "EC")) @@ -511,20 +546,29 @@ void tst_QSslKey::toEncryptedPemOrDer() void tst_QSslKey::passphraseChecks_data() { + if (!QSslSocket::supportsSsl()) + QSKIP("This test requires a working TLS library"); + QTest::addColumn<QString>("fileName"); QTest::addColumn<QByteArray>("passphrase"); const QByteArray pass("123"); const QByteArray aesPass("1234"); - QTest::newRow("DES") << QString(testDataDir + "rsa-with-passphrase-des.pem") << pass; + if (!isOpenSsl || QSslSocket::sslLibraryVersionNumber() >> 28 < 3) { + // DES and RC2 are not provided by default in OpenSSL v3. + // This part is for either non-OpenSSL build, or OpenSSL v < 3.x. + QTest::newRow("DES") << QString(testDataDir + "rsa-with-passphrase-des.pem") << pass; + QTest::newRow("RC2") << QString(testDataDir + "rsa-with-passphrase-rc2.pem") << pass; + } + QTest::newRow("3DES") << QString(testDataDir + "rsa-with-passphrase-3des.pem") << pass; - QTest::newRow("RC2") << QString(testDataDir + "rsa-with-passphrase-rc2.pem") << pass; -#if (!defined(QT_NO_OPENSSL) && !defined(OPENSSL_NO_AES)) || (defined(QT_NO_OPENSSL) && QT_CONFIG(ssl)) + +#if defined(QT_NO_OPENSSL) || !defined(OPENSSL_NO_AES) QTest::newRow("AES128") << QString(testDataDir + "rsa-with-passphrase-aes128.pem") << aesPass; QTest::newRow("AES192") << QString(testDataDir + "rsa-with-passphrase-aes192.pem") << aesPass; QTest::newRow("AES256") << QString(testDataDir + "rsa-with-passphrase-aes256.pem") << aesPass; -#endif // (OpenSSL && AES) || generic backend +#endif // Generic backend || OpenSSL built with AES } void tst_QSslKey::passphraseChecks() @@ -536,7 +580,7 @@ void tst_QSslKey::passphraseChecks() QVERIFY(keyFile.exists()); { if (!keyFile.isOpen()) - keyFile.open(QIODevice::ReadOnly); + QVERIFY(keyFile.open(QIODevice::ReadOnly)); else keyFile.reset(); QSslKey key(&keyFile,QSsl::Rsa,QSsl::Pem, QSsl::PrivateKey); @@ -544,7 +588,7 @@ void tst_QSslKey::passphraseChecks() } { if (!keyFile.isOpen()) - keyFile.open(QIODevice::ReadOnly); + QVERIFY(keyFile.open(QIODevice::ReadOnly)); else keyFile.reset(); QSslKey key(&keyFile,QSsl::Rsa,QSsl::Pem, QSsl::PrivateKey, ""); @@ -552,7 +596,7 @@ void tst_QSslKey::passphraseChecks() } { if (!keyFile.isOpen()) - keyFile.open(QIODevice::ReadOnly); + QVERIFY(keyFile.open(QIODevice::ReadOnly)); else keyFile.reset(); QSslKey key(&keyFile,QSsl::Rsa,QSsl::Pem, QSsl::PrivateKey, "WRONG!"); @@ -560,7 +604,7 @@ void tst_QSslKey::passphraseChecks() } { if (!keyFile.isOpen()) - keyFile.open(QIODevice::ReadOnly); + QVERIFY(keyFile.open(QIODevice::ReadOnly)); else keyFile.reset(); QSslKey key(&keyFile,QSsl::Rsa,QSsl::Pem, QSsl::PrivateKey, passphrase); @@ -570,12 +614,15 @@ void tst_QSslKey::passphraseChecks() void tst_QSslKey::noPassphraseChecks() { + if (!QSslSocket::supportsSsl()) + QSKIP("This test requires a working TLS library"); + // be sure and check a key without passphrase too QString fileName(testDataDir + "rsa-without-passphrase.pem"); QFile keyFile(fileName); { if (!keyFile.isOpen()) - keyFile.open(QIODevice::ReadOnly); + QVERIFY(keyFile.open(QIODevice::ReadOnly)); else keyFile.reset(); QSslKey key(&keyFile,QSsl::Rsa,QSsl::Pem, QSsl::PrivateKey); @@ -583,7 +630,7 @@ void tst_QSslKey::noPassphraseChecks() } { if (!keyFile.isOpen()) - keyFile.open(QIODevice::ReadOnly); + QVERIFY(keyFile.open(QIODevice::ReadOnly)); else keyFile.reset(); QSslKey key(&keyFile,QSsl::Rsa,QSsl::Pem, QSsl::PrivateKey, ""); @@ -591,7 +638,7 @@ void tst_QSslKey::noPassphraseChecks() } { if (!keyFile.isOpen()) - keyFile.open(QIODevice::ReadOnly); + QVERIFY(keyFile.open(QIODevice::ReadOnly)); else keyFile.reset(); QSslKey key(&keyFile,QSsl::Rsa,QSsl::Pem, QSsl::PrivateKey, "xxx"); @@ -604,139 +651,145 @@ Q_DECLARE_METATYPE(QSslKeyPrivate::Cipher) void tst_QSslKey::encrypt_data() { - QTest::addColumn<QSslKeyPrivate::Cipher>("cipher"); + using QTlsPrivate::Cipher; + + QTest::addColumn<Cipher>("cipher"); QTest::addColumn<QByteArray>("key"); QTest::addColumn<QByteArray>("plainText"); QTest::addColumn<QByteArray>("cipherText"); QTest::addColumn<QByteArray>("iv"); QByteArray iv("abcdefgh"); +#if OPENSSL_VERSION_MAJOR < 3 + // Either non-OpenSSL build, or OpenSSL v < 3 + // (with DES and other legacy algorithms available by default) QTest::newRow("DES-CBC, length 0") - << QSslKeyPrivate::DesCbc << QByteArray("01234567") + << Cipher::DesCbc << QByteArray("01234567") << QByteArray() << QByteArray::fromHex("956585228BAF9B1F") << iv; QTest::newRow("DES-CBC, length 1") - << QSslKeyPrivate::DesCbc << QByteArray("01234567") + << Cipher::DesCbc << QByteArray("01234567") << QByteArray(1, 'a') << QByteArray::fromHex("E6880AF202BA3C12") << iv; QTest::newRow("DES-CBC, length 2") - << QSslKeyPrivate::DesCbc << QByteArray("01234567") + << Cipher::DesCbc << QByteArray("01234567") << QByteArray(2, 'a') << QByteArray::fromHex("A82492386EED6026") << iv; QTest::newRow("DES-CBC, length 3") - << QSslKeyPrivate::DesCbc << QByteArray("01234567") + << Cipher::DesCbc << QByteArray("01234567") << QByteArray(3, 'a') << QByteArray::fromHex("90B76D5B79519CBA") << iv; QTest::newRow("DES-CBC, length 4") - << QSslKeyPrivate::DesCbc << QByteArray("01234567") + << Cipher::DesCbc << QByteArray("01234567") << QByteArray(4, 'a') << QByteArray::fromHex("63E3DD6FED87052A") << iv; QTest::newRow("DES-CBC, length 5") - << QSslKeyPrivate::DesCbc << QByteArray("01234567") + << Cipher::DesCbc << QByteArray("01234567") << QByteArray(5, 'a') << QByteArray::fromHex("03ACDB0EACBDFA94") << iv; QTest::newRow("DES-CBC, length 6") - << QSslKeyPrivate::DesCbc << QByteArray("01234567") + << Cipher::DesCbc << QByteArray("01234567") << QByteArray(6, 'a') << QByteArray::fromHex("7D95024E42A3A88A") << iv; QTest::newRow("DES-CBC, length 7") - << QSslKeyPrivate::DesCbc << QByteArray("01234567") + << Cipher::DesCbc << QByteArray("01234567") << QByteArray(7, 'a') << QByteArray::fromHex("5003436B8A8E42E9") << iv; QTest::newRow("DES-CBC, length 8") - << QSslKeyPrivate::DesCbc << QByteArray("01234567") + << Cipher::DesCbc << QByteArray("01234567") << QByteArray(8, 'a') << QByteArray::fromHex("E4C1F054BF5521C0A4A0FD4A2BC6C1B1") << iv; QTest::newRow("DES-EDE3-CBC, length 0") - << QSslKeyPrivate::DesEde3Cbc << QByteArray("0123456789abcdefghijklmn") + << Cipher::DesEde3Cbc << QByteArray("0123456789abcdefghijklmn") << QByteArray() << QByteArray::fromHex("3B2B4CD0B0FD495F") << iv; QTest::newRow("DES-EDE3-CBC, length 8") - << QSslKeyPrivate::DesEde3Cbc << QByteArray("0123456789abcdefghijklmn") + << Cipher::DesEde3Cbc << QByteArray("0123456789abcdefghijklmn") << QByteArray(8, 'a') << QByteArray::fromHex("F2A5A87763C54A72A3224103D90CDB03") << iv; QTest::newRow("RC2-40-CBC, length 0") - << QSslKeyPrivate::Rc2Cbc << QByteArray("01234") + << Cipher::Rc2Cbc << QByteArray("01234") << QByteArray() << QByteArray::fromHex("6D05D52392FF6E7A") << iv; QTest::newRow("RC2-40-CBC, length 8") - << QSslKeyPrivate::Rc2Cbc << QByteArray("01234") + << Cipher::Rc2Cbc << QByteArray("01234") << QByteArray(8, 'a') << QByteArray::fromHex("75768E64C5749072A5D168F3AFEB0005") << iv; QTest::newRow("RC2-64-CBC, length 0") - << QSslKeyPrivate::Rc2Cbc << QByteArray("01234567") + << Cipher::Rc2Cbc << QByteArray("01234567") << QByteArray() << QByteArray::fromHex("ADAE6BF70F420130") << iv; QTest::newRow("RC2-64-CBC, length 8") - << QSslKeyPrivate::Rc2Cbc << QByteArray("01234567") + << Cipher::Rc2Cbc << QByteArray("01234567") << QByteArray(8, 'a') << QByteArray::fromHex("C7BF5C80AFBE9FBEFBBB9FD935F6D0DF") << iv; QTest::newRow("RC2-128-CBC, length 0") - << QSslKeyPrivate::Rc2Cbc << QByteArray("012345679abcdefg") + << Cipher::Rc2Cbc << QByteArray("012345679abcdefg") << QByteArray() << QByteArray::fromHex("1E965D483A13C8FB") << iv; QTest::newRow("RC2-128-CBC, length 8") - << QSslKeyPrivate::Rc2Cbc << QByteArray("012345679abcdefg") + << Cipher::Rc2Cbc << QByteArray("012345679abcdefg") << QByteArray(8, 'a') << QByteArray::fromHex("5AEC1A5B295660B02613454232F7DECE") << iv; +#endif // OPENSSL_VERSION_MAJOR -#if (!defined(QT_NO_OPENSSL) && !defined(OPENSSL_NO_AES)) || (defined(QT_NO_OPENSSL) && QT_CONFIG(ssl)) +#if defined(QT_NO_OPENSSL) || !defined(OPENSSL_NO_AES) // AES needs a longer IV iv = QByteArray("abcdefghijklmnop"); QTest::newRow("AES-128-CBC, length 0") - << QSslKeyPrivate::Aes128Cbc << QByteArray("012345679abcdefg") + << Cipher::Aes128Cbc << QByteArray("012345679abcdefg") << QByteArray() << QByteArray::fromHex("28DE1A9AA26601C30DD2527407121D1A") << iv; QTest::newRow("AES-128-CBC, length 8") - << QSslKeyPrivate::Aes128Cbc << QByteArray("012345679abcdefg") + << Cipher::Aes128Cbc << QByteArray("012345679abcdefg") << QByteArray(8, 'a') << QByteArray::fromHex("08E880B1BA916F061C1E801D7F44D0EC") << iv; QTest::newRow("AES-192-CBC, length 0") - << QSslKeyPrivate::Aes192Cbc << QByteArray("0123456789abcdefghijklmn") + << Cipher::Aes192Cbc << QByteArray("0123456789abcdefghijklmn") << QByteArray() << QByteArray::fromHex("E169E0E205CDC2BA895B7CF6097673B1") << iv; QTest::newRow("AES-192-CBC, length 8") - << QSslKeyPrivate::Aes192Cbc << QByteArray("0123456789abcdefghijklmn") + << Cipher::Aes192Cbc << QByteArray("0123456789abcdefghijklmn") << QByteArray(8, 'a') << QByteArray::fromHex("3A227D6A3A13237316D30AA17FF9B0A7") << iv; QTest::newRow("AES-256-CBC, length 0") - << QSslKeyPrivate::Aes256Cbc << QByteArray("0123456789abcdefghijklmnopqrstuv") + << Cipher::Aes256Cbc << QByteArray("0123456789abcdefghijklmnopqrstuv") << QByteArray() << QByteArray::fromHex("4BAACAA0D22199C97DE206C465B7B14A") << iv; QTest::newRow("AES-256-CBC, length 8") - << QSslKeyPrivate::Aes256Cbc << QByteArray("0123456789abcdefghijklmnopqrstuv") + << Cipher::Aes256Cbc << QByteArray("0123456789abcdefghijklmnopqrstuv") << QByteArray(8, 'a') << QByteArray::fromHex("879C8C25EC135CDF0B14490A0A7C2F67") << iv; -#endif // (OpenSSL && AES) || generic backend +#endif // Generic backend || OpenSSL built with AES } void tst_QSslKey::encrypt() @@ -747,21 +800,22 @@ void tst_QSslKey::encrypt() QFETCH(QByteArray, cipherText); QFETCH(QByteArray, iv); -#if QT_CONFIG(schannel) - QEXPECT_FAIL("RC2-40-CBC, length 0", "Schannel treats RC2 as 128-bit", Abort); - QEXPECT_FAIL("RC2-40-CBC, length 8", "Schannel treats RC2 as 128-bit", Abort); - QEXPECT_FAIL("RC2-64-CBC, length 0", "Schannel treats RC2 as 128-bit", Abort); - QEXPECT_FAIL("RC2-64-CBC, length 8", "Schannel treats RC2 as 128-bit", Abort); -#endif + if (isSchannel) { + QEXPECT_FAIL("RC2-40-CBC, length 0", "Schannel treats RC2 as 128-bit", Abort); + QEXPECT_FAIL("RC2-40-CBC, length 8", "Schannel treats RC2 as 128-bit", Abort); + QEXPECT_FAIL("RC2-64-CBC, length 0", "Schannel treats RC2 as 128-bit", Abort); + QEXPECT_FAIL("RC2-64-CBC, length 8", "Schannel treats RC2 as 128-bit", Abort); + } + QByteArray encrypted = QSslKeyPrivate::encrypt(cipher, plainText, key, iv); QCOMPARE(encrypted, cipherText); QByteArray decrypted = QSslKeyPrivate::decrypt(cipher, cipherText, key, iv); QCOMPARE(decrypted, plainText); } -#endif +#endif // TEST_CRYPTO -#endif +#endif // ssl QTEST_MAIN(tst_QSslKey) #include "tst_qsslkey.moc" |