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}
ss-x25519-shared-key = X25519(s-x25519-sender-private-key,
s-x25519-recipient-public-key)
PRK = HKDF-Expand(H, prk=PRK,
info="cm/encrypted/sntrup761-x25519-hkdf-blake2b/auth")
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