Skip to content

Commit 57a63dc

Browse files
committed
Make payloadType opaque; URI not required.
payloadType no longer needs to be a URI. That is still recommended, but the spec also suggests using Media Type if done carefully. To the verifier, it's just an opaque string.
1 parent 315a731 commit 57a63dc

File tree

2 files changed

+18
-19
lines changed

2 files changed

+18
-19
lines changed

background.md

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -119,17 +119,6 @@ Rationales for specific decisions:
119119
payloadType and payload. PAE is already documented and good enough. No
120120
need to reinvent the wheel.
121121

122-
- Why use a URI for payloadType rather than
123-
[Media Type](https://www.iana.org/assignments/media-types/media-types.xhtml)
124-
(a.k.a. MIME type)?
125-
126-
- Because Media Type only indicates how to parse but does not indicate
127-
purpose, schema, or versioning. If it were just "application/json", for
128-
example, then every application would need to impose some "type" field
129-
within the payload, lest we have similar vulnerabilities as if
130-
payloadType were not signed.
131-
- Also, URIs don't need to be registered while Media Types do.
132-
133122
- Why not stay backwards compatible by requiring the payload to always be JSON
134123
with a "_type" field? Then if you want a non-JSON payload, you could simply
135124
have a field that contains the real payload, e.g. `{"_type":"my-thing",

protocol.md

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,24 @@ KEYID | string | No | No
2626

2727
* SERIALIZED_BODY: Byte sequence to be signed.
2828

29-
* PAYLOAD_TYPE: Authenticated URI indicating how to interpret SERIALIZED_BODY.
30-
It encompasses the content type (JSON, Canonical-JSON, CBOR, etc.), the
31-
purpose, and the schema version of the payload. This obviates the need for
32-
the `_type` field within [in-toto]/[TUF] payloads. This URI does not need to
33-
be resolved to a remote resource, nor does such a resource need to be
34-
fetched. Examples: `https://in-toto.io/Link/v1.0`,
35-
`https://in-toto.io/Layout/v1.0`,
36-
`https://theupdateframework.com/Root/v1.0.5`.
29+
* PAYLOAD_TYPE: Opaque, case-sensitive string that uniquely and unambiguously
30+
identifies how to interpret `payload`. This includes both the encoding
31+
(JSON, CBOR, etc.) as well as the meaning/schema. To prevent collisions, the
32+
value SHOULD be either:
33+
34+
* [URI](https://tools.ietf.org/html/rfc3986) (recommended)
35+
* Example: `https://in-toto.io/Statement/v1-json`.
36+
* SHOULD resolve to a human-readable description but MAY be
37+
unresolvable.
38+
* SHOULD be case-normalized (section 6.2.2.1)
39+
* [Media Type](https://www.iana.org/assignments/media-types/), a.k.a. MIME
40+
type or Content Type
41+
* Example: `application/vnd.in-toto.statement.v1+json`.
42+
* IMPORTANT: SHOULD NOT be a generic type that only represents
43+
encoding but not schema. For example, `application/json` is almost
44+
always WRONG. Instead, invent a media type specific for your
45+
application in the `application/vnd` namespace.
46+
* SHOULD be lowercase.
3747

3848
* KEYID: Optional, unauthenticated hint indicating what key and algorithm was
3949
used to sign the message. As with Sign(), details are agreed upon

0 commit comments

Comments
 (0)