2023-03-02 11:41:41 +01:00
|
|
|
|
{.used.}
|
|
|
|
|
|
|
2024-03-16 00:08:47 +01:00
|
|
|
|
import std/sequtils, stew/byteutils, stew/endians2, testutils/unittests
|
2024-07-06 03:33:38 +05:30
|
|
|
|
import waku/waku_core, ../testlib/wakucore
|
2023-03-02 11:41:41 +01:00
|
|
|
|
|
|
|
|
|
|
suite "Waku Message - Deterministic hashing":
|
|
|
|
|
|
test "digest computation - empty meta field":
|
|
|
|
|
|
## Test vector:
|
|
|
|
|
|
##
|
2024-07-09 18:36:12 +03:00
|
|
|
|
## pubsub_topic = 2f77616b752f322f72732f302f30
|
2023-03-02 11:41:41 +01:00
|
|
|
|
## waku_message.payload = 0x010203045445535405060708
|
|
|
|
|
|
## waku_message.content_topic = 0x2f77616b752f322f64656661756c742d636f6e74656e742f70726f746f
|
|
|
|
|
|
## waku_message.meta = <empty>
|
2023-11-22 15:23:43 +01:00
|
|
|
|
## waku_message.ts = 0x175789bfa23f8400
|
2023-03-02 11:41:41 +01:00
|
|
|
|
##
|
2024-07-09 18:36:12 +03:00
|
|
|
|
## message_hash = 0xcccab07fed94181c83937c8ca8340c9108492b7ede354a6d95421ad34141fd37
|
2023-03-02 11:41:41 +01:00
|
|
|
|
|
|
|
|
|
|
## Given
|
2024-07-09 18:36:12 +03:00
|
|
|
|
let pubsubTopic = DefaultPubsubTopic # /waku/2/rs/0/0
|
2023-03-02 11:41:41 +01:00
|
|
|
|
let message = fakeWakuMessage(
|
2024-03-16 00:08:47 +01:00
|
|
|
|
contentTopic = DefaultContentTopic, # /waku/2/default-content/proto
|
|
|
|
|
|
payload = "\x01\x02\x03\x04TEST\x05\x06\x07\x08".toBytes(),
|
|
|
|
|
|
meta = newSeq[byte](),
|
|
|
|
|
|
ts = getNanosecondTime(1681964442), # Apr 20 2023 04:20:42
|
|
|
|
|
|
)
|
2023-03-02 11:41:41 +01:00
|
|
|
|
|
|
|
|
|
|
## When
|
2023-11-22 17:32:56 +01:00
|
|
|
|
let messageHash = computeMessageHash(pubsubTopic, message)
|
2023-03-02 11:41:41 +01:00
|
|
|
|
|
|
|
|
|
|
## Then
|
|
|
|
|
|
check:
|
2024-07-09 18:36:12 +03:00
|
|
|
|
byteutils.toHex(pubsubTopic.toBytes()) == "2f77616b752f322f72732f302f30"
|
2024-03-16 00:08:47 +01:00
|
|
|
|
byteutils.toHex(message.contentTopic.toBytes()) ==
|
|
|
|
|
|
"2f77616b752f322f64656661756c742d636f6e74656e742f70726f746f"
|
2023-03-30 10:38:45 +02:00
|
|
|
|
byteutils.toHex(message.payload) == "010203045445535405060708"
|
|
|
|
|
|
byteutils.toHex(message.meta) == ""
|
2023-11-22 15:23:43 +01:00
|
|
|
|
byteutils.toHex(toBytesBE(uint64(message.timestamp))) == "175789bfa23f8400"
|
2024-03-16 00:08:47 +01:00
|
|
|
|
messageHash.toHex() ==
|
2024-07-09 18:36:12 +03:00
|
|
|
|
"cccab07fed94181c83937c8ca8340c9108492b7ede354a6d95421ad34141fd37"
|
2023-03-02 11:41:41 +01:00
|
|
|
|
|
|
|
|
|
|
test "digest computation - meta field (12 bytes)":
|
|
|
|
|
|
## Test vector:
|
|
|
|
|
|
##
|
2024-07-09 18:36:12 +03:00
|
|
|
|
## pubsub_topic = 0x2f77616b752f322f72732f302f30
|
2023-03-02 11:41:41 +01:00
|
|
|
|
## waku_message.payload = 0x010203045445535405060708
|
|
|
|
|
|
## waku_message.content_topic = 0x2f77616b752f322f64656661756c742d636f6e74656e742f70726f746f
|
|
|
|
|
|
## waku_message.meta = 0x73757065722d736563726574
|
2023-11-22 15:23:43 +01:00
|
|
|
|
## waku_message.ts = 0x175789bfa23f8400
|
2023-03-02 11:41:41 +01:00
|
|
|
|
##
|
2024-07-09 18:36:12 +03:00
|
|
|
|
## message_hash = 0xb9b4852f9d8c489846e8bfc6c5ca6a1a8d460a40d28832a966e029eb39619199
|
2023-03-02 11:41:41 +01:00
|
|
|
|
|
|
|
|
|
|
## Given
|
2024-07-09 18:36:12 +03:00
|
|
|
|
let pubsubTopic = DefaultPubsubTopic # /waku/2/rs/0/0
|
2023-03-02 11:41:41 +01:00
|
|
|
|
let message = fakeWakuMessage(
|
2024-03-16 00:08:47 +01:00
|
|
|
|
contentTopic = DefaultContentTopic, # /waku/2/default-content/proto
|
|
|
|
|
|
payload = "\x01\x02\x03\x04TEST\x05\x06\x07\x08".toBytes(),
|
|
|
|
|
|
meta = "\x73\x75\x70\x65\x72\x2d\x73\x65\x63\x72\x65\x74".toBytes(),
|
|
|
|
|
|
ts = getNanosecondTime(1681964442), # Apr 20 2023 04:20:42
|
|
|
|
|
|
)
|
2023-03-02 11:41:41 +01:00
|
|
|
|
|
|
|
|
|
|
## When
|
2023-11-22 17:32:56 +01:00
|
|
|
|
let messageHash = computeMessageHash(pubsubTopic, message)
|
2023-03-02 11:41:41 +01:00
|
|
|
|
|
|
|
|
|
|
## Then
|
|
|
|
|
|
check:
|
2024-07-09 18:36:12 +03:00
|
|
|
|
byteutils.toHex(pubsubTopic.toBytes()) == "2f77616b752f322f72732f302f30"
|
2024-03-16 00:08:47 +01:00
|
|
|
|
byteutils.toHex(message.contentTopic.toBytes()) ==
|
|
|
|
|
|
"2f77616b752f322f64656661756c742d636f6e74656e742f70726f746f"
|
2023-03-30 10:38:45 +02:00
|
|
|
|
byteutils.toHex(message.payload) == "010203045445535405060708"
|
|
|
|
|
|
byteutils.toHex(message.meta) == "73757065722d736563726574"
|
2023-11-22 15:23:43 +01:00
|
|
|
|
byteutils.toHex(toBytesBE(uint64(message.timestamp))) == "175789bfa23f8400"
|
2024-03-16 00:08:47 +01:00
|
|
|
|
messageHash.toHex() ==
|
2024-07-09 18:36:12 +03:00
|
|
|
|
"b9b4852f9d8c489846e8bfc6c5ca6a1a8d460a40d28832a966e029eb39619199"
|
2023-03-02 11:41:41 +01:00
|
|
|
|
|
2023-03-30 10:38:45 +02:00
|
|
|
|
test "digest computation - meta field (64 bytes)":
|
|
|
|
|
|
## Test vector:
|
|
|
|
|
|
##
|
2024-07-09 18:36:12 +03:00
|
|
|
|
## pubsub_topic = 0x2f77616b752f322f72732f302f30
|
2023-03-30 10:38:45 +02:00
|
|
|
|
## waku_message.payload = 0x010203045445535405060708
|
|
|
|
|
|
## waku_message.content_topic = 0x2f77616b752f322f64656661756c742d636f6e74656e742f70726f746f
|
|
|
|
|
|
## waku_message.meta = 0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f
|
2023-11-22 15:23:43 +01:00
|
|
|
|
## waku_message.ts = 0x175789bfa23f8400
|
2023-03-30 10:38:45 +02:00
|
|
|
|
##
|
2024-07-09 18:36:12 +03:00
|
|
|
|
## message_hash = 0x653460d04f66c5b11814d235152f4f246e6f03ef80a305a825913636fbafd0ba
|
2023-03-30 10:38:45 +02:00
|
|
|
|
|
|
|
|
|
|
## Given
|
2024-07-09 18:36:12 +03:00
|
|
|
|
let pubsubTopic = DefaultPubsubTopic # /waku/2/rs/0/0
|
2023-03-30 10:38:45 +02:00
|
|
|
|
let message = fakeWakuMessage(
|
2024-03-16 00:08:47 +01:00
|
|
|
|
contentTopic = DefaultContentTopic, # /waku/2/default-content/proto
|
2023-03-30 10:38:45 +02:00
|
|
|
|
payload = "\x01\x02\x03\x04TEST\x05\x06\x07\x08".toBytes(),
|
2024-03-16 00:08:47 +01:00
|
|
|
|
meta = toSeq(0.byte .. 63.byte),
|
|
|
|
|
|
ts = getNanosecondTime(1681964442), # Apr 20 2023 04:20:42
|
2023-03-30 10:38:45 +02:00
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
## When
|
2023-11-22 17:32:56 +01:00
|
|
|
|
let messageHash = computeMessageHash(pubsubTopic, message)
|
2023-03-30 10:38:45 +02:00
|
|
|
|
|
|
|
|
|
|
## Then
|
|
|
|
|
|
check:
|
2024-07-09 18:36:12 +03:00
|
|
|
|
byteutils.toHex(pubsubTopic.toBytes()) == "2f77616b752f322f72732f302f30"
|
2024-03-16 00:08:47 +01:00
|
|
|
|
byteutils.toHex(message.contentTopic.toBytes()) ==
|
|
|
|
|
|
"2f77616b752f322f64656661756c742d636f6e74656e742f70726f746f"
|
2023-03-30 10:38:45 +02:00
|
|
|
|
byteutils.toHex(message.payload) == "010203045445535405060708"
|
2024-03-16 00:08:47 +01:00
|
|
|
|
byteutils.toHex(message.meta) ==
|
|
|
|
|
|
"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f"
|
2023-11-22 15:23:43 +01:00
|
|
|
|
byteutils.toHex(toBytesBE(uint64(message.timestamp))) == "175789bfa23f8400"
|
2024-03-16 00:08:47 +01:00
|
|
|
|
messageHash.toHex() ==
|
2024-07-09 18:36:12 +03:00
|
|
|
|
"653460d04f66c5b11814d235152f4f246e6f03ef80a305a825913636fbafd0ba"
|
2023-03-30 10:38:45 +02:00
|
|
|
|
|
2023-03-02 11:41:41 +01:00
|
|
|
|
test "digest computation - zero length payload":
|
|
|
|
|
|
## Test vector:
|
|
|
|
|
|
##
|
2024-07-09 18:36:12 +03:00
|
|
|
|
## pubsub_topic = 0x2f77616b752f322f72732f302f30
|
2023-03-02 11:41:41 +01:00
|
|
|
|
## waku_message.payload = []
|
|
|
|
|
|
## waku_message.content_topic = 0x2f77616b752f322f64656661756c742d636f6e74656e742f70726f746f
|
|
|
|
|
|
## waku_message.meta = 0x73757065722d736563726574
|
2023-11-22 15:23:43 +01:00
|
|
|
|
## waku_message.ts = 0x175789bfa23f8400
|
2023-03-02 11:41:41 +01:00
|
|
|
|
##
|
2024-07-09 18:36:12 +03:00
|
|
|
|
## message_hash = 0x0f6448cc23b2db6c696aa6ab4b693eff4cf3549ff346fe1dbeb281697396a09f
|
2023-03-02 11:41:41 +01:00
|
|
|
|
|
|
|
|
|
|
## Given
|
2024-07-09 18:36:12 +03:00
|
|
|
|
let pubsubTopic = DefaultPubsubTopic # /waku/2/rs/0/0
|
2023-03-02 11:41:41 +01:00
|
|
|
|
let message = fakeWakuMessage(
|
2024-03-16 00:08:47 +01:00
|
|
|
|
contentTopic = DefaultContentTopic, # /waku/2/default-content/proto
|
|
|
|
|
|
payload = newSeq[byte](),
|
|
|
|
|
|
meta = "\x73\x75\x70\x65\x72\x2d\x73\x65\x63\x72\x65\x74".toBytes(),
|
|
|
|
|
|
ts = getNanosecondTime(1681964442), # Apr 20 2023 04:20:42
|
|
|
|
|
|
)
|
2023-03-02 11:41:41 +01:00
|
|
|
|
|
|
|
|
|
|
## When
|
2023-11-22 17:32:56 +01:00
|
|
|
|
let messageHash = computeMessageHash(pubsubTopic, message)
|
2023-03-02 11:41:41 +01:00
|
|
|
|
|
|
|
|
|
|
## Then
|
|
|
|
|
|
check:
|
2024-03-16 00:08:47 +01:00
|
|
|
|
messageHash.toHex() ==
|
2024-07-09 18:36:12 +03:00
|
|
|
|
"0f6448cc23b2db6c696aa6ab4b693eff4cf3549ff346fe1dbeb281697396a09f"
|
2023-03-30 10:38:45 +02:00
|
|
|
|
|
|
|
|
|
|
test "waku message - check meta size is enforced":
|
|
|
|
|
|
# create message with meta size > 64 bytes (invalid)
|
|
|
|
|
|
let message = fakeWakuMessage(
|
|
|
|
|
|
contentTopic = DefaultContentTopic,
|
|
|
|
|
|
payload = "\x01\x02\x03\x04TEST\x05\x06\x07\x08".toBytes(),
|
2024-03-16 00:08:47 +01:00
|
|
|
|
meta = toSeq(0.byte .. 66.byte), # 67 bytes
|
2023-03-30 10:38:45 +02:00
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
let encodedInvalidMsg = message.encode
|
|
|
|
|
|
let decoded = WakuMessage.decode(encodedInvalidMsg.buffer)
|
|
|
|
|
|
|
|
|
|
|
|
check:
|
|
|
|
|
|
decoded.isErr == true
|
|
|
|
|
|
$decoded.error == "(kind: InvalidLengthField, field: \"meta\")"
|