PhoenixSig does not use long-lived signing keys. Instead, it derives a fresh key pair for each epoch and commits all epoch public keys to a Merkle tree. This document explains how epoch-based signing works and how Merkle trees enable efficient verification.
Long-lived private keys create a single point of catastrophic failure: if the key is compromised, all past and future signatures are affected. Ephemeral keys bound the damage:
Combined with DyLWE forward secrecy, this means even capturing the current epoch key reveals nothing about past or future keys.
Each epoch key pair is deterministically derived from the current system state and the device's VaultKey. The derivation feeds into the standard PQC key generation for ML-DSA-65 or SLH-DSA. This ensures that:
If each epoch uses a different public key, how does a verifier know which key to trust? Pre-sharing every epoch key is impractical — there could be thousands of epochs over a device’s lifetime.
During initialization, PhoenixSig pre-computes a batch of epoch public keys and arranges them as leaf nodes in a Merkle hash tree. The tree’s root hash — the RootPK — is the device’s public identity.
Each signature includes:
pk_epoch: the public key used for this epochmerkle_path: the sibling hashes needed to reconstruct the path from pk_epoch to RootPKThe verifier performs two checks:
pk_epoch and merkle_path. If it matches RootPK, the key is legitimate.PQC.Verify(pk_epoch, message, sig). If it passes, the signature is authentic.Both must pass for the signature to be accepted.
| Parameter | Description | Typical Value |
|---|---|---|
| Tree depth | Number of levels (determines max epochs) | 20 (1M epochs) |
| Hash function | Used for internal nodes | SHA-3-256 |
| Auth path size | Sibling hashes per signature | 20 × 32 = 640 bytes |
When all leaves in the Merkle tree have been used, a new tree must be created. This involves:
The old RootPK can be chained to the new one by having the last signature under the old tree endorse the new RootPK, creating a verifiable key lineage.