mirror of https://github.com/status-im/nim-eth.git
Push raises Defect to rlpx and accompanying changes (#373)
This commit is contained in:
parent
79911ed5d8
commit
eb0908e33f
|
@ -485,7 +485,7 @@ proc decodeAckMessage*(h: var Handshake, input: openarray[byte]): AuthResult[voi
|
||||||
|
|
||||||
proc getSecrets*(
|
proc getSecrets*(
|
||||||
h: Handshake, authmsg: openarray[byte],
|
h: Handshake, authmsg: openarray[byte],
|
||||||
ackmsg: openarray[byte]): AuthResult[ConnectionSecret] =
|
ackmsg: openarray[byte]): ConnectionSecret =
|
||||||
## Derive secrets from handshake `h` using encrypted AuthMessage `authmsg` and
|
## Derive secrets from handshake `h` using encrypted AuthMessage `authmsg` and
|
||||||
## encrypted AckMessage `ackmsg`.
|
## encrypted AckMessage `ackmsg`.
|
||||||
var
|
var
|
||||||
|
@ -549,4 +549,4 @@ proc getSecrets*(
|
||||||
ctx0.clear()
|
ctx0.clear()
|
||||||
ctx1.clear()
|
ctx1.clear()
|
||||||
|
|
||||||
ok(secret)
|
secret
|
||||||
|
|
|
@ -5,6 +5,8 @@
|
||||||
# * Apache v2 license (license terms in the root directory or at https://www.apache.org/licenses/LICENSE-2.0).
|
# * Apache v2 license (license terms in the root directory or at https://www.apache.org/licenses/LICENSE-2.0).
|
||||||
# at your option. This file may not be copied, modified, or distributed except according to those terms.
|
# at your option. This file may not be copied, modified, or distributed except according to those terms.
|
||||||
|
|
||||||
|
{.push raises: [Defect].}
|
||||||
|
|
||||||
import
|
import
|
||||||
std/[tables, algorithm, deques, hashes, options, typetraits],
|
std/[tables, algorithm, deques, hashes, options, typetraits],
|
||||||
stew/shims/macros, chronicles, nimcrypto, chronos,
|
stew/shims/macros, chronicles, nimcrypto, chronos,
|
||||||
|
@ -512,13 +514,14 @@ proc recvMsg*(peer: Peer): Future[tuple[msgId: int, msgData: Rlp]] {.async.} =
|
||||||
await peer.disconnectAndRaise(BreachOfProtocol,
|
await peer.disconnectAndRaise(BreachOfProtocol,
|
||||||
"Cannot read RLPx message id")
|
"Cannot read RLPx message id")
|
||||||
|
|
||||||
proc checkedRlpRead(peer: Peer, r: var Rlp, MsgType: type): auto =
|
proc checkedRlpRead(peer: Peer, r: var Rlp, MsgType: type):
|
||||||
|
auto {.raises: [RlpError, Defect].} =
|
||||||
when defined(release):
|
when defined(release):
|
||||||
return r.read(MsgType)
|
return r.read(MsgType)
|
||||||
else:
|
else:
|
||||||
try:
|
try:
|
||||||
return r.read(MsgType)
|
return r.read(MsgType)
|
||||||
except Exception as e:
|
except rlp.RlpError as e:
|
||||||
debug "Failed rlp.read",
|
debug "Failed rlp.read",
|
||||||
peer = peer,
|
peer = peer,
|
||||||
dataType = MsgType.name,
|
dataType = MsgType.name,
|
||||||
|
@ -945,7 +948,7 @@ proc validatePubKeyInHello(msg: DevP2P.hello, pubKey: PublicKey): bool =
|
||||||
let pk = PublicKey.fromRaw(msg.nodeId)
|
let pk = PublicKey.fromRaw(msg.nodeId)
|
||||||
pk.isOk and pk[] == pubKey
|
pk.isOk and pk[] == pubKey
|
||||||
|
|
||||||
proc checkUselessPeer(peer: Peer) =
|
proc checkUselessPeer(peer: Peer) {.raises: [UselessPeerError, Defect].} =
|
||||||
if peer.dispatcher.numProtocols == 0:
|
if peer.dispatcher.numProtocols == 0:
|
||||||
# XXX: Send disconnect + UselessPeer
|
# XXX: Send disconnect + UselessPeer
|
||||||
raise newException(UselessPeerError, "Useless peer")
|
raise newException(UselessPeerError, "Useless peer")
|
||||||
|
@ -1021,8 +1024,8 @@ template `^`(arr): auto =
|
||||||
arr.toOpenArray(0, `arr Len` - 1)
|
arr.toOpenArray(0, `arr Len` - 1)
|
||||||
|
|
||||||
proc initSecretState(hs: var Handshake, authMsg, ackMsg: openarray[byte],
|
proc initSecretState(hs: var Handshake, authMsg, ackMsg: openarray[byte],
|
||||||
p: Peer) =
|
p: Peer) =
|
||||||
var secrets = hs.getSecrets(authMsg, ackMsg).tryGet()
|
var secrets = hs.getSecrets(authMsg, ackMsg)
|
||||||
initSecretState(secrets, p.secretsState)
|
initSecretState(secrets, p.secretsState)
|
||||||
burnMem(secrets)
|
burnMem(secrets)
|
||||||
|
|
||||||
|
|
|
@ -283,7 +283,7 @@ proc run(peer: Peer) {.async, raises: [Defect].} =
|
||||||
peer.processQueue()
|
peer.processQueue()
|
||||||
await sleepAsync(messageInterval)
|
await sleepAsync(messageInterval)
|
||||||
|
|
||||||
proc pruneReceived(node: EthereumNode) {.raises: [].} =
|
proc pruneReceived(node: EthereumNode) {.raises: [Defect].} =
|
||||||
if node.peerPool != nil: # XXX: a bit dirty to need to check for this here ...
|
if node.peerPool != nil: # XXX: a bit dirty to need to check for this here ...
|
||||||
var whisperNet = node.protocolState(Whisper)
|
var whisperNet = node.protocolState(Whisper)
|
||||||
|
|
||||||
|
|
|
@ -312,8 +312,8 @@ suite "Ethereum P2P handshake test suite":
|
||||||
|
|
||||||
responder.decodeAuthMessage(authm).expect("decode success")
|
responder.decodeAuthMessage(authm).expect("decode success")
|
||||||
initiator.decodeAckMessage(ackm).expect("ack success")
|
initiator.decodeAckMessage(ackm).expect("ack success")
|
||||||
var csecInitiator = initiator.getSecrets(authm, ackm).expect("secrets success")
|
var csecInitiator = initiator.getSecrets(authm, ackm)
|
||||||
var csecResponder = responder.getSecrets(authm, ackm).expect("secrets success")
|
var csecResponder = responder.getSecrets(authm, ackm)
|
||||||
check:
|
check:
|
||||||
csecInitiator.aesKey == csecResponder.aesKey
|
csecInitiator.aesKey == csecResponder.aesKey
|
||||||
csecInitiator.macKey == csecResponder.macKey
|
csecInitiator.macKey == csecResponder.macKey
|
||||||
|
@ -387,8 +387,8 @@ suite "Ethereum P2P handshake test suite":
|
||||||
var taes = fromHex(stripSpaces(testE8Value("auth2ack2_aes_secret")))
|
var taes = fromHex(stripSpaces(testE8Value("auth2ack2_aes_secret")))
|
||||||
var tmac = fromHex(stripSpaces(testE8Value("auth2ack2_mac_secret")))
|
var tmac = fromHex(stripSpaces(testE8Value("auth2ack2_mac_secret")))
|
||||||
|
|
||||||
var csecInitiator = initiator.getSecrets(m0, m1).expect("secrets")
|
var csecInitiator = initiator.getSecrets(m0, m1)
|
||||||
var csecResponder = responder.getSecrets(m0, m1).expect("secrets")
|
var csecResponder = responder.getSecrets(m0, m1)
|
||||||
check:
|
check:
|
||||||
int(initiator.version) == 4
|
int(initiator.version) == 4
|
||||||
int(responder.version) == 4
|
int(responder.version) == 4
|
||||||
|
@ -439,8 +439,8 @@ suite "Ethereum P2P handshake test suite":
|
||||||
responder.ackMessage(rng[], m1, k1).expect("ack success")
|
responder.ackMessage(rng[], m1, k1).expect("ack success")
|
||||||
m1.setLen(k1)
|
m1.setLen(k1)
|
||||||
initiator.decodeAckMessage(m1).expect("decode success")
|
initiator.decodeAckMessage(m1).expect("decode success")
|
||||||
var csecInitiator = initiator.getSecrets(m0, m1).expect("secrets")
|
var csecInitiator = initiator.getSecrets(m0, m1)
|
||||||
var csecResponder = responder.getSecrets(m0, m1).expect("secrets")
|
var csecResponder = responder.getSecrets(m0, m1)
|
||||||
check:
|
check:
|
||||||
csecInitiator.aesKey == csecResponder.aesKey
|
csecInitiator.aesKey == csecResponder.aesKey
|
||||||
csecInitiator.macKey == csecResponder.macKey
|
csecInitiator.macKey == csecResponder.macKey
|
||||||
|
@ -461,8 +461,8 @@ suite "Ethereum P2P handshake test suite":
|
||||||
m1.setLen(k1)
|
m1.setLen(k1)
|
||||||
initiator.decodeAckMessage(m1).expect("ack success")
|
initiator.decodeAckMessage(m1).expect("ack success")
|
||||||
|
|
||||||
var csecInitiator = initiator.getSecrets(m0, m1).expect("secrets")
|
var csecInitiator = initiator.getSecrets(m0, m1)
|
||||||
var csecResponder = responder.getSecrets(m0, m1).expect("secrets")
|
var csecResponder = responder.getSecrets(m0, m1)
|
||||||
check:
|
check:
|
||||||
csecInitiator.aesKey == csecResponder.aesKey
|
csecInitiator.aesKey == csecResponder.aesKey
|
||||||
csecInitiator.macKey == csecResponder.macKey
|
csecInitiator.macKey == csecResponder.macKey
|
||||||
|
|
|
@ -118,8 +118,8 @@ suite "Ethereum RLPx encryption/decryption test suite":
|
||||||
responder.decodeAuthMessage(authm).expect("success")
|
responder.decodeAuthMessage(authm).expect("success")
|
||||||
initiator.decodeAckMessage(ackm).expect("success")
|
initiator.decodeAckMessage(ackm).expect("success")
|
||||||
|
|
||||||
var csecInitiator = initiator.getSecrets(authm, ackm)[]
|
var csecInitiator = initiator.getSecrets(authm, ackm)
|
||||||
var csecResponder = responder.getSecrets(authm, ackm)[]
|
var csecResponder = responder.getSecrets(authm, ackm)
|
||||||
initSecretState(csecInitiator, stateInitiator0)
|
initSecretState(csecInitiator, stateInitiator0)
|
||||||
initSecretState(csecResponder, stateResponder0)
|
initSecretState(csecResponder, stateResponder0)
|
||||||
initSecretState(csecInitiator, stateInitiator1)
|
initSecretState(csecInitiator, stateInitiator1)
|
||||||
|
@ -184,8 +184,8 @@ suite "Ethereum RLPx encryption/decryption test suite":
|
||||||
m1.setLen(k1)
|
m1.setLen(k1)
|
||||||
check initiator.decodeAckMessage(m1).isOk
|
check initiator.decodeAckMessage(m1).isOk
|
||||||
|
|
||||||
var csecInitiator = initiator.getSecrets(m0, m1)[]
|
var csecInitiator = initiator.getSecrets(m0, m1)
|
||||||
var csecResponder = responder.getSecrets(m0, m1)[]
|
var csecResponder = responder.getSecrets(m0, m1)
|
||||||
var stateInitiator: SecretState
|
var stateInitiator: SecretState
|
||||||
var stateResponder: SecretState
|
var stateResponder: SecretState
|
||||||
var iheader, rheader: array[16, byte]
|
var iheader, rheader: array[16, byte]
|
||||||
|
|
Loading…
Reference in New Issue