54 lines
1.2 KiB
Go
54 lines
1.2 KiB
Go
package peer
|
|
|
|
import (
|
|
"log"
|
|
|
|
"golang.org/x/crypto/nacl/sign"
|
|
)
|
|
|
|
func createLocalDiscoveryPacket(localIP byte, signingKey []byte) []byte {
|
|
h := header{
|
|
SourceIP: localIP,
|
|
DestIP: 255,
|
|
}
|
|
buf := make([]byte, headerSize)
|
|
h.Marshal(buf)
|
|
out := make([]byte, headerSize+signOverhead)
|
|
return sign.Sign(out[:0], buf, (*[64]byte)(signingKey))
|
|
}
|
|
|
|
func headerFromLocalDiscoveryPacket(pkt []byte) (h header, ok bool) {
|
|
if len(pkt) != headerSize+signOverhead {
|
|
return
|
|
}
|
|
|
|
h.Parse(pkt[signOverhead:])
|
|
ok = true
|
|
return
|
|
}
|
|
|
|
func verifyLocalDiscoveryPacket(pkt, buf []byte, pubSignKey []byte) bool {
|
|
_, ok := sign.Open(buf[:0], pkt, (*[32]byte)(pubSignKey))
|
|
return ok
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
type mcWriter struct {
|
|
conn mcUDPWriter
|
|
discoveryPacket []byte
|
|
}
|
|
|
|
func newMCWriter(conn mcUDPWriter, localIP byte, signingKey []byte) *mcWriter {
|
|
return &mcWriter{
|
|
conn: conn,
|
|
discoveryPacket: createLocalDiscoveryPacket(localIP, signingKey),
|
|
}
|
|
}
|
|
|
|
func (w *mcWriter) SendLocalDiscovery() {
|
|
if _, err := w.conn.WriteToUDP(w.discoveryPacket, multicastAddr); err != nil {
|
|
log.Printf("[MCWriter] Failed to write multicast UDP packet: %v", err)
|
|
}
|
|
}
|