gpgsm: ksba_cms_parse failed: Broken pipe
Jakob Bohm
jb-gnumlists at wisemo.com
Sat Dec 16 00:35:39 CET 2023
Hi,
On 2023-12-14 19:43, Werner Koch wrote:
> On Thu, 14 Dec 2023 16:19, Jakob Bohm said:
>
>> zcat ${infl} |
>> faketime "${DSTAMP}" gpgsm --verify --validation-model shell
>> --assume-binary --status-fd 3 --output - - 3>${wrkdir}/sigdec.status
>> || :
>
>
>> gpgsm: ksba_cms_parse failed: Broken pipe
>
> gpgsm expects more data but zcat already sent its EOF. This might be
> due to a broken ASN.1 structure which announced N bytes but gpgsm was
> not able to read thes N bytes. CMS chunks up the data so that you can
> have a very long stream of data. (I have sometimes seen chunks of just
> one byte).
>
> That is the error message you meant, or did you see more? Adding
> --verbose is often very helpful.
>
>> Message on status-fd (copied to stderr by cat command)
>>
>> [GNUPG:] ERROR verify.leave 32877
>
> This is the machine interface; which you rightfully parse.
>
> $ gpg-error 32877
> 32877 = (0, 32877) = (GPG_ERR_SOURCE_UNKNOWN, GPG_ERR_EPIPE) = (Unspecified source, Broken pipe)
>
> verify.leave helps us to locate the place where the error as emitted:
> Here is is at the end of gpgsm_verify function but unfortunately we
> can't get the offset of the input data where it stopped parsing. You
> may use "--debug hashing" to write a file with the data hashed
> (i.e. what is verified). That gives an indication where inthe stream
> the error occured.
>
> Anothyer useful tool is the venerable dumpasn1 tool which you could use
> instead of gpgsm to find error in the input data structure.
>
>> Which of the inputs was being truncated on the way to the that
>> parsing function?
>
> The decompressed $infl .
>
Thanks for this decoding, based on this I did further testing and found
the following:
1. The input file was DER encoded, not BER, so no BER chunking, just a
single 1.3 GiB OCTET STRING as inner data. (Checked with dumpasn1 and a
lot of patience), and was actually OK.
2. The same error messages are produced when the /output/ hits a broken
pipe such as piping into head(1) or having a script typo (my case).
So based on 2, it would have been much more helpful if the error message
had stated if the "parser" hit an I/O error on output or input, such as
"output: -: Broken pipe" while the status-fd stream could have said
[GNUPG:] ERROR verify.leave 32877 output - E_PIPE
Preferably also change GPG_ERR_SOURCE_UNKNOWN to some other constant
indicating output failure.
>> It would be much easier if the gpgsm code could be used standalone
>> like the old gpg1 could, with no entanglement to pinentry, dirmgr
>
> Yeah But for security reasons we have separated tasks in a way similar
> to what postfix does.
>
>> status-fd protocol etc. etc. scripted signing and verification of
>> computer generated data is not suited to a human-centric user
>
> Right, it is a machine interface. For gpg we have the extra tool gpgv
> to make verification against a known set of keys easy. And recently we
> added --assert-signer which basically does the same. There has never
> been a demand to have a dedicated verification tool for CMS but I can
> imagine to add a --assert-signer also to gpgsm.
My point was that status-fd isn't an easy interface to script against,
but your bug tracker already contains a rejected task to simplify
things.
>
> Your use of faketime is interesting ;-)
>
I use faketime to reflect the age of the data being processed, as the
certificates are rotated as necessary and the overall scripts contain a
table mapping origin dates to certificates and cert validity ranges.
Similar tricks may be needed to verify/decrypt stored e-mail based on
the delivery times found in the newest (topmost) "Received:" header.
P.S.
Your mail server ellsberg.gnupg.com appears to be a bit aggressive in
its greylisting (mails rejected first 3 to 4 times), causing NDR
reports to be mailed back to me after 30 minutes.
Enjoy
Jakob
--
Jakob Bohm, CIO, Partner, WiseMo A/S. https://www.wisemo.com
Transformervej 29, 2860 Søborg, Denmark. Direct +45 31 13 16 10
This public discussion message is non-binding and may contain errors.
WiseMo - Remote Service Management for PCs, Phones and Embedded
More information about the Gnupg-users
mailing list