aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--lang/qt/tests/t-tofuinfo.cpp84
1 files changed, 83 insertions, 1 deletions
diff --git a/lang/qt/tests/t-tofuinfo.cpp b/lang/qt/tests/t-tofuinfo.cpp
index 02573599..a27dd93d 100644
--- a/lang/qt/tests/t-tofuinfo.cpp
+++ b/lang/qt/tests/t-tofuinfo.cpp
@@ -35,6 +35,12 @@
#include "tofuinfo.h"
#include "verifyopaquejob.h"
#include "verificationresult.h"
+#include "signingresult.h"
+#include "keylistjob.h"
+#include "keylistresult.h"
+#include "qgpgmesignjob.h"
+#include "key.h"
+#include "t-support.h"
#include <iostream>
using namespace QGpgME;
@@ -64,6 +70,40 @@ class TofuInfoTest: public QObject
Q_ASSERT(orig.policy() == other.policy());
}
+ void signAndVerify(const QString &what, const GpgME::Key &key, int expected)
+ {
+ Context *ctx = Context::createForProtocol(OpenPGP);
+ ctx->setPassphraseProvider(new TestPassphraseProvider);
+ ctx->setPinentryMode(Context::PinentryLoopback);
+ auto *job = new QGpgMESignJob(ctx);
+
+ std::vector<Key> keys;
+ keys.push_back(key);
+ QByteArray signedData;
+ auto sigResult = job->exec(keys, what.toUtf8(), NormalSignatureMode, signedData);
+
+ Q_ASSERT(!sigResult.error());
+
+ auto verifyJob = openpgp()->verifyOpaqueJob();
+ QByteArray verified;
+
+ auto result = verifyJob->exec(signedData, verified);
+
+ Q_ASSERT(!result.error());
+ Q_ASSERT(verified == what.toUtf8());
+
+ Q_ASSERT(result.numSignatures() == 1);
+ auto sig = result.signatures()[0];
+
+ Q_FOREACH(const TofuInfo stats, sig.tofuInfo()) {
+ Q_ASSERT(!stats.isNull());
+ Q_ASSERT(!strcmp(stats.fingerprint(), sig.fingerprint()));
+ Q_ASSERT(stats.signCount() == expected);
+ }
+ /* FIXME: GnuPG-Bug-Id 2405 makes the wait necessary. */
+ QTest::qWait(1000);
+ }
+
private:
QTemporaryDir mDir;
@@ -90,9 +130,9 @@ private Q_SLOTS:
auto result = job->exec(data1, plaintext);
- Q_ASSERT(!strcmp(plaintext.constData(), "Just GNU it!\n"));
Q_ASSERT(!result.isNull());
Q_ASSERT(!result.error());
+ Q_ASSERT(!strcmp(plaintext.constData(), "Just GNU it!\n"));
Q_ASSERT(result.numSignatures() == 1);
Signature sig = result.signatures()[0];
@@ -138,6 +178,44 @@ private Q_SLOTS:
Q_ASSERT(stats.policy() == TofuInfo::PolicyAuto);
Q_ASSERT(stats.validity() == TofuInfo::LittleHistory);
}
+
+ /* Verify that another call yields the same result */
+ job = openpgp()->verifyOpaqueJob(true);
+ result = job->exec(data1, plaintext);
+
+ Q_ASSERT(!result.isNull());
+ Q_ASSERT(!result.error());
+
+ Q_ASSERT(result.numSignatures() == 1);
+ sig = result.signatures()[0];
+ /* TOFU is always marginal */
+ Q_ASSERT(sig.validity() == Signature::Marginal);
+
+ Q_ASSERT(!sig.tofuInfo().empty());
+ Q_FOREACH(const TofuInfo stats, sig.tofuInfo()) {
+ Q_ASSERT(!stats.isNull());
+ Q_ASSERT(!strcmp(stats.fingerprint(), sig.fingerprint()));
+ Q_ASSERT(stats.signCount() == 1);
+ Q_ASSERT(stats.address());
+ Q_ASSERT(stats.policy() == TofuInfo::PolicyAuto);
+ Q_ASSERT(stats.validity() == TofuInfo::LittleHistory);
+ }
+ }
+
+ void testTofuSignCount()
+ {
+ auto *job = openpgp()->keyListJob(false, false, false);
+ std::vector<GpgME::Key> keys;
+ GpgME::KeyListResult result = job->exec(QStringList() << QStringLiteral("[email protected]"),
+ true, keys);
+ Q_ASSERT(!keys.empty());
+ Key key = keys[0];
+ Q_ASSERT(!key.isNull());
+
+ signAndVerify(QStringLiteral("Hello"), key, 0);
+ signAndVerify(QStringLiteral("Hello2"), key, 1);
+ signAndVerify(QStringLiteral("Hello3"), key, 2);
+ signAndVerify(QStringLiteral("Hello4"), key, 3);
}
void initTestCase()
@@ -150,6 +228,10 @@ private Q_SLOTS:
Q_ASSERT(conf.open(QIODevice::WriteOnly));
conf.write("trust-model tofu+pgp");
conf.close();
+ QFile agentConf(mDir.path() + QStringLiteral("/gpg-agent.conf"));
+ Q_ASSERT(agentConf.open(QIODevice::WriteOnly));
+ agentConf.write("allow-loopback-pinentry");
+ agentConf.close();
Q_ASSERT(QFile::copy(gpgHome + QStringLiteral("/pubring.gpg"),
mDir.path() + QStringLiteral("/pubring.gpg")));
Q_ASSERT(QFile::copy(gpgHome + QStringLiteral("/secring.gpg"),