LCOV - code coverage report
Current view: top level - g10 - gpgv.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 0 183 0.0 %
Date: 2015-11-05 17:10:59 Functions: 0 49 0.0 %

          Line data    Source code
       1             : /* gpgv.c - The GnuPG signature verify utility
       2             :  * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2005, 2006,
       3             :  *               2008, 2009, 2012 Free Software Foundation, Inc.
       4             :  *
       5             :  * This file is part of GnuPG.
       6             :  *
       7             :  * GnuPG is free software; you can redistribute it and/or modify
       8             :  * it under the terms of the GNU General Public License as published by
       9             :  * the Free Software Foundation; either version 3 of the License, or
      10             :  * (at your option) any later version.
      11             :  *
      12             :  * GnuPG is distributed in the hope that it will be useful,
      13             :  * but WITHOUT ANY WARRANTY; without even the implied warranty of
      14             :  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      15             :  * GNU General Public License for more details.
      16             :  *
      17             :  * You should have received a copy of the GNU General Public License
      18             :  * along with this program; if not, see <http://www.gnu.org/licenses/>.
      19             :  */
      20             : 
      21             : #include <config.h>
      22             : #include <errno.h>
      23             : #include <stdio.h>
      24             : #include <stdlib.h>
      25             : #include <string.h>
      26             : #include <ctype.h>
      27             : #include <unistd.h>
      28             : #ifdef HAVE_DOSISH_SYSTEM
      29             : #include <fcntl.h> /* for setmode() */
      30             : #endif
      31             : #ifdef HAVE_LIBREADLINE
      32             : #define GNUPG_LIBREADLINE_H_INCLUDED
      33             : #include <readline/readline.h>
      34             : #endif
      35             : 
      36             : #define INCLUDED_BY_MAIN_MODULE 1
      37             : #include "gpg.h"
      38             : #include "util.h"
      39             : #include "packet.h"
      40             : #include "iobuf.h"
      41             : #include "main.h"
      42             : #include "options.h"
      43             : #include "keydb.h"
      44             : #include "trustdb.h"
      45             : #include "filter.h"
      46             : #include "ttyio.h"
      47             : #include "i18n.h"
      48             : #include "sysutils.h"
      49             : #include "status.h"
      50             : #include "call-agent.h"
      51             : #include "../common/init.h"
      52             : 
      53             : 
      54             : enum cmd_and_opt_values {
      55             :   aNull = 0,
      56             :   oQuiet          = 'q',
      57             :   oVerbose        = 'v',
      58             :   oBatch          = 500,
      59             :   oKeyring,
      60             :   oIgnoreTimeConflict,
      61             :   oStatusFD,
      62             :   oLoggerFD,
      63             :   oHomedir,
      64             :   oWeakDigest,
      65             :   aTest
      66             : };
      67             : 
      68             : 
      69             : static ARGPARSE_OPTS opts[] = {
      70             :   ARGPARSE_group (300, N_("@\nOptions:\n ")),
      71             : 
      72             :   ARGPARSE_s_n (oVerbose, "verbose", N_("verbose")),
      73             :   ARGPARSE_s_n (oQuiet,   "quiet",   N_("be somewhat more quiet")),
      74             :   ARGPARSE_s_s (oKeyring, "keyring",
      75             :                 N_("|FILE|take the keys from the keyring FILE")),
      76             :   ARGPARSE_s_n (oIgnoreTimeConflict, "ignore-time-conflict",
      77             :                 N_("make timestamp conflicts only a warning")),
      78             :   ARGPARSE_s_i (oStatusFD, "status-fd",
      79             :                 N_("|FD|write status info to this FD")),
      80             :   ARGPARSE_s_i (oLoggerFD, "logger-fd", "@"),
      81             :   ARGPARSE_s_s (oHomedir, "homedir", "@"),
      82             :   ARGPARSE_s_s (oWeakDigest, "weak-digest", "@"),
      83             : 
      84             :   ARGPARSE_end ()
      85             : };
      86             : 
      87             : 
      88             : 
      89             : int g10_errors_seen = 0;
      90             : 
      91             : 
      92             : static char *
      93           0 : make_libversion (const char *libname, const char *(*getfnc)(const char*))
      94             : {
      95             :   const char *s;
      96             :   char *result;
      97             : 
      98           0 :   s = getfnc (NULL);
      99           0 :   result = xmalloc (strlen (libname) + 1 + strlen (s) + 1);
     100           0 :   strcpy (stpcpy (stpcpy (result, libname), " "), s);
     101           0 :   return result;
     102             : }
     103             : 
     104             : static const char *
     105           0 : my_strusage( int level )
     106             : {
     107             :   static char *ver_gcry;
     108             :   const char *p;
     109             : 
     110           0 :   switch (level)
     111             :     {
     112           0 :     case 11: p = "@GPG@v (GnuPG)";
     113           0 :       break;
     114           0 :     case 13: p = VERSION; break;
     115           0 :     case 17: p = PRINTABLE_OS_NAME; break;
     116           0 :     case 19: p = _("Please report bugs to <@EMAIL@>.\n"); break;
     117             : 
     118             :     case 1:
     119           0 :     case 40: p = _("Usage: gpgv [options] [files] (-h for help)");
     120           0 :       break;
     121           0 :     case 41: p = _("Syntax: gpgv [options] [files]\n"
     122             :                    "Check signatures against known trusted keys\n");
     123           0 :         break;
     124             : 
     125             :     case 20:
     126           0 :       if (!ver_gcry)
     127           0 :         ver_gcry = make_libversion ("libgcrypt", gcry_check_version);
     128           0 :       p = ver_gcry;
     129           0 :       break;
     130             : 
     131             : 
     132           0 :     default: p = NULL;
     133             :     }
     134           0 :   return p;
     135             : }
     136             : 
     137             : 
     138             : 
     139             : int
     140           0 : main( int argc, char **argv )
     141             : {
     142             :   ARGPARSE_ARGS pargs;
     143           0 :   int rc=0;
     144             :   strlist_t sl;
     145           0 :   strlist_t nrings = NULL;
     146             :   unsigned configlineno;
     147             :   ctrl_t ctrl;
     148             : 
     149           0 :   early_system_init ();
     150           0 :   set_strusage (my_strusage);
     151           0 :   log_set_prefix ("gpgv", 1);
     152             : 
     153             :   /* Make sure that our subsystems are ready.  */
     154           0 :   i18n_init();
     155           0 :   init_common_subsystems (&argc, &argv);
     156             : 
     157           0 :   if (!gcry_check_version (NEED_LIBGCRYPT_VERSION) )
     158             :     {
     159           0 :       log_fatal ( _("%s is too old (need %s, have %s)\n"), "libgcrypt",
     160             :                   NEED_LIBGCRYPT_VERSION, gcry_check_version (NULL) );
     161             :     }
     162           0 :   gcry_control (GCRYCTL_DISABLE_SECMEM, 0);
     163             : 
     164           0 :   gnupg_init_signals (0, NULL);
     165             : 
     166           0 :   opt.command_fd = -1; /* no command fd */
     167           0 :   opt.keyserver_options.options |= KEYSERVER_AUTO_KEY_RETRIEVE;
     168           0 :   opt.trust_model = TM_ALWAYS;
     169           0 :   opt.batch = 1;
     170             : 
     171           0 :   opt.homedir = default_homedir ();
     172           0 :   opt.weak_digests = NULL;
     173             : 
     174           0 :   tty_no_terminal(1);
     175           0 :   tty_batchmode(1);
     176           0 :   dotlock_disable ();
     177           0 :   gcry_control (GCRYCTL_INITIALIZATION_FINISHED, 0);
     178           0 :   additional_weak_digest("MD5");
     179             : 
     180           0 :   pargs.argc = &argc;
     181           0 :   pargs.argv = &argv;
     182           0 :   pargs.flags=  1;  /* do not remove the args */
     183           0 :   while (optfile_parse( NULL, NULL, &configlineno, &pargs, opts))
     184             :     {
     185           0 :       switch (pargs.r_opt)
     186             :         {
     187           0 :         case oQuiet: opt.quiet = 1; break;
     188             :         case oVerbose:
     189           0 :           opt.verbose++;
     190           0 :           opt.list_sigs=1;
     191           0 :           gcry_control (GCRYCTL_SET_VERBOSITY, (int)opt.verbose);
     192           0 :           break;
     193           0 :         case oKeyring: append_to_strlist( &nrings, pargs.r.ret_str); break;
     194           0 :         case oStatusFD: set_status_fd( pargs.r.ret_int ); break;
     195             :         case oLoggerFD:
     196           0 :           log_set_fd (translate_sys2libc_fd_int (pargs.r.ret_int, 1));
     197           0 :           break;
     198           0 :         case oHomedir: opt.homedir = pargs.r.ret_str; break;
     199             :         case oWeakDigest:
     200           0 :           additional_weak_digest(pargs.r.ret_str);
     201           0 :           break;
     202           0 :         case oIgnoreTimeConflict: opt.ignore_time_conflict = 1; break;
     203           0 :         default : pargs.err = ARGPARSE_PRINT_ERROR; break;
     204             :         }
     205             :     }
     206             : 
     207           0 :   if (log_get_errorcount (0))
     208           0 :     g10_exit(2);
     209             : 
     210           0 :   if (opt.verbose > 1)
     211           0 :     set_packet_list_mode(1);
     212             : 
     213             :   /* Note: We open all keyrings in read-only mode.  */
     214           0 :   if (!nrings)  /* No keyring given: use default one. */
     215           0 :     keydb_add_resource ("trustedkeys" EXTSEP_S "kbx",
     216             :                         (KEYDB_RESOURCE_FLAG_READONLY
     217             :                          |KEYDB_RESOURCE_FLAG_GPGVDEF));
     218           0 :   for (sl = nrings; sl; sl = sl->next)
     219           0 :     keydb_add_resource (sl->d, KEYDB_RESOURCE_FLAG_READONLY);
     220             : 
     221           0 :   FREE_STRLIST (nrings);
     222             : 
     223           0 :   ctrl = xcalloc (1, sizeof *ctrl);
     224             : 
     225           0 :   if ((rc = verify_signatures (ctrl, argc, argv)))
     226           0 :     log_error("verify signatures failed: %s\n", gpg_strerror (rc) );
     227             : 
     228           0 :   xfree (ctrl);
     229             : 
     230             :   /* cleanup */
     231           0 :   g10_exit (0);
     232             :   return 8; /*NOTREACHED*/
     233             : }
     234             : 
     235             : 
     236             : void
     237           0 : g10_exit( int rc )
     238             : {
     239           0 :   rc = rc? rc : log_get_errorcount(0)? 2 : g10_errors_seen? 1 : 0;
     240           0 :   exit(rc );
     241             : }
     242             : 
     243             : 
     244             : /* Stub:
     245             :  * We have to override the trustcheck from pkclist.c becuase
     246             :  * this utility assumes that all keys in the keyring are trustworthy
     247             :  */
     248             : int
     249           0 : check_signatures_trust( PKT_signature *sig )
     250             : {
     251             :   (void)sig;
     252           0 :   return 0;
     253             : }
     254             : 
     255             : void
     256           0 : read_trust_options(byte *trust_model, ulong *created, ulong *nextcheck,
     257             :                    byte *marginals, byte *completes, byte *cert_depth,
     258             :                    byte *min_cert_level)
     259             : {
     260             :   (void)trust_model;
     261             :   (void)created;
     262             :   (void)nextcheck;
     263             :   (void)marginals;
     264             :   (void)completes;
     265             :   (void)cert_depth;
     266             :   (void)min_cert_level;
     267           0 : }
     268             : 
     269             : /* Stub:
     270             :  * We don't have the trustdb , so we have to provide some stub functions
     271             :  * instead
     272             :  */
     273             : 
     274             : int
     275           0 : cache_disabled_value(PKT_public_key *pk)
     276             : {
     277             :   (void)pk;
     278           0 :   return 0;
     279             : }
     280             : 
     281             : void
     282           0 : check_trustdb_stale(void)
     283             : {
     284           0 : }
     285             : 
     286             : int
     287           0 : get_validity_info (PKT_public_key *pk, PKT_user_id *uid)
     288             : {
     289             :   (void)pk;
     290             :   (void)uid;
     291           0 :   return '?';
     292             : }
     293             : 
     294             : unsigned int
     295           0 : get_validity (PKT_public_key *pk, PKT_user_id *uid, PKT_signature *sig,
     296             :               int may_ask)
     297             : {
     298             :   (void)pk;
     299             :   (void)uid;
     300             :   (void)sig;
     301             :   (void)may_ask;
     302           0 :   return 0;
     303             : }
     304             : 
     305             : const char *
     306           0 : trust_value_to_string (unsigned int value)
     307             : {
     308             :   (void)value;
     309           0 :   return "err";
     310             : }
     311             : 
     312             : const char *
     313           0 : uid_trust_string_fixed (PKT_public_key *key, PKT_user_id *uid)
     314             : {
     315             :   (void)key;
     316             :   (void)uid;
     317           0 :   return "err";
     318             : }
     319             : 
     320             : int
     321           0 : get_ownertrust_info (PKT_public_key *pk)
     322             : {
     323             :   (void)pk;
     324           0 :   return '?';
     325             : }
     326             : 
     327             : unsigned int
     328           0 : get_ownertrust (PKT_public_key *pk)
     329             : {
     330             :   (void)pk;
     331           0 :   return TRUST_UNKNOWN;
     332             : }
     333             : 
     334             : 
     335             : /* Stubs:
     336             :  * Because we only work with trusted keys, it does not make sense to
     337             :  * get them from a keyserver
     338             :  */
     339             : 
     340             : struct keyserver_spec *
     341           0 : keyserver_match (struct keyserver_spec *spec)
     342             : {
     343             :   (void)spec;
     344           0 :   return NULL;
     345             : }
     346             : 
     347             : int
     348           0 : keyserver_import_keyid (u32 *keyid, void *dummy)
     349             : {
     350             :   (void)keyid;
     351             :   (void)dummy;
     352           0 :   return -1;
     353             : }
     354             : 
     355             : int
     356           0 : keyserver_import_cert (const char *name)
     357             : {
     358             :   (void)name;
     359           0 :   return -1;
     360             : }
     361             : 
     362             : int
     363           0 : keyserver_import_pka (const char *name,unsigned char *fpr)
     364             : {
     365             :   (void)name;
     366             :   (void)fpr;
     367           0 :   return -1;
     368             : }
     369             : 
     370             : int
     371           0 : keyserver_import_name (const char *name,struct keyserver_spec *spec)
     372             : {
     373             :   (void)name;
     374             :   (void)spec;
     375           0 :   return -1;
     376             : }
     377             : 
     378             : int
     379           0 : keyserver_import_ldap (const char *name)
     380             : {
     381             :   (void)name;
     382           0 :   return -1;
     383             : }
     384             : 
     385             : /* Stub:
     386             :  * No encryption here but mainproc links to these functions.
     387             :  */
     388             : gpg_error_t
     389           0 : get_session_key (ctrl_t ctrl, PKT_pubkey_enc *k, DEK *dek)
     390             : {
     391             :   (void)ctrl;
     392             :   (void)k;
     393             :   (void)dek;
     394           0 :   return GPG_ERR_GENERAL;
     395             : }
     396             : 
     397             : /* Stub: */
     398             : gpg_error_t
     399           0 : get_override_session_key (DEK *dek, const char *string)
     400             : {
     401             :   (void)dek;
     402             :   (void)string;
     403           0 :   return GPG_ERR_GENERAL;
     404             : }
     405             : 
     406             : /* Stub: */
     407             : int
     408           0 : decrypt_data (ctrl_t ctrl, void *procctx, PKT_encrypted *ed, DEK *dek)
     409             : {
     410             :   (void)ctrl;
     411             :   (void)procctx;
     412             :   (void)ed;
     413             :   (void)dek;
     414           0 :   return GPG_ERR_GENERAL;
     415             : }
     416             : 
     417             : 
     418             : /* Stub:
     419             :  * No interactive commands, so we don't need the helptexts
     420             :  */
     421             : void
     422           0 : display_online_help (const char *keyword)
     423             : {
     424             :   (void)keyword;
     425           0 : }
     426             : 
     427             : /* Stub:
     428             :  * We don't use secret keys, but getkey.c links to this
     429             :  */
     430             : int
     431           0 : check_secret_key (PKT_public_key *pk, int n)
     432             : {
     433             :   (void)pk;
     434             :   (void)n;
     435           0 :   return GPG_ERR_GENERAL;
     436             : }
     437             : 
     438             : /* Stub:
     439             :  * No secret key, so no passphrase needed
     440             :  */
     441             : DEK *
     442           0 : passphrase_to_dek (u32 *keyid, int pubkey_algo,
     443             :                    int cipher_algo, STRING2KEY *s2k, int mode,
     444             :                    const char *tmp, int *canceled)
     445             : {
     446             :   (void)keyid;
     447             :   (void)pubkey_algo;
     448             :   (void)cipher_algo;
     449             :   (void)s2k;
     450             :   (void)mode;
     451             :   (void)tmp;
     452             : 
     453           0 :   if (canceled)
     454           0 :     *canceled = 0;
     455           0 :   return NULL;
     456             : }
     457             : 
     458             : void
     459           0 : passphrase_clear_cache (u32 *keyid, const char *cacheid, int algo)
     460             : {
     461             :   (void)keyid;
     462             :   (void)cacheid;
     463             :   (void)algo;
     464           0 : }
     465             : 
     466             : struct keyserver_spec *
     467           0 : parse_preferred_keyserver(PKT_signature *sig)
     468             : {
     469             :   (void)sig;
     470           0 :   return NULL;
     471             : }
     472             : 
     473             : struct keyserver_spec *
     474           0 : parse_keyserver_uri (const char *uri, int require_scheme,
     475             :                      const char *configname, unsigned int configlineno)
     476             : {
     477             :   (void)uri;
     478             :   (void)require_scheme;
     479             :   (void)configname;
     480             :   (void)configlineno;
     481           0 :   return NULL;
     482             : }
     483             : 
     484             : void
     485           0 : free_keyserver_spec (struct keyserver_spec *keyserver)
     486             : {
     487             :   (void)keyserver;
     488           0 : }
     489             : 
     490             : /* Stubs to avoid linking to photoid.c */
     491             : void
     492           0 : show_photos (const struct user_attribute *attrs, int count, PKT_public_key *pk)
     493             : {
     494             :   (void)attrs;
     495             :   (void)count;
     496             :   (void)pk;
     497           0 : }
     498             : 
     499             : int
     500           0 : parse_image_header (const struct user_attribute *attr, byte *type, u32 *len)
     501             : {
     502             :   (void)attr;
     503             :   (void)type;
     504             :   (void)len;
     505           0 :   return 0;
     506             : }
     507             : 
     508             : char *
     509           0 : image_type_to_string (byte type, int string)
     510             : {
     511             :   (void)type;
     512             :   (void)string;
     513           0 :   return NULL;
     514             : }
     515             : 
     516             : #ifdef ENABLE_CARD_SUPPORT
     517             : int
     518           0 : agent_scd_getattr (const char *name, struct agent_card_info_s *info)
     519             : {
     520             :   (void)name;
     521             :   (void)info;
     522           0 :   return 0;
     523             : }
     524             : #endif /* ENABLE_CARD_SUPPORT */
     525             : 
     526             : /* We do not do any locking, so use these stubs here */
     527             : void
     528           0 : dotlock_disable (void)
     529             : {
     530           0 : }
     531             : 
     532             : dotlock_t
     533           0 : dotlock_create (const char *file_to_lock, unsigned int flags)
     534             : {
     535             :   (void)file_to_lock;
     536             :   (void)flags;
     537           0 :   return NULL;
     538             : }
     539             : 
     540             : void
     541           0 : dotlock_destroy (dotlock_t h)
     542             : {
     543             :   (void)h;
     544           0 : }
     545             : 
     546             : int
     547           0 : dotlock_take (dotlock_t h, long timeout)
     548             : {
     549             :   (void)h;
     550             :   (void)timeout;
     551           0 :   return 0;
     552             : }
     553             : 
     554             : int
     555           0 : dotlock_release (dotlock_t h)
     556             : {
     557             :   (void)h;
     558           0 :   return 0;
     559             : }
     560             : 
     561             : void
     562           0 : dotlock_remove_lockfiles (void)
     563             : {
     564           0 : }
     565             : 
     566             : gpg_error_t
     567           0 : agent_probe_secret_key (ctrl_t ctrl, PKT_public_key *pk)
     568             : {
     569             :   (void)ctrl;
     570             :   (void)pk;
     571           0 :   return gpg_error (GPG_ERR_NO_SECKEY);
     572             : }
     573             : 
     574             : gpg_error_t
     575           0 : agent_probe_any_secret_key (ctrl_t ctrl, kbnode_t keyblock)
     576             : {
     577             :   (void)ctrl;
     578             :   (void)keyblock;
     579           0 :   return gpg_error (GPG_ERR_NO_SECKEY);
     580             : }
     581             : 
     582             : gpg_error_t
     583           0 : agent_get_keyinfo (ctrl_t ctrl, const char *hexkeygrip, char **r_serialno)
     584             : {
     585             :   (void)ctrl;
     586             :   (void)hexkeygrip;
     587           0 :   *r_serialno = NULL;
     588           0 :   return gpg_error (GPG_ERR_NO_SECKEY);
     589             : }
     590             : 
     591             : gpg_error_t
     592           0 : gpg_dirmngr_get_pka (ctrl_t ctrl, const char *userid,
     593             :                      unsigned char **r_fpr, size_t *r_fprlen,
     594             :                      char **r_url)
     595             : {
     596             :   (void)ctrl;
     597             :   (void)userid;
     598           0 :   if (r_fpr)
     599           0 :     *r_fpr = NULL;
     600           0 :   if (r_fprlen)
     601           0 :     *r_fprlen = 0;
     602           0 :   if (r_url)
     603           0 :     *r_url = NULL;
     604           0 :   return gpg_error (GPG_ERR_NOT_FOUND);
     605             : }
     606             : 
     607             : gpg_error_t
     608           0 : export_pubkey_buffer (ctrl_t ctrl, const char *keyspec, unsigned int options,
     609             :                       kbnode_t *r_keyblock, void **r_data, size_t *r_datalen)
     610             : {
     611             :   (void)ctrl;
     612             :   (void)keyspec;
     613             :   (void)options;
     614             : 
     615           0 :   *r_keyblock = NULL;
     616           0 :   *r_data = NULL;
     617           0 :   *r_datalen = 0;
     618           0 :   return gpg_error (GPG_ERR_NOT_IMPLEMENTED);
     619             : }
     620             : 
     621             : gpg_error_t
     622           0 : tofu_get_policy (PKT_public_key *pk, PKT_user_id *user_id,
     623             :                  enum tofu_policy *policy)
     624             : {
     625             :   (void)pk;
     626             :   (void)user_id;
     627             :   (void)policy;
     628           0 :   return gpg_error (GPG_ERR_GENERAL);
     629             : }
     630             : 
     631             : const char *
     632           0 : tofu_policy_str (enum tofu_policy policy)
     633             : {
     634             :   (void)policy;
     635             : 
     636           0 :   return "unknown";
     637             : }
     638             : 
     639             : void
     640           0 : tofu_begin_batch_update (void)
     641             : {
     642           0 : }
     643             : 
     644             : void
     645           0 : tofu_end_batch_update (void)
     646             : {
     647           0 : }

Generated by: LCOV version 1.11