63 lines
2.8 KiB
C++
63 lines
2.8 KiB
C++
#include "eetv4signer.h"
|
|
|
|
#include <QProcess>
|
|
#include <QTemporaryDir>
|
|
#include <QtTest>
|
|
|
|
class EetV4SignerTest : public QObject
|
|
{
|
|
Q_OBJECT
|
|
|
|
private slots:
|
|
void signsSoapWithPkcs12();
|
|
};
|
|
|
|
void EetV4SignerTest::signsSoapWithPkcs12()
|
|
{
|
|
QTemporaryDir directory;
|
|
QVERIFY(directory.isValid());
|
|
|
|
const QString keyPath = directory.filePath(QStringLiteral("key.pem"));
|
|
const QString certificatePath = directory.filePath(QStringLiteral("certificate.pem"));
|
|
const QString bundlePath = directory.filePath(QStringLiteral("certificate.p12"));
|
|
auto runOpenSsl = [](const QStringList &arguments) {
|
|
QProcess process;
|
|
process.start(QStringLiteral("openssl"), arguments);
|
|
QVERIFY2(process.waitForFinished(30000), qPrintable(process.errorString()));
|
|
QVERIFY2(process.exitStatus() == QProcess::NormalExit && process.exitCode() == 0,
|
|
process.readAllStandardError().constData());
|
|
};
|
|
runOpenSsl({QStringLiteral("req"), QStringLiteral("-x509"), QStringLiteral("-newkey"),
|
|
QStringLiteral("rsa:2048"), QStringLiteral("-nodes"), QStringLiteral("-subj"),
|
|
QStringLiteral("/CN=EetCppTest"), QStringLiteral("-keyout"), keyPath,
|
|
QStringLiteral("-out"), certificatePath, QStringLiteral("-days"), QStringLiteral("1")});
|
|
runOpenSsl({QStringLiteral("pkcs12"), QStringLiteral("-export"), QStringLiteral("-out"),
|
|
bundlePath, QStringLiteral("-inkey"), keyPath, QStringLiteral("-in"),
|
|
certificatePath, QStringLiteral("-passout"), QStringLiteral("pass:test")});
|
|
|
|
const QByteArray unsignedSoap =
|
|
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
|
|
"<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\""
|
|
" xmlns:wsse=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd\""
|
|
" xmlns:wsu=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd\">"
|
|
"<soap:Header/><soap:Body wsu:Id=\"body-id\"><test/></soap:Body></soap:Envelope>";
|
|
QString error;
|
|
const QByteArray signedSoap = EetV4Signer::signSoap(
|
|
unsignedSoap, bundlePath, QByteArrayLiteral("test"), &error);
|
|
QVERIFY2(!signedSoap.isEmpty(), qPrintable(error));
|
|
QVERIFY(signedSoap.contains("<ds:Signature"));
|
|
QVERIFY(signedSoap.contains("URI=\"#body-id\""));
|
|
QVERIFY(signedSoap.contains("BinarySecurityToken"));
|
|
|
|
QString verificationError;
|
|
QVERIFY2(EetV4Signer::verifySoap(signedSoap, &verificationError),
|
|
qPrintable(verificationError));
|
|
|
|
QByteArray tamperedSoap = signedSoap;
|
|
tamperedSoap.replace("<test/>", "<test>changed</test>");
|
|
QVERIFY(!EetV4Signer::verifySoap(tamperedSoap, &verificationError));
|
|
}
|
|
|
|
QTEST_MAIN(EetV4SignerTest)
|
|
#include "eetv4signer_test.moc"
|