Files
indra/pkg/engine/reply.go
2023-08-10 18:48:59 +01:00

42 lines
1.3 KiB
Go

package engine
import (
"git.indra-labs.org/dev/ind/pkg/codec"
"git.indra-labs.org/dev/ind/pkg/codec/onion/exit"
"git.indra-labs.org/dev/ind/pkg/codec/ont"
"git.indra-labs.org/dev/ind/pkg/crypto"
"git.indra-labs.org/dev/ind/pkg/engine/sessions"
"git.indra-labs.org/dev/ind/pkg/hidden"
)
// MakeReplyHeader constructs a reply header for hidden service messages.
func MakeReplyHeader(ng *Engine) (returnHeader *hidden.ReplyHeader) {
n := crypto.GenNonces(3)
rvKeys := ng.KeySet.Next3()
hops := []byte{3, 4, 5}
s := make(sessions.Sessions, len(hops))
ng.Mgr().SelectHops(hops, s, "make message reply header")
rt := &exit.Routing{
Sessions: [3]*sessions.Data{s[0], s[1], s[2]},
Keys: crypto.Privs{rvKeys[0], rvKeys[1], rvKeys[2]},
Nonces: crypto.Nonces{n[0], n[1], n[2]},
}
rh := Skins{}.RoutingHeader(rt, ng.Mgr().Protocols)
rHdr := codec.Encode(ont.Assemble(rh))
rHdr.SetCursor(0)
ep := exit.ExitPoint{
Routing: rt,
ReturnPubs: crypto.Pubs{
crypto.DerivePub(s[0].Payload.Prv),
crypto.DerivePub(s[1].Payload.Prv),
crypto.DerivePub(s[2].Payload.Prv),
},
}
returnHeader = &hidden.ReplyHeader{
RoutingHeaderBytes: hidden.GetRoutingHeaderFromCursor(rHdr),
Ciphers: crypto.GenCiphers(ep.Routing.Keys, ep.ReturnPubs),
Nonces: ep.Routing.Nonces,
}
return
}