chiark / gitweb /
dirmngr: Fix error handling.
[gnupg2.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 "status.h"
35 #include "keydb.h"
36 #include "photoid.h"
37 #include "util.h"
38 #include "ttyio.h"
39 #include "trustdb.h"
40 #include "main.h"
41 #include "i18n.h"
42 #include "status.h"
43 #include "call-agent.h"
44 #include "mbox-util.h"
45 #include "zb32.h"
46 #include "tofu.h"
47
48
49 static void list_all (ctrl_t, int, int);
50 static void list_one (ctrl_t ctrl,
51                       strlist_t names, int secret, int mark_secret);
52 static void locate_one (ctrl_t ctrl, strlist_t names);
53 static void print_card_serialno (const char *serialno);
54
55 struct keylist_context
56 {
57   int check_sigs;  /* If set signatures shall be verified.  */
58   int good_sigs;   /* Counter used if CHECK_SIGS is set.  */
59   int inv_sigs;    /* Counter used if CHECK_SIGS is set.  */
60   int no_key;      /* Counter used if CHECK_SIGS is set.  */
61   int oth_err;     /* Counter used if CHECK_SIGS is set.  */
62   int no_validity; /* Do not show validity.  */
63 };
64
65
66 static void list_keyblock (ctrl_t ctrl,
67                            kbnode_t keyblock, int secret, int has_secret,
68                            int fpr, struct keylist_context *listctx);
69
70
71 /* The stream used to write attribute packets to.  */
72 static estream_t attrib_fp;
73
74
75 /* Release resources from a keylist context.  */
76 static void
77 keylist_context_release (struct keylist_context *listctx)
78 {
79   (void)listctx; /* Nothing to release.  */
80 }
81
82
83 /* List the keys.  If list is NULL, all available keys are listed.
84    With LOCATE_MODE set the locate algorithm is used to find a
85    key.  */
86 void
87 public_key_list (ctrl_t ctrl, strlist_t list, int locate_mode)
88 {
89 #ifndef NO_TRUST_MODELS
90   if (opt.with_colons)
91     {
92       byte trust_model, marginals, completes, cert_depth, min_cert_level;
93       ulong created, nextcheck;
94
95       read_trust_options (&trust_model, &created, &nextcheck,
96                           &marginals, &completes, &cert_depth, &min_cert_level);
97
98       es_fprintf (es_stdout, "tru:");
99
100       if (nextcheck && nextcheck <= make_timestamp ())
101         es_fprintf (es_stdout, "o");
102       if (trust_model != opt.trust_model)
103         es_fprintf (es_stdout, "t");
104       if (opt.trust_model == TM_PGP || opt.trust_model == TM_CLASSIC
105           || opt.trust_model == TM_TOFU_PGP)
106         {
107           if (marginals != opt.marginals_needed)
108             es_fprintf (es_stdout, "m");
109           if (completes != opt.completes_needed)
110             es_fprintf (es_stdout, "c");
111           if (cert_depth != opt.max_cert_depth)
112             es_fprintf (es_stdout, "d");
113           if (min_cert_level != opt.min_cert_level)
114             es_fprintf (es_stdout, "l");
115         }
116
117       es_fprintf (es_stdout, ":%d:%lu:%lu", trust_model, created, nextcheck);
118
119       /* Only show marginals, completes, and cert_depth in the classic
120          or PGP trust models since they are not meaningful
121          otherwise. */
122
123       if (trust_model == TM_PGP || trust_model == TM_CLASSIC)
124         es_fprintf (es_stdout, ":%d:%d:%d", marginals, completes, cert_depth);
125       es_fprintf (es_stdout, "\n");
126     }
127 #endif /*!NO_TRUST_MODELS*/
128
129   /* We need to do the stale check right here because it might need to
130      update the keyring while we already have the keyring open.  This
131      is very bad for W32 because of a sharing violation. For real OSes
132      it might lead to false results if we are later listing a keyring
133      which is associated with the inode of a deleted file.  */
134   check_trustdb_stale (ctrl);
135
136 #ifdef USE_TOFU
137   tofu_begin_batch_update (ctrl);
138 #endif
139
140   if (locate_mode)
141     locate_one (ctrl, list);
142   else if (!list)
143     list_all (ctrl, 0, opt.with_secret);
144   else
145     list_one (ctrl, list, 0, opt.with_secret);
146
147 #ifdef USE_TOFU
148   tofu_end_batch_update (ctrl);
149 #endif
150 }
151
152
153 void
154 secret_key_list (ctrl_t ctrl, strlist_t list)
155 {
156   (void)ctrl;
157
158   check_trustdb_stale (ctrl);
159
160   if (!list)
161     list_all (ctrl, 1, 0);
162   else                          /* List by user id */
163     list_one (ctrl, list, 1, 0);
164 }
165
166 char *
167 format_seckey_info (PKT_public_key *pk)
168 {
169   u32 keyid[2];
170   char *p;
171   char pkstrbuf[PUBKEY_STRING_SIZE];
172   char *info;
173
174   keyid_from_pk (pk, keyid);
175   p = get_user_id_native (keyid);
176
177   info = xtryasprintf ("sec  %s/%s %s %s",
178                        pubkey_string (pk, pkstrbuf, sizeof pkstrbuf),
179                        keystr (keyid), datestr_from_pk (pk), p);
180
181   xfree (p);
182
183   return info;
184 }
185
186 void
187 print_seckey_info (PKT_public_key *pk)
188 {
189   char *p = format_seckey_info (pk);
190   tty_printf ("\n%s\n", p);
191   xfree (p);
192 }
193
194 /* Print information about the public key.  With FP passed as NULL,
195    the tty output interface is used, otherwise output is directted to
196    the given stream.  */
197 void
198 print_pubkey_info (estream_t fp, PKT_public_key *pk)
199 {
200   u32 keyid[2];
201   char *p;
202   char pkstrbuf[PUBKEY_STRING_SIZE];
203
204   keyid_from_pk (pk, keyid);
205
206   /* If the pk was chosen by a particular user ID, that is the one to
207      print.  */
208   if (pk->user_id)
209     p = utf8_to_native (pk->user_id->name, pk->user_id->len, 0);
210   else
211     p = get_user_id_native (keyid);
212
213   if (fp)
214     tty_printf ("\n");
215   tty_fprintf (fp, "%s  %s/%s %s %s\n",
216                pk->flags.primary? "pub":"sub",
217                pubkey_string (pk, pkstrbuf, sizeof pkstrbuf),
218                keystr (keyid), datestr_from_pk (pk), p);
219   xfree (p);
220 }
221
222
223 /* Print basic information of a secret key including the card serial
224    number information.  */
225 #ifdef ENABLE_CARD_SUPPORT
226 void
227 print_card_key_info (estream_t fp, kbnode_t keyblock)
228 {
229   kbnode_t node;
230   char *hexgrip;
231   char *serialno;
232   int s2k_char;
233   char pkstrbuf[PUBKEY_STRING_SIZE];
234   int indent;
235
236   for (node = keyblock; node; node = node->next)
237     {
238       if (node->pkt->pkttype == PKT_PUBLIC_KEY
239           || node->pkt->pkttype == PKT_PUBLIC_SUBKEY)
240         {
241           int rc;
242           PKT_public_key *pk = node->pkt->pkt.public_key;
243
244           serialno = NULL;
245           rc = hexkeygrip_from_pk (pk, &hexgrip);
246           if (rc)
247             {
248               log_error ("error computing a keygrip: %s\n", gpg_strerror (rc));
249               s2k_char = '?';
250             }
251           else if (!agent_get_keyinfo (NULL, hexgrip, &serialno, NULL))
252             s2k_char = serialno? '>':' ';
253           else
254             s2k_char = '#';  /* Key not found.  */
255
256           tty_fprintf (fp, "%s%c  %s/%s  %n",
257                        node->pkt->pkttype == PKT_PUBLIC_KEY ? "sec" : "ssb",
258                        s2k_char,
259                        pubkey_string (pk, pkstrbuf, sizeof pkstrbuf),
260                        keystr_from_pk (pk),
261                        &indent);
262           tty_fprintf (fp, _("created: %s"), datestr_from_pk (pk));
263           tty_fprintf (fp, "  ");
264           tty_fprintf (fp, _("expires: %s"), expirestr_from_pk (pk));
265           if (serialno)
266             {
267               tty_fprintf (fp, "\n%*s%s", indent, "", _("card-no: "));
268               if (strlen (serialno) == 32
269                   && !strncmp (serialno, "D27600012401", 12))
270                 {
271                   /* This is an OpenPGP card.  Print the relevant part.  */
272                   /* Example: D2760001240101010001000003470000 */
273                   /*                          xxxxyyyyyyyy     */
274                   tty_fprintf (fp, "%.*s %.*s", 4, serialno+16, 8, serialno+20);
275                 }
276               else
277                 tty_fprintf (fp, "%s", serialno);
278             }
279           tty_fprintf (fp, "\n");
280           xfree (hexgrip);
281           xfree (serialno);
282         }
283     }
284 }
285 #endif /*ENABLE_CARD_SUPPORT*/
286
287
288 /* Flags = 0x01 hashed 0x02 critical.  */
289 static void
290 status_one_subpacket (sigsubpkttype_t type, size_t len, int flags,
291                       const byte * buf)
292 {
293   char status[40];
294
295   /* Don't print these. */
296   if (len > 256)
297     return;
298
299   snprintf (status, sizeof status,
300             "%d %u %u ", type, flags, (unsigned int) len);
301
302   write_status_text_and_buffer (STATUS_SIG_SUBPACKET, status, buf, len, 0);
303 }
304
305
306 /* Print a policy URL.  Allowed values for MODE are:
307  *  -1 - print to the TTY
308  *   0 - print to stdout.
309  *   1 - use log_info and emit status messages.
310  *   2 - emit only status messages.
311  */
312 void
313 show_policy_url (PKT_signature * sig, int indent, int mode)
314 {
315   const byte *p;
316   size_t len;
317   int seq = 0, crit;
318   estream_t fp = mode < 0? NULL : mode ? log_get_stream () : es_stdout;
319
320   while ((p =
321           enum_sig_subpkt (sig->hashed, SIGSUBPKT_POLICY, &len, &seq, &crit)))
322     {
323       if (mode != 2)
324         {
325           const char *str;
326
327           tty_fprintf (fp, "%*s", indent, "");
328
329           if (crit)
330             str = _("Critical signature policy: ");
331           else
332             str = _("Signature policy: ");
333           if (mode > 0)
334             log_info ("%s", str);
335           else
336             tty_fprintf (fp, "%s", str);
337           tty_print_utf8_string2 (fp, p, len, 0);
338           tty_fprintf (fp, "\n");
339         }
340
341       if (mode > 0)
342         write_status_buffer (STATUS_POLICY_URL, p, len, 0);
343     }
344 }
345
346
347 /* Print a keyserver URL.  Allowed values for MODE are:
348  *  -1 - print to the TTY
349  *   0 - print to stdout.
350  *   1 - use log_info and emit status messages.
351  *   2 - emit only status messages.
352  */
353 void
354 show_keyserver_url (PKT_signature * sig, int indent, int mode)
355 {
356   const byte *p;
357   size_t len;
358   int seq = 0, crit;
359   estream_t fp = mode < 0? NULL : mode ? log_get_stream () : es_stdout;
360
361   while ((p =
362           enum_sig_subpkt (sig->hashed, SIGSUBPKT_PREF_KS, &len, &seq,
363                            &crit)))
364     {
365       if (mode != 2)
366         {
367           const char *str;
368
369           tty_fprintf (fp, "%*s", indent, "");
370
371           if (crit)
372             str = _("Critical preferred keyserver: ");
373           else
374             str = _("Preferred keyserver: ");
375           if (mode > 0)
376             log_info ("%s", str);
377           else
378             tty_fprintf (es_stdout, "%s", str);
379           tty_print_utf8_string2 (fp, p, len, 0);
380           tty_fprintf (fp, "\n");
381         }
382
383       if (mode > 0)
384         status_one_subpacket (SIGSUBPKT_PREF_KS, len,
385                               (crit ? 0x02 : 0) | 0x01, p);
386     }
387 }
388
389
390 /* Print notation data.  Allowed values for MODE are:
391  *  -1 - print to the TTY
392  *   0 - print to stdout.
393  *   1 - use log_info and emit status messages.
394  *   2 - emit only status messages.
395  *
396  * Defined bits in WHICH:
397  *   1 - standard notations
398  *   2 - user notations
399  */
400 void
401 show_notation (PKT_signature * sig, int indent, int mode, int which)
402 {
403   estream_t fp = mode < 0? NULL : mode ? log_get_stream () : es_stdout;
404   notation_t nd, notations;
405
406   if (which == 0)
407     which = 3;
408
409   notations = sig_to_notation (sig);
410
411   /* There may be multiple notations in the same sig. */
412   for (nd = notations; nd; nd = nd->next)
413     {
414       if (mode != 2)
415         {
416           int has_at = !!strchr (nd->name, '@');
417
418           if ((which & 1 && !has_at) || (which & 2 && has_at))
419             {
420               const char *str;
421
422               tty_fprintf (fp, "%*s", indent, "");
423
424               if (nd->flags.critical)
425                 str = _("Critical signature notation: ");
426               else
427                 str = _("Signature notation: ");
428               if (mode > 0)
429                 log_info ("%s", str);
430               else
431                 tty_fprintf (es_stdout, "%s", str);
432               /* This is all UTF8 */
433               tty_print_utf8_string2 (fp, nd->name, strlen (nd->name), 0);
434               tty_fprintf (fp, "=");
435               tty_print_utf8_string2 (fp, nd->value, strlen (nd->value), 0);
436               /* (We need to use log_printf so that the next call to a
437                   log function does not insert an extra LF.)  */
438               if (mode > 0)
439                 log_printf ("\n");
440               else
441                 tty_fprintf (fp, "\n");
442             }
443         }
444
445       if (mode > 0)
446         {
447           write_status_buffer (STATUS_NOTATION_NAME,
448                                nd->name, strlen (nd->name), 0);
449           if (nd->flags.critical || nd->flags.human)
450             write_status_text (STATUS_NOTATION_FLAGS,
451                                nd->flags.critical && nd->flags.human? "1 1" :
452                                nd->flags.critical? "1 0" : "0 1");
453           write_status_buffer (STATUS_NOTATION_DATA,
454                                nd->value, strlen (nd->value), 50);
455         }
456     }
457
458   free_notation (notations);
459 }
460
461
462 static void
463 print_signature_stats (struct keylist_context *s)
464 {
465   if (!s->check_sigs)
466     return;  /* Signature checking was not requested.  */
467
468   /* Better flush stdout so that the stats are always printed after
469    * the output.  */
470   es_fflush (es_stdout);
471
472   if (s->good_sigs)
473     log_info (ngettext("%d good signature\n",
474                        "%d good signatures\n", s->good_sigs), s->good_sigs);
475
476   if (s->inv_sigs)
477     log_info (ngettext("%d bad signature\n",
478                        "%d bad signatures\n", s->inv_sigs), s->inv_sigs);
479
480   if (s->no_key)
481     log_info (ngettext("%d signature not checked due to a missing key\n",
482                        "%d signatures not checked due to missing keys\n",
483                        s->no_key), s->no_key);
484
485   if (s->oth_err)
486     log_info (ngettext("%d signature not checked due to an error\n",
487                        "%d signatures not checked due to errors\n",
488                        s->oth_err), s->oth_err);
489 }
490
491
492 /* List all keys.  If SECRET is true only secret keys are listed.  If
493    MARK_SECRET is true secret keys are indicated in a public key
494    listing.  */
495 static void
496 list_all (ctrl_t ctrl, int secret, int mark_secret)
497 {
498   KEYDB_HANDLE hd;
499   KBNODE keyblock = NULL;
500   int rc = 0;
501   int any_secret;
502   const char *lastresname, *resname;
503   struct keylist_context listctx;
504
505   memset (&listctx, 0, sizeof (listctx));
506   if (opt.check_sigs)
507     listctx.check_sigs = 1;
508
509   hd = keydb_new ();
510   if (!hd)
511     rc = gpg_error_from_syserror ();
512   else
513     rc = keydb_search_first (hd);
514   if (rc)
515     {
516       if (gpg_err_code (rc) != GPG_ERR_NOT_FOUND)
517         log_error ("keydb_search_first failed: %s\n", gpg_strerror (rc));
518       goto leave;
519     }
520
521   lastresname = NULL;
522   do
523     {
524       rc = keydb_get_keyblock (hd, &keyblock);
525       if (rc)
526         {
527           if (gpg_err_code (rc) == GPG_ERR_LEGACY_KEY)
528             continue;  /* Skip legacy keys.  */
529           log_error ("keydb_get_keyblock failed: %s\n", gpg_strerror (rc));
530           goto leave;
531         }
532
533       if (secret || mark_secret)
534         any_secret = !agent_probe_any_secret_key (NULL, keyblock);
535       else
536         any_secret = 0;
537
538       if (secret && !any_secret)
539         ; /* Secret key listing requested but this isn't one.  */
540       else
541         {
542           if (!opt.with_colons)
543             {
544               resname = keydb_get_resource_name (hd);
545               if (lastresname != resname)
546                 {
547                   int i;
548
549                   es_fprintf (es_stdout, "%s\n", resname);
550                   for (i = strlen (resname); i; i--)
551                     es_putc ('-', es_stdout);
552                   es_putc ('\n', es_stdout);
553                   lastresname = resname;
554                 }
555             }
556           merge_keys_and_selfsig (keyblock);
557           list_keyblock (ctrl, keyblock, secret, any_secret, opt.fingerprint,
558                          &listctx);
559         }
560       release_kbnode (keyblock);
561       keyblock = NULL;
562     }
563   while (!(rc = keydb_search_next (hd)));
564   es_fflush (es_stdout);
565   if (rc && gpg_err_code (rc) != GPG_ERR_NOT_FOUND)
566     log_error ("keydb_search_next failed: %s\n", gpg_strerror (rc));
567   if (keydb_get_skipped_counter (hd))
568     log_info (ngettext("Warning: %lu key skipped due to its large size\n",
569                        "Warning: %lu keys skipped due to their large sizes\n",
570                        keydb_get_skipped_counter (hd)),
571               keydb_get_skipped_counter (hd));
572
573   if (opt.check_sigs && !opt.with_colons)
574     print_signature_stats (&listctx);
575
576  leave:
577   keylist_context_release (&listctx);
578   release_kbnode (keyblock);
579   keydb_release (hd);
580 }
581
582
583 static void
584 list_one (ctrl_t ctrl, strlist_t names, int secret, int mark_secret)
585 {
586   int rc = 0;
587   KBNODE keyblock = NULL;
588   GETKEY_CTX ctx;
589   const char *resname;
590   const char *keyring_str = _("Keyring");
591   int i;
592   struct keylist_context listctx;
593
594   memset (&listctx, 0, sizeof (listctx));
595   if (!secret && opt.check_sigs)
596     listctx.check_sigs = 1;
597
598   /* fixme: using the bynames function has the disadvantage that we
599    * don't know wether one of the names given was not found.  OTOH,
600    * this function has the advantage to list the names in the
601    * sequence as defined by the keyDB and does not duplicate
602    * outputs.  A solution could be do test whether all given have
603    * been listed (this needs a way to use the keyDB search
604    * functions) or to have the search function return indicators for
605    * found names.  Yet another way is to use the keydb search
606    * facilities directly. */
607   rc = getkey_bynames (&ctx, NULL, names, secret, &keyblock);
608   if (rc)
609     {
610       log_error ("error reading key: %s\n", gpg_strerror (rc));
611       getkey_end (ctx);
612       return;
613     }
614
615   do
616     {
617       if ((opt.list_options & LIST_SHOW_KEYRING) && !opt.with_colons)
618         {
619           resname = keydb_get_resource_name (get_ctx_handle (ctx));
620           es_fprintf (es_stdout, "%s: %s\n", keyring_str, resname);
621           for (i = strlen (resname) + strlen (keyring_str) + 2; i; i--)
622             es_putc ('-', es_stdout);
623           es_putc ('\n', es_stdout);
624         }
625       list_keyblock (ctrl,
626                      keyblock, secret, mark_secret, opt.fingerprint, &listctx);
627       release_kbnode (keyblock);
628     }
629   while (!getkey_next (ctx, NULL, &keyblock));
630   getkey_end (ctx);
631
632   if (opt.check_sigs && !opt.with_colons)
633     print_signature_stats (&listctx);
634
635   keylist_context_release (&listctx);
636 }
637
638
639 static void
640 locate_one (ctrl_t ctrl, strlist_t names)
641 {
642   int rc = 0;
643   strlist_t sl;
644   GETKEY_CTX ctx = NULL;
645   KBNODE keyblock = NULL;
646   struct keylist_context listctx;
647
648   memset (&listctx, 0, sizeof (listctx));
649   if (opt.check_sigs)
650     listctx.check_sigs = 1;
651
652   for (sl = names; sl; sl = sl->next)
653     {
654       rc = get_best_pubkey_byname (ctrl, &ctx, NULL, sl->d, &keyblock, 1, 0);
655       if (rc)
656         {
657           if (gpg_err_code (rc) != GPG_ERR_NO_PUBKEY)
658             log_error ("error reading key: %s\n", gpg_strerror (rc));
659           else if (opt.verbose)
660             log_info (_("key \"%s\" not found: %s\n"),
661                       sl->d, gpg_strerror (rc));
662         }
663       else
664         {
665           do
666             {
667               list_keyblock (ctrl, keyblock, 0, 0, opt.fingerprint, &listctx);
668               release_kbnode (keyblock);
669             }
670           while (ctx && !getkey_next (ctx, NULL, &keyblock));
671           getkey_end (ctx);
672           ctx = NULL;
673         }
674     }
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 print_key_data (PKT_public_key * pk)
685 {
686   int n = pk ? pubkey_get_npkey (pk->pubkey_algo) : 0;
687   int i;
688
689   for (i = 0; i < n; i++)
690     {
691       es_fprintf (es_stdout, "pkd:%d:%u:", i, mpi_get_nbits (pk->pkey[i]));
692       mpi_print (es_stdout, pk->pkey[i], 1);
693       es_putc (':', es_stdout);
694       es_putc ('\n', es_stdout);
695     }
696 }
697
698 static void
699 print_capabilities (PKT_public_key *pk, KBNODE keyblock)
700 {
701   unsigned int use = pk->pubkey_usage;
702   int c_printed = 0;
703
704   if (use & PUBKEY_USAGE_ENC)
705     es_putc ('e', es_stdout);
706
707   if (use & PUBKEY_USAGE_SIG)
708     {
709       es_putc ('s', es_stdout);
710       if (pk->flags.primary)
711         {
712           es_putc ('c', es_stdout);
713           /* The PUBKEY_USAGE_CERT flag was introduced later and we
714              used to always print 'c' for a primary key.  To avoid any
715              regression here we better track whether we printed 'c'
716              already.  */
717           c_printed = 1;
718         }
719     }
720
721   if ((use & PUBKEY_USAGE_CERT) && !c_printed)
722     es_putc ('c', es_stdout);
723
724   if ((use & PUBKEY_USAGE_AUTH))
725     es_putc ('a', es_stdout);
726
727   if ((use & PUBKEY_USAGE_UNKNOWN))
728     es_putc ('?', es_stdout);
729
730   if (keyblock)
731     {
732       /* Figure out the usable capabilities.  */
733       KBNODE k;
734       int enc = 0, sign = 0, cert = 0, auth = 0, disabled = 0;
735
736       for (k = keyblock; k; k = k->next)
737         {
738           if (k->pkt->pkttype == PKT_PUBLIC_KEY
739               || k->pkt->pkttype == PKT_PUBLIC_SUBKEY)
740             {
741               pk = k->pkt->pkt.public_key;
742
743               if (pk->flags.primary)
744                 disabled = pk_is_disabled (pk);
745
746               if (pk->flags.valid && !pk->flags.revoked && !pk->has_expired)
747                 {
748                   if (pk->pubkey_usage & PUBKEY_USAGE_ENC)
749                     enc = 1;
750                   if (pk->pubkey_usage & PUBKEY_USAGE_SIG)
751                     {
752                       sign = 1;
753                       if (pk->flags.primary)
754                         cert = 1;
755                     }
756                   if (pk->pubkey_usage & PUBKEY_USAGE_CERT)
757                     cert = 1;
758                   if ((pk->pubkey_usage & PUBKEY_USAGE_AUTH))
759                     auth = 1;
760                 }
761             }
762         }
763       if (enc)
764         es_putc ('E', es_stdout);
765       if (sign)
766         es_putc ('S', es_stdout);
767       if (cert)
768         es_putc ('C', es_stdout);
769       if (auth)
770         es_putc ('A', es_stdout);
771       if (disabled)
772         es_putc ('D', es_stdout);
773     }
774
775   es_putc (':', es_stdout);
776 }
777
778
779 /* FLAGS: 0x01 hashed
780           0x02 critical  */
781 static void
782 print_one_subpacket (sigsubpkttype_t type, size_t len, int flags,
783                      const byte * buf)
784 {
785   size_t i;
786
787   es_fprintf (es_stdout, "spk:%d:%u:%u:", type, flags, (unsigned int) len);
788
789   for (i = 0; i < len; i++)
790     {
791       /* printable ascii other than : and % */
792       if (buf[i] >= 32 && buf[i] <= 126 && buf[i] != ':' && buf[i] != '%')
793         es_fprintf (es_stdout, "%c", buf[i]);
794       else
795         es_fprintf (es_stdout, "%%%02X", buf[i]);
796     }
797
798   es_fprintf (es_stdout, "\n");
799 }
800
801
802 void
803 print_subpackets_colon (PKT_signature * sig)
804 {
805   byte *i;
806
807   log_assert (opt.show_subpackets);
808
809   for (i = opt.show_subpackets; *i; i++)
810     {
811       const byte *p;
812       size_t len;
813       int seq, crit;
814
815       seq = 0;
816
817       while ((p = enum_sig_subpkt (sig->hashed, *i, &len, &seq, &crit)))
818         print_one_subpacket (*i, len, 0x01 | (crit ? 0x02 : 0), p);
819
820       seq = 0;
821
822       while ((p = enum_sig_subpkt (sig->unhashed, *i, &len, &seq, &crit)))
823         print_one_subpacket (*i, len, 0x00 | (crit ? 0x02 : 0), p);
824     }
825 }
826
827
828 void
829 dump_attribs (const PKT_user_id *uid, PKT_public_key *pk)
830 {
831   int i;
832
833   if (!attrib_fp)
834     return;
835
836   for (i = 0; i < uid->numattribs; i++)
837     {
838       if (is_status_enabled ())
839         {
840           byte array[MAX_FINGERPRINT_LEN], *p;
841           char buf[(MAX_FINGERPRINT_LEN * 2) + 90];
842           size_t j, n;
843
844           if (!pk)
845             BUG ();
846           fingerprint_from_pk (pk, array, &n);
847
848           p = array;
849           for (j = 0; j < n; j++, p++)
850             sprintf (buf + 2 * j, "%02X", *p);
851
852           sprintf (buf + strlen (buf), " %lu %u %u %u %lu %lu %u",
853                    (ulong) uid->attribs[i].len, uid->attribs[i].type, i + 1,
854                    uid->numattribs, (ulong) uid->created,
855                    (ulong) uid->expiredate,
856                    ((uid->is_primary ? 0x01 : 0) | (uid->
857                                                     is_revoked ? 0x02 : 0) |
858                     (uid->is_expired ? 0x04 : 0)));
859           write_status_text (STATUS_ATTRIBUTE, buf);
860         }
861
862       es_fwrite (uid->attribs[i].data, uid->attribs[i].len, 1, attrib_fp);
863       es_fflush (attrib_fp);
864     }
865 }
866
867
868 static void
869 list_keyblock_print (ctrl_t ctrl, kbnode_t keyblock, int secret, int fpr,
870                      struct keylist_context *listctx)
871 {
872   int rc;
873   KBNODE kbctx;
874   KBNODE node;
875   PKT_public_key *pk;
876   int skip_sigs = 0;
877   char *hexgrip = NULL;
878   char *serialno = NULL;
879
880   /* Get the keyid from the keyblock.  */
881   node = find_kbnode (keyblock, PKT_PUBLIC_KEY);
882   if (!node)
883     {
884       log_error ("Oops; key lost!\n");
885       dump_kbnode (keyblock);
886       return;
887     }
888
889   pk = node->pkt->pkt.public_key;
890
891   if (secret || opt.with_keygrip)
892     {
893       rc = hexkeygrip_from_pk (pk, &hexgrip);
894       if (rc)
895         log_error ("error computing a keygrip: %s\n", gpg_strerror (rc));
896     }
897
898   if (secret)
899     {
900       /* Encode some info about the secret key in SECRET.  */
901       if (!agent_get_keyinfo (NULL, hexgrip, &serialno, NULL))
902         secret = serialno? 3 : 1;
903       else
904         secret = 2;  /* Key not found.  */
905     }
906
907   if (!listctx->no_validity)
908     check_trustdb_stale (ctrl);
909
910   /* Print the "pub" line and in KF_NONE mode the fingerprint.  */
911   print_key_line (es_stdout, pk, secret);
912
913   if (fpr)
914     print_fingerprint (NULL, pk, 0);
915
916   if (opt.with_keygrip && hexgrip)
917     es_fprintf (es_stdout, "      Keygrip = %s\n", hexgrip);
918
919   if (serialno)
920     print_card_serialno (serialno);
921
922   if (opt.with_key_data)
923     print_key_data (pk);
924
925   for (kbctx = NULL; (node = walk_kbnode (keyblock, &kbctx, 0));)
926     {
927       if (node->pkt->pkttype == PKT_USER_ID)
928         {
929           PKT_user_id *uid = node->pkt->pkt.user_id;
930           int indent;
931           int kl = opt.keyid_format == KF_NONE? 10 : keystrlen ();
932
933           if ((uid->is_expired || uid->is_revoked)
934               && !(opt.list_options & LIST_SHOW_UNUSABLE_UIDS))
935             {
936               skip_sigs = 1;
937               continue;
938             }
939           else
940             skip_sigs = 0;
941
942           if (attrib_fp && uid->attrib_data != NULL)
943             dump_attribs (uid, pk);
944
945           if ((uid->is_revoked || uid->is_expired)
946               || ((opt.list_options & LIST_SHOW_UID_VALIDITY)
947                   && !listctx->no_validity))
948             {
949               const char *validity;
950
951               validity = uid_trust_string_fixed (ctrl, pk, uid);
952               indent = ((kl + (opt.legacy_list_mode? 9:11))
953                         - atoi (uid_trust_string_fixed (ctrl, NULL, NULL)));
954               if (indent < 0 || indent > 40)
955                 indent = 0;
956
957               es_fprintf (es_stdout, "uid%*s%s ", indent, "", validity);
958             }
959           else
960             {
961               indent = kl + (opt.legacy_list_mode? 10:12);
962               es_fprintf (es_stdout, "uid%*s", indent, "");
963             }
964
965           print_utf8_buffer (es_stdout, uid->name, uid->len);
966           es_putc ('\n', es_stdout);
967
968           if (opt.with_wkd_hash)
969             {
970               char *mbox, *hash, *p;
971               char hashbuf[32];
972
973               mbox = mailbox_from_userid (uid->name);
974               if (mbox && (p = strchr (mbox, '@')))
975                 {
976                   *p++ = 0;
977                   gcry_md_hash_buffer (GCRY_MD_SHA1, hashbuf,
978                                        mbox, strlen (mbox));
979                   hash = zb32_encode (hashbuf, 8*20);
980                   if (hash)
981                     {
982                       es_fprintf (es_stdout, "   %*s%s@%s\n",
983                                   indent, "", hash, p);
984                       xfree (hash);
985                     }
986                 }
987               xfree (mbox);
988             }
989
990           if ((opt.list_options & LIST_SHOW_PHOTOS) && uid->attribs != NULL)
991             show_photos (ctrl, uid->attribs, uid->numattribs, pk, uid);
992         }
993       else if (node->pkt->pkttype == PKT_PUBLIC_SUBKEY)
994         {
995           PKT_public_key *pk2 = node->pkt->pkt.public_key;
996
997           if ((pk2->flags.revoked || pk2->has_expired)
998               && !(opt.list_options & LIST_SHOW_UNUSABLE_SUBKEYS))
999             {
1000               skip_sigs = 1;
1001               continue;
1002             }
1003           else
1004             skip_sigs = 0;
1005
1006           xfree (serialno); serialno = NULL;
1007           xfree (hexgrip); hexgrip = NULL;
1008           if (secret || opt.with_keygrip)
1009             {
1010               rc = hexkeygrip_from_pk (pk2, &hexgrip);
1011               if (rc)
1012                 log_error ("error computing a keygrip: %s\n",
1013                            gpg_strerror (rc));
1014             }
1015           if (secret)
1016             {
1017               if (!agent_get_keyinfo (NULL, hexgrip, &serialno, NULL))
1018                 secret = serialno? 3 : 1;
1019               else
1020                 secret = '2';  /* Key not found.  */
1021             }
1022
1023           /* Print the "sub" line.  */
1024           print_key_line (es_stdout, pk2, secret);
1025           if (fpr > 1 || opt.with_subkey_fingerprint)
1026             {
1027               print_fingerprint (NULL, pk2, 0);
1028               if (serialno)
1029                 print_card_serialno (serialno);
1030             }
1031           if (opt.with_keygrip && hexgrip)
1032             es_fprintf (es_stdout, "      Keygrip = %s\n", hexgrip);
1033           if (opt.with_key_data)
1034             print_key_data (pk2);
1035         }
1036       else if (opt.list_sigs
1037                && node->pkt->pkttype == PKT_SIGNATURE && !skip_sigs)
1038         {
1039           PKT_signature *sig = node->pkt->pkt.signature;
1040           int sigrc;
1041           char *sigstr;
1042
1043           if (listctx->check_sigs)
1044             {
1045               rc = check_key_signature (keyblock, node, NULL);
1046               switch (gpg_err_code (rc))
1047                 {
1048                 case 0:
1049                   listctx->good_sigs++;
1050                   sigrc = '!';
1051                   break;
1052                 case GPG_ERR_BAD_SIGNATURE:
1053                   listctx->inv_sigs++;
1054                   sigrc = '-';
1055                   break;
1056                 case GPG_ERR_NO_PUBKEY:
1057                 case GPG_ERR_UNUSABLE_PUBKEY:
1058                   listctx->no_key++;
1059                   continue;
1060                 default:
1061                   listctx->oth_err++;
1062                   sigrc = '%';
1063                   break;
1064                 }
1065
1066               /* TODO: Make sure a cached sig record here still has
1067                  the pk that issued it.  See also
1068                  keyedit.c:print_and_check_one_sig */
1069             }
1070           else
1071             {
1072               rc = 0;
1073               sigrc = ' ';
1074             }
1075
1076           if (sig->sig_class == 0x20 || sig->sig_class == 0x28
1077               || sig->sig_class == 0x30)
1078             sigstr = "rev";
1079           else if ((sig->sig_class & ~3) == 0x10)
1080             sigstr = "sig";
1081           else if (sig->sig_class == 0x18)
1082             sigstr = "sig";
1083           else if (sig->sig_class == 0x1F)
1084             sigstr = "sig";
1085           else
1086             {
1087               es_fprintf (es_stdout, "sig                             "
1088                       "[unexpected signature class 0x%02x]\n",
1089                       sig->sig_class);
1090               continue;
1091             }
1092
1093           es_fputs (sigstr, es_stdout);
1094           es_fprintf (es_stdout, "%c%c %c%c%c%c%c%c %s %s",
1095                   sigrc, (sig->sig_class - 0x10 > 0 &&
1096                           sig->sig_class - 0x10 <
1097                           4) ? '0' + sig->sig_class - 0x10 : ' ',
1098                   sig->flags.exportable ? ' ' : 'L',
1099                   sig->flags.revocable ? ' ' : 'R',
1100                   sig->flags.policy_url ? 'P' : ' ',
1101                   sig->flags.notation ? 'N' : ' ',
1102                   sig->flags.expired ? 'X' : ' ',
1103                   (sig->trust_depth > 9) ? 'T' : (sig->trust_depth >
1104                                                   0) ? '0' +
1105                   sig->trust_depth : ' ', keystr (sig->keyid),
1106                   datestr_from_sig (sig));
1107           if (opt.list_options & LIST_SHOW_SIG_EXPIRE)
1108             es_fprintf (es_stdout, " %s", expirestr_from_sig (sig));
1109           es_fprintf (es_stdout, "  ");
1110           if (sigrc == '%')
1111             es_fprintf (es_stdout, "[%s] ", gpg_strerror (rc));
1112           else if (sigrc == '?')
1113             ;
1114           else if (!opt.fast_list_mode)
1115             {
1116               size_t n;
1117               char *p = get_user_id (sig->keyid, &n);
1118               print_utf8_buffer (es_stdout, p, n);
1119               xfree (p);
1120             }
1121           es_putc ('\n', es_stdout);
1122
1123           if (sig->flags.policy_url
1124               && (opt.list_options & LIST_SHOW_POLICY_URLS))
1125             show_policy_url (sig, 3, 0);
1126
1127           if (sig->flags.notation && (opt.list_options & LIST_SHOW_NOTATIONS))
1128             show_notation (sig, 3, 0,
1129                            ((opt.
1130                              list_options & LIST_SHOW_STD_NOTATIONS) ? 1 : 0)
1131                            +
1132                            ((opt.
1133                              list_options & LIST_SHOW_USER_NOTATIONS) ? 2 :
1134                             0));
1135
1136           if (sig->flags.pref_ks
1137               && (opt.list_options & LIST_SHOW_KEYSERVER_URLS))
1138             show_keyserver_url (sig, 3, 0);
1139
1140           /* fixme: check or list other sigs here */
1141         }
1142     }
1143   es_putc ('\n', es_stdout);
1144   xfree (serialno);
1145   xfree (hexgrip);
1146 }
1147
1148 void
1149 print_revokers (estream_t fp, PKT_public_key * pk)
1150 {
1151   /* print the revoker record */
1152   if (!pk->revkey && pk->numrevkeys)
1153     BUG ();
1154   else
1155     {
1156       int i, j;
1157
1158       for (i = 0; i < pk->numrevkeys; i++)
1159         {
1160           byte *p;
1161
1162           es_fprintf (fp, "rvk:::%d::::::", pk->revkey[i].algid);
1163           p = pk->revkey[i].fpr;
1164           for (j = 0; j < 20; j++, p++)
1165             es_fprintf (fp, "%02X", *p);
1166           es_fprintf (fp, ":%02x%s:\n",
1167                       pk->revkey[i].class,
1168                       (pk->revkey[i].class & 0x40) ? "s" : "");
1169         }
1170     }
1171 }
1172
1173
1174 /* List a key in colon mode.  If SECRET is true this is a secret key
1175    record (i.e. requested via --list-secret-key).  If HAS_SECRET a
1176    secret key is available even if SECRET is not set.  */
1177 static void
1178 list_keyblock_colon (ctrl_t ctrl, kbnode_t keyblock,
1179                      int secret, int has_secret)
1180 {
1181   int rc;
1182   KBNODE kbctx;
1183   KBNODE node;
1184   PKT_public_key *pk;
1185   u32 keyid[2];
1186   int trustletter = 0;
1187   int trustletter_print;
1188   int ownertrust_print;
1189   int ulti_hack = 0;
1190   int i;
1191   char *hexgrip_buffer = NULL;
1192   const char *hexgrip = NULL;
1193   char *serialno = NULL;
1194   int stubkey;
1195
1196   /* Get the keyid from the keyblock.  */
1197   node = find_kbnode (keyblock, PKT_PUBLIC_KEY);
1198   if (!node)
1199     {
1200       log_error ("Oops; key lost!\n");
1201       dump_kbnode (keyblock);
1202       return;
1203     }
1204
1205   pk = node->pkt->pkt.public_key;
1206   if (secret || has_secret || opt.with_keygrip || opt.with_key_data)
1207     {
1208       rc = hexkeygrip_from_pk (pk, &hexgrip_buffer);
1209       if (rc)
1210         log_error ("error computing a keygrip: %s\n", gpg_strerror (rc));
1211       /* In the error case we print an empty string so that we have a
1212        * "grp" record for each and subkey - even if it is empty.  This
1213        * may help to prevent sync problems.  */
1214       hexgrip = hexgrip_buffer? hexgrip_buffer : "";
1215     }
1216   stubkey = 0;
1217   if ((secret || has_secret)
1218       && agent_get_keyinfo (NULL, hexgrip, &serialno, NULL))
1219     stubkey = 1;  /* Key not found.  */
1220
1221   keyid_from_pk (pk, keyid);
1222   if (!pk->flags.valid)
1223     trustletter_print = 'i';
1224   else if (pk->flags.revoked)
1225     trustletter_print = 'r';
1226   else if (pk->has_expired)
1227     trustletter_print = 'e';
1228   else if (opt.fast_list_mode || opt.no_expensive_trust_checks)
1229     trustletter_print = 0;
1230   else
1231     {
1232       trustletter = get_validity_info (ctrl, keyblock, pk, NULL);
1233       if (trustletter == 'u')
1234         ulti_hack = 1;
1235       trustletter_print = trustletter;
1236     }
1237
1238   if (!opt.fast_list_mode && !opt.no_expensive_trust_checks)
1239     ownertrust_print = get_ownertrust_info (pk);
1240   else
1241     ownertrust_print = 0;
1242
1243   es_fputs (secret? "sec:":"pub:", es_stdout);
1244   if (trustletter_print)
1245     es_putc (trustletter_print, es_stdout);
1246   es_fprintf (es_stdout, ":%u:%d:%08lX%08lX:%s:%s::",
1247           nbits_from_pk (pk),
1248           pk->pubkey_algo,
1249           (ulong) keyid[0], (ulong) keyid[1],
1250           colon_datestr_from_pk (pk), colon_strtime (pk->expiredate));
1251
1252   if (ownertrust_print)
1253     es_putc (ownertrust_print, es_stdout);
1254   es_putc (':', es_stdout);
1255
1256   es_putc (':', es_stdout);
1257   es_putc (':', es_stdout);
1258   print_capabilities (pk, keyblock);
1259   es_putc (':', es_stdout);             /* End of field 13. */
1260   es_putc (':', es_stdout);             /* End of field 14. */
1261   if (secret || has_secret)
1262     {
1263       if (stubkey)
1264         es_putc ('#', es_stdout);
1265       else if (serialno)
1266         es_fputs (serialno, es_stdout);
1267       else if (has_secret)
1268         es_putc ('+', es_stdout);
1269     }
1270   es_putc (':', es_stdout);             /* End of field 15. */
1271   es_putc (':', es_stdout);             /* End of field 16. */
1272   if (pk->pubkey_algo == PUBKEY_ALGO_ECDSA
1273       || pk->pubkey_algo == PUBKEY_ALGO_EDDSA
1274       || pk->pubkey_algo == PUBKEY_ALGO_ECDH)
1275     {
1276       char *curve = openpgp_oid_to_str (pk->pkey[0]);
1277       const char *name = openpgp_oid_to_curve (curve, 0);
1278       if (!name)
1279         name = curve;
1280       es_fputs (name, es_stdout);
1281       xfree (curve);
1282     }
1283   es_putc (':', es_stdout);             /* End of field 17. */
1284   es_putc (':', es_stdout);             /* End of field 18. */
1285   es_putc ('\n', es_stdout);
1286
1287   print_revokers (es_stdout, pk);
1288   print_fingerprint (NULL, pk, 0);
1289   if (hexgrip)
1290     es_fprintf (es_stdout, "grp:::::::::%s:\n", hexgrip);
1291   if (opt.with_key_data)
1292     print_key_data (pk);
1293
1294   for (kbctx = NULL; (node = walk_kbnode (keyblock, &kbctx, 0));)
1295     {
1296       if (node->pkt->pkttype == PKT_USER_ID)
1297         {
1298           PKT_user_id *uid = node->pkt->pkt.user_id;
1299           int uid_validity;
1300
1301           if (attrib_fp && uid->attrib_data != NULL)
1302             dump_attribs (uid, pk);
1303
1304           if (uid->is_revoked)
1305             uid_validity = 'r';
1306           else if (uid->is_expired)
1307             uid_validity = 'e';
1308           else if (opt.no_expensive_trust_checks)
1309             uid_validity = 0;
1310           else if (ulti_hack)
1311             uid_validity = 'u';
1312           else
1313             uid_validity = get_validity_info (ctrl, keyblock, pk, uid);
1314
1315           es_fputs (uid->attrib_data? "uat:":"uid:", es_stdout);
1316           if (uid_validity)
1317             es_putc (uid_validity, es_stdout);
1318           es_fputs ("::::", es_stdout);
1319
1320           es_fprintf (es_stdout, "%s:", colon_strtime (uid->created));
1321           es_fprintf (es_stdout, "%s:", colon_strtime (uid->expiredate));
1322
1323           namehash_from_uid (uid);
1324
1325           for (i = 0; i < 20; i++)
1326             es_fprintf (es_stdout, "%02X", uid->namehash[i]);
1327
1328           es_fprintf (es_stdout, "::");
1329
1330           if (uid->attrib_data)
1331             es_fprintf (es_stdout, "%u %lu", uid->numattribs, uid->attrib_len);
1332           else
1333             es_write_sanitized (es_stdout, uid->name, uid->len, ":", NULL);
1334           es_putc (':', es_stdout);
1335           es_putc ('\n', es_stdout);
1336 #ifdef USE_TOFU
1337           if (!uid->attrib_data && opt.with_tofu_info
1338               && (opt.trust_model == TM_TOFU || opt.trust_model == TM_TOFU_PGP))
1339             {
1340               /* Print a "tfs" record.  */
1341               tofu_write_tfs_record (ctrl, es_stdout, pk, uid->name);
1342             }
1343 #endif /*USE_TOFU*/
1344         }
1345       else if (node->pkt->pkttype == PKT_PUBLIC_SUBKEY)
1346         {
1347           u32 keyid2[2];
1348           PKT_public_key *pk2;
1349           int need_hexgrip = !!hexgrip;
1350
1351           pk2 = node->pkt->pkt.public_key;
1352           xfree (hexgrip_buffer); hexgrip_buffer = NULL; hexgrip = NULL;
1353           xfree (serialno); serialno = NULL;
1354           if (need_hexgrip
1355               || secret || has_secret || opt.with_keygrip || opt.with_key_data)
1356             {
1357               rc = hexkeygrip_from_pk (pk2, &hexgrip_buffer);
1358               if (rc)
1359                 log_error ("error computing a keygrip: %s\n",
1360                            gpg_strerror (rc));
1361               hexgrip = hexgrip_buffer? hexgrip_buffer : "";
1362             }
1363           stubkey = 0;
1364           if ((secret||has_secret)
1365               && agent_get_keyinfo (NULL, hexgrip, &serialno, NULL))
1366             stubkey = 1;  /* Key not found.  */
1367
1368           keyid_from_pk (pk2, keyid2);
1369           es_fputs (secret? "ssb:":"sub:", es_stdout);
1370           if (!pk2->flags.valid)
1371             es_putc ('i', es_stdout);
1372           else if (pk2->flags.revoked)
1373             es_putc ('r', es_stdout);
1374           else if (pk2->has_expired)
1375             es_putc ('e', es_stdout);
1376           else if (opt.fast_list_mode || opt.no_expensive_trust_checks)
1377             ;
1378           else
1379             {
1380               /* TRUSTLETTER should always be defined here. */
1381               if (trustletter)
1382                 es_fprintf (es_stdout, "%c", trustletter);
1383             }
1384           es_fprintf (es_stdout, ":%u:%d:%08lX%08lX:%s:%s:::::",
1385                   nbits_from_pk (pk2),
1386                   pk2->pubkey_algo,
1387                   (ulong) keyid2[0], (ulong) keyid2[1],
1388                   colon_datestr_from_pk (pk2), colon_strtime (pk2->expiredate)
1389                   /* fixme: add LID and ownertrust here */
1390             );
1391           print_capabilities (pk2, NULL);
1392           es_putc (':', es_stdout);     /* End of field 13. */
1393           es_putc (':', es_stdout);     /* End of field 14. */
1394           if (secret || has_secret)
1395             {
1396               if (stubkey)
1397                 es_putc ('#', es_stdout);
1398               else if (serialno)
1399                 es_fputs (serialno, es_stdout);
1400               else if (has_secret)
1401                 es_putc ('+', es_stdout);
1402             }
1403           es_putc (':', es_stdout);     /* End of field 15. */
1404           es_putc (':', es_stdout);     /* End of field 16. */
1405           if (pk2->pubkey_algo == PUBKEY_ALGO_ECDSA
1406               || pk2->pubkey_algo == PUBKEY_ALGO_EDDSA
1407               || pk2->pubkey_algo == PUBKEY_ALGO_ECDH)
1408             {
1409               char *curve = openpgp_oid_to_str (pk2->pkey[0]);
1410               const char *name = openpgp_oid_to_curve (curve, 0);
1411               if (!name)
1412                 name = curve;
1413               es_fputs (name, es_stdout);
1414               xfree (curve);
1415             }
1416           es_putc (':', es_stdout);     /* End of field 17. */
1417           es_putc ('\n', es_stdout);
1418           print_fingerprint (NULL, pk2, 0);
1419           if (hexgrip)
1420             es_fprintf (es_stdout, "grp:::::::::%s:\n", hexgrip);
1421           if (opt.with_key_data)
1422             print_key_data (pk2);
1423         }
1424       else if (opt.list_sigs && node->pkt->pkttype == PKT_SIGNATURE)
1425         {
1426           PKT_signature *sig = node->pkt->pkt.signature;
1427           int sigrc, fprokay = 0;
1428           char *sigstr;
1429           size_t fplen;
1430           byte fparray[MAX_FINGERPRINT_LEN];
1431           char *siguid;
1432           size_t siguidlen;
1433
1434           if (sig->sig_class == 0x20 || sig->sig_class == 0x28
1435               || sig->sig_class == 0x30)
1436             sigstr = "rev";
1437           else if ((sig->sig_class & ~3) == 0x10)
1438             sigstr = "sig";
1439           else if (sig->sig_class == 0x18)
1440             sigstr = "sig";
1441           else if (sig->sig_class == 0x1F)
1442             sigstr = "sig";
1443           else
1444             {
1445               es_fprintf (es_stdout, "sig::::::::::%02x%c:\n",
1446                       sig->sig_class, sig->flags.exportable ? 'x' : 'l');
1447               continue;
1448             }
1449
1450           if (opt.check_sigs)
1451             {
1452               PKT_public_key *signer_pk = NULL;
1453
1454               es_fflush (es_stdout);
1455               if (opt.no_sig_cache)
1456                 signer_pk = xmalloc_clear (sizeof (PKT_public_key));
1457
1458               rc = check_key_signature2 (keyblock, node, NULL, signer_pk,
1459                                          NULL, NULL, NULL);
1460               switch (gpg_err_code (rc))
1461                 {
1462                 case 0:
1463                   sigrc = '!';
1464                   break;
1465                 case GPG_ERR_BAD_SIGNATURE:
1466                   sigrc = '-';
1467                   break;
1468                 case GPG_ERR_NO_PUBKEY:
1469                 case GPG_ERR_UNUSABLE_PUBKEY:
1470                   sigrc = '?';
1471                   break;
1472                 default:
1473                   sigrc = '%';
1474                   break;
1475                 }
1476
1477               if (opt.no_sig_cache)
1478                 {
1479                   if (!rc)
1480                     {
1481                       fingerprint_from_pk (signer_pk, fparray, &fplen);
1482                       fprokay = 1;
1483                     }
1484                   free_public_key (signer_pk);
1485                 }
1486             }
1487           else
1488             {
1489               rc = 0;
1490               sigrc = ' ';
1491             }
1492
1493           if (sigrc != '%' && sigrc != '?' && !opt.fast_list_mode)
1494             siguid = get_user_id (sig->keyid, &siguidlen);
1495           else
1496             {
1497               siguid = NULL;
1498               siguidlen = 0;
1499             }
1500
1501
1502           es_fputs (sigstr, es_stdout);
1503           es_putc (':', es_stdout);
1504           if (sigrc != ' ')
1505             es_putc (sigrc, es_stdout);
1506           es_fprintf (es_stdout, "::%d:%08lX%08lX:%s:%s:", sig->pubkey_algo,
1507                   (ulong) sig->keyid[0], (ulong) sig->keyid[1],
1508                   colon_datestr_from_sig (sig),
1509                   colon_expirestr_from_sig (sig));
1510
1511           if (sig->trust_depth || sig->trust_value)
1512             es_fprintf (es_stdout, "%d %d", sig->trust_depth, sig->trust_value);
1513           es_fprintf (es_stdout, ":");
1514
1515           if (sig->trust_regexp)
1516             es_write_sanitized (es_stdout, sig->trust_regexp,
1517                                 strlen (sig->trust_regexp), ":", NULL);
1518           es_fprintf (es_stdout, ":");
1519
1520           if (sigrc == '%')
1521             es_fprintf (es_stdout, "[%s] ", gpg_strerror (rc));
1522           else if (siguid)
1523             es_write_sanitized (es_stdout, siguid, siguidlen, ":", NULL);
1524
1525           es_fprintf (es_stdout, ":%02x%c::", sig->sig_class,
1526                       sig->flags.exportable ? 'x' : 'l');
1527
1528           if (opt.no_sig_cache && opt.check_sigs && fprokay)
1529             {
1530               for (i = 0; i < fplen; i++)
1531                 es_fprintf (es_stdout, "%02X", fparray[i]);
1532             }
1533
1534           es_fprintf (es_stdout, ":::%d:\n", sig->digest_algo);
1535
1536           if (opt.show_subpackets)
1537             print_subpackets_colon (sig);
1538
1539           /* fixme: check or list other sigs here */
1540           xfree (siguid);
1541         }
1542     }
1543
1544   xfree (hexgrip_buffer);
1545   xfree (serialno);
1546 }
1547
1548 /*
1549  * Reorder the keyblock so that the primary user ID (and not attribute
1550  * packet) comes first.  Fixme: Replace this by a generic sort
1551  * function.  */
1552 static void
1553 do_reorder_keyblock (KBNODE keyblock, int attr)
1554 {
1555   KBNODE primary = NULL, primary0 = NULL, primary2 = NULL;
1556   KBNODE last, node;
1557
1558   for (node = keyblock; node; primary0 = node, node = node->next)
1559     {
1560       if (node->pkt->pkttype == PKT_USER_ID &&
1561           ((attr && node->pkt->pkt.user_id->attrib_data) ||
1562            (!attr && !node->pkt->pkt.user_id->attrib_data)) &&
1563           node->pkt->pkt.user_id->is_primary)
1564         {
1565           primary = primary2 = node;
1566           for (node = node->next; node; primary2 = node, node = node->next)
1567             {
1568               if (node->pkt->pkttype == PKT_USER_ID
1569                   || node->pkt->pkttype == PKT_PUBLIC_SUBKEY
1570                   || node->pkt->pkttype == PKT_SECRET_SUBKEY)
1571                 {
1572                   break;
1573                 }
1574             }
1575           break;
1576         }
1577     }
1578   if (!primary)
1579     return; /* No primary key flag found (should not happen).  */
1580
1581   for (last = NULL, node = keyblock; node; last = node, node = node->next)
1582     {
1583       if (node->pkt->pkttype == PKT_USER_ID)
1584         break;
1585     }
1586   log_assert (node);
1587   log_assert (last);     /* The user ID is never the first packet.  */
1588   log_assert (primary0); /* Ditto (this is the node before primary).  */
1589   if (node == primary)
1590     return; /* Already the first one.  */
1591
1592   last->next = primary;
1593   primary0->next = primary2->next;
1594   primary2->next = node;
1595 }
1596
1597 void
1598 reorder_keyblock (KBNODE keyblock)
1599 {
1600   do_reorder_keyblock (keyblock, 1);
1601   do_reorder_keyblock (keyblock, 0);
1602 }
1603
1604 static void
1605 list_keyblock (ctrl_t ctrl,
1606                KBNODE keyblock, int secret, int has_secret, int fpr,
1607                struct keylist_context *listctx)
1608 {
1609   reorder_keyblock (keyblock);
1610
1611   if (opt.with_colons)
1612     list_keyblock_colon (ctrl, keyblock, secret, has_secret);
1613   else
1614     list_keyblock_print (ctrl, keyblock, secret, fpr, listctx);
1615
1616   if (secret)
1617     es_fflush (es_stdout);
1618 }
1619
1620
1621 /* Public function used by keygen to list a keyblock.  If NO_VALIDITY
1622  * is set the validity of a key is never shown.  */
1623 void
1624 list_keyblock_direct (ctrl_t ctrl,
1625                       kbnode_t keyblock, int secret, int has_secret, int fpr,
1626                       int no_validity)
1627 {
1628   struct keylist_context listctx;
1629
1630   memset (&listctx, 0, sizeof (listctx));
1631   listctx.no_validity = !!no_validity;
1632   list_keyblock (ctrl, keyblock, secret, has_secret, fpr, &listctx);
1633   keylist_context_release (&listctx);
1634 }
1635
1636
1637 /* Print an hex digit in ICAO spelling.  */
1638 static void
1639 print_icao_hexdigit (estream_t fp, int c)
1640 {
1641   static const char *list[16] = {
1642     "Zero", "One", "Two", "Three", "Four", "Five", "Six", "Seven",
1643     "Eight", "Niner", "Alfa", "Bravo", "Charlie", "Delta", "Echo", "Foxtrot"
1644   };
1645
1646   tty_fprintf (fp, "%s", list[c&15]);
1647 }
1648
1649
1650 /*
1651  * Function to print the finperprint.
1652  * mode 0: as used in key listings, opt.with_colons is honored
1653  *      1: print using log_info ()
1654  *      2: direct use of tty
1655  *      3: direct use of tty but only primary key.
1656  *      4: direct use of tty but only subkey.
1657  *     10: Same as 0 but with_colons etc is ignored.
1658  *     20: Same as 0 but using a compact format.
1659  *
1660  * Modes 1 and 2 will try and print both subkey and primary key
1661  * fingerprints.  A MODE with bit 7 set is used internally.  If
1662  * OVERRIDE_FP is not NULL that stream will be used in  0 instead
1663  * of es_stdout or instead of the TTY in modes 2 and 3.
1664  */
1665 void
1666 print_fingerprint (estream_t override_fp, PKT_public_key *pk, int mode)
1667 {
1668   char hexfpr[2*MAX_FINGERPRINT_LEN+1];
1669   char *p;
1670   size_t i;
1671   estream_t fp;
1672   const char *text;
1673   int primary = 0;
1674   int with_colons = opt.with_colons;
1675   int with_icao   = opt.with_icao_spelling;
1676   int compact = 0;
1677
1678   if (mode == 10)
1679     {
1680       mode = 0;
1681       with_colons = 0;
1682       with_icao = 0;
1683     }
1684   else if (mode == 20)
1685     {
1686       mode = 0;
1687       with_colons = 0;
1688       compact = 1;
1689     }
1690
1691   if (!opt.fingerprint && !opt.with_fingerprint
1692       && opt.with_subkey_fingerprint)
1693     compact = 1;
1694
1695   if (pk->main_keyid[0] == pk->keyid[0]
1696       && pk->main_keyid[1] == pk->keyid[1])
1697     primary = 1;
1698
1699   /* Just to be safe */
1700   if ((mode & 0x80) && !primary)
1701     {
1702       log_error ("primary key is not really primary!\n");
1703       return;
1704     }
1705
1706   mode &= ~0x80;
1707
1708   if (!primary && (mode == 1 || mode == 2))
1709     {
1710       PKT_public_key *primary_pk = xmalloc_clear (sizeof (*primary_pk));
1711       get_pubkey (primary_pk, pk->main_keyid);
1712       print_fingerprint (override_fp, primary_pk, (mode | 0x80));
1713       free_public_key (primary_pk);
1714     }
1715
1716   if (mode == 1)
1717     {
1718       fp = log_get_stream ();
1719       if (primary)
1720         text = _("Primary key fingerprint:");
1721       else
1722         text = _("     Subkey fingerprint:");
1723     }
1724   else if (mode == 2)
1725     {
1726       fp = override_fp; /* Use tty or given stream.  */
1727       if (primary)
1728         /* TRANSLATORS: this should fit into 24 bytes so that the
1729          * fingerprint data is properly aligned with the user ID */
1730         text = _(" Primary key fingerprint:");
1731       else
1732         text = _("      Subkey fingerprint:");
1733     }
1734   else if (mode == 3)
1735     {
1736       fp = override_fp; /* Use tty or given stream.  */
1737       text = _("      Key fingerprint =");
1738     }
1739   else if (mode == 4)
1740     {
1741       fp = override_fp; /* Use tty or given stream.  */
1742       text = _("      Subkey fingerprint:");
1743     }
1744   else
1745     {
1746       fp = override_fp? override_fp : es_stdout;
1747       if (opt.keyid_format == KF_NONE)
1748         {
1749           text = "     ";  /* To indent ICAO spelling.  */
1750           compact = 1;
1751         }
1752       else
1753         text = _("      Key fingerprint =");
1754     }
1755
1756   hexfingerprint (pk, hexfpr, sizeof hexfpr);
1757   if (with_colons && !mode)
1758     {
1759       es_fprintf (fp, "fpr:::::::::%s:", hexfpr);
1760     }
1761   else if (compact && !opt.fingerprint && !opt.with_fingerprint)
1762     {
1763       tty_fprintf (fp, "%*s%s", 6, "", hexfpr);
1764     }
1765   else
1766     {
1767       char fmtfpr[MAX_FORMATTED_FINGERPRINT_LEN + 1];
1768       format_hexfingerprint (hexfpr, fmtfpr, sizeof fmtfpr);
1769       if (compact)
1770         tty_fprintf (fp, "%*s%s", 6, "", fmtfpr);
1771       else
1772         tty_fprintf (fp, "%s %s", text, fmtfpr);
1773     }
1774   tty_fprintf (fp, "\n");
1775   if (!with_colons && with_icao)
1776     {
1777       ;
1778       tty_fprintf (fp, "%*s\"", (int)strlen(text)+1, "");
1779       for (i = 0, p = hexfpr; *p; i++, p++)
1780         {
1781           if (!i)
1782             ;
1783           else if (!(i%8))
1784             tty_fprintf (fp, "\n%*s ", (int)strlen(text)+1, "");
1785           else if (!(i%4))
1786             tty_fprintf (fp, "  ");
1787           else
1788             tty_fprintf (fp, " ");
1789           print_icao_hexdigit (fp, xtoi_1 (p));
1790         }
1791       tty_fprintf (fp, "\"\n");
1792     }
1793 }
1794
1795 /* Print the serial number of an OpenPGP card if available.  */
1796 static void
1797 print_card_serialno (const char *serialno)
1798 {
1799   if (!serialno)
1800     return;
1801   if (opt.with_colons)
1802     return; /* Handled elsewhere. */
1803
1804   es_fputs (_("      Card serial no. ="), es_stdout);
1805   es_putc (' ', es_stdout);
1806   if (strlen (serialno) == 32 && !strncmp (serialno, "D27600012401", 12))
1807     {
1808       /* This is an OpenPGP card.  Print the relevant part.  */
1809       /* Example: D2760001240101010001000003470000 */
1810       /*                          xxxxyyyyyyyy     */
1811       es_fprintf (es_stdout, "%.*s %.*s", 4, serialno+16, 8, serialno+20);
1812     }
1813  else
1814    es_fputs (serialno, es_stdout);
1815   es_putc ('\n', es_stdout);
1816 }
1817
1818
1819 /* Print a public or secret (sub)key line.  Example:
1820  *
1821  * pub   dsa2048 2007-12-31 [SC] [expires: 2018-12-31]
1822  *       80615870F5BAD690333686D0F2AD85AC1E42B367
1823  *
1824  * Some global options may result in a different output format.  If
1825  * SECRET is set, "sec" or "ssb" is used instead of "pub" or "sub" and
1826  * depending on the value a flag character is shown:
1827  *
1828  *    1 := ' ' Regular secret key
1829  *    2 := '#' Stub secret key
1830  *    3 := '>' Secret key is on a token.
1831  */
1832 void
1833 print_key_line (estream_t fp, PKT_public_key *pk, int secret)
1834 {
1835   char pkstrbuf[PUBKEY_STRING_SIZE];
1836
1837   tty_fprintf (fp, "%s%c  %s",
1838                pk->flags.primary? (secret? "sec":"pub")
1839                /**/             : (secret? "ssb":"sub"),
1840                secret == 2? '#' : secret == 3? '>' : ' ',
1841                pubkey_string (pk, pkstrbuf, sizeof pkstrbuf));
1842   if (opt.keyid_format != KF_NONE)
1843     tty_fprintf (fp, "/%s", keystr_from_pk (pk));
1844   tty_fprintf (fp, " %s", datestr_from_pk (pk));
1845
1846   if ((opt.list_options & LIST_SHOW_USAGE))
1847     {
1848       tty_fprintf (fp, " [%s]", usagestr_from_pk (pk, 0));
1849     }
1850   if (pk->flags.revoked)
1851     {
1852       tty_fprintf (fp, " [");
1853       tty_fprintf (fp, _("revoked: %s"), revokestr_from_pk (pk));
1854       tty_fprintf (fp, "]");
1855     }
1856   else if (pk->has_expired)
1857     {
1858       tty_fprintf (fp, " [");
1859       tty_fprintf (fp, _("expired: %s"), expirestr_from_pk (pk));
1860       tty_fprintf (fp, "]");
1861     }
1862   else if (pk->expiredate)
1863     {
1864       tty_fprintf (fp, " [");
1865       tty_fprintf (fp, _("expires: %s"), expirestr_from_pk (pk));
1866       tty_fprintf (fp, "]");
1867     }
1868
1869 #if 0
1870   /* I need to think about this some more.  It's easy enough to
1871      include, but it looks sort of confusing in the listing... */
1872   if (opt.list_options & LIST_SHOW_VALIDITY)
1873     {
1874       int validity = get_validity (ctrl, pk, NULL, NULL, 0);
1875       tty_fprintf (fp, " [%s]", trust_value_to_string (validity));
1876     }
1877 #endif
1878
1879   if (pk->pubkey_algo >= 100)
1880     tty_fprintf (fp, " [experimental algorithm %d]", pk->pubkey_algo);
1881
1882   tty_fprintf (fp, "\n");
1883
1884   /* if the user hasn't explicitly asked for human-readable
1885      fingerprints, show compact fpr of primary key: */
1886   if (pk->flags.primary &&
1887       !opt.fingerprint && !opt.with_fingerprint)
1888     print_fingerprint (fp, pk, 20);
1889 }
1890
1891
1892 void
1893 set_attrib_fd (int fd)
1894 {
1895   static int last_fd = -1;
1896
1897   if (fd != -1 && last_fd == fd)
1898     return;
1899
1900   /* Fixme: Do we need to check for the log stream here?  */
1901   if (attrib_fp && attrib_fp != log_get_stream ())
1902     es_fclose (attrib_fp);
1903   attrib_fp = NULL;
1904   if (fd == -1)
1905     return;
1906
1907   if (! gnupg_fd_valid (fd))
1908     log_fatal ("attribute-fd is invalid: %s\n", strerror (errno));
1909
1910 #ifdef HAVE_DOSISH_SYSTEM
1911   setmode (fd, O_BINARY);
1912 #endif
1913   if (fd == 1)
1914     attrib_fp = es_stdout;
1915   else if (fd == 2)
1916     attrib_fp = es_stderr;
1917   else
1918     attrib_fp = es_fdopen (fd, "wb");
1919   if (!attrib_fp)
1920     {
1921       log_fatal ("can't open fd %d for attribute output: %s\n",
1922                  fd, strerror (errno));
1923     }
1924
1925   last_fd = fd;
1926 }