Merge branch 'STABLE-BRANCH-2-2' into master
[gnupg.git] / g10 / gpgv.c
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 <https://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 "../common/util.h"
39 #include "packet.h"
40 #include "../common/iobuf.h"
41 #include "main.h"
42 #include "options.h"
43 #include "keydb.h"
44 #include "trustdb.h"
45 #include "filter.h"
46 #include "../common/ttyio.h"
47 #include "../common/i18n.h"
48 #include "../common/sysutils.h"
49 #include "../common/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   oOutput         = 'o',
59   oBatch          = 500,
60   oKeyring,
61   oIgnoreTimeConflict,
62   oStatusFD,
63   oLoggerFD,
64   oLoggerFile,
65   oHomedir,
66   oWeakDigest,
67   oEnableSpecialFilenames,
68   oDebug,
69   aTest
70 };
71
72
73 static ARGPARSE_OPTS opts[] = {
74   ARGPARSE_group (300, N_("@\nOptions:\n ")),
75
76   ARGPARSE_s_n (oVerbose, "verbose", N_("verbose")),
77   ARGPARSE_s_n (oQuiet,   "quiet",   N_("be somewhat more quiet")),
78   ARGPARSE_s_s (oKeyring, "keyring",
79                 N_("|FILE|take the keys from the keyring FILE")),
80   ARGPARSE_s_s (oOutput, "output", N_("|FILE|write output to FILE")),
81   ARGPARSE_s_n (oIgnoreTimeConflict, "ignore-time-conflict",
82                 N_("make timestamp conflicts only a warning")),
83   ARGPARSE_s_i (oStatusFD, "status-fd",
84                 N_("|FD|write status info to this FD")),
85   ARGPARSE_s_i (oLoggerFD, "logger-fd", "@"),
86   ARGPARSE_s_s (oLoggerFile, "log-file", "@"),
87   ARGPARSE_s_s (oHomedir, "homedir", "@"),
88   ARGPARSE_s_s (oWeakDigest, "weak-digest",
89                 N_("|ALGO|reject signatures made with ALGO")),
90   ARGPARSE_s_n (oEnableSpecialFilenames, "enable-special-filenames", "@"),
91   ARGPARSE_s_s (oDebug, "debug", "@"),
92
93   ARGPARSE_end ()
94 };
95
96
97 /* The list of supported debug flags.  */
98 static struct debug_flags_s debug_flags [] =
99   {
100     { DBG_PACKET_VALUE , "packet"  },
101     { DBG_MPI_VALUE    , "mpi"     },
102     { DBG_CRYPTO_VALUE , "crypto"  },
103     { DBG_FILTER_VALUE , "filter"  },
104     { DBG_IOBUF_VALUE  , "iobuf"   },
105     { DBG_MEMORY_VALUE , "memory"  },
106     { DBG_CACHE_VALUE  , "cache"   },
107     { DBG_MEMSTAT_VALUE, "memstat" },
108     { DBG_TRUST_VALUE  , "trust"   },
109     { DBG_HASHING_VALUE, "hashing" },
110     { DBG_IPC_VALUE    , "ipc"     },
111     { DBG_CLOCK_VALUE  , "clock"   },
112     { DBG_LOOKUP_VALUE , "lookup"  },
113     { DBG_EXTPROG_VALUE, "extprog" },
114     { 0, NULL }
115   };
116
117
118 int g10_errors_seen = 0;
119
120
121 static char *
122 make_libversion (const char *libname, const char *(*getfnc)(const char*))
123 {
124   const char *s;
125   char *result;
126
127   s = getfnc (NULL);
128   result = xmalloc (strlen (libname) + 1 + strlen (s) + 1);
129   strcpy (stpcpy (stpcpy (result, libname), " "), s);
130   return result;
131 }
132
133 static const char *
134 my_strusage( int level )
135 {
136   static char *ver_gcry;
137   const char *p;
138
139   switch (level)
140     {
141     case 11: p = "@GPG@v (GnuPG)";
142       break;
143     case 13: p = VERSION; break;
144     case 17: p = PRINTABLE_OS_NAME; break;
145     case 19: p = _("Please report bugs to <@EMAIL@>.\n"); break;
146
147     case 1:
148     case 40: p = _("Usage: gpgv [options] [files] (-h for help)");
149       break;
150     case 41: p = _("Syntax: gpgv [options] [files]\n"
151                    "Check signatures against known trusted keys\n");
152         break;
153
154     case 20:
155       if (!ver_gcry)
156         ver_gcry = make_libversion ("libgcrypt", gcry_check_version);
157       p = ver_gcry;
158       break;
159
160
161     default: p = NULL;
162     }
163   return p;
164 }
165
166
167
168 int
169 main( int argc, char **argv )
170 {
171   ARGPARSE_ARGS pargs;
172   int rc=0;
173   strlist_t sl;
174   strlist_t nrings = NULL;
175   unsigned configlineno;
176   ctrl_t ctrl;
177
178   early_system_init ();
179   set_strusage (my_strusage);
180   log_set_prefix ("gpgv", GPGRT_LOG_WITH_PREFIX);
181
182   /* Make sure that our subsystems are ready.  */
183   i18n_init();
184   init_common_subsystems (&argc, &argv);
185
186   gcry_control (GCRYCTL_DISABLE_SECMEM, 0);
187
188   gnupg_init_signals (0, NULL);
189
190   opt.command_fd = -1; /* no command fd */
191   opt.keyserver_options.options |= KEYSERVER_AUTO_KEY_RETRIEVE;
192   opt.trust_model = TM_ALWAYS;
193   opt.no_sig_cache = 1;
194   opt.flags.require_cross_cert = 1;
195   opt.batch = 1;
196   opt.answer_yes = 1;
197
198   opt.weak_digests = NULL;
199
200   tty_no_terminal(1);
201   tty_batchmode(1);
202   dotlock_disable ();
203   gcry_control (GCRYCTL_INITIALIZATION_FINISHED, 0);
204   additional_weak_digest("MD5");
205   gnupg_initialize_compliance (GNUPG_MODULE_NAME_GPG);
206
207   pargs.argc = &argc;
208   pargs.argv = &argv;
209   pargs.flags=  1;  /* do not remove the args */
210   while (optfile_parse( NULL, NULL, &configlineno, &pargs, opts))
211     {
212       switch (pargs.r_opt)
213         {
214         case oQuiet: opt.quiet = 1; break;
215         case oVerbose:
216           opt.verbose++;
217           opt.list_sigs=1;
218           gcry_control (GCRYCTL_SET_VERBOSITY, (int)opt.verbose);
219           break;
220         case oDebug:
221           if (parse_debug_flag (pargs.r.ret_str, &opt.debug, debug_flags))
222             {
223               pargs.r_opt = ARGPARSE_INVALID_ARG;
224               pargs.err = ARGPARSE_PRINT_ERROR;
225             }
226           break;
227         case oKeyring: append_to_strlist( &nrings, pargs.r.ret_str); break;
228         case oOutput: opt.outfile = pargs.r.ret_str; break;
229         case oStatusFD:
230           set_status_fd (translate_sys2libc_fd_int (pargs.r.ret_int, 1));
231           break;
232         case oLoggerFD:
233           log_set_fd (translate_sys2libc_fd_int (pargs.r.ret_int, 1));
234           break;
235         case oLoggerFile:
236           log_set_file (pargs.r.ret_str);
237           log_set_prefix (NULL, (GPGRT_LOG_WITH_PREFIX
238                                  | GPGRT_LOG_WITH_TIME
239                                  | GPGRT_LOG_WITH_PID) );
240           break;
241         case oHomedir: gnupg_set_homedir (pargs.r.ret_str); break;
242         case oWeakDigest:
243           additional_weak_digest(pargs.r.ret_str);
244           break;
245         case oIgnoreTimeConflict: opt.ignore_time_conflict = 1; break;
246         case oEnableSpecialFilenames:
247           enable_special_filenames ();
248           break;
249         default : pargs.err = ARGPARSE_PRINT_ERROR; break;
250         }
251     }
252
253   if (log_get_errorcount (0))
254     g10_exit(2);
255
256   if (opt.verbose > 1)
257     set_packet_list_mode(1);
258
259   /* Note: We open all keyrings in read-only mode.  */
260   if (!nrings)  /* No keyring given: use default one. */
261     keydb_add_resource ("trustedkeys" EXTSEP_S "kbx",
262                         (KEYDB_RESOURCE_FLAG_READONLY
263                          |KEYDB_RESOURCE_FLAG_GPGVDEF));
264   for (sl = nrings; sl; sl = sl->next)
265     keydb_add_resource (sl->d, KEYDB_RESOURCE_FLAG_READONLY);
266
267   FREE_STRLIST (nrings);
268
269   ctrl = xcalloc (1, sizeof *ctrl);
270
271   if ((rc = verify_signatures (ctrl, argc, argv)))
272     log_error("verify signatures failed: %s\n", gpg_strerror (rc) );
273
274   keydb_release (ctrl->cached_getkey_kdb);
275   xfree (ctrl);
276
277   /* cleanup */
278   g10_exit (0);
279   return 8; /*NOTREACHED*/
280 }
281
282
283 void
284 g10_exit( int rc )
285 {
286   rc = rc? rc : log_get_errorcount(0)? 2 : g10_errors_seen? 1 : 0;
287   exit(rc );
288 }
289
290
291 /* Stub:
292  * We have to override the trustcheck from pkclist.c because
293  * this utility assumes that all keys in the keyring are trustworthy
294  */
295 int
296 check_signatures_trust (ctrl_t ctrl, PKT_signature *sig)
297 {
298   (void)ctrl;
299   (void)sig;
300   return 0;
301 }
302
303 void
304 read_trust_options (ctrl_t ctrl,
305                     byte *trust_model, ulong *created, ulong *nextcheck,
306                     byte *marginals, byte *completes, byte *cert_depth,
307                     byte *min_cert_level)
308 {
309   (void)ctrl;
310   (void)trust_model;
311   (void)created;
312   (void)nextcheck;
313   (void)marginals;
314   (void)completes;
315   (void)cert_depth;
316   (void)min_cert_level;
317 }
318
319 /* Stub:
320  * We don't have the trustdb , so we have to provide some stub functions
321  * instead
322  */
323
324 int
325 cache_disabled_value (ctrl_t ctrl, PKT_public_key *pk)
326 {
327   (void)ctrl;
328   (void)pk;
329   return 0;
330 }
331
332 void
333 check_trustdb_stale (ctrl_t ctrl)
334 {
335   (void)ctrl;
336 }
337
338 int
339 get_validity_info (ctrl_t ctrl, kbnode_t kb, PKT_public_key *pk,
340                    PKT_user_id *uid)
341 {
342   (void)ctrl;
343   (void)kb;
344   (void)pk;
345   (void)uid;
346   return '?';
347 }
348
349 unsigned int
350 get_validity (ctrl_t ctrl, kbnode_t kb, PKT_public_key *pk, PKT_user_id *uid,
351               PKT_signature *sig, int may_ask)
352 {
353   (void)ctrl;
354   (void)kb;
355   (void)pk;
356   (void)uid;
357   (void)sig;
358   (void)may_ask;
359   return 0;
360 }
361
362 const char *
363 trust_value_to_string (unsigned int value)
364 {
365   (void)value;
366   return "err";
367 }
368
369 const char *
370 uid_trust_string_fixed (ctrl_t ctrl, PKT_public_key *key, PKT_user_id *uid)
371 {
372   (void)ctrl;
373   (void)key;
374   (void)uid;
375   return "err";
376 }
377
378 int
379 get_ownertrust_info (ctrl_t ctrl, PKT_public_key *pk, int no_create)
380 {
381   (void)ctrl;
382   (void)pk;
383   (void)no_create;
384   return '?';
385 }
386
387 unsigned int
388 get_ownertrust (ctrl_t ctrl, PKT_public_key *pk)
389 {
390   (void)ctrl;
391   (void)pk;
392   return TRUST_UNKNOWN;
393 }
394
395
396 /* Stubs:
397  * Because we only work with trusted keys, it does not make sense to
398  * get them from a keyserver
399  */
400
401 struct keyserver_spec *
402 keyserver_match (struct keyserver_spec *spec)
403 {
404   (void)spec;
405   return NULL;
406 }
407
408 int
409 keyserver_any_configured (ctrl_t ctrl)
410 {
411   (void)ctrl;
412   return 0;
413 }
414
415 int
416 keyserver_import_keyid (u32 *keyid, void *dummy, int quick)
417 {
418   (void)keyid;
419   (void)dummy;
420   (void)quick;
421   return -1;
422 }
423
424 int
425 keyserver_import_fprint (ctrl_t ctrl, const byte *fprint,size_t fprint_len,
426                          struct keyserver_spec *keyserver, int quick)
427 {
428   (void)ctrl;
429   (void)fprint;
430   (void)fprint_len;
431   (void)keyserver;
432   (void)quick;
433   return -1;
434 }
435
436 int
437 keyserver_import_cert (const char *name)
438 {
439   (void)name;
440   return -1;
441 }
442
443 int
444 keyserver_import_pka (const char *name,unsigned char *fpr)
445 {
446   (void)name;
447   (void)fpr;
448   return -1;
449 }
450
451 gpg_error_t
452 keyserver_import_wkd (ctrl_t ctrl, const char *name, int quick,
453                       unsigned char **fpr, size_t *fpr_len)
454 {
455   (void)ctrl;
456   (void)name;
457   (void)quick;
458   (void)fpr;
459   (void)fpr_len;
460   return GPG_ERR_BUG;
461 }
462
463 int
464 keyserver_import_name (const char *name,struct keyserver_spec *spec)
465 {
466   (void)name;
467   (void)spec;
468   return -1;
469 }
470
471 int
472 keyserver_import_ldap (const char *name)
473 {
474   (void)name;
475   return -1;
476 }
477
478
479 gpg_error_t
480 read_key_from_file (ctrl_t ctrl, const char *fname, kbnode_t *r_keyblock)
481 {
482   (void)ctrl;
483   (void)fname;
484   (void)r_keyblock;
485   return -1;
486 }
487
488
489 /* Stub:
490  * No encryption here but mainproc links to these functions.
491  */
492 gpg_error_t
493 get_session_key (ctrl_t ctrl, PKT_pubkey_enc *k, DEK *dek)
494 {
495   (void)ctrl;
496   (void)k;
497   (void)dek;
498   return GPG_ERR_GENERAL;
499 }
500
501 /* Stub: */
502 gpg_error_t
503 get_override_session_key (DEK *dek, const char *string)
504 {
505   (void)dek;
506   (void)string;
507   return GPG_ERR_GENERAL;
508 }
509
510 /* Stub: */
511 int
512 decrypt_data (ctrl_t ctrl, void *procctx, PKT_encrypted *ed, DEK *dek)
513 {
514   (void)ctrl;
515   (void)procctx;
516   (void)ed;
517   (void)dek;
518   return GPG_ERR_GENERAL;
519 }
520
521
522 /* Stub:
523  * No interactive commands, so we don't need the helptexts
524  */
525 void
526 display_online_help (const char *keyword)
527 {
528   (void)keyword;
529 }
530
531 /* Stub:
532  * We don't use secret keys, but getkey.c links to this
533  */
534 int
535 check_secret_key (PKT_public_key *pk, int n)
536 {
537   (void)pk;
538   (void)n;
539   return GPG_ERR_GENERAL;
540 }
541
542 /* Stub:
543  * No secret key, so no passphrase needed
544  */
545 DEK *
546 passphrase_to_dek (int cipher_algo, STRING2KEY *s2k, int create, int nocache,
547                    const char *tmp, int *canceled)
548 {
549   (void)cipher_algo;
550   (void)s2k;
551   (void)create;
552   (void)nocache;
553   (void)tmp;
554
555   if (canceled)
556     *canceled = 0;
557   return NULL;
558 }
559
560 void
561 passphrase_clear_cache (const char *cacheid)
562 {
563   (void)cacheid;
564 }
565
566 struct keyserver_spec *
567 parse_preferred_keyserver(PKT_signature *sig)
568 {
569   (void)sig;
570   return NULL;
571 }
572
573 struct keyserver_spec *
574 parse_keyserver_uri (const char *uri, int require_scheme,
575                      const char *configname, unsigned int configlineno)
576 {
577   (void)uri;
578   (void)require_scheme;
579   (void)configname;
580   (void)configlineno;
581   return NULL;
582 }
583
584 void
585 free_keyserver_spec (struct keyserver_spec *keyserver)
586 {
587   (void)keyserver;
588 }
589
590 /* Stubs to avoid linking to photoid.c */
591 void
592 show_photos (const struct user_attribute *attrs, int count, PKT_public_key *pk)
593 {
594   (void)attrs;
595   (void)count;
596   (void)pk;
597 }
598
599 int
600 parse_image_header (const struct user_attribute *attr, byte *type, u32 *len)
601 {
602   (void)attr;
603   (void)type;
604   (void)len;
605   return 0;
606 }
607
608 char *
609 image_type_to_string (byte type, int string)
610 {
611   (void)type;
612   (void)string;
613   return NULL;
614 }
615
616 #ifdef ENABLE_CARD_SUPPORT
617 int
618 agent_scd_getattr (const char *name, struct agent_card_info_s *info)
619 {
620   (void)name;
621   (void)info;
622   return 0;
623 }
624 #endif /* ENABLE_CARD_SUPPORT */
625
626 /* We do not do any locking, so use these stubs here */
627 void
628 dotlock_disable (void)
629 {
630 }
631
632 dotlock_t
633 dotlock_create (const char *file_to_lock, unsigned int flags)
634 {
635   (void)file_to_lock;
636   (void)flags;
637   return NULL;
638 }
639
640 void
641 dotlock_destroy (dotlock_t h)
642 {
643   (void)h;
644 }
645
646 int
647 dotlock_take (dotlock_t h, long timeout)
648 {
649   (void)h;
650   (void)timeout;
651   return 0;
652 }
653
654 int
655 dotlock_release (dotlock_t h)
656 {
657   (void)h;
658   return 0;
659 }
660
661 void
662 dotlock_remove_lockfiles (void)
663 {
664 }
665
666 gpg_error_t
667 agent_probe_secret_key (ctrl_t ctrl, PKT_public_key *pk)
668 {
669   (void)ctrl;
670   (void)pk;
671   return gpg_error (GPG_ERR_NO_SECKEY);
672 }
673
674 gpg_error_t
675 agent_probe_any_secret_key (ctrl_t ctrl, kbnode_t keyblock)
676 {
677   (void)ctrl;
678   (void)keyblock;
679   return gpg_error (GPG_ERR_NO_SECKEY);
680 }
681
682 gpg_error_t
683 agent_get_keyinfo (ctrl_t ctrl, const char *hexkeygrip,
684                    char **r_serialno, int *r_cleartext)
685 {
686   (void)ctrl;
687   (void)hexkeygrip;
688   (void)r_cleartext;
689   *r_serialno = NULL;
690   return gpg_error (GPG_ERR_NO_SECKEY);
691 }
692
693 gpg_error_t
694 gpg_dirmngr_get_pka (ctrl_t ctrl, const char *userid,
695                      unsigned char **r_fpr, size_t *r_fprlen,
696                      char **r_url)
697 {
698   (void)ctrl;
699   (void)userid;
700   if (r_fpr)
701     *r_fpr = NULL;
702   if (r_fprlen)
703     *r_fprlen = 0;
704   if (r_url)
705     *r_url = NULL;
706   return gpg_error (GPG_ERR_NOT_FOUND);
707 }
708
709 gpg_error_t
710 export_pubkey_buffer (ctrl_t ctrl, const char *keyspec, unsigned int options,
711                       export_stats_t stats,
712                       kbnode_t *r_keyblock, void **r_data, size_t *r_datalen)
713 {
714   (void)ctrl;
715   (void)keyspec;
716   (void)options;
717   (void)stats;
718
719   *r_keyblock = NULL;
720   *r_data = NULL;
721   *r_datalen = 0;
722   return gpg_error (GPG_ERR_NOT_IMPLEMENTED);
723 }
724
725 gpg_error_t
726 tofu_write_tfs_record (ctrl_t ctrl, estream_t fp,
727                        PKT_public_key *pk, const char *user_id)
728 {
729   (void)ctrl;
730   (void)fp;
731   (void)pk;
732   (void)user_id;
733   return gpg_error (GPG_ERR_GENERAL);
734 }
735
736 gpg_error_t
737 tofu_get_policy (ctrl_t ctrl, PKT_public_key *pk, PKT_user_id *user_id,
738                  enum tofu_policy *policy)
739 {
740   (void)ctrl;
741   (void)pk;
742   (void)user_id;
743   (void)policy;
744   return gpg_error (GPG_ERR_GENERAL);
745 }
746
747 const char *
748 tofu_policy_str (enum tofu_policy policy)
749 {
750   (void)policy;
751
752   return "unknown";
753 }
754
755 void
756 tofu_begin_batch_update (ctrl_t ctrl)
757 {
758   (void)ctrl;
759 }
760
761 void
762 tofu_end_batch_update (ctrl_t ctrl)
763 {
764   (void)ctrl;
765 }
766
767 gpg_error_t
768 tofu_notice_key_changed (ctrl_t ctrl, kbnode_t kb)
769 {
770   (void) ctrl;
771   (void) kb;
772
773   return 0;
774 }