Files
EetCpp/tests/eetv4signer_test.cpp
T

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"