[PATCH] show s/mime keyid for successfully checked signatures

Robert Jäschke via Mutt-dev <[email protected]> Wed, 1 Jul 2026 15:46:03 +0200
Newsgroups gmane.mail.mutt.devel
Message-ID <[email protected]>
--+/ZBwG44sxRANq7X
Content-Type: text/plain; charset=utf-8
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable

Hello,

with respect to my post "get id of key used for s/mime signature" on the
mutt-users list, I have written a brief patch to show the key id. To
reduce code duplication, I added a function mutt_align to curs_lib.c,
but I am not sure whether that's the best place to go. I hope my aged C
skills have not introduced too many errors, so feedback is very welcome.

Best regards,
Robert


-- >8 --
---
 crypt-gpgme.c | 21 +++++++--------------
 curs_lib.c    | 12 ++++++++++++
 protos.h      |  1 +
 3 files changed, 20 insertions(+), 14 deletions(-)

diff --git a/crypt-gpgme.c b/crypt-gpgme.c
index ccae5503..e42be23d 100644
--- a/crypt-gpgme.c
+++ b/crypt-gpgme.c
@@ -1619,9 +1619,8 @@ static void show_one_sig_validity(gpgme_ctx_t ctx, in=
t idx, STATE *s)
 static void print_smime_keyinfo(const char *msg, gpgme_signature_t sig,
                                 gpgme_key_t key, STATE *s)
 {
-  int msgwid;
   gpgme_user_id_t uids =3D NULL;
-  int i, aka =3D 0;
+  int aka =3D 0;
=20
   state_puts(msg, s);
   state_puts(" ", s);
@@ -1634,18 +1633,17 @@ static void print_smime_keyinfo(const char *msg, gp=
gme_signature_t sig,
         continue;
       if (aka)
       {
-        msgwid =3D mutt_strwidth(msg) - mutt_strwidth(_("aka: ")) + 1;
-        if (msgwid < 0)
-          msgwid =3D 0;
-        for (i =3D 0; i < msgwid; i++)
-          state_puts(" ", s);
-        state_puts(_("aka: "), s);
+        mutt_align(msg, _("aka: "), s);
       }
       state_puts(uids->uid, s);
       state_puts("\n", s);
=20
       aka =3D 1;
     }
+
+    mutt_align(msg, _("KeyId: "), s);
+    state_puts(key->fpr, s);
+    state_puts("\n", s);
   }
   else
   {
@@ -1666,12 +1664,7 @@ static void print_smime_keyinfo(const char *msg, gpg=
me_signature_t sig,
      "Jan 1 1970" is not the created date. */
   if (sig->timestamp)
   {
-    msgwid =3D mutt_strwidth(msg) - mutt_strwidth(_("created: ")) + 1;
-    if (msgwid < 0)
-      msgwid =3D 0;
-    for (i =3D 0; i < msgwid; i++)
-      state_puts(" ", s);
-    state_puts(_("created: "), s);
+    mutt_align(msg, _("created: "), s);
     print_time(sig->timestamp, s);
     state_puts("\n", s);
   }
diff --git a/curs_lib.c b/curs_lib.c
index 5c93cbb0..e6d1f7d5 100644
--- a/curs_lib.c
+++ b/curs_lib.c
@@ -1654,3 +1654,15 @@ int mutt_strwidth(const char *s)
   }
   return w;
 }
