@ -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
var (
versionPrefix = [ ] byte ( "temporary discovery v5" )
versionPrefixSize = len ( versionPrefix )
sigSize = 520 / 8
headSize = mac Size + sigSize // space of packet frame data
headSize = versionPrefix Size + 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 , rea laddr)
if err != nil {
return nil , err
}
net , err := newNetwork ( transport , priv . PublicKey , natm , n odeDBPath , 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 :