0 | |
From: =?utf-8?q?Ingo_Kl=C3=B6cker?= <dev@ingo-kloecker.de>
|
1 | |
Date: Sat, 26 Jun 2021 18:02:47 +0200
|
2 | |
Subject: core: Fix use-after-free issue in test
|
3 | |
|
4 | |
* tests/gpg/t-edit-sign.c (sign_key, verify_key_signature): New.
|
5 | |
(main): Factored out signing and verifying the result.
|
6 | |
--
|
7 | |
|
8 | |
Factoring the two steps of the test into different functions fixes the
|
9 | |
use-after-free issue that was caused by accidentaly using a variable
|
10 | |
of the first step in the second step.
|
11 | |
|
12 | |
GnuPG-bug-id: 5509
|
13 | |
---
|
14 | |
tests/gpg/t-edit-sign.c | 54 +++++++++++++++++++++++++++++++++----------------
|
15 | |
1 file changed, 37 insertions(+), 17 deletions(-)
|
16 | |
|
17 | |
diff --git a/tests/gpg/t-edit-sign.c b/tests/gpg/t-edit-sign.c
|
18 | |
index 2f98362..e0494c5 100644
|
19 | |
--- a/tests/gpg/t-edit-sign.c
|
20 | |
+++ b/tests/gpg/t-edit-sign.c
|
21 | |
@@ -107,31 +107,19 @@ interact_fnc (void *opaque, const char *status, const char *args, int fd)
|
22 | |
}
|
23 | |
|
24 | |
|
25 | |
-int
|
26 | |
-main (int argc, char **argv)
|
27 | |
+void
|
28 | |
+sign_key (const char *key_fpr, const char *signer_fpr)
|
29 | |
{
|
30 | |
gpgme_ctx_t ctx;
|
31 | |
gpgme_error_t err;
|
32 | |
gpgme_data_t out = NULL;
|
33 | |
- const char *signer_fpr = "A0FF4590BB6122EDEF6E3C542D727CC768697734"; /* Alpha Test */
|
34 | |
gpgme_key_t signing_key = NULL;
|
35 | |
- const char *key_fpr = "D695676BDCEDCC2CDD6152BCFE180B1DA9E3B0B2"; /* Bravo Test */
|
36 | |
gpgme_key_t key = NULL;
|
37 | |
- gpgme_key_t signed_key = NULL;
|
38 | |
- gpgme_user_id_t signed_uid = NULL;
|
39 | |
- gpgme_key_sig_t key_sig = NULL;
|
40 | |
char *agent_info;
|
41 | |
- int mode;
|
42 | |
-
|
43 | |
- (void)argc;
|
44 | |
- (void)argv;
|
45 | |
-
|
46 | |
- init_gpgme (GPGME_PROTOCOL_OpenPGP);
|
47 | |
|
48 | |
err = gpgme_new (&ctx);
|
49 | |
fail_if_err (err);
|
50 | |
|
51 | |
- /* Sign the key */
|
52 | |
agent_info = getenv("GPG_AGENT_INFO");
|
53 | |
if (!(agent_info && strchr (agent_info, ':')))
|
54 | |
gpgme_set_passphrase_cb (ctx, passphrase_cb, 0);
|
55 | |
@@ -159,8 +147,23 @@ main (int argc, char **argv)
|
56 | |
gpgme_data_release (out);
|
57 | |
gpgme_key_unref (key);
|
58 | |
gpgme_key_unref (signing_key);
|
59 | |
+ gpgme_release (ctx);
|
60 | |
+}
|
61 | |
+
|
62 | |
+
|
63 | |
+void
|
64 | |
+verify_key_signature (const char *key_fpr, const char *signer_keyid)
|
65 | |
+{
|
66 | |
+ gpgme_ctx_t ctx;
|
67 | |
+ gpgme_error_t err;
|
68 | |
+ gpgme_key_t signed_key = NULL;
|
69 | |
+ gpgme_user_id_t signed_uid = NULL;
|
70 | |
+ gpgme_key_sig_t key_sig = NULL;
|
71 | |
+ int mode;
|
72 | |
+
|
73 | |
+ err = gpgme_new (&ctx);
|
74 | |
+ fail_if_err (err);
|
75 | |
|
76 | |
- /* Verify the key signature */
|
77 | |
mode = gpgme_get_keylist_mode (ctx);
|
78 | |
mode |= GPGME_KEYLIST_MODE_SIGS;
|
79 | |
err = gpgme_set_keylist_mode (ctx, mode);
|
80 | |
@@ -168,7 +171,7 @@ main (int argc, char **argv)
|
81 | |
err = gpgme_get_key (ctx, key_fpr, &signed_key, 0);
|
82 | |
fail_if_err (err);
|
83 | |
|
84 | |
- signed_uid = key->uids;
|
85 | |
+ signed_uid = signed_key->uids;
|
86 | |
if (!signed_uid)
|
87 | |
{
|
88 | |
fprintf (stderr, "Signed key has no user IDs\n");
|
89 | |
@@ -180,7 +183,7 @@ main (int argc, char **argv)
|
90 | |
exit (1);
|
91 | |
}
|
92 | |
key_sig = signed_uid->signatures->next;
|
93 | |
- if (strcmp ("2D727CC768697734", key_sig->keyid))
|
94 | |
+ if (strcmp (signer_keyid, key_sig->keyid))
|
95 | |
{
|
96 | |
fprintf (stderr, "Unexpected key ID in second user ID sig: %s\n",
|
97 | |
key_sig->keyid);
|
98 | |
@@ -196,6 +199,23 @@ main (int argc, char **argv)
|
99 | |
|
100 | |
gpgme_key_unref (signed_key);
|
101 | |
gpgme_release (ctx);
|
102 | |
+}
|
103 | |
+
|
104 | |
+
|
105 | |
+int
|
106 | |
+main (int argc, char **argv)
|
107 | |
+{
|
108 | |
+ const char *signer_fpr = "A0FF4590BB6122EDEF6E3C542D727CC768697734"; /* Alpha Test */
|
109 | |
+ const char *signer_keyid = signer_fpr + strlen(signer_fpr) - 16;
|
110 | |
+ const char *key_fpr = "D695676BDCEDCC2CDD6152BCFE180B1DA9E3B0B2"; /* Bravo Test */
|
111 | |
+
|
112 | |
+ (void)argc;
|
113 | |
+ (void)argv;
|
114 | |
+
|
115 | |
+ init_gpgme (GPGME_PROTOCOL_OpenPGP);
|
116 | |
+
|
117 | |
+ sign_key (key_fpr, signer_fpr);
|
118 | |
+ verify_key_signature (key_fpr, signer_keyid);
|
119 | |
|
120 | |
return 0;
|
121 | |
}
|