aboutsummaryrefslogtreecommitdiffstats
path: root/src/verify.c
diff options
context:
space:
mode:
authorIngo Klöcker <[email protected]>2026-08-03 15:55:35 +0200
committerIngo Klöcker <[email protected]>2026-08-03 15:55:35 +0200
commit7ba3ef8e40518ec109b6e0551ac3cc076c95b53f (patch)
tree51580823e08fa69e5a3158b8918b13ded20e128c /src/verify.c
parentAdd helper to decode percent-plus encoded strings (diff)
downloadgpgme-7ba3ef8e40518ec109b6e0551ac3cc076c95b53f.tar.gz
gpgme-7ba3ef8e40518ec109b6e0551ac3cc076c95b53f.zip
Provide serial number and issuer of unknown S/MIME signing certificates
* src/gpgme.h.in (_gpgme_signature): Add fields issuer_serial and issuer_name. * src/verify.c (release_op_data): Free new fields. (parse_no_pubkey): New. (_gpgme_verify_status_handler): Handle NO_PUBKEY status code. * tests/run-verify.c (print_result): Print issuer_serial and issuer_name. -- GnuPG-bug-id: 8369
Diffstat (limited to 'src/verify.c')
-rw-r--r--src/verify.c52
1 files changed, 52 insertions, 0 deletions
diff --git a/src/verify.c b/src/verify.c
index 8179e4a8..d221c30e 100644
--- a/src/verify.c
+++ b/src/verify.c
@@ -75,6 +75,10 @@ release_op_data (void *hook)
free (sig->pka_address);
if (sig->key)
gpgme_key_unref (sig->key);
+ if (sig->issuer_serial)
+ free (sig->issuer_serial);
+ if (sig->issuer_name)
+ free (sig->issuer_name);
free (sig);
sig = next;
}
@@ -944,6 +948,49 @@ parse_error (gpgme_signature_t sig, char *args, int set_status)
}
+static gpgme_error_t
+parse_no_pubkey (gpgme_signature_t sig, char *args, gpgme_protocol_t protocol)
+{
+ gpgme_error_t err;
+ char *end;
+ char *name;
+
+ if (protocol != GPGME_PROTOCOL_CMS)
+ return 0;
+
+ /* Check that we only get one of these status codes per
+ signature; if not the crypto backend misbehaves. */
+ if (sig->issuer_serial || sig->issuer_name)
+ return trace_gpg_error (GPG_ERR_INV_ENGINE);
+
+ /* Parse #serialno/issuer */
+ end = strchr (args, ' ');
+ if (end)
+ *end = '\0';
+
+ if (*args != '#')
+ return trace_gpg_error (GPG_ERR_INV_ENGINE);
+ args++;
+
+ name = strchr (args, '/');
+ if (name)
+ {
+ *name = '\0';
+ name++;
+ }
+ if (!name || !*args || !*name)
+ return trace_gpg_error (GPG_ERR_INV_ENGINE);
+
+ err = _gpgme_decode_percent_plus_string (args, &sig->issuer_serial, 0, 0);
+ if (err)
+ return err;
+
+ err = _gpgme_decode_percent_plus_string (name, &sig->issuer_name, 0, 0);
+
+ return err;
+}
+
+
gpgme_error_t
_gpgme_verify_status_handler (void *priv, gpgme_status_code_t code, char *args)
{
@@ -1134,6 +1181,11 @@ _gpgme_verify_status_handler (void *priv, gpgme_status_code_t code, char *args)
PARSE_COMPLIANCE_FLAGS (args, opd->current_sig);
break;
+ case GPGME_STATUS_NO_PUBKEY:
+ opd->only_newsig_seen = 0;
+ return sig ? parse_no_pubkey (sig, args, ctx->protocol)
+ : trace_gpg_error (GPG_ERR_INV_ENGINE);
+
default:
break;
}