sm: Print Yubikey attestation extensions with --dump-cert.
[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 functions 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 fingerprints and
140    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 = 6;
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
152   /* FIXME: We can avoid the extra malloc by calling only the first
153      mpi_print here which computes the required length and calling the
154      real mpi_print only at the end.  The speed advantage would only be
155      for ECC (opaque MPIs) or if we could implement an mpi_print
156      variant with a callback handler to do the hashing.  */
157   if (npkey==0 && pk->pkey[0]
158       && gcry_mpi_get_flag (pk->pkey[0], GCRYMPI_FLAG_OPAQUE))
159     {
160       pp[0] = gcry_mpi_get_opaque (pk->pkey[0], &nbits);
161       nn[0] = (nbits+7)/8;
162       n+=nn[0];
163     }
164   else
165     {
166       for (i=0; i < npkey; i++ )
167         {
168           if (!pk->pkey[i])
169             {
170               /* This case may only happen if the parsing of the MPI
171                  failed but the key was anyway created.  May happen
172                  during "gpg KEYFILE".  */
173               pp[i] = NULL;
174               nn[i] = 0;
175             }
176           else if (gcry_mpi_get_flag (pk->pkey[i], GCRYMPI_FLAG_OPAQUE))
177             {
178               const void *p;
179
180               p = gcry_mpi_get_opaque (pk->pkey[i], &nbits);
181               pp[i] = xmalloc ((nbits+7)/8);
182               if (p)
183                 memcpy (pp[i], p, (nbits+7)/8);
184               else
185                 pp[i] = NULL;
186               nn[i] = (nbits+7)/8;
187               n += nn[i];
188             }
189           else
190             {
191               if (gcry_mpi_print (GCRYMPI_FMT_PGP, NULL, 0,
192                                   &nbytes, pk->pkey[i]))
193                 BUG ();
194               pp[i] = xmalloc (nbytes);
195               if (gcry_mpi_print (GCRYMPI_FMT_PGP, pp[i], nbytes,
196                                   &nbytes, pk->pkey[i]))
197                 BUG ();
198               nn[i] = nbytes;
199               n += nn[i];
200             }
201         }
202     }
203
204   gcry_md_putc ( md, 0x99 );     /* ctb */
205   /* What does it mean if n is greater than 0xFFFF ? */
206   gcry_md_putc ( md, n >> 8 );   /* 2 byte length header */
207   gcry_md_putc ( md, n );
208   gcry_md_putc ( md, pk->version );
209
210   gcry_md_putc ( md, pk->timestamp >> 24 );
211   gcry_md_putc ( md, pk->timestamp >> 16 );
212   gcry_md_putc ( md, pk->timestamp >>  8 );
213   gcry_md_putc ( md, pk->timestamp       );
214
215   gcry_md_putc ( md, pk->pubkey_algo );
216
217   if(npkey==0 && pk->pkey[0]
218      && gcry_mpi_get_flag (pk->pkey[0], GCRYMPI_FLAG_OPAQUE))
219     {
220       if (pp[0])
221         gcry_md_write (md, pp[0], nn[0]);
222     }
223   else
224     {
225       for(i=0; i < npkey; i++ )
226         {
227           if (pp[i])
228             gcry_md_write ( md, pp[i], nn[i] );
229           xfree(pp[i]);
230         }
231     }
232 }
233
234
235 static gcry_md_hd_t
236 do_fingerprint_md( PKT_public_key *pk )
237 {
238   gcry_md_hd_t md;
239
240   if (gcry_md_open (&md, DIGEST_ALGO_SHA1, 0))
241     BUG ();
242   hash_public_key(md,pk);
243   gcry_md_final( md );
244
245   return md;
246 }
247
248
249 /* fixme: Check whether we can replace this function or if not
250    describe why we need it.  */
251 u32
252 v3_keyid (gcry_mpi_t a, u32 *ki)
253 {
254   byte *buffer, *p;
255   size_t nbytes;
256
257   if (gcry_mpi_print (GCRYMPI_FMT_USG, NULL, 0, &nbytes, a ))
258     BUG ();
259   /* fixme: allocate it on the stack */
260   buffer = xmalloc (nbytes);
261   if (gcry_mpi_print( GCRYMPI_FMT_USG, buffer, nbytes, NULL, a ))
262     BUG ();
263   if (nbytes < 8) /* oops */
264     ki[0] = ki[1] = 0;
265   else
266     {
267       p = buffer + nbytes - 8;
268       ki[0] = buf32_to_u32 (p);
269       p += 4;
270       ki[1] = buf32_to_u32 (p);
271     }
272   xfree (buffer);
273   return ki[1];
274 }
275
276
277 /* Return PK's keyid.  The memory is owned by PK.  */
278 u32 *
279 pk_keyid (PKT_public_key *pk)
280 {
281   keyid_from_pk (pk, NULL);
282
283   /* Uncomment this for help tracking down bugs related to keyid or
284      main_keyid not being set correctly.  */
285 #if 0
286   if (! (pk->main_keyid[0] || pk->main_keyid[1]))
287     log_bug ("pk->main_keyid not set!\n");
288   if (keyid_cmp (pk->keyid, pk->main_keyid) == 0
289       && ! pk->flags.primary)
290     log_bug ("keyid and main_keyid are the same, but primary flag not set!\n");
291   if (keyid_cmp (pk->keyid, pk->main_keyid) != 0
292       && pk->flags.primary)
293     log_bug ("keyid and main_keyid are different, but primary flag set!\n");
294 #endif
295
296   return pk->keyid;
297 }
298
299 /* Return the keyid of the primary key associated with PK.  The memory
300    is owned by PK.  */
301 u32 *
302 pk_main_keyid (PKT_public_key *pk)
303 {
304   /* Uncomment this for help tracking down bugs related to keyid or
305      main_keyid not being set correctly.  */
306 #if 0
307   if (! (pk->main_keyid[0] || pk->main_keyid[1]))
308     log_bug ("pk->main_keyid not set!\n");
309 #endif
310
311   return pk->main_keyid;
312 }
313
314 /* Copy the keyid in SRC to DEST and return DEST.  */
315 u32 *
316 keyid_copy (u32 *dest, const u32 *src)
317 {
318   dest[0] = src[0];
319   dest[1] = src[1];
320   return dest;
321 }
322
323 char *
324 format_keyid (u32 *keyid, int format, char *buffer, int len)
325 {
326   char tmp[KEYID_STR_SIZE];
327   if (! buffer)
328     {
329       buffer = tmp;
330       len = sizeof (tmp);
331     }
332
333   if (format == KF_DEFAULT)
334     format = opt.keyid_format;
335   if (format == KF_DEFAULT)
336     format = KF_NONE;
337
338   switch (format)
339     {
340     case KF_NONE:
341       if (len)
342         *buffer = 0;
343       break;
344
345     case KF_SHORT:
346       snprintf (buffer, len, "%08lX", (ulong)keyid[1]);
347       break;
348
349     case KF_LONG:
350       snprintf (buffer, len, "%08lX%08lX", (ulong)keyid[0], (ulong)keyid[1]);
351       break;
352
353     case KF_0xSHORT:
354       snprintf (buffer, len, "0x%08lX", (ulong)keyid[1]);
355       break;
356
357     case KF_0xLONG:
358       snprintf (buffer, len, "0x%08lX%08lX", (ulong)keyid[0],(ulong)keyid[1]);
359       break;
360
361     default:
362       BUG();
363     }
364
365   if (buffer == tmp)
366     return xstrdup (buffer);
367   return buffer;
368 }
369
370 size_t
371 keystrlen(void)
372 {
373   int format = opt.keyid_format;
374   if (format == KF_DEFAULT)
375     format = KF_NONE;
376
377   switch(format)
378     {
379     case KF_NONE:
380       return 0;
381
382     case KF_SHORT:
383       return 8;
384
385     case KF_LONG:
386       return 16;
387
388     case KF_0xSHORT:
389       return 10;
390
391     case KF_0xLONG:
392       return 18;
393
394     default:
395       BUG();
396     }
397 }
398
399
400 const char *
401 keystr (u32 *keyid)
402 {
403   static char keyid_str[KEYID_STR_SIZE];
404   int format = opt.keyid_format;
405
406   if (format == KF_DEFAULT)
407     format = KF_NONE;
408   if (format == KF_NONE)
409     format = KF_LONG;
410
411   return format_keyid (keyid, format, keyid_str, sizeof (keyid_str));
412 }
413
414 /* This function returns the key id of the main and possible the
415  * subkey as one string.  It is used by error messages.  */
416 const char *
417 keystr_with_sub (u32 *main_kid, u32 *sub_kid)
418 {
419   static char buffer[KEYID_STR_SIZE+1+KEYID_STR_SIZE];
420   char *p;
421   int format = opt.keyid_format;
422
423   if (format == KF_NONE)
424     format = KF_LONG;
425
426   format_keyid (main_kid, format, buffer, KEYID_STR_SIZE);
427   if (sub_kid)
428     {
429       p = buffer + strlen (buffer);
430       *p++ = '/';
431       format_keyid (sub_kid, format, p, KEYID_STR_SIZE);
432     }
433   return buffer;
434 }
435
436
437 const char *
438 keystr_from_pk(PKT_public_key *pk)
439 {
440   keyid_from_pk(pk,NULL);
441
442   return keystr(pk->keyid);
443 }
444
445
446 const char *
447 keystr_from_pk_with_sub (PKT_public_key *main_pk, PKT_public_key *sub_pk)
448 {
449   keyid_from_pk (main_pk, NULL);
450   if (sub_pk)
451     keyid_from_pk (sub_pk, NULL);
452
453   return keystr_with_sub (main_pk->keyid, sub_pk? sub_pk->keyid:NULL);
454 }
455
456
457 /* Return PK's key id as a string using the default format.  PK owns
458    the storage.  */
459 const char *
460 pk_keyid_str (PKT_public_key *pk)
461 {
462   return keystr (pk_keyid (pk));
463 }
464
465
466 const char *
467 keystr_from_desc(KEYDB_SEARCH_DESC *desc)
468 {
469   switch(desc->mode)
470     {
471     case KEYDB_SEARCH_MODE_LONG_KID:
472     case KEYDB_SEARCH_MODE_SHORT_KID:
473       return keystr(desc->u.kid);
474
475     case KEYDB_SEARCH_MODE_FPR20:
476       {
477         u32 keyid[2];
478
479         keyid[0] = buf32_to_u32 (desc->u.fpr+12);
480         keyid[1] = buf32_to_u32 (desc->u.fpr+16);
481         return keystr(keyid);
482       }
483
484     case KEYDB_SEARCH_MODE_FPR16:
485       return "?v3 fpr?";
486
487     default:
488       BUG();
489     }
490 }
491
492
493 /*
494  * Get the keyid from the public key and put it into keyid
495  * if this is not NULL. Return the 32 low bits of the keyid.
496  */
497 u32
498 keyid_from_pk (PKT_public_key *pk, u32 *keyid)
499 {
500   u32 lowbits;
501   u32 dummy_keyid[2];
502
503   if (!keyid)
504     keyid = dummy_keyid;
505
506   if( pk->keyid[0] || pk->keyid[1] )
507     {
508       keyid[0] = pk->keyid[0];
509       keyid[1] = pk->keyid[1];
510       lowbits = keyid[1];
511     }
512   else
513     {
514       const byte *dp;
515       gcry_md_hd_t md;
516
517       md = do_fingerprint_md(pk);
518       if(md)
519         {
520           dp = gcry_md_read ( md, 0 );
521           keyid[0] = buf32_to_u32 (dp+12);
522           keyid[1] = buf32_to_u32 (dp+16);
523           lowbits = keyid[1];
524           gcry_md_close (md);
525           pk->keyid[0] = keyid[0];
526           pk->keyid[1] = keyid[1];
527         }
528       else
529         pk->keyid[0]=pk->keyid[1]=keyid[0]=keyid[1]=lowbits=0xFFFFFFFF;
530     }
531
532   return lowbits;
533 }
534
535
536 /*
537  * Get the keyid from the fingerprint.  This function is simple for
538  * most keys, but has to do a key lookup for old v3 keys where the
539  * keyid is not part of the fingerprint.
540  */
541 u32
542 keyid_from_fingerprint (ctrl_t ctrl, const byte *fprint,
543                         size_t fprint_len, u32 *keyid)
544 {
545   u32 dummy_keyid[2];
546
547   if( !keyid )
548     keyid = dummy_keyid;
549
550   if (fprint_len != 20 && fprint_len != 32)
551     {
552       /* This is special as we have to lookup the key first.  */
553       PKT_public_key pk;
554       int rc;
555
556       memset (&pk, 0, sizeof pk);
557       rc = get_pubkey_byfprint (ctrl, &pk, NULL, fprint, fprint_len);
558       if( rc )
559         {
560           log_printhex (fprint, fprint_len,
561                         "Oops: keyid_from_fingerprint: no pubkey; fpr:");
562           keyid[0] = 0;
563           keyid[1] = 0;
564         }
565       else
566         keyid_from_pk (&pk, keyid);
567     }
568   else
569     {
570       const byte *dp = fprint;
571       keyid[0] = buf32_to_u32 (dp+12);
572       keyid[1] = buf32_to_u32 (dp+16);
573     }
574
575   return keyid[1];
576 }
577
578
579 u32
580 keyid_from_sig (PKT_signature *sig, u32 *keyid)
581 {
582   if( keyid )
583     {
584       keyid[0] = sig->keyid[0];
585       keyid[1] = sig->keyid[1];
586     }
587   return sig->keyid[1];
588 }
589
590
591 byte *
592 namehash_from_uid (PKT_user_id *uid)
593 {
594   if (!uid->namehash)
595     {
596       uid->namehash = xmalloc (20);
597
598       if (uid->attrib_data)
599         rmd160_hash_buffer (uid->namehash, uid->attrib_data, uid->attrib_len);
600       else
601         rmd160_hash_buffer (uid->namehash, uid->name, uid->len);
602     }
603
604   return uid->namehash;
605 }
606
607
608 /*
609  * Return the number of bits used in PK.
610  */
611 unsigned int
612 nbits_from_pk (PKT_public_key *pk)
613 {
614     return pubkey_nbits (pk->pubkey_algo, pk->pkey);
615 }
616
617
618 /* Convert an UTC TIMESTAMP into an UTC yyyy-mm-dd string.  Return
619  * that string.  The caller should pass a buffer with at least a size
620  * of MK_DATESTR_SIZE.  */
621 char *
622 mk_datestr (char *buffer, size_t bufsize, u32 timestamp)
623 {
624   time_t atime = timestamp;
625   struct tm *tp;
626
627   if (IS_INVALID_TIME_T (atime))
628     strcpy (buffer, "????" "-??" "-??"); /* Mark this as invalid. */
629   else
630     {
631       tp = gmtime (&atime);
632       snprintf (buffer, bufsize, "%04d-%02d-%02d",
633                 1900+tp->tm_year, tp->tm_mon+1, tp->tm_mday );
634     }
635   return buffer;
636 }
637
638
639 /*
640  * return a string with the creation date of the pk
641  * Note: this is alloced in a static buffer.
642  *    Format is: yyyy-mm-dd
643  */
644 const char *
645 datestr_from_pk (PKT_public_key *pk)
646 {
647   static char buffer[MK_DATESTR_SIZE];
648
649   return mk_datestr (buffer, sizeof buffer, pk->timestamp);
650 }
651
652
653 const char *
654 datestr_from_sig (PKT_signature *sig )
655 {
656   static char buffer[MK_DATESTR_SIZE];
657
658   return mk_datestr (buffer, sizeof buffer, sig->timestamp);
659 }
660
661
662 const char *
663 expirestr_from_pk (PKT_public_key *pk)
664 {
665   static char buffer[MK_DATESTR_SIZE];
666
667   if (!pk->expiredate)
668     return _("never     ");
669   return mk_datestr (buffer, sizeof buffer, pk->expiredate);
670 }
671
672
673 const char *
674 expirestr_from_sig (PKT_signature *sig)
675 {
676   static char buffer[MK_DATESTR_SIZE];
677
678   if (!sig->expiredate)
679     return _("never     ");
680   return mk_datestr (buffer, sizeof buffer, sig->expiredate);
681 }
682
683
684 const char *
685 revokestr_from_pk( PKT_public_key *pk )
686 {
687   static char buffer[MK_DATESTR_SIZE];
688
689   if(!pk->revoked.date)
690     return _("never     ");
691   return mk_datestr (buffer, sizeof buffer, pk->revoked.date);
692 }
693
694
695 const char *
696 usagestr_from_pk (PKT_public_key *pk, int fill)
697 {
698   static char buffer[10];
699   int i = 0;
700   unsigned int use = pk->pubkey_usage;
701
702   if ( use & PUBKEY_USAGE_SIG )
703     buffer[i++] = 'S';
704
705   if ( use & PUBKEY_USAGE_CERT )
706     buffer[i++] = 'C';
707
708   if ( use & PUBKEY_USAGE_ENC )
709     buffer[i++] = 'E';
710
711   if ( (use & PUBKEY_USAGE_AUTH) )
712     buffer[i++] = 'A';
713
714   while (fill && i < 4)
715     buffer[i++] = ' ';
716
717   buffer[i] = 0;
718   return buffer;
719 }
720
721
722 const char *
723 colon_strtime (u32 t)
724 {
725   static char buf[20];
726
727   if (!t)
728     return "";
729   snprintf (buf, sizeof buf, "%lu", (ulong)t);
730   return buf;
731 }
732
733 const char *
734 colon_datestr_from_pk (PKT_public_key *pk)
735 {
736   static char buf[20];
737
738   snprintf (buf, sizeof buf, "%lu", (ulong)pk->timestamp);
739   return buf;
740 }
741
742
743 const char *
744 colon_datestr_from_sig (PKT_signature *sig)
745 {
746   static char buf[20];
747
748   snprintf (buf, sizeof buf, "%lu", (ulong)sig->timestamp);
749   return buf;
750 }
751
752 const char *
753 colon_expirestr_from_sig (PKT_signature *sig)
754 {
755   static char buf[20];
756
757   if (!sig->expiredate)
758     return "";
759
760   snprintf (buf, sizeof buf,"%lu", (ulong)sig->expiredate);
761   return buf;
762 }
763
764
765 /*
766  * Return a byte array with the fingerprint for the given PK/SK
767  * The length of the array is returned in ret_len. Caller must free
768  * the array or provide an array of length MAX_FINGERPRINT_LEN.
769  */
770 byte *
771 fingerprint_from_pk (PKT_public_key *pk, byte *array, size_t *ret_len)
772 {
773   const byte *dp;
774   size_t len;
775   gcry_md_hd_t md;
776
777   md = do_fingerprint_md(pk);
778   dp = gcry_md_read( md, 0 );
779   len = gcry_md_get_algo_dlen (gcry_md_get_algo (md));
780   log_assert( len <= MAX_FINGERPRINT_LEN );
781   if (!array)
782     array = xmalloc ( len );
783   memcpy (array, dp, len );
784   pk->keyid[0] = buf32_to_u32 (dp+12);
785   pk->keyid[1] = buf32_to_u32 (dp+16);
786   gcry_md_close( md);
787
788   if (ret_len)
789     *ret_len = len;
790   return array;
791 }
792
793
794 /* Return an allocated buffer with the fingerprint of PK formatted as
795  * a plain hexstring.  If BUFFER is NULL the result is a malloc'd
796  * string.  If BUFFER is not NULL the result will be copied into this
797  * buffer.  In the latter case BUFLEN describes the length of the
798  * buffer; if this is too short the function terminates the process.
799  * Returns a malloc'ed string or BUFFER.  A suitable length for BUFFER
800  * is (2*MAX_FINGERPRINT_LEN + 1). */
801 char *
802 hexfingerprint (PKT_public_key *pk, char *buffer, size_t buflen)
803 {
804   unsigned char fpr[MAX_FINGERPRINT_LEN];
805   size_t len;
806
807   fingerprint_from_pk (pk, fpr, &len);
808   if (!buffer)
809     {
810       buffer = xtrymalloc (2 * len + 1);
811       if (!buffer)
812         return NULL;
813     }
814   else if (buflen < 2*len+1)
815     log_fatal ("%s: buffer too short (%zu)\n", __func__, buflen);
816   bin2hex (fpr, len, buffer);
817   return buffer;
818 }
819
820
821 /* Pretty print a hex fingerprint.  If BUFFER is NULL the result is a
822    malloc'd string.  If BUFFER is not NULL the result will be copied
823    into this buffer.  In the latter case BUFLEN describes the length
824    of the buffer; if this is too short the function terminates the
825    process.  Returns a malloc'ed string or BUFFER.  A suitable length
826    for BUFFER is (MAX_FORMATTED_FINGERPRINT_LEN + 1).  */
827 char *
828 format_hexfingerprint (const char *fingerprint, char *buffer, size_t buflen)
829 {
830   int hexlen = strlen (fingerprint);
831   int space;
832   int i, j;
833
834   if (hexlen == 40)  /* v4 fingerprint */
835     {
836       space = (/* The characters and the NUL.  */
837                40 + 1
838                /* After every fourth character, we add a space (except
839                   the last).  */
840                + 40 / 4 - 1
841                /* Half way through we add a second space.  */
842                + 1);
843     }
844   else if (hexlen == 64 || hexlen == 50)  /* v5 fingerprint */
845     {
846       /* The v5 fingerprint is commonly printed truncated to 25
847        * octets.  We accept the truncated as well as the full hex
848        * version here and format it like this:
849        * B2CCB6 838332 5D61BA C50F9F 5E CD21A8 0AC8C5 2565C8 C52565
850        */
851       hexlen = 50;
852       space = 8 * 6 + 2 + 8 + 1;
853     }
854   else  /* Other fingerprint versions - print as is.  */
855     {
856       /* We truncated here so that we do not need to provide a buffer
857        * of a length which is in reality never used.  */
858       if (hexlen > MAX_FORMATTED_FINGERPRINT_LEN - 1)
859         hexlen = MAX_FORMATTED_FINGERPRINT_LEN - 1;
860       space = hexlen + 1;
861     }
862
863   if (!buffer)
864     buffer = xmalloc (space);
865   else if (buflen < space)
866     log_fatal ("%s: buffer too short (%zu)\n", __func__, buflen);
867
868   if (hexlen == 40)  /* v4 fingerprint */
869     {
870       for (i = 0, j = 0; i < 40; i ++)
871         {
872           if (i && !(i % 4))
873             buffer[j ++] = ' ';
874           if (i == 40 / 2)
875             buffer[j ++] = ' ';
876
877           buffer[j ++] = fingerprint[i];
878         }
879       buffer[j ++] = 0;
880       log_assert (j == space);
881     }
882   else if (hexlen == 50)  /* v5 fingerprint */
883     {
884       for (i=j=0; i < 24; i++)
885         {
886           if (i && !(i % 6))
887             buffer[j++] = ' ';
888           buffer[j++] = fingerprint[i];
889         }
890       buffer[j++] = ' ';
891       buffer[j++] = fingerprint[i++];
892       buffer[j++] = fingerprint[i++];
893       for (; i < 50; i++)
894         {
895           if (!((i-26) % 6))
896             buffer[j++] = ' ';
897           buffer[j++] = fingerprint[i];
898         }
899       buffer[j++] = 0;
900       log_assert (j == space);
901     }
902   else
903     {
904       mem2str (buffer, fingerprint, space);
905     }
906
907   return buffer;
908 }
909
910
911 \f
912 /* Return the so called KEYGRIP which is the SHA-1 hash of the public
913    key parameters expressed as an canoncial encoded S-Exp.  ARRAY must
914    be 20 bytes long.  Returns 0 on success or an error code.  */
915 gpg_error_t
916 keygrip_from_pk (PKT_public_key *pk, unsigned char *array)
917 {
918   gpg_error_t err;
919   gcry_sexp_t s_pkey;
920
921   if (DBG_PACKET)
922     log_debug ("get_keygrip for public key\n");
923
924   switch (pk->pubkey_algo)
925     {
926     case GCRY_PK_DSA:
927       err = gcry_sexp_build (&s_pkey, NULL,
928                              "(public-key(dsa(p%m)(q%m)(g%m)(y%m)))",
929                              pk->pkey[0], pk->pkey[1],
930                              pk->pkey[2], pk->pkey[3]);
931       break;
932
933     case GCRY_PK_ELG:
934     case GCRY_PK_ELG_E:
935       err = gcry_sexp_build (&s_pkey, NULL,
936                              "(public-key(elg(p%m)(g%m)(y%m)))",
937                              pk->pkey[0], pk->pkey[1], pk->pkey[2]);
938       break;
939
940     case GCRY_PK_RSA:
941     case GCRY_PK_RSA_S:
942     case GCRY_PK_RSA_E:
943       err = gcry_sexp_build (&s_pkey, NULL,
944                              "(public-key(rsa(n%m)(e%m)))",
945                              pk->pkey[0], pk->pkey[1]);
946       break;
947
948     case PUBKEY_ALGO_EDDSA:
949     case PUBKEY_ALGO_ECDSA:
950     case PUBKEY_ALGO_ECDH:
951       {
952         char *curve = openpgp_oid_to_str (pk->pkey[0]);
953         if (!curve)
954           err = gpg_error_from_syserror ();
955         else
956           {
957             err = gcry_sexp_build (&s_pkey, NULL,
958                                    pk->pubkey_algo == PUBKEY_ALGO_EDDSA?
959                                    "(public-key(ecc(curve%s)(flags eddsa)(q%m)))":
960                                    (pk->pubkey_algo == PUBKEY_ALGO_ECDH
961                                     && openpgp_oid_is_cv25519 (pk->pkey[0]))?
962                                    "(public-key(ecc(curve%s)(flags djb-tweak)(q%m)))":
963                                    "(public-key(ecc(curve%s)(q%m)))",
964                                    curve, pk->pkey[1]);
965             xfree (curve);
966           }
967       }
968       break;
969
970     default:
971       err = gpg_error (GPG_ERR_PUBKEY_ALGO);
972       break;
973     }
974
975   if (err)
976     return err;
977
978   if (!gcry_pk_get_keygrip (s_pkey, array))
979     {
980       char *hexfpr;
981
982       hexfpr = hexfingerprint (pk, NULL, 0);
983       log_info ("error computing keygrip (fpr=%s)\n", hexfpr);
984       xfree (hexfpr);
985
986       memset (array, 0, 20);
987       err = gpg_error (GPG_ERR_GENERAL);
988     }
989   else
990     {
991       if (DBG_PACKET)
992         log_printhex (array, 20, "keygrip=");
993       /* FIXME: Save the keygrip in PK.  */
994     }
995   gcry_sexp_release (s_pkey);
996
997   return err;
998 }
999
1000
1001 /* Store an allocated buffer with the keygrip of PK encoded as a
1002    hexstring at r_GRIP.  Returns 0 on success.  */
1003 gpg_error_t
1004 hexkeygrip_from_pk (PKT_public_key *pk, char **r_grip)
1005 {
1006   gpg_error_t err;
1007   unsigned char grip[KEYGRIP_LEN];
1008
1009   *r_grip = NULL;
1010   err = keygrip_from_pk (pk, grip);
1011   if (!err)
1012     {
1013       char * buf = xtrymalloc (KEYGRIP_LEN * 2 + 1);
1014       if (!buf)
1015         err = gpg_error_from_syserror ();
1016       else
1017         {
1018           bin2hex (grip, KEYGRIP_LEN, buf);
1019           *r_grip = buf;
1020         }
1021     }
1022   return err;
1023 }