diff options
author | Ingo Klöcker <[email protected]> | 2024-05-15 08:31:46 +0000 |
---|---|---|
committer | Ingo Klöcker <[email protected]> | 2024-05-21 14:38:59 +0000 |
commit | adadfac997a812699049cd9a5f484cbcabff5bfd (patch) | |
tree | 41b5c964ed1396b20ede6968379708cc21802faf /src/key.c | |
parent | tests: Fix segv in t-json.c (diff) | |
download | gpgme-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.c | 38 |
1 files changed, 38 insertions, 0 deletions
@@ -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); |