SSIMPL Specification

Unofficial Draft

More details about this document
Latest published version:
none
Latest editor's draft:
https://compilit.github.io/ssimpl/
History:
Commit history
Editor:
Bastiën G.A. Bonsel
Feedback:
GitHub compilit/ssimpl (pull requests, new issue, open issues)

Abstract

SSIMPL defines a self-sovereign identity framework backed by government-issued trust anchors and a peer-validated ledger.

1. Document Status

This document is an independent Editor’s Draft published by the SSIMPL project. It is not affiliated with, endorsed by, or produced by the World Wide Web Consortium (W3C) or any W3C Working Group.

This draft may change at any time and should not be considered a stable standard.

No patent commitments are made through W3C or any standards organization.

2. Conformance

As well as sections marked as non-normative, all authoring guidelines, diagrams, examples, and notes in this specification are non-normative. Everything else in this specification is normative.

The key words MAY, MUST, MUST NOT, and SHOULD in this document are to be interpreted as described in BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here.


3. Introduction

The internet has evolved rapidly, but with each iteration new challenges have emerged in protecting personal data. While legislation attempts to safeguard users’ rights, technical solutions are often necessary to prevent misuse and unauthorized access to sensitive information.

Current authentication and authorization methods rely heavily on centralized providers. OpenID Connect flows and other single sign-on mechanisms place identity management in the hands of commercial services, which cannot always guarantee the trustworthiness or privacy of the credentials they issue.

In contrast, physical-world identity verification relies on standardized, verifiable documents such as passports or driver’s licenses. Informal authorization uses signatures or initials, which provide contextually appropriate trust without centralized control. SSIMPL was designed to replicate these principles in the digital realm, providing self-sovereign, verifiable credentials while minimizing reliance on third-party intermediaries.


4. Overview

The SSIMPL protocol defines a Self-Sovereign Identity & Mondial Pseudonymous Ledger framework that allows individuals to maintain control over their digital identity while enabling verifiable credential issuance and revocation. It bridges physical trust anchors (e.g. ePassports) with digital identity systems, ensuring cryptographic verification without reliance on centralized authorities.

SSIMPL addresses several key problems:

  1. Pseudonymous digital identity - tied to a physical identity.
  2. User control over digital identity – eliminating reliance on centralized identity providers.
  3. Verification of identities – ensuring online credentials correspond to real individuals using cryptographic proofs.
  4. Sharing of identity-related data - allowing secure and transparent sharing of data

The protocol balances decentralization, peer authority, and (optional) server-assisted reconciliation for efficiency and availability. Everything is made to be deterministic by default, so no authorities whatsoever are required except the one that signed the Trust Anchor (TA).

4.1 Identity Trust Model

SSIMPL identities are rooted in cryptographically verifiable credentials derived from Trust Anchors, such as government-issued ePassports. A valid wallet:

This ensures only owners of verifiable physical credentials can create valid DIDs.

4.1.1 Considerations

Identity is hard to verify by nature. Using a state-issued TA is not a perfect solution, but it's the best deterministic proof of (human) identity available at the moment.

4.2 Levels of Authentication

These different levels allow people to authenticate themselves on several levels, depending on the context. Say a person would like to order a product from a website. Using SSIMPL, the webshop could request a certain scope of credentials (like a shipping address). The owner of the identity could then approve or disapprove this request. This flow is very similar to Open ID Connect, except that there is no need for a 3rd party.

4.3 Roles

5. The did:ssimpl Method

A SSIMPL DID captures several things: a public key used for signing tied to a verifiable identity and the network where the identity is registered. The significance of the signature can be as little as 'I am a human being and have signed this piece of data', or as much as 'I am John Doe, age 39, and this is my DID'. DIDs rely on the owners ability to restore them when necessary, with the use of the BIP39 mnemonic.

5.1 DID Syntax

A did:ssimpl identifier has the following structure, conforming to the generic DID syntax defined in [DIDCORE]:

