Imported Upstream version 2.3.8
[platform/upstream/gpg2.git] / g10 / keylist.c
1 /* keylist.c - Print information about OpenPGP keys
2  * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
3  *               2008, 2010, 2012 Free Software Foundation, Inc.
4  * Copyright (C) 2013, 2014  Werner Koch
5  *
6  * This file is part of GnuPG.
7  *
8  * GnuPG is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 3 of the License, or
11  * (at your option) any later version.
12  *
13  * GnuPG is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, see <https://www.gnu.org/licenses/>.
20  */
21
22 #include <config.h>
23 #include <stdio.h>
24 #include <stdlib.h>
25 #include <string.h>
26 #include <errno.h>
27 #ifdef HAVE_DOSISH_SYSTEM
28 # include <fcntl.h>             /* for setmode() */
29 #endif
30
31 #include "gpg.h"
32 #include "options.h"
33 #include "packet.h"
34 #include "../common/status.h"
35 #include "keydb.h"
36 #include "photoid.h"
37 #include "../common/util.h"
38 #include "../common/ttyio.h"
39 #include "trustdb.h"
40 #include "main.h"
41 #include "../common/i18n.h"
42 #include "../common/status.h"
43 #include "call-agent.h"
44 #include "../common/mbox-util.h"
45 #include "../common/zb32.h"
46 #include "tofu.h"
47 #include "../common/compliance.h"
48 #include "../common/pkscreening.h"
49
50
51 static void list_all (ctrl_t, int, int);
52 static void list_one (ctrl_t ctrl,
53                       strlist_t names, int secret, int mark_secret);
54 static void locate_one (ctrl_t ctrl, strlist_t names, int no_local);
55 static void print_card_serialno (const char *serialno);
56
57 struct keylist_context
58 {
59   int check_sigs;  /* If set signatures shall be verified.  */
60   int good_sigs;   /* Counter used if CHECK_SIGS is set.  */
61   int inv_sigs;    /* Counter used if CHECK_SIGS is set.  */
62   int no_key;      /* Counter used if CHECK_SIGS is set.  */
63   int oth_err;     /* Counter used if CHECK_SIGS is set.  */
64   int no_validity; /* Do not show validity.  */
65 };
66
67
68 static void list_keyblock (ctrl_t ctrl,
69                            kbnode_t keyblock, int secret, int has_secret,
70                            int fpr, struct keylist_context *listctx);
71
72
73 /* The stream used to write attribute packets to.  */
74 static estream_t attrib_fp;
75
76
77 /* Release resources from a keylist context.  */
78 static void
79 keylist_context_release (struct keylist_context *listctx)
80 {
81   (void)listctx; /* Nothing to release.  */
82 }
83
84
85 /* List the keys.  If list is NULL, all available keys are listed.
86  * With LOCATE_MODE set the locate algorithm is used to find a key; if
87  * in addition NO_LOCAL is set the locate does not look into the local
88  * keyring.  */
89 void
90 public_key_list (ctrl_t ctrl, strlist_t list, int locate_mode, int no_local)
91 {
92 #ifndef NO_TRUST_MODELS
93   if (opt.with_colons)
94     {
95       byte trust_model, marginals, completes, cert_depth, min_cert_level;
96       ulong created, nextcheck;
97
98       read_trust_options (ctrl, &trust_model, &created, &nextcheck,
99                           &marginals, &completes, &cert_depth, &min_cert_level);
100
101       es_fprintf (es_stdout, "tru:");
102
103       if (nextcheck && nextcheck <= make_timestamp ())
104         es_fprintf (es_stdout, "o");
105       if (trust_model != opt.trust_model)
106         es_fprintf (es_stdout, "t");
107       if (opt.trust_model == TM_PGP || opt.trust_model == TM_CLASSIC
108           || opt.trust_model == TM_TOFU_PGP)
109         {
110           if (marginals != opt.marginals_needed)
111             es_fprintf (es_stdout, "m");
112           if (completes != opt.completes_needed)
113             es_fprintf (es_stdout, "c");
114           if (cert_depth != opt.max_cert_depth)
115             es_fprintf (es_stdout, "d");
116           if (min_cert_level != opt.min_cert_level)
117             es_fprintf (es_stdout, "l");
118         }
119
120       es_fprintf (es_stdout, ":%d:%lu:%lu", trust_model, created, nextcheck);
121
122       /* Only show marginals, completes, and cert_depth in the classic
123          or PGP trust models since they are not meaningful
124          otherwise. */
125
126       if (trust_model == TM_PGP || trust_model == TM_CLASSIC)
127         es_fprintf (es_stdout, ":%d:%d:%d", marginals, completes, cert_depth);
128       es_fprintf (es_stdout, "\n");
129     }
130 #endif /*!NO_TRUST_MODELS*/
131
132   /* We need to do the stale check right here because it might need to
133      update the keyring while we already have the keyring open.  This
134      is very bad for W32 because of a sharing violation. For real OSes
135      it might lead to false results if we are later listing a keyring
136      which is associated with the inode of a deleted file.  */
137   check_trustdb_stale (ctrl);
138
139 #ifdef USE_TOFU
140   tofu_begin_batch_update (ctrl);
141 #endif
142
143   if (locate_mode)
144     locate_one (ctrl, list, no_local);
145   else if (!list)
146     list_all (ctrl, 0, opt.with_secret);
147   else
148     list_one (ctrl, list, 0, opt.with_secret);
149
150 #ifdef USE_TOFU
151   tofu_end_batch_update (ctrl);
152 #endif
153 }
154
155
156 void
157 secret_key_list (ctrl_t ctrl, strlist_t list)
158 {
159   (void)ctrl;
160
161   check_trustdb_stale (ctrl);
162
163   if (!list)
164     list_all (ctrl, 1, 0);
165   else                          /* List by user id */
166     list_one (ctrl, list, 1, 0);
167 }
168
169
170 /* Helper for print_key_info and print_key_info_log.  */
171 static char *
172 format_key_info (ctrl_t ctrl, PKT_public_key *pk, int secret)
173 {
174   u32 keyid[2];
175   char *p;
176   char pkstrbuf[PUBKEY_STRING_SIZE];
177   char *result;
178
179   keyid_from_pk (pk, keyid);
180
181   /* If the pk was chosen by a particular user ID, that is the one to
182      print.  */
183   if (pk->user_id)
184     p = utf8_to_native (pk->user_id->name, pk->user_id->len, 0);
185   else
186     p = get_user_id_native (ctrl, keyid);
187
188   result = xtryasprintf ("%s  %s/%s %s %s",
189                          secret? (pk->flags.primary? "sec":"ssb")
190                          /* */ : (pk->flags.primary? "pub":"sub"),
191                          pubkey_string (pk, pkstrbuf, sizeof pkstrbuf),
192                          keystr (keyid), datestr_from_pk (pk), p);
193   xfree (p);
194   return result;
195 }
196
197
198 /* Print basic information about a public or secret key.  With FP
199  * passed as NULL, the tty output interface is used, otherwise output
200  * is directed to the given stream.  INDENT gives the requested
201  * indentation; if that is a negative value indentation is suppressed
202  * for the first line.  SECRET tells that the PK has a secret part.
203  * FIXME: This is similar in use to print_key_line and thus both
204  * functions should eventually be united.
205  */
206 void
207 print_key_info (ctrl_t ctrl, estream_t fp,
208                 int indent, PKT_public_key *pk, int secret)
209 {
210   int indentabs = indent >= 0? indent : -indent;
211   char *info;
212
213   /* Note: Negative values for INDENT are not yet needed. */
214
215   info = format_key_info (ctrl, pk, secret);
216
217   if (!fp && indent >= 0)
218     tty_printf ("\n");  /* (Backward compatibility to old code) */
219   tty_fprintf (fp, "%*s%s\n", indentabs, "",
220                info? info : "[Ooops - out of core]");
221
222   xfree (info);
223 }
224
225
226 /* Same as print_key_info put print using the log functions at
227  * LOGLEVEL.  */
228 void
229 print_key_info_log (ctrl_t ctrl, int loglevel,
230                     int indent, PKT_public_key *pk, int secret)
231 {
232   int indentabs = indent >= 0? indent : -indent;
233   char *info;
234
235   info = format_key_info (ctrl, pk, secret);
236
237   log_log (loglevel, "%*s%s\n", indentabs, "",
238            info? info : "[Ooops - out of core]");
239
240   xfree (info);
241 }
242
243
244 /* Print basic information of a secret key including the card serial
245    number information.  */
246 #ifdef ENABLE_CARD_SUPPORT
247 void
248 print_card_key_info (estream_t fp, kbnode_t keyblock)
249 {
250   kbnode_t node;
251   char *hexgrip;
252   char *serialno;
253   int s2k_char;
254   char pkstrbuf[PUBKEY_STRING_SIZE];
255   int indent;
256
257   for (node = keyblock; node; node = node->next)
258     {
259       if (node->pkt->pkttype == PKT_PUBLIC_KEY
260           || node->pkt->pkttype == PKT_PUBLIC_SUBKEY)
261         {
262           int rc;
263           PKT_public_key *pk = node->pkt->pkt.public_key;
264
265           serialno = NULL;
266           rc = hexkeygrip_from_pk (pk, &hexgrip);
267           if (rc)
268             {
269               log_error ("error computing a keygrip: %s\n", gpg_strerror (rc));
270               s2k_char = '?';
271             }
272           else if (!agent_get_keyinfo (NULL, hexgrip, &serialno, NULL))
273             s2k_char = serialno? '>':' ';
274           else
275             s2k_char = '#';  /* Key not found.  */
276
277           tty_fprintf (fp, "%s%c  %s/%s  %n",
278                        node->pkt->pkttype == PKT_PUBLIC_KEY ? "sec" : "ssb",
279                        s2k_char,
280                        pubkey_string (pk, pkstrbuf, sizeof pkstrbuf),
281                        keystr_from_pk (pk),
282                        &indent);
283           tty_fprintf (fp, _("created: %s"), datestr_from_pk (pk));
284           tty_fprintf (fp, "  ");
285           tty_fprintf (fp, _("expires: %s"), expirestr_from_pk (pk));
286           if (serialno)
287             {
288               tty_fprintf (fp, "\n%*s%s", indent, "", _("card-no: "));
289               if (strlen (serialno) == 32
290                   && !strncmp (serialno, "D27600012401", 12))
291                 {
292                   /* This is an OpenPGP card.  Print the relevant part.  */
293                   /* Example: D2760001240101010001000003470000 */
294                   /*                          xxxxyyyyyyyy     */
295                   tty_fprintf (fp, "%.*s %.*s", 4, serialno+16, 8, serialno+20);
296                 }
297               else
298                 tty_fprintf (fp, "%s", serialno);
299             }
300           tty_fprintf (fp, "\n");
301           xfree (hexgrip);
302           xfree (serialno);
303         }
304     }
305 }
306 #endif /*ENABLE_CARD_SUPPORT*/
307
308
309 /* Flags = 0x01 hashed 0x02 critical.  */
310 static void
311 status_one_subpacket (sigsubpkttype_t type, size_t len, int flags,
312                       const byte * buf)
313 {
314   char status[40];
315
316   /* Don't print these. */
317   if (len > 256)
318     return;
319
320   snprintf (status, sizeof status,
321             "%d %u %u ", type, flags, (unsigned int) len);
322
323   write_status_text_and_buffer (STATUS_SIG_SUBPACKET, status, buf, len, 0);
324 }
325
326
327 /* Print a policy URL.  Allowed values for MODE are:
328  *  -1 - print to the TTY
329  *   0 - print to stdout.
330  *   1 - use log_info and emit status messages.
331  *   2 - emit only status messages.
332  */
333 void
334 show_policy_url (PKT_signature * sig, int indent, int mode)
335 {
336   const byte *p;
337   size_t len;
338   int seq = 0, crit;
339   estream_t fp = mode < 0? NULL : mode ? log_get_stream () : es_stdout;
340
341   while ((p = enum_sig_subpkt (sig, 1, SIGSUBPKT_POLICY, &len, &seq, &crit)))
342     {
343       if (mode != 2)
344         {
345           const char *str;
346
347           tty_fprintf (fp, "%*s", indent, "");
348
349           if (crit)
350             str = _("Critical signature policy: ");
351           else
352             str = _("Signature policy: ");
353           if (mode > 0)
354             log_info ("%s", str);
355           else
356             tty_fprintf (fp, "%s", str);
357           tty_print_utf8_string2 (fp, p, len, 0);
358           tty_fprintf (fp, "\n");
359         }
360
361       if (mode > 0)
362         write_status_buffer (STATUS_POLICY_URL, p, len, 0);
363     }
364 }
365
366
367 /* Print a keyserver URL.  Allowed values for MODE are:
368  *  -1 - print to the TTY
369  *   0 - print to stdout.
370  *   1 - use log_info and emit status messages.
371  *   2 - emit only status messages.
372  */
373 void
374 show_keyserver_url (PKT_signature * sig, int indent, int mode)
375 {
376   const byte *p;
377   size_t len;
378   int seq = 0, crit;
379   estream_t fp = mode < 0? NULL : mode ? log_get_stream () : es_stdout;
380
381   while ((p = enum_sig_subpkt (sig, 1, SIGSUBPKT_PREF_KS, &len, &seq, &crit)))
382     {
383       if (mode != 2)
384         {
385           const char *str;
386
387           tty_fprintf (fp, "%*s", indent, "");
388
389           if (crit)
390             str = _("Critical preferred keyserver: ");
391           else
392             str = _("Preferred keyserver: ");
393           if (mode > 0)
394             log_info ("%s", str);
395           else
396             tty_fprintf (fp, "%s", str);
397           tty_print_utf8_string2 (fp, p, len, 0);
398           tty_fprintf (fp, "\n");
399         }
400
401       if (mode > 0)
402         status_one_subpacket (SIGSUBPKT_PREF_KS, len,
403                               (crit ? 0x02 : 0) | 0x01, p);
404     }
405 }
406
407
408 /* Print notation data.  Allowed values for MODE are:
409  *  -1 - print to the TTY
410  *   0 - print to stdout.
411  *   1 - use log_info and emit status messages.
412  *   2 - emit only status messages.
413  *
414  * Defined bits in WHICH:
415  *   1 - standard notations
416  *   2 - user notations
417  */
418 void
419 show_notation (PKT_signature * sig, int indent, int mode, int which)
420 {
421   estream_t fp = mode < 0? NULL : mode ? log_get_stream () : es_stdout;
422   notation_t nd, notations;
423
424   if (which == 0)
425     which = 3;
426
427   notations = sig_to_notation (sig);
428
429   /* There may be multiple notations in the same sig. */
430   for (nd = notations; nd; nd = nd->next)
431     {
432       if (mode != 2)
433         {
434           int has_at = !!strchr (nd->name, '@');
435
436           if ((which & 1 && !has_at) || (which & 2 && has_at))
437             {
438               const char *str;
439
440               tty_fprintf (fp, "%*s", indent, "");
441
442               if (nd->flags.critical)
443                 str = _("Critical signature notation: ");
444               else
445                 str = _("Signature notation: ");
446               if (mode > 0)
447                 log_info ("%s", str);
448               else
449                 tty_fprintf (fp, "%s", str);
450               /* This is all UTF8 */
451               tty_print_utf8_string2 (fp, nd->name, strlen (nd->name), 0);
452               tty_fprintf (fp, "=");
453               tty_print_utf8_string2 (fp, nd->value, strlen (nd->value), 0);
454               /* (We need to use log_printf so that the next call to a
455                   log function does not insert an extra LF.)  */
456               if (mode > 0)
457                 log_printf ("\n");
458               else
459                 tty_fprintf (fp, "\n");
460             }
461         }
462
463       if (mode > 0)
464         {
465           write_status_buffer (STATUS_NOTATION_NAME,
466                                nd->name, strlen (nd->name), 0);
467           if (nd->flags.critical || nd->flags.human)
468             write_status_text (STATUS_NOTATION_FLAGS,
469                                nd->flags.critical && nd->flags.human? "1 1" :
470                                nd->flags.critical? "1 0" : "0 1");
471           if (!nd->flags.human && nd->bdat && nd->blen)
472             write_status_buffer (STATUS_NOTATION_DATA,
473                                  nd->bdat, nd->blen, 250);
474           else
475             write_status_buffer (STATUS_NOTATION_DATA,
476                                  nd->value, strlen (nd->value), 50);
477         }
478     }
479
480   free_notation (notations);
481 }
482
483
484 static void
485 print_signature_stats (struct keylist_context *s)
486 {
487   if (!s->check_sigs)
488     return;  /* Signature checking was not requested.  */
489
490   /* Better flush stdout so that the stats are always printed after
491    * the output.  */
492   es_fflush (es_stdout);
493
494   if (s->good_sigs)
495     log_info (ngettext("%d good signature\n",
496                        "%d good signatures\n", s->good_sigs), s->good_sigs);
497
498   if (s->inv_sigs)
499     log_info (ngettext("%d bad signature\n",
500                        "%d bad signatures\n", s->inv_sigs), s->inv_sigs);
501
502   if (s->no_key)
503     log_info (ngettext("%d signature not checked due to a missing key\n",
504                        "%d signatures not checked due to missing keys\n",
505                        s->no_key), s->no_key);
506
507   if (s->oth_err)
508     log_info (ngettext("%d signature not checked due to an error\n",
509                        "%d signatures not checked due to errors\n",
510                        s->oth_err), s->oth_err);
511 }
512
513
514 /* List all keys.  If SECRET is true only secret keys are listed.  If
515    MARK_SECRET is true secret keys are indicated in a public key
516    listing.  */
517 static void
518 list_all (ctrl_t ctrl, int secret, int mark_secret)
519 {
520   KEYDB_HANDLE hd;
521   KBNODE keyblock = NULL;
522   int rc = 0;
523   int any_secret;
524   const char *lastresname, *resname;
525   struct keylist_context listctx;
526
527   memset (&listctx, 0, sizeof (listctx));
528   if (opt.check_sigs)
529     listctx.check_sigs = 1;
530
531   hd = keydb_new (ctrl);
532   if (!hd)
533     rc = gpg_error_from_syserror ();
534   else
535     rc = keydb_search_first (hd);
536   if (rc)
537     {
538       if (gpg_err_code (rc) != GPG_ERR_NOT_FOUND)
539         log_error ("keydb_search_first failed: %s\n", gpg_strerror (rc));
540       goto leave;
541     }
542
543   lastresname = NULL;
544   do
545     {
546       if (secret)
547         glo_ctrl.silence_parse_warnings++;
548       rc = keydb_get_keyblock (hd, &keyblock);
549       if (secret)
550         glo_ctrl.silence_parse_warnings--;
551       if (rc)
552         {
553           if (gpg_err_code (rc) == GPG_ERR_LEGACY_KEY)
554             continue;  /* Skip legacy keys.  */
555           log_error ("keydb_get_keyblock failed: %s\n", gpg_strerror (rc));
556           goto leave;
557         }
558
559       if (secret || mark_secret)
560         any_secret = !agent_probe_any_secret_key (ctrl, keyblock);
561       else
562         any_secret = 0;
563
564       if (secret && !any_secret)
565         ; /* Secret key listing requested but this isn't one.  */
566       else
567         {
568           if (!opt.with_colons && !(opt.list_options & LIST_SHOW_ONLY_FPR_MBOX))
569             {
570               resname = keydb_get_resource_name (hd);
571               if (lastresname != resname)
572                 {
573                   int i;
574
575                   es_fprintf (es_stdout, "%s\n", resname);
576                   for (i = strlen (resname); i; i--)
577                     es_putc ('-', es_stdout);
578                   es_putc ('\n', es_stdout);
579                   lastresname = resname;
580                 }
581             }
582           merge_keys_and_selfsig (ctrl, keyblock);
583           list_keyblock (ctrl, keyblock, secret, any_secret, opt.fingerprint,
584                          &listctx);
585         }
586       release_kbnode (keyblock);
587       keyblock = NULL;
588     }
589   while (!(rc = keydb_search_next (hd)));
590   es_fflush (es_stdout);
591   if (rc && gpg_err_code (rc) != GPG_ERR_NOT_FOUND)
592     log_error ("keydb_search_next failed: %s\n", gpg_strerror (rc));
593   if (keydb_get_skipped_counter (hd))
594     log_info (ngettext("Warning: %lu key skipped due to its large size\n",
595                        "Warning: %lu keys skipped due to their large sizes\n",
596                        keydb_get_skipped_counter (hd)),
597               keydb_get_skipped_counter (hd));
598
599   if (opt.check_sigs && !opt.with_colons)
600     print_signature_stats (&listctx);
601
602  leave:
603   keylist_context_release (&listctx);
604   release_kbnode (keyblock);
605   keydb_release (hd);
606 }
607
608
609 static void
610 list_one (ctrl_t ctrl, strlist_t names, int secret, int mark_secret)
611 {
612   int rc = 0;
613   KBNODE keyblock = NULL;
614   GETKEY_CTX ctx;
615   int any_secret;
616   const char *resname;
617   const char *keyring_str = _("Keyring");
618   int i;
619   struct keylist_context listctx;
620
621   memset (&listctx, 0, sizeof (listctx));
622   if (!secret && opt.check_sigs)
623     listctx.check_sigs = 1;
624
625   /* fixme: using the bynames function has the disadvantage that we
626    * don't know whether one of the names given was not found.  OTOH,
627    * this function has the advantage to list the names in the
628    * sequence as defined by the keyDB and does not duplicate
629    * outputs.  A solution could be do test whether all given have
630    * been listed (this needs a way to use the keyDB search
631    * functions) or to have the search function return indicators for
632    * found names.  Yet another way is to use the keydb search
633    * facilities directly. */
634   rc = getkey_bynames (ctrl, &ctx, NULL, names, secret, &keyblock);
635   if (rc)
636     {
637       log_error ("error reading key: %s\n", gpg_strerror (rc));
638       getkey_end (ctrl, ctx);
639       write_status_error ("keylist.getkey", rc);
640       return;
641     }
642
643   do
644     {
645       /* getkey_bynames makes sure that only secret keys are returned
646        * if requested, thus we do not need to test again.  With
647        * MARK_SECRET set (ie. option --with-secret) we have to test
648        * for a secret key, though.  */
649       if (secret)
650         any_secret = 1;
651       else if (mark_secret)
652         any_secret = !agent_probe_any_secret_key (ctrl, keyblock);
653       else
654         any_secret = 0;
655
656       if (secret && !any_secret)
657         ;/* Secret key listing requested but getkey_bynames failed.  */
658       else
659         {
660           if ((opt.list_options & LIST_SHOW_KEYRING) && !opt.with_colons)
661             {
662               resname = keydb_get_resource_name (get_ctx_handle (ctx));
663               es_fprintf (es_stdout, "%s: %s\n", keyring_str, resname);
664               for (i = strlen (resname) + strlen (keyring_str) + 2; i; i--)
665                 es_putc ('-', es_stdout);
666               es_putc ('\n', es_stdout);
667             }
668           list_keyblock (ctrl, keyblock, secret, any_secret,
669                          opt.fingerprint, &listctx);
670         }
671       release_kbnode (keyblock);
672     }
673   while (!getkey_next (ctrl, ctx, NULL, &keyblock));
674   getkey_end (ctrl, ctx);
675
676   if (opt.check_sigs && !opt.with_colons)
677     print_signature_stats (&listctx);
678
679   keylist_context_release (&listctx);
680 }
681
682
683 static void
684 locate_one (ctrl_t ctrl, strlist_t names, int no_local)
685 {
686   int rc = 0;
687   strlist_t sl;
688   GETKEY_CTX ctx = NULL;
689   KBNODE keyblock = NULL;
690   struct keylist_context listctx;
691
692   memset (&listctx, 0, sizeof (listctx));
693   if (opt.check_sigs)
694     listctx.check_sigs = 1;
695
696   for (sl = names; sl; sl = sl->next)
697     {
698       rc = get_best_pubkey_byname (ctrl,
699                                    no_local? GET_PUBKEY_NO_LOCAL
700                                    /*    */: GET_PUBKEY_NORMAL,
701                                    &ctx, NULL, sl->d, &keyblock, 1);
702       if (rc)
703         {
704           if (gpg_err_code (rc) != GPG_ERR_NO_PUBKEY)
705             log_error ("error reading key: %s\n", gpg_strerror (rc));
706           else if (opt.verbose)
707             log_info (_("key \"%s\" not found: %s\n"),
708                       sl->d, gpg_strerror (rc));
709         }
710       else
711         {
712           do
713             {
714               list_keyblock (ctrl, keyblock, 0, 0, opt.fingerprint, &listctx);
715               release_kbnode (keyblock);
716             }
717           while (ctx && !getkey_next (ctrl, ctx, NULL, &keyblock));
718           getkey_end (ctrl, ctx);
719           ctx = NULL;
720         }
721     }
722
723   if (opt.check_sigs && !opt.with_colons)
724     print_signature_stats (&listctx);
725
726   keylist_context_release (&listctx);
727 }
728
729
730 static void
731 print_key_data (PKT_public_key * pk)
732 {
733   int n = pk ? pubkey_get_npkey (pk->pubkey_algo) : 0;
734   int i;
735
736   for (i = 0; i < n; i++)
737     {
738       es_fprintf (es_stdout, "pkd:%d:%u:", i, mpi_get_nbits (pk->pkey[i]));
739       mpi_print (es_stdout, pk->pkey[i], 1);
740       es_putc (':', es_stdout);
741       es_putc ('\n', es_stdout);
742     }
743 }
744
745
746 /* Various public key screenings.  (Right now just ROCA).  With
747  * COLON_MODE set the output is formatted for use in the compliance
748  * field of a colon listing.
749  */
750 static void
751 print_pk_screening (PKT_public_key *pk, int colon_mode)
752 {
753   gpg_error_t err;
754
755   if (is_RSA (pk->pubkey_algo) && pubkey_get_npkey (pk->pubkey_algo))
756     {
757       err = screen_key_for_roca (pk->pkey[0]);
758       if (!err)
759         ;
760       else if (gpg_err_code (err) == GPG_ERR_TRUE)
761         {
762           if (colon_mode)
763             es_fprintf (es_stdout, colon_mode > 1? " %d":"%d", 6001);
764           else
765             es_fprintf (es_stdout,
766                         "      Screening: ROCA vulnerability detected\n");
767         }
768       else if (!colon_mode)
769         es_fprintf (es_stdout, "      Screening: [ROCA check failed: %s]\n",
770                     gpg_strerror (err));
771     }
772
773 }
774
775
776 static void
777 print_capabilities (ctrl_t ctrl, PKT_public_key *pk, KBNODE keyblock)
778 {
779   unsigned int use = pk->pubkey_usage;
780   int c_printed = 0;
781
782   if (use & PUBKEY_USAGE_ENC)
783     es_putc ('e', es_stdout);
784
785   if (use & PUBKEY_USAGE_SIG)
786     {
787       es_putc ('s', es_stdout);
788       if (pk->flags.primary)
789         {
790           es_putc ('c', es_stdout);
791           /* The PUBKEY_USAGE_CERT flag was introduced later and we
792              used to always print 'c' for a primary key.  To avoid any
793              regression here we better track whether we printed 'c'
794              already.  */
795           c_printed = 1;
796         }
797     }
798
799   if ((use & PUBKEY_USAGE_CERT) && !c_printed)
800     es_putc ('c', es_stdout);
801
802   if ((use & PUBKEY_USAGE_AUTH))
803     es_putc ('a', es_stdout);
804
805   if (use & PUBKEY_USAGE_RENC)
806     es_putc ('r', es_stdout);
807   if ((use & PUBKEY_USAGE_TIME))
808     es_putc ('t', es_stdout);
809   if ((use & PUBKEY_USAGE_GROUP))
810     es_putc ('g', es_stdout);
811
812   if ((use & PUBKEY_USAGE_UNKNOWN))
813     es_putc ('?', es_stdout);
814
815   if (keyblock)
816     {
817       /* Figure out the usable capabilities.  */
818       KBNODE k;
819       int enc = 0, sign = 0, cert = 0, auth = 0, disabled = 0;
820
821       for (k = keyblock; k; k = k->next)
822         {
823           if (k->pkt->pkttype == PKT_PUBLIC_KEY
824               || k->pkt->pkttype == PKT_PUBLIC_SUBKEY)
825             {
826               pk = k->pkt->pkt.public_key;
827
828               if (pk->flags.primary)
829                 disabled = pk_is_disabled (pk);
830
831               if (pk->flags.valid && !pk->flags.revoked && !pk->has_expired)
832                 {
833                   if (pk->pubkey_usage & PUBKEY_USAGE_ENC)
834                     enc = 1;
835                   if (pk->pubkey_usage & PUBKEY_USAGE_SIG)
836                     {
837                       sign = 1;
838                       if (pk->flags.primary)
839                         cert = 1;
840                     }
841                   if (pk->pubkey_usage & PUBKEY_USAGE_CERT)
842                     cert = 1;
843                   if ((pk->pubkey_usage & PUBKEY_USAGE_AUTH))
844                     auth = 1;
845                 }
846             }
847         }
848       if (enc)
849         es_putc ('E', es_stdout);
850       if (sign)
851         es_putc ('S', es_stdout);
852       if (cert)
853         es_putc ('C', es_stdout);
854       if (auth)
855         es_putc ('A', es_stdout);
856       if (disabled)
857         es_putc ('D', es_stdout);
858     }
859
860   es_putc (':', es_stdout);
861 }
862
863
864 /* FLAGS: 0x01 hashed
865           0x02 critical  */
866 static void
867 print_one_subpacket (sigsubpkttype_t type, size_t len, int flags,
868                      const byte * buf)
869 {
870   size_t i;
871
872   es_fprintf (es_stdout, "spk:%d:%u:%u:", type, flags, (unsigned int) len);
873
874   for (i = 0; i < len; i++)
875     {
876       /* printable ascii other than : and % */
877       if (buf[i] >= 32 && buf[i] <= 126 && buf[i] != ':' && buf[i] != '%')
878         es_fprintf (es_stdout, "%c", buf[i]);
879       else
880         es_fprintf (es_stdout, "%%%02X", buf[i]);
881     }
882
883   es_fprintf (es_stdout, "\n");
884 }
885
886
887 void
888 print_subpackets_colon (PKT_signature * sig)
889 {
890   byte *i;
891
892   log_assert (opt.show_subpackets);
893
894   for (i = opt.show_subpackets; *i; i++)
895     {
896       const byte *p;
897       size_t len;
898       int seq, crit;
899
900       seq = 0;
901
902       while ((p = enum_sig_subpkt (sig, 1, *i, &len, &seq, &crit)))
903         print_one_subpacket (*i, len, 0x01 | (crit ? 0x02 : 0), p);
904
905       seq = 0;
906
907       while ((p = enum_sig_subpkt (sig, 0, *i, &len, &seq, &crit)))
908         print_one_subpacket (*i, len, 0x00 | (crit ? 0x02 : 0), p);
909     }
910 }
911
912
913 void
914 dump_attribs (const PKT_user_id *uid, PKT_public_key *pk)
915 {
916   int i;
917
918   if (!attrib_fp)
919     return;
920
921   for (i = 0; i < uid->numattribs; i++)
922     {
923       if (is_status_enabled ())
924         {
925           byte array[MAX_FINGERPRINT_LEN], *p;
926           char buf[(MAX_FINGERPRINT_LEN * 2) + 90];
927           size_t j, n;
928
929           if (!pk)
930             BUG ();
931           fingerprint_from_pk (pk, array, &n);
932
933           p = array;
934           for (j = 0; j < n; j++, p++)
935             sprintf (buf + 2 * j, "%02X", *p);
936
937           sprintf (buf + strlen (buf), " %lu %u %u %u %lu %lu %u",
938                    (ulong) uid->attribs[i].len, uid->attribs[i].type, i + 1,
939                    uid->numattribs, (ulong) uid->created,
940                    (ulong) uid->expiredate,
941                    ((uid->flags.primary ? 0x01 : 0) | (uid->flags.revoked ? 0x02 : 0) |
942                     (uid->flags.expired ? 0x04 : 0)));
943           write_status_text (STATUS_ATTRIBUTE, buf);
944         }
945
946       es_fwrite (uid->attribs[i].data, uid->attribs[i].len, 1, attrib_fp);
947       es_fflush (attrib_fp);
948     }
949 }
950
951
952 /* Order two signatures.  We first order by keyid and then by creation
953  * time.  */
954 int
955 cmp_signodes (const void *av, const void *bv)
956 {
957   const kbnode_t an = *(const kbnode_t *)av;
958   const kbnode_t bn = *(const kbnode_t *)bv;
959   const PKT_signature *a;
960   const PKT_signature *b;
961   int i;
962
963   /* log_assert (an->pkt->pkttype == PKT_SIGNATURE); */
964   /* log_assert (bn->pkt->pkttype == PKT_SIGNATURE); */
965
966   a = an->pkt->pkt.signature;
967   b = bn->pkt->pkt.signature;
968
969   /* Self-signatures are ordered first.  */
970   if ((an->flag & NODFLG_MARK_B) && !(bn->flag & NODFLG_MARK_B))
971     return -1;
972   if (!(an->flag & NODFLG_MARK_B) && (bn->flag & NODFLG_MARK_B))
973     return 1;
974
975   /* then the keyids.  (which are or course the same for self-sigs). */
976   i = keyid_cmp (a->keyid, b->keyid);
977   if (i)
978     return i;
979
980   /* Followed by creation time */
981   if (a->timestamp > b->timestamp)
982     return 1;
983   if (a->timestamp < b->timestamp)
984     return -1;
985
986   /* followed by the class in a way that a rev comes first.  */
987   if (a->sig_class > b->sig_class)
988     return 1;
989   if (a->sig_class < b->sig_class)
990     return -1;
991
992   /* To make the sort stable we compare the entire structure as last resort.  */
993   return memcmp (a, b, sizeof *a);
994 }
995
996
997 /* Helper for list_keyblock_print.  */
998 static void
999 list_signature_print (ctrl_t ctrl, kbnode_t keyblock, kbnode_t node,
1000                       struct keylist_context *listctx)
1001 {
1002           /* (extra indentation to keep the diff history short)  */
1003           PKT_signature *sig = node->pkt->pkt.signature;
1004           int rc, sigrc;
1005           char *sigstr;
1006           char *reason_text = NULL;
1007           char *reason_comment = NULL;
1008           size_t reason_commentlen;
1009           int reason_code = 0;
1010
1011           if (listctx->check_sigs)
1012             {
1013               rc = check_key_signature (ctrl, keyblock, node, NULL);
1014               switch (gpg_err_code (rc))
1015                 {
1016                 case 0:
1017                   listctx->good_sigs++;
1018                   sigrc = '!';
1019                   break;
1020                 case GPG_ERR_BAD_SIGNATURE:
1021                   listctx->inv_sigs++;
1022                   sigrc = '-';
1023                   break;
1024                 case GPG_ERR_NO_PUBKEY:
1025                 case GPG_ERR_UNUSABLE_PUBKEY:
1026                   listctx->no_key++;
1027                   return;
1028                 default:
1029                   listctx->oth_err++;
1030                   sigrc = '%';
1031                   break;
1032                 }
1033
1034               /* TODO: Make sure a cached sig record here still has
1035                  the pk that issued it.  See also
1036                  keyedit.c:print_and_check_one_sig */
1037             }
1038           else
1039             {
1040               rc = 0;
1041               sigrc = ' ';
1042             }
1043
1044           if (sig->sig_class == 0x20 || sig->sig_class == 0x28
1045               || sig->sig_class == 0x30)
1046             {
1047               sigstr = "rev";
1048               reason_code = get_revocation_reason (sig, &reason_text,
1049                                                    &reason_comment,
1050                                                    &reason_commentlen);
1051             }
1052           else if ((sig->sig_class & ~3) == 0x10)
1053             sigstr = "sig";
1054           else if (sig->sig_class == 0x18)
1055             sigstr = "sig";
1056           else if (sig->sig_class == 0x1F)
1057             sigstr = "sig";
1058           else
1059             {
1060               es_fprintf (es_stdout, "sig                             "
1061                       "[unexpected signature class 0x%02x]\n",
1062                       sig->sig_class);
1063               return;
1064             }
1065
1066           es_fputs (sigstr, es_stdout);
1067           es_fprintf (es_stdout, "%c%c %c%c%c%c%c%c %s %s",
1068                   sigrc, (sig->sig_class - 0x10 > 0 &&
1069                           sig->sig_class - 0x10 <
1070                           4) ? '0' + sig->sig_class - 0x10 : ' ',
1071                   sig->flags.exportable ? ' ' : 'L',
1072                   sig->flags.revocable ? ' ' : 'R',
1073                   sig->flags.policy_url ? 'P' : ' ',
1074                   sig->flags.notation ? 'N' : ' ',
1075                   sig->flags.expired ? 'X' : ' ',
1076                   (sig->trust_depth > 9) ? 'T' : (sig->trust_depth >
1077                                                   0) ? '0' +
1078                   sig->trust_depth : ' ', keystr (sig->keyid),
1079                   datestr_from_sig (sig));
1080           if (opt.list_options & LIST_SHOW_SIG_EXPIRE)
1081             es_fprintf (es_stdout, " %s", expirestr_from_sig (sig));
1082           es_fprintf (es_stdout, "  ");
1083           if (sigrc == '%')
1084             es_fprintf (es_stdout, "[%s] ", gpg_strerror (rc));
1085           else if (sigrc == '?')
1086             ;
1087           else if (!opt.fast_list_mode)
1088             {
1089               size_t n;
1090               char *p = get_user_id (ctrl, sig->keyid, &n, NULL);
1091               print_utf8_buffer (es_stdout, p, n);
1092               xfree (p);
1093             }
1094           es_putc ('\n', es_stdout);
1095
1096           if (sig->flags.policy_url
1097               && (opt.list_options & LIST_SHOW_POLICY_URLS))
1098             show_policy_url (sig, 3, 0);
1099
1100           if (sig->flags.notation && (opt.list_options & LIST_SHOW_NOTATIONS))
1101             show_notation (sig, 3, 0,
1102                            ((opt.
1103                              list_options & LIST_SHOW_STD_NOTATIONS) ? 1 : 0)
1104                            +
1105                            ((opt.
1106                              list_options & LIST_SHOW_USER_NOTATIONS) ? 2 :
1107                             0));
1108
1109           if (sig->flags.pref_ks
1110               && (opt.list_options & LIST_SHOW_KEYSERVER_URLS))
1111             show_keyserver_url (sig, 3, 0);
1112
1113           if (reason_text && (reason_code || reason_comment))
1114             {
1115               es_fprintf (es_stdout, "      %s%s\n",
1116                           _("reason for revocation: "), reason_text);
1117               if (reason_comment)
1118                 {
1119                   const byte *s, *s_lf;
1120                   size_t n, n_lf;
1121
1122                   s = reason_comment;
1123                   n = reason_commentlen;
1124                   s_lf = NULL;
1125                   do
1126                     {
1127                       /* We don't want any empty lines, so we skip them.  */
1128                       for (;n && *s == '\n'; s++, n--)
1129                         ;
1130                       if (n)
1131                         {
1132                           s_lf = memchr (s, '\n', n);
1133                           n_lf = s_lf? s_lf - s : n;
1134                           es_fprintf (es_stdout, "         %s",
1135                                       _("revocation comment: "));
1136                           es_write_sanitized (es_stdout, s, n_lf, NULL, NULL);
1137                           es_putc ('\n', es_stdout);
1138                           s += n_lf; n -= n_lf;
1139                         }
1140                     } while (s_lf);
1141                 }
1142             }
1143
1144           xfree (reason_text);
1145           xfree (reason_comment);
1146
1147           /* fixme: check or list other sigs here */
1148 }
1149
1150
1151 static void
1152 list_keyblock_print (ctrl_t ctrl, kbnode_t keyblock, int secret, int fpr,
1153                      struct keylist_context *listctx)
1154 {
1155   int rc;
1156   kbnode_t node;
1157   PKT_public_key *pk;
1158   u32 *mainkid;
1159   int skip_sigs = 0;
1160   char *hexgrip = NULL;
1161   char *serialno = NULL;
1162
1163   /* Get the keyid from the keyblock.  */
1164   node = find_kbnode (keyblock, PKT_PUBLIC_KEY);
1165   if (!node)
1166     {
1167       log_error ("Oops; key lost!\n");
1168       dump_kbnode (keyblock);
1169       return;
1170     }
1171
1172   pk = node->pkt->pkt.public_key;
1173   mainkid = pk_keyid (pk);
1174
1175   if (secret || opt.with_keygrip)
1176     {
1177       rc = hexkeygrip_from_pk (pk, &hexgrip);
1178       if (rc)
1179         log_error ("error computing a keygrip: %s\n", gpg_strerror (rc));
1180     }
1181
1182   if (secret)
1183     {
1184       /* Encode some info about the secret key in SECRET.  */
1185       if (!agent_get_keyinfo (NULL, hexgrip, &serialno, NULL))
1186         secret = serialno? 3 : 1;
1187       else
1188         secret = 2;  /* Key not found.  */
1189     }
1190
1191   if (!listctx->no_validity)
1192     check_trustdb_stale (ctrl);
1193
1194   /* Print the "pub" line and in KF_NONE mode the fingerprint.  */
1195   print_key_line (ctrl, es_stdout, pk, secret);
1196
1197   if (fpr)
1198     print_fingerprint (ctrl, NULL, pk, 0);
1199
1200   if (opt.with_keygrip && hexgrip)
1201     es_fprintf (es_stdout, "      Keygrip = %s\n", hexgrip);
1202
1203   if (serialno)
1204     print_card_serialno (serialno);
1205
1206   if (opt.with_key_data)
1207     print_key_data (pk);
1208
1209   if (opt.with_key_screening)
1210     print_pk_screening (pk, 0);
1211
1212   if (opt.with_key_origin
1213       && (pk->keyorg || pk->keyupdate || pk->updateurl))
1214     {
1215       char updatestr[MK_DATESTR_SIZE];
1216
1217       es_fprintf (es_stdout, "      origin=%s last=%s %s",
1218                   key_origin_string (pk->keyorg),
1219                   mk_datestr (updatestr, sizeof updatestr, pk->keyupdate),
1220                   pk->updateurl? "url=":"");
1221       if (pk->updateurl)
1222         print_utf8_string (es_stdout, pk->updateurl);
1223       es_putc ('\n', es_stdout);
1224     }
1225
1226   for (node = keyblock; node; node = node->next)
1227     {
1228       if (is_deleted_kbnode (node))
1229         continue;
1230
1231       if (node->pkt->pkttype == PKT_USER_ID)
1232         {
1233           PKT_user_id *uid = node->pkt->pkt.user_id;
1234           int indent;
1235           int kl = opt.keyid_format == KF_NONE? 10 : keystrlen ();
1236
1237           if ((uid->flags.expired || uid->flags.revoked)
1238               && !(opt.list_options & LIST_SHOW_UNUSABLE_UIDS))
1239             {
1240               skip_sigs = 1;
1241               continue;
1242             }
1243           else
1244             skip_sigs = 0;
1245
1246           if (attrib_fp && uid->attrib_data != NULL)
1247             dump_attribs (uid, pk);
1248
1249           if ((uid->flags.revoked || uid->flags.expired)
1250               || ((opt.list_options & LIST_SHOW_UID_VALIDITY)
1251                   && !listctx->no_validity))
1252             {
1253               const char *validity;
1254
1255               validity = uid_trust_string_fixed (ctrl, pk, uid);
1256               indent = ((kl + (opt.legacy_list_mode? 9:11))
1257                         - atoi (uid_trust_string_fixed (ctrl, NULL, NULL)));
1258               if (indent < 0 || indent > 40)
1259                 indent = 0;
1260
1261               es_fprintf (es_stdout, "uid%*s%s ", indent, "", validity);
1262             }
1263           else
1264             {
1265               indent = kl + (opt.legacy_list_mode? 10:12);
1266               es_fprintf (es_stdout, "uid%*s", indent, "");
1267             }
1268
1269           print_utf8_buffer (es_stdout, uid->name, uid->len);
1270           es_putc ('\n', es_stdout);
1271
1272           if (opt.with_wkd_hash)
1273             {
1274               char *mbox, *hash, *p;
1275               char hashbuf[32];
1276
1277               mbox = mailbox_from_userid (uid->name, 0);
1278               if (mbox && (p = strchr (mbox, '@')))
1279                 {
1280                   *p++ = 0;
1281                   gcry_md_hash_buffer (GCRY_MD_SHA1, hashbuf,
1282                                        mbox, strlen (mbox));
1283                   hash = zb32_encode (hashbuf, 8*20);
1284                   if (hash)
1285                     {
1286                       es_fprintf (es_stdout, "   %*s%s@%s\n",
1287                                   indent, "", hash, p);
1288                       xfree (hash);
1289                     }
1290                 }
1291               xfree (mbox);
1292             }
1293
1294           if (opt.with_key_origin
1295               && (uid->keyorg || uid->keyupdate || uid->updateurl))
1296             {
1297               char updatestr[MK_DATESTR_SIZE];
1298
1299               es_fprintf (es_stdout, "   %*sorigin=%s last=%s %s",
1300                           indent, "",
1301                           key_origin_string (uid->keyorg),
1302                           mk_datestr (updatestr, sizeof updatestr,
1303                                       uid->keyupdate),
1304                           uid->updateurl? "url=":"");
1305               if (uid->updateurl)
1306                 print_utf8_string (es_stdout, uid->updateurl);
1307               es_putc ('\n', es_stdout);
1308             }
1309
1310           if ((opt.list_options & LIST_SHOW_PHOTOS) && uid->attribs != NULL)
1311             show_photos (ctrl, uid->attribs, uid->numattribs, pk, uid);
1312         }
1313       else if (node->pkt->pkttype == PKT_PUBLIC_SUBKEY)
1314         {
1315           PKT_public_key *pk2 = node->pkt->pkt.public_key;
1316
1317           if ((pk2->flags.revoked || pk2->has_expired)
1318               && !(opt.list_options & LIST_SHOW_UNUSABLE_SUBKEYS))
1319             {
1320               skip_sigs = 1;
1321               continue;
1322             }
1323           else
1324             skip_sigs = 0;
1325
1326           xfree (serialno); serialno = NULL;
1327           xfree (hexgrip); hexgrip = NULL;
1328           if (secret || opt.with_keygrip)
1329             {
1330               rc = hexkeygrip_from_pk (pk2, &hexgrip);
1331               if (rc)
1332                 log_error ("error computing a keygrip: %s\n",
1333                            gpg_strerror (rc));
1334             }
1335           if (secret)
1336             {
1337               if (!agent_get_keyinfo (NULL, hexgrip, &serialno, NULL))
1338                 secret = serialno? 3 : 1;
1339               else
1340                 secret = 2;  /* Key not found.  */
1341             }
1342
1343           /* Print the "sub" line.  */
1344           print_key_line (ctrl, es_stdout, pk2, secret);
1345           if (fpr > 1 || opt.with_subkey_fingerprint)
1346             {
1347               print_fingerprint (ctrl, NULL, pk2, 0);
1348               if (serialno)
1349                 print_card_serialno (serialno);
1350             }
1351           if (opt.with_keygrip && hexgrip)
1352             es_fprintf (es_stdout, "      Keygrip = %s\n", hexgrip);
1353           if (opt.with_key_data)
1354             print_key_data (pk2);
1355           if (opt.with_key_screening)
1356             print_pk_screening (pk2, 0);
1357         }
1358       else if (opt.list_sigs
1359                && node->pkt->pkttype == PKT_SIGNATURE && !skip_sigs)
1360         {
1361           if ((opt.list_options & LIST_SORT_SIGS))
1362             {
1363               kbnode_t n;
1364               unsigned int sigcount = 0;
1365               kbnode_t *sigarray;
1366               unsigned int idx;
1367
1368               for (n=node; n && n->pkt->pkttype == PKT_SIGNATURE; n = n->next)
1369                 sigcount++;
1370               sigarray = xcalloc (sigcount, sizeof *sigarray);
1371
1372               sigcount = 0;
1373               for (n=node; n && n->pkt->pkttype == PKT_SIGNATURE; n = n->next)
1374                 {
1375                   if (!keyid_cmp (mainkid, n->pkt->pkt.signature->keyid))
1376                     n->flag |= NODFLG_MARK_B;  /* Is a self-sig.  */
1377                   else
1378                     n->flag &= ~NODFLG_MARK_B;
1379
1380                   sigarray[sigcount++] = node = n;
1381                 }
1382               /* Note that NODE is now at the last signature.  */
1383
1384               qsort (sigarray, sigcount, sizeof *sigarray, cmp_signodes);
1385
1386               for (idx=0; idx < sigcount; idx++)
1387                 list_signature_print (ctrl, keyblock, sigarray[idx], listctx);
1388               xfree (sigarray);
1389             }
1390           else
1391             list_signature_print (ctrl, keyblock, node, listctx);
1392         }
1393     }
1394   es_putc ('\n', es_stdout);
1395   xfree (serialno);
1396   xfree (hexgrip);
1397 }
1398
1399
1400 /* Do a simple key listing printing only the fingerprint and the mail
1401  * address of valid keys.  */
1402 static void
1403 list_keyblock_simple (ctrl_t ctrl, kbnode_t keyblock)
1404 {
1405   gpg_err_code_t ec;
1406   kbnode_t kbctx;
1407   kbnode_t node;
1408   char hexfpr[2*MAX_FINGERPRINT_LEN+1];
1409   char *mbox;
1410
1411   (void)ctrl;
1412
1413   node = find_kbnode (keyblock, PKT_PUBLIC_KEY);
1414   if (!node)
1415     {
1416       log_error ("Oops; key lost!\n");
1417       dump_kbnode (keyblock);
1418       return;
1419     }
1420   hexfingerprint (node->pkt->pkt.public_key, hexfpr, sizeof hexfpr);
1421
1422   for (kbctx = NULL; (node = walk_kbnode (keyblock, &kbctx, 0));)
1423     {
1424       if (node->pkt->pkttype == PKT_USER_ID)
1425         {
1426           PKT_user_id *uid = node->pkt->pkt.user_id;
1427
1428           if (uid->attrib_data)
1429             continue;
1430
1431           if (uid->flags.expired || uid->flags.revoked)
1432             continue;
1433
1434           mbox = mailbox_from_userid (uid->name, 0);
1435           if (!mbox)
1436             {
1437               ec = gpg_err_code_from_syserror ();
1438               if (ec != GPG_ERR_EINVAL)
1439                 log_error ("error getting mailbox from user-id: %s\n",
1440                            gpg_strerror (ec));
1441               continue;
1442             }
1443           es_fprintf (es_stdout, "%s %s\n", hexfpr, mbox);
1444           xfree (mbox);
1445         }
1446     }
1447 }
1448
1449
1450 void
1451 print_revokers (estream_t fp, PKT_public_key * pk)
1452 {
1453   /* print the revoker record */
1454   if (!pk->revkey && pk->numrevkeys)
1455     BUG ();
1456   else
1457     {
1458       int i, j;
1459
1460       for (i = 0; i < pk->numrevkeys; i++)
1461         {
1462           byte *p;
1463
1464           es_fprintf (fp, "rvk:::%d::::::", pk->revkey[i].algid);
1465           p = pk->revkey[i].fpr;
1466           for (j = 0; j < pk->revkey[i].fprlen; j++, p++)
1467             es_fprintf (fp, "%02X", *p);
1468           es_fprintf (fp, ":%02x%s:\n",
1469                       pk->revkey[i].class,
1470                       (pk->revkey[i].class & 0x40) ? "s" : "");
1471         }
1472     }
1473 }
1474
1475
1476 /* Print the compliance flags to field 18.  PK is the public key.
1477  * KEYLENGTH is the length of the key in bits and CURVENAME is either
1478  * NULL or the name of the curve.  The latter two args are here
1479  * merely because the caller has already computed them.  */
1480 static void
1481 print_compliance_flags (PKT_public_key *pk,
1482                         unsigned int keylength, const char *curvename)
1483 {
1484   int any = 0;
1485
1486   if (!keylength)
1487     keylength = nbits_from_pk (pk);
1488
1489   if (pk->version == 5)
1490     {
1491       es_fputs (gnupg_status_compliance_flag (CO_GNUPG), es_stdout);
1492       any++;
1493     }
1494   if (gnupg_pk_is_compliant (CO_DE_VS, pk->pubkey_algo, 0, pk->pkey,
1495                              keylength, curvename))
1496     {
1497       es_fprintf (es_stdout, any ? " %s" : "%s",
1498                   gnupg_status_compliance_flag (CO_DE_VS));
1499       any++;
1500     }
1501
1502   if (opt.with_key_screening)
1503     print_pk_screening (pk, 1+any);
1504 }
1505
1506
1507 /* List a key in colon mode.  If SECRET is true this is a secret key
1508    record (i.e. requested via --list-secret-key).  If HAS_SECRET a
1509    secret key is available even if SECRET is not set.  */
1510 static void
1511 list_keyblock_colon (ctrl_t ctrl, kbnode_t keyblock,
1512                      int secret, int has_secret)
1513 {
1514   int rc;
1515   KBNODE kbctx;
1516   KBNODE node;
1517   PKT_public_key *pk;
1518   u32 keyid[2];
1519   int trustletter = 0;
1520   int trustletter_print;
1521   int ownertrust_print;
1522   int ulti_hack = 0;
1523   int i;
1524   char *hexgrip_buffer = NULL;
1525   const char *hexgrip = NULL;
1526   char *serialno = NULL;
1527   int stubkey;
1528   unsigned int keylength;
1529   char *curve = NULL;
1530   const char *curvename = NULL;
1531
1532   /* Get the keyid from the keyblock.  */
1533   node = find_kbnode (keyblock, PKT_PUBLIC_KEY);
1534   if (!node)
1535     {
1536       log_error ("Oops; key lost!\n");
1537       dump_kbnode (keyblock);
1538       return;
1539     }
1540
1541   pk = node->pkt->pkt.public_key;
1542   if (secret || has_secret || opt.with_keygrip || opt.with_key_data)
1543     {
1544       rc = hexkeygrip_from_pk (pk, &hexgrip_buffer);
1545       if (rc)
1546         log_error ("error computing a keygrip: %s\n", gpg_strerror (rc));
1547       /* In the error case we print an empty string so that we have a
1548        * "grp" record for each primary and subkey - even if it is
1549        * empty.  This may help to prevent sync problems.  */
1550       hexgrip = hexgrip_buffer? hexgrip_buffer : "";
1551     }
1552   stubkey = 0;
1553   if ((secret || has_secret)
1554       && agent_get_keyinfo (NULL, hexgrip, &serialno, NULL))
1555     stubkey = 1;  /* Key not found.  */
1556
1557   keyid_from_pk (pk, keyid);
1558   if (!pk->flags.valid)
1559     trustletter_print = 'i';
1560   else if (pk->flags.revoked)
1561     trustletter_print = 'r';
1562   else if (pk->has_expired)
1563     trustletter_print = 'e';
1564   else if (opt.fast_list_mode || opt.no_expensive_trust_checks)
1565     trustletter_print = 0;
1566   else
1567     {
1568       trustletter = get_validity_info (ctrl, keyblock, pk, NULL);
1569       if (trustletter == 'u')
1570         ulti_hack = 1;
1571       trustletter_print = trustletter;
1572     }
1573
1574   if (!opt.fast_list_mode && !opt.no_expensive_trust_checks)
1575     ownertrust_print = get_ownertrust_info (ctrl, pk, 0);
1576   else
1577     ownertrust_print = 0;
1578
1579   keylength = nbits_from_pk (pk);
1580
1581   es_fputs (secret? "sec:":"pub:", es_stdout);
1582   if (trustletter_print)
1583     es_putc (trustletter_print, es_stdout);
1584   es_fprintf (es_stdout, ":%u:%d:%08lX%08lX:%s:%s::",
1585               keylength,
1586               pk->pubkey_algo,
1587               (ulong) keyid[0], (ulong) keyid[1],
1588               colon_datestr_from_pk (pk), colon_strtime (pk->expiredate));
1589
1590   if (ownertrust_print)
1591     es_putc (ownertrust_print, es_stdout);
1592   es_putc (':', es_stdout);
1593
1594   es_putc (':', es_stdout);
1595   es_putc (':', es_stdout);
1596   print_capabilities (ctrl, pk, keyblock);
1597   es_putc (':', es_stdout);             /* End of field 13. */
1598   es_putc (':', es_stdout);             /* End of field 14. */
1599   if (secret || has_secret)
1600     {
1601       if (stubkey)
1602         es_putc ('#', es_stdout);
1603       else if (serialno)
1604         es_fputs (serialno, es_stdout);
1605       else if (has_secret)
1606         es_putc ('+', es_stdout);
1607     }
1608   es_putc (':', es_stdout);             /* End of field 15. */
1609   es_putc (':', es_stdout);             /* End of field 16. */
1610   if (pk->pubkey_algo == PUBKEY_ALGO_ECDSA
1611       || pk->pubkey_algo == PUBKEY_ALGO_EDDSA
1612       || pk->pubkey_algo == PUBKEY_ALGO_ECDH)
1613     {
1614       curve = openpgp_oid_to_str (pk->pkey[0]);
1615       curvename = openpgp_oid_to_curve (curve, 0);
1616       if (!curvename)
1617         curvename = curve;
1618       es_fputs (curvename, es_stdout);
1619     }
1620   es_putc (':', es_stdout);             /* End of field 17. */
1621   print_compliance_flags (pk, keylength, curvename);
1622   es_putc (':', es_stdout);             /* End of field 18 (compliance). */
1623   if (pk->keyupdate)
1624     es_fputs (colon_strtime (pk->keyupdate), es_stdout);
1625   es_putc (':', es_stdout);             /* End of field 19 (last_update). */
1626   es_fprintf (es_stdout, "%d%s", pk->keyorg, pk->updateurl? " ":"");
1627   if (pk->updateurl)
1628     es_write_sanitized (es_stdout, pk->updateurl, strlen (pk->updateurl),
1629                         ":", NULL);
1630   es_putc (':', es_stdout);             /* End of field 20 (origin). */
1631   es_putc ('\n', es_stdout);
1632
1633   print_revokers (es_stdout, pk);
1634   print_fingerprint (ctrl, NULL, pk, 0);
1635   if (hexgrip)
1636     es_fprintf (es_stdout, "grp:::::::::%s:\n", hexgrip);
1637   if (opt.with_key_data)
1638     print_key_data (pk);
1639
1640   for (kbctx = NULL; (node = walk_kbnode (keyblock, &kbctx, 0));)
1641     {
1642       if (node->pkt->pkttype == PKT_USER_ID)
1643         {
1644           PKT_user_id *uid = node->pkt->pkt.user_id;
1645           int uid_validity;
1646
1647           if (attrib_fp && uid->attrib_data != NULL)
1648             dump_attribs (uid, pk);
1649
1650           if (uid->flags.revoked)
1651             uid_validity = 'r';
1652           else if (uid->flags.expired)
1653             uid_validity = 'e';
1654           else if (opt.no_expensive_trust_checks)
1655             uid_validity = 0;
1656           else if (ulti_hack)
1657             uid_validity = 'u';
1658           else
1659             uid_validity = get_validity_info (ctrl, keyblock, pk, uid);
1660
1661           es_fputs (uid->attrib_data? "uat:":"uid:", es_stdout);
1662           if (uid_validity)
1663             es_putc (uid_validity, es_stdout);
1664           es_fputs ("::::", es_stdout);
1665
1666           es_fprintf (es_stdout, "%s:", colon_strtime (uid->created));
1667           es_fprintf (es_stdout, "%s:", colon_strtime (uid->expiredate));
1668
1669           namehash_from_uid (uid);
1670
1671           for (i = 0; i < 20; i++)
1672             es_fprintf (es_stdout, "%02X", uid->namehash[i]);
1673
1674           es_fprintf (es_stdout, "::");
1675
1676           if (uid->attrib_data)
1677             es_fprintf (es_stdout, "%u %lu", uid->numattribs, uid->attrib_len);
1678           else
1679             es_write_sanitized (es_stdout, uid->name, uid->len, ":", NULL);
1680           es_fputs (":::::::::", es_stdout);
1681           if (uid->keyupdate)
1682             es_fputs (colon_strtime (uid->keyupdate), es_stdout);
1683           es_putc (':', es_stdout);     /* End of field 19 (last_update). */
1684           es_fprintf (es_stdout, "%d%s", uid->keyorg, uid->updateurl? " ":"");
1685           if (uid->updateurl)
1686             es_write_sanitized (es_stdout,
1687                                 uid->updateurl, strlen (uid->updateurl),
1688                                 ":", NULL);
1689           es_putc (':', es_stdout);     /* End of field 20 (origin). */
1690           es_putc ('\n', es_stdout);
1691 #ifdef USE_TOFU
1692           if (!uid->attrib_data && opt.with_tofu_info
1693               && (opt.trust_model == TM_TOFU || opt.trust_model == TM_TOFU_PGP))
1694             {
1695               /* Print a "tfs" record.  */
1696               tofu_write_tfs_record (ctrl, es_stdout, pk, uid->name);
1697             }
1698 #endif /*USE_TOFU*/
1699         }
1700       else if (node->pkt->pkttype == PKT_PUBLIC_SUBKEY)
1701         {
1702           u32 keyid2[2];
1703           PKT_public_key *pk2;
1704           int need_hexgrip = !!hexgrip;
1705
1706           pk2 = node->pkt->pkt.public_key;
1707           xfree (hexgrip_buffer); hexgrip_buffer = NULL; hexgrip = NULL;
1708           xfree (serialno); serialno = NULL;
1709           if (need_hexgrip
1710               || secret || has_secret || opt.with_keygrip || opt.with_key_data)
1711             {
1712               rc = hexkeygrip_from_pk (pk2, &hexgrip_buffer);
1713               if (rc)
1714                 log_error ("error computing a keygrip: %s\n",
1715                            gpg_strerror (rc));
1716               hexgrip = hexgrip_buffer? hexgrip_buffer : "";
1717             }
1718           stubkey = 0;
1719           if ((secret||has_secret)
1720               && agent_get_keyinfo (NULL, hexgrip, &serialno, NULL))
1721             stubkey = 1;  /* Key not found.  */
1722
1723           keyid_from_pk (pk2, keyid2);
1724           es_fputs (secret? "ssb:":"sub:", es_stdout);
1725           if (!pk2->flags.valid)
1726             es_putc ('i', es_stdout);
1727           else if (pk2->flags.revoked)
1728             es_putc ('r', es_stdout);
1729           else if (pk2->has_expired)
1730             es_putc ('e', es_stdout);
1731           else if (opt.fast_list_mode || opt.no_expensive_trust_checks)
1732             ;
1733           else
1734             {
1735               /* TRUSTLETTER should always be defined here. */
1736               if (trustletter)
1737                 es_fprintf (es_stdout, "%c", trustletter);
1738             }
1739           keylength = nbits_from_pk (pk2);
1740           es_fprintf (es_stdout, ":%u:%d:%08lX%08lX:%s:%s:::::",
1741                       keylength,
1742                       pk2->pubkey_algo,
1743                       (ulong) keyid2[0], (ulong) keyid2[1],
1744                       colon_datestr_from_pk (pk2),
1745                       colon_strtime (pk2->expiredate));
1746           print_capabilities (ctrl, pk2, NULL);
1747           es_putc (':', es_stdout);     /* End of field 13. */
1748           es_putc (':', es_stdout);     /* End of field 14. */
1749           if (secret || has_secret)
1750             {
1751               if (stubkey)
1752                 es_putc ('#', es_stdout);
1753               else if (serialno)
1754                 es_fputs (serialno, es_stdout);
1755               else if (has_secret)
1756                 es_putc ('+', es_stdout);
1757             }
1758           es_putc (':', es_stdout);     /* End of field 15. */
1759           es_putc (':', es_stdout);     /* End of field 16. */
1760           if (pk2->pubkey_algo == PUBKEY_ALGO_ECDSA
1761               || pk2->pubkey_algo == PUBKEY_ALGO_EDDSA
1762               || pk2->pubkey_algo == PUBKEY_ALGO_ECDH)
1763             {
1764               xfree (curve);
1765               curve = openpgp_oid_to_str (pk2->pkey[0]);
1766               curvename = openpgp_oid_to_curve (curve, 0);
1767               if (!curvename)
1768                 curvename = curve;
1769               es_fputs (curvename, es_stdout);
1770             }
1771           es_putc (':', es_stdout);     /* End of field 17. */
1772           print_compliance_flags (pk2, keylength, curvename);
1773           es_putc (':', es_stdout);     /* End of field 18. */
1774           es_putc ('\n', es_stdout);
1775           print_fingerprint (ctrl, NULL, pk2, 0);
1776           if (hexgrip)
1777             es_fprintf (es_stdout, "grp:::::::::%s:\n", hexgrip);
1778           if (opt.with_key_data)
1779             print_key_data (pk2);
1780         }
1781       else if (opt.list_sigs && node->pkt->pkttype == PKT_SIGNATURE)
1782         {
1783           PKT_signature *sig = node->pkt->pkt.signature;
1784           int sigrc, fprokay = 0;
1785           char *sigstr;
1786           size_t fplen;
1787           byte fparray[MAX_FINGERPRINT_LEN];
1788           char *siguid;
1789           size_t siguidlen;
1790           char *issuer_fpr = NULL;
1791           char *reason_text = NULL;
1792           char *reason_comment = NULL;
1793           size_t reason_commentlen;
1794           int reason_code = 0;  /* Init to silence compiler warning.  */
1795
1796           if (sig->sig_class == 0x20 || sig->sig_class == 0x28
1797               || sig->sig_class == 0x30)
1798             {
1799               sigstr = "rev";
1800               reason_code = get_revocation_reason (sig, &reason_text,
1801                                                    &reason_comment,
1802                                                    &reason_commentlen);
1803             }
1804           else if ((sig->sig_class & ~3) == 0x10)
1805             sigstr = "sig";
1806           else if (sig->sig_class == 0x18)
1807             sigstr = "sig";
1808           else if (sig->sig_class == 0x1F)
1809             sigstr = "sig";
1810           else
1811             {
1812               es_fprintf (es_stdout, "sig::::::::::%02x%c:\n",
1813                       sig->sig_class, sig->flags.exportable ? 'x' : 'l');
1814               continue;
1815             }
1816
1817           if (opt.check_sigs)
1818             {
1819               PKT_public_key *signer_pk = NULL;
1820
1821               es_fflush (es_stdout);
1822               if (opt.no_sig_cache)
1823                 signer_pk = xmalloc_clear (sizeof (PKT_public_key));
1824
1825               rc = check_key_signature2 (ctrl, keyblock, node, NULL, signer_pk,
1826                                          NULL, NULL, NULL);
1827               switch (gpg_err_code (rc))
1828                 {
1829                 case 0:
1830                   sigrc = '!';
1831                   break;
1832                 case GPG_ERR_BAD_SIGNATURE:
1833                   sigrc = '-';
1834                   break;
1835                 case GPG_ERR_NO_PUBKEY:
1836                 case GPG_ERR_UNUSABLE_PUBKEY:
1837                   sigrc = '?';
1838                   break;
1839                 default:
1840                   sigrc = '%';
1841                   break;
1842                 }
1843
1844               if (opt.no_sig_cache)
1845                 {
1846                   if (!rc)
1847                     {
1848                       fingerprint_from_pk (signer_pk, fparray, &fplen);
1849                       fprokay = 1;
1850                     }
1851                   free_public_key (signer_pk);
1852                 }
1853             }
1854           else
1855             {
1856               rc = 0;
1857               sigrc = ' '; /* Note the fix-up below in --list-sigs mode.  */
1858             }
1859
1860           if (sigrc != '%' && sigrc != '?' && !opt.fast_list_mode)
1861             {
1862               int nouid;
1863               siguid = get_user_id (ctrl, sig->keyid, &siguidlen, &nouid);
1864               if (!opt.check_sigs && nouid)
1865                 sigrc = '?';  /* No key in local keyring.  */
1866             }
1867           else
1868             {
1869               siguid = NULL;
1870               siguidlen = 0;
1871             }
1872
1873
1874           es_fputs (sigstr, es_stdout);
1875           es_putc (':', es_stdout);
1876           if (sigrc != ' ')
1877             es_putc (sigrc, es_stdout);
1878           es_fprintf (es_stdout, "::%d:%08lX%08lX:%s:%s:", sig->pubkey_algo,
1879                   (ulong) sig->keyid[0], (ulong) sig->keyid[1],
1880                   colon_datestr_from_sig (sig),
1881                   colon_expirestr_from_sig (sig));
1882
1883           if (sig->trust_depth || sig->trust_value)
1884             es_fprintf (es_stdout, "%d %d", sig->trust_depth, sig->trust_value);
1885           es_fprintf (es_stdout, ":");
1886
1887           if (sig->trust_regexp)
1888             es_write_sanitized (es_stdout, sig->trust_regexp,
1889                                 strlen (sig->trust_regexp), ":", NULL);
1890           es_fprintf (es_stdout, ":");
1891
1892           if (sigrc == '%')
1893             es_fprintf (es_stdout, "[%s] ", gpg_strerror (rc));
1894           else if (siguid)
1895             es_write_sanitized (es_stdout, siguid, siguidlen, ":", NULL);
1896
1897           es_fprintf (es_stdout, ":%02x%c", sig->sig_class,
1898                       sig->flags.exportable ? 'x' : 'l');
1899           if (reason_text)
1900             es_fprintf (es_stdout, ",%02x", reason_code);
1901           es_fputs ("::", es_stdout);
1902
1903           if (opt.no_sig_cache && opt.check_sigs && fprokay)
1904             {
1905               for (i = 0; i < fplen; i++)
1906                 es_fprintf (es_stdout, "%02X", fparray[i]);
1907             }
1908           else if ((issuer_fpr = issuer_fpr_string (sig)))
1909             es_fputs (issuer_fpr, es_stdout);
1910
1911           es_fprintf (es_stdout, ":::%d:", sig->digest_algo);
1912
1913           if (reason_comment)
1914             {
1915               es_fputs ("::::", es_stdout);
1916               es_write_sanitized (es_stdout, reason_comment, reason_commentlen,
1917                                   ":", NULL);
1918               es_putc (':', es_stdout);
1919             }
1920           es_putc ('\n', es_stdout);
1921
1922           if (opt.show_subpackets)
1923             print_subpackets_colon (sig);
1924
1925           /* fixme: check or list other sigs here */
1926           xfree (reason_text);
1927           xfree (reason_comment);
1928           xfree (siguid);
1929           xfree (issuer_fpr);
1930         }
1931     }
1932
1933   xfree (curve);
1934   xfree (hexgrip_buffer);
1935   xfree (serialno);
1936 }
1937
1938 /*
1939  * Reorder the keyblock so that the primary user ID (and not attribute
1940  * packet) comes first.  Fixme: Replace this by a generic sort
1941  * function.  */
1942 static void
1943 do_reorder_keyblock (KBNODE keyblock, int attr)
1944 {
1945   KBNODE primary = NULL, primary0 = NULL, primary2 = NULL;
1946   KBNODE last, node;
1947
1948   for (node = keyblock; node; primary0 = node, node = node->next)
1949     {
1950       if (node->pkt->pkttype == PKT_USER_ID &&
1951           ((attr && node->pkt->pkt.user_id->attrib_data) ||
1952            (!attr && !node->pkt->pkt.user_id->attrib_data)) &&
1953           node->pkt->pkt.user_id->flags.primary)
1954         {
1955           primary = primary2 = node;
1956           for (node = node->next; node; primary2 = node, node = node->next)
1957             {
1958               if (node->pkt->pkttype == PKT_USER_ID
1959                   || node->pkt->pkttype == PKT_PUBLIC_SUBKEY
1960                   || node->pkt->pkttype == PKT_SECRET_SUBKEY)
1961                 {
1962                   break;
1963                 }
1964             }
1965           break;
1966         }
1967     }
1968   if (!primary)
1969     return; /* No primary key flag found (should not happen).  */
1970
1971   for (last = NULL, node = keyblock; node; last = node, node = node->next)
1972     {
1973       if (node->pkt->pkttype == PKT_USER_ID)
1974         break;
1975     }
1976   log_assert (node);
1977   log_assert (last);     /* The user ID is never the first packet.  */
1978   log_assert (primary0); /* Ditto (this is the node before primary).  */
1979   if (node == primary)
1980     return; /* Already the first one.  */
1981
1982   last->next = primary;
1983   primary0->next = primary2->next;
1984   primary2->next = node;
1985 }
1986
1987 void
1988 reorder_keyblock (KBNODE keyblock)
1989 {
1990   do_reorder_keyblock (keyblock, 1);
1991   do_reorder_keyblock (keyblock, 0);
1992 }
1993
1994 static void
1995 list_keyblock (ctrl_t ctrl,
1996                KBNODE keyblock, int secret, int has_secret, int fpr,
1997                struct keylist_context *listctx)
1998 {
1999   reorder_keyblock (keyblock);
2000
2001   if (opt.with_colons)
2002     list_keyblock_colon (ctrl, keyblock, secret, has_secret);
2003   else if ((opt.list_options & LIST_SHOW_ONLY_FPR_MBOX))
2004     {
2005       if (!listctx->no_validity)
2006         check_trustdb_stale (ctrl);
2007       list_keyblock_simple (ctrl, keyblock);
2008     }
2009   else
2010     list_keyblock_print (ctrl, keyblock, secret, fpr, listctx);
2011
2012   if (secret)
2013     es_fflush (es_stdout);
2014 }
2015
2016
2017 /* Public function used by keygen to list a keyblock.  If NO_VALIDITY
2018  * is set the validity of a key is never shown.  */
2019 void
2020 list_keyblock_direct (ctrl_t ctrl,
2021                       kbnode_t keyblock, int secret, int has_secret, int fpr,
2022                       int no_validity)
2023 {
2024   struct keylist_context listctx;
2025
2026   memset (&listctx, 0, sizeof (listctx));
2027   listctx.no_validity = !!no_validity;
2028   list_keyblock (ctrl, keyblock, secret, has_secret, fpr, &listctx);
2029   keylist_context_release (&listctx);
2030 }
2031
2032
2033 /* Print an hex digit in ICAO spelling.  */
2034 static void
2035 print_icao_hexdigit (estream_t fp, int c)
2036 {
2037   static const char *list[16] = {
2038     "Zero", "One", "Two", "Three", "Four", "Five", "Six", "Seven",
2039     "Eight", "Niner", "Alfa", "Bravo", "Charlie", "Delta", "Echo", "Foxtrot"
2040   };
2041
2042   tty_fprintf (fp, "%s", list[c&15]);
2043 }
2044
2045
2046 /*
2047  * Function to print the finperprint.
2048  * mode 0: as used in key listings, opt.with_colons is honored
2049  *      1: print using log_info ()
2050  *      2: direct use of tty
2051  *      3: direct use of tty but only primary key.
2052  *      4: direct use of tty but only subkey.
2053  *     10: Same as 0 but with_colons etc is ignored.
2054  *     20: Same as 0 but using a compact format.
2055  *
2056  * Modes 1 and 2 will try and print both subkey and primary key
2057  * fingerprints.  A MODE with bit 7 set is used internally.  If
2058  * OVERRIDE_FP is not NULL that stream will be used in  0 instead
2059  * of es_stdout or instead of the TTY in modes 2 and 3.
2060  */
2061 void
2062 print_fingerprint (ctrl_t ctrl, estream_t override_fp,
2063                    PKT_public_key *pk, int mode)
2064 {
2065   char hexfpr[2*MAX_FINGERPRINT_LEN+1];
2066   char *p;
2067   size_t i;
2068   estream_t fp;
2069   const char *text;
2070   int primary = 0;
2071   int with_colons = opt.with_colons;
2072   int with_icao   = opt.with_icao_spelling;
2073   int compact = 0;
2074
2075   if (mode == 10)
2076     {
2077       mode = 0;
2078       with_colons = 0;
2079       with_icao = 0;
2080     }
2081   else if (mode == 20)
2082     {
2083       mode = 0;
2084       with_colons = 0;
2085       compact = 1;
2086     }
2087
2088   if (!opt.fingerprint && !opt.with_fingerprint
2089       && opt.with_subkey_fingerprint)
2090     compact = 1;
2091
2092   if (pk->main_keyid[0] == pk->keyid[0]
2093       && pk->main_keyid[1] == pk->keyid[1])
2094     primary = 1;
2095
2096   /* Just to be safe */
2097   if ((mode & 0x80) && !primary)
2098     {
2099       log_error ("primary key is not really primary!\n");
2100       return;
2101     }
2102
2103   mode &= ~0x80;
2104
2105   if (!primary && (mode == 1 || mode == 2))
2106     {
2107       PKT_public_key *primary_pk = xmalloc_clear (sizeof (*primary_pk));
2108       get_pubkey (ctrl, primary_pk, pk->main_keyid);
2109       print_fingerprint (ctrl, override_fp, primary_pk, (mode | 0x80));
2110       free_public_key (primary_pk);
2111     }
2112
2113   if (mode == 1)
2114     {
2115       fp = log_get_stream ();
2116       if (primary)
2117         text = _("Primary key fingerprint:");
2118       else
2119         text = _("     Subkey fingerprint:");
2120     }
2121   else if (mode == 2)
2122     {
2123       fp = override_fp; /* Use tty or given stream.  */
2124       if (primary)
2125         /* TRANSLATORS: this should fit into 24 bytes so that the
2126          * fingerprint data is properly aligned with the user ID */
2127         text = _(" Primary key fingerprint:");
2128       else
2129         text = _("      Subkey fingerprint:");
2130     }
2131   else if (mode == 3)
2132     {
2133       fp = override_fp; /* Use tty or given stream.  */
2134       text = _("      Key fingerprint =");
2135     }
2136   else if (mode == 4)
2137     {
2138       fp = override_fp; /* Use tty or given stream.  */
2139       text = _("      Subkey fingerprint:");
2140     }
2141   else
2142     {
2143       fp = override_fp? override_fp : es_stdout;
2144       if (opt.keyid_format == KF_NONE)
2145         {
2146           text = "     ";  /* To indent ICAO spelling.  */
2147           compact = 1;
2148         }
2149       else
2150         text = _("      Key fingerprint =");
2151     }
2152
2153   hexfingerprint (pk, hexfpr, sizeof hexfpr);
2154   if (with_colons && !mode)
2155     {
2156       es_fprintf (fp, "fpr:::::::::%s:", hexfpr);
2157     }
2158   else if (compact && !opt.fingerprint && !opt.with_fingerprint)
2159     {
2160       tty_fprintf (fp, "%*s%s", 6, "", hexfpr);
2161     }
2162   else
2163     {
2164       char fmtfpr[MAX_FORMATTED_FINGERPRINT_LEN + 1];
2165       format_hexfingerprint (hexfpr, fmtfpr, sizeof fmtfpr);
2166       if (compact)
2167         tty_fprintf (fp, "%*s%s", 6, "", fmtfpr);
2168       else
2169         tty_fprintf (fp, "%s %s", text, fmtfpr);
2170     }
2171   tty_fprintf (fp, "\n");
2172   if (!with_colons && with_icao)
2173     {
2174       ;
2175       tty_fprintf (fp, "%*s\"", (int)strlen(text)+1, "");
2176       for (i = 0, p = hexfpr; *p; i++, p++)
2177         {
2178           if (!i)
2179             ;
2180           else if (!(i%10))
2181             tty_fprintf (fp, "\n%*s ", (int)strlen(text)+1, "");
2182           else if (!(i%5))
2183             tty_fprintf (fp, "  ");
2184           else
2185             tty_fprintf (fp, " ");
2186           print_icao_hexdigit (fp, xtoi_1 (p));
2187         }
2188       tty_fprintf (fp, "\"\n");
2189     }
2190 }
2191
2192 /* Print the serial number of an OpenPGP card if available.  */
2193 static void
2194 print_card_serialno (const char *serialno)
2195 {
2196   if (!serialno)
2197     return;
2198   if (opt.with_colons)
2199     return; /* Handled elsewhere. */
2200
2201   es_fputs (_("      Card serial no. ="), es_stdout);
2202   es_putc (' ', es_stdout);
2203   if (strlen (serialno) == 32 && !strncmp (serialno, "D27600012401", 12))
2204     {
2205       /* This is an OpenPGP card.  Print the relevant part.  */
2206       /* Example: D2760001240101010001000003470000 */
2207       /*                          xxxxyyyyyyyy     */
2208       es_fprintf (es_stdout, "%.*s %.*s", 4, serialno+16, 8, serialno+20);
2209     }
2210  else
2211    es_fputs (serialno, es_stdout);
2212   es_putc ('\n', es_stdout);
2213 }
2214
2215
2216 /* Print a public or secret (sub)key line.  Example:
2217  *
2218  * pub   dsa2048 2007-12-31 [SC] [expires: 2018-12-31]
2219  *       80615870F5BAD690333686D0F2AD85AC1E42B367
2220  *
2221  * pub   rsa2048 2017-12-31 [SC] [expires: 2028-12-31]
2222  *       80615870F5BAD690333686D0F2AD85AC1E42B3671122334455
2223  *
2224  * Some global options may result in a different output format.  If
2225  * SECRET is set, "sec" or "ssb" is used instead of "pub" or "sub" and
2226  * depending on the value a flag character is shown:
2227  *
2228  *    1 := ' ' Regular secret key
2229  *    2 := '#' Stub secret key
2230  *    3 := '>' Secret key is on a token.
2231  */
2232 void
2233 print_key_line (ctrl_t ctrl, estream_t fp, PKT_public_key *pk, int secret)
2234 {
2235   char pkstrbuf[PUBKEY_STRING_SIZE];
2236
2237   tty_fprintf (fp, "%s%c  %s",
2238                pk->flags.primary? (secret? "sec":"pub")
2239                /**/             : (secret? "ssb":"sub"),
2240                secret == 2? '#' : secret == 3? '>' : ' ',
2241                pubkey_string (pk, pkstrbuf, sizeof pkstrbuf));
2242   if (opt.keyid_format != KF_NONE)
2243     tty_fprintf (fp, "/%s", keystr_from_pk (pk));
2244   tty_fprintf (fp, " %s", datestr_from_pk (pk));
2245
2246   if (pk->flags.primary
2247       && !(openpgp_pk_algo_usage (pk->pubkey_algo)
2248            & (PUBKEY_USAGE_CERT| PUBKEY_USAGE_SIG|PUBKEY_USAGE_AUTH)))
2249     {
2250       /* A primary key which is really not capable to sign.  */
2251       tty_fprintf (fp, " [INVALID_ALGO]");
2252     }
2253   else if ((opt.list_options & LIST_SHOW_USAGE))
2254     {
2255       tty_fprintf (fp, " [%s]", usagestr_from_pk (pk, 0));
2256     }
2257
2258   if (pk->flags.revoked)
2259     {
2260       tty_fprintf (fp, " [");
2261       tty_fprintf (fp, _("revoked: %s"), revokestr_from_pk (pk));
2262       tty_fprintf (fp, "]");
2263     }
2264   else if (pk->has_expired)
2265     {
2266       tty_fprintf (fp, " [");
2267       tty_fprintf (fp, _("expired: %s"), expirestr_from_pk (pk));
2268       tty_fprintf (fp, "]");
2269     }
2270   else if (pk->expiredate)
2271     {
2272       tty_fprintf (fp, " [");
2273       tty_fprintf (fp, _("expires: %s"), expirestr_from_pk (pk));
2274       tty_fprintf (fp, "]");
2275     }
2276
2277 #if 0
2278   /* I need to think about this some more.  It's easy enough to
2279      include, but it looks sort of confusing in the listing... */
2280   if (opt.list_options & LIST_SHOW_VALIDITY)
2281     {
2282       int validity = get_validity (ctrl, pk, NULL, NULL, 0);
2283       tty_fprintf (fp, " [%s]", trust_value_to_string (validity));
2284     }
2285 #endif
2286
2287   if (pk->pubkey_algo >= 100)
2288     tty_fprintf (fp, " [experimental algorithm %d]", pk->pubkey_algo);
2289
2290   tty_fprintf (fp, "\n");
2291
2292   /* if the user hasn't explicitly asked for human-readable
2293      fingerprints, show compact fpr of primary key: */
2294   if (pk->flags.primary &&
2295       !opt.fingerprint && !opt.with_fingerprint)
2296     print_fingerprint (ctrl, fp, pk, 20);
2297 }
2298
2299
2300 void
2301 set_attrib_fd (int fd)
2302 {
2303   static int last_fd = -1;
2304
2305   if (fd != -1 && last_fd == fd)
2306     return;
2307
2308   /* Fixme: Do we need to check for the log stream here?  */
2309   if (attrib_fp && attrib_fp != log_get_stream ())
2310     es_fclose (attrib_fp);
2311   attrib_fp = NULL;
2312   if (fd == -1)
2313     return;
2314
2315   if (! gnupg_fd_valid (fd))
2316     log_fatal ("attribute-fd is invalid: %s\n", strerror (errno));
2317
2318 #ifdef HAVE_DOSISH_SYSTEM
2319   setmode (fd, O_BINARY);
2320 #endif
2321   if (fd == 1)
2322     attrib_fp = es_stdout;
2323   else if (fd == 2)
2324     attrib_fp = es_stderr;
2325   else
2326     attrib_fp = es_fdopen (fd, "wb");
2327   if (!attrib_fp)
2328     {
2329       log_fatal ("can't open fd %d for attribute output: %s\n",
2330                  fd, strerror (errno));
2331     }
2332
2333   last_fd = fd;
2334 }