gpgv,w32: Fix --status-fd.
[gnupg.git] / g10 / keyid.c
index f684276..6e8d97f 100644 (file)
@@ -2,6 +2,7 @@
  * Copyright (C) 1998, 1999, 2000, 2001, 2003,
  *               2004, 2006, 2010 Free Software Foundation, Inc.
  * Copyright (C) 2014 Werner Koch
+ * Copyright (C) 2016 g10 Code GmbH
  *
  * This file is part of GnuPG.
  *
@@ -16,7 +17,7 @@
  * GNU General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License
- * along with this program; if not, see <http://www.gnu.org/licenses/>.
+ * along with this program; if not, see <https://www.gnu.org/licenses/>.
  */
 
 #include <config.h>
@@ -25,7 +26,6 @@
 #include <string.h>
 #include <errno.h>
 #include <time.h>
-#include <assert.h>
 
 #include "gpg.h"
 #include "util.h"
@@ -202,7 +202,7 @@ hash_public_key (gcry_md_hd_t md, PKT_public_key *pk)
     }
 
   gcry_md_putc ( md, 0x99 );     /* ctb */
-  /* What does it mean if n is greater than than 0xFFFF ? */
+  /* What does it mean if n is greater than 0xFFFF ? */
   gcry_md_putc ( md, n >> 8 );   /* 2 byte length header */
   gcry_md_putc ( md, n );
   gcry_md_putc ( md, pk->version );
@@ -274,30 +274,80 @@ v3_keyid (gcry_mpi_t a, u32 *ki)
 }
 
 