ssimpl-did     = "did:ssimpl:" ssimpl-specific-id
ssimpl-specific-id = Multibase( network-bytes || pk-bytes )
network-bytes  = country-bytes subnetwork-byte node-byte
country-bytes  = 3ALPHA        ; ICAO 9303 alpha-3 country code
subnetwork-byte = 1OCTET       ; unsigned integer 0–255
node-byte      = 1OCTET        ; unsigned integer 0–255
pk-bytes       = 33OCTET       ; compressed secp256k1 public key

The method-specific identifier is a single Multibase-encoded opaque string. It encodes 38 bytes: 3 bytes of country code, 1 byte of subnetwork identifier, 1 byte of node identifier, and 33 bytes of compressed public key. No delimiters are used. Decoding is deterministic by fixed byte offset.

5.2 Byte Layout

The 38-byte payload prior to Multibase-encoding is laid out as follows:

Offset 0 1 2 3 4 5 – 37
Field Country (3 bytes) Subnetwork (1 byte) Node (1 byte) Public Key (33 bytes)
Example N L D 0x00 0x03 02ab cd…

The country code MUST be an ICAO 9303 [ICAO9303] alpha-3 code encoded as ASCII uppercase bytes. The subnetwork and node fields are unsigned 8-bit integers (range 0–255). The public key is a 33-byte compressed secp256k1 public key.

5.3 Decoding Algorithm

Given a did:ssimpl identifier, the following algorithm recovers the network coordinates and public key:

  1. Strip the did:ssimpl: prefix to obtain the method-specific identifier string.
  2. Multibase-decode the string to obtain a byte array. The result MUST be exactly 38 bytes. If not, the DID is malformed.
  3. Extract bytes[0..2] (inclusive) as the country code. Interpret as ASCII. The result MUST be a valid ICAO 9303 alpha-3 country code.
  4. Extract bytes[3] as the subnetwork identifier (unsigned integer).
  5. Extract bytes[4] as the node identifier (unsigned integer).
  6. Extract bytes[5..37] (inclusive) as the 33-byte compressed secp256k1 public key.

5.4 Key Derivation

The keypair corresponding to a did:ssimpl identifier is derived using [BIP32] hierarchical deterministic key derivation. The seed is computed as:

seed = HASH( mnemonic )
DID keypair = BIP32( seed )

Where mnemonic is the user's secret mnemonic phrase, and HASH is a cryptographically secure hash function (SHA-256 or equivalent).

For TA-backed identities, the mnemonic is additionally bound to the passport's AA public key:

seed = HASH( mnemonic || HASH( aa_public_key ) )

This binding ensures that possession of the DID keypair implicitly attests possession of the corresponding passport material, without exposing the AA public key or mnemonic to any external party.

Note

The salt MUST be changed between identity rotation events to ensure that successive DIDs derived from the same mnemonic are computationally unlinkable.

6. Network Addressing

6.1 Network Structure

SSIMPL networks are organised hierarchically by country and subnetwork. Each country identified by its ICAO 9303 alpha-3 code constitutes a top-level network. Large countries MAY be subdivided into subnetworks to bound ledger size on mobile devices.

Every peer holds a complete copy of the ledger for their own network. No peer holds a privileged or partial role. Relay peers and wallet peers are structurally identical.

A network SHOULD be sized such that its ledger remains manageable on a contemporary mobile device. A suggested ceiling is one million registered identities per subnetwork, corresponding to approximately 200 megabytes of ledger storage at maximum capacity. This is also where the subnetworks come into play. Each subnetwork can be used for one separate ledger. Depending on the identity you're interacting with, you either need your ledger AND theirs, or can keep using your own.

6.2 DNS Addressing Scheme

Individual nodes are addressed using DNS subdomain names under the networks domain e.g. ssimpl.org. The addressing scheme is:

<country>.<subnetwork>.<node>.<domain>

Where <country> is the lowercase ICAO 9303 alpha-3 country code, <subnetwork> is the decimal subnetwork number, and <node> is the decimal node number.

A client wishing to reach any node within a given subnetwork MAY omit the node segment and resolve at the subnetwork level:

<country>.<subnetwork>.ssimpl.org   ; any node in subnetwork
<country>.ssimpl.org                 ; any node in country

DNS wildcard records SHOULD be configured to support these resolution patterns. The DNS infrastructure does not carry authoritative identity data; it serves only as a bootstrap mechanism for peer discovery.

