The Problem
TL;DR: The canonical invoice omits semantic metadata relevant to the integrity of a bindle thus losing the guarantee of preserving the signed intent.
Currently, from the bindle spec, the merkle root of an invoice is computed by hashing the concatenation of the following pieces of data together in a line-separated (\n) UTF-8 string:by, name, version, role, at and the label.sha256 of each parcel.
E.g:
Gnome Grumpsky <gnome.grumpsky@example.com>
mybindle
0.1.0
creator
1611960337
~
e1706ab0a39ac88094b6d54a3f5cdba41fe5a901
098fa798779ac88094b6d54a3f5cdba41fe5a901
5b992e90b71d5fadab3cd3777230ef370df75f5b
What is not included in this construction is the integrity of the metadata that is semantically relevant (i.e. groups, features, conditions, annotations, and parcel metadata).
A possible attack vector arises for injecting/deselecting parcels from a bindle whereby an attacker that compromises a Bindle can change a bindle's invoice to augment how parcels are selected without corrupting the bindle's merkle root.
To preserve the cryptographic integrity of the invoice, all relevant semantic information should be included in the canonical invoice before computing the merkle root digest.
Proposed Solution
TL;DR When creating the canonical invoice of a bindle, include all semantically relevant metadata when computing the merkle root digest.
As currently defined by the spec, the canonical invoice of a bindle is structured as the concatenation of:
<by>
<name>
<version>
<role>
<timestamp>
~
<parcel digest 1>
...
<parcel digest N>
Omitting top-level metadata groups and annotations, as well as the following parcel metadata: annotations, conditions, features, media-type, name, and origin.
To guarantee integrity of an invoice, we should include these omitted pieces of metadata.
I.e,
<by>
<name>
<version>
<role>
<timestamp>
*<annotations>
*<groups>
~
e1706ab0a39ac88094b6d54a3f5cdba41fe5a901
*<annotations>
*<conditions>
*<media-type>
*<name>
*<origin>
...
~
098fa798779ac88094b6d54a3f5cdba41fe5a901
*<annotations>
*<conditions>
*<media-type>
*<name>
*<origin>
Where lines marked with * are the proposed additions.
Reproducibility & Ordering
Reconstructing the canonical invoice from a bindle's invoice.toml should be reproducible. To achieve this, the ordering of properties in each "block" (delimited by \n~\n) should be included in lexicographic order. As well, the ordering of blocks themselves is according to the lexicographic ordering of each parcel's content-digest, e.g. "DEADBEEF...".
Example
WIP
The Problem
TL;DR: The canonical invoice omits semantic metadata relevant to the integrity of a
bindlethus losing the guarantee of preserving the signed intent.Currently, from the bindle spec, the merkle root of an invoice is computed by hashing the concatenation of the following pieces of data together in a line-separated (
\n) UTF-8 string:by,name,version,role,atand thelabel.sha256of each parcel.E.g:
What is not included in this construction is the integrity of the metadata that is semantically relevant (i.e.
groups,features,conditions,annotations, and parcel metadata).A possible attack vector arises for injecting/deselecting parcels from a
bindlewhereby an attacker that compromises aBindlecan change abindle's invoice to augment how parcels are selected without corrupting thebindle's merkle root.To preserve the cryptographic integrity of the invoice, all relevant semantic information should be included in the canonical invoice before computing the merkle root digest.
Proposed Solution
TL;DR When creating the canonical invoice of a
bindle, include all semantically relevant metadata when computing the merkle root digest.As currently defined by the spec, the canonical invoice of a
bindleis structured as the concatenation of:Omitting top-level metadata
groupsandannotations, as well as the following parcel metadata:annotations,conditions,features,media-type,name, andorigin.To guarantee integrity of an invoice, we should include these omitted pieces of metadata.
I.e,
Where lines marked with
*are the proposed additions.Reproducibility & Ordering
Reconstructing the canonical invoice from a
bindle'sinvoice.tomlshould be reproducible. To achieve this, the ordering of properties in each "block" (delimited by\n~\n) should be included in lexicographic order. As well, the ordering of blocks themselves is according to the lexicographic ordering of eachparcel'scontent-digest, e.g. "DEADBEEF...".Example
WIP