A secret sealed under a key that only a rebirth moves on. Reading is rebirth — every read costs the death of the generation that read it.TestedEvery read goes through the bank and leaves a birth on the witness: TestEveryReadIsARebirth
There is no getKey().
The bank has no getKey(): once a line has started, the only call it answers is Rebirth(), and it hands out nothing without a death certificate signed by the current live key (or, when a reply was lost, the same request again). Between reads the life holds no K and no half of the bank's, so to read, you must end the generation that is reading. The past seals shut behind it once the dead seed is really gone (the corpse, below).TestedTestEveryReadIsARebirth, TestRetryGetsTheSameAnswer
K = HMAC(bankHalf, privSeed). The bank holds one half and only the public commitment of the other. It can verify your half exists; it can never reconstruct it.TestedTestBankAloneCannotReadSign(priv, "gen G closing → next pubkey"). The next key signs a claim over it, and a one-time ticket goes with them. The bank checks the certificate under the public key it stored for generation G, and keeps every key the line has had. A certificate copied off the witness collects nothing.TestedTestGenuineReplay, TestRefusalsChangeNothingbankHalf_{G+1} = HMAC(bankHalf_G, fresh, DC), where fresh is 32 random bytes only the bank ever holds, so an old half plus every public certificate can't rebuild today's. Forward only. The bank keeps the old half one rebirth longer, to answer a lost reply.TestedTestBankHalfFromOldHalfAndDCs, TestEachHalfIsFreshphoenix verify checks the chain from genesis with no key, and names a gap, a fork or a forged birth. (The live demo keeps its births in its own memory, on purpose: nothing a visitor does there reaches the Notary.)TestedTestBirthsAreSealedAndChained, TestBankRefusesWhenTheSealFails, TestVerifyNamesAGap, TestForgedBirthIsRefused, TestHTTPNotaryReadsTheRealNotary, TestDemoNeverSealsOnTheNotaryBeing fixedOnly on our own box for now: the Notary runs there, and off it, reading a line's records needs a token, so not everyone can check yet.| Bank only | Inert. Holds the bank's halves and the public keys, never a seed: it can't form any K or sign a death certificate, and an old half plus every public certificate doesn't rebuild today's.TestedTestBankAloneCannotRead, TestBankHalfFromOldHalfAndDCs, TestDemoAttacksGetNothing |
| Bank "starts its own line" | Possible — but it shows. The first genesis sealed under a name stands for good, and phoenix verify names a second genesis, a forged birth, or a birth dropped from the middle (the witness, above).TestedTestGenesisIsTheLinesOwn, TestForgedBirthIsRefused, TestVerifyNamesAGapBeing fixedA bank that doesn't run this code can still hand out halves without sealing anything: nothing on the life's side checks the Notary yet. |
| Old ciphertext + full current bank | The past stays sealed while the old seed is really gone (the corpse, above): an old generation's K needs that generation's seed, which the bank never had, and its death certificate, copied off the witness, collects nothing.TestedTestDemoAttacksGetNothing, TestGenuineReplay |
| Live host | Gets the current secret, which is the whole secret: every generation re-seals the same one, so rotate the real credential at its source. A thief who copies the host and rebirths first doesn't keep the line: your next read freezes it for everyone, the thief too, and the two death certificates prove the key signed twice. Until that read, the thief's read is a birth on the witness you didn't make. (Try it in the demo.) One exception: a copy taken while a reply was lost holds your pending request, ticket and all, so it collects the same answer as a retry. Nothing freezes then; the only mark is a retry on the witness you didn't make.TestedTestThiefRebirthsFirst, TestSecondCertificateFreezesTheLine, TestDemoThiefFirstFreezesTheLine, TestStolenPendingRequestLeavesAMarkBeing fixedA thief who stays on the host still sees each new seed as it's made, and a frozen line has no way back yet. A recovery key kept off the host will be the way back. |
| Bank + host + card + PIN | We can't help you. Nobody can. The honest floor. (There's no card step yet: today a thief with the live host alone is already here.) |
It doesn't promise perfection. The aim is a staircase that gets steeper than any thief's patience — every door asks for the key behind the next door.
The live demo gives you your own lineage, on the engine's own bank and witness. Run real rebirths, read the live secret, then try to be the thief. Three of its four attacks get nothing; the fourth, a thief who copies the live host and reads first, gets the secret, and your next read freezes the line. Its births stay in its own memory and never reach the Notary.
Open the live demo →Questions about how Phoenix works, what it guarantees, or where it stops? Ask away.
Sibling to Kronos Vault — Vault is the gate (who may ask). Phoenix is the wall (what reading costs). They're meant to stack; they aren't joined yet.