mirror of
https://github.com/logos-storage/logos-storage-nim-dht.git
synced 2026-07-02 21:59:52 +00:00
Update libp2p version
This commit is contained in:
parent
d02670d6b0
commit
1cef2da817
@ -13,7 +13,12 @@ requires "nimcrypto >= 0.6.2 & < 0.8.0"
|
||||
requires "bearssl >= 0.2.5 & < 0.3.0"
|
||||
requires "chronicles >= 0.11.2 & < 0.13.0"
|
||||
requires "chronos >= 4.0.4 & < 4.4.0"
|
||||
requires "libp2p >= 1.14.1 & < 2.0.0"
|
||||
# Pinned to this commit: logos-storage-nim needs the autonat fix it contains
|
||||
# (autonatv2 failed dial not reachable), only available on libp2p master.
|
||||
requires "libp2p#10caf815ee85b90acd88f81b6a0f4d093d718d40"
|
||||
# libp2p 2.0.0 multiaddress now uses protobuf_serialization; not auto-pathed as
|
||||
# a transitive dep, so declare it explicitly.
|
||||
requires "protobuf_serialization >= 0.4.0"
|
||||
requires "metrics >= 0.1.0 & < 0.2.0"
|
||||
requires "stew >= 0.4.2"
|
||||
requires "stint >= 0.8.1 & < 0.9.0"
|
||||
|
||||
@ -211,14 +211,14 @@ proc encodeStaticHeader*(flag: Flag, nonce: AESGCMNonce, authSize: int):
|
||||
# TODO: assert on authSize of > 2^16?
|
||||
result.add((uint16(authSize)).toBytesBE())
|
||||
|
||||
proc encodeMessagePacket*(rng: var HmacDrbgContext, c: var Codec,
|
||||
proc encodeMessagePacket*(rng: Rng, c: var Codec,
|
||||
toId: NodeId, toAddr: Address, message: openArray[byte]):
|
||||
(seq[byte], AESGCMNonce, bool) =
|
||||
var nonce: AESGCMNonce
|
||||
var haskey: bool
|
||||
hmacDrbgGenerate(rng, nonce) # Random AESGCM nonce
|
||||
rng.generate(nonce) # Random AESGCM nonce
|
||||
var iv: array[ivSize, byte]
|
||||
hmacDrbgGenerate(rng, iv) # Random IV
|
||||
rng.generate(iv) # Random IV
|
||||
|
||||
# static-header
|
||||
let authdata = c.localNode.id.toByteArrayBE()
|
||||
@ -246,7 +246,7 @@ proc encodeMessagePacket*(rng: var HmacDrbgContext, c: var Codec,
|
||||
# case this must not look like a random packet.
|
||||
haskey = false
|
||||
var randomData: array[gcmTagSize + 4, byte]
|
||||
hmacDrbgGenerate(rng, randomData)
|
||||
rng.generate(randomData)
|
||||
messageEncrypted.add(randomData)
|
||||
dht_session_lru_cache_misses.inc()
|
||||
|
||||
@ -259,11 +259,11 @@ proc encodeMessagePacket*(rng: var HmacDrbgContext, c: var Codec,
|
||||
|
||||
return (packet, nonce, haskey)
|
||||
|
||||
proc encodeWhoareyouPacket*(rng: var HmacDrbgContext, c: var Codec,
|
||||
proc encodeWhoareyouPacket*(rng: Rng, c: var Codec,
|
||||
toId: NodeId, toAddr: Address, requestNonce: AESGCMNonce, recordSeq: uint64,
|
||||
pubkey: Option[PublicKey]): seq[byte] =
|
||||
var idNonce: IdNonce
|
||||
hmacDrbgGenerate(rng, idNonce)
|
||||
rng.generate(idNonce)
|
||||
|
||||
# authdata
|
||||
var authdata: seq[byte]
|
||||
@ -280,7 +280,7 @@ proc encodeWhoareyouPacket*(rng: var HmacDrbgContext, c: var Codec,
|
||||
header.add(authdata)
|
||||
|
||||
var iv: array[ivSize, byte]
|
||||
hmacDrbgGenerate(rng, iv) # Random IV
|
||||
rng.generate(iv) # Random IV
|
||||
|
||||
let maskedHeader = encryptHeader(toId, iv, header)
|
||||
|
||||
@ -301,14 +301,14 @@ proc encodeWhoareyouPacket*(rng: var HmacDrbgContext, c: var Codec,
|
||||
|
||||
return packet
|
||||
|
||||
proc encodeHandshakePacket*(rng: var HmacDrbgContext, c: var Codec,
|
||||
proc encodeHandshakePacket*(rng: Rng, c: var Codec,
|
||||
toId: NodeId, toAddr: Address, message: openArray[byte],
|
||||
whoareyouData: WhoareyouData, pubkey: PublicKey): EncodeResult[seq[byte]] =
|
||||
var header: seq[byte]
|
||||
var nonce: AESGCMNonce
|
||||
hmacDrbgGenerate(rng, nonce)
|
||||
rng.generate(nonce)
|
||||
var iv: array[ivSize, byte]
|
||||
hmacDrbgGenerate(rng, iv) # Random IV
|
||||
rng.generate(iv) # Random IV
|
||||
|
||||
var authdata: seq[byte]
|
||||
var authdataHead: seq[byte]
|
||||
|
||||
@ -19,6 +19,8 @@ import
|
||||
./node,
|
||||
../../../../dht/providers_messages
|
||||
|
||||
from libp2p/crypto/crypto import Rng, generate
|
||||
|
||||
export providers_messages
|
||||
|
||||
type
|
||||
@ -131,7 +133,7 @@ template messageKind*(T: typedesc[SomeMessage]): MessageKind =
|
||||
proc hash*(reqId: RequestId): Hash =
|
||||
hash(reqId.id)
|
||||
|
||||
proc init*(T: type RequestId, rng: var HmacDrbgContext): T =
|
||||
proc init*(T: type RequestId, rng: Rng): T =
|
||||
var reqId = RequestId(id: newSeq[byte](8)) # RequestId must be <= 8 bytes
|
||||
hmacDrbgGenerate(rng, reqId.id)
|
||||
rng.generate(reqId.id)
|
||||
reqId
|
||||
|
||||
@ -17,6 +17,8 @@ import
|
||||
./crypto,
|
||||
./spr
|
||||
|
||||
from libp2p/crypto/crypto import Rng, generate
|
||||
|
||||
export stint
|
||||
|
||||
const
|
||||
@ -132,9 +134,9 @@ func `==`*(a, b: Node): bool =
|
||||
func hash*(id: NodeId): Hash =
|
||||
hash(id.toByteArrayBE)
|
||||
|
||||
proc random*(T: type NodeId, rng: var HmacDrbgContext): T =
|
||||
proc random*(T: type NodeId, rng: Rng): T =
|
||||
var id: NodeId
|
||||
hmacDrbgGenerate(rng, addr id, csize_t(sizeof(id)))
|
||||
rng.generate(id)
|
||||
|
||||
id
|
||||
|
||||
|
||||
@ -98,6 +98,8 @@ import "."/[
|
||||
|
||||
import nimcrypto except toHex
|
||||
|
||||
from libp2p/crypto/crypto import Rng
|
||||
|
||||
export options, results, node, spr, providers
|
||||
|
||||
declareCounter dht_message_requests_outgoing,
|
||||
@ -177,7 +179,7 @@ type
|
||||
ipVote: IpVote
|
||||
enrAutoUpdate: bool
|
||||
talkProtocols*: Table[seq[byte], TalkProtocol] # TODO: Table is a bit of
|
||||
rng*: ref HmacDrbgContext
|
||||
rng*: Rng
|
||||
providers: ProvidersManager
|
||||
clientMode*: bool
|
||||
|
||||
@ -483,7 +485,7 @@ proc sendRequest*[T: SomeMessage](d: Protocol, toNode: Node, m: T,
|
||||
|
||||
proc waitResponse*[T: SomeMessage](d: Protocol, node: Node, msg: T):
|
||||
Future[Option[Message]] =
|
||||
let reqId = RequestId.init(d.rng[])
|
||||
let reqId = RequestId.init(d.rng)
|
||||
result = d.waitMessage(node, reqId)
|
||||
sendRequest(d, node, msg, reqId)
|
||||
|
||||
@ -500,7 +502,7 @@ proc waitMessage(d: Protocol, fromNode: Node, reqId: RequestId, timeout = Respon
|
||||
|
||||
proc waitNodeResponses*[T: SomeMessage](d: Protocol, node: Node, msg: T):
|
||||
Future[DiscResult[seq[SignedPeerRecord]]] =
|
||||
let reqId = RequestId.init(d.rng[])
|
||||
let reqId = RequestId.init(d.rng)
|
||||
result = d.waitNodes(node, reqId)
|
||||
sendRequest(d, node, msg, reqId)
|
||||
|
||||
@ -742,7 +744,7 @@ proc addProvider*(
|
||||
res.add(d.localNode)
|
||||
for toNode in res:
|
||||
if toNode != d.localNode:
|
||||
let reqId = RequestId.init(d.rng[])
|
||||
let reqId = RequestId.init(d.rng)
|
||||
d.sendRequest(toNode, AddProviderMessage(cId: cId, prov: pr), reqId)
|
||||
else:
|
||||
asyncSpawn d.addProviderLocal(cId, pr)
|
||||
@ -886,7 +888,7 @@ proc query*(d: Protocol, target: NodeId, k = BUCKET_SIZE): Future[seq[Node]]
|
||||
|
||||
proc queryRandom*(d: Protocol): Future[seq[Node]] =
|
||||
## Perform a query for a random target, return all nodes discovered.
|
||||
d.query(NodeId.random(d.rng[]))
|
||||
d.query(NodeId.random(d.rng))
|
||||
|
||||
proc queryRandom*(d: Protocol, enrField: (string, seq[byte])):
|
||||
Future[seq[Node]] {.async.} =
|
||||
@ -978,7 +980,7 @@ proc revalidateLoop(d: Protocol) {.async.} =
|
||||
## message.
|
||||
try:
|
||||
while true:
|
||||
let revalidateTimeout = RevalidateMin + d.rng[].rand(RevalidateMax - RevalidateMin)
|
||||
let revalidateTimeout = RevalidateMin + d.rng.rand(RevalidateMax - RevalidateMin)
|
||||
await sleepAsync(milliseconds(revalidateTimeout))
|
||||
let n = d.routingTable.nodeToRevalidate()
|
||||
if not n.isNil:
|
||||
|
||||
@ -10,7 +10,7 @@
|
||||
import std/sequtils
|
||||
|
||||
import pkg/chronicles
|
||||
import pkg/libp2p
|
||||
import pkg/libp2p/[peerid, routing_record]
|
||||
import pkg/questionable
|
||||
|
||||
import ../node
|
||||
|
||||
@ -11,7 +11,7 @@ import std/sequtils
|
||||
import std/strutils
|
||||
|
||||
import pkg/chronos
|
||||
import pkg/libp2p
|
||||
import pkg/libp2p/[peerid, routing_record]
|
||||
import pkg/datastore
|
||||
import pkg/questionable
|
||||
import pkg/questionable/results
|
||||
|
||||
@ -13,7 +13,7 @@ from std/times import now, utc, toTime, toUnix
|
||||
|
||||
import pkg/stew/endians2
|
||||
import pkg/chronos
|
||||
import pkg/libp2p
|
||||
import pkg/libp2p/[peerid, routing_record]
|
||||
import pkg/datastore
|
||||
import pkg/chronicles
|
||||
import pkg/questionable
|
||||
|
||||
@ -12,9 +12,8 @@ from std/times import now, utc, toTime, toUnix
|
||||
import pkg/stew/endians2
|
||||
import pkg/datastore
|
||||
import pkg/chronos
|
||||
import pkg/libp2p
|
||||
import pkg/libp2p/[peerid, routing_record]
|
||||
import pkg/chronicles
|
||||
import pkg/stew/byteutils
|
||||
import pkg/questionable
|
||||
import pkg/questionable/results
|
||||
|
||||
|
||||
@ -1,22 +1,17 @@
|
||||
import bearssl/rand
|
||||
from libp2p/crypto/crypto import Rng, generate
|
||||
|
||||
## Random helpers: similar as in stdlib, but with HmacDrbgContext rng
|
||||
## Random helpers: similar as in stdlib, but with libp2p Rng
|
||||
# TODO: Move these somewhere else?
|
||||
const randMax = 18_446_744_073_709_551_615'u64
|
||||
|
||||
proc rand*(rng: var HmacDrbgContext, max: Natural): int =
|
||||
proc rand*(rng: Rng, max: Natural): int =
|
||||
if max == 0: return 0
|
||||
|
||||
var x: uint64
|
||||
while true:
|
||||
hmacDrbgGenerate(rng, addr x, csize_t(sizeof(x)))
|
||||
rng.generate(x)
|
||||
if x < randMax - (randMax mod (uint64(max) + 1'u64)): # against modulo bias
|
||||
return int(x mod (uint64(max) + 1'u64))
|
||||
|
||||
proc sample*[T](rng: var HmacDrbgContext, a: openArray[T]): T =
|
||||
proc sample*[T](rng: Rng, a: openArray[T]): T =
|
||||
result = a[rng.rand(a.high)]
|
||||
|
||||
proc shuffle*[T](rng: var HmacDrbgContext, a: var openArray[T]) =
|
||||
for i in countdown(a.high, 1):
|
||||
let j = rng.rand(i)
|
||||
swap(a[i], a[j])
|
||||
|
||||
@ -12,6 +12,8 @@ import
|
||||
stint, chronicles, metrics, bearssl/rand, chronos,
|
||||
"."/[node, random2, spr]
|
||||
|
||||
from libp2p/crypto/crypto import Rng, shuffle
|
||||
|
||||
export options
|
||||
|
||||
declarePublicGauge dht_routing_table_nodes,
|
||||
@ -51,7 +53,7 @@ type
|
||||
ipLimits: IpLimits ## IP limits for total routing table: all buckets and
|
||||
## replacement caches.
|
||||
distanceCalculator: DistanceCalculator
|
||||
rng: ref HmacDrbgContext
|
||||
rng: Rng
|
||||
|
||||
KBucket = ref object
|
||||
istart, iend: NodeId ## Range of NodeIds this KBucket covers. This is not a
|
||||
@ -289,7 +291,7 @@ proc getDepth*(b: KBucket) : int =
|
||||
computeSharedPrefixBits(@[b.istart, b.iend])
|
||||
|
||||
proc init*(T: type RoutingTable, localNode: Node, bitsPerHop = DefaultBitsPerHop,
|
||||
ipLimits = DefaultTableIpLimits, rng: ref HmacDrbgContext,
|
||||
ipLimits = DefaultTableIpLimits, rng: Rng,
|
||||
distanceCalculator = XorDistanceCalculator): T =
|
||||
## Initialize the routing table for provided `Node` and bitsPerHop value.
|
||||
## `bitsPerHop` is default set to 5 as recommended by original Kademlia paper.
|
||||
@ -553,7 +555,7 @@ proc nodeToRevalidate*(r: RoutingTable): Node =
|
||||
## Return a node to revalidate. The least recently seen node from a random
|
||||
## bucket is selected.
|
||||
var buckets = r.buckets
|
||||
r.rng[].shuffle(buckets)
|
||||
r.rng.shuffle(buckets)
|
||||
# TODO: Should we prioritize less-recently-updated buckets instead? Could
|
||||
# store a `now` Moment at setJustSeen or at revalidate per bucket.
|
||||
for b in buckets:
|
||||
@ -586,9 +588,9 @@ proc randomNodes*(r: RoutingTable, maxAmount: int,
|
||||
# already.
|
||||
# We check against the number of nodes to avoid an infinite loop in case of a filter.
|
||||
while len(result) < maxAmount and len(seen) < sz:
|
||||
let bucket = r.rng[].sample(r.buckets)
|
||||
let bucket = r.rng.sample(r.buckets)
|
||||
if bucket.nodes.len != 0:
|
||||
let node = r.rng[].sample(bucket.nodes)
|
||||
let node = r.rng.sample(bucket.nodes)
|
||||
if node notin seen:
|
||||
seen.incl(node)
|
||||
if pred.isNil() or node.pred:
|
||||
|
||||
@ -41,7 +41,7 @@ type
|
||||
keyexchangeInProgress: HashSet[NodeId]
|
||||
pendingRequestsByNode: Table[NodeId, seq[seq[byte]]]
|
||||
codec*: Codec
|
||||
rng: ref HmacDrbgContext
|
||||
rng: Rng
|
||||
|
||||
PendingRequest = object
|
||||
node: Node
|
||||
@ -76,7 +76,7 @@ proc send(t: Transport, n: Node, data: seq[byte]) =
|
||||
t.sendToA(n.address.get(), data)
|
||||
|
||||
proc sendMessage*(t: Transport, toId: NodeId, toAddr: Address, message: seq[byte]) =
|
||||
let (data, _, _) = encodeMessagePacket(t.rng[], t.codec, toId, toAddr,
|
||||
let (data, _, _) = encodeMessagePacket(t.rng, t.codec, toId, toAddr,
|
||||
message)
|
||||
t.sendToA(toAddr, data)
|
||||
|
||||
@ -94,7 +94,7 @@ proc registerRequest(t: Transport, n: Node, message: seq[byte],
|
||||
proc sendMessage*(t: Transport, toNode: Node, message: seq[byte]) =
|
||||
doAssert(toNode.address.isSome())
|
||||
let address = toNode.address.get()
|
||||
let (data, nonce, haskey) = encodeMessagePacket(t.rng[], t.codec,
|
||||
let (data, nonce, haskey) = encodeMessagePacket(t.rng, t.codec,
|
||||
toNode.id, address, message)
|
||||
|
||||
if haskey:
|
||||
@ -129,7 +129,7 @@ proc sendWhoareyou(t: Transport, toId: NodeId, a: Address,
|
||||
pubkey = if node.isSome(): some(node.get().pubkey)
|
||||
else: none(PublicKey)
|
||||
|
||||
let data = encodeWhoareyouPacket(t.rng[], t.codec, toId, a, requestNonce,
|
||||
let data = encodeWhoareyouPacket(t.rng, t.codec, toId, a, requestNonce,
|
||||
recordSeq, pubkey)
|
||||
sleepAsync(handshakeTimeout).addCallback() do(data: pointer):
|
||||
# handshake key is popped in decodeHandshakePacket. if not yet popped by timeout:
|
||||
@ -151,7 +151,7 @@ proc sendPending(t:Transport, toNode: Node):
|
||||
for message in t.pendingRequestsByNode[toNode.id]:
|
||||
trace "Sending pending packet", myport = t.bindAddress.port, dstId = toNode.id
|
||||
let address = toNode.address.get()
|
||||
let (data, nonce, haskey) = encodeMessagePacket(t.rng[], t.codec, toNode.id, address, message)
|
||||
let (data, nonce, haskey) = encodeMessagePacket(t.rng, t.codec, toNode.id, address, message)
|
||||
t.registerRequest(toNode, message, nonce)
|
||||
t.send(toNode, data)
|
||||
t.pendingRequestsByNode.del(toNode.id)
|
||||
@ -197,7 +197,7 @@ proc receive*(t: Transport, a: Address, packet: openArray[byte]) =
|
||||
doAssert(toNode.address.isSome())
|
||||
let address = toNode.address.get()
|
||||
let data = encodeHandshakePacket(
|
||||
t.rng[],
|
||||
t.rng,
|
||||
t.codec,
|
||||
toNode.id,
|
||||
address,
|
||||
|
||||
@ -10,17 +10,17 @@ import
|
||||
proc localAddress*(port: int): Address =
|
||||
Address(ip: IPv4_loopback(), port: Port(port))
|
||||
|
||||
proc example*(T: type PrivateKey, rng: ref HmacDrbgContext): PrivateKey =
|
||||
PrivateKey.random(PKScheme.Secp256k1, rng[]).expect("Valid rng for private key")
|
||||
proc example*(T: type PrivateKey, rng: Rng): PrivateKey =
|
||||
PrivateKey.random(PKScheme.Secp256k1, rng).expect("Valid rng for private key")
|
||||
|
||||
proc example*(T: type NodeId, rng: ref HmacDrbgContext): NodeId =
|
||||
proc example*(T: type NodeId, rng: Rng): NodeId =
|
||||
let
|
||||
privKey = PrivateKey.example(rng)
|
||||
pubKey = privKey.getPublicKey.expect("Valid private key for public key")
|
||||
pubKey.toNodeId().expect("Public key valid for node id")
|
||||
|
||||
proc initDiscoveryNode*(
|
||||
rng: ref HmacDrbgContext,
|
||||
rng: Rng,
|
||||
privKey: PrivateKey,
|
||||
address: Address,
|
||||
bootstrapRecords: openArray[SignedPeerRecord] = [],
|
||||
@ -59,7 +59,7 @@ proc generateNode*(privKey: PrivateKey, port: int,
|
||||
.expect("Properly intialized private key")
|
||||
result = newNode(spr).expect("Properly initialized node")
|
||||
|
||||
proc generateNRandomNodes*(rng: ref HmacDrbgContext, n: int): seq[Node] =
|
||||
proc generateNRandomNodes*(rng: Rng, n: int): seq[Node] =
|
||||
var res = newSeq[Node]()
|
||||
for i in 1..n:
|
||||
let
|
||||
@ -68,7 +68,7 @@ proc generateNRandomNodes*(rng: ref HmacDrbgContext, n: int): seq[Node] =
|
||||
res.add(node)
|
||||
res
|
||||
|
||||
proc nodeAndPrivKeyAtDistance*(n: Node, rng: var HmacDrbgContext, d: uint32,
|
||||
proc nodeAndPrivKeyAtDistance*(n: Node, rng: Rng, d: uint32,
|
||||
ip: IpAddress = parseIpAddress("127.0.0.1")): (Node, PrivateKey) =
|
||||
while true:
|
||||
let
|
||||
@ -77,19 +77,19 @@ proc nodeAndPrivKeyAtDistance*(n: Node, rng: var HmacDrbgContext, d: uint32,
|
||||
if logDistance(n.id, node.id) == d:
|
||||
return (node, privKey)
|
||||
|
||||
proc nodeAtDistance*(n: Node, rng: var HmacDrbgContext, d: uint32,
|
||||
proc nodeAtDistance*(n: Node, rng: Rng, d: uint32,
|
||||
ip: IpAddress = parseIpAddress("127.0.0.1")): Node =
|
||||
let (node, _) = n.nodeAndPrivKeyAtDistance(rng, d, ip)
|
||||
node
|
||||
|
||||
proc nodesAtDistance*(
|
||||
n: Node, rng: var HmacDrbgContext, d: uint32, amount: int,
|
||||
n: Node, rng: Rng, d: uint32, amount: int,
|
||||
ip: IpAddress = parseIpAddress("127.0.0.1")): seq[Node] =
|
||||
for i in 0..<amount:
|
||||
result.add(nodeAtDistance(n, rng, d, ip))
|
||||
|
||||
proc nodesAtDistanceUniqueIp*(
|
||||
n: Node, rng: var HmacDrbgContext, d: uint32, amount: int,
|
||||
n: Node, rng: Rng, d: uint32, amount: int,
|
||||
ip: IpAddress = parseIpAddress("127.0.0.1")): seq[Node] =
|
||||
var ta = initTAddress(ip, Port(0))
|
||||
for i in 0..<amount:
|
||||
|
||||
@ -4,7 +4,7 @@ import std/sequtils
|
||||
import pkg/chronos
|
||||
import pkg/asynctest/chronos/unittest
|
||||
import pkg/datastore
|
||||
from pkg/libp2p import PeerId
|
||||
from pkg/libp2p/peerid import PeerId
|
||||
|
||||
import codexdht/private/eth/p2p/discoveryv5/spr
|
||||
import codexdht/private/eth/p2p/discoveryv5/providers
|
||||
|
||||
@ -66,7 +66,7 @@ proc bootstrapNetwork(
|
||||
# suite "Providers Tests":
|
||||
suite "Providers Tests: node alone":
|
||||
var
|
||||
rng: ref HmacDrbgContext
|
||||
rng: Rng
|
||||
nodes: seq[(discv5_protocol.Protocol, PrivateKey)]
|
||||
targetId: NodeId
|
||||
node0: discv5_protocol.Protocol
|
||||
@ -125,7 +125,7 @@ suite "Providers Tests: node alone":
|
||||
suite "Providers Tests: two nodes":
|
||||
|
||||
var
|
||||
rng: ref HmacDrbgContext
|
||||
rng: Rng
|
||||
nodes: seq[(discv5_protocol.Protocol, PrivateKey)]
|
||||
targetId: NodeId
|
||||
node0: discv5_protocol.Protocol
|
||||
@ -174,7 +174,7 @@ suite "Providers Tests: two nodes":
|
||||
suite "Providers Tests: 20 nodes":
|
||||
|
||||
var
|
||||
rng: ref HmacDrbgContext
|
||||
rng: Rng
|
||||
nodes: seq[(discv5_protocol.Protocol, PrivateKey)]
|
||||
targetId: NodeId
|
||||
node0: discv5_protocol.Protocol
|
||||
|
||||
@ -11,7 +11,7 @@ import
|
||||
../dht/test_helper
|
||||
|
||||
suite "Discovery v5 Tests":
|
||||
var rng: ref HmacDrbgContext
|
||||
var rng: Rng
|
||||
|
||||
setup:
|
||||
rng = newRng()
|
||||
@ -201,7 +201,7 @@ suite "Discovery v5 Tests":
|
||||
testNode = initDiscoveryNode(rng, testNodeKey, localAddress(20302))
|
||||
# logarithmic distance between mainNode and testNode is 256
|
||||
|
||||
let nodes = nodesAtDistance(mainNode.localNode, rng[], dist, 10)
|
||||
let nodes = nodesAtDistance(mainNode.localNode, rng, dist, 10)
|
||||
for n in nodes:
|
||||
discard mainNode.addSeenNode(n) # for testing only!
|
||||
|
||||
@ -245,7 +245,7 @@ suite "Discovery v5 Tests":
|
||||
check discovered.isOk
|
||||
check discovered[].len == 0
|
||||
|
||||
let moreNodes = nodesAtDistance(mainNode.localNode, rng[], dist, 10)
|
||||
let moreNodes = nodesAtDistance(mainNode.localNode, rng, dist, 10)
|
||||
for n in moreNodes:
|
||||
discard mainNode.addSeenNode(n) # for testing only!
|
||||
|
||||
@ -638,7 +638,7 @@ suite "Discovery v5 Tests":
|
||||
sendNode = newNode(enrRec).expect("Properly initialized record")
|
||||
var codec = Codec(localNode: sendNode, privKey: privKey, sessions: Sessions.init(5))
|
||||
|
||||
let (packet, _, _) = encodeMessagePacket(rng[], codec,
|
||||
let (packet, _, _) = encodeMessagePacket(rng, codec,
|
||||
receiveNode.localNode.id, receiveNode.localNode.address.get(), @[])
|
||||
receiveNode.transport.receive(a, packet)
|
||||
|
||||
@ -668,7 +668,7 @@ suite "Discovery v5 Tests":
|
||||
var codec = Codec(localNode: sendNode, privKey: privKey, sessions: Sessions.init(5))
|
||||
for i in 0 ..< 5:
|
||||
let a = localAddress(20303 + i)
|
||||
let (packet, _, _) = encodeMessagePacket(rng[], codec,
|
||||
let (packet, _, _) = encodeMessagePacket(rng, codec,
|
||||
receiveNode.localNode.id, receiveNode.localNode.address.get(), @[])
|
||||
receiveNode.transport.receive(a, packet)
|
||||
|
||||
@ -700,7 +700,7 @@ suite "Discovery v5 Tests":
|
||||
|
||||
var firstRequestNonce: AESGCMNonce
|
||||
for i in 0 ..< 5:
|
||||
let (packet, requestNonce, _) = encodeMessagePacket(rng[], codec,
|
||||
let (packet, requestNonce, _) = encodeMessagePacket(rng, codec,
|
||||
receiveNode.localNode.id, receiveNode.localNode.address.get(), @[])
|
||||
receiveNode.transport.receive(a, packet)
|
||||
if i == 0:
|
||||
|
||||
@ -500,7 +500,7 @@ suite "Discovery v5.1 Additional Encode/Decode":
|
||||
|
||||
test "Encrypt / Decrypt header":
|
||||
var nonce: AESGCMNonce
|
||||
hmacDrbgGenerate(rng[], nonce)
|
||||
rng.generate(nonce)
|
||||
let
|
||||
nodeId = NodeId.example(rng)
|
||||
authdata = newSeq[byte](32)
|
||||
@ -509,7 +509,7 @@ suite "Discovery v5.1 Additional Encode/Decode":
|
||||
header = staticHeader & authdata
|
||||
|
||||
var iv: array[128 div 8, byte]
|
||||
hmacDrbgGenerate(rng[], iv)
|
||||
rng.generate(iv)
|
||||
|
||||
let
|
||||
encrypted = encryptHeader(nodeId, iv, header)
|
||||
@ -543,10 +543,10 @@ suite "Discovery v5.1 Additional Encode/Decode":
|
||||
test "Encode / Decode Ordinary Random Message Packet":
|
||||
let
|
||||
m = PingMessage(sprSeq: 0)
|
||||
reqId = RequestId.init(rng[])
|
||||
reqId = RequestId.init(rng)
|
||||
message = encodeMessage(m, reqId)
|
||||
|
||||
let (data, nonce, _) = encodeMessagePacket(rng[], codecA, nodeB.id,
|
||||
let (data, nonce, _) = encodeMessagePacket(rng, codecA, nodeB.id,
|
||||
nodeB.address.get(), message)
|
||||
|
||||
let decoded = codecB.decodePacket(nodeA.address.get(), data)
|
||||
@ -558,10 +558,10 @@ suite "Discovery v5.1 Additional Encode/Decode":
|
||||
|
||||
test "Encode / Decode Whoareyou Packet":
|
||||
var requestNonce: AESGCMNonce
|
||||
hmacDrbgGenerate(rng[], requestNonce)
|
||||
rng.generate(requestNonce)
|
||||
let recordSeq = 0'u64
|
||||
|
||||
let data = encodeWhoareyouPacket(rng[], codecA, nodeB.id,
|
||||
let data = encodeWhoareyouPacket(rng, codecA, nodeB.id,
|
||||
nodeB.address.get(), requestNonce, recordSeq, none(PublicKey))
|
||||
|
||||
let decoded = codecB.decodePacket(nodeA.address.get(), data)
|
||||
@ -579,11 +579,11 @@ suite "Discovery v5.1 Additional Encode/Decode":
|
||||
|
||||
test "Encode / Decode Handshake Message Packet":
|
||||
var requestNonce: AESGCMNonce
|
||||
hmacDrbgGenerate(rng[], requestNonce)
|
||||
rng.generate(requestNonce)
|
||||
let
|
||||
recordSeq = 1'u64
|
||||
m = PingMessage(sprSeq: 0)
|
||||
reqId = RequestId.init(rng[])
|
||||
reqId = RequestId.init(rng)
|
||||
message = encodeMessage(m, reqId)
|
||||
pubkey = privKeyA.getPublicKey
|
||||
.expect("Valid private key for public key")
|
||||
@ -593,13 +593,13 @@ suite "Discovery v5.1 Additional Encode/Decode":
|
||||
# whoareyou data returned. It's either that or construct the header for the
|
||||
# whoareyouData manually.
|
||||
let
|
||||
encodedDummy = encodeWhoareyouPacket(rng[], codecB, nodeA.id,
|
||||
encodedDummy = encodeWhoareyouPacket(rng, codecB, nodeA.id,
|
||||
nodeA.address.get(), requestNonce, recordSeq, pubkey)
|
||||
decodedDummy = codecA.decodePacket(nodeB.address.get(), encodedDummy)
|
||||
|
||||
let
|
||||
pubKeyB = privKeyB.getPublicKey.expect("Valid private key for public key")
|
||||
data = encodeHandshakePacket(rng[], codecA, nodeB.id,
|
||||
data = encodeHandshakePacket(rng, codecA, nodeB.id,
|
||||
nodeB.address.get(), message, decodedDummy[].whoareyou,
|
||||
pubKeyB
|
||||
).expect("Valid handshake packet data")
|
||||
@ -615,11 +615,11 @@ suite "Discovery v5.1 Additional Encode/Decode":
|
||||
|
||||
test "Encode / Decode Handshake Message Packet with SPR":
|
||||
var requestNonce: AESGCMNonce
|
||||
hmacDrbgGenerate(rng[], requestNonce)
|
||||
rng.generate(requestNonce)
|
||||
let
|
||||
recordSeq = 0'u64
|
||||
m = PingMessage(sprSeq: 0)
|
||||
reqId = RequestId.init(rng[])
|
||||
reqId = RequestId.init(rng)
|
||||
message = encodeMessage(m, reqId)
|
||||
pubkey = none(PublicKey)
|
||||
|
||||
@ -627,13 +627,13 @@ suite "Discovery v5.1 Additional Encode/Decode":
|
||||
# whoareyou data returned. It's either that or construct the header for the
|
||||
# whoareyouData manually.
|
||||
let
|
||||
encodedDummy = encodeWhoareyouPacket(rng[], codecB, nodeA.id,
|
||||
encodedDummy = encodeWhoareyouPacket(rng, codecB, nodeA.id,
|
||||
nodeA.address.get(), requestNonce, recordSeq, pubkey)
|
||||
decodedDummy = codecA.decodePacket(nodeB.address.get(), encodedDummy)
|
||||
|
||||
let
|
||||
pubKeyB = privKeyB.getPublicKey.expect("Valid private key for public key")
|
||||
encoded = encodeHandshakePacket(rng[], codecA, nodeB.id,
|
||||
encoded = encodeHandshakePacket(rng, codecA, nodeB.id,
|
||||
nodeB.address.get(), message, decodedDummy[].whoareyou,
|
||||
pubKeyB
|
||||
).expect("Valid handshake packet data")
|
||||
@ -651,7 +651,7 @@ suite "Discovery v5.1 Additional Encode/Decode":
|
||||
test "Encode / Decode Ordinary Message Packet":
|
||||
let
|
||||
m = PingMessage(sprSeq: 0)
|
||||
reqId = RequestId.init(rng[])
|
||||
reqId = RequestId.init(rng)
|
||||
message = encodeMessage(m, reqId)
|
||||
|
||||
# Need to manually add the secrets that normally get negotiated in the
|
||||
@ -662,7 +662,7 @@ suite "Discovery v5.1 Additional Encode/Decode":
|
||||
codecB.sessions.store(nodeA.id, nodeA.address.get(), secrets.initiatorKey,
|
||||
secrets.recipientKey)
|
||||
|
||||
let (data, nonce, _) = encodeMessagePacket(rng[], codecA, nodeB.id,
|
||||
let (data, nonce, _) = encodeMessagePacket(rng, codecA, nodeB.id,
|
||||
nodeB.address.get(), message)
|
||||
|
||||
let decoded = codecB.decodePacket(nodeA.address.get(), data)
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user