Last minute cleanups.
[gnupg.git] / g10 / keyid.c
index 0012a56..89b2ddf 100644 (file)
@@ -6,7 +6,7 @@
  *
  * GnuPG is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
+ * the Free Software Foundation; either version 3 of the License, or
  * (at your option) any later version.
  *
  * GnuPG is distributed in the hope that it will be useful,
@@ -15,9 +15,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, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
- * USA.
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
  */
 
 #include <config.h>
@@ -59,7 +57,8 @@ hash_public_key( gcry_md_hd_t md, PKT_public_key *pk )
   unsigned int nn[PUBKEY_MAX_NPKEY];
   byte *pp[PUBKEY_MAX_NPKEY];
   int i;
-  size_t nbits, nbytes;
+  unsigned int nbits;
+  size_t nbytes;
   int npkey = pubkey_get_npkey (pk->pubkey_algo);
 
   /* Two extra bytes for the expiration date in v3 */
@@ -159,7 +158,7 @@ do_fingerprint_md_sk( PKT_secret_key *sk )
 u32
 v3_keyid (gcry_mpi_t a, u32 *ki)
 {
-  byte *buffer;
+  byte *buffer, *p;
   size_t nbytes;
 
   if (gcry_mpi_print (GCRYMPI_FMT_USG, NULL, 0, &nbytes, a ))
@@ -172,8 +171,10 @@ v3_keyid (gcry_mpi_t a, u32 *ki)
     ki[0] = ki[1] = 0;
   else 
     {
-      memcpy (ki+0, buffer+nbytes-8, 4);
-      memcpy (ki+1, buffer+nbytes-4, 4);
+      p = buffer + nbytes - 8;
+      ki[0] = (p[0] << 24) | (p[1] <<16) | (p[2] << 8) | p[3];
+      p += 4;
+      ki[1] = (p[0] << 24) | (p[1] <<16) | (p[2] << 8) | p[3];
     }
   xfree (buffer);
   return ki[1];
@@ -812,3 +813,28 @@ fingerprint_from_sk( PKT_secret_key *sk, byte *array, size_t *ret_len )
   *ret_len = len;
   return array;
 }
+
+
+/* Create a serialno/fpr string from the serial number and the secret
+   key.  Caller must free the returned string.  There is no error
+   return.  */
+char *
+serialno_and_fpr_from_sk (const unsigned char *sn, size_t snlen,
+                          PKT_secret_key *sk)
+{
+  unsigned char fpr[MAX_FINGERPRINT_LEN];
+  size_t fprlen;
+  char *buffer, *p;
+  int i;
+  
+  fingerprint_from_sk (sk, fpr, &fprlen);
+  buffer = p = xmalloc (snlen*2 + 1 + fprlen*2 + 1);
+  for (i=0; i < snlen; i++, p+=2)
+    sprintf (p, "%02X", sn[i]);
+  *p++ = '/';
+  for (i=0; i < fprlen; i++, p+=2)
+    sprintf (p, "%02X", fpr[i]);
+  *p = 0;
+  return buffer;
+}
+