Streamlined NTRU Prime 761 + X25519 + HKDF-BLAKE2b KEM. => Streamlined NTRU Prime KEM algorithm => X25519 => RFC 5869, HKDF => RFC 7693, BLAKE2b kem-with-encap { {field . {map}} {field a {str} >0} {# sntrup761-x25519-hkdf-blake2b} {# mceliece6960119-x25519-hkdf-shake256} {field cek {bin} >0} {# wrapped CEK} {field encap {bin} >0} {field to {with fpr} optional} {# recipient's public key} {field from {with fpr} optional} {# sender's public key} } "/kem/*/a" equals to "sntrup761-x25519-hkdf-blake2b". Recipient public key with [cm/pub/sntrup761-x25519] algorithm must be used. It should have "kem" key usage set. Recipient's map "/kem/*/encap" field is a concatenation of 1047 bytes Streamlined NTRU Prime 761's ciphertext, containing ephemeral key, with 32 bytes ephemeral X25519 public key. Recipient performs X25519 and SNTRUP computations to derive/decapsulate two 32-byte shared keys. Then it combines them to get the KEK decryption key of the CEK. ==================================================== WARNING ==================================================== Sender authentication uses only *NON*-PQ crypto! ==================================================== H = BLAKE2b PRK = HKDF-Extract(H, salt="", ikm= sntrup761-shared-key || es-x25519-shared-key || H(sntrup761-sender-ciphertext || e-x25519-sender-public-key) || H(sntrup761-recipient-public-key || s-x25519-recipient-public-key)) if {specified sender} PRK = HKDF-Extract(H, salt=PRK, ikm= ss-x25519-shared-key || s-x25519-sender-public-key || s-x25519-recipient-public-key) KEK = HKDF-Expand(H, prk=PRK, info="cm/encrypted/sntrup761-x25519-hkdf-blake2b" || /id) "/kem/*/cek" is wrapped with [cm/keywrap/xchapoly] mechanism. KEM combiner nearly fully resembles: => Chempat