KEM-Sphinx #
Sphinx over a generic KEM. Unlike NIKE-Sphinx, each hop gets an independent encapsulation (no
blinding), and each non-terminal hop's routing-info block carries the next hop's ciphertext in its
last kem.ciphertextSize bytes.
Build a KEM-Sphinx header. ephemeralSeeds seeds one encapsulation per hop.
Equations
- One or more equations did not get rendered due to their size.
Instances For
If pkBytes is skBytes's own public key and encapsulation succeeds, decapsulating with
skBytes recovers the same shared secret.
Terminal hop: the fragment's leading perHop - ctSize bytes parse to the hop's commands and
the trailing ctSize bytes are zero.
Non-terminal hop: the fragment's leading perHop - ctSize bytes parse to the hop's commands
followed by NextNodeHop (next hop's ID, macBytes), and the trailing ctSize bytes are the next
hop's ciphertext.
createKEMHeader's header is geom.headerLength bytes.
Build a KEM-Sphinx packet.
Equations
- One or more equations did not get rendered due to their size.
Instances For
newKEMPacket's packet is geom.packetLength bytes.
newKEMPacket with per-hop seeds and filler drawn from the seed stream.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Build a KEM-Sphinx SURB.
Equations
- One or more equations did not get rendered due to their size.
Instances For
newKEMSURB's header is geom.headerLength bytes.
newKEMSURB with per-hop seeds, keyPayload and filler drawn from the seed stream.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Process one hop: returns (payload, replayTag, cmds, forwardPkt). The forwarded packet
carries the next-hop ciphertext copied from the decrypted routing-info block.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Non-terminal hop: given the honest key pairing at hop k (k+1 < nrHops), unwrapKEM
maps hopPacket ... k to hopPacket ... (k+1).
Terminal hop: given the honest key pairing at hop k (k + 1 = nrHops) and t 0 a zero
tag followed by payload, unwrapKEM on hopPacket ... k recovers payload.
Unwrapping hopPacket ... k with the remaining private keys for path[k], path[k+1], ...
recovers payload.
A successful wrapKEM call drew per-hop seeds str (i + j) and the filler from the seed
stream, and newKEMPacket succeeded on them producing pkt.
Completeness: unwrapping a wrapKEM packet hop by hop recovers the payload. Requires
geom.ValidForKEM kem and 16 ≤ geom.payloadTagLength + geom.forwardPayloadLength.
A KEMSphinxScheme for any KEM, MAC, KDF, stream cipher and wide-block cipher.
Equations
- One or more equations did not get rendered due to their size.
Instances For
A KEMSphinxScheme for the KEM geom.kemName names, with AEZ, HMAC-SHA256,
HKDF-SHA256-Expand and AES-256-CTR. Rejects a geom that fails the validity checks.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Wrap-resistance fails #
KEM-Sphinx has no blinding step. A holder of privKey can compute the header keystream for any
ciphertext, so every target routing-info block is reachable.
KEM-Sphinx is not wrap-resistant: for any routing-info block target, some pre-decryption
bytes decrypt to exactly target.