"crypto/ecdh"
"crypto/hkdf"
"crypto/rand"
+ "crypto/sha3"
"errors"
"flag"
"fmt"
}
case sntrup4591761x25519.SNTRUP4591761X25519HKDFBLAKE2b:
if len(prvs) == 0 {
- log.Println(kemIdx, kem.A, "skipping because no -prv")
+ log.Println(kemIdx, kem.A, "skipping because no private key specified")
continue
}
if kem.Encap == nil {
log.Fatal(err)
}
{
- pub := append(
+ ctHash := blake2b.Sum512(kem.Encap)
+ pkHash := blake2b.Sum512(append(
ourSNTRUP[382:],
ourX25519.PublicKey().Bytes()...,
- )
+ ))
ikm := bytes.Join([][]byte{
- kem.Encap, pub,
- keySNTRUP[:], keyX25519,
+ keySNTRUP[:], keyX25519, ctHash[:], pkHash[:],
}, []byte{})
var prk []byte
prk, err = hkdf.Extract(blake2bHash, ikm, nil)
}
case mceliece6960119x25519.ClassicMcEliece6960119X25519HKDFSHAKE256:
if len(prvs) == 0 {
- log.Println(kemIdx, kem.A, "skipping because no -prv")
+ log.Println(kemIdx, kem.A, "skipping because no private key specified")
continue
}
if kem.Encap == nil {
}
theirMcEliece := (kem.Encap)[:len(kem.Encap)-32]
var keyMcEliece []byte
- keyMcEliece, err = mceliece6960119.Decapsulate(ourMcEliece, theirMcEliece)
+ keyMcEliece, err = mceliece6960119.Decapsulate(
+ ourMcEliece, theirMcEliece,
+ )
if err != nil {
log.Fatal(err)
}
if err != nil {
log.Fatal(err)
}
- pub := append(
- ourMcEliecePubRaw,
- ourX25519.PublicKey().Bytes()...,
- )
+ pkHash := cmhash.NewSHAKE256()
+ pkHash.Write(ourMcEliecePubRaw)
+ pkHash.Write(ourX25519.PublicKey().Bytes())
ikm := bytes.Join([][]byte{
- kem.Encap, pub,
keyMcEliece, keyX25519,
+ sha3.SumSHAKE256(kem.Encap, 32),
+ pkHash.Sum(nil),
}, []byte{})
var prk []byte
prk, err = hkdf.Extract(cmhash.NewSHAKE256, ikm, nil)
if err != nil {
log.Fatal(err)
}
- kem := cmenc.KEM{A: sntrup4591761x25519.SNTRUP4591761X25519HKDFBLAKE2b}
- encap := append(ciphertext[:], ourPubX25519.Bytes()...)
- kem.Encap = encap
+ kem := cmenc.KEM{
+ A: sntrup4591761x25519.SNTRUP4591761X25519HKDFBLAKE2b,
+ Encap: append(ciphertext[:], ourPubX25519.Bytes()...),
+ }
{
+ ctHash := blake2b.Sum512(kem.Encap)
+ pkHash := blake2b.Sum512(pub.V)
ikm := bytes.Join([][]byte{
- encap, pub.V,
- keySNTRUP[:], keyX25519,
+ keySNTRUP[:], keyX25519, ctHash[:], pkHash[:],
}, []byte{})
var prk []byte
prk, err = hkdf.Extract(blake2bHash, ikm, nil)
if err != nil {
log.Fatal(err)
}
- kem := cmenc.KEM{A: mceliece6960119x25519.ClassicMcEliece6960119X25519HKDFSHAKE256}
- encap := append(ciphertext[:], ourPubX25519.Bytes()...)
- kem.Encap = encap
+ kem := cmenc.KEM{
+ A: mceliece6960119x25519.ClassicMcEliece6960119X25519HKDFSHAKE256,
+ Encap: append(ciphertext[:], ourPubX25519.Bytes()...),
+ }
{
ikm := bytes.Join([][]byte{
- encap, pub.V,
keyMcEliece[:], keyX25519,
+ sha3.SumSHAKE256(kem.Encap, 32),
+ sha3.SumSHAKE256(pub.V, 32),
}, []byte{})
var prk []byte
prk, err = hkdf.Extract(cmhash.NewSHAKE256, ikm, nil)
kek, err = hkdf.Expand(
cmhash.NewSHAKE256,
prk,
- string(append([]byte(cmenc.ClassicMcEliece6960119X25519Info), id[:]...)),
+ string(append(
+ []byte(cmenc.ClassicMcEliece6960119X25519Info),
+ id[:]...),
+ ),
chacha20poly1305.KeySize,
)
if err != nil {
@verbatim
PRK = HKDF-Extract(SHAKE256, salt="", ikm=
- mceliece6960119-sender-ciphertext ||
- x25519-sender-public-key ||
- mceliece6960119-recipient-public-key ||
- x25519-recipient-public-key ||
- mceliece6960119-shared-key ||
- x25519-shared-key)[:32]
+ mceliece6960119-shared-key || x25519-shared-key ||
+ SHAKE256(mceliece6960119-sender-ciphertext || x25519-sender-public-key) ||
+ SHAKE256(mceliece6960119-recipient-public-key || x25519-recipient-public-key))
KEK = HKDF-Expand(SHAKE256, prk=PRK,
- info="keks/cm/encrypted/mceliece6960119-x25519-hkdf-shake256" || /salt)
+ info="cm/encrypted/mceliece6960119-x25519-hkdf-shake256" || /salt)
@end verbatim
@code{/kem/*/cek} is wrapped with @ref{keywrap-xchapoly} mechanism.
@verbatim
PRK = HKDF-Extract(BLAKE2b, salt="", ikm=
- sntrup4591761-sender-ciphertext ||
- x25519-sender-public-key ||
- sntrup4591761-recipient-public-key ||
- x25519-recipient-public-key ||
- sntrup4591761-shared-key ||
- x25519-shared-key)
+ sntrup4591761-shared-key || x25519-shared-key ||
+ BLAKE2b(sntrup4591761-sender-ciphertext || x25519-sender-public-key) ||
+ BLAKE2b(sntrup4591761-recipient-public-key || x25519-recipient-public-key))
KEK = HKDF-Expand(BLAKE2b, prk=PRK,
- info="keks/cm/encrypted/sntrup4591761-x25519-hkdf-blake2b" || /id)
+ info="cm/encrypted/sntrup4591761-x25519-hkdf-blake2b" || /id)
@end verbatim
@code{/kem/*/cek} is wrapped with @ref{keywrap-xchapoly} mechanism.