|
|
@ -19,6 +19,8 @@ var ( |
|
|
|
|
|
|
|
|
|
|
|
// sixteen zero bytes
|
|
|
|
// sixteen zero bytes
|
|
|
|
zero16 = make([]byte, 16) |
|
|
|
zero16 = make([]byte, 16) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
maxUint24 = ^uint32(0) >> 8 |
|
|
|
) |
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
// rlpxFrameRW implements a simplified version of RLPx framing.
|
|
|
|
// rlpxFrameRW implements a simplified version of RLPx framing.
|
|
|
@ -64,6 +66,9 @@ func (rw *rlpxFrameRW) WriteMsg(msg Msg) error { |
|
|
|
// write header
|
|
|
|
// write header
|
|
|
|
headbuf := make([]byte, 32) |
|
|
|
headbuf := make([]byte, 32) |
|
|
|
fsize := uint32(len(ptype)) + msg.Size |
|
|
|
fsize := uint32(len(ptype)) + msg.Size |
|
|
|
|
|
|
|
if fsize > maxUint24 { |
|
|
|
|
|
|
|
return errors.New("message size overflows uint24") |
|
|
|
|
|
|
|
} |
|
|
|
putInt24(fsize, headbuf) // TODO: check overflow
|
|
|
|
putInt24(fsize, headbuf) // TODO: check overflow
|
|
|
|
copy(headbuf[3:], zeroHeader) |
|
|
|
copy(headbuf[3:], zeroHeader) |
|
|
|
rw.enc.XORKeyStream(headbuf[:16], headbuf[:16]) // first half is now encrypted
|
|
|
|
rw.enc.XORKeyStream(headbuf[:16], headbuf[:16]) // first half is now encrypted
|
|
|
|