encrypt multicast with shared key
This commit is contained in:
@@ -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())
|
||||
|
||||
Reference in New Issue
Block a user