|
|
@@ -37,7 +37,7 @@ const Version = 4
|
|
|
// Errors
|
|
|
var (
|
|
|
errPacketTooSmall = errors.New("too small")
|
|
|
- errBadHash = errors.New("bad hash")
|
|
|
+ errBadPrefix = errors.New("bad prefix")
|
|
|
errExpired = errors.New("expired")
|
|
|
errUnsolicitedReply = errors.New("unsolicited reply")
|
|
|
errUnknownNode = errors.New("unknown node")
|
|
|
@@ -145,10 +145,11 @@ type (
|
|
|
}
|
|
|
)
|
|
|
|
|
|
-const (
|
|
|
- macSize = 256 / 8
|
|
|
- sigSize = 520 / 8
|
|
|
- headSize = macSize + sigSize // space of packet frame data
|
|
|
+var (
|
|
|
+ versionPrefix = []byte("temporary discovery v5")
|
|
|
+ versionPrefixSize = len(versionPrefix)
|
|
|
+ sigSize = 520 / 8
|
|
|
+ headSize = versionPrefixSize + sigSize // space of packet frame data
|
|
|
)
|
|
|
|
|
|
// Neighbors replies are sent across multiple packets to
|
|
|
@@ -237,12 +238,12 @@ type udp struct {
|
|
|
}
|
|
|
|
|
|
// ListenUDP returns a new table that listens for UDP packets on laddr.
|
|
|
-func ListenUDP(priv *ecdsa.PrivateKey, laddr string, natm nat.Interface, nodeDBPath string, netrestrict *netutil.Netlist) (*Network, error) {
|
|
|
- transport, err := listenUDP(priv, laddr)
|
|
|
+func ListenUDP(priv *ecdsa.PrivateKey, conn conn, realaddr *net.UDPAddr, nodeDBPath string, netrestrict *netutil.Netlist) (*Network, error) {
|
|
|
+ transport, err := listenUDP(priv, conn, realaddr)
|
|
|
if err != nil {
|
|
|
return nil, err
|
|
|
}
|
|
|
- net, err := newNetwork(transport, priv.PublicKey, natm, nodeDBPath, netrestrict)
|
|
|
+ net, err := newNetwork(transport, priv.PublicKey, nodeDBPath, netrestrict)
|
|
|
if err != nil {
|
|
|
return nil, err
|
|
|
}
|
|
|
@@ -251,16 +252,8 @@ func ListenUDP(priv *ecdsa.PrivateKey, laddr string, natm nat.Interface, nodeDBP
|
|
|
return net, nil
|
|
|
}
|
|
|
|
|
|
-func listenUDP(priv *ecdsa.PrivateKey, laddr string) (*udp, error) {
|
|
|
- addr, err := net.ResolveUDPAddr("udp", laddr)
|
|
|
- if err != nil {
|
|
|
- return nil, err
|
|
|
- }
|
|
|
- conn, err := net.ListenUDP("udp", addr)
|
|
|
- if err != nil {
|
|
|
- return nil, err
|
|
|
- }
|
|
|
- return &udp{conn: conn, priv: priv, ourEndpoint: makeEndpoint(addr, uint16(addr.Port))}, nil
|
|
|
+func listenUDP(priv *ecdsa.PrivateKey, conn conn, realaddr *net.UDPAddr) (*udp, error) {
|
|
|
+ return &udp{conn: conn, priv: priv, ourEndpoint: makeEndpoint(realaddr, uint16(realaddr.Port))}, nil
|
|
|
}
|
|
|
|
|
|
func (t *udp) localAddr() *net.UDPAddr {
|
|
|
@@ -372,11 +365,9 @@ func encodePacket(priv *ecdsa.PrivateKey, ptype byte, req interface{}) (p, hash
|
|
|
log.Error(fmt.Sprint("could not sign packet:", err))
|
|
|
return nil, nil, err
|
|
|
}
|
|
|
- copy(packet[macSize:], sig)
|
|
|
- // add the hash to the front. Note: this doesn't protect the
|
|
|
- // packet in any way.
|
|
|
- hash = crypto.Keccak256(packet[macSize:])
|
|
|
- copy(packet, hash)
|
|
|
+ copy(packet, versionPrefix)
|
|
|
+ copy(packet[versionPrefixSize:], sig)
|
|
|
+ hash = crypto.Keccak256(packet[versionPrefixSize:])
|
|
|
return packet, hash, nil
|
|
|
}
|
|
|
|
|
|
@@ -420,17 +411,16 @@ func decodePacket(buffer []byte, pkt *ingressPacket) error {
|
|
|
}
|
|
|
buf := make([]byte, len(buffer))
|
|
|
copy(buf, buffer)
|
|
|
- hash, sig, sigdata := buf[:macSize], buf[macSize:headSize], buf[headSize:]
|
|
|
- shouldhash := crypto.Keccak256(buf[macSize:])
|
|
|
- if !bytes.Equal(hash, shouldhash) {
|
|
|
- return errBadHash
|
|
|
+ prefix, sig, sigdata := buf[:versionPrefixSize], buf[versionPrefixSize:headSize], buf[headSize:]
|
|
|
+ if !bytes.Equal(prefix, versionPrefix) {
|
|
|
+ return errBadPrefix
|
|
|
}
|
|
|
fromID, err := recoverNodeID(crypto.Keccak256(buf[headSize:]), sig)
|
|
|
if err != nil {
|
|
|
return err
|
|
|
}
|
|
|
pkt.rawData = buf
|
|
|
- pkt.hash = hash
|
|
|
+ pkt.hash = crypto.Keccak256(buf[versionPrefixSize:])
|
|
|
pkt.remoteID = fromID
|
|
|
switch pkt.ev = nodeEvent(sigdata[0]); pkt.ev {
|
|
|
case pingPacket:
|