This is a draft. It’s a notepad for me to jot things down for fun. It might disappear anytime.
I am not a cryptographer. Expect severe bugs.
Purpose
- PQ contribution to the shared secret.
- No PQ authentication for now!
- Only works as a HNDL defense, would be screwed up by an active quantum-capable MITM.
KEM selection
- ML-KEM (Kyber) should work fine
- Classic McEliece is a much more battle-tested choice, but would not fit into Noise’s and other length limits.
- Does not apply to CSIDH or other NIKE-capable algorithms; those would integrate much more elegantly into Noise, and auth would be trivial too. But none are standardized, SIDH/SIKE is broken, and they are way too CPU intensive.
- Perhaps except for McEliece, as Ori said: we’re in the RC4 era of PQ.
Tokens
- The
kereceiver must be thekemsender; thekemreceiver must be thekesender. - KEM keys and secrets are ephemeral and single-use.
- Each ephemeral KEM keypair is single-use.
- Each
keshould be consumed by max onekem(exactly one unless connection breaks). - After a
kemconsumes ake, deletekempkandkemskon both sides, and deletekemssimmediately afterMixKey, etc.
ke sender
KemPair() -> (kempk, kemsk), storekemsk- Send
kempk MixHash(kempk)
ke receiver
- Get and store
kempk MixHash(kempk)
kem sender
KemEncaps(kempk) -> (kemct, kemss)- Send
kemct MixHash(kemct)MixKey(kemss)
kem receiver
- Get
kemct KemDecaps(kemsk, kemct) -> kemssMixHash(kemct)MixKey(kemss)
Some handshake patterns
Pefer kem before s. (Obviously doesn’t apply to pre-knowledge s.)
These are the four that I’m familiar with (as part of Murshy’s design).
NX
-> e,ke <- e, ee,kem , s, es
XX
-> e,ke <- e, ee,kem , s, es -> s, se
NK
<- s ... -> e, es,ke <- e, ee,kem
XK
<- s ... -> e, es,ke <- e, ee,kem -> s, se
Formal verification?
Well, I’ll look into applied -calculus when I finish my school exams.