+
+void mutt_align(const char *msg, const char *key, STATE *s)
+{
+  int msgwid =3D mutt_strwidth(msg) - mutt_strwidth(_(key)) + 1;
+  int i;
+
+  if (msgwid < 0)
+    msgwid =3D 0;
+  for (i =3D 0; i < msgwid; i++)
+    state_puts(" ", s);
+  state_puts(key, s);
+}
diff --git a/protos.h b/protos.h
index 4958aa0e..407f4859 100644
--- a/protos.h
+++ b/protos.h
@@ -407,6 +407,7 @@ int mutt_smtp_send(const ADDRESS *, const ADDRESS *, co=
nst ADDRESS *,
 size_t mutt_wstr_trunc(const char *, size_t, size_t, size_t *);
 int mutt_charlen(const char *s, int *);
 int mutt_strwidth(const char *);
+void mutt_align(const char *msg, const char *key, STATE *s);
 int mutt_compose_menu(SEND_CONTEXT *);
 int mutt_thread_set_flag(HEADER *, int, int, int);
 int mutt_user_is_recipient(HEADER *);
--=20
2.47.3



--+/ZBwG44sxRANq7X
Content-Type: application/pkcs7-signature; name="smime.p7s"
Content-Disposition: attachment; filename="smime.p7s"
Content-Transfer-Encoding: base64

MIIOkQYJKoZIhvcNAQcCoIIOgjCCDn4CAQExDzANBglghkgBZQMEAgEFADALBgkqhkiG9w0B
BwGgggwQMIIGRDCCBCygAwIBAgIQFfmubKqNLtTTb3h/Htx7ATANBgkqhkiG9w0BAQsFADBv
MQswCQYDVQQGEwJHUjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo
IEluc3RpdHV0aW9ucyBDQTEnMCUGA1UEAwweSEFSSUNBIENsaWVudCBSU0EgUm9vdCBDQSAy
MDIxMB4XDTI1MDEwMzExMTMwOFoXDTM5MTIzMTExMTMwN1owYzELMAkGA1UEBhMCR1IxNzA1
BgNVBAoMLkhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ0Ex
GzAZBgNVBAMMEkdFQU5UIFMvTUlNRSBSU0EgMTCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCC
AYoCggGBAKu4bq/+byKjHo25Xz32YBmO+Wrkmc+UmfcdXSCI7yawwU9JSMEHAAKAASaJpLr9
JAyt+tlB/rn/SaznSwY4ipBIffR0D5k/ndfiI553dWgI4i/tkOGlNej/7JyE2CS9kTlOOs6p
g5HaDpwqjAhCkje+IByg5gKWH6lzvMJo5jQOtsGB2q6e5cYKwa9LJOAcR8iquds9LFssbHSM
uVdSuTjpAjcGLqWfW++C0YXpWD+UonjQ6lNEuiKUDmrFc+SEtLw56lYtp4uuxm4LW/HQSsx+
oGwMBqaR6HhBQ3LydONjsbcbegRqJZFJoLsnwIHorEag44UIvjXzYJAx/NTiwVdHldO7cEvW
scDbyQLR9koBoliq2HrgYFQs7NQxU+7MLNSh8i6znWVNISUEg36M//I8BZl4VqD70ELlhKKN
7rx+i7BwKOd2gxdWgFJhkPyQu9o+82R9epXiRblo/rdkyv+2BFR7VpbgPUzncdi8/0h4dP/q
QFYnA+Df0FFj7gYczwIDAQABo4IBZjCCAWIwEgYDVR0TAQH/BAgwBgEB/wIBADAfBgNVHSME
GDAWgBSg1gc9XiT3e6BELiRSDRmqKwSRpzBQBggrBgEFBQcBAQREMEIwQAYIKwYBBQUHMAKG
NGh0dHA6Ly9jcnQuaGFyaWNhLmdyL0hBUklDQS1DbGllbnQtUm9vdC0yMDIxLVJTQS5jZXIw
RAYDVR0gBD0wOzA5BgRVHSAAMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly9yZXBvLmhhcmljYS5n
ci9kb2N1bWVudHMvQ1BTMB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcDBDBFBgNVHR8E
PjA8MDqgOKA2hjRodHRwOi8vY3JsLmhhcmljYS5nci9IQVJJQ0EtQ2xpZW50LVJvb3QtMjAy
MS1SU0EuY3JsMB0GA1UdDgQWBBTrsi87/a4CzCpEBl0lzR0SImiwRzAOBgNVHQ8BAf8EBAMC
AYYwDQYJKoZIhvcNAQELBQADggIBADveuEX23DwrkygKtsF7DmcTGmi8SE20jmJLe0TMT8Nw
s1NqppE0ACym1agtY1IjUFm5MWabG/IcvRTh8sB9cRZgDQMqZLNCLofqL4aj/dKBXH4bwH2M
VdjNHBoGvZkyhRz/kBE+x1vaWXclhWQMOX5nVvRMfiEJiYotMP7KM88IaVZ9DkGJJEVftsnU
WuvCWUtjagD6XWlqLHjNl+LufiZ/h9lDvaWqG1/obfdStgofMc30RL+ES6gYKRwZpCA1coFz
XV7Cnwx8toTl8bReqCNXexKzxlqAcRXPOmlKkJQuqRI297oNuMPnoNZCY+yLnxyd4kZuu0Xc
OTNTpVjM8bvg8ACqhSYanrNDi/zTiTk7gwm9GyH1X45fFNGNEFgpIaApjT2UELukDOmP18Zw
C4EQeHawPJIqffMEmUJm6qbRPKGnNmcyygh4iZU3QbkRLLp3Z6QV3WoTEqyf5mL9qTGS6WJG
65L8oaKw1Xh/bdGuVIDyBahpfP2c2pCd0UH6+x73Rrq9GFlOijVr2OQSvKhzETNG917SvcUR
CBhMnIQFUXqHQyIY60eH1po6WtNOq/1K5kpOG6Sq1RVc02LEit48uK4tRMVUKekSOjruGXW3
8DmAriPcMHjI6VQbqjc0Sq1VPz76ee4FM5uLviSUZHYqDDqMWa8LFImK9iiKI8E3MIIFxDCC
BCygAwIBAgIQfh3o+ir0hw+EC7O2MrF1MzANBgkqhkiG9w0BAQsFADBjMQswCQYDVQQGEwJH
UjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9u
cyBDQTEbMBkGA1UEAwwSR0VBTlQgUy9NSU1FIFJTQSAxMB4XDTI1MDUwNzA5MTk1NVoXDTI3
MDUwNzA5MTk1NVowgcYxCzAJBgNVBAYTAkRFMQ8wDQYDVQQIDAZCZXJsaW4xKDAmBgNVBAoM
H0h1bWJvbGR0LVVuaXZlcnNpdGFldCB6dSBCZXJsaW4xETAPBgNVBGEMCEdPVkRFK0JFMREw
DwYDVQQEDAhKYWVzY2hrZTEPMA0GA1UEKgwGUm9iZXJ0MRgwFgYDVQQDDA9Sb2JlcnQgSmFl
c2Noa2UxKzApBgkqhkiG9w0BCQEWHHJvYmVydC5qYWVzY2hrZUBodS1iZXJsaW4uZGUwggEi
MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCp71us8EXSVsah77i60l9QS76U/7DzeRKF
l3LEjAUET/a8XHTqBEP/7Nss4HucaZwoYIi42qRfzS2T9hPsM9g6jBZ1682+bJvGGkpZwwCH
24+f5UbLvuhQN0t1dF2coEYLnvKdxqVyZL/xYQmFVQVv7Gd7B8wwjQEPEEiyiiggMNE2+mHB
uK7VBWMGRHIWdt4MUNzmBi4sbBubn2C0CAAgiGOSG7nRmEfg+iMwgeBuE0WPDbtEOvEoM1PG
v3KPGBZP463tnlk/5OrWpsqtSqRW0c7ioKF1j1X+SWfr8CPm5bGxt3yxYIzJI6E7zBZmXqlB
XRqTOSTfyOt0g18rxkn5AgMBAAGjggGOMIIBijAfBgNVHSMEGDAWgBTrsi87/a4CzCpEBl0l
zR0SImiwRzBKBggrBgEFBQcBAQQ+MDwwOgYIKwYBBQUHMAKGLmh0dHA6Ly9jcnQuaGFyaWNh
LmdyL0hBUklDQS1HRUFOVC1TTUlNRS1SMS5jZXIwJwYDVR0RBCAwHoEccm9iZXJ0LmphZXNj
aGtlQGh1LWJlcmxpbi5kZTBjBgNVHSAEXDBaMAkGB2eBDAEFAwIwCAYGBACPegEDMEMGDSsG
AQQBgc8RAQECBAIwMjAwBggrBgEFBQcCARYkaHR0cHM6Ly9yZXBvLmhhcmljYS5nci9kb2N1
bWVudHMvQ1BTMB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcDBDA/BgNVHR8EODA2MDSg
MqAwhi5odHRwOi8vY3JsLmhhcmljYS5nci9IQVJJQ0EtR0VBTlQtU01JTUUtUjEuY3JsMB0G
A1UdDgQWBBTuUThOMmukadgeawl9pONbOwubrDAOBgNVHQ8BAf8EBAMCBaAwDQYJKoZIhvcN
AQELBQADggGBAEBBHxAlgUbfSbJKsDkgSiPYPsvdcUYnPX2RJTQWqrQuUK5BOVT2pt5hAEoa
31F3+MWMc4AOs5KHLa01ypudmRO6EsZqNqf/AhHpiq06Cw5cMRZSDgAsvKqn7TTSxtBk7K+D
jBxRwH00IZ0SflnonYNDMC00k+yuP5qDhfvdMDQ9//wAgU3+6rDEjUmriGSIaiZoqd8OfgSP
tnZU1xUoHUXb8SPiPtA4opuimoYvdD/QW5OXr1UDHpHQxRHNSiHwRgv5zvX6YdT5OXyss47x
XXr+RCqqa1/RBUdFl0jU+u+5WfoXMM9gXq1v5B84dTVoBTbucoEWwlqrPvqbLsc/07sAMjcn
4w/KjCcrHmF2OtjYUzV1xx+5R4vo6U03BYsgluE7qK8LSoI2JDbp9yQow/CHnyAVGivcgjuU
6MbvV9osr/uP20LDZFclCNxsYslXFKhDhD7++3t6W6pHA4WQqiCtnmA5sw7GoSJB+Ve6UA/v
luXvoyOEt9kmNtrkLz7dkDGCAkUwggJBAgEBMHcwYzELMAkGA1UEBhMCR1IxNzA1BgNVBAoM
LkhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ0ExGzAZBgNV
BAMMEkdFQU5UIFMvTUlNRSBSU0EgMQIQfh3o+ir0hw+EC7O2MrF1MzANBglghkgBZQMEAgEF
AKCBoDAYBgkqhkiG9w0BCQMxCwYJKoZIhvcNAQcBMBwGCSqGSIb3DQEJBTEPFw0yNjA3MDEx
MzQ2MDNaMC8GCSqGSIb3DQEJBDEiBCApLtady4lO8cWNDupEenhtMhmwQqch6Ih0EUYLupGw
ADA1BgkqhkiG9w0BCQ8xKDAmMAsGCWCGSAFlAwQBKjALBglghkgBZQMEAQIwCgYIKoZIhvcN
AwcwDQYJKoZIhvcNAQEBBQAEggEAA60XJZhBRgVHk+Qav0+r56aeMHdxPzJcGqd39LT1SjQ0
g4ja1i7tIeDWhTXPvGUfJ/ATkWhaLlaMJ+h09WwMZ3pkyaoGKrfop6vwhHIqcS23Wtx5te9W
ZVSmHr58SwzLBkZocoFJP1ixiHGksIWNALxywv3rADF13+6KVvjcnft9WMUz0V98YeOA+mJC
4CbIKj08Ewi/n1VScKeihv16hORpOvtesHSnBMkGbZK+aHOjJ9kASuMRonFV3YfPmBl0zhg0
n0mA+XfWpkN6vYmZPrcD/QTWe0tzck76XEx8zl9NGXzdA0qCe6/gdMdUPO7+Rl8PBulT1aLw
R4UJnHYF9Q==

--+/ZBwG44sxRANq7X--