Note

Country codes in DNS addresses are lowercase for compatibility with DNS conventions, while country codes within DID byte payloads are uppercase ASCII per ICAO 9303.

6.3 Network Resolution from a DID

Given a did:ssimpl identifier, the corresponding network and node are resolved as follows:

  1. Decode the DID per the algorithm in 5.3 Decoding Algorithm to obtain country, subnetwork, and node.
  2. Construct the DNS address: lower(country).subnetwork.node.ssimpl.org.
  3. Resolve via DNS to obtain the peer's IP address and port.
  4. To query any peer in the same subnetwork (e.g. for ledger synchronisation), resolve lower(country).subnetwork.ssimpl.org.

6.4 Network Segregation and Ledger Size

Country-based network segregation provides a natural bound on ledger size. Peers overwhelmingly interact with others from the same country, meaning most peers need only one ledger. Additional ledgers are downloaded lazily on first encounter with a foreign DID and MAY be pruned after a configurable period of inactivity.

For countries with populations where passport adoption would exceed the recommended per-subnetwork ceiling, additional subnetworks MUST be provisioned. Subnetwork assignment for new registrations SHOULD be load-balanced across available subnetworks within the country.

6.5 Cross-Network Verification

When a peer encounters a DID from a foreign network, they MUST download the relevant subnetwork ledger before verifying the identity. Ledgers are cached locally and synchronised incrementally on subsequent interactions.

A peer MAY pre-emptively download ledgers for networks they anticipate interacting with — for example, before international travel. Implementations SHOULD provide a mechanism for users to manage which ledgers are retained on their device.

Ledger freshness is maintained by delta synchronisation: a peer requests only entries added since their last known ledger state. Full re-download is not required after initial acquisition.

7. Wallet Specification

The wallet is a Self-Sovereign means of identification that can be installed and bootstrapped entirely independent of any authority. It solely relies on cryptographic proof. This cryptographic proof is contained within the so-called VCR. The Verifiable Credential Root is a VC, as defined in [VC], necessary to link the signer of this VC to the related public key & DID.

The VCR can also be used as the root of a chain of VCs. This way it can, either explicitly or implicitly, verify association to other credentials further up in the chain.

7.1 Wallet Requirements

Wallets MUST:

Wallets SHOULD:

7.2 Wallet Functionality

7.3 Wallet Security

A SSIMPL Wallet has certain security scenario's that need to be addressed

7.4 Delegated Revocation

In order to mitigate the scenario where the user has no access to their wallet anymore, SSIMPL offers a relatively straight-forward solution: two Peers (you and someone you trust, like a close relative) exchange a complete Revocation. In case of emergency, either Peer can always revoke the other Peers DID.

7.5 Example activation Process

  1. User installs wallet.
  2. Wallet prompts for MRZ line.
  3. NFC scan and extraction of passport data.
  4. Creation of Verifiable Credential Root (VCR).
  5. BIP39 mnemonic generation (and presentation to the user).
  6. BIP32 keypair derivation and storage.
  7. Signing of the TrustAnchorProof.
  8. (lazy) publication of the TrustAnchorProof to the network.

8. Relay Peer Specification

The Relay Peer is a special kind of Peer in the sense that it is static and reachable over the internet on a fixed hostname. It acts like any other Peer, but it also adds a storage layer for the Ledger and serves as distribution point for the Ledger. All Relay Peers together form a subnetwork on which all other (mobile) Peers 'ride'. This is purely infrastructural to help communication between Peers. It doesn't give any special privileges or authorities to any of the Relay Peers and does therefore still fulfill all requirements to be called decentralized.

Note

Any network can use their own domain

The ring serves two distinct purposes:

  1. Bootstrap and discovery— any client or new Relay Peer can locate an active peer without prior knowledge, by traversing the ring until a responsive node is found.
  2. Exhaustive reconciliation— a client that detects ledger inconsistency can traverse the entire ring to collect and reconcile all known valid entries.

Index gaps MAY occur when a Relay Peer goes permanently offline. Gaps are acceptable and do not affect ring traversal. Re-indexing is outside the scope of this specification.

8.1 Relay Peer Responsibilities

Note

