Blame lang/cpp/tests/run-verify.cpp

Packit Service 30b792
/*
Packit Service 30b792
    run-keylist.cpp
Packit Service 30b792
Packit Service 30b792
    This file is part of GpgMEpp's test suite.
Packit Service 30b792
    Copyright (c) 2018 Intevation GmbH
Packit Service 30b792
Packit Service 30b792
    QGpgME is free software; you can redistribute it and/or
Packit Service 30b792
    modify it under the terms of the GNU General Public License,
Packit Service 30b792
    version 2, as published by the Free Software Foundation.
Packit Service 30b792
Packit Service 30b792
    QGpgME is distributed in the hope that it will be useful,
Packit Service 30b792
    but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 30b792
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 30b792
    General Public License for more details.
Packit Service 30b792
Packit Service 30b792
    You should have received a copy of the GNU General Public License
Packit Service 30b792
    along with this program; if not, write to the Free Software
Packit Service 30b792
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
Packit Service 30b792
Packit Service 30b792
    In addition, as a special exception, the copyright holders give
Packit Service 30b792
    permission to link the code of this program with any edition of
Packit Service 30b792
    the Qt library by Trolltech AS, Norway (or with modified versions
Packit Service 30b792
    of Qt that use the same license as Qt), and distribute linked
Packit Service 30b792
    combinations including the two.  You must obey the GNU General
Packit Service 30b792
    Public License in all respects for all of the code used other than
Packit Service 30b792
    Qt.  If you modify this file, you may extend this exception to
Packit Service 30b792
    your version of the file, but you are not obligated to do so.  If
Packit Service 30b792
    you do not wish to do so, delete this exception statement from
Packit Service 30b792
    your version.
Packit Service 30b792
*/
Packit Service 30b792
#ifdef HAVE_CONFIG_H
Packit Service 30b792
 #include "config.h"
