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