Loading vLEI.wiki
Fetching knowledge base...
Fetching knowledge base...
This comprehensive explanation has been generated from 25 GitHub source documents. All source documents are searchable here.
Last updated: October 7, 2025
This content is meant to be consumed by AI agents via MCP. Click here to get the MCP configuration.
Note: In rare cases it may contain LLM hallucinations.
For authoritative documentation, please consult the official GLEIF vLEI trainings and the ToIP Glossary.
A salter is a CESR cryptographic primitive that encapsulates a cryptographic seed value and provides deterministic key generation capabilities. According to the cesride implementation terminology (attributed to Jason Colburne), a salter "represents a seed" and "has the ability to generate new Signers" (Document 1).
The salter primitive serves as the foundational entropy source in KERI's hierarchical key derivation architecture. It bridges the gap between high-entropy seed material and operational signing keys, enabling the creation of autonomic identifiers (AIDs) with cryptographically verifiable control authority.
In the KERI ecosystem, the salter is one of six core cryptographic primitives defined in cesride:
.qb64(), .qb64b(), .qb2(), .code(), .raw()MtrDex.Salt_128 for 128-bit salts)The salter's role is distinct from other primitives: while Signers perform actual signing operations and Verfers verify signatures, the salter operates at a higher abstraction level, managing the seed material from which multiple Signers can be deterministically derived.
The salter encapsulates a cryptographic seed, which is fundamentally a high-entropy pseudorandom value. According to Document 5, the seed material (referred to as bran in KERI terminology) serves as "a cryptographic string used as a primary input, a seed, for creating key material for an autonomic-identifier."
The security of the salter depends on the entropy quality of its underlying seed. KERI implementations typically require seeds with ≥128 bits of entropy to achieve cryptographic strength sufficient for information-theoretic security against brute-force attacks.
The salter implements deterministic key derivation, meaning that given the same seed input, it will always generate the same sequence of Signer primitives (private keys). This property is critical for:
The deterministic nature follows principles similar to hierarchical deterministic keys (HD keys) used in cryptocurrency wallets, though KERI's implementation is protocol-specific.
While the source documents do not specify the exact key derivation function (KDF) used by the salter, KERI implementations typically employ industry-standard algorithms such as:
The salter abstracts these implementation details behind a consistent interface, allowing different cryptographic backends while maintaining API compatibility.
As a CESR primitive, the salter follows CESR's composable encoding scheme. According to Document 4, all cesride primitives share common methods for encoding and representation:
.qb64() - Qualified base64 representation as a string.qb64b() - Qualified base64 representation as bytes.qb2() - Qualified base-2 (binary) representation as bytes.code() - Derivation code indicating cryptographic type.raw() - Raw cryptographic material without qualificationThe "qualified" encoding means the salter includes a prepended derivation code that specifies:
In the text domain, a salter is represented as a Base64 URL-safe encoded string with a prepended derivation code. Document 5 provides a concrete example from the Signify TypeScript implementation:
this.bran = MtrDex.Salt_128 + 'A' + bran.substring(0, 21) // qb64 salt for seed
This shows:
MtrDex.Salt_128 - The derivation code indicating a 128-bit salt'A' - Additional encoding metadataThe resulting qualified Base64 string is self-framing, meaning a parser can determine the primitive's type and length without external schema information.
In the binary domain, the salter uses a more compact representation:
The binary encoding is optimized for storage and transmission efficiency while maintaining the same semantic content as the text representation.
The salter's CESR encoding supports composability, meaning:
This composability is essential for KERI's hierarchical composition architecture, where complex cryptographic operations are built from concatenated primitives.
The primary use case for salters is in controller initialization when creating new AIDs. Document 13 demonstrates this in the KERIpy implementation:
import keri.core.coring as coring
import keri.app.keeping as keeping
with keeping.openKS(name="edy") as kpr:
salt = coring.Salter().qb64
mgr = keeping.Manager(ks=kpr, salt=salt)
verfers, _, _, _ = mgr.incept(icount=1, ncount=0)
This code shows:
coring.Salter() instantiates a new salter with random seed.qb64 extracts the Base64 representationThe salter enables the inception event by providing the seed material for generating the initial key pair that establishes control authority over the new AID.
Salters support hierarchical key derivation for creating multiple keys from a single seed. This is critical for:
The hierarchical approach follows the principle that a single high-entropy seed can securely generate an unlimited number of derived keys, each cryptographically independent but deterministically reproducible from the original seed.
In KERI terminology, the seed material input to a salter is called bran. Document 5 explains that "bran" was chosen to avoid conflicts with existing uses of "seed" and "salt" in KERI, while maintaining semantic connection to seed-related concepts.
The Signify TypeScript implementation shows the bran-to-salter workflow:
constructor(bran: string, tier: Tier, ridx: number = 0, state: any | null = null) {
this.bran = MtrDex.Salt_128 + 'A' + bran.substring(0, 21) // qb64 salt for seed
this.stem = "signify:controller"
this.tier = tier
this.ridx = ridx
this.salter = new Salter({ qb64: this.bran, tier: this.tier })
This demonstrates:
Salters integrate with KERI's keystore infrastructure for secure seed storage. Document 13 shows this integration:
with keeping.openKS(name="edy") as kpr:
salt = coring.Salter().qb64
mgr = keeping.Manager(ks=kpr, salt=salt)
The keystore (kpr) provides:
This architecture follows the principle that the salter (seed) is the most critical secret in the system - if compromised, all derived keys are compromised. Therefore, salters receive the highest level of protection in KERI implementations.
While salters are not directly used in ACDC credential structures, they play an indirect role in credential issuance:
The salter ensures that credential issuers can maintain consistent control authority over their issuing identifiers while supporting key rotation and recovery.
The Signer primitive is the direct output of a salter's key generation function. According to Document 21, a Signer "represents a private key" and "has the ability to create Sigers and Cigars (signatures)."
The relationship is hierarchical:
This hierarchy reflects the cryptographic key lifecycle:
The Verfer primitive represents the public key corresponding to a Signer. According to Document 23, a Verfer "represents a public key" and "has the ability to verify signatures on data."
The salter indirectly generates Verfers through the key derivation process:
The Verfer is published in inception events and rotation events to establish the key state of an AID.
The Diger primitive represents cryptographic digests. According to Document 22, a Diger "represents a digest" and "has the ability to verify that an input hashes to its raw value."
Salters interact with Digers in pre-rotation schemes:
The digest of the next public key is committed in the current establishment event, enabling cryptographic binding of future key rotations.
Salters participate in several composition patterns:
These patterns leverage CESR's composability to build complex cryptographic operations from simple primitives.
Implementations must ensure salters are initialized with cryptographically secure random seeds. Document 9 emphasizes that KERI's security depends on cryptographic strength of seed material.
Best practices include:
Salter seeds are the root secret of the entire key hierarchy and require maximum protection:
Document 9 notes that "security responsibility lies with the controller, who must protect these functions using best practices appropriate to their security requirements."
Implementations should define clear key derivation paths for different purposes:
Clear derivation paths enable:
Key derivation from salters can be computationally expensive, especially with key stretching algorithms. Implementations should:
Salter implementations require rigorous testing:
Document 13 mentions "well-known witnesses" that use predictable salts for testing purposes, but emphasizes these are "for testing purposes only" and should never be used in production.
When properly implemented with sufficient entropy, salters provide information-theoretic security - the highest level of cryptographic security. This means:
Salters enable key compromise recovery through pre-rotation:
This mechanism, described in Document 9, provides "compromise recovery protection" that maintains security even after key exposure.
For multi-sig configurations, salters can generate keys for threshold signature schemes:
The salter's deterministic derivation ensures all threshold participants can independently generate their keys from their respective seeds.
The salter primitive is a foundational component of KERI's cryptographic infrastructure, serving as the bridge between high-entropy seed material and operational signing keys. Its role in deterministic key derivation, hierarchical key management, and secure seed storage makes it essential for creating and managing autonomic identifiers with strong cryptographic root-of-trust.
By encapsulating seed material in a standardized CESR primitive with clear encoding and generation capabilities, the salter enables KERI implementations to achieve information-theoretic security while maintaining the flexibility needed for diverse deployment scenarios - from mobile wallets to enterprise HSM configurations.