summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeffrey Stedfast <jestedfa@microsoft.com>2020-03-09 18:49:52 -0400
committerJeffrey Stedfast <jestedfa@microsoft.com>2020-03-09 18:49:52 -0400
commit96f23da05a4df623e4eefacc925801e0a1738d58 (patch)
treef772b3ac92f32a24c520318d588ca30d321a17f3
parent0f6a7d86935a2b5b4c7bf1be00d4cded9c768c0e (diff)
downloadgmime-96f23da05a4df623e4eefacc925801e0a1738d58.tar.gz
Fixed logic to select correct gpg subkey for signing/encrypting
Some keys may have multiple subkeys that can be used for signing or encrypting. Just because one of them may have expired or may be revoked doesn't mean they all are. Keep looking to see if another subkey can be used insead. Fixes issue #88
-rw-r--r--gmime/gmime-gpgme-utils.c27
1 files changed, 17 insertions, 10 deletions
diff --git a/gmime/gmime-gpgme-utils.c b/gmime/gmime-gpgme-utils.c
index b86a1011..041dd020 100644
--- a/gmime/gmime-gpgme-utils.c
+++ b/gmime/gmime-gpgme-utils.c
@@ -129,18 +129,25 @@ g_mime_gpgme_get_key_by_name (gpgme_ctx_t ctx, const char *name, gboolean secret
if (KEY_IS_OK (key)) {
subkey = key->subkeys;
- while (subkey && ((secret && !subkey->can_sign) || (!secret && !subkey->can_encrypt)))
- subkey = subkey->next;
-
- if (subkey) {
- if (KEY_IS_OK (subkey) && (subkey->expires == 0 || subkey->expires > now))
- break;
+ while (subkey) {
+ if ((secret && subkey->can_sign) || (!secret && subkey->can_encrypt)) {
+ if (KEY_IS_OK (subkey) && (subkey->expires == 0 || subkey->expires > now)) {
+ errval = GPG_ERR_NO_ERROR;
+ break;
+ }
+
+ if (subkey->expired)
+ errval = GPG_ERR_KEY_EXPIRED;
+ }
- if (subkey->expired)
- errval = GPG_ERR_KEY_EXPIRED;
- else
- errval = GPG_ERR_BAD_KEY;
+ subkey = subkey->next;
}
+
+ if (subkey)
+ break;
+
+ if (errval == GPG_ERR_NO_ERROR)
+ errval = GPG_ERR_BAD_KEY;
} else {
if (key->expired)
errval = GPG_ERR_KEY_EXPIRED;