diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/gpgme.h.in | 8 | ||||
| -rw-r--r-- | src/verify.c | 52 |
2 files changed, 60 insertions, 0 deletions
diff --git a/src/gpgme.h.in b/src/gpgme.h.in index c3fb843a..54dba0be 100644 --- a/src/gpgme.h.in +++ b/src/gpgme.h.in @@ -1731,6 +1731,14 @@ struct _gpgme_signature /* If non-NULL, a possible incomplete key object with the data * available for the signature. */ gpgme_key_t key; + + /* If protocol is GPGME_PROTOCOL_CMS, this string may contain the + issuer serial. */ + char *issuer_serial; + + /* If protocol is GPGME_PROTOCOL_CMS, this string may contain the + issuer name. */ + char *issuer_name; }; typedef struct _gpgme_signature *gpgme_signature_t; 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; } |
