gpg: Fix format_keyid when dynamically allocating the buffer.
[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  *
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 <http://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 #include <time.h>
28 #include <assert.h>
29
30 #include "gpg.h"
31 #include "util.h"
32 #include "main.h"
33 #include "packet.h"
34 #include "options.h"
35 #include "keydb.h"
36 #include "i18n.h"
37 #include "rmd160.h"
38 #include "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    "rsa2048"  - RSA with 2048 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    "2048R" - RSA with 2048 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 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 char *
278 format_keyid (u32 *keyid, int format, char *buffer, int len)
279 {
280   char tmp[KEYID_STR_SIZE];
281   if (! buffer)
282     {
283       buffer = tmp;
284       len = sizeof (tmp);
285     }
286
287   if (format == KF_DEFAULT)
288     format = opt.keyid_format;
289   if (format == KF_DEFAULT)
290     format = KF_SHORT;
291
292   switch (format)
293     {
294     case KF_SHORT:
295       snprintf (buffer, len, "%08lX", (ulong)keyid[1]);
296       break;
297
298     case KF_LONG:
299       if (keyid[0])
300         snprintf (buffer, len, "%08lX%08lX",
301                   (ulong)keyid[0], (ulong)keyid[1]);
302       else
303         snprintf (buffer, len, "%08lX", (ulong)keyid[1]);
304       break;
305
306     case KF_0xSHORT:
307       snprintf (buffer, len, "0x%08lX", (ulong)keyid[1]);
308       break;
309
310     case KF_0xLONG:
311       if(keyid[0])
312         snprintf (buffer, len, "0x%08lX%08lX",
313                   (ulong)keyid[0],(ulong)keyid[1]);
314       else
315         snprintf (buffer, len, "0x%08lX", (ulong)keyid[1]);
316       break;
317
318     default:
319       BUG();
320     }
321
322   if (buffer == tmp)
323     return xstrdup (buffer);
324   return buffer;
325 }
326
327 size_t
328 keystrlen(void)
329 {
330   int format = opt.keyid_format;
331   if (format == KF_DEFAULT)
332     format = KF_SHORT;
333
334   switch(format)
335     {
336     case KF_SHORT:
337       return 8;
338
339     case KF_LONG:
340       return 16;
341
342     case KF_0xSHORT:
343       return 10;
344
345     case KF_0xLONG:
346       return 18;
347
348     default:
349       BUG();
350     }
351 }
352
353
354 const char *
355 keystr (u32 *keyid)
356 {
357   static char keyid_str[KEYID_STR_SIZE];
358   return format_keyid (keyid, opt.keyid_format, keyid_str, sizeof (keyid_str));
359 }
360
361
362 const char *
363 keystr_with_sub (u32 *main_kid, u32 *sub_kid)
364 {
365   static char buffer[KEYID_STR_SIZE+1+KEYID_STR_SIZE];
366   char *p;
367
368   mem2str (buffer, keystr (main_kid), KEYID_STR_SIZE);
369   if (sub_kid)
370     {
371       p = buffer + strlen (buffer);
372       *p++ = '/';
373       mem2str (p, keystr (sub_kid), KEYID_STR_SIZE);
374     }
375   return buffer;
376 }
377
378
379 const char *
380 keystr_from_pk(PKT_public_key *pk)
381 {
382   keyid_from_pk(pk,NULL);
383
384   return keystr(pk->keyid);
385 }
386
387
388 const char *
389 keystr_from_pk_with_sub (PKT_public_key *main_pk, PKT_public_key *sub_pk)
390 {
391   keyid_from_pk (main_pk, NULL);
392   if (sub_pk)
393     keyid_from_pk (sub_pk, NULL);
394
395   return keystr_with_sub (main_pk->keyid, sub_pk? sub_pk->keyid:NULL);
396 }
397
398
399
400 const char *
401 keystr_from_desc(KEYDB_SEARCH_DESC *desc)
402 {
403   switch(desc->mode)
404     {
405     case KEYDB_SEARCH_MODE_LONG_KID:
406     case KEYDB_SEARCH_MODE_SHORT_KID:
407       return keystr(desc->u.kid);
408
409     case KEYDB_SEARCH_MODE_FPR20:
410       {
411         u32 keyid[2];
412
413         keyid[0] = buf32_to_u32 (desc->u.fpr+12);
414         keyid[1] = buf32_to_u32 (desc->u.fpr+16);
415         return keystr(keyid);
416       }
417
418     case KEYDB_SEARCH_MODE_FPR16:
419       return "?v3 fpr?";
420
421     default:
422       BUG();
423     }
424 }
425
426
427 /*
428  * Get the keyid from the public key and put it into keyid
429  * if this is not NULL. Return the 32 low bits of the keyid.
430  */
431 u32
432 keyid_from_pk (PKT_public_key *pk, u32 *keyid)
433 {
434   u32 lowbits;
435   u32 dummy_keyid[2];
436
437   if (!keyid)
438     keyid = dummy_keyid;
439
440   if( pk->keyid[0] || pk->keyid[1] )
441     {
442       keyid[0] = pk->keyid[0];
443       keyid[1] = pk->keyid[1];
444       lowbits = keyid[1];
445     }
446   else
447     {
448       const byte *dp;
449       gcry_md_hd_t md;
450
451       md = do_fingerprint_md(pk);
452       if(md)
453         {
454           dp = gcry_md_read ( md, 0 );
455           keyid[0] = buf32_to_u32 (dp+12);
456           keyid[1] = buf32_to_u32 (dp+16);
457           lowbits = keyid[1];
458           gcry_md_close (md);
459           pk->keyid[0] = keyid[0];
460           pk->keyid[1] = keyid[1];
461         }
462       else
463         pk->keyid[0]=pk->keyid[1]=keyid[0]=keyid[1]=lowbits=0xFFFFFFFF;
464     }
465
466   return lowbits;
467 }
468
469
470 /*
471  * Get the keyid from the fingerprint.  This function is simple for most
472  * keys, but has to do a keylookup for old stayle keys.
473  */
474 u32
475 keyid_from_fingerprint( const byte *fprint, size_t fprint_len, u32 *keyid )
476 {
477   u32 dummy_keyid[2];
478
479   if( !keyid )
480     keyid = dummy_keyid;
481
482   if (fprint_len != 20)
483     {
484       /* This is special as we have to lookup the key first.  */
485       PKT_public_key pk;
486       int rc;
487
488       memset (&pk, 0, sizeof pk);
489       rc = get_pubkey_byfprint (&pk, NULL, fprint, fprint_len);
490       if( rc )
491         {
492           log_error("Oops: keyid_from_fingerprint: no pubkey\n");
493           keyid[0] = 0;
494           keyid[1] = 0;
495         }
496       else
497         keyid_from_pk (&pk, keyid);
498     }
499   else
500     {
501       const byte *dp = fprint;
502       keyid[0] = buf32_to_u32 (dp+12);
503       keyid[1] = buf32_to_u32 (dp+16);
504     }
505
506   return keyid[1];
507 }
508
509
510 u32
511 keyid_from_sig (PKT_signature *sig, u32 *keyid)
512 {
513   if( keyid )
514     {
515       keyid[0] = sig->keyid[0];
516       keyid[1] = sig->keyid[1];
517     }
518   return sig->keyid[1];
519 }
520
521
522 byte *
523 namehash_from_uid (PKT_user_id *uid)
524 {
525   if (!uid->namehash)
526     {
527       uid->namehash = xmalloc (20);
528
529       if (uid->attrib_data)
530         rmd160_hash_buffer (uid->namehash, uid->attrib_data, uid->attrib_len);
531       else
532         rmd160_hash_buffer (uid->namehash, uid->name, uid->len);
533     }
534
535   return uid->namehash;
536 }
537
538
539 /*
540  * Return the number of bits used in PK.
541  */
542 unsigned int
543 nbits_from_pk (PKT_public_key *pk)
544 {
545     return pubkey_nbits (pk->pubkey_algo, pk->pkey);
546 }
547
548
549 static const char *
550 mk_datestr (char *buffer, time_t atime)
551 {
552   struct tm *tp;
553
554   if (IS_INVALID_TIME_T (atime))
555     strcpy (buffer, "????" "-??" "-??"); /* Mark this as invalid. */
556   else
557     {
558       tp = gmtime (&atime);
559       sprintf (buffer,"%04d-%02d-%02d",
560                1900+tp->tm_year, tp->tm_mon+1, tp->tm_mday );
561     }
562   return buffer;
563 }
564
565
566 /*
567  * return a string with the creation date of the pk
568  * Note: this is alloced in a static buffer.
569  *    Format is: yyyy-mm-dd
570  */
571 const char *
572 datestr_from_pk (PKT_public_key *pk)
573 {
574   static char buffer[11+5];
575   time_t atime = pk->timestamp;
576
577   return mk_datestr (buffer, atime);
578 }
579
580
581 const char *
582 datestr_from_sig (PKT_signature *sig )
583 {
584   static char buffer[11+5];
585   time_t atime = sig->timestamp;
586
587   return mk_datestr (buffer, atime);
588 }
589
590
591 const char *
592 expirestr_from_pk (PKT_public_key *pk)
593 {
594   static char buffer[11+5];
595   time_t atime;
596
597   if (!pk->expiredate)
598     return _("never     ");
599   atime = pk->expiredate;
600   return mk_datestr (buffer, atime);
601 }
602
603
604 const char *
605 expirestr_from_sig (PKT_signature *sig)
606 {
607   static char buffer[11+5];
608   time_t atime;
609
610   if (!sig->expiredate)
611     return _("never     ");
612   atime=sig->expiredate;
613   return mk_datestr (buffer, atime);
614 }
615
616
617 const char *
618 revokestr_from_pk( PKT_public_key *pk )
619 {
620   static char buffer[11+5];
621   time_t atime;
622
623   if(!pk->revoked.date)
624     return _("never     ");
625   atime=pk->revoked.date;
626   return mk_datestr (buffer, atime);
627 }
628
629
630 const char *
631 usagestr_from_pk (PKT_public_key *pk, int fill)
632 {
633   static char buffer[10];
634   int i = 0;
635   unsigned int use = pk->pubkey_usage;
636
637   if ( use & PUBKEY_USAGE_SIG )
638     buffer[i++] = 'S';
639
640   if ( use & PUBKEY_USAGE_CERT )
641     buffer[i++] = 'C';
642
643   if ( use & PUBKEY_USAGE_ENC )
644     buffer[i++] = 'E';
645
646   if ( (use & PUBKEY_USAGE_AUTH) )
647     buffer[i++] = 'A';
648
649   while (fill && i < 4)
650     buffer[i++] = ' ';
651
652   buffer[i] = 0;
653   return buffer;
654 }
655
656
657 const char *
658 colon_strtime (u32 t)
659 {
660   static char buf[20];
661
662   if (!t)
663     return "";
664   snprintf (buf, sizeof buf, "%lu", (ulong)t);
665   return buf;
666 }
667
668 const char *
669 colon_datestr_from_pk (PKT_public_key *pk)
670 {
671   static char buf[20];
672
673   snprintf (buf, sizeof buf, "%lu", (ulong)pk->timestamp);
674   return buf;
675 }
676
677
678 const char *
679 colon_datestr_from_sig (PKT_signature *sig)
680 {
681   static char buf[20];
682
683   snprintf (buf, sizeof buf, "%lu", (ulong)sig->timestamp);
684   return buf;
685 }
686
687 const char *
688 colon_expirestr_from_sig (PKT_signature *sig)
689 {
690   static char buf[20];
691
692   if (!sig->expiredate)
693     return "";
694
695   snprintf (buf, sizeof buf,"%lu", (ulong)sig->expiredate);
696   return buf;
697 }
698
699
700 /*
701  * Return a byte array with the fingerprint for the given PK/SK
702  * The length of the array is returned in ret_len. Caller must free
703  * the array or provide an array of length MAX_FINGERPRINT_LEN.
704  */
705 byte *
706 fingerprint_from_pk (PKT_public_key *pk, byte *array, size_t *ret_len)
707 {
708   const byte *dp;
709   size_t len;
710   gcry_md_hd_t md;
711
712   md = do_fingerprint_md(pk);
713   dp = gcry_md_read( md, 0 );
714   len = gcry_md_get_algo_dlen (gcry_md_get_algo (md));
715   assert( len <= MAX_FINGERPRINT_LEN );
716   if (!array)
717     array = xmalloc ( len );
718   memcpy (array, dp, len );
719   pk->keyid[0] = buf32_to_u32 (dp+12);
720   pk->keyid[1] = buf32_to_u32 (dp+16);
721   gcry_md_close( md);
722
723   if (ret_len)
724     *ret_len = len;
725   return array;
726 }
727
728
729 /* Return an allocated buffer with the fingerprint of PK formatted as
730    a plain hexstring.  If BUFFER is NULL the result is a malloc'd
731    string.  If BUFFER is not NULL the result will be copied into this
732    buffer.  In the latter case BUFLEN describes the length of the
733    buffer; if this is too short the function terminates the process.
734    Returns a malloc'ed string or BUFFER.  A suitable length for BUFFER
735    is (2*MAX_FINGERPRINT_LEN + 1). */
736 char *
737 hexfingerprint (PKT_public_key *pk, char *buffer, size_t buflen)
738 {
739   unsigned char fpr[MAX_FINGERPRINT_LEN];
740   size_t len;
741
742   fingerprint_from_pk (pk, fpr, &len);
743   if (!buffer)
744     buffer = xmalloc (2 * len + 1);
745   else if (buflen < 2*len+1)
746     log_fatal ("%s: buffer too short (%zu)\n", __func__, buflen);
747   bin2hex (fpr, len, buffer);
748   return buffer;
749 }
750
751
752 /* Pretty print a hex fingerprint.  If BUFFER is NULL the result is a
753    malloc'd string.  If BUFFER is not NULL the result will be copied
754    into this buffer.  In the latter case BUFLEN describes the length
755    of the buffer; if this is too short the function terminates the
756    process.  Returns a malloc'ed string or BUFFER.  A suitable length
757    for BUFFER is (MAX_FORMATTED_FINGERPRINT_LEN + 1).  */
758 char *
759 format_hexfingerprint (const char *fingerprint, char *buffer, size_t buflen)
760 {
761   int hexlen = strlen (fingerprint);
762   int space;
763   int i, j;
764
765   if (hexlen == 40)  /* v4 fingerprint */
766     {
767       space = (/* The characters and the NUL.  */
768                40 + 1
769                /* After every fourth character, we add a space (except
770                   the last).  */
771                + 40 / 4 - 1
772                /* Half way through we add a second space.  */
773                + 1);
774     }
775   else  /* Other fingerprint versions - print as is.  */
776     {
777       space = hexlen + 1;
778     }
779
780   if (!buffer)
781     buffer = xmalloc (space);
782   else if (buflen < space)
783     log_fatal ("%s: buffer too short (%zu)\n", __func__, buflen);
784
785   if (hexlen == 40)  /* v4 fingerprint */
786     {
787       for (i = 0, j = 0; i < 40; i ++)
788         {
789           if (i && i % 4 == 0)
790             buffer[j ++] = ' ';
791           if (i == 40 / 2)
792             buffer[j ++] = ' ';
793
794           buffer[j ++] = fingerprint[i];
795         }
796       buffer[j ++] = 0;
797       assert (j == space);
798     }
799   else
800     {
801       strcpy (buffer, fingerprint);
802     }
803
804   return buffer;
805 }
806
807
808 \f
809 /* Return the so called KEYGRIP which is the SHA-1 hash of the public
810    key parameters expressed as an canoncial encoded S-Exp.  ARRAY must
811    be 20 bytes long.  Returns 0 on success or an error code.  */
812 gpg_error_t
813 keygrip_from_pk (PKT_public_key *pk, unsigned char *array)
814 {
815   gpg_error_t err;
816   gcry_sexp_t s_pkey;
817
818   if (DBG_PACKET)
819     log_debug ("get_keygrip for public key\n");
820
821   switch (pk->pubkey_algo)
822     {
823     case GCRY_PK_DSA:
824       err = gcry_sexp_build (&s_pkey, NULL,
825                              "(public-key(dsa(p%m)(q%m)(g%m)(y%m)))",
826                              pk->pkey[0], pk->pkey[1],
827                              pk->pkey[2], pk->pkey[3]);
828       break;
829
830     case GCRY_PK_ELG:
831     case GCRY_PK_ELG_E:
832       err = gcry_sexp_build (&s_pkey, NULL,
833                              "(public-key(elg(p%m)(g%m)(y%m)))",
834                              pk->pkey[0], pk->pkey[1], pk->pkey[2]);
835       break;
836
837     case GCRY_PK_RSA:
838     case GCRY_PK_RSA_S:
839     case GCRY_PK_RSA_E:
840       err = gcry_sexp_build (&s_pkey, NULL,
841                              "(public-key(rsa(n%m)(e%m)))",
842                              pk->pkey[0], pk->pkey[1]);
843       break;
844
845     case PUBKEY_ALGO_EDDSA:
846     case PUBKEY_ALGO_ECDSA:
847     case PUBKEY_ALGO_ECDH:
848       {
849         char *curve = openpgp_oid_to_str (pk->pkey[0]);
850         if (!curve)
851           err = gpg_error_from_syserror ();
852         else
853           {
854             err = gcry_sexp_build (&s_pkey, NULL,
855                                    pk->pubkey_algo == PUBKEY_ALGO_EDDSA?
856                                    "(public-key(ecc(curve%s)(flags eddsa)(q%m)))":
857                                    (pk->pubkey_algo == PUBKEY_ALGO_ECDH
858                                     && openpgp_oid_is_crv25519 (pk->pkey[0]))?
859                                    "(public-key(ecc(curve%s)(flags djb-tweak)(q%m)))":
860                                    "(public-key(ecc(curve%s)(q%m)))",
861                                    curve, pk->pkey[1]);
862             xfree (curve);
863           }
864       }
865       break;
866
867     default:
868       err = gpg_error (GPG_ERR_PUBKEY_ALGO);
869       break;
870     }
871
872   if (err)
873     return err;
874
875   if (!gcry_pk_get_keygrip (s_pkey, array))
876     {
877       log_info ("error computing keygrip\n");
878       memset (array, 0, 20);
879       err = gpg_error (GPG_ERR_GENERAL);
880     }
881   else
882     {
883       if (DBG_PACKET)
884         log_printhex ("keygrip=", array, 20);
885       /* FIXME: Save the keygrip in PK.  */
886     }
887   gcry_sexp_release (s_pkey);
888
889   return err;
890 }
891
892
893 /* Store an allocated buffer with the keygrip of PK encoded as a
894    hexstring at r_GRIP.  Returns 0 on success.  */
895 gpg_error_t
896 hexkeygrip_from_pk (PKT_public_key *pk, char **r_grip)
897 {
898   gpg_error_t err;
899   unsigned char grip[20];
900
901   *r_grip = NULL;
902   err = keygrip_from_pk (pk, grip);
903   if (!err)
904     {
905       char * buf = xtrymalloc (20*2+1);
906       if (!buf)
907         err = gpg_error_from_syserror ();
908       else
909         {
910           bin2hex (grip, 20, buf);
911           *r_grip = buf;
912         }
913     }
914   return err;
915 }