aboutsummaryrefslogtreecommitdiffstats
path: root/g10/keyid.c
diff options
context:
space:
mode:
authorWerner Koch <[email protected]>2024-03-04 13:22:42 +0000
committerWerner Koch <[email protected]>2024-03-04 13:22:42 +0000
commit74e4dd3668b3a737eb7929da5f5de2f12f6ca9b8 (patch)
tree9dbdd3dc1a64d0aa861013a9448c4c5d099b3aca /g10/keyid.c
parentbuild: Extend getswdb.sh to allow a verified download (diff)
downloadgnupg-74e4dd3668b3a737eb7929da5f5de2f12f6ca9b8.tar.gz
gnupg-74e4dd3668b3a737eb7929da5f5de2f12f6ca9b8.zip
gpg: Prepare for a new export option export-realclean.
* g10/options.h (EXPORT_REALCLEAN): New. Also re-assign other values to keep them more in sync with the corresponding import values. * g10/export.c (parse_export_options): Add "export-realclean". (do_export_stream): Call clean_all_uids directly with the options arg. * g10/import.c (import_one_real): Change for direct use of options in clean_all_uids. * g10/key-clean.c (is_trusted_key_sig): New. Stub for now. (clean_sigs_from_uid): Re-purpose self_only to a general options arg. Implement EXPORT_REALCLEAN code path. (clean_one_uid): Re-purpose self_only to a general options arg. (clean_all_uids): Ditto. * g10/keyedit.c (keyedit_menu): Use EXPORT_MINIMAL instead of a simple flag. (menu_clean): Re-purpose self_only to a general options arg. * g10/keyid.c (fpr20_from_pk): Factor code out to .... (fpr20_from_fpr): new. Remove useless case for ARRAY being NULL. * g10/tdbio.c (tdbio_search_trust_byfpr): Add arg fprlen and use fpr20_from_fpr if needed. (tdbio_search_trust_bypk): Pass 20 for the fingerprint length. -- Note that this code has no function yet. Another patch will follow to extract the trusted-keys flag from the trustdb.
Diffstat (limited to 'g10/keyid.c')
-rw-r--r--g10/keyid.c40
1 files changed, 27 insertions, 13 deletions
diff --git a/g10/keyid.c b/g10/keyid.c
index ce977de0b..fab1e3a36 100644
--- a/g10/keyid.c
+++ b/g10/keyid.c
@@ -1051,6 +1051,32 @@ v5_fingerprint_from_pk (PKT_public_key *pk, byte *array, size_t *ret_len)
/*
+ * This is the core of fpr20_from_pk which directly takes a
+ * fingerprint and its length instead of the public key. See below
+ * for details.
+ */
+void
+fpr20_from_fpr (const byte *fpr, unsigned int fprlen, byte array[20])
+{
+ if (fprlen >= 32) /* v5 fingerprint (or larger) */
+ {
+ memcpy (array + 0, fpr + 20, 4);
+ memcpy (array + 4, fpr + 24, 4);
+ memcpy (array + 8, fpr + 28, 4);
+ memcpy (array + 12, fpr + 0, 4); /* kid[0] */
+ memcpy (array + 16, fpr + 4, 4); /* kid[1] */
+ }
+ else if (fprlen == 20) /* v4 fingerprint */
+ memcpy (array, fpr, 20);
+ else /* v3 or too short: fill up with zeroes. */
+ {
+ memset (array, 0, 20);
+ memcpy (array, fpr, fprlen);
+ }
+}
+
+
+/*
* Get FPR20 for the given PK/SK into ARRAY.
*
* FPR20 is special form of fingerprint of length 20 for the record of
@@ -1066,19 +1092,7 @@ fpr20_from_pk (PKT_public_key *pk, byte array[20])
if (!pk->fprlen)
compute_fingerprint (pk);
- if (!array)
- array = xmalloc (pk->fprlen);
-
- if (pk->fprlen == 32) /* v5 fingerprint */
- {
- memcpy (array + 0, pk->fpr + 20, 4);
- memcpy (array + 4, pk->fpr + 24, 4);
- memcpy (array + 8, pk->fpr + 28, 4);
- memcpy (array + 12, pk->fpr + 0, 4); /* kid[0] */
- memcpy (array + 16, pk->fpr + 4, 4); /* kid[1] */
- }
- else /* v4 fingerprint */
- memcpy (array, pk->fpr, 20);
+ fpr20_from_fpr (pk->fpr, pk->fprlen, array);
}