*if N >= 3, otherwise the minimum quorum should just be N

8.2 Relay Peer Bootstrap and Verification

To enable deterministic network formation and secure onboarding of Relay Peers, the SSIMPL protocol defines a bootstrap and verification procedure.

8.2.1 Relay Peer Bootstrapping

Upon first contact with the network:

  1. The DNS controller assigns the next available index and creates the corresponding DNS record {country}.{subnetworkIndex}.{nodeIndex}.ssimpl.org pointing to the new Relay Peer's hostname. Where the network index can be used to allow for multiple networks to co-exist.
  2. Requests delta's from one (or more) of the Relay Peers in the network in chunks based on the time between two epochs. Starting with 0 (Unix Time) if it has never been online and otherwise starting with the epoch it was last online.

Index assignment is strictly sequential: the assigned index MUST equal the highest currently assigned index plus one. The DNS controller is the sole arbiter of index assignment.

A newly registered Relay Peer MAY take several minutes to become discoverable via DNS, due to TTL propagation. This is acceptable behavior.

9. Ring Traversal Algorithm

The ring traversal algorithm is used for both peer discovery and gossip propagation. Given a node's own networkIndex n & nodeIndex i and the traversal purpose (discovery or propagation), a client or peer MUST traverse as follows:

9.1 For discovery (finding any single responsive peer)

  1. Attempt contact with n.{i+1}.ssimpl.org.
  2. If unresponsive, assume end of ring and wrap to 0.ssimpl.org.
  3. Continue incrementally (1, 2, ...) until a responsive peer is found or all indices up to i have been exhausted.
  4. An unresponsive node MUST be skipped; it is not an error condition.

9.2 For gossip propagation (pushing a ledger change)

  1. Beginning at {country}.n.{i+1}.ssimpl.org, push the change to each responsive peer in sequence.
  2. Count each successful push. If the minimum quorum of N = 3 successful pushes is reached, propagation is complete.
  3. If the end of the ring is reached before quorum is met, wrap to n.0.ssimpl.org and continue.
  4. If the full ring is exhausted without reaching quorum, propagation MUST still be considered complete — quorum is a best-effort guarantee.

A peer that receives a pushed change via gossip MUST validate the entry before storing it, and *MUST NOT* re-propagate it (the originating peer is responsible for reaching quorum).


10. Ledger Specification

The SSIMPL ledger is a deterministically canonical, peer-replicated structure tracking valid DIDs, maintained across Peers and Relay Peers.

10.1 Goals

10.2 State and Canonical Construction

  1. Filter expired entries based on did_expiry and GRACE_PERIOD.
  2. Normalize entries into canonical byte format.
  3. Sort lexicographically by did_expiry then by hash(did).
  4. Compute root_hash using a Merkle tree over the current, complete, pruned ledger.

10.3 Merkle Tree

The SSIMPL ledger uses a Merkle tree to enable efficient verification of ledger state and individual entries.

10.3.1 Structure

  • Leaves: Hashes of canonical ledger entries.
  • Branches: Hashes of concatenated child nodes.
  • Root: root_hash representing the current canonical ledger state.

10.3.2 Updates

  1. New ledger entries are appended as leaves.
  2. The affected branches are rehashed up to the root.
  3. Pruning does not delete nodes; the canonical ledger for the current epoch defines which entries are considered valid.

10.3.3 Merkle Proofs

  • To prove inclusion of a DID xyz, a peer can provide the leaf hash and the branch hashes up to root_hash.
  • Other peers can recompute the root from the proof and verify it matches the canonical root_hash.

10.4 Validation Rules

An entry is valid if:

  1. current_time < did_expiry + GRACE_PERIOD.
  2. hash(verifiable_credential_root.data) equals verifiable_credential_root.signature_document.message.
  3. The public key in the DID matches signature_document.signature.public_key.
  4. Signature verification succeeds: verify_signature( verifiable_credential_root.signature_document.message, verifiable_credential_root.signature_document.signature.value, verifiable_credential_root.signature_document.signature.public_key, verifiable_credential_root.signature_document.signature.algorithm )

Expired or invalid entries are ignored and removed during canonical construction.

10.5 Pruning and Mutability

10.6 Reconciliation

Note

*the way this index is shared is beyond the scope of this document. However, it is recommended to use a custom header like 'x-ssimpl-index'.

Repeat until reconciled:

  1. (Relay)Peer sends LedgerDeltaRequests to 2-N other (Relay)Peers.
  2. Matching hash: No action required.
  3. Hash mismatch: Merge attached Entries.
  4. Hash mismatch: (Relay)Peer sends LedgerDeltaRequests to 2-N other (Relay)Peers. Etc.

10.6.1 Relay Peer Ledger Divergence

If a Relay Peer encounters any kind of unrecoverable exception resulting in one or more missed entries, the ledgers' state will diverge from that of the network. This scenario should, eventually, be automatically repaired by other Peers requesting Delta's from the faulty Relay Peer. To spot divergence, the requested Relay Peer can see that the received 'currentEpoch' is larger than its own. A requested Relay Peer MUST in that scenario respond with 503 Service Unavailable and trigger a reconciliation process.

10.7 Ledger Reconciliation

10.7.1 Motivation

Because any Relay Peer may selectively withhold valid ledger entries — whether due to malice, misconfiguration, or partial failure — no single peer's ledger can be considered authoritative in isolation. The Merkle rootHash comparison allows a client to detect divergence, but does not resolve it.

This section defines a reconciliation protocol that allows any peer or wallet to reconstruct the authoritative ledger state by exhaustively querying the ring.

10.7.2 The Completeness Principle

The authoritative ledger state is defined as the union of all cryptographically valid entries across 2-N peers. This follows directly from two properties of the ledger:

  • Entries can only be *added*, never fabricated — every valid entry carries a signature that can be independently verified.
  • A peer with fewer valid entries than another is, by definition, holding an incomplete view. There is no scenario in which fewer entries represents more accurate state.

Therefore: a larger valid ledger always supersedes a smaller one. Majority voting over rootHash values is explicitly *not* the reconciliation mechanism — a single honest peer holding one valid entry not present on any other peer is sufficient to make that entry canonical.

10.7.3 Reconciliation Procedure

To perform full reconciliation, a client MUST:

  1. Traverse 2-N nodes of the entire ring using the traversal algorithm, requesting a full ledger delta (since epoch 0) from every responsive peer.
  2. Validate every entry received from every peer against the canonicalization and validation rules defined in Validation Rules. Invalid entries MUST be discarded.
  3. Merge all valid entries into a local union ledger. The union is the set of all unique, valid entries across all peer responses.
  4. Recompute the canonical ledger from the union by applying the pruning and sorting rules defined in State and Canonical Construction.
  5. Recompute the rootHash over the canonical ledger. This is the post-reconciliation authoritative state.

The client MAY then push any entries present in its reconciled ledger but absent from a given peer's ledger back to that peer, to aid network convergence.

10.7.4 Security Properties

The reconciliation protocol provides the following guarantees:

  • A single honest peer is sufficient to preserve any valid entry against a malicious majority attempting to suppress it, provided the honest peer is reachable during reconciliation.
  • Fabrication remains impossible — a malicious peer cannot introduce entries it did not legitimately sign, as all entries are independently verifiable.
  • Suppression is detectable — a peer whose ledger is a strict subset of the reconciled state is provably withholding entries, and MAY be flagged as untrustworthy by the client for future interactions.

11. Conclusion

SSIMPL provides a self-sovereign identity framework with a deterministic, peer-validated ledger, enabling secure, verifiable DIDs anchored in government-issued credentials.

All entries and operations are canonical, rule-derived, and independently verifiable by peers, ensuring a fully trustworthy and decentralized identity ecosystem.


12. Canonicalization Rules

To ensure that signatures are verifiable and consistent across all peers, every signed object in SSIMPL MUST be serialized in a canonical form before hashing and signing. These rules remove ambiguity in encoding and field ordering, preventing mismatches between peers.

12.1 Object Serialization

  1. Field Ordering
    • All objects MUST have their fields sorted lexicographically by key name.
    • Example: For {"b":2,"a":1}, canonical form is {"a":1,"b":2}.
  2. Whitespace
    • No unnecessary whitespace is allowed.
    • Only minimal separators required by the serialization format are permitted.
  3. Encoding
    • All strings MUST be UTF-8 encoded.
    • No BOM (Byte Order Mark) or non-standard characters are allowed.
  4. Number Representation
    • Numbers MUST be represented without leading zeros (except zero itself) and without exponential notation.
    • Example: 1.0 → 1.0; 01 → invalid.
  5. Boolean and Null

  6. true, false, and null MUST use JSON literals exactly as shown (case-sensitive).

12.2 Nested Objects

12.3 Signature Message

  1. The message field in every SignatureEnvelope MUST be the hash of the canonical serialized data object.
  2. Recommended hash function: SHA-256.
  3. The hash input is strictly the canonical byte sequence of the data object (no additional metadata).
  4. Signing the message binds the signer cryptographically to the exact canonical representation of the object.

12.4 Deterministic Encoding

There are many ways to encode raw bytes or strings, and more are being invented as we speak. It is highly inefficient to make these encodings contract-based. SSIMPL therefore highly recommends the use of the Multibase Data Format, as defined in [Multibase], which is deterministic.

12.5 Verification Procedure

To verify a signature:

  1. Peer canonicalizes the data object according to the rules above.
  2. Peer hashes the canonicalized bytes to compute the message.
  3. Peer verifies that the computed message matches the message in signatureEnvelope.
  4. Peer validates the signature using the provided publicKey and algorithm.
  5. Only if all checks pass is the object considered valid.

12.6 Rationale

Canonicalization guarantees that:

12.7 Canonical Signature Object Pattern

All cryptographically signed objects in SSIMPL MUST follow a uniform, canonical structure, known as the SignatureEnvelope. This ensures consistency across all signed data, including ledger entries, revocations, and delta payloads.

12.7.1 Structure

Each signed object MUST include a SignatureEnvelope with the following structure:

  • message — The cryptographic hash of the canonical serialization of the data object.
  • signature — Object containing the signature itself:
    • publicKey — Base64url-encoded public key corresponding to the signing private key.
    • algorithm — Signature algorithm used (e.g., EdDSA, ECDSA).
    • value — Base64url-encoded signature value.
  • signer — DID of the entity producing the signature.

Example (in JSON for clarity):

{
  "message": "<hash-of-canonical-data>",
  "signature": {
    "publicKey": "<Multibase-encoded public key>",
    "algorithm": "<algorithm identifier>",
    "value": "<Multibase-encoded signature>"
    },
  "signer": "<DID of signer>"
}

12.8 Canonical creation of the Trust Anchor Hash (ePassport implementation)

The following, canonical, JSON structure needs to be fed into a hash function (SHA-256 recommended) which results in the 'taHash'. It is specific for standardised ePassports. Other TAs should have their own canonical JSON structure.

{
    "dateOfBirth": 580963131,
    "documentExpiryDate": 1960861131,
    "documentNumber": "ABC123...example",
    "documentType": "P"
}

12.8.1 Usage

  • Every signed object in SSIMPL MUST include a signatureEnvelope.
  • The message field MUST be derived from the canonical serialization of the associated data object, ensuring that identical logical objects produce identical hashes.
  • This pattern guarantees interoperability, verifiability, and deterministic ordering for all signed objects across the network.

12.8.2 Rules and Notes

  • Optional fields in the data object MUST NOT affect the canonical hash unless explicitly defined in the canonicalization rules.
  • Implementations MUST reject signatures if the hash does not match the canonicalized data object.
  • Adherence to this pattern is mandatory to ensure correct ledger validation, delta verification, and revocation processing.

This canonical signature object pattern provides a single, consistent approach for proving authorship and integrity across all SSIMPL objects.


13. SSIMPL API Specification

This section defines the reference API for Relay Peers in the SSIMPL protocol. It provides endpoints for DID registration, revocation, and ledger reconciliation.

All requests MUST be authenticated using a Bearer token, containing a signed DID in the canonical SignatureEnvelope format, Multibase-encoded.

You can also check the open-api spec here.

13.1 Revoke a TA

PUT /ledger

Purpose: Revoke a TA by submitting a revocation payload. Providing the taHash means that the related TA can NEVER be used again to initialize a Wallet. The taHash is mandatory for Delegated Revocation.

Request payload: Revocation

Response: 201 ACCEPTED


13.2 Request a Delta

PUT /ledger

Purpose: Revoke a TA by submitting a revocation payload. Providing the taHash means that the related TA can NEVER be used again to initialize a Wallet. The taHash is mandatory for Delegated Revocation.

Request payload: LedgerDeltaRequest

Response: 200 OK

Response payload: LedgerDeltaResponse

Response: 409 CONFLICT

Response payload: none


13.3 Shared Object Schemas

13.3.1 SignedObject (Signed<T>)

Field Type Description
data object/string Contains the actual data this payload represents
signatureEnvelope object Signature verifying the data. See SignatureEnvelope

13.3.2 SignedObject: Revocation

Field Type Description
data object Contains the TrustAnchorProof of the being revoked
signatureEnvelope object Signature verifying the revocation. See SignatureEnvelope

13.3.3 TrustAnchorProof

Field Type Description
Type string Identifies the TA implementation
taHash string
taExpirationDate number
proof object TA-specific cryptographic proof material
{
  "type": "ICAO_EPASSPORT",
  "taHash": "<canonical-hash-of-the-ta>",
  "taExpirationDate": 42,
  "claims" {
    //optional claims
  },
  "proof": {
  // Type-specific cryptographic proof material
  }
}

13.3.4 Example (in case an ePassport is used as TA):

The chain of trust for an ePassport essentially goes like this:

Public ICAO ML - contains:

CSCA public key - verifies:

DS certificate signature - is part of:

DS certificate - contains:

DS public key - verifies:

SOD signature - verifies:

DG hash list - contains:

DG hashes - verifies:

DG sections (Verifiable Credentials)

{
  "type": "ICAO_EPASSPORT",
  "taHash": "<canonical-hash-of-the-ta>",
  "taExpirationDate": 42,
  "claims": {
    //optional
  },
  "proof": {
    "dsc": "<dsCertificatePEM>",
    "dataGroupHashes": "<DG-id, DG-hash dictionary>",
    "signature": {
      "publicKey":  "<Multibase-encoded public key bytes>",,
      "algorithm":  "<algorithm id>",
      "value": "<Multibase-encoded signature bytes>",
    },
  }
}

The type field identifies the Trust Anchor implementation and determines how claims and proof are interpreted. Peers MUST reject any TrustAnchorProof whose type they do not recognise.

For the ICAO_EPASSPORT type, verification proceeds as follows:

  1. Match the claims with their corresponding proof, e.g. proof.DG1.
  2. Re-encode the complete proof.dataGroupHashes into its original ASN.1/DER structure and verify proof.signature against it using the public key in proof.dsc (DSC).
  3. Verify proof.dcs (DSC) was signed by the CSCA.
  4. Verify CSCA is present on the ICAO master list.
Note

The full proof.dataGroupHashes must be provided in its entirety. The SOD signature is computed over the complete encoded hash list, not over individual entries. Omitting any hash from the list will cause signature verification to fail.

13.3.5 SSIMPL JWT

By combining the DID and the owners TrustAnchorProof, one could create a JWT that would allow the bearer to authenticate themselves.

The 'claims' array can be filled with the required scope depending on how pseudonymous you wish to make the JWT. One could even omit the claims, and only provide the hash list. This proved that the bearer owns a Trust Anchor which was signed by a trusted authority.

    {
  "sub": "<did:key...>",             // The DID being asserted
  "iat": "<ISO8601 timestamp>",      // Issued at
  "exp": "<ISO8601 timestamp>",      // Optional expiry
  "jti": "<unique-token-id>",        // Prevent replay attacks
  "trustAnchor": {
    "type": "ICAO_EPASSPORT",
    "claims": {
      "firstNames: "John William",
      "lastName: "Doe",
      "birthDate: "05-30-1988"
    },
    "proof": {
      "dsc": "<Multibase-encoded-DS-certficate>",
      "dataGroupHashes": {
        "DG1":  "<sha-256-hash-of-dg1>",
        "DG2":  "<sha-256-hash-of-dg2>",
        "DG11": "<sha-256-hash-of-dg11>",
        "DG14": "<sha-256-hash-of-dg14>",
        "DG15": "<sha-256-hash-of-dg15>"
      },
      "signature": "<Multibase-encoded-SOD-signature>"
      //optional, necessary for proving the claims, but contains more data than the actual claims, like the SSN
      "DG1": "P<NLDDOE<<JOHN<WILLIAM<<<<<<<<<<<<<<<<<<ABC1X10A99NLD8805304M2911135215802147<<<<<72"
    }
  }
}

13.3.6 SignatureEnvelope

Field Type Description
message string Canonical serialized representation of the signed data
signature object Signature object containing algorithm, publicKey, and value. See Signature
signer string DID or public key identifier of the signer

13.3.7 Signature

Field Type Description
publicKey string Public key of signer
algorithm string Signing algorithm
value string Multibase-encoded signature value

13.3.8 LedgerDeltaRequest

Field Type Description
since integer Last ledger epoch known to the peer
rootHash string Merkle root hash of the peer's current ledger state - to verify the Relay Peers current Ledger is an extension of the one the Peer has

13.3.9 LedgerDeltaResponse

Field Type Description
currentEpoch integer Current epoch of the relay peer ledger
rootHash string Merkle root hash after applying returned entries array Ordered ledger entries newer than lastEpoch
entries array The entries missing from your ledger based on the provided epoch

A. Subscription-Based Credential Distribution

This section is non-normative.

This appendix defines an optional mechanism for scoped, push-based credential distribution between peers. Subscriptions allow a peer to receive updates to specific verifiable credentials issued by another peer, without granting access to the full identity or affecting ledger state.

Subscriptions are off-ledger and do not participate in DID registration, ledger consensus, Merkle state construction, or revocation semantics. They are purely a delivery mechanism for already valid, cryptographically signed credentials.

A.1 Subscription Model

A subscription represents a unidirectional relationship from a Subject to a Subscriber, granting the subscriber access to a bounded scope of credentials for a finite duration.

The Subject retains full control over:

A.2 Subscription Properties

A subscription is defined by the following conceptual properties:

The exact wire format of subscription objects is implementation-defined and outside the scope of this specification.

As far as authentication goes: it is recommended to use a Multibase encoded SignedObject<DID>.

A.3 Subscription Flow

  1. The Subscriber requests access to a scoped set of credentials.
  2. The Subject evaluates the request and, if accepted, signs a subscription grant.
  3. The Subject stores the subscription locally.
  4. When a scoped credential is created, updated, or reissued, the Subject pushes the new signed credential to the Subscriber.
  5. The Subscriber verifies the credential signature and scope independently.

A.4 Verification

Subscription-delivered credentials are verified in the same way as any other SSIMPL verifiable credential:

No ledger interaction is required to validate a subscription or its delivered credentials.

A.5 Revocation and Expiry

Subscriptions are revoked by the Subject by ceasing delivery of credentials and optionally notifying the Subscriber. Expired subscriptions MUST NOT be used to deliver new credentials.

Subscription revocation does not affect the validity of previously issued credentials, which remain verifiable according to their own signatures and expiry rules.

A.6 Security Considerations

Implementations SHOULD take care to minimize metadata leakage through delivery endpoints and timing correlations.

B. References

B.1 Normative references

[BIP32]
BIP32. URL: https://en.bitcoin.it/wiki/BIP_0032
[BIP39]
BIP39. URL: https://en.bitcoin.it/wiki/BIP_0039
[DIDCORE]
Decentralized Identifiers (DIDs) v1.0. URL: https://www.w3.org/TR/did-core/
[ICAO9303]
ICAO9303. URL: https://www.icao.int/publications/doc-series/doc-9303
[Multibase]
The Multibase Data Format. URL: https://www.ietf.org/archive/id/draft-multiformats-Multibase-07.html
[RFC2119]
Key words for use in RFCs to Indicate Requirement Levels. S. Bradner. IETF. March 1997. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc2119
[RFC8174]
Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words. B. Leiba. IETF. May 2017. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc8174
[VC]
Verifiable Credentials Data Model v2.0. URL: https://www.w3.org/TR/vc-data-model-2.0/