aboutsummaryrefslogtreecommitdiffstats
path: root/lang/cpp/tests/run-verify.cpp
diff options
context:
space:
mode:
authorAndre Heinecke <[email protected]>2018-10-29 14:36:45 +0000
committerAndre Heinecke <[email protected]>2018-10-29 14:36:45 +0000
commit62c736ba76a19d3b41af69e1f340a53b80f13fe0 (patch)
tree915f1df69874f84705f663aaecdb4a58e01bdbb3 /lang/cpp/tests/run-verify.cpp
parentcpp: Add some convenience functions (diff)
downloadgpgme-62c736ba76a19d3b41af69e1f340a53b80f13fe0.tar.gz
gpgme-62c736ba76a19d3b41af69e1f340a53b80f13fe0.zip
cpp,tests: Add another test runner
* lang/cpp/tests/run-verify.cpp: New. * lang/cpp/tests/Makefile.am: Update accordingly. -- Add another test runner which helps to find problems on windows.
Diffstat (limited to 'lang/cpp/tests/run-verify.cpp')
-rw-r--r--lang/cpp/tests/run-verify.cpp186
1 files changed, 186 insertions, 0 deletions
diff --git a/lang/cpp/tests/run-verify.cpp b/lang/cpp/tests/run-verify.cpp
new file mode 100644
index 00000000..ec431e5b
--- /dev/null
+++ b/lang/cpp/tests/run-verify.cpp
@@ -0,0 +1,186 @@
+/*
+ run-keylist.cpp
+
+ This file is part of GpgMEpp's test suite.
+ Copyright (c) 2018 Intevation GmbH
+
+ QGpgME is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License,
+ version 2, as published by the Free Software Foundation.
+
+ QGpgME is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+#ifdef HAVE_CONFIG_H
+ #include "config.h"
+#endif
+
+#include "context.h"
+#include "key.h"
+#include "data.h"
+#include "verificationresult.h"
+
+#include <memory>
+#include <sstream>
+#include <iostream>
+
+using namespace GpgME;
+static int
+show_usage (int ex)
+{
+ fputs ("usage: run-verify [options] [DETACHEDSIGFILE] FILE\n\n"
+ "Options:\n"
+ " --verbose run in verbose mode\n"
+ " --openpgp use the OpenPGP protocol (default)\n"
+ " --cms use the CMS protocol\n"
+ " --sender MBOX use MBOX as sender address\n"
+ " --repeat N repeat it N times\n"
+ " --list-key list the signing key afterwards\n"
+ , stderr);
+ exit (ex);
+}
+
+int
+main (int argc, char **argv)
+{
+ int last_argc = -1;
+ Protocol protocol = OpenPGP;
+ std::string sender;
+ int repeats = 1;
+ bool verbose = false;
+ bool list_key = false;
+
+ if (argc)
+ { argc--; argv++; }
+
+ while (argc && last_argc != argc )
+ {
+ last_argc = argc;
+ if (!strcmp (*argv, "--"))
+ {
+ argc--; argv++;
+ break;
+ }
+ else if (!strcmp (*argv, "--help"))
+ show_usage (0);
+ else if (!strcmp (*argv, "--verbose"))
+ {
+ verbose = true;
+ argc--; argv++;
+ }
+ else if (!strcmp (*argv, "--list-key"))
+ {
+ list_key = true;
+ argc--; argv++;
+ }
+ else if (!strcmp (*argv, "--openpgp"))
+ {
+ protocol = OpenPGP;
+ argc--; argv++;
+ }
+ else if (!strcmp (*argv, "--cms"))
+ {
+ protocol = CMS;
+ argc--; argv++;
+ }
+ else if (!strcmp (*argv, "--sender"))
+ {
+ argc--; argv++;
+ if (!argc)
+ show_usage (1);
+ sender = *argv;
+ argc--; argv++;
+ }
+ else if (!strcmp (*argv, "--repeat"))
+ {
+ argc--; argv++;
+ if (!argc)
+ show_usage (1);
+ repeats = atoi (*argv);
+ argc--; argv++;
+ }
+ else if (!strncmp (*argv, "--", 2))
+ show_usage (1);
+ }
+
+ if (argc < 1 || argc > 2)
+ show_usage (1);
+
+ GpgME::initializeLibrary();
+
+ for (int i = 0; i < repeats; i++) {
+ std::cout << "Starting run: " << i << std::endl;
+ auto ctx = std::unique_ptr<Context> (Context::createForProtocol(protocol));
+ if (!ctx) {
+ std::cerr << "Failed to get Context";
+ return -1;
+ }
+
+ std::FILE *fp_sig = fopen (argv[0], "rb");
+ if (!fp_sig) {
+ std::cerr << "Failed to open sig file";
+ exit (1);
+ }
+
+ std::FILE *fp_msg = nullptr;
+ if (argc > 1)
+ {
+ fp_msg = fopen (argv[1], "rb");
+ if (!fp_msg) {
+ std::cerr << "Failed to open msg file";
+ exit (1);
+ }
+ }
+ Data dSig(fp_sig);
+ Data dMsg;
+ bool is_opaque = true;
+ if (fp_msg) {
+ dMsg = Data(fp_msg);
+ is_opaque = false;
+ }
+
+ if (!sender.empty()) {
+ ctx->setSender(sender.c_str());
+ }
+
+ Data output;
+ VerificationResult result;
+ if (is_opaque) {
+ result = ctx->verifyOpaqueSignature(dSig, output);
+ } else {
+ result = ctx->verifyDetachedSignature(dSig, dMsg);
+ }
+
+ Signature sig;
+ if (result.numSignatures()) {
+ sig = result.signature(0);
+ }
+
+ if (list_key && !sig.isNull()) {
+ sig.key(true, false);
+ }
+
+ if (verbose) {
+ std::cout << "Result: " << result << std::endl;
+ } else {
+ std::cout << "Err:" << result.error() << std::endl;
+ }
+ }
+}