encrypt multicast with shared key

This commit is contained in:
2026-07-22 17:25:18 +02:00
parent f9f0df478d
commit 412426fd70
3 changed files with 117 additions and 98 deletions

View File

@@ -6,6 +6,7 @@
package main
import (
"crypto/hpke"
"crypto/rand"
"encoding/binary"
"log"
@@ -18,12 +19,13 @@ import (
type Peer struct {
RealAddr *net.UDPAddr
InternalIP string
PublicKey []byte
PublicKey hpke.PublicKey
}
var (
peers = shared.NewTMap[string, *Peer]()
conn *net.UDPConn
peers = shared.NewTMap[string, *Peer]()
conn *net.UDPConn
multicastKey = make([]byte, 32)
)
func main() {
@@ -31,6 +33,10 @@ func main() {
panic("root permissions needed")
}
if _, err := rand.Read(multicastKey); err != nil {
panic(err)
}
receivePackets()
}
@@ -83,7 +89,11 @@ func handleReq(req []byte, addr *net.UDPAddr) {
switch pktType {
case shared.REQ_REGISTER:
pubKey := req[4:]
pubKey, err := hpke.MLKEM768X25519().NewPublicKey(req[4:])
if err != nil {
log.Println("invalid pubkey")
return
}
internalIP := randomIP().String()
@@ -97,7 +107,12 @@ func handleReq(req []byte, addr *net.UDPAddr) {
})
}
resp := shared.BuildPkt(shared.RESP_REGISTER, net.ParseIP(internalIP))
ciphertext, err := hpke.Seal(pubKey, hpke.HKDFSHA256(), hpke.ChaCha20Poly1305(), []byte("baalvpn"), multicastKey)
if err != nil {
panic(err)
}
resp := shared.BuildPkt(shared.RESP_REGISTER, append(net.ParseIP(internalIP), ciphertext...))
sendTo(addr, resp)
case shared.ENC_PKT:
peer := peers.Get(addr.IP.String())
@@ -126,8 +141,7 @@ func handleReq(req []byte, addr *net.UDPAddr) {
return
}
destIP := net.IP(req[42:58]).String()
log.Println(peer.InternalIP + " -> " + destIP)
log.Println(peer.InternalIP + " -> *")
broadcast(req, peer.InternalIP)
case shared.REQ_GET_PUBKEY:
peerIP := net.IP(req[4:20]).String()
@@ -137,7 +151,7 @@ func handleReq(req []byte, addr *net.UDPAddr) {
return
}
resp := shared.BuildPkt(shared.RESP_GET_PUBKEY, append(net.ParseIP(peer.InternalIP), peer.PublicKey...))
resp := shared.BuildPkt(shared.RESP_GET_PUBKEY, append(net.ParseIP(peer.InternalIP), peer.PublicKey.Bytes()...))
sendTo(addr, resp)
case shared.REQ_ESTABLISH, shared.RESP_ESTABLISH:
peer := peers.Get(addr.IP.String())