From adadfac997a812699049cd9a5f484cbcabff5bfd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ingo=20Kl=C3=B6cker?= Date: Wed, 15 May 2024 10:31:46 +0200 Subject: core: Add information about revocation keys to keys * src/gpgme.h.in (struct _gpgme_revocation_key, gpgme_revocation_key_t): New. (struct _gpgme_key): Add fields 'revkeys', '_last_revkey'. * src/key.c (_gpgme_key_add_rev_key): New. (gpgme_key_unref): Free revkeys. * src/keylist.c (keylist_colon_handler): Parse rvk lines. * src/ops.h (_gpgme_key_add_rev_key): New. * tests/run-keylist.c (main): Print revocation key info. -- GnuPG-bug-id: 7118 --- src/key.c | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) (limited to 'src/key.c') diff --git a/src/key.c b/src/key.c index 93cdc1c8..fec9eb16 100644 --- a/src/key.c +++ b/src/key.c @@ -304,6 +304,35 @@ _gpgme_key_add_sig (gpgme_key_t key, char *src) } +gpgme_error_t +_gpgme_key_add_rev_key (gpgme_key_t key, const char *src) +{ + gpgme_revocation_key_t revkey; + int src_len = src ? strlen (src) : 0; + + assert (key); + /* malloc a buffer for the revocation key and the fingerprint. */ + revkey = malloc (sizeof (*revkey) + src_len + 1); + if (!revkey) + return gpg_error_from_syserror (); + memset (revkey, 0, sizeof *revkey); + + revkey->fpr = ((char *) revkey) + sizeof (*revkey); + if (src) + memcpy (revkey->fpr, src, src_len + 1); + else + revkey->fpr[0] = '\0'; + + if (!key->revocation_keys) + key->revocation_keys = revkey; + if (key->_last_revkey) + key->_last_revkey->next = revkey; + key->_last_revkey = revkey; + + return 0; +} + + /* Acquire a reference to KEY. */ void gpgme_key_ref (gpgme_key_t key) @@ -324,6 +353,7 @@ gpgme_key_unref (gpgme_key_t key) { gpgme_user_id_t uid; gpgme_subkey_t subkey; + gpgme_revocation_key_t revkey; if (!key) return; @@ -392,6 +422,14 @@ gpgme_key_unref (gpgme_key_t key) uid = next_uid; } + revkey = key->revocation_keys; + while (revkey) + { + gpgme_revocation_key_t next = revkey->next; + free (revkey); + revkey = next; + } + free (key->issuer_serial); free (key->issuer_name); free (key->chain_id); -- cgit v1.2.3