-const char *
+/* Return PK's keyid.  The memory is owned by PK.  */
+u32 *
+pk_keyid (PKT_public_key *pk)
+{
+  keyid_from_pk (pk, NULL);
+
+  /* Uncomment this for help tracking down bugs related to keyid or
+     main_keyid not being set correctly.  */
+#if 0
+  if (! (pk->main_keyid[0] || pk->main_keyid[1]))
+    log_bug ("pk->main_keyid not set!\n");
+  if (keyid_cmp (pk->keyid, pk->main_keyid) == 0
+      && ! pk->flags.primary)
+    log_bug ("keyid and main_keyid are the same, but primary flag not set!\n");
+  if (keyid_cmp (pk->keyid, pk->main_keyid) != 0
+      && pk->flags.primary)
+    log_bug ("keyid and main_keyid are different, but primary flag set!\n");
+#endif
+
+  return pk->keyid;
+}
+
+/* Return the keyid of the primary key associated with PK.  The memory
+   is owned by PK.  */
+u32 *
+pk_main_keyid (PKT_public_key *pk)
+{
+  /* Uncomment this for help tracking down bugs related to keyid or
+     main_keyid not being set correctly.  */
+#if 0
+  if (! (pk->main_keyid[0] || pk->main_keyid[1]))
+    log_bug ("pk->main_keyid not set!\n");
+#endif
+
+  return pk->main_keyid;
+}
+
+/* Copy the keyid in SRC to DEST and return DEST.  */
+u32 *
+keyid_copy (u32 *dest, const u32 *src)
+{
+  dest[0] = src[0];
+  dest[1] = src[1];
+  return dest;
+}
+
+char *
 format_keyid (u32 *keyid, int format, char *buffer, int len)
 {
   char tmp[KEYID_STR_SIZE];
   if (! buffer)
-    buffer = tmp;
+    {
+      buffer = tmp;
+      len = sizeof (tmp);
+    }
 
   if (format == KF_DEFAULT)
     format = opt.keyid_format;
   if (format == KF_DEFAULT)
-    format = KF_SHORT;
+    format = KF_NONE;
 
   switch (format)
     {
+    case KF_NONE:
+      if (len)
+        *buffer = 0;
+      break;
+
     case KF_SHORT:
       snprintf (buffer, len, "%08lX", (ulong)keyid[1]);
       break;
 
     case KF_LONG:
-      if (keyid[0])
-       snprintf (buffer, len, "%08lX%08lX",
-                  (ulong)keyid[0], (ulong)keyid[1]);
-      else
-       snprintf (buffer, len, "%08lX", (ulong)keyid[1]);
+      snprintf (buffer, len, "%08lX%08lX", (ulong)keyid[0], (ulong)keyid[1]);
       break;
 
     case KF_0xSHORT:
@@ -305,11 +355,7 @@ format_keyid (u32 *keyid, int format, char *buffer, int len)
       break;
 
     case KF_0xLONG:
-      if(keyid[0])
-       snprintf (buffer, len, "0x%08lX%08lX",
-                  (ulong)keyid[0],(ulong)keyid[1]);
-      else
-       snprintf (buffer, len, "0x%08lX", (ulong)keyid[1]);
+      snprintf (buffer, len, "0x%08lX%08lX", (ulong)keyid[0],(ulong)keyid[1]);
       break;
 
     default:
@@ -326,10 +372,13 @@ keystrlen(void)
 {
   int format = opt.keyid_format;
   if (format == KF_DEFAULT)
-    format = KF_SHORT;
+    format = KF_NONE;
 
   switch(format)
     {
+    case KF_NONE:
+      return 0;
+
     case KF_SHORT:
       return 8;
 
@@ -352,22 +401,34 @@ const char *
 keystr (u32 *keyid)
 {
   static char keyid_str[KEYID_STR_SIZE];
-  return format_keyid (keyid, opt.keyid_format, keyid_str, sizeof (keyid_str));
-}
+  int format = opt.keyid_format;
 
+  if (format == KF_DEFAULT)
+    format = KF_NONE;
+  if (format == KF_NONE)
+    format = KF_LONG;
 
+  return format_keyid (keyid, format, keyid_str, sizeof (keyid_str));
+}
+
+/* This function returns the key id of the main and possible the
+ * subkey as one string.  It is used by error messages.  */
 const char *
 keystr_with_sub (u32 *main_kid, u32 *sub_kid)
 {
   static char buffer[KEYID_STR_SIZE+1+KEYID_STR_SIZE];
   char *p;
+  int format = opt.keyid_format;
+
+  if (format == KF_NONE)
+    format = KF_LONG;
 
-  mem2str (buffer, keystr (main_kid), KEYID_STR_SIZE);
+  format_keyid (main_kid, format, buffer, KEYID_STR_SIZE);
   if (sub_kid)
     {
       p = buffer + strlen (buffer);
       *p++ = '/';
-      mem2str (p, keystr (sub_kid), KEYID_STR_SIZE);
+      format_keyid (sub_kid, format, p, KEYID_STR_SIZE);
     }
   return buffer;
 }
@@ -393,6 +454,14 @@ keystr_from_pk_with_sub (PKT_public_key *main_pk, PKT_public_key *sub_pk)
 }
 
 
+/* Return PK's key id as a string using the default format.  PK owns
+   the storage.  */
+const char *
+pk_keyid_str (PKT_public_key *pk)
+{
+  return keystr (pk_keyid (pk));
+}
+
 
 const char *
 keystr_from_desc(KEYDB_SEARCH_DESC *desc)
@@ -709,7 +778,7 @@ fingerprint_from_pk (PKT_public_key *pk, byte *array, size_t *ret_len)
   md = do_fingerprint_md(pk);
   dp = gcry_md_read( md, 0 );
   len = gcry_md_get_algo_dlen (gcry_md_get_algo (md));
-  assert( len <= MAX_FINGERPRINT_LEN );
+  log_assert( len <= MAX_FINGERPRINT_LEN );
   if (!array)
     array = xmalloc ( len );
   memcpy (array, dp, len );
@@ -791,7 +860,7 @@ format_hexfingerprint (const char *fingerprint, char *buffer, size_t buflen)
           buffer[j ++] = fingerprint[i];
         }
       buffer[j ++] = 0;
-      assert (j == space);
+      log_assert (j == space);
     }
   else
     {
@@ -852,7 +921,7 @@ keygrip_from_pk (PKT_public_key *pk, unsigned char *array)
                                    pk->pubkey_algo == PUBKEY_ALGO_EDDSA?
                                    "(public-key(ecc(curve%s)(flags eddsa)(q%m)))":
                                    (pk->pubkey_algo == PUBKEY_ALGO_ECDH
-                                    && openpgp_oid_is_crv25519 (pk->pkey[0]))?
+                                    && openpgp_oid_is_cv25519 (pk->pkey[0]))?
                                    "(public-key(ecc(curve%s)(flags djb-tweak)(q%m)))":
                                    "(public-key(ecc(curve%s)(q%m)))",
                                    curve, pk->pkey[1]);