{"thread":{"id":"39629","subject":"[PATCH 0/3] Raw gpg output support for verify-commit and verify-tag","startedAt":"2015-06-14T18:51:47Z","lastAt":"2015-06-15T08:22:36Z","messageCount":7,"participants":["brian m. carlson","Junio C Hamano","Michael J Gruber"],"isPatch":true,"patchVersion":1,"patchTotal":3},"messages":[{"id":"263819","messageId":"1434307910-705555-1-git-send-email-sandals@crustytoothpaste.net","threadId":"39629","inReplyTo":null,"subject":"[PATCH 0/3] Raw gpg output support for verify-commit and verify-tag","fromName":"brian m. carlson","fromEmail":"sandals@crustytoothpaste.net","sentAt":"2015-06-14T18:51:47Z","receivedAt":"2015-06-14T18:51:47Z","isPatch":true,"sender":{"key":"sandals@crustytoothpaste.net","avatar":"https://avatars.githubusercontent.com/u/497054?v=4"},"body":"Currently, verify-commit and verify-tag produce human-readable output.\nThis is great for humans, and awful for machines.  It also lacks a lot\nof the information that GnuPG's --status-fd output provides.\n\nFor example, if you wanted to know\n* the hash algorithm;\n* whether the signature was made with a subkey; or\n* the OpenPGP signature version\nnone of that information is available in the human-readable output.\n\nWe've had people in the past come to the list who require signed commits\nin their corporate environment.  It's not unreasonable to expect that\nthey might want to programmatically verify signatures, including aspects\nof the signatures we don't currently expose.  It's also much nicer to\nparse the machine-readable output we already collect than hoping GnuPG\ndoesn't change its output.\n\nThis series introduces a --raw option for verify-commit and verify-tag.\nIf it's used, they provide the gpg --status-fd output on standard error\ninstead of the human-readable output.  The series also adds tests for\nverify-tag, since there were none; these are based off the ones for\nverify-commit.\n\nIn writing this series, I noticed an incompatibility between\nverify-commit and verify-tag.  If a valid signature is made with an\nuntrusted key, verify-commit will exit 1, but verify-tag will exit 0.\nI'm unclear on what we can do about this now, short of adding another\noption.  This is because the two commands share little common code.\n\nbrian m. carlson (3):\n  verify-commit: add option to print raw gpg status information\n  verify-tag: add tests\n  verify-tag: add option to print raw gpg status information\n\n Documentation/git-verify-commit.txt |   4 ++\n Documentation/git-verify-tag.txt    |   4 ++\n builtin/verify-commit.c             |  13 ++--\n builtin/verify-tag.c                |  21 +++++--\n t/t7030-verify-tag.sh               | 116 ++++++++++++++++++++++++++++++++++++\n t/t7510-signed-commit.sh            |  32 ++++++++++\n 6 files changed, 178 insertions(+), 12 deletions(-)\n create mode 100755 t/t7030-verify-tag.sh\n\n-- \n2.4.0\n"},{"id":"263820","messageId":"1434307910-705555-2-git-send-email-sandals@crustytoothpaste.net","threadId":"39629","inReplyTo":"1434307910-705555-1-git-send-email-sandals@crustytoothpaste.net","subject":"[PATCH 1/3] verify-commit: add option to print raw gpg status information","fromName":"brian m. carlson","fromEmail":"sandals@crustytoothpaste.net","sentAt":"2015-06-14T18:51:48Z","receivedAt":"2015-06-14T18:51:48Z","isPatch":true,"sender":{"key":"sandals@crustytoothpaste.net","avatar":"https://avatars.githubusercontent.com/u/497054?v=4"},"body":"verify-commit by default displays human-readable output on standard\nerror.  However, it can also be useful to get access to the raw gpg\nstatus information, which is machine-readable, allowing automated\nimplementation of signing policy.  Add a --raw option to make\nverify-commit produce the gpg status information on standard error\ninstead of the human-readable format.\n\nSigned-off-by: brian m. carlson <sandals@crustytoothpaste.net>\n---\n Documentation/git-verify-commit.txt |  4 ++++\n builtin/verify-commit.c             | 13 +++++++------\n t/t7510-signed-commit.sh            | 32 ++++++++++++++++++++++++++++++++\n 3 files changed, 43 insertions(+), 6 deletions(-)\n\ndiff --git a/Documentation/git-verify-commit.txt b/Documentation/git-verify-commit.txt\nindex 9413e28..ecf4da1 100644\n--- a/Documentation/git-verify-commit.txt\n+++ b/Documentation/git-verify-commit.txt\n@@ -16,6 +16,10 @@ Validates the gpg signature created by 'git commit -S'.\n \n OPTIONS\n -------\n+--raw::\n+\tPrint the raw gpg status output to standard error instead of the normal\n+\thuman-readable output.\n+\n -v::\n --verbose::\n \tPrint the contents of the commit object before validating it.\ndiff --git a/builtin/verify-commit.c b/builtin/verify-commit.c\nindex ec0c4e3..04646fc 100644\n--- a/builtin/verify-commit.c\n+++ b/builtin/verify-commit.c\n@@ -18,7 +18,7 @@ static const char * const verify_commit_usage[] = {\n \t\tNULL\n };\n \n-static int run_gpg_verify(const unsigned char *sha1, const char *buf, unsigned long size, int verbose)\n+static int run_gpg_verify(const unsigned char *sha1, const char *buf, unsigned long size, int verbose, int raw)\n {\n \tstruct signature_check signature_check;\n \n@@ -30,13 +30,13 @@ static int run_gpg_verify(const unsigned char *sha1, const char *buf, unsigned l\n \t\tfputs(signature_check.payload, stdout);\n \n \tif (signature_check.gpg_output)\n-\t\tfputs(signature_check.gpg_output, stderr);\n+\t\tfputs(raw ? signature_check.gpg_status : signature_check.gpg_output, stderr);\n \n \tsignature_check_clear(&signature_check);\n \treturn signature_check.result != 'G';\n }\n \n-static int verify_commit(const char *name, int verbose)\n+static int verify_commit(const char *name, int verbose, int raw)\n {\n \tenum object_type type;\n \tunsigned char sha1[20];\n@@ -54,7 +54,7 @@ static int verify_commit(const char *name, int verbose)\n \t\treturn error(\"%s: cannot verify a non-commit object of type %s.\",\n \t\t\t\tname, typename(type));\n \n-\tret = run_gpg_verify(sha1, buf, size, verbose);\n+\tret = run_gpg_verify(sha1, buf, size, verbose, raw);\n \n \tfree(buf);\n \treturn ret;\n@@ -70,9 +70,10 @@ static int git_verify_commit_config(const char *var, const char *value, void *cb\n \n int cmd_verify_commit(int argc, const char **argv, const char *prefix)\n {\n-\tint i = 1, verbose = 0, had_error = 0;\n+\tint i = 1, verbose = 0, had_error = 0, raw = 0;\n \tconst struct option verify_commit_options[] = {\n \t\tOPT__VERBOSE(&verbose, N_(\"print commit contents\")),\n+\t\tOPT_BOOL(0, \"raw\", &raw, N_(\"print raw gpg status output\")),\n \t\tOPT_END()\n \t};\n \n@@ -87,7 +88,7 @@ int cmd_verify_commit(int argc, const char **argv, const char *prefix)\n \t * was received in the process of writing the gpg input: */\n \tsignal(SIGPIPE, SIG_IGN);\n \twhile (i < argc)\n-\t\tif (verify_commit(argv[i++], verbose))\n+\t\tif (verify_commit(argv[i++], verbose, raw))\n \t\t\thad_error = 1;\n \treturn had_error;\n }\ndiff --git a/t/t7510-signed-commit.sh b/t/t7510-signed-commit.sh\nindex 13331e5..ef316f2 100755\n--- a/t/t7510-signed-commit.sh\n+++ b/t/t7510-signed-commit.sh\n@@ -81,6 +81,38 @@ test_expect_success GPG 'verify and show signatures' '\n \t)\n '\n \n+test_expect_success GPG 'verify signatures with --raw' '\n+\t(\n+\t\tfor commit in initial second merge fourth-signed fifth-signed sixth-signed seventh-signed\n+\t\tdo\n+\t\t\tgit verify-commit --raw $commit 2>actual &&\n+\t\t\tgrep \"GOODSIG\" actual &&\n+\t\t\t! grep \"BADSIG\" actual &&\n+\t\t\techo $commit OK || exit 1\n+\t\tdone\n+\t) &&\n+\t(\n+\t\tfor commit in merge^2 fourth-unsigned sixth-unsigned seventh-unsigned\n+\t\tdo\n+\t\t\ttest_must_fail git verify-commit --raw $commit 2>actual &&\n+\t\t\t! grep \"GOODSIG\" actual &&\n+\t\t\t! grep \"BADSIG\" actual &&\n+\t\t\techo $commit OK || exit 1\n+\t\tdone\n+\t) &&\n+\t(\n+\t\tfor commit in eighth-signed-alt\n+\t\tdo\n+\t\t\t# Undefined trust causes verify-commit to exit abnormally.\n+\t\t\ttest_must_fail git verify-commit --raw $commit 2>actual &&\n+\t\t\tgrep \"GOODSIG\" actual &&\n+\t\t\t! grep \"BADSIG\" actual &&\n+\t\t\tgrep \"TRUST_UNDEFINED\" actual &&\n+\t\t\techo $commit OK || exit 1\n+\t\tdone\n+\t)\n+'\n+\n test_expect_success GPG 'show signed commit with signature' '\n \tgit show -s initial >commit &&\n \tgit show -s --show-signature initial >show &&\n-- \n2.4.0\n"},{"id":"263821","messageId":"1434307910-705555-3-git-send-email-sandals@crustytoothpaste.net","threadId":"39629","inReplyTo":"1434307910-705555-1-git-send-email-sandals@crustytoothpaste.net","subject":"[PATCH 2/3] verify-tag: add tests","fromName":"brian m. carlson","fromEmail":"sandals@crustytoothpaste.net","sentAt":"2015-06-14T18:51:49Z","receivedAt":"2015-06-14T18:51:49Z","isPatch":true,"sender":{"key":"sandals@crustytoothpaste.net","avatar":"https://avatars.githubusercontent.com/u/497054?v=4"},"body":"verify-tag was lacking tests.  Add some, mirroring those used for\nverify-commit.\n\nSigned-off-by: brian m. carlson <sandals@crustytoothpaste.net>\n---\n t/t7030-verify-tag.sh | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++\n 1 file changed, 85 insertions(+)\n create mode 100755 t/t7030-verify-tag.sh\n\ndiff --git a/t/t7030-verify-tag.sh b/t/t7030-verify-tag.sh\nnew file mode 100755\nindex 0000000..9ca0d29\n--- /dev/null\n+++ b/t/t7030-verify-tag.sh\n@@ -0,0 +1,85 @@\n+#!/bin/sh\n+\n+test_description='signed tag tests'\n+. ./test-lib.sh\n+. \"$TEST_DIRECTORY/lib-gpg.sh\"\n+\n+test_expect_success GPG 'create signed tags' '\n+\techo 1 >file && git add file &&\n+\ttest_tick && git commit -m initial &&\n+\tgit tag -s -m initial initial &&\n+\tgit branch side &&\n+\techo a &&\n+\n+\techo 2 >file && test_tick && git commit -a -m second &&\n+\tgit tag -s -m second second &&\n+\techo b &&\n+\n+\tgit checkout side &&\n+\techo 3 >elif && git add elif &&\n+\ttest_tick && git commit -m \"third on side\" &&\n+\techo c &&\n+\n+\tgit checkout master &&\n+\ttest_tick && git merge -S side &&\n+\tgit tag -s -m merge merge &&\n+\techo d &&\n+\n+\techo 4 >file && test_tick && git commit -a -S -m \"fourth unsigned\" &&\n+\tgit tag -a -m fourth-unsigned fourth-unsigned &&\n+\techo e &&\n+\n+\ttest_tick && git commit --amend -S -m \"fourth signed\" &&\n+\tgit tag -s -m fourth fourth-signed &&\n+\techo f &&\n+\n+\techo 5 >file && test_tick && git commit -a -m \"fifth\" &&\n+\tgit tag fifth-unsigned &&\n+\techo g &&\n+\n+\tgit config commit.gpgsign true &&\n+\techo 6 >file && test_tick && git commit -a -m \"sixth\" &&\n+\tgit tag -a -m sixth sixth-unsigned &&\n+\techo h &&\n+\n+\ttest_tick && git rebase -f HEAD^^ && git tag -s -m 6th sixth-signed HEAD^ &&\n+\tgit tag -m seventh -s seventh-signed &&\n+\techo i &&\n+\n+\techo 8 >file && test_tick && git commit -a -m eighth &&\n+\tgit tag -uB7227189 -m eighth eighth-signed-alt &&\n+\techo j\n+'\n+\n+test_expect_success GPG 'verify and show signatures' '\n+\t(\n+\t\tfor tag in initial second merge fourth-signed sixth-signed seventh-signed\n+\t\tdo\n+\t\t\tgit verify-tag $tag 2>actual &&\n+\t\t\tgrep \"Good signature from\" actual &&\n+\t\t\t! grep \"BAD signature from\" actual &&\n+\t\t\techo $tag OK || exit 1\n+\t\tdone\n+\t) &&\n+\t(\n+\t\tfor tag in fourth-unsigned fifth-unsigned sixth-unsigned\n+\t\tdo\n+\t\t\ttest_must_fail git verify-tag $tag 2>actual &&\n+\t\t\t! grep \"Good signature from\" actual &&\n+\t\t\t! grep \"BAD signature from\" actual &&\n+\t\t\techo $tag OK || exit 1\n+\t\tdone\n+\t) &&\n+\t(\n+\t\tfor tag in eighth-signed-alt\n+\t\tdo\n+\t\t\tgit verify-tag $tag 2>actual &&\n+\t\t\tgrep \"Good signature from\" actual &&\n+\t\t\t! grep \"BAD signature from\" actual &&\n+\t\t\tgrep \"not certified\" actual &&\n+\t\t\techo $tag OK || exit 1\n+\t\tdone\n+\t)\n+'\n+\n+test_done\n-- \n2.4.0\n"},{"id":"263822","messageId":"1434307910-705555-4-git-send-email-sandals@crustytoothpaste.net","threadId":"39629","inReplyTo":"1434307910-705555-1-git-send-email-sandals@crustytoothpaste.net","subject":"[PATCH 3/3] verify-tag: add option to print raw gpg status information","fromName":"brian m. carlson","fromEmail":"sandals@crustytoothpaste.net","sentAt":"2015-06-14T18:51:50Z","receivedAt":"2015-06-14T18:51:50Z","isPatch":true,"sender":{"key":"sandals@crustytoothpaste.net","avatar":"https://avatars.githubusercontent.com/u/497054?v=4"},"body":"verify-tag by default displays human-readable output on standard error.\nHowever, it can also be useful to get access to the raw gpg status\ninformation, which is machine-readable, allowing automated\nimplementation of signing policy.  Add a --raw option to make verify-tag\nproduce the gpg status information on standard error instead of the\nhuman-readable format.\n\nSigned-off-by: brian m. carlson <sandals@crustytoothpaste.net>\n---\n Documentation/git-verify-tag.txt |  4 ++++\n builtin/verify-tag.c             | 21 +++++++++++++++------\n t/t7030-verify-tag.sh            | 31 +++++++++++++++++++++++++++++++\n 3 files changed, 50 insertions(+), 6 deletions(-)\n\ndiff --git a/Documentation/git-verify-tag.txt b/Documentation/git-verify-tag.txt\nindex f88ba96..d590edc 100644\n--- a/Documentation/git-verify-tag.txt\n+++ b/Documentation/git-verify-tag.txt\n@@ -16,6 +16,10 @@ Validates the gpg signature created by 'git tag'.\n \n OPTIONS\n -------\n+--raw::\n+\tPrint the raw gpg status output to standard error instead of the normal\n+\thuman-readable output.\n+\n -v::\n --verbose::\n \tPrint the contents of the tag object before validating it.\ndiff --git a/builtin/verify-tag.c b/builtin/verify-tag.c\nindex 53c68fc..745c013 100644\n--- a/builtin/verify-tag.c\n+++ b/builtin/verify-tag.c\n@@ -18,9 +18,12 @@ static const char * const verify_tag_usage[] = {\n \t\tNULL\n };\n \n-static int run_gpg_verify(const char *buf, unsigned long size, int verbose)\n+static int run_gpg_verify(const char *buf, unsigned long size, int verbose, int raw)\n {\n+\tstruct strbuf status = STRBUF_INIT, human_readable = STRBUF_INIT;\n+\tconst struct strbuf *output = raw ? &status : &human_readable;\n \tint len;\n+\tint ret;\n \n \tlen = parse_signature(buf, size);\n \tif (verbose)\n@@ -29,10 +32,15 @@ static int run_gpg_verify(const char *buf, unsigned long size, int verbose)\n \tif (size == len)\n \t\treturn error(\"no signature found\");\n \n-\treturn verify_signed_buffer(buf, len, buf + len, size - len, NULL, NULL);\n+\tret = verify_signed_buffer(buf, len, buf + len, size - len, &human_readable,\n+\t\t\t&status);\n+\n+\tfputs(output->buf, stderr);\n+\n+\treturn ret;\n }\n \n-static int verify_tag(const char *name, int verbose)\n+static int verify_tag(const char *name, int verbose, int raw)\n {\n \tenum object_type type;\n \tunsigned char sha1[20];\n@@ -52,7 +60,7 @@ static int verify_tag(const char *name, int verbose)\n \tif (!buf)\n \t\treturn error(\"%s: unable to read file.\", name);\n \n-\tret = run_gpg_verify(buf, size, verbose);\n+\tret = run_gpg_verify(buf, size, verbose, raw);\n \n \tfree(buf);\n \treturn ret;\n@@ -68,9 +76,10 @@ static int git_verify_tag_config(const char *var, const char *value, void *cb)\n \n int cmd_verify_tag(int argc, const char **argv, const char *prefix)\n {\n-\tint i = 1, verbose = 0, had_error = 0;\n+\tint i = 1, verbose = 0, had_error = 0, raw = 0;\n \tconst struct option verify_tag_options[] = {\n \t\tOPT__VERBOSE(&verbose, N_(\"print tag contents\")),\n+\t\tOPT_BOOL(0, \"raw\", &raw, N_(\"print raw gpg status output\")),\n \t\tOPT_END()\n \t};\n \n@@ -85,7 +94,7 @@ int cmd_verify_tag(int argc, const char **argv, const char *prefix)\n \t * was received in the process of writing the gpg input: */\n \tsignal(SIGPIPE, SIG_IGN);\n \twhile (i < argc)\n-\t\tif (verify_tag(argv[i++], verbose))\n+\t\tif (verify_tag(argv[i++], verbose, raw))\n \t\t\thad_error = 1;\n \treturn had_error;\n }\ndiff --git a/t/t7030-verify-tag.sh b/t/t7030-verify-tag.sh\nindex 9ca0d29..0ac15e6 100755\n--- a/t/t7030-verify-tag.sh\n+++ b/t/t7030-verify-tag.sh\n@@ -82,4 +82,35 @@ test_expect_success GPG 'verify and show signatures' '\n \t)\n '\n \n+test_expect_success GPG 'verify signatures with --raw' '\n+\t(\n+\t\tfor tag in initial second merge fourth-signed sixth-signed seventh-signed\n+\t\tdo\n+\t\t\tgit verify-tag --raw $tag 2>actual &&\n+\t\t\tgrep \"GOODSIG\" actual &&\n+\t\t\t! grep \"BADSIG\" actual &&\n+\t\t\techo $tag OK || exit 1\n+\t\tdone\n+\t) &&\n+\t(\n+\t\tfor tag in fourth-unsigned fifth-unsigned sixth-unsigned\n+\t\tdo\n+\t\t\ttest_must_fail git verify-tag --raw $tag 2>actual &&\n+\t\t\t! grep \"GOODSIG\" actual &&\n+\t\t\t! grep \"BADSIG\" actual &&\n+\t\t\techo $tag OK || exit 1\n+\t\tdone\n+\t) &&\n+\t(\n+\t\tfor tag in eighth-signed-alt\n+\t\tdo\n+\t\t\tgit verify-tag --raw $tag 2>actual &&\n+\t\t\tgrep \"GOODSIG\" actual &&\n+\t\t\t! grep \"BADSIG\" actual &&\n+\t\t\tgrep \"TRUST_UNDEFINED\" actual &&\n+\t\t\techo $tag OK || exit 1\n+\t\tdone\n+\t)\n+'\n+\n test_done\n-- \n2.4.0\n"},{"id":"263826","messageId":"xmqqd20ym1b0.fsf@gitster.dls.corp.google.com","threadId":"39629","inReplyTo":"1434307910-705555-1-git-send-email-sandals@crustytoothpaste.net","subject":"Re: [PATCH 0/3] Raw gpg output support for verify-commit and verify-tag","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2015-06-14T21:23:47Z","receivedAt":"2015-06-14T21:23:47Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"\"brian m. carlson\" <sandals@crustytoothpaste.net> writes:\n\n> Currently, verify-commit and verify-tag produce human-readable output.\n> This is great for humans, and awful for machines.  It also lacks a lot\n> of the information that GnuPG's --status-fd output provides.\n>\n> For example, if you wanted to know\n> * the hash algorithm;\n> * whether the signature was made with a subkey; or\n> * the OpenPGP signature version\n> none of that information is available in the human-readable output.\n\nWhat this series wants to achieve makes a lot of sense to me.  One\ncomment I have after skimming the patfches is that I want the new\n\"raw\" bit added not as a yet another parameter after \"verbose\", but\nby turning the existing \"verbose\" into an \"unsigned flag\" flag word\n(with \"#define GPG_VERIFY_VERBOSE 01\") and then defining use of a\nnew bit in the same flag word \"#define GPG_VERIFY_RAW 01\" or\nsomething.  That way, over time other people add differnt things to\nthe interface, we would not have to end up with 47 different\nparameters each of which signals a single bit.\n\nThanks.\n"},{"id":"263831","messageId":"20150614221457.GG29305@vauxhall.crustytoothpaste.net","threadId":"39629","inReplyTo":"xmqqd20ym1b0.fsf@gitster.dls.corp.google.com","subject":"Re: [PATCH 0/3] Raw gpg output support for verify-commit and verify-tag","fromName":"brian m. carlson","fromEmail":"sandals@crustytoothpaste.net","sentAt":"2015-06-14T22:14:57Z","receivedAt":"2015-06-14T22:14:57Z","isPatch":true,"sender":{"key":"sandals@crustytoothpaste.net","avatar":"https://avatars.githubusercontent.com/u/497054?v=4"},"body":"On Sun, Jun 14, 2015 at 02:23:47PM -0700, Junio C Hamano wrote:\n> What this series wants to achieve makes a lot of sense to me.  One\n> comment I have after skimming the patfches is that I want the new\n> \"raw\" bit added not as a yet another parameter after \"verbose\", but\n> by turning the existing \"verbose\" into an \"unsigned flag\" flag word\n> (with \"#define GPG_VERIFY_VERBOSE 01\") and then defining use of a\n> new bit in the same flag word \"#define GPG_VERIFY_RAW 01\" or\n> something.  That way, over time other people add differnt things to\n> the interface, we would not have to end up with 47 different\n> parameters each of which signals a single bit.\n\nI'll wait for other responses (if any) and then reroll.\n-- \nbrian m. carlson / brian with sandals: Houston, Texas, US\n+1 832 623 2791 | http://www.crustytoothpaste.net/~bmc | My opinion only\nOpenPGP: RSA v4 4096b: 88AC E9B2 9196 305B A994 7552 F1BA 225C 0223 B187\n"},{"id":"263836","messageId":"557E8B4C.3030604@drmicha.warpmail.net","threadId":"39629","inReplyTo":"xmqqd20ym1b0.fsf@gitster.dls.corp.google.com","subject":"Re: [PATCH 0/3] Raw gpg output support for verify-commit and verify-tag","fromName":"Michael J Gruber","fromEmail":"git@drmicha.warpmail.net","sentAt":"2015-06-15T08:22:36Z","receivedAt":"2015-06-15T08:22:36Z","isPatch":true,"sender":{"key":"git@grubix.eu","avatar":"https://avatars.githubusercontent.com/u/233215?v=4"},"body":"Junio C Hamano venit, vidit, dixit 14.06.2015 23:23:\n> \"brian m. carlson\" <sandals@crustytoothpaste.net> writes:\n> \n>> Currently, verify-commit and verify-tag produce human-readable output.\n>> This is great for humans, and awful for machines.  It also lacks a lot\n>> of the information that GnuPG's --status-fd output provides.\n>>\n>> For example, if you wanted to know\n>> * the hash algorithm;\n>> * whether the signature was made with a subkey; or\n>> * the OpenPGP signature version\n>> none of that information is available in the human-readable output.\n> \n> What this series wants to achieve makes a lot of sense to me.  One\n> comment I have after skimming the patfches is that I want the new\n> \"raw\" bit added not as a yet another parameter after \"verbose\", but\n> by turning the existing \"verbose\" into an \"unsigned flag\" flag word\n> (with \"#define GPG_VERIFY_VERBOSE 01\") and then defining use of a\n> new bit in the same flag word \"#define GPG_VERIFY_RAW 01\" or\n> something.  That way, over time other people add differnt things to\n> the interface, we would not have to end up with 47 different\n> parameters each of which signals a single bit.\n> \n> Thanks.\n\nBack then the idea was to have verify-commit available *yesterday*\n(before any refactoring) since we needed a way to verify the new commit\nsignatures programmatically.\n\nMaybe now would be a good time to do the refactoring between verify-tag\nand verify-commit that is still missing, and to add new features then\n(unless they are pressing matters or fixes).\n\nBTW: verify-tag and verify-commit should treat untrusted good signatures\nin exactly the same way. Anything else is an error that needs to be fixed.\n\nMichael\n"}]}