sntrup761 key size

Niels Möller <[email protected]> Thu, 09 Apr 2026 17:04:58 +0200
Newsgroups gmane.ietf.secsh
Message-ID <[email protected]>
Hi,

I'm looking into implementing sntrup761 (so far, the underlying KEM
primitive, not yet the SSH specifics). But I'm confused by the private
key size, and I hope people here can help me shed some light.

As far as I understand, the main reference is
https://ntruprime.cr.yp.to/nist/ntruprime-20201007.pdf.

Key generation (2.3.6) outputs the public key _K_ (underlined K in the
spec), and private key that consists of _k_, _K_ and rho (these are all
octet strings; I'm assuming they are simply concatenated, even though
that's not explicitly said).

For the sntrup761 parameters, _K_ represents an element of R/q, encoded
as 1158 bytes. _k_ represents two elements in R/3, encoded as 191 octets
each. And rho is another 191 random octets, for a total of 1731 =3D 1158 +
3*191 octets.

But then it seems some implementations instead use a private key size of
1763 bytes, where the last 32 bytes are a hash of the public key _K_
(more precisely, Hash_4(_K_)). Which to me looks like a somewhat weird
optimization, since this value is very cheap to recompute whenever needed,
compared to the rest of the decapsulation operation.

Is there some authoritative spec nailing down the private key size and
representation?

Regards,
/Niels

--=20
Niels M=C3=B6ller. PGP key CB4962D070D77D7FCB8BA36271D8F1FF368C6677.
Internet email is subject to wholesale government surveillance.