PubDir.Dir = *PubDirPth
var pubs []cm.AV
var pubIds [][]byte
+ var pubPrehashes [][][]byte
for _, pth := range flag.Args() {
pubData, err := pubParse(pth)
if err != nil {
}
pubs = append(pubs, pubData.Pub[0])
pubIds = append(pubIds, pubData.Id)
+ pubPrehashes = append(pubPrehashes, pubData.Prehash)
}
var err error
log.Fatal(err)
}
{
- ourMcEliecePub := ourMcEliece.Public()
- var ourMcEliecePubRaw []byte
- ourMcEliecePubRaw, err = ourMcEliecePub.MarshalBinary()
- if err != nil {
- log.Fatal(err)
+ var pkHash []byte
+ if signed, _ := PubDir.Get(kem.To); signed != nil {
+ ourPub, err := pubDataFromSigned(signed)
+ if err != nil {
+ log.Fatalln("our from:", err)
+ }
+ if len(ourPub.Prehash) > 0 {
+ pkHash = ourPub.Prehash[0]
+ }
+ }
+ if pkHash == nil {
+ ourMcEliecePub := ourMcEliece.Public()
+ var ourMcEliecePubRaw []byte
+ ourMcEliecePubRaw, err = ourMcEliecePub.MarshalBinary()
+ if err != nil {
+ log.Fatal(err)
+ }
+ hasher := cmhash.NewSHAKE256()
+ hasher.Write(ourMcEliecePubRaw)
+ hasher.Write(ourX25519.PublicKey().Bytes())
+ pkHash = hasher.Sum(nil)
}
- pkHash := cmhash.NewSHAKE256()
- pkHash.Write(ourMcEliecePubRaw)
- pkHash.Write(ourX25519.PublicKey().Bytes())
ikm := bytes.Join([][]byte{
keyMcEliece, keyX25519,
sha3.SumSHAKE256(kem.Encap, 64),
- pkHash.Sum(nil),
+ pkHash,
}, []byte{})
var prk []byte
prk, err = hkdf.Extract(cmhash.NewSHAKE256, ikm, nil)
log.Fatal(err)
}
{
+ var pkHash []byte
+ if len(pubPrehashes[pubId]) > 0 {
+ pkHash = pubPrehashes[pubId][0]
+ } else {
+ pkHash = sha3.SumSHAKE256(pub.V, 64)
+ }
ikm := bytes.Join([][]byte{
keyMcEliece[:], keyX25519,
sha3.SumSHAKE256(kem.Encap, 64),
- sha3.SumSHAKE256(pub.V, 64),
+ pkHash,
}, []byte{})
var prk []byte
prk, err = hkdf.Extract(cmhash.NewSHAKE256, ikm, nil)
// Public key' contents.
type PubData struct {
- KU map[string]*struct{} `keks:"ku"`
- Sub map[string]string `keks:"sub"`
- Crit []map[string]any `keks:"crit"`
- Pub []cm.AV `keks:"pub"`
- Id []byte `keks:"id"`
+ KU map[string]*struct{} `keks:"ku"`
+ Sub map[string]string `keks:"sub"`
+ Crit []map[string]any `keks:"crit"`
+ Pub []cm.AV `keks:"pub"`
+ Id []byte `keks:"id"`
+ Prehash [][]byte `keks:"prehash"`
}
// Parse KEKS-encoded data as Signed with the PubData (certificate) contents.
if err != nil {
return
}
- tail = d.B
- signed = &sd
- if sd.TBS.T != "pub" {
+ if sd.TBS.T == "pub" {
+ tail = d.B
+ signed = &sd
+ } else {
err = errors.New("PubParse: wrong load type")
}
return