mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-08-17 17:33:47 +00:00
p2p/discv5: use constant version prefix instead of hash
This commit is contained in:
parent
313384f474
commit
2454a58cd3
1 changed files with 13 additions and 17 deletions
|
|
@ -37,7 +37,7 @@ const Version = 4
|
||||||
// Errors
|
// Errors
|
||||||
var (
|
var (
|
||||||
errPacketTooSmall = errors.New("too small")
|
errPacketTooSmall = errors.New("too small")
|
||||||
errBadHash = errors.New("bad hash")
|
errBadPrefix = errors.New("bad prefix")
|
||||||
errExpired = errors.New("expired")
|
errExpired = errors.New("expired")
|
||||||
errUnsolicitedReply = errors.New("unsolicited reply")
|
errUnsolicitedReply = errors.New("unsolicited reply")
|
||||||
errUnknownNode = errors.New("unknown node")
|
errUnknownNode = errors.New("unknown node")
|
||||||
|
|
@ -145,10 +145,11 @@ type (
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
var (
|
||||||
macSize = 256 / 8
|
versionPrefix = []byte("temporary discovery v5")
|
||||||
|
versionPrefixSize = len(versionPrefix)
|
||||||
sigSize = 520 / 8
|
sigSize = 520 / 8
|
||||||
headSize = macSize + sigSize // space of packet frame data
|
headSize = versionPrefixSize + sigSize // space of packet frame data
|
||||||
)
|
)
|
||||||
|
|
||||||
// Neighbors replies are sent across multiple packets to
|
// Neighbors replies are sent across multiple packets to
|
||||||
|
|
@ -364,12 +365,9 @@ func encodePacket(priv *ecdsa.PrivateKey, ptype byte, req interface{}) (p, hash
|
||||||
log.Error(fmt.Sprint("could not sign packet:", err))
|
log.Error(fmt.Sprint("could not sign packet:", err))
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
copy(packet[macSize:], sig)
|
copy(packet, versionPrefix)
|
||||||
// add the hash to the front. Note: this doesn't protect the
|
copy(packet[versionPrefixSize:], sig)
|
||||||
// packet in any way.
|
hash = crypto.Keccak256(packet[versionPrefixSize:])
|
||||||
hash = crypto.Keccak256(packet[macSize:])
|
|
||||||
hash[0]++ // guarantee incompatibility between v4 and temporary v5 packet formats
|
|
||||||
copy(packet, hash)
|
|
||||||
return packet, hash, nil
|
return packet, hash, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -413,18 +411,16 @@ func decodePacket(buffer []byte, pkt *ingressPacket) error {
|
||||||
}
|
}
|
||||||
buf := make([]byte, len(buffer))
|
buf := make([]byte, len(buffer))
|
||||||
copy(buf, buffer)
|
copy(buf, buffer)
|
||||||
hash, sig, sigdata := buf[:macSize], buf[macSize:headSize], buf[headSize:]
|
prefix, sig, sigdata := buf[:versionPrefixSize], buf[versionPrefixSize:headSize], buf[headSize:]
|
||||||
shouldhash := crypto.Keccak256(buf[macSize:])
|
if !bytes.Equal(prefix, versionPrefix) {
|
||||||
shouldhash[0]++ // guarantee incompatibility between v4 and temporary v5 packet formats
|
return errBadPrefix
|
||||||
if !bytes.Equal(hash, shouldhash) {
|
|
||||||
return errBadHash
|
|
||||||
}
|
}
|
||||||
fromID, err := recoverNodeID(crypto.Keccak256(buf[headSize:]), sig)
|
fromID, err := recoverNodeID(crypto.Keccak256(buf[headSize:]), sig)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
pkt.rawData = buf
|
pkt.rawData = buf
|
||||||
pkt.hash = hash
|
pkt.hash = crypto.Keccak256(buf[versionPrefixSize:])
|
||||||
pkt.remoteID = fromID
|
pkt.remoteID = fromID
|
||||||
switch pkt.ev = nodeEvent(sigdata[0]); pkt.ev {
|
switch pkt.ev = nodeEvent(sigdata[0]); pkt.ev {
|
||||||
case pingPacket:
|
case pingPacket:
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue