On 2025-10-10 16:28, Phillip Hallam-Baker wrote:
Carsten is completely right about this. The problem is with the nested varints. 
You can't start writing out the enclosing structure until you know the length 
of the inner structures.

The nested construction is also a security hazzard, there are plenty of 
exploits that involve internal objects that overrun the enclosing length. There 
are occasions when this is actually necessary and useful, DER encoding is not 
one of them.


The problem with DER are deeper though in that the original 'specification' is 
really not much more than an offhand comment in the spec, a paragraph that says 
DER encoding is BER but always using the definite length encoding. There are no 
examples and it does not even consider the encoding of SET OF. That came later 
after someone realized that the 'canonical' encoding was not.

The history here appears to be that that someone had the idea of taking X.509 
certificates, stripping them apart, storing the results in an X.500 directory 
and then reassembling them during a meeting, they came up with DER over a long 
lunch and dropped it into the spec before anyone tried implementing it.

If you want digital signatures to work reliably, absolutely the only way to do 
that in practice is to ensure that you give the actual sequence of octets you 
signed to the party verifying. To attempt anything else is to be in a state of 
sin.

Oddly enough, Carsten & Co are currently developing the CBOR equivalent to DER (CDE), but 
they don't believe it is suitable for signing/hashing purposes.  "bstr" rulez!

Personally, I find the combination deterministically encoded CBOR and 
signatures working as a charm:
https://test.webpki.org/csf-lab/home

Anders




On Fri, Oct 10, 2025 at 2:58 AM Carsten Bormann <[email protected] 
<mailto:[email protected]>> wrote:

    On Oct 10, 2025, at 04:36, Laurence Lundblade <[email protected] 
<mailto:[email protected]>> wrote:
     >
     >
     >> On Oct 9, 2025, at 12:46 PM, Phillip Hallam-Baker <[email protected] 
<mailto:[email protected]>> wrote:
     >>
     >> I wrote nested varints. Gmail overrode me.
     >>
     >> The problem is that you can't DER encode an object in a single forward 
pass because you can't write the outermost object until its length is known and you 
don't know that till you have the lengths of the inner objects and so on.
     >
     > Right. Same for CBOR deterministic encoding.

    There is a *big* difference, though:

    DER needs lengths in bytes, so it needs to know the encoded byte lengths of 
all data items inside the one to be DER-encoded, which practically means you 
have to encode bottom-up.

    In CBOR, we only count bytes at the leaves (byte/text strings); otherwise 
we count whole child data items *at that node* (arrays, maps).
    The number of data items (array elements, key/value items in map entries) 
in a container generally is available to an implementation (*) *before* having 
done the encoding for all the data items in the container.

    We now know that an encoding scheme that requires byte lengths to match up 
hierarchically throughout an encoding tree is a recipe for constantly creating 
implementation vulnerabilities.
    Don’t do that.

    Obviously, embedded CBOR (byte strings that contain encoded CBOR data 
items) do require the byte string length of the embedded byte string to match 
up with the length of the embedded data item (as determined by its 
self-delimiting nature).
    This is much less of a problem than for DER, which has nested, redundant 
byte lengths everywhere, because protocol designers will use embedded CBOR 
where it is actually natural to process the embedded item before doing the 
encoding of the enclosing item.

    Grüße, Carsten

    (*) Except for a streaming encoder, which is incompatible with the way we 
have defined common deterministic encoding (CDE), mostly because there is no 
way to do the required map sorting in a streaming encoder in general.

    _______________________________________________
    COSE mailing list -- [email protected] <mailto:[email protected]>
    To unsubscribe send an email to [email protected] 
<mailto:[email protected]>


_______________________________________________
COSE mailing list -- [email protected]
To unsubscribe send an email to [email protected]

_______________________________________________
COSE mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to