diff --git a/tests/v2/test_waku_filter.nim b/tests/v2/test_waku_filter.nim index 28e658485..f20329d3d 100644 --- a/tests/v2/test_waku_filter.nim +++ b/tests/v2/test_waku_filter.nim @@ -37,7 +37,7 @@ procSuite "Waku Filter": completionFut.complete(true) let - proto = WakuFilter.init(dialSwitch, handle) + proto = WakuFilter.init(dialSwitch, crypto.newRng(), handle) rpc = FilterRequest(contentFilter: @[ContentFilter(topics: @["pew", "pew2"])], topic: "topic") dialSwitch.mount(proto) @@ -46,7 +46,7 @@ procSuite "Waku Filter": discard let - proto2 = WakuFilter.init(listenSwitch, emptyHandle) + proto2 = WakuFilter.init(listenSwitch, crypto.newRng(), emptyHandle) subscription = proto2.subscription() var subscriptions = newTable[string, MessageNotificationSubscription]() diff --git a/tests/v2/test_waku_store.nim b/tests/v2/test_waku_store.nim index 2d4e4f911..2c4603059 100644 --- a/tests/v2/test_waku_store.nim +++ b/tests/v2/test_waku_store.nim @@ -30,7 +30,7 @@ procSuite "Waku Store": discard await listenSwitch.start() let - proto = WakuStore.init(dialSwitch) + proto = WakuStore.init(dialSwitch, crypto.newRng()) subscription = proto.subscription() rpc = HistoryQuery(topics: @["topic"]) diff --git a/waku/node/v2/waku_types.nim b/waku/node/v2/waku_types.nim index ba42d05a8..3f2024a7f 100644 --- a/waku/node/v2/waku_types.nim +++ b/waku/node/v2/waku_types.nim @@ -4,14 +4,13 @@ import std/tables, - chronos, - random, + chronos, bearssl, stew/byteutils, libp2p/[switch, peerinfo, multiaddress, crypto/crypto], libp2p/protobuf/minprotobuf, libp2p/protocols/protocol, libp2p/switch, libp2p/stream/connection, - libp2p/protocols/pubsub/[pubsub, floodsub, gossipsub] + libp2p/protocols/pubsub/[pubsub, gossipsub] # Common data types ----------------------------------------------------------- @@ -63,6 +62,7 @@ type WakuStore* = ref object of LPProtocol switch*: Switch + rng*: ref BrHmacDrbgContext peers*: seq[HistoryPeer] messages*: seq[WakuMessage] @@ -86,6 +86,7 @@ type MessagePushHandler* = proc(msg: MessagePush): Future[void] {.gcsafe, closure.} WakuFilter* = ref object of LPProtocol + rng*: ref BrHmacDrbgContext switch*: Switch subscribers*: seq[Subscriber] pushHandler*: MessagePushHandler @@ -102,6 +103,7 @@ type messages*: seq[(Topic, WakuMessage)] filters*: Filters subscriptions*: MessageNotificationSubscriptions + rng*: ref BrHmacDrbgContext WakuRelay* = ref object of GossipSub gossipEnabled*: bool @@ -131,6 +133,7 @@ proc notify*(filters: Filters, msg: WakuMessage) = if msg.contentTopic in filter.contentFilter.topics: filter.handler(msg.payload) -proc generateRequestId*(): string = - for _ in .. 10: - add(result, char(rand(int('A') .. int('z')))) \ No newline at end of file +proc generateRequestId*(rng: ref BrHmacDrbgContext): string = + var bytes: array[10, byte] + brHmacDrbgGenerate(rng[], bytes) + toHex(bytes) diff --git a/waku/node/v2/wakunode2.nim b/waku/node/v2/wakunode2.nim index 1f798a18e..dba05af6b 100644 --- a/waku/node/v2/wakunode2.nim +++ b/waku/node/v2/wakunode2.nim @@ -84,7 +84,8 @@ proc init*(T: type WakuNode, nodeKey: crypto.PrivateKey, switch.mount(wakuRelay) result = WakuNode( - switch: switch, + switch: switch, + rng: crypto.newRng(), peerInfo: peerInfo, wakuRelay: wakuRelay, subscriptions: newTable[string, MessageNotificationSubscription]() @@ -103,14 +104,14 @@ proc start*(node: WakuNode) {.async.} = # NOTE WakuRelay is being instantiated as part of initing node - node.wakuStore = WakuStore.init(node.switch) + node.wakuStore = WakuStore.init(node.switch, node.rng) node.switch.mount(node.wakuStore) node.subscriptions.subscribe(WakuStoreCodec, node.wakuStore.subscription()) proc pushHandler(msg: MessagePush) {.async, gcsafe.} = info "push received" - node.wakuFilter = WakuFilter.init(node.switch, pushHandler) + node.wakuFilter = WakuFilter.init(node.switch, node.rng, pushHandler) node.switch.mount(node.wakuFilter) node.subscriptions.subscribe(WakuFilterCodec, node.wakuFilter.subscription()) diff --git a/waku/protocol/v2/waku_filter.nim b/waku/protocol/v2/waku_filter.nim index 2292b33af..537fa9b20 100644 --- a/waku/protocol/v2/waku_filter.nim +++ b/waku/protocol/v2/waku_filter.nim @@ -1,5 +1,6 @@ import std/tables, + bearssl, chronos, chronicles, metrics, stew/results, libp2p/protocols/pubsub/pubsubpeer, libp2p/protocols/pubsub/floodsub, @@ -7,6 +8,7 @@ import libp2p/protocols/protocol, libp2p/protobuf/minprotobuf, libp2p/stream/connection, + libp2p/crypto/crypto, libp2p/switch, ./message_notifier, ./../../node/v2/waku_types @@ -114,8 +116,9 @@ method init*(wf: WakuFilter) = wf.handler = handle wf.codec = WakuFilterCodec -proc init*(T: type WakuFilter, switch: Switch, handler: MessagePushHandler): T = +proc init*(T: type WakuFilter, switch: Switch, rng: ref BrHmacDrbgContext, handler: MessagePushHandler): T = new result + result.rng = crypto.newRng() result.switch = switch result.pushHandler = handler result.init() @@ -139,4 +142,4 @@ proc subscription*(proto: WakuFilter): MessageNotificationSubscription = proc subscribe*(wf: WakuFilter, peer: PeerInfo, request: FilterRequest) {.async, gcsafe.} = let conn = await wf.switch.dial(peer.peerId, peer.addrs, WakuFilterCodec) - await conn.writeLP(FilterRPC(requestId: generateRequestId(), request: request).encode().buffer) + await conn.writeLP(FilterRPC(requestId: generateRequestId(wf.rng), request: request).encode().buffer) diff --git a/waku/protocol/v2/waku_relay.nim b/waku/protocol/v2/waku_relay.nim index 11676a567..ebadf22b2 100644 --- a/waku/protocol/v2/waku_relay.nim +++ b/waku/protocol/v2/waku_relay.nim @@ -4,7 +4,6 @@ ## Instead, it should likely be on top of GossipSub with a similar interface. import - std/strutils, chronos, chronicles, metrics, libp2p/protocols/pubsub/[pubsub, floodsub, gossipsub], libp2p/protocols/pubsub/rpc/messages, diff --git a/waku/protocol/v2/waku_store.nim b/waku/protocol/v2/waku_store.nim index c8989189f..68247b7a6 100644 --- a/waku/protocol/v2/waku_store.nim +++ b/waku/protocol/v2/waku_store.nim @@ -1,7 +1,9 @@ import std/tables, + bearssl, chronos, chronicles, metrics, stew/results, libp2p/switch, + libp2p/crypto/crypto, libp2p/protocols/protocol, libp2p/protobuf/minprotobuf, libp2p/stream/connection, @@ -97,8 +99,9 @@ method init*(ws: WakuStore) = ws.handler = handle ws.codec = WakuStoreCodec -proc init*(T: type WakuStore, switch: Switch): T = +proc init*(T: type WakuStore, switch: Switch, rng: ref BrHmacDrbgContext): T = new result + result.rng = rng result.switch = switch result.init() @@ -127,7 +130,7 @@ proc query*(w: WakuStore, query: HistoryQuery, handler: QueryHandlerFunc) {.asyn let peer = w.peers[0] let conn = await w.switch.dial(peer.peerInfo.peerId, peer.peerInfo.addrs, WakuStoreCodec) - await conn.writeLP(HistoryRPC(requestId: "foo", query: query).encode().buffer) + await conn.writeLP(HistoryRPC(requestId: generateRequestId(w.rng), query: query).encode().buffer) var message = await conn.readLp(64*1024) let response = HistoryRPC.init(message)