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


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.


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. User control over digital identity – eliminating reliance on centralized identity providers.
  2. Verification of identities – ensuring online credentials correspond to real individuals using cryptographic proofs.
  3. Sharing of identity-related data - allowing secure and transparent sharing of data

The protocol balances decentralization, peer authority, and optional server-assisted synchronization 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).

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.

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.

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.

Roles


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.

Wallet Requirements

Wallets MUST:

Wallets SHOULD:

Wallet Functionality

Wallet Security

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

Delegated Revocation

In order to mitigate the most dire scenario, SSIMPL offers a relatively straight-forward solution: two Peers (you and someone you trust, like a close relative) exchange a complete LedgerEntryRevocation. In case of emergency, either Peer can always revoke the other Peers DID. This is a two-sided solution of course: it provides a nice safety net, but also introduces another safety risk. For these kind of scenario's, there are rarely perfect solutions.

To support Delegated Revocation, an extra (otherwise optional) field is present: taId. Which allows future deny-listing of the use taId (e.g. the document number of the passport)

Example activation Process (in case of an ePassport)

  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 VCR.
  8. Submission of the VCR to a Relay Peer.

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.

The well-known Relay Peer

In order to establish a stable network, there should always be one well-known Relay Peer, which allows another Relay Peer to find others within the network. It also serves as an entry point for freshly installed Wallets to bootstrap.

Relay Peer Responsibilities

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.

The first time a new Relay Peer is bootstrapped, it MUST make itself known to a known (or a well-known Relay Peer, e.g., root.ssimpl.org) to obtain the first list of known Relay Peers. This is a hard-coded node that allows the network to kickstart itself and to have zero knowledge upfront when adding a new Relay Peer.

Relay Peer Registration

Upon first contact with the network, a new Relay Peer:

  1. Contacts the Well-known Relay Peer (or another known Relay Peer) to announce its presence.
  2. Provides its signed DID using the canonical SignatureEnvelope format.
  3. Receives information about other Relay Peers in the network for further connections.
  4. 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.

Ledger Specification

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

Goals

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.

Merkle Tree

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

Structure

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.

Merkle Proofs

Relation to Checkpoints

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.

Pruning and Mutability

Synchronization

Merkle Checkpoints

To enable efficient verification of ledger history and prevent forks from propagating, the SSIMPL protocol introduces Merkle checkpoints. These checkpoints allow peers to validate that their current ledger state stems from a previously agreed-upon canonical state.

Definition

A Merkle checkpoint is a snapshot of the canonical ledger at a given epoch, containing:

Purpose

Merkle checkpoints serve three main purposes:

  1. Anchoring history — They provide a trusted reference point for peers to verify that their current ledger is an extension of a previous canonical state.
  2. Fork detection — Peers can detect divergence by comparing their checkpointed root hash with peers’ reported checkpoints.
  3. Efficient synchronization — When a peer joins the network or recovers from offline mode, it can request deltas starting from the latest known checkpoint rather than from the genesis ledger.

Creation and Storage

Verification

To verify a ledger using a checkpoint:

  1. Obtain the checkpoint for the target epoch (epoch, root_hash).
  2. Compute the canonical ledger state from the checkpoint epoch to the current state.
  3. Recompute the Merkle root for the resulting ledger.
  4. Confirm that the recomputed root matches the current root_hash.

A mismatch indicates ledger tampering or divergence, and the peer MUST reject the inconsistent entries.

Pruning and Expiry

Security Considerations

Security Properties


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.


Canonicalization Rules

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

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).

Nested Objects

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.

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.

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.

Rationale

Canonicalization guarantees that:

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, Verifiable Credential Roots (VCR), revocations, and delta payloads.

Structure

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

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>"
}

Usage

Rules and Notes

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


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 synchronization.

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.

Endpoints

Register a Relay Peer

POST /peer

Purpose: Make a Relay Peer known to another Relay Peer.

Request payload: RelayPeerAnnouncement

Example:

{
  "data": {
    "did": "did:key:1234abc...example"
    "hostname": "some.hostname.org"
  },
  "signatureEnvelope": {
    ...
  }
}

Response: 201 CREATED


Perform a handshake

POST /peer/identity

Purpose: Allows (Relay) Peers to check the health an initial validity of the Relay Peer

Request payload SignedObject<DID>:

Example:

{
  "data":"did": "did:key:1234abc...example",
  "signatureEnvelope": {
    ...
  }
}

Response: 200 OK + SignedObject<DID>:

{
  "data":"did": "did:key:abc1234...example",
  "signatureEnvelope": {
    ...
  }
}

Request Ledger Delta

POST /ledger/delta

Purpose: Allows a Peer to request ledger entries that are newer than a given epoch, if the peer is out of sync.

Request payload LedgerDeltaRequest:

Example:

{
  "from": 42,
  "to": 420,
  "rootHash": "abcdef1234567890"
}

Response: 200 OK + LedgerDeltaResponse:

Example:

{
  "currentEpoch": 43,
  "authoritativeRootHash": "1234abcd5678ef90",
  "entries": [
    {
      "data": {
        "type":"ENTRY",
        "payload": {
          "verifiableCredentialRoot": {
            ...
          },
          "proof": {
            ...
          }
        },
      },
      "signatureEnvelope": {
        ...
      }
    },
    "data": {
        "type":"REVOCATION",
        "payload": {
          "did": "did:key:1234abc...example",
          "taId": "ABC1234XYZ",
        },
      },
      "signatureEnvelope": {
        ...
      }
    }
    "relayPeers": [
    {
      "data": {
        "did": ...,
        "hostname" ...,
      },
      "signatureEnvelope": {
        ...
      }
    }
  ]
}

Register a DID

POST /ledger

Purpose: Register a new DID on the ledger.

Request payload: LedgerEntry

Example:

{
  "data": {
    "verifiableCredentialRoot": {
      ...
    },
    "proof": {
      ...
    }
  },
  "signatureEnvelope": {
    ...
  }
}

Response: 201 CREATED


Revoke a DID

PUT /ledger

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

Request payload: LedgerEntryRevocation

Example:

{
  "data": {
    "did": "did:key:z6Mkw...example",
    "taId": "(optional) ABC123XYZ"
  },
  "signatureEnvelope": {
    ...
  }
}

Response: 204 NO CONTENT


Shared Object Schemas

SignedObject (Signed<T>)

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

SignedObject: LedgerEntry

Field Type Description
data object Contains verifiableCredentialRoot and proof
signatureEnvelope object Signature verifying the integrity of data. See SignatureEnvelope

VerifiableCredentialRoot

Field Type Description
did string The DID to be associated with the VCR - has to be the same as the one in the
taId string The id related to the TA (e.g. the documentNumber). Prevents double registration and allows for deny-listing the TA for future registrations.

SignedObject: LedgerEntryRevocation

Field Type Description
data object Contains the DID (and optionally the taId) being revoked
signatureEnvelope object Signature verifying the revocation. See SignatureEnvelope

Proof (Example, in case an ePassport is used as TA)

Field Type Description
DG15 string Data group 15 proof
AASignature string Active Authentication signature
AAChallenge string Active Authentication challenge
SOD string Security Object Document

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

Signature

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

LedgerDeltaRequest

Field Type Description
from integer Last ledger epoch known to the peer
to integer (optional) The upper boundary - In case the Peer wants 'chunked' responses
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

LedgerDeltaResponse

Field Type Description
currentEpoch integer Current epoch of the relay peer ledger
authoritativeRootHash 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

RelayPeerAnnouncement

Field Type Description
data object Containing the DID and the hostname of the Relay Peer
authoritativeRootHash 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

Subscription-Based Credential Distribution

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.

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:

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>.

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.

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.

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.

Security Considerations

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