Endorsement Assertion
An endorsement is a way of indicating approval for specific actions made on content after it has had a C2PA Manifest attached. (See Section 4, “Generating an endorsement”.) The endorsement assertion is where an endorsement from the signer of an ingredient C2PA asset (known here as an endorser) is stored. These endorsements are typically provided (out-of-band of this specification) by ingredient C2PA asset signers to actors those signers trust to perform the actions listed in the assertion (known here as endorsees). They are used by a validator when assessing whether the actions of the active C2PA Manifest are “endorsed” or not. (See Section 5, “Validation”.)
Version 1.0 Draft 05 May 2024 · Version history
Maintainers:
License
This specification is subject to the Community Specification License 1.0.
Additional information about this specification’s scope and governance can be found at the project’s GitHub repository (creator-assertions/endorsement-assertion). The Community Specification License documents at the root of that repository are the authoritative governance documents for this specification.
Contributing
This section is non-normative.
This specification is an active working draft. If you wish to contribute to its development, you are invited to:
Foreword
Attention is drawn to the possibility that some of the elements of this document may be the subject of patent rights. No party shall not be held responsible for identifying any or all such patent rights.
Any trade name used in this document is information given for the convenience of users and does not constitute an endorsement.
This document was prepared by the Creator Assertions Working Group.
Known patent licensing exclusions are available in the specification’s notices.md
file.
Any feedback or questions on this document should be directed to the specifications repository (GitHub: creator-assertions/endorsement-assertion).
THESE MATERIALS ARE PROVIDED “AS IS.” The Contributors and Licensees expressly disclaim any warranties (express, implied, or otherwise), including implied warranties of merchantability, non-infringement, fitness for a particular purpose, or title, related to the materials. The entire risk as to implementing or otherwise using the materials is assumed by the implementer and user. IN NO EVENT WILL THE CONTRIBUTORS OR LICENSEES BE LIABLE TO ANY OTHER PARTY FOR LOST PROFITS OR ANY FORM OF INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER FROM ANY CAUSES OF ACTION OF ANY KIND WITH RESPECT TO THIS DELIVERABLE OR ITS GOVERNING AGREEMENT, WHETHER BASED ON BREACH OF CONTRACT, TORT (INCLUDING NEGLIGENCE), OR OTHERWISE, AND WHETHER OR NOT THE OTHER MEMBER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Table of contents
1. Introduction
This section is non-normative.
1.1. Scope
For purposes of the Community Specification License, the scope.md document at the root of this project’s GitHub repository is the governing document of this specification’s scope.
|
1.2. Overview
Endorsements are a way of indicating approval of three possible actions (see Section 4.3, “Permitted actions”) that could be applied to an C2PA asset described by a C2PA Manifest in which the C2PA asset is used as an ingredient.
Endorsements endorse the specific actions (described in Section 4.3, “Permitted actions”) that MAY be taken by the endorsee, and are therefore valid for C2PA Manifests that use only the specified actions. Actions are only endorsed by the signer of that action’s referenced ingredient (known here as the endorser); they cannot be endorsed across more than multiple C2PA Manifests in the C2PA asset’s provenance.
1.3. Use case
As one example, an endorser may want to endorse another party, such as a content-distribution network, who will transcode its C2PA asset as part of a publication workflow. The endorser creates an endorsement that identifies the transcoder, and conveys the endorsement to them in some method that is out-of-band from this specification. When the transcoder creates their C2PA asset containing the ingredient, they include the endorsement as an endorsement assertion, which lets the C2PA Manifest consumer know that the actions they performed have been endorsed.
3. Terms and definitions
3.1. Actor
A human or non-human (hardware or software) that is participating in the C2PA ecosystem. For example: a camera (capture device), image editing software, cloud service, or the person using such tools.
An organization or group of actors may also be considered an actor. |
3.2. C2PA asset
A file or stream of data containing digital content, asset metadata, and a C2PA Manifest.
For the purposes of this definition, we will extend the typical definition of “file” to include cloud-native and dynamically-generated data.
The definition of “C2PA asset” in this specification differs from the definition of “asset” given in the C2PA technical specification. A “C2PA asset” as defined in this specification MUST contain a C2PA Manifest. |
3.3. C2PA Manifest
The set of information about the provenance of a C2PA asset based on the combination of one or more assertions, a single C2PA claim, and a claim signature.
See Section 11, “Manifests,” of the C2PA technical specification.
3.4. Endorsee
An actor who receives an endorsement to perform a limited set of actions.
3.5. Endorsement
A signed credential intended to convey approval from an endorser to perform a limited set of actions on C2PA assets on their behalf. Endorsements are not constrained to specific C2PA assets.
3.6. Endorser
An actor who provides an endorsement authorizing an endorsee to perform a limited set of actions on any C2PA asset signed by the endorser.
4. Generating an endorsement
4.1. Endorser workflow
-
a C2PA asset and a corresponding C2PA Manifest (which MAY be embedded in the C2PA asset)
-
an endorsement, as defined in Section 4.4, “Endorsement COSE payload”
An endorsement does not convey permission to perform these actions on any specific C2PA asset. Therefore, an endorsement MUST NOT be included in any C2PA Manifest or C2PA asset created by the endorser. It SHOULD be provided separately to the endorsee. |
The relationship among endorser, endorsee, and the endorser’s C2PA Manifest is represented by the following diagram, which is non-normative:
4.2. Endorsee workflow
An endorsee, once in possession of a C2PA asset and an endorsement signed by the same actor that signed the C2PA asset’s C2PA Manifest, MAY choose to perform one or more of the actions permitted in Section 4.3, “Permitted actions”, and describe those actions in a new C2PA Manifest.
The endorsee MAY include the endorsement by adding an endorsement assertion in the new C2PA Manifest’s assertion store.
Before generating an endorsement assertion, the endorsee MUST ensure that:
-
exactly one
c2pa.actions
assertion exists in the C2PA Manifest, -
only the actions listed under Section 4.3, “Permitted actions” are present in the actions assertion,
-
exactly one ingredient assertion is present in the assertion store, and,
-
that ingredient is the one referenced by the actions assertion’s
parameters.ingredient
field.
The endorsement assertion MUST have a label of cawg.endorsement
. The assertion contents MUST be a COSE_Sign1_Tagged
structure that is created as defined in Section 4.4, “Endorsement COSE payload”.
There MUST NOT be more than one endorsement assertion in any C2PA Manifest.
The relationship between the endorser’s C2PA asset and the endorsee’s C2PA asset is illustrated by the following diagram, which is non-normative:
4.3. Permitted actions
The c2pa.actions
assertion in a C2PA Manifest containing an endorsement assertion MAY contain any of the following action codes:
-
c2pa.published
-
c2pa.transcoded
-
c2pa.repackaged
The actions assertion MUST NOT contain any other action codes.
4.4. Endorsement COSE payload
Endorsements are COSE objects (see Section 13.2, “Digital Signatures,” of the C2PA 2.0 Technical Specification), where the COSE payload is an “endorsement target” data structure encoded as CBOR, as shown below. The endorseeCredential
field is an object with a single field, labelled according to the type of credential used to sign the endorsement. The label of this field indicates to validators the type of the credential present, so that they know how to decode, parse and validate the credential correctly. The following table details the format of each of the currently specified credential types:
4.4.1. Endorsement credential types
Credential name | CBOR label | Value type | Compares To |
---|---|---|---|
Reserved |
0 |
||
Reserved (deprecated) |
1 |
This CBOR label was used in a prior version of the endorsement assertion specification and should no longer be used. |
n/a |
X.509 Certificate Hash |
2 |
A SHA-256 hash of the endorsee’s X.509 certificate chain that will be used for signing the claims of C2PA assets that this endorsement is expected to be used with. |
The value of the credential shall be compared (bitwise identical) to a SHA-256 hash of the entire certificate chain located in the |
Endorsers SHALL place the credential of the signer they are endorsing (the endorsee) and its type in the endorseeCredential
. To limit the length of time that an endorser is lending their endorsement to the endorsee, the notValidBefore
and notValidAfter
fields MUST contain ISO 8601 date times.
The schema for the endorsement target type is defined by the endorsement-target-map
rule in the following CDDL Definition:
endorsement-target-map = {
"endorseeCredential" : public-credential, ; a DER-encoded SubjectPublicKeyInfo containing the public key
"notValidBefore": tdate, ; the date-time that this endorsement valid from; before this time it is not valid
"notValidAfter": tdate ; the date-time that this endorsement expires and is no longer valid
? "metadata": $assertion-metadata-map, ; additional information about the assertion
}
public-credential = {
$credential-type: any ; an extensible field allowing the specification of the credential payload
}
$credential-type /= 1 ; credentials with this type are a DER-encoded ASN.1 SubjectPublicKeyInfo structure, as a bstr (specification text for usage)
An example endorsement target is shown below:
{
"endorseeCredential": {
2: 'A SHA-256 hash of endorsee’s X.509 certificate chain'
},
"notValidBefore": 0("2021-03-21T20:04:00Z"),
"notValidAfter": 0("2022-03-21T20:04:00Z")
}
To sign an endorsement, follow the procedure specified in Section 13.2, “Digital Signatures,” of the C2PA 2.0 Technical Specification, using the serialised CBOR endorsement-target
object as the contents of the payload field. An endorser SHALL NOT include a x5chain
header and value, as endorsements are validated in the context of their use as an ingredient, and therefore use the signing credential of that ingredient C2PA Manifest. (See Section 5, “Validation”.)
The serialized COSE_Sign1_Tagged
structure resulting from the digital signature procedure is the endorsement that MAY be conveyed to the endorsee identified in the endorsement-target
, but the process for conveying it is out of scope of this specification.
5. Validation
Validation of an endorsement assertion SHALL only be attempted if the active C2PA Manifest first meets a number of conditions:
-
There is exactly one actions assertion present in the assertion store.
-
There is exactly one ingredient assertion.
-
There is exactly one endorsement assertion.
For each action
object in the actions assertion:
-
Check that the
action
field is set toc2pa.published
,c2pa.transcoded
, orc2pa.repackaged
. If any other action is present, fail the endorsement assertion validation process for this C2PA Manifest and do not proceed with further validation. -
Check the
ingredient
field that is a member of theparameters
object for the presence of a JUMBF URI. If the JUMBF URI is not present, or cannot be resolved to the related ingredient assertion, fail the endorsement assertion validation process for this C2PA Manifest and do not proceed with further validation. -
Follow the JUMBF URI link in the
ingredient
field to the ingredient assertion. Check that the URI link resolves to the single ingredient assertion in the active C2PA Manifest. If it does not, fail the endorsement assertion validation process for this C2PA Manifest and do not proceed with further validation. Check that therelationship
field isparentOf
. If it is not, fail the endorsement assertion validation process for this C2PA Manifest and do not proceed with further validation. -
Check the
c2pa_manifest
field in the ingredient assertion for the presence of a hashed URI. If the hashed URI is not present, or cannot be resolved to a C2PA Manifest, fail the endorsement assertion validation process for this C2PA Manifest and do not proceed with further validation. -
Follow the JUMBF URI link in the
c2pa_manifest
field to the ingredient’s C2PA Manifest. Ensure that this ingredient C2PA Manifest has been validated according to Section 15.8, “Recursively validating integrity of ingredients,” of the C2PA 2.0 Technical Specification, but do not skip the establishing of signer credential trust. If it does not validate, fail the endorsement assertion validation process for this C2PA Manifest and do not proceed with further validation. -
Validate the endorsement as described in Section 15.4, “Validate the signature,” of the C2PA Technical Specification, using the credential of the ingredient C2PA Manifest signer. If a signing credential is present in the endorsement’s signature’s headers, it shall not be used for validation. If validation fails, fail the endorsement assertion validation process for this C2PA Manifest and do not proceed with further validation.
-
Validate the
endorsement-target
payload itself, following the steps below:-
Compare the
endorseeCredential
to the SHA-256 hash of the credential of the active C2PA Manifest signer, according to the table found in Section 4.4.1, “Endorsement credential types”. If the comparison fails, fail the endorsement assertion validation process for this C2PA Manifest and do not proceed with further validation. -
If the active C2PA Manifest is timestamped, then the time-stamp must fall within the endorsement’s validity time range. If it does not, fail the endorsement assertion validation process for this C2PA Manifest and do not proceed with further validation.
-
If the active C2PA Manifest is not timestamped, then the time of validation must fall within the endorsement’s validity time range. If it does not, fail the endorsement assertion validation process for this C2PA Manifest and do not proceed with further validation.
-
If all steps above have been completed without failure, the endorsement assertion SHOULD be considered valid.
Appendix A: Version history
This section is non-normative.
28 February 2024
-
Prepare 1.0-draft version, derived from final description of endorsement assertion in C2PA 1.4 Technical Specification.
04 March 2024
-
Promoted from pre-draft to draft status.
05 May 2024