gpg: Do not bail on an invalid packet in the local keyring.
[gnupg.git] / g10 / keyid.c
1 /* keyid.c - key ID and fingerprint handling
2  * Copyright (C) 1998, 1999, 2000, 2001, 2003,
3  *               2004, 2006, 2010 Free Software Foundation, Inc.
4  * Copyright (C) 2014 Werner Koch
5  * Copyright (C) 2016 g10 Code GmbH
6  *
7  * This file is part of GnuPG.
8  *
9  * GnuPG is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 3 of the License, or
12  * (at your option) any later version.
13  *
14  * GnuPG is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, see <https://www.gnu.org/licenses/>.
21  */
22
23 #include <config.h>
24 #include <stdio.h>
25 #include <stdlib.h>
26 #include <string.h>
27 #include <errno.h>
28 #include <time.h>
29
30 #include "gpg.h"
31 #include "../common/util.h"
32 #include "main.h"
33 #include "packet.h"
34 #include "options.h"
35 #include "keydb.h"
36 #include "../common/i18n.h"
37 #include "rmd160.h"
38 #include "../common/host2net.h"
39
40
41 #define KEYID_STR_SIZE 19
42
43 #ifdef HAVE_UNSIGNED_TIME_T
44 # define IS_INVALID_TIME_T(a) ((a) == (time_t)(-1))
45 #else
46   /* Error or 32 bit time_t and value after 2038-01-19.  */
47 # define IS_INVALID_TIME_T(a) ((a) < 0)
48 #endif
49
50
51 /* Return a letter describing the public key algorithms.  */
52 int
53 pubkey_letter( int algo )
54 {
55   switch (algo)
56     {
57     case PUBKEY_ALGO_RSA:       return 'R' ;
58     case PUBKEY_ALGO_RSA_E:     return 'r' ;
59     case PUBKEY_ALGO_RSA_S:     return 's' ;
60     case PUBKEY_ALGO_ELGAMAL_E: return 'g' ;
61     case PUBKEY_ALGO_ELGAMAL:   return 'G' ;
62     case PUBKEY_ALGO_DSA:       return 'D' ;
63     case PUBKEY_ALGO_ECDH:      return 'e' ;    /* ECC DH (encrypt only) */
64     case PUBKEY_ALGO_ECDSA:     return 'E' ;    /* ECC DSA (sign only)   */
65     case PUBKEY_ALGO_EDDSA:     return 'E' ;    /* ECC EdDSA (sign only) */
66     default: return '?';
67     }
68 }
69
70 /* Return a string describing the public key algorithm and the
71    keysize.  For elliptic curves the function prints the name of the
72    curve because the keysize is a property of the curve.  The string
73    is copied to the supplied buffer up a length of BUFSIZE-1.
74    Examples for the output are:
75
76    "rsa3072"  - RSA with 3072 bit
77    "elg1024"  - Elgamal with 1024 bit
78    "ed25519"  - ECC using the curve Ed25519.
79    "E_1.2.3.4"  - ECC using the unsupported curve with OID "1.2.3.4".
80    "E_1.3.6.1.4.1.11591.2.12242973" ECC with a bogus OID.
81    "unknown_N"  - Unknown OpenPGP algorithm N.
82
83    If the option --legacy-list-mode is active, the output use the
84    legacy format:
85
86    "3072R" - RSA with 3072 bit
87    "1024g" - Elgamal with 1024 bit
88    "256E"  - ECDSA using a curve with 256 bit
89
90    The macro PUBKEY_STRING_SIZE may be used to allocate a buffer with
91    a suitable size.*/
92 char *
93 pubkey_string (PKT_public_key *pk, char *buffer, size_t bufsize)
94 {
95   const char *prefix = NULL;
96
97   if (opt.legacy_list_mode)
98     {
99       snprintf (buffer, bufsize, "%4u%c",
100                 nbits_from_pk (pk), pubkey_letter (pk->pubkey_algo));
101       return buffer;
102     }
103
104   switch (pk->pubkey_algo)
105     {
106     case PUBKEY_ALGO_RSA:
107     case PUBKEY_ALGO_RSA_E:
108     case PUBKEY_ALGO_RSA_S:     prefix = "rsa"; break;
109     case PUBKEY_ALGO_ELGAMAL_E: prefix = "elg"; break;
110     case PUBKEY_ALGO_DSA:       prefix = "dsa"; break;
111     case PUBKEY_ALGO_ELGAMAL:   prefix = "xxx"; break;
112     case PUBKEY_ALGO_ECDH:
113     case PUBKEY_ALGO_ECDSA:
114     case PUBKEY_ALGO_EDDSA:     prefix = "";    break;
115     }
116
117   if (prefix && *prefix)
118     snprintf (buffer, bufsize, "%s%u", prefix, nbits_from_pk (pk));
119   else if (prefix)
120     {
121       char *curve = openpgp_oid_to_str (pk->pkey[0]);
122       const char *name = openpgp_oid_to_curve (curve, 0);
123
124       if (name)
125         snprintf (buffer, bufsize, "%s", name);
126       else if (curve)
127         snprintf (buffer, bufsize, "E_%s", curve);
128       else
129         snprintf (buffer, bufsize, "E_error");
130       xfree (curve);
131     }
132   else
133     snprintf (buffer, bufsize, "unknown_%u", (unsigned int)pk->pubkey_algo);
134
135   return buffer;
136 }
137
138
139 /* Hash a public key.  This function is useful for v4 and v5
140  * fingerprints and for v3 or v4 key signing. */
141 void
142 hash_public_key (gcry_md_hd_t md, PKT_public_key *pk)
143 {
144   unsigned int n;
145   unsigned int nn[PUBKEY_MAX_NPKEY];
146   byte *pp[PUBKEY_MAX_NPKEY];
147   int i;
148   unsigned int nbits;
149   size_t nbytes;
150   int npkey = pubkey_get_npkey (pk->pubkey_algo);
151   int is_v5 = pk->version == 5;
152
153   n = is_v5? 10 : 6;
154   /* FIXME: We can avoid the extra malloc by calling only the first
155      mpi_print here which computes the required length and calling the
156      real mpi_print only at the end.  The speed advantage would only be
157      for ECC (opaque MPIs) or if we could implement an mpi_print
158      variant with a callback handler to do the hashing.  */
159   if (npkey==0 && pk->pkey[0]
160       && gcry_mpi_get_flag (pk->pkey[0], GCRYMPI_FLAG_OPAQUE))
161     {
162       pp[0] = gcry_mpi_get_opaque (pk->pkey[0], &nbits);
163       nn[0] = (nbits+7)/8;
164       n+=nn[0];
165     }
166   else
167     {
168       for (i=0; i < npkey; i++ )
169         {
170           if (!pk->pkey[i])
171             {
172               /* This case may only happen if the parsing of the MPI
173                  failed but the key was anyway created.  May happen
174                  during "gpg KEYFILE".  */
175               pp[i] = NULL;
176               nn[i] = 0;
177             }
178           else if (gcry_mpi_get_flag (pk->pkey[i], GCRYMPI_FLAG_OPAQUE))
179             {
180               const void *p;
181
182               p = gcry_mpi_get_opaque (pk->pkey[i], &nbits);
183               pp[i] = xmalloc ((nbits+7)/8);
184               if (p)
185                 memcpy (pp[i], p, (nbits+7)/8);
186               else
187                 pp[i] = NULL;
188               nn[i] = (nbits+7)/8;
189               n += nn[i];
190             }
191           else
192             {
193               if (gcry_mpi_print (GCRYMPI_FMT_PGP, NULL, 0,
194                                   &nbytes, pk->pkey[i]))
195                 BUG ();
196               pp[i] = xmalloc (nbytes);
197               if (gcry_mpi_print (GCRYMPI_FMT_PGP, pp[i], nbytes,
198                                   &nbytes, pk->pkey[i]))
199                 BUG ();
200               nn[i] = nbytes;
201               n += nn[i];
202             }
203         }
204     }
205
206   if (is_v5)
207     {
208       gcry_md_putc ( md, 0x9a );     /* ctb */
209       gcry_md_putc ( md, n >> 24 );  /* 4 byte length header */
210       gcry_md_putc ( md, n >> 16 );
211       gcry_md_putc ( md, n >>  8 );
212       gcry_md_putc ( md, n       );
213       gcry_md_putc ( md, pk->version );
214     }
215   else
216     {
217       gcry_md_putc ( md, 0x99 );     /* ctb */
218       gcry_md_putc ( md, n >> 8 );   /* 2 byte length header */
219       gcry_md_putc ( md, n );
220       gcry_md_putc ( md, pk->version );
221     }
222   gcry_md_putc ( md, pk->timestamp >> 24 );
223   gcry_md_putc ( md, pk->timestamp >> 16 );
224   gcry_md_putc ( md, pk->timestamp >>  8 );
225   gcry_md_putc ( md, pk->timestamp       );
226
227   gcry_md_putc ( md, pk->pubkey_algo );
228
229   if (is_v5)
230     {
231       n -= 10;
232       gcry_md_putc ( md, n >> 24 );
233       gcry_md_putc ( md, n >> 16 );
234       gcry_md_putc ( md, n >>  8 );
235       gcry_md_putc ( md, n       );
236     }
237
238   if(npkey==0 && pk->pkey[0]
239      && gcry_mpi_get_flag (pk->pkey[0], GCRYMPI_FLAG_OPAQUE))
240     {
241       if (pp[0])
242         gcry_md_write (md, pp[0], nn[0]);
243     }
244   else
245     {
246       for(i=0; i < npkey; i++ )
247         {
248           if (pp[i])
249             gcry_md_write ( md, pp[i], nn[i] );
250           xfree(pp[i]);
251         }
252     }
253 }
254
255
256 /* fixme: Check whether we can replace this function or if not
257    describe why we need it.  */
258 u32
259 v3_keyid (gcry_mpi_t a, u32 *ki)
260 {
261   byte *buffer, *p;
262   size_t nbytes;
263
264   if (gcry_mpi_print (GCRYMPI_FMT_USG, NULL, 0, &nbytes, a ))
265     BUG ();
266   /* fixme: allocate it on the stack */
267   buffer = xmalloc (nbytes);
268   if (gcry_mpi_print( GCRYMPI_FMT_USG, buffer, nbytes, NULL, a ))
269     BUG ();
270   if (nbytes < 8) /* oops */
271     ki[0] = ki[1] = 0;
272   else
273     {
274       p = buffer + nbytes - 8;
275       ki[0] = buf32_to_u32 (p);
276       p += 4;
277       ki[1] = buf32_to_u32 (p);
278     }
279   xfree (buffer);
280   return ki[1];
281 }
282
283
284 /* Return PK's keyid.  The memory is owned by PK.  */
285 u32 *
286 pk_keyid (PKT_public_key *pk)
287 {
288   keyid_from_pk (pk, NULL);
289
290   /* Uncomment this for help tracking down bugs related to keyid or
291      main_keyid not being set correctly.  */
292 #if 0
293   if (! (pk->main_keyid[0] || pk->main_keyid[1]))
294     log_bug ("pk->main_keyid not set!\n");
295   if (keyid_cmp (pk->keyid, pk->main_keyid) == 0
296       && ! pk->flags.primary)
297     log_bug ("keyid and main_keyid are the same, but primary flag not set!\n");
298   if (keyid_cmp (pk->keyid, pk->main_keyid) != 0
299       && pk->flags.primary)
300     log_bug ("keyid and main_keyid are different, but primary flag set!\n");
301 #endif
302
303   return pk->keyid;
304 }
305
306 /* Return the keyid of the primary key associated with PK.  The memory
307    is owned by PK.  */
308 u32 *
309 pk_main_keyid (PKT_public_key *pk)
310 {
311   /* Uncomment this for help tracking down bugs related to keyid or
312      main_keyid not being set correctly.  */
313 #if 0
314   if (! (pk->main_keyid[0] || pk->main_keyid[1]))
315     log_bug ("pk->main_keyid not set!\n");
316 #endif
317
318   return pk->main_keyid;
319 }
320
321 /* Copy the keyid in SRC to DEST and return DEST.  */
322 u32 *
323 keyid_copy (u32 *dest, const u32 *src)
324 {
325   dest[0] = src[0];
326   dest[1] = src[1];
327   return dest;
328 }
329
330 char *
331 format_keyid (u32 *keyid, int format, char *buffer, int len)
332 {
333   char tmp[KEYID_STR_SIZE];
334   if (! buffer)
335     {
336       buffer = tmp;
337       len = sizeof (tmp);
338     }
339
340   if (format == KF_DEFAULT)
341     format = opt.keyid_format;
342   if (format == KF_DEFAULT)
343     format = KF_NONE;
344
345   switch (format)
346     {
347     case KF_NONE:
348       if (len)
349         *buffer = 0;
350       break;
351
352     case KF_SHORT:
353       snprintf (buffer, len, "%08lX", (ulong)keyid[1]);
354       break;
355
356     case KF_LONG:
357       snprintf (buffer, len, "%08lX%08lX", (ulong)keyid[0], (ulong)keyid[1]);
358       break;
359
360     case KF_0xSHORT:
361       snprintf (buffer, len, "0x%08lX", (ulong)keyid[1]);
362       break;
363
364     case KF_0xLONG:
365       snprintf (buffer, len, "0x%08lX%08lX", (ulong)keyid[0],(ulong)keyid[1]);
366       break;
367
368     default:
369       BUG();
370     }
371
372   if (buffer == tmp)
373     return xstrdup (buffer);
374   return buffer;
375 }
376
377 size_t
378 keystrlen(void)
379 {
380   int format = opt.keyid_format;
381   if (format == KF_DEFAULT)
382     format = KF_NONE;
383
384   switch(format)
385     {
386     case KF_NONE:
387       return 0;
388
389     case KF_SHORT:
390       return 8;
391
392     case KF_LONG:
393       return 16;
394
395     case KF_0xSHORT:
396       return 10;
397
398     case KF_0xLONG:
399       return 18;
400
401     default:
402       BUG();
403     }
404 }
405
406
407 const char *
408 keystr (u32 *keyid)
409 {
410   static char keyid_str[KEYID_STR_SIZE];
411   int format = opt.keyid_format;
412
413   if (format == KF_DEFAULT)
414     format = KF_NONE;
415   if (format == KF_NONE)
416     format = KF_LONG;
417
418   return format_keyid (keyid, format, keyid_str, sizeof (keyid_str));
419 }
420
421 /* This function returns the key id of the main and possible the
422  * subkey as one string.  It is used by error messages.  */
423 const char *
424 keystr_with_sub (u32 *main_kid, u32 *sub_kid)
425 {
426   static char buffer[KEYID_STR_SIZE+1+KEYID_STR_SIZE];
427   char *p;
428   int format = opt.keyid_format;
429
430   if (format == KF_NONE)
431     format = KF_LONG;
432
433   format_keyid (main_kid, format, buffer, KEYID_STR_SIZE);
434   if (sub_kid)
435     {
436       p = buffer + strlen (buffer);
437       *p++ = '/';
438       format_keyid (sub_kid, format, p, KEYID_STR_SIZE);
439     }
440   return buffer;
441 }
442
443
444 const char *
445 keystr_from_pk(PKT_public_key *pk)
446 {
447   keyid_from_pk(pk,NULL);
448
449   return keystr(pk->keyid);
450 }
451
452
453 const char *
454 keystr_from_pk_with_sub (PKT_public_key *main_pk, PKT_public_key *sub_pk)
455 {
456   keyid_from_pk (main_pk, NULL);
457   if (sub_pk)
458     keyid_from_pk (sub_pk, NULL);
459
460   return keystr_with_sub (main_pk->keyid, sub_pk? sub_pk->keyid:NULL);
461 }
462
463
464 /* Return PK's key id as a string using the default format.  PK owns
465    the storage.  */
466 const char *
467 pk_keyid_str (PKT_public_key *pk)
468 {
469   return keystr (pk_keyid (pk));
470 }
471
472
473 const char *
474 keystr_from_desc(KEYDB_SEARCH_DESC *desc)
475 {
476   switch(desc->mode)
477     {
478     case KEYDB_SEARCH_MODE_LONG_KID:
479     case KEYDB_SEARCH_MODE_SHORT_KID:
480       return keystr(desc->u.kid);
481
482     case KEYDB_SEARCH_MODE_FPR:
483       {
484         u32 keyid[2];
485
486         if (desc->fprlen == 32)
487           {
488             keyid[0] = buf32_to_u32 (desc->u.fpr);
489             keyid[1] = buf32_to_u32 (desc->u.fpr+4);
490           }
491         else if (desc->fprlen == 20)
492           {
493             keyid[0] = buf32_to_u32 (desc->u.fpr+12);
494             keyid[1] = buf32_to_u32 (desc->u.fpr+16);
495           }
496         else if (desc->fprlen == 16)
497           return "?v3 fpr?";
498         else /* oops */
499           return "?vx fpr?";
500         return keystr(keyid);
501       }
502
503     default:
504       BUG();
505     }
506 }
507
508
509 /* Compute the fingerprint and keyid and store it in PK.  */
510 static void
511 compute_fingerprint (PKT_public_key *pk)
512 {
513   const byte *dp;
514   gcry_md_hd_t md;
515   size_t len;
516
517   if (gcry_md_open (&md, pk->version == 5 ? GCRY_MD_SHA256 : GCRY_MD_SHA1, 0))
518     BUG ();
519   hash_public_key (md, pk);
520   gcry_md_final (md);
521   dp = gcry_md_read (md, 0);
522   len = gcry_md_get_algo_dlen (gcry_md_get_algo (md));
523   log_assert (len <= MAX_FINGERPRINT_LEN);
524   memcpy (pk->fpr, dp, len);
525   pk->fprlen = len;
526   if (pk->version == 5)
527     {
528       pk->keyid[0] = buf32_to_u32 (dp);
529       pk->keyid[1] = buf32_to_u32 (dp+4);
530     }
531   else
532     {
533       pk->keyid[0] = buf32_to_u32 (dp+12);
534       pk->keyid[1] = buf32_to_u32 (dp+16);
535     }
536   gcry_md_close( md);
537 }
538
539
540 /*
541  * Get the keyid from the public key PK and store it at KEYID unless
542  * this is NULL.  Returns the 32 bit short keyid.
543  */
544 u32
545 keyid_from_pk (PKT_public_key *pk, u32 *keyid)
546 {
547   u32 dummy_keyid[2];
548
549   if (!keyid)
550     keyid = dummy_keyid;
551
552   if (!pk->fprlen)
553     compute_fingerprint (pk);
554
555   keyid[0] = pk->keyid[0];
556   keyid[1] = pk->keyid[1];
557
558   return keyid[1]; /*FIXME:shortkeyid ist different for v5*/
559 }
560
561
562 /*
563  * Get the keyid from the fingerprint.  This function is simple for
564  * most keys, but has to do a key lookup for old v3 keys where the
565  * keyid is not part of the fingerprint.
566  */
567 u32
568 keyid_from_fingerprint (ctrl_t ctrl, const byte *fprint,
569                         size_t fprint_len, u32 *keyid)
570 {
571   u32 dummy_keyid[2];
572
573   if( !keyid )
574     keyid = dummy_keyid;
575
576   if (fprint_len != 20 && fprint_len != 32)
577     {
578       /* This is special as we have to lookup the key first.  */
579       PKT_public_key pk;
580       int rc;
581
582       memset (&pk, 0, sizeof pk);
583       rc = get_pubkey_byfprint (ctrl, &pk, NULL, fprint, fprint_len);
584       if( rc )
585         {
586           log_printhex (fprint, fprint_len,
587                         "Oops: keyid_from_fingerprint: no pubkey; fpr:");
588           keyid[0] = 0;
589           keyid[1] = 0;
590         }
591       else
592         keyid_from_pk (&pk, keyid);
593     }
594   else
595     {
596       const byte *dp = fprint;
597       if (fprint_len == 20)  /* v4 key */
598         {
599           keyid[0] = buf32_to_u32 (dp+12);
600           keyid[1] = buf32_to_u32 (dp+16);
601         }
602       else  /* v5 key */
603         {
604           keyid[0] = buf32_to_u32 (dp);
605           keyid[1] = buf32_to_u32 (dp+4);
606         }
607     }
608
609   return keyid[1];
610 }
611
612
613 u32
614 keyid_from_sig (PKT_signature *sig, u32 *keyid)
615 {
616   if( keyid )
617     {
618       keyid[0] = sig->keyid[0];
619       keyid[1] = sig->keyid[1];
620     }
621   return sig->keyid[1];  /*FIXME:shortkeyid*/
622 }
623
624
625 byte *
626 namehash_from_uid (PKT_user_id *uid)
627 {
628   if (!uid->namehash)
629     {
630       uid->namehash = xmalloc (20);
631
632       if (uid->attrib_data)
633         rmd160_hash_buffer (uid->namehash, uid->attrib_data, uid->attrib_len);
634       else
635         rmd160_hash_buffer (uid->namehash, uid->name, uid->len);
636     }
637
638   return uid->namehash;
639 }
640
641
642 /*
643  * Return the number of bits used in PK.
644  */
645 unsigned int
646 nbits_from_pk (PKT_public_key *pk)
647 {
648     return pubkey_nbits (pk->pubkey_algo, pk->pkey);
649 }
650
651
652 /* Convert an UTC TIMESTAMP into an UTC yyyy-mm-dd string.  Return
653  * that string.  The caller should pass a buffer with at least a size
654  * of MK_DATESTR_SIZE.  */
655 char *
656 mk_datestr (char *buffer, size_t bufsize, u32 timestamp)
657 {
658   time_t atime = timestamp;
659   struct tm *tp;
660
661   if (IS_INVALID_TIME_T (atime))
662     strcpy (buffer, "????" "-??" "-??"); /* Mark this as invalid. */
663   else
664     {
665       tp = gmtime (&atime);
666       snprintf (buffer, bufsize, "%04d-%02d-%02d",
667                 1900+tp->tm_year, tp->tm_mon+1, tp->tm_mday );
668     }
669   return buffer;
670 }
671
672
673 /*
674  * return a string with the creation date of the pk
675  * Note: this is alloced in a static buffer.
676  *    Format is: yyyy-mm-dd
677  */
678 const char *
679 datestr_from_pk (PKT_public_key *pk)
680 {
681   static char buffer[MK_DATESTR_SIZE];
682
683   return mk_datestr (buffer, sizeof buffer, pk->timestamp);
684 }
685
686
687 const char *
688 datestr_from_sig (PKT_signature *sig )
689 {
690   static char buffer[MK_DATESTR_SIZE];
691
692   return mk_datestr (buffer, sizeof buffer, sig->timestamp);
693 }
694
695
696 const char *
697 expirestr_from_pk (PKT_public_key *pk)
698 {
699   static char buffer[MK_DATESTR_SIZE];
700
701   if (!pk->expiredate)
702     return _("never     ");
703   return mk_datestr (buffer, sizeof buffer, pk->expiredate);
704 }
705
706
707 const char *
708 expirestr_from_sig (PKT_signature *sig)
709 {
710   static char buffer[MK_DATESTR_SIZE];
711
712   if (!sig->expiredate)
713     return _("never     ");
714   return mk_datestr (buffer, sizeof buffer, sig->expiredate);
715 }
716
717
718 const char *
719 revokestr_from_pk( PKT_public_key *pk )
720 {
721   static char buffer[MK_DATESTR_SIZE];
722
723   if(!pk->revoked.date)
724     return _("never     ");
725   return mk_datestr (buffer, sizeof buffer, pk->revoked.date);
726 }
727
728
729 const char *
730 usagestr_from_pk (PKT_public_key *pk, int fill)
731 {
732   static char buffer[10];
733   int i = 0;
734   unsigned int use = pk->pubkey_usage;
735
736   if ( use & PUBKEY_USAGE_SIG )
737     buffer[i++] = 'S';
738
739   if ( use & PUBKEY_USAGE_CERT )
740     buffer[i++] = 'C';
741
742   if ( use & PUBKEY_USAGE_ENC )
743     buffer[i++] = 'E';
744
745   if ( (use & PUBKEY_USAGE_AUTH) )
746     buffer[i++] = 'A';
747
748   while (fill && i < 4)
749     buffer[i++] = ' ';
750
751   buffer[i] = 0;
752   return buffer;
753 }
754
755
756 const char *
757 colon_strtime (u32 t)
758 {
759   static char buf[20];
760
761   if (!t)
762     return "";
763   snprintf (buf, sizeof buf, "%lu", (ulong)t);
764   return buf;
765 }
766
767 const char *
768 colon_datestr_from_pk (PKT_public_key *pk)
769 {
770   static char buf[20];
771
772   snprintf (buf, sizeof buf, "%lu", (ulong)pk->timestamp);
773   return buf;
774 }
775
776
777 const char *
778 colon_datestr_from_sig (PKT_signature *sig)
779 {
780   static char buf[20];
781
782   snprintf (buf, sizeof buf, "%lu", (ulong)sig->timestamp);
783   return buf;
784 }
785
786 const char *
787 colon_expirestr_from_sig (PKT_signature *sig)
788 {
789   static char buf[20];
790
791   if (!sig->expiredate)
792     return "";
793
794   snprintf (buf, sizeof buf,"%lu", (ulong)sig->expiredate);
795   return buf;
796 }
797
798
799
800 /*
801  * Return a byte array with the fingerprint for the given PK/SK
802  * The length of the array is returned in ret_len. Caller must free
803  * the array or provide an array of length MAX_FINGERPRINT_LEN.
804  */
805 byte *
806 fingerprint_from_pk (PKT_public_key *pk, byte *array, size_t *ret_len)
807 {
808   if (!pk->fprlen)
809     compute_fingerprint (pk);
810
811   if (!array)
812     array = xmalloc (pk->fprlen);
813   memcpy (array, pk->fpr, pk->fprlen);
814
815   if (ret_len)
816     *ret_len = pk->fprlen;
817   return array;
818 }
819
820
821 /* Return an allocated buffer with the fingerprint of PK formatted as
822  * a plain hexstring.  If BUFFER is NULL the result is a malloc'd
823  * string.  If BUFFER is not NULL the result will be copied into this
824  * buffer.  In the latter case BUFLEN describes the length of the
825  * buffer; if this is too short the function terminates the process.
826  * Returns a malloc'ed string or BUFFER.  A suitable length for BUFFER
827  * is (2*MAX_FINGERPRINT_LEN + 1). */
828 char *
829 hexfingerprint (PKT_public_key *pk, char *buffer, size_t buflen)
830 {
831   if (!pk->fprlen)
832     compute_fingerprint (pk);
833
834   if (!buffer)
835     {
836       buffer = xtrymalloc (2 * pk->fprlen + 1);
837       if (!buffer)
838         return NULL;
839     }
840   else if (buflen < 2 * pk->fprlen + 1)
841     log_fatal ("%s: buffer too short (%zu)\n", __func__, buflen);
842
843   bin2hex (pk->fpr, pk->fprlen, buffer);
844   return buffer;
845 }
846
847
848 /* Pretty print a hex fingerprint.  If BUFFER is NULL the result is a
849    malloc'd string.  If BUFFER is not NULL the result will be copied
850    into this buffer.  In the latter case BUFLEN describes the length
851    of the buffer; if this is too short the function terminates the
852    process.  Returns a malloc'ed string or BUFFER.  A suitable length
853    for BUFFER is (MAX_FORMATTED_FINGERPRINT_LEN + 1).  */
854 char *
855 format_hexfingerprint (const char *fingerprint, char *buffer, size_t buflen)
856 {
857   int hexlen = strlen (fingerprint);
858   int space;
859   int i, j;
860
861   if (hexlen == 40)  /* v4 fingerprint */
862     {
863       space = (/* The characters and the NUL.  */
864                40 + 1
865                /* After every fourth character, we add a space (except
866                   the last).  */
867                + 40 / 4 - 1
868                /* Half way through we add a second space.  */
869                + 1);
870     }
871   else if (hexlen == 64 || hexlen == 50)  /* v5 fingerprint */
872     {
873       /* The v5 fingerprint is commonly printed truncated to 25
874        * octets.  We accept the truncated as well as the full hex
875        * version here and format it like this:
876        * B2CCB6 838332 5D61BA C50F9F 5E CD21A8 0AC8C5 2565C8 C52565
877        */
878       hexlen = 50;
879       space = 8 * 6 + 2 + 8 + 1;
880     }
881   else  /* Other fingerprint versions - print as is.  */
882     {
883       /* We truncated here so that we do not need to provide a buffer
884        * of a length which is in reality never used.  */
885       if (hexlen > MAX_FORMATTED_FINGERPRINT_LEN - 1)
886         hexlen = MAX_FORMATTED_FINGERPRINT_LEN - 1;
887       space = hexlen + 1;
888     }
889
890   if (!buffer)
891     buffer = xmalloc (space);
892   else if (buflen < space)
893     log_fatal ("%s: buffer too short (%zu)\n", __func__, buflen);
894
895   if (hexlen == 40)  /* v4 fingerprint */
896     {
897       for (i = 0, j = 0; i < 40; i ++)
898         {
899           if (i && !(i % 4))
900             buffer[j ++] = ' ';
901           if (i == 40 / 2)
902             buffer[j ++] = ' ';
903
904           buffer[j ++] = fingerprint[i];
905         }
906       buffer[j ++] = 0;
907       log_assert (j == space);
908     }
909   else if (hexlen == 50)  /* v5 fingerprint */
910     {
911       for (i=j=0; i < 24; i++)
912         {
913           if (i && !(i % 6))
914             buffer[j++] = ' ';
915           buffer[j++] = fingerprint[i];
916         }
917       buffer[j++] = ' ';
918       buffer[j++] = fingerprint[i++];
919       buffer[j++] = fingerprint[i++];
920       for (; i < 50; i++)
921         {
922           if (!((i-26) % 6))
923             buffer[j++] = ' ';
924           buffer[j++] = fingerprint[i];
925         }
926       buffer[j++] = 0;
927       log_assert (j == space);
928     }
929   else
930     {
931       mem2str (buffer, fingerprint, space);
932     }
933
934   return buffer;
935 }
936
937
938 \f
939 /* Return the so called KEYGRIP which is the SHA-1 hash of the public
940    key parameters expressed as an canoncial encoded S-Exp.  ARRAY must
941    be 20 bytes long.  Returns 0 on success or an error code.  */
942 gpg_error_t
943 keygrip_from_pk (PKT_public_key *pk, unsigned char *array)
944 {
945   gpg_error_t err;
946   gcry_sexp_t s_pkey;
947
948   if (DBG_PACKET)
949     log_debug ("get_keygrip for public key\n");
950
951   switch (pk->pubkey_algo)
952     {
953     case GCRY_PK_DSA:
954       err = gcry_sexp_build (&s_pkey, NULL,
955                              "(public-key(dsa(p%m)(q%m)(g%m)(y%m)))",
956                              pk->pkey[0], pk->pkey[1],
957                              pk->pkey[2], pk->pkey[3]);
958       break;
959
960     case GCRY_PK_ELG:
961     case GCRY_PK_ELG_E:
962       err = gcry_sexp_build (&s_pkey, NULL,
963                              "(public-key(elg(p%m)(g%m)(y%m)))",
964                              pk->pkey[0], pk->pkey[1], pk->pkey[2]);
965       break;
966
967     case GCRY_PK_RSA:
968     case GCRY_PK_RSA_S:
969     case GCRY_PK_RSA_E:
970       err = gcry_sexp_build (&s_pkey, NULL,
971                              "(public-key(rsa(n%m)(e%m)))",
972                              pk->pkey[0], pk->pkey[1]);
973       break;
974
975     case PUBKEY_ALGO_EDDSA:
976     case PUBKEY_ALGO_ECDSA:
977     case PUBKEY_ALGO_ECDH:
978       {
979         char *curve = openpgp_oid_to_str (pk->pkey[0]);
980         if (!curve)
981           err = gpg_error_from_syserror ();
982         else
983           {
984             err = gcry_sexp_build (&s_pkey, NULL,
985                                    pk->pubkey_algo == PUBKEY_ALGO_EDDSA?
986                                    "(public-key(ecc(curve%s)(flags eddsa)(q%m)))":
987                                    (pk->pubkey_algo == PUBKEY_ALGO_ECDH
988                                     && openpgp_oid_is_cv25519 (pk->pkey[0]))?
989                                    "(public-key(ecc(curve%s)(flags djb-tweak)(q%m)))":
990                                    "(public-key(ecc(curve%s)(q%m)))",
991                                    curve, pk->pkey[1]);
992             xfree (curve);
993           }
994       }
995       break;
996
997     default:
998       err = gpg_error (GPG_ERR_PUBKEY_ALGO);
999       break;
1000     }
1001
1002   if (err)
1003     return err;
1004
1005   if (!gcry_pk_get_keygrip (s_pkey, array))
1006     {
1007       char *hexfpr;
1008
1009       hexfpr = hexfingerprint (pk, NULL, 0);
1010       log_info ("error computing keygrip (fpr=%s)\n", hexfpr);
1011       xfree (hexfpr);
1012
1013       memset (array, 0, 20);
1014       err = gpg_error (GPG_ERR_GENERAL);
1015     }
1016   else
1017     {
1018       if (DBG_PACKET)
1019         log_printhex (array, 20, "keygrip=");
1020       /* FIXME: Save the keygrip in PK.  */
1021     }
1022   gcry_sexp_release (s_pkey);
1023
1024   return err;
1025 }
1026
1027
1028 /* Store an allocated buffer with the keygrip of PK encoded as a
1029    hexstring at r_GRIP.  Returns 0 on success.  */
1030 gpg_error_t
1031 hexkeygrip_from_pk (PKT_public_key *pk, char **r_grip)
1032 {
1033   gpg_error_t err;
1034   unsigned char grip[KEYGRIP_LEN];
1035
1036   *r_grip = NULL;
1037   err = keygrip_from_pk (pk, grip);
1038   if (!err)
1039     {
1040       char * buf = xtrymalloc (KEYGRIP_LEN * 2 + 1);
1041       if (!buf)
1042         err = gpg_error_from_syserror ();
1043       else
1044         {
1045           bin2hex (grip, KEYGRIP_LEN, buf);
1046           *r_grip = buf;
1047         }
1048     }
1049   return err;
1050 }