Dawood Hamidi
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.
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.
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.
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:
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).
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.
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.
In transactions where a TA is used, there is often a final verification check done by comparing the photo on the document with the one providing the document. This verification step is the actual crucial part tying the document to the bearer. It is therefor recommended to implement something similar in a SSIMPL wallet. In case of the ICAO ePassport implementations, one could extract the raw bytes from the DG2 (the photograph on the document) and let the user take a picture of themselves. Using image-comparison algorithms/software, it would be possible to add this verification.
SSIMPL DIDs can come in two forms: ephemeral and stable. The ephemeral DIDs are created from randomly selected BIP32 children keypairs from their respective stable parent BIP32 keypair. Whereas, their stable counterparts are based upon the actual parent keypairs OR by storing the path to the actual child keypair. The latter situation would give you the benefit of being able to decide for yourself what the scope/lifetime of a keypair would be.
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.
did:ssimpl MethodA 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.
A did:ssimpl identifier has the following structure, conforming to the generic DID syntax defined in [DIDCORE]:
ssimpl-did = \"did:ssimpl:\" ssimpl-specific-id\r\nssimpl-specific-id = Multibase( network-bytes || pk-bytes )\r\nnetwork-bytes = country-bytes subnetwork-byte node-byte\r\ncountry-bytes = 3ALPHA ; ICAO 9303 alpha-3 country code\r\nsubnetwork-byte = 1OCTET ; unsigned integer 0–255\r\nnode-byte = 1OCTET ; unsigned integer 0–255\r\npk-bytes = 33OCTET ; compressed secp256k1 public key\r\n
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.
Example 1: Example DID
did:ssimpl:3vYhGpQrKmNxTfBwLsAeDcJqZiUoMbXn
The above identifier decodes to: country = NLD, subnetwork = 0, node = 3, public key = 02ab….
The 38-byte payload prior to Multibase-encoding is laid out as follows:
Offset012345 – 37FieldCountry (3 bytes)Subnetwork (1 byte)Node (1 byte)Public Key (33 bytes)ExampleNLD0x000x0302ab 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.
Given a did:ssimpl identifier, the following algorithm recovers the network coordinates and public key:
did:ssimpl: prefix to obtain the method-specific identifier string.bytes[0..2] (inclusive) as the country code. Interpret as ASCII. The result MUST be a valid ICAO 9303 alpha-3 country code.bytes[3] as the subnetwork identifier (unsigned integer).bytes[4] as the node identifier (unsigned integer).bytes[5..37] (inclusive) as the 33-byte compressed secp256k1 public key.The keypair corresponding to a did:ssimpl identifier is derived using [BIP32] hierarchical deterministic key derivation. The seed is computed as:
seed = HASH( mnemonic )\r\nDID keypair = BIP32( seed )\r\n
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 ) )\r\n
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.
SSIMPL networks are organized 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.
Individual nodes are addressed using DNS subdomain names under the networks domain e.g. ssimpl.org. The addressing scheme is:
<country>.<subnetwork>.<node>.<domain>\r\n
Where <country> is the lowercase ICAO 9303 alpha-3 country code, <subnetwork> is the decimal subnetwork number, and <node> is the decimal node number.
Example 2: DNS address examples
nld.0.3.ssimpl.org
Netherlands, subnetwork 0, node 3.
usa.4.12.ssimpl.org
United States, subnetwork 4, node 12.
deu.0.0.ssimpl.org
Germany, subnetwork 0, node 0.
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\r\n<country>.ssimpl.org ; any node in country\r\n
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.
Given a did:ssimpl identifier, the corresponding network and node are resolved as follows:
countrylower(country).<subnetwork>.<node>.ssimpl.org.lower(country).ssimpl.org.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.
Example 3: Ledger size estimates
At 200 bytes per entry and a ceiling of one million identities:
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 synchronized 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.
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.
Wallets MUST:
did:key for interoperability.Wallets SHOULD:
A SSIMPL Wallet has certain security scenario\'s that need to be addressed
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.
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:
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.
Note
*if N >= 3, otherwise the minimum quorum should just be N
To enable deterministic network formation and secure onboarding of Relay Peers, the SSIMPL protocol defines a bootstrap and verification procedure.
Upon first contact with the network:
{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.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.
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:
n.{i+1}.ssimpl.org.0.ssimpl.org.1, 2, ...) until a responsive peer is found or all indices up to i have been exhausted.{country}.n.{i+1}.ssimpl.org, push the change to each responsive peer in sequence.n.0.ssimpl.org and continue.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).
The SSIMPL ledger is a deterministically canonical, peer-replicated structure tracking valid DIDs, maintained across Peers and Relay Peers.
did_expiry and GRACE_PERIOD.did_expiry then by hash(did).root_hash using a Merkle tree over the current, complete, pruned ledger.The SSIMPL ledger uses a Merkle tree to enable efficient verification of ledger state and individual entries.
root_hash representing the current canonical ledger state.Berglyveien 9, Oslo, Norway