aboutsummaryrefslogtreecommitdiffstats
path: root/src/key.c
diff options
context:
space:
mode:
authorIngo Klöcker <[email protected]>2024-05-15 08:31:46 +0000
committerIngo Klöcker <[email protected]>2024-05-21 14:38:59 +0000
commitadadfac997a812699049cd9a5f484cbcabff5bfd (patch)
tree41b5c964ed1396b20ede6968379708cc21802faf /src/key.c
parenttests: Fix segv in t-json.c (diff)
downloadgpgme-adadfac997a812699049cd9a5f484cbcabff5bfd.tar.gz
gpgme-adadfac997a812699049cd9a5f484cbcabff5bfd.zip
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
Diffstat (limited to 'src/key.c')
-rw-r--r--src/key.c38
1 files changed, 38 insertions, 0 deletions
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);