git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 1/5] gpg-interface: check good signature in a reliable way

From
Michael J Gruber <git@drmicha.warpmail.net>
Date
Feb 14, 2013, 16:04 UTC
Message-ID
<e0f3c48e474c64e33c67c772468bbf7bba0169af.1360857415.git.git@drmicha.warpmail.net>
In-Reply-To
<CAJ9Ak2pLqUesOWKNtjwG7P_BW7-EqJP4Kaj0FF_+72Wn=oGoew@mail.gmail.com>

Currently, verify_signed_buffer() only checks the return code of gpg, and some callers implement additional unreliable checks for "Good signature" in the gpg output meant for the user.

Use the status output instead and parse for a line beinning with "[GNUPG:] GOODSIG ". This is the only reliable way of checking for a good gpg signature.

If needed we can change this easily to "[GNUPG:] VALIDSIG " if we want to take into account the trust model.

Signed-off-by: Michael J Gruber <git@drmicha.warpmail.net>
---
 gpg-interface.c | 13 +++++++++++--
 1 file changed, 11 insertions(+), 2 deletions(-)
diff --git a/gpg-interface.c b/gpg-interface.c
index 4559033..c582b2e 100644
--- a/gpg-interface.c
+++ b/gpg-interface.c
@@ -96,15 +96,17 @@ int sign_buffer(struct strbuf *buffer, struct strbuf *signature, const char *sig
 /*
  * Run "gpg" to see if the payload matches the detached signature.
  * gpg_output, when set, receives the diagnostic output from GPG.
+ * gpg_status, when set, receives the status output from GPG.
  */
 int verify_signed_buffer(const char *payload, size_t payload_size,
 			 const char *signature, size_t signature_size,
 			 struct strbuf *gpg_output)
 {
 	struct child_process gpg;
-	const char *args_gpg[] = {NULL, "--verify", "FILE", "-", NULL};
+	const char *args_gpg[] = {NULL, "--status-fd=1", "--verify", "FILE", "-", NULL};
 	char path[PATH_MAX];
 	int fd, ret;
+	struct strbuf buf = STRBUF_INIT;
 
 	args_gpg[0] = gpg_program;
 	fd = git_mkstemp(path, PATH_MAX, ".git_vtag_tmpXXXXXX");
@@ -119,9 +121,10 @@ int verify_signed_buffer(const char *payload, size_t payload_size,
 	memset(&gpg, 0, sizeof(gpg));
 	gpg.argv = args_gpg;
 	gpg.in = -1;
+	gpg.out = -1;
 	if (gpg_output)
 		gpg.err = -1;
-	args_gpg[2] = path;
+	args_gpg[3] = path;
 	if (start_command(&gpg)) {
 		unlink(path);
 		return error(_("could not run gpg."));
@@ -134,9 +137,15 @@ int verify_signed_buffer(const char *payload, size_t payload_size,
 		strbuf_read(gpg_output, gpg.err, 0);
 		close(gpg.err);
 	}
+	strbuf_read(&buf, gpg.out, 0);
+	close(gpg.out);
+
 	ret = finish_command(&gpg);
 
 	unlink_or_warn(path);
 
+	ret |= !strstr(buf.buf, "\n[GNUPG:] GOODSIG ");
+	strbuf_release(&buf);
+
 	return ret;
 }
-- 
1.8.1.3.797.ge0260c7
Previous: Michael J GruberNext: Junio C Hamano
Message 5 of 14 in “[BUG] Veryfing signatures in git log fails when language is not english”
  1. XANiFeb 14, 2013
  2. Michael J GruberFeb 14, 2013
  3. Mariusz GronczewskiFeb 14, 2013
  4. 0/5 gpg_interface: use the statusMichael J Gruber, Feb 14, 2013
  5. 1/5 gpg-interface: check good signature in a reliable wayMichael J Gruber, Feb 14, 2013
  6. Junio C HamanoFeb 14, 2013
  7. Michael J GruberFeb 15, 2013
  8. 2/5 log-tree: rely upon the check in the gpg_interfaceMichael J Gruber, Feb 14, 2013
  9. 3/5 gpg_interface: allow to request status returnMichael J Gruber, Feb 14, 2013
  10. 4/5 pretty: parse the gpg status lines rather than the outputMichael J Gruber, Feb 14, 2013
  11. 5/5 pretty: make %GK output the signing key for signed commitsMichael J Gruber, Feb 14, 2013
  12. Junio C HamanoFeb 14, 2013
  13. Mariusz GronczewskiFeb 15, 2013
  14. Junio C HamanoFeb 15, 2013

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.