SDLP Object Format Specification
draft-norton-sdlp-obj-format-08
This document is an Internet-Draft (I-D).
Anyone may submit an I-D to the IETF.
This I-D is not endorsed by the IETF and has no formal standing in the
IETF standards process.
| Document | Type | Active Internet-Draft (individual) | |
|---|---|---|---|
| Author | Mark Norton | ||
| Last updated | 2026-08-05 | ||
| RFC stream | (None) | ||
| Intended RFC status | (None) | ||
| Formats | |||
| Stream | Stream state | (No stream defined) | |
| Consensus boilerplate | Unknown | ||
| RFC Editor Note | (None) | ||
| IESG | IESG state | I-D Exists | |
| Telechat date | (None) | ||
| Responsible AD | (None) | ||
| Send notices to | (None) |
draft-norton-sdlp-obj-format-08
Internet-Draft M. Norton
Intended status: Informational Independent
Expires: 06 February 2027 05 August 2026
SDLP Object Format Specification
draft-norton-sdlp-obj-format-08
M. Norton
Individual Submission
05 August 2026
Abstract
This document defines the canonical object format for the Secured
Digital Lifecycle Protocol (SDLP). The SDLP object format specifies
the structure, encoding, and canonicalization rules for DigitalID,
lineage fields, lifecycle timestamps, Body content, and signature
envelopes. These rules establish the immutable semantics required for
SDLP verification, provenance tracking, lifecycle transitions, and
interoperability with external systems such as CAID, AEC, AEB, SCITT,
and EMILIA.
Version -08 updates the canonical timestamp grammar, clarifies
DigitalID and lineage field semantics, refines Body canonicalization
rules, and incorporates corrections identified through SDLP Fixture
Bundle v4 testing. This revision aligns the object format with the
current SDLP Identity (-02), Lineage (-03), Lifecycle (-03), Security
Architecture (-04), Architecture (-03), Overview (-01), and Physics
Model (-00) drafts.
Status of This Memo
This Internet-Draft is submitted in full conformance with the
provisions of BCP 78 and BCP 79.
Internet-Drafts are working documents of the Internet Engineering
Task Force (IETF), its areas, and its working groups. Note that
other groups may also distribute working documents as Internet-
Drafts.
Internet-Drafts are draft documents valid for a maximum of six months
and may be updated, replaced, or obsoleted by other documents at any
time. It is inappropriate to use Internet-Drafts as reference
material or to cite them other than as "work in progress."
The list of current Internet-Drafts can be accessed at
https://www.ietf.org/1id-abstracts.html
The list of Internet-Draft Shadow Directories can be accessed at
https://www.ietf.org/shadow.html
Copyright Notice
Copyright (c) 2026 IETF Trust and the persons identified as the
document authors. All rights reserved.
This document is subject to BCP 78 and the IETF Trust's Legal
Provisions Relating to IETF Documents
(https://trustee.ietf.org/license-info) in effect on the date of
publication of this document. Please review these documents
carefully, as they describe your rights and restrictions with respect
to this document.
Table of Contents
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . 3
2. Terminology . . . . . . . . . . . . . . . . . . . . . . . 6
3. Canonical Object Envelope . . . . . . . . . . . . . . . . 9
4. Canonical Encoding Grammar . . . . . . . . . . . . . . . 14
5. Hashing and Signing Rules . . . . . . . . . . . . . . . . 21
6. Validation Rules . . . . . . . . . . . . . . . . . . . . 28
7. Security Considerations . . . . . . . . . . . . . . . . . 35
8. IANA Considerations . . . . . . . . . . . . . . . . . . . 38
9. Normative References . . . . . . . . . . . . . . . . . . 39
10. Informative References . . . . . . . . . . . . . . . . . 41
Author's Address . . . . . . . . . . . . . . . . . . . . . . . 43
1. Introduction
The Secured Digital Lifecycle Protocol (SDLP) defines a unified
identity, lineage, and lifecycle framework for digital objects.
Identity‑02 establishes the immutable DigitalID assigned at object
creation, and Lifecycle‑03 defines the canonical state machine and
transition semantics governing how SDLP objects evolve over time.
This document provides the third foundational pillar of the SDLP
suite: the canonical object format.
The SDLP object format defines the normative byte‑level
representation used for hashing, signing, validation, and
interoperability across SDLP implementations. All SDLP‑governed
objects MUST follow the canonical encoding, field ordering, and
serialization grammar defined in this specification. The object
format ensures that identity inheritance, lineage extension, and
lifecycle transitions produce deterministic and verifiable results.
Earlier drafts of the SDLP object format introduced preliminary
encoding concepts but lacked a complete canonical grammar,
deterministic serialization rules, and interoperability guarantees
required by Identity‑02 and Lifecycle‑03. Implementers identified
inconsistencies in field ordering, normalization behavior, and
hashing preimage construction that prevented reliable validation and
cross‑system interoperability.
Object‑Format‑08 maintains the frozen canonical envelope grammar
introduced in earlier revisions and updates it to align with the
current SDLP Identity‑02, Lineage‑03, Lifecycle‑03, Security‑04,
Architecture‑03, Overview‑01, and Physics‑00 drafts. The envelope has
exactly one valid byte sequence: four U+000A separators, no trailing
U+000A after Body, field values that MUST NOT contain CR or LF, and a
Body encoded using unpadded base64url as defined in RFC 4648
Section 5. Hashing and signing are performed over this exact byte
sequence without normalization. This frozen grammar ensures that all
SDLP implementations compute identical preimages, digests, and
signatures for the same logical object.
To aid implementers and reviewers, this revision introduces updated
examples of fully serialized SDLP objects. These examples illustrate
how DigitalID, InstanceID, Lineage, Timestamp, and Body appear in
practice when encoded using the frozen canonical grammar and updated
field semantics.
SDLP objects are designed for systems that require tamper‑evident
provenance, auditability, and lifecycle accountability. Typical
applications include regulated‑content workflows, digital media
provenance, software distribution lineage, and transparency‑log
ecosystems. In these environments, multiple independent
implementations—such as content‑authenticity services, audit
platforms, or provenance registries—MAY interoperate by exchanging
SDLP objects or by consuming their canonical digests. SDLP does not
require any specific external system, but provides a stable,
deterministic encoding suitable for cross‑vendor interoperability.
The canonical object format defined in this document is REQUIRED for:
* DigitalID encoding (Identity‑02),
* lifecycle transition validation (Lifecycle‑03),
* lineage extension and ancestry representation (Lineage‑03),
* tamper‑evident hashing and signing (Security‑04),
* transparency receipts and auditability.
All SDLP implementations MUST treat the object format defined in this
document as normative. Any deviation from the canonical encoding,
field ordering, or serialization grammar constitutes a violation of
SDLP semantics and MUST be rejected by relying parties.
This document updates and replaces draft‑norton‑sdlp‑obj‑format‑07
and provides the authoritative definition of the SDLP object format
required for interoperable identity, lineage, and lifecycle
processing.
2. Terminology
The following terms are used throughout this document. All terms are
descriptive unless explicitly marked as normative. Identity-related
terms are defined in draft-norton-sdlp-identity-02 and lifecycle
terms are defined in draft-norton-sdlp-lifecycle-03. This section
defines terminology specific to the SDLP object format.
Canonical Representation:
The normative byte-level encoding of an SDLP object. Canonical
representation is deterministic, stable, and used for hashing,
signing, validation, and interoperability. All SDLP objects MUST
be serialized using the canonical representation defined in this
document. Object-Format-08 maintains the frozen canonical grammar
so that each logical object has exactly one valid byte sequence.
Object Envelope:
The top-level structure of an SDLP object. The envelope contains
the DigitalID, InstanceID, Lineage, Timestamp, and the object
body. The envelope is serialized using the canonical encoding
grammar defined in Section 4, which specifies exactly four U+000A
separators and prohibits any trailing U+000A after Body.
Object Header:
The portion of the object envelope containing DigitalID,
InstanceID, Lineage, and Timestamp. The header is always encoded
before the object body and follows strict field ordering rules.
Object Body:
The content, payload, or data associated with an SDLP object. The
body may represent media, metadata, structured data, or any other
digital content. The body is included in canonical representation
and MUST follow the encoding rules defined in this specification,
including unpadded base64url encoding as defined in RFC 4648
Section 5.
Field Ordering:
The normative sequence in which fields MUST appear in the canonical
representation. Field ordering is fixed and MUST NOT vary across
implementations. Any deviation constitutes a canonicalization
error.
Serialization Grammar:
The normative encoding rules governing how fields, values, arrays,
and nested structures are serialized. The serialization grammar
ensures deterministic byte-level output across all SDLP
implementations. The grammar defined in Object-Format-08 is
frozen and MUST NOT be altered by implementations.
Hashing Preimage:
The exact byte sequence used as input to cryptographic hash
functions. The hashing preimage MUST be the canonical envelope
defined in Section 4. Any other input is invalid.
Signing Preimage:
The exact byte sequence used as input to digital signature
algorithms. The signing preimage MUST be identical to the hashing
preimage unless otherwise specified by Security-04.
Normalization:
The process of converting an SDLP object into its canonical
representation. Normalization MUST be deterministic and MUST NOT
alter semantic content. Normalization rules are defined in
Section 4. Verifiers MUST validate signatures over the received
bytes and MUST NOT normalize input prior to verification.
Deterministic Encoding:
An encoding process that produces identical byte sequences for
identical logical objects across all compliant implementations.
Deterministic encoding is REQUIRED for hashing, signing, and
interoperability.
Relying Party:
Any system that consumes SDLP objects and performs validation,
verification, or admission decisions based on canonical
representation, identity, lineage, or lifecycle metadata.
SCITT:
The IETF Secure Credential Infrastructure for Transparent Trust.
SCITT profiles MAY carry the digest of the canonical envelope for
transparency receipts and auditability. SCITT does not require the
SDLP envelope itself, and does not mandate SDLP-specific encoding.
EMILIA:
An external provenance and authenticity framework. EMILIA profiles
MAY incorporate the digest of the canonical envelope for
cross-system interoperability. EMILIA does not require the SDLP
encoding and does not mandate SDLP-specific serialization.
Canonical Error:
Any deviation from the canonical representation, field ordering,
or serialization grammar. Canonical errors MUST cause relying
parties to reject the object.
3. Canonical Object Envelope
The canonical object envelope defines the top-level structure of all
SDLP-governed objects. The envelope contains the identity fields,
lifecycle fields, and object body, all serialized using the canonical
encoding grammar defined in Section 4. The envelope is the normative
unit of hashing, signing, validation, and interoperability.
Object-Format-08 freezes the canonical envelope grammar. The envelope
has exactly one valid byte sequence: four U+000A separators, no
trailing U+000A after Body, field values that MUST NOT contain CR or
LF, and a Body encoded using unpadded base64url as defined in RFC
4648 Section 5. Hashing and signing are performed over this exact
byte sequence without normalization. Any deviation constitutes a
canonicalization error and MUST cause relying parties to reject the
object.
3.1. Envelope Structure
An SDLP object envelope consists of the following components:
* DigitalID
* InstanceID
* Lineage
* Timestamp
* Body
These components MUST appear in the canonical representation in the
exact order listed above. Field ordering is normative and MUST NOT be
altered by any implementation.
The canonical envelope is represented conceptually as:
Envelope := {
DigitalID,
InstanceID,
Lineage,
Timestamp,
Body
}
The envelope is serialized using the deterministic encoding grammar
defined in Section 4. The envelope MUST NOT include optional fields,
alternative encodings, or implementation-specific metadata. The
grammar defined in this document is frozen and MUST NOT be altered by
implementations.
3.2. DigitalID Component
DigitalID is the immutable identity tuple defined in Identity-02.
DigitalID uniquely identifies the origin object and is inherited
unchanged by all descendants.
DigitalID MUST appear first in the canonical envelope. DigitalID MUST
be encoded using the canonical grammar defined in Identity-02 and
MUST NOT be modified, reordered, or re-encoded during lifecycle
transitions.
3.3. InstanceID Component
InstanceID is the per-object identifier assigned at each lifecycle
transition. InstanceID MUST follow the hierarchical grammar defined
in draft-norton-sdlp-lifecycle-03.
InstanceID MUST appear immediately after DigitalID in the canonical
envelope. InstanceID MUST be encoded as a canonical string using the
serialization grammar defined in Section 4.
3.4. Lineage Component
Lineage reflects the complete ancestry of the object. Lineage MUST
follow the hierarchical grammar defined in draft-norton-sdlp-lifecycle-03
and MUST grow deterministically with each lifecycle transition.
Lineage MUST appear immediately after InstanceID in the canonical
envelope. Lineage MUST be encoded as a canonical string using the
serialization grammar defined in Section 4.
3.5. Timestamp Component
Timestamp reflects the moment the lifecycle transition occurred.
Timestamp MUST follow the canonical grammar defined in Lifecycle-03:
Date := YYYY-MM-DD
Time := HH:MM:SS
Timestamp := Date "T" Time
Timestamp MUST appear immediately after Lineage in the canonical
envelope. Timestamp MUST be encoded as a canonical string. Timestamp
values MUST NOT contain CR, LF, or timezone suffixes.
3.6. Body Component
The Body contains the content, payload, or data associated with the
SDLP object. The Body may represent media, metadata, structured data,
or any other digital content.
The Body MUST appear last in the canonical envelope. The Body MUST be
encoded using the canonical serialization grammar defined in Section
4, including unpadded base64url encoding. The Body MUST NOT contain
CR or LF. The Body MUST be included in the hashing and signing
preimage, and no trailing U+000A MUST follow the Body.
3.7. Envelope Determinism Requirements
The canonical envelope is deterministic if and only if:
* all fields appear in the normative order,
* all fields are encoded using the canonical grammar,
* no optional fields or alternative encodings are present,
* DigitalID is preserved exactly,
* InstanceID, Lineage, and Timestamp follow Lifecycle-03 rules,
* the Body is encoded deterministically using unpadded base64url,
* exactly four U+000A separators are present,
* no trailing U+000A follows the Body.
Deterministic envelopes are REQUIRED for hashing, signing,
interoperability, and validation.
3.8. Envelope Validation
A relying party MUST validate the canonical envelope before accepting
an SDLP object. Envelope validation MUST ensure:
* field ordering is correct,
* DigitalID is valid (Identity-02),
* InstanceID and Lineage follow canonical grammar,
* Timestamp is well-formed,
* Body is encoded canonically using unpadded base64url,
* exactly four U+000A separators are present,
* no trailing U+000A follows the Body,
* no extraneous fields or metadata are present.
Envelope validation failures MUST cause the object to be rejected.
3.9. Example SDLP Object
The following example illustrates a fully serialized SDLP object
encoded using the frozen canonical grammar. The example shows the
exact five-field, LF-delimited canonical envelope with unpadded
base64url Body encoding and no trailing U+000A.
dist123/cust456/prod789/MovieTitle/dl001/2026-07-27T14:32:10
1.4
1.4
2026-08-01T08:30:15
SGVsbG8sIFNETFAh
SHA-256: 4e121057d46afec547e04ec63194ffd8a1e27178e06ba563b760fb35a436f32b
In this example:
* DigitalID is "dist123/cust456/prod789/MovieTitle/dl001/2026-07-27T14:32:10",
* InstanceID is "1.4",
* Lineage is "1.4",
* Timestamp is "2026-08-01T08:30:15",
* Body is the unpadded base64url encoding of the UTF-8 string
"Hello, SDLP!".
This example is provided for illustration only. All SDLP objects MUST
follow the frozen canonical grammar defined in this document.
4. Canonical Encoding Grammar
The canonical encoding grammar defines the normative byte-level
serialization rules for all SDLP objects. The grammar ensures that
every SDLP implementation produces identical canonical representations
for identical logical objects, enabling deterministic hashing,
signing, validation, and interoperability.
Object-Format-08 freezes the canonical encoding grammar. The grammar
defines exactly one valid byte sequence for each logical object:
four U+000A separators, no trailing U+000A after Body, field values
that MUST NOT contain CR or LF, and a Body encoded using unpadded
base64url as defined in RFC 4648 Section 5. Hashing and signing are
performed over this exact byte sequence without normalization.
All SDLP-governed objects MUST be serialized using the canonical
encoding grammar defined in this section. Any deviation constitutes a
canonicalization error and MUST cause relying parties to reject the
object.
4.1. Deterministic Serialization Requirements
Canonical serialization MUST satisfy the following requirements:
* deterministic: identical logical objects produce identical bytes,
* stable: encoding rules MUST NOT vary across implementations,
* complete: all fields in the envelope MUST be serialized,
* ordered: fields MUST appear in the normative sequence defined in
Section 3,
* unambiguous: no optional fields, alternative encodings, or
implementation-specific metadata are permitted,
* strict: whitespace, formatting, and structural rules MUST be
applied exactly.
Deterministic serialization is REQUIRED for hashing, signing,
lifecycle validation, and interoperability. SCITT and EMILIA profiles
MAY incorporate the digest of the canonical envelope; neither system
requires the SDLP envelope itself.
4.2. Encoding Model
SDLP uses a strict, text-based canonical encoding model. All fields
are serialized as UTF-8 strings using the grammar defined in this
section. No binary encodings, compression schemes, or alternative
serialization formats are permitted.
The canonical representation is conceptually:
Canonical := DigitalID "\n"
InstanceID "\n"
Lineage "\n"
Timestamp "\n"
Body
where each component is encoded using the rules defined below. The
grammar is frozen and MUST NOT be altered by implementations.
4.3. String Encoding Rules
All SDLP fields MUST be encoded as UTF-8 strings. The following rules
apply:
* no leading or trailing whitespace,
* no indentation or formatting characters,
* no optional whitespace between tokens,
* no alternative quoting or escaping conventions,
* no normalization beyond UTF-8 encoding,
* field values MUST NOT contain CR or LF.
Strings MUST be encoded exactly as defined in Identity-02 and
Lifecycle-03.
4.4. Field Ordering Rules
Fields MUST appear in the canonical representation in the following
order:
1. DigitalID
2. InstanceID
3. Lineage
4. Timestamp
5. Body
Field ordering is normative. Any deviation constitutes a canonical
error.
4.5. DigitalID Encoding
DigitalID MUST be encoded using the canonical grammar defined in
Identity-02. DigitalID MUST appear exactly as assigned at origin and
MUST NOT be modified during lifecycle transitions.
DigitalID MUST be encoded as a single UTF-8 string.
4.6. InstanceID Encoding
InstanceID MUST be encoded using the hierarchical grammar defined in
Lifecycle-03:
InstanceID := number *( "." number )
InstanceID MUST be encoded as a single UTF-8 string with no
whitespace, padding, or alternative separators.
4.7. Lineage Encoding
Lineage MUST be encoded using the hierarchical grammar defined in
Lifecycle-03:
Lineage := number *( "." number )
Lineage MUST reflect the complete ancestry of the object and MUST be
encoded as a single UTF-8 string.
4.8. Timestamp Encoding
Timestamp MUST follow the canonical grammar defined in Lifecycle-03:
Date := YYYY "-" MM "-" DD
Time := HH ":" MM ":" SS
Timestamp := Date "T" Time
Timestamp MUST be encoded as a single UTF-8 string. Timestamp values
MUST NOT contain CR, LF, or timezone suffixes.
4.9. Body Encoding
The Body contains the object’s content or payload. The Body MUST be
encoded as a UTF-8 string using the following rules:
* Body MUST NOT contain leading or trailing whitespace,
* Body MUST NOT contain indentation or formatting artifacts,
* Body MUST NOT contain implementation-specific metadata,
* Body MUST NOT contain CR or LF,
* Body MUST be included exactly as provided by the lifecycle
transition.
Binary Bodies (e.g., media, structured data, or arbitrary byte
sequences) MUST be encoded using URL-safe Base64 without padding.
The Base64 value MUST represent the exact raw bytes of the Body and
MUST be included verbatim in the canonical representation.
4.10. Canonical Newline Rules
The canonical representation MUST use the newline character:
"\n" (U+000A)
Newlines MUST appear only between the envelope fields defined in
Section 3. Newlines MUST NOT appear within DigitalID, InstanceID,
Lineage, or Timestamp.
The canonical envelope contains exactly four U+000A separators and
MUST NOT contain a trailing U+000A after Body. Any other newline
placement constitutes a canonicalization error.
4.11. Prohibited Encodings
The following encodings MUST NOT be used:
* JSON, CBOR, XML, or other structured formats,
* binary encodings,
* compression formats,
* whitespace-normalized formats,
* implementation-specific serialization schemes.
Any prohibited encoding constitutes a canonical error.
4.12. Canonicalization Errors
A relying party MUST reject an SDLP object if:
* field ordering is incorrect,
* any field violates its encoding grammar,
* whitespace rules are violated,
* prohibited encodings are used,
* DigitalID is modified or re-encoded,
* InstanceID or Lineage violate hierarchical grammar,
* Timestamp is malformed,
* Body is not encoded canonically,
* newline placement violates Section 4.10.
Canonicalization errors MUST be surfaced to the relying party or
verifier.
5. Hashing and Signing Rules
This section defines the normative hashing and signing rules for all
SDLP objects. Hashing and signing provide tamper-evident integrity,
lifecycle accountability, and interoperability with external
provenance systems. Object-Format-08 freezes the hashing and signing
preimage to ensure that each logical object has exactly one valid
byte sequence.
All SDLP implementations MUST compute hashes and signatures using the
canonical representation defined in Section 4. Any deviation
constitutes a canonicalization error and MUST cause relying parties
to reject the object.
5.1. Hashing Preimage
The hashing preimage is the exact byte sequence used as input to
cryptographic hash functions. The hashing preimage MUST be:
HashPreimage := CanonicalEnvelope
where CanonicalEnvelope is the deterministic, five-field, LF-delimited
SDLP envelope defined in Section 4.
The hashing preimage MUST include:
* DigitalID,
* InstanceID,
* Lineage,
* Timestamp,
* Body (unpadded base64url of raw bytes),
* exactly four U+000A separators.
The hashing preimage MUST represent the canonical envelope exactly as
serialized. A trailing U+000A after the Body MUST NOT appear in the
canonical envelope and MUST NOT be included in the hashing preimage.
The hashing preimage MUST NOT include:
* non-canonical whitespace,
* implementation-specific metadata,
* alternative encodings (including JSON, CBOR, XML),
* signature envelopes,
* compression artifacts,
* any normalization beyond UTF-8 encoding.
Hashing MUST be performed over the exact canonical byte sequence with
no trimming, transformation, reinterpretation, or normalization.
5.2. Hash Function Requirements
SDLP does not mandate a specific hash algorithm, but all compliant
implementations MUST use a cryptographic hash function that:
* is collision-resistant,
* is preimage-resistant,
* is widely deployed and audited,
* produces a fixed-length output.
SHA-256 is RECOMMENDED for interoperability with external provenance
systems.
Relying parties MUST reject objects hashed with non-cryptographic or
deprecated algorithms.
5.3. Signing Preimage
The signing preimage is the exact byte sequence used as input to
digital signature algorithms. The signing preimage MUST be identical
to the hashing preimage:
SigningPreimage := HashPreimage
unless otherwise specified by SDLP Security-04.
Implementations MUST NOT sign:
* non-canonical representations,
* partial envelopes,
* modified or normalized variants,
* metadata not included in the canonical envelope,
* alternative encodings of the Body.
Signatures MUST be computed over the canonical byte sequence exactly.
The signature MUST cover the complete LF-delimited SDLP envelope,
including all four U+000A separators and the unpadded base64url Body
value representing the exact raw bytes of the object.
5.4. Signature Envelope
A signature envelope contains the digital signature and associated
metadata. The signature envelope MUST NOT be included in the hashing
or signing preimage.
The signature envelope MAY contain:
* signature algorithm identifier,
* public key identifier,
* signature value,
* optional certificate chain.
Signature envelopes MUST NOT modify, replace, or reinterpret the
canonical representation.
5.5. Verification Rules
A relying party MUST verify signatures using the following procedure:
1. Parse the received bytes exactly as provided.
2. Confirm that the received bytes satisfy the canonical grammar
defined in Section 4.
3. Compute the hash over the received canonical envelope bytes.
4. Verify the signature using the SigningPreimage.
5. Validate DigitalID, InstanceID, Lineage, and Timestamp.
6. Validate lifecycle state and transition correctness (Lifecycle-03).
Verification MUST fail if:
* canonicalization fails,
* the signature does not match the SigningPreimage,
* the hash does not match the canonical envelope,
* DigitalID is modified or re-encoded,
* InstanceID or Lineage violate canonical grammar,
* Timestamp is malformed,
* Body is not encoded as unpadded base64url of raw bytes.
Verifiers MUST NOT normalize input prior to signature verification.
Acceptance requires byte equality between the received envelope and
the hashing/signing preimage.
5.6. SCITT and EMILIA Interoperability
SDLP achieves interoperability with external provenance systems by:
* using a stable canonical encoding grammar,
* defining a single hashing preimage,
* defining a single signing preimage,
* prohibiting alternative encodings,
* prohibiting metadata in the canonical envelope.
SCITT and EMILIA profiles MAY incorporate the digest of the canonical
envelope. Neither system requires the SDLP envelope itself, and no
external system mandates SDLP-specific encoding.
5.7. Hashing and Signing Errors
A relying party MUST reject an SDLP object if:
* the hashing preimage is non-canonical,
* the signature is computed over a non-canonical representation,
* the signature envelope modifies canonical fields,
* the hash does not match the canonical envelope,
* the signature fails verification,
* prohibited encodings are used,
* the Body is not encoded as unpadded base64url of raw bytes.
Hashing and signing errors MUST be surfaced to the verifier or
relying party.
6. Validation Rules
Validation ensures that SDLP objects conform to the canonical
representation, identity semantics, lineage grammar, and lifecycle
rules defined across the SDLP specification suite. Relying parties,
verifiers, and SDLP-aware systems MUST apply the validation procedures
described in this section before accepting any SDLP object as
admissible.
Validation MUST be performed over the received canonical envelope
bytes. Verifiers MUST NOT normalize input prior to validation. Any
deviation from canonical encoding, field ordering, or serialization
grammar constitutes a validation failure.
6.1. Validation Preconditions
A relying party MUST parse the received bytes exactly as provided and
confirm that those bytes satisfy the canonical grammar defined in
Section 4. Validation MUST NOT be performed over normalized,
reconstructed, partially canonical, or alternative encodings.
Validation MUST ensure:
* the envelope is well-formed,
* all required fields are present,
* field ordering is correct,
* no prohibited fields or metadata are present,
* DigitalID is valid (Identity-02),
* InstanceID and Lineage follow hierarchical grammar (Lifecycle-03),
* Timestamp is well-formed and contains no timezone suffix,
* Body is encoded canonically as unpadded base64url of raw bytes,
* exactly four U+000A separators are present,
* no trailing U+000A follows the Body.
6.2. Envelope Validation
Envelope validation ensures that the top-level structure of the SDLP
object conforms to Section 3. Envelope validation MUST verify:
* DigitalID appears first,
* InstanceID appears second,
* Lineage appears third,
* Timestamp appears fourth,
* Body appears last,
* each field is encoded as a UTF-8 string,
* field values contain no CR or LF,
* newline separators follow canonical rules (U+000A),
* the envelope consists of exactly five fields and four separators,
* no trailing U+000A follows the Body,
* no additional fields or metadata are present.
Envelope validation failures MUST cause the object to be rejected.
6.3. Identity Validation
Identity validation ensures that DigitalID is preserved exactly across
lifecycle transitions. Identity validation MUST verify:
* Child.DigitalID == Parent.DigitalID (byte-wise equality),
* no DigitalID fields differ,
* no DigitalID fields have been regenerated or replaced,
* DigitalID conforms to Identity-02 encoding grammar.
Identity validation failures MUST cause the object to be rejected.
6.4. InstanceID Validation
InstanceID validation ensures that lifecycle transitions follow the
canonical hierarchical grammar. InstanceID validation MUST verify:
* InstanceID := number *( "." number ),
* InstanceID extends the parent InstanceID by appending "." ChildIndex,
* ChildIndex is a positive integer,
* ChildIndex is unique among siblings,
* no truncation, rewriting, or reordering has occurred.
InstanceID validation failures MUST cause the object to be rejected.
6.5. Lineage Validation
Lineage validation ensures that ancestry is preserved and extended
deterministically. Lineage validation MUST verify:
* Lineage := number *( "." number ),
* Lineage extends the parent Lineage by appending "." ChildIndex,
* Lineage reflects complete ancestry,
* no truncation or rewriting has occurred,
* no malformed segments are present.
Lineage validation failures MUST cause the object to be rejected.
6.6. Timestamp Validation
Timestamp validation ensures that lifecycle transitions record the
correct moment of creation. Timestamp validation MUST verify:
* Timestamp := YYYY-MM-DD "T" HH:MM:SS,
* Timestamp is well-formed,
* Timestamp contains no timezone suffix,
* Timestamp is not reused across transitions,
* Timestamp is distinct from the immutable Date and Time fields in
DigitalID.
Timestamp validation failures MUST cause the object to be rejected.
6.7. Body Validation
Body validation ensures that the object’s content is encoded
canonically. Body validation MUST verify:
* Body is encoded as a UTF-8 string,
* Body contains no leading or trailing whitespace,
* Body contains no indentation or formatting artifacts,
* Body contains no implementation-specific metadata,
* Body contains no CR or LF,
* Body is encoded as unpadded base64url (RFC 4648 §5),
* the Base64 value represents the exact raw bytes of the object’s
content,
* Body is included exactly as provided by the lifecycle transition.
Body validation failures MUST cause the object to be rejected.
6.8. Hash and Signature Validation
Hash and signature validation MUST follow Section 5. Relying parties
MUST verify:
* the hash is computed over the received canonical envelope bytes,
* the signature is computed over the received canonical envelope,
* the signature envelope does not modify canonical fields,
* the signature matches the SigningPreimage,
* the hash matches the canonical envelope exactly,
* all newline separators are canonical (U+000A),
* the Body is the exact unpadded base64url value included in the
canonical envelope.
Hash or signature validation failures MUST cause the object to be
rejected.
6.9. Canonicalization Errors
A relying party MUST reject an SDLP object if any of the following
canonicalization errors occur:
* incorrect field ordering,
* malformed DigitalID, InstanceID, Lineage, or Timestamp,
* prohibited encodings (JSON, CBOR, XML, binary),
* non-canonical whitespace,
* missing or extraneous fields,
* modified DigitalID,
* malformed hierarchical grammar,
* Body not encoded as unpadded base64url of raw bytes,
* incorrect newline placement,
* malformed canonical envelope.
Canonicalization errors MUST be surfaced to the verifier or relying
party.
7. Security Considerations
The SDLP object format provides the foundation for tamper-evident
identity, lineage, and lifecycle guarantees across all SDLP
implementations. Security in SDLP depends critically on the
deterministic canonical representation defined in this document.
Incorrect, inconsistent, or non-canonical encodings directly weaken
SDLP’s integrity model and MUST be rejected by relying parties.
7.1. Canonical Representation Integrity
The canonical encoding grammar defined in Section 4 ensures that all
SDLP objects produce identical byte-level representations across
implementations. Deterministic canonical representation is REQUIRED
for hashing, signing, lifecycle validation, and interoperability.
The canonical envelope consists of exactly five UTF-8 fields separated
by four LF (U+000A) characters, with the Body encoded as unpadded
base64url of raw bytes. Any deviation from this representation—such
as alternative whitespace, field reordering, malformed Base64, or
non-canonical serialization—constitutes a security violation.
Relying parties MUST reject objects that fail canonicalization.
7.2. Hashing and Signing Integrity
Hashing and signing rules defined in Section 5 ensure that SDLP
objects cannot be modified without detection. Security depends on the
following invariants:
* the hashing preimage MUST be the canonical envelope,
* the signing preimage MUST be identical to the hashing preimage,
* signatures MUST NOT be computed over non-canonical encodings,
* signature envelopes MUST NOT modify canonical fields,
* newline separators MUST be canonical (U+000A),
* the Body MUST be the exact unpadded base64url value included in
the envelope.
If an attacker attempts to alter DigitalID, InstanceID, Lineage,
Timestamp, or Body, the canonical hash will change and signature
verification will fail. Relying parties MUST treat any mismatch as a
tampering event.
7.3. Identity and Lineage Integrity
Identity-02 and Lifecycle-03 define strict rules for DigitalID,
InstanceID, and Lineage. The object format enforces these rules by
requiring:
* DigitalID to be preserved exactly (byte-wise equality),
* InstanceID to follow hierarchical grammar,
* Lineage to reflect complete ancestry,
* Timestamp to be unique per transition.
Incorrect identity or lineage encoding can cause misattribution,
ancestry confusion, or lifecycle ambiguity. Relying parties MUST
reject objects whose identity or lineage fields violate canonical
grammar.
7.4. Replay Considerations
SDLP does not, by itself, prevent replay attacks. A correctly signed
canonical envelope can be replayed byte-for-byte. Unique InstanceID,
Lineage, and Timestamp values detect modification, but they do not
establish freshness or one-time use.
Replay resistance requires relying-party state, such as:
* an accepted-InstanceID registry,
* monotonic lineage tracking,
* nonce or challenge mechanisms,
* transparency-log uniqueness checks,
* atomic one-time consumption semantics.
A stateless verifier can only report that the object is authentic and
previously well-formed.
7.5. BitDrop Conditions
SDLP defines a BitDrop as any event that attempts to rewrite,
truncate, substitute, or downgrade identity, lineage, or canonical
representation. BitDrop events violate SDLP lifecycle semantics and
MUST be rejected before hashing, signing, or validation occur.
The following conditions constitute a BitDrop:
* replacing a child object with its parent,
* truncating lineage to hide ancestry,
* rewriting InstanceID to alter transition order,
* modifying Timestamp to obscure event timing,
* substituting non-canonical encodings,
* injecting metadata into the canonical envelope,
* altering DigitalID in any way,
* altering the Base64 Body value or its underlying raw bytes.
BitDrop events are invalid lifecycle-transition attempts and MUST be
rejected, logged, and surfaced to policy. They are relevant to threat
modeling because adversaries may submit them.
7.6. Metadata Injection Protection
SDLP prohibits optional fields, alternative encodings, and
implementation-specific metadata. Metadata injection attacks may
attempt to:
* embed hidden fields in the envelope,
* alter whitespace or formatting,
* introduce non-canonical serialization artifacts,
* add fields that influence downstream processing,
* modify the Base64 Body value or introduce padding.
Relying parties MUST reject any object containing extraneous fields,
metadata, or non-canonical formatting.
7.7. Interoperability Security
SDLP achieves interoperability with external provenance systems by
defining a stable canonical envelope, a single hashing preimage, and
a single signing preimage. SCITT and EMILIA profiles MAY incorporate
the digest of the canonical envelope. Neither system requires the
SDLP envelope itself, and no external system mandates SDLP-specific
encoding.
Any deviation from canonical representation undermines cross-system
validation and MUST be treated as a security failure.
7.8. Implementation Guidance
Implementers SHOULD:
* validate canonical representation before processing,
* reject non-canonical encodings early,
* use audited cryptographic libraries,
* ensure UTF-8 correctness and stability,
* ensure Base64 encoding is URL-safe and unpadded.
Implementers MUST NOT:
* modify DigitalID during transitions,
* rewrite InstanceID or Lineage,
* alter Timestamp semantics,
* introduce optional or vendor-specific fields,
* use non-canonical serialization formats,
* alter newline separators,
* alter the Base64 Body value.
7.9. Summary
The SDLP object format is a security-critical component of the SDLP
architecture. Deterministic canonical representation, strict field
ordering, canonical newline rules, unpadded base64url Body encoding,
and stable hashing and signing rules ensure that SDLP objects remain
tamper-evident, verifiable, and interoperable across all
implementations. Relying parties MUST enforce canonicalization and
validation to maintain SDLP’s security guarantees.
8. IANA Considerations
This document has no IANA actions.
SDLP does not define protocol parameters, registries, code points, or
other values requiring IANA allocation or management. All identifiers
used in SDLP (DigitalID, InstanceID, Lineage, Timestamp) are defined
deterministically by SDLP specifications and do not require external
registration.
Future SDLP documents MAY introduce optional registries for object
types, transformation classes, or provenance metadata. Any such
registries would be defined in their respective documents and are not
required by the canonical object format.
9. Normative References
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
Requirement Levels", BCP 14, RFC 2119,
DOI 10.17487/RFC2119, March 1997.
[RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC
2119 Key Words", BCP 14, RFC 8174,
DOI 10.17487/RFC8174, May 2017.
[RFC4648] Josefsson, S., "The Base16, Base32, and Base64 Data
Encodings", RFC 4648, DOI 10.17487/RFC4648,
October 2006.
[SDLP-Identity-02]
Norton, M., "SDLP Identity Specification",
draft-norton-sdlp-identity-02, July 2026.
[SDLP-Lifecycle-03]
Norton, M., "SDLP Lifecycle State Machine and Transition
Rules", draft-norton-sdlp-lifecycle-03, July 2026.
[SDLP-Lineage-03]
Norton, M., "SDLP Lineage Structure and Ancestry Grammar",
draft-norton-sdlp-lineage-03 (work in progress),
July 2026.
[SCITT-Architecture]
IETF SCITT Working Group, "SCITT Architecture",
draft-ietf-scitt-architecture, work in progress.
10. Informative References
[SDLP-Architecture]
Norton, M., "SDLP Architectural Overview",
draft-norton-sdlp-architecture-03 (work in progress),
July 2026.
[SDLP-Overview-01]
Norton, M., "SDLP Overview",
draft-norton-sdlp-overview-01 (work in progress),
July 2026.
[SDLP-Physics-00]
Norton, M., "SDLP Representation, Semantics, and Physical Mapping",
draft-norton-sdlp-physics-00 (work in progress), July 2026.
[SCITT-Use-Cases]
IETF SCITT Working Group, "SCITT Use Cases",
draft-ietf-scitt-use-cases, work in progress.
[C2PA]
Coalition for Content Provenance and Authenticity (C2PA),
"C2PA Specification", Version 2.0, 2025.
[W3C-VC]
World Wide Web Consortium, "Verifiable Credentials Data
Model", W3C Recommendation, 2022.
[W3C-DID]
World Wide Web Consortium, "Decentralized Identifiers
(DIDs) v1.0", W3C Recommendation, 2022.
[NIST-Hash]
National Institute of Standards and Technology,
"Secure Hash Standard (SHS)", FIPS PUB 180-4, 2015.
[NIST-Digital-Signatures]
National Institute of Standards and Technology,
"Digital Signature Standard (DSS)", FIPS PUB 186-5, 2023.
13. Revision History
draft-norton-sdlp-obj-format-08
* Updated canonical grammar references to align with
Identity-02, Lineage-03, Lifecycle-03, Security-04,
Architecture-03, Overview-01, and Physics-00.
* Updated terminology and validation rules to reference
Lifecycle-03 instead of Lifecycle-02.
* Clarified canonical envelope invariants and newline rules
consistent with the frozen grammar.
* Updated hashing and signing rules to reference Security-04
and to reinforce byte-for-byte SigningPreimage equality.
* Updated examples to reflect current SDLP field semantics and
canonical encoding behavior.
* Incorporated corrections identified during SDLP Fixture
Bundle v4 testing (non-normative).
draft-norton-sdlp-obj-format-07
* Introduced frozen canonical envelope grammar.
* Defined deterministic LF-delimited five-field envelope.
* Added canonical newline, whitespace, and Base64 rules.
* Added hashing and signing preimage definitions.
* Added example canonical envelope.
Author's Address
M. Norton
Independent
El Mirage, Arizona, USA
Email: mark433norton@gmail.com