Packit Service 30b792
#endif
Packit Service 30b792
Packit Service 30b792
#include "context.h"
Packit Service 30b792
#include "key.h"
Packit Service 30b792
#include "data.h"
Packit Service 30b792
#include "verificationresult.h"
Packit Service 30b792
Packit Service 30b792
#include <memory>
Packit Service 30b792
#include <sstream>
Packit Service 30b792
#include <iostream>
Packit Service 30b792
Packit Service 30b792
using namespace GpgME;
Packit Service 30b792
static int
Packit Service 30b792
show_usage (int ex)
Packit Service 30b792
{
Packit Service 30b792
  fputs ("usage: run-verify [options] [DETACHEDSIGFILE] FILE\n\n"
Packit Service 30b792
         "Options:\n"
Packit Service 30b792
         "  --verbose        run in verbose mode\n"
Packit Service 30b792
         "  --openpgp        use the OpenPGP protocol (default)\n"
Packit Service 30b792
         "  --cms            use the CMS protocol\n"
Packit Service 30b792
         "  --sender MBOX    use MBOX as sender address\n"
Packit Service 30b792
         "  --repeat N       repeat it N times\n"
Packit Service 30b792
         "  --list-key       list the signing key afterwards\n"
Packit Service 30b792
         , stderr);
Packit Service 30b792
  exit (ex);
Packit Service 30b792
}
Packit Service 30b792
Packit Service 30b792
int
Packit Service 30b792
main (int argc, char **argv)
Packit Service 30b792
{
Packit Service 30b792
    int last_argc = -1;
Packit Service 30b792
    Protocol protocol = OpenPGP;
Packit Service 30b792
    std::string sender;
Packit Service 30b792
    int repeats = 1;
Packit Service 30b792
    bool verbose = false;
Packit Service 30b792
    bool list_key = false;
Packit Service 30b792
Packit Service 30b792
    if (argc)
Packit Service 30b792
    { argc--; argv++; }
Packit Service 30b792
Packit Service 30b792
    while (argc && last_argc != argc )
Packit Service 30b792
    {
Packit Service 30b792
        last_argc = argc;
Packit Service 30b792
        if (!strcmp (*argv, "--"))
Packit Service 30b792
        {
Packit Service 30b792
            argc--; argv++;
Packit Service 30b792
            break;
Packit Service 30b792
        }
Packit Service 30b792
        else if (!strcmp (*argv, "--help"))
Packit Service 30b792
            show_usage (0);
Packit Service 30b792
        else if (!strcmp (*argv, "--verbose"))
Packit Service 30b792
        {
Packit Service 30b792
            verbose = true;
Packit Service 30b792
            argc--; argv++;
Packit Service 30b792
        }
Packit Service 30b792
        else if (!strcmp (*argv, "--list-key"))
Packit Service 30b792
        {
Packit Service 30b792
            list_key = true;
Packit Service 30b792
            argc--; argv++;
Packit Service 30b792
        }
Packit Service 30b792
        else if (!strcmp (*argv, "--openpgp"))
Packit Service 30b792
        {
Packit Service 30b792
            protocol = OpenPGP;
Packit Service 30b792
            argc--; argv++;
Packit Service 30b792
        }
Packit Service 30b792
        else if (!strcmp (*argv, "--cms"))
Packit Service 30b792
        {
Packit Service 30b792
            protocol = CMS;
Packit Service 30b792
            argc--; argv++;
Packit Service 30b792
        }
Packit Service 30b792
        else if (!strcmp (*argv, "--sender"))
Packit Service 30b792
        {
Packit Service 30b792
            argc--; argv++;
Packit Service 30b792
            if (!argc)
Packit Service 30b792
                show_usage (1);
Packit Service 30b792
            sender = *argv;
Packit Service 30b792
            argc--; argv++;
Packit Service 30b792
        }
Packit Service 30b792
        else if (!strcmp (*argv, "--repeat"))
Packit Service 30b792
        {
Packit Service 30b792
            argc--; argv++;
Packit Service 30b792
            if (!argc)
Packit Service 30b792
                show_usage (1);
Packit Service 30b792
            repeats = atoi (*argv);
Packit Service 30b792
            argc--; argv++;
Packit Service 30b792
        }
Packit Service 30b792
        else if (!strncmp (*argv, "--", 2))
Packit Service 30b792
            show_usage (1);
Packit Service 30b792
    }
Packit Service 30b792
Packit Service 30b792
    if (argc < 1 || argc > 2)
Packit Service 30b792
        show_usage (1);
Packit Service 30b792
Packit Service 30b792
    GpgME::initializeLibrary();
Packit Service 30b792
Packit Service 30b792
    for (int i = 0; i < repeats; i++) {
Packit Service 30b792
        std::cout << "Starting run: " << i << std::endl;
Packit Service 30b792
        auto ctx = std::unique_ptr<Context> (Context::createForProtocol(protocol));
Packit Service 30b792
        if (!ctx) {
Packit Service 30b792
            std::cerr << "Failed to get Context";
Packit Service 30b792
            return -1;
Packit Service 30b792
        }
Packit Service 30b792
Packit Service 30b792
        std::FILE *fp_sig = fopen (argv[0], "rb");
Packit Service 30b792
        if (!fp_sig) {
Packit Service 30b792
            std::cerr << "Failed to open sig file";
Packit Service 30b792
            exit (1);
Packit Service 30b792
        }
Packit Service 30b792
Packit Service 30b792
        std::FILE *fp_msg = nullptr;
Packit Service 30b792
        if (argc > 1)
Packit Service 30b792
        {
Packit Service 30b792
            fp_msg = fopen (argv[1], "rb");
Packit Service 30b792
            if (!fp_msg) {
Packit Service 30b792
                std::cerr << "Failed to open msg file";
Packit Service 30b792
                exit (1);
Packit Service 30b792
            }
Packit Service 30b792
        }
Packit Service 30b792
        Data dSig(fp_sig);
Packit Service 30b792
        Data dMsg;
Packit Service 30b792
        bool is_opaque = true;
Packit Service 30b792
        if (fp_msg) {
Packit Service 30b792
            dMsg = Data(fp_msg);
Packit Service 30b792
            is_opaque = false;
Packit Service 30b792
        }
Packit Service 30b792
Packit Service 30b792
        if (!sender.empty()) {
Packit Service 30b792
            ctx->setSender(sender.c_str());
Packit Service 30b792
        }
Packit Service 30b792
Packit Service 30b792
        Data output;
Packit Service 30b792
        VerificationResult result;
Packit Service 30b792
        if (is_opaque) {
Packit Service 30b792
            result = ctx->verifyOpaqueSignature(dSig, output);
Packit Service 30b792
        } else {
Packit Service 30b792
            result = ctx->verifyDetachedSignature(dSig, dMsg);
Packit Service 30b792
        }
Packit Service 30b792
Packit Service 30b792
        Signature sig;
Packit Service 30b792
        if (result.numSignatures()) {
Packit Service 30b792
            sig = result.signature(0);
Packit Service 30b792
        }
Packit Service 30b792
Packit Service 30b792
        if (list_key && !sig.isNull()) {
Packit Service 30b792
            sig.key(true, false);
Packit Service 30b792
        }
Packit Service 30b792
Packit Service 30b792
        if (verbose) {
Packit Service 30b792
            std::cout << "Result: " << result << std::endl;
Packit Service 30b792
        } else {
Packit Service 30b792
            std::cout << "Err:" << result.error() << std::endl;
Packit Service 30b792
        }
Packit Service 30b792
    }
Packit Service 30b792
}