Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(jsonrpc): use padded-base64 for payload encoding #1572

Merged
merged 1 commit into from
Feb 23, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 40 additions & 0 deletions tests/common/test_base64_codec.nim
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@

{.used.}

import
stew/[results, byteutils],
testutils/unittests
import
../../waku/common/base64


suite "Waku Common - stew base64 wrapper":

test "encode into base64 (with padding)":
## Given
# From RFC 4648 test vectors: https://www.rfc-editor.org/rfc/rfc4648#page-12
let data = "fooba"

## When
let encoded = base64.encode(data)

## Then
check:
encoded == Base64String("Zm9vYmE=")


test "decode from base64 (with padding)":
## Given
# From RFC 4648 test vectors: https://www.rfc-editor.org/rfc/rfc4648#page-12
let data = Base64String("Zm9vYg==")

## When
let decodedRes = base64.decode(data)

## Then
check:
decodedRes.isOk()

let decoded = decodedRes.tryGet()
check:
decoded == toBytes("foob")
8 changes: 4 additions & 4 deletions tests/v2/wakunode_jsonrpc/test_jsonrpc_relay.nim
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ suite "Waku v2 JSON-RPC API - Relay":

## When
let rpcMessage = WakuMessageRPC(
payload: Base64String.encode(message.payload),
payload: base64.encode(message.payload),
contentTopic: some(message.contentTopic),
timestamp: some(message.timestamp),
version: some(message.version)
Expand Down Expand Up @@ -201,7 +201,7 @@ suite "Waku v2 JSON-RPC API - Relay":
## Then
check:
dstMessages.len == 4
dstMessages[2].payload == Base64String.encode(messages[2].payload)
dstMessages[2].payload == base64.encode(messages[2].payload)
dstMessages[2].contentTopic.get() == messages[2].contentTopic
dstMessages[2].timestamp.get() == messages[2].timestamp
dstMessages[2].version.get() == messages[2].version
Expand Down Expand Up @@ -264,7 +264,7 @@ suite "Waku v2 JSON-RPC API - Relay (Private)":
## Given
let
payload = @[byte 38]
payloadBase64 = Base64String.encode(payload)
payloadBase64 = base64.encode(payload)

let message = WakuMessageRPC(
payload: payloadBase64,
Expand Down Expand Up @@ -353,7 +353,7 @@ suite "Waku v2 JSON-RPC API - Relay (Private)":
## Given
let
payload = @[byte 38]
payloadBase64 = Base64String.encode(payload)
payloadBase64 = base64.encode(payload)

let message = WakuMessageRPC(
payload: payloadBase64,
Expand Down
6 changes: 3 additions & 3 deletions tests/v2/wakunode_rest/test_rest_relay.nim
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@ import
presto, presto/client as presto_client,
libp2p/crypto/crypto
import
../../waku/common/base64,
../../waku/v2/node/waku_node,
../../waku/v2/node/rest/server,
../../waku/v2/node/rest/client,
../../waku/v2/node/rest/base64,
../../waku/v2/node/rest/responses,
../../waku/v2/node/rest/relay/types,
../../waku/v2/node/rest/relay/handlers as relay_api,
Expand Down Expand Up @@ -163,7 +163,7 @@ suite "Waku v2 Rest API - Relay":
$response.contentType == $MIMETYPE_JSON
response.data.len == 3
response.data.all do (msg: RelayWakuMessage) -> bool:
msg.payload == Base64String.encode("TEST-1") and
msg.payload == base64.encode("TEST-1") and
msg.contentTopic.get().string == "content-topic-x" and
msg.version.get() == 2 and
msg.timestamp.get() != Timestamp(0)
Expand Down Expand Up @@ -210,7 +210,7 @@ suite "Waku v2 Rest API - Relay":
discard await client.relayPostSubscriptionsV1(newTopics)

let response = await client.relayPostMessagesV1(DefaultPubsubTopic, RelayWakuMessage(
payload: Base64String.encode("TEST-PAYLOAD"),
payload: base64.encode("TEST-PAYLOAD"),
contentTopic: some(DefaultContentTopic),
timestamp: some(int64(2022))
))
Expand Down
6 changes: 3 additions & 3 deletions tests/v2/wakunode_rest/test_rest_relay_serdes.nim
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ import
unittest2,
json_serialization
import
../../waku/common/base64,
../../waku/v2/node/rest/serdes,
../../waku/v2/node/rest/base64,
../../waku/v2/node/rest/relay/types,
../../waku/v2/protocol/waku_message

Expand All @@ -18,7 +18,7 @@ suite "Waku v2 Rest API - Relay - serialization":
suite "RelayWakuMessage - decode":
test "optional fields are not provided":
# Given
let payload = Base64String.encode("MESSAGE")
let payload = base64.encode("MESSAGE")
let jsonBytes = toBytes("{\"payload\":\"" & $payload & "\"}")

# When
Expand All @@ -36,7 +36,7 @@ suite "Waku v2 Rest API - Relay - serialization":
suite "RelayWakuMessage - encode":
test "optional fields are none":
# Given
let payload = Base64String.encode("MESSAGE")
let payload = base64.encode("MESSAGE")
let data = RelayWakuMessage(
payload: payload,
contentTopic: none(ContentTopic),
Expand Down
33 changes: 22 additions & 11 deletions waku/common/base64.nim
Original file line number Diff line number Diff line change
Expand Up @@ -9,19 +9,30 @@ import stew/[results, byteutils, base64]
type Base64String* = distinct string


proc encode*(t: type Base64String, value: string|seq[byte]): Base64String =
let val = block:
when value is string:
toBytes(value)
else:
value
Base64String(base64.encode(Base64, val))
proc encode*[T: byte|char](value: openArray[T]): Base64String =
Base64String(encode(Base64Pad, value))

proc encode*(value: string): Base64String =
encode(toBytes(value))


proc decode[T: byte|char](btype: typedesc[Base64Types],
instr: openArray[T]): Result[seq[byte], string] =
## Decode BASE64 string ``instr`` and return sequence of bytes as result.
if len(instr) == 0:
return ok(newSeq[byte]())

var bufferLen = decodedLength(btype, len(instr))
var buffer = newSeq[byte](bufferLen)

if decode(btype, instr, buffer, bufferLen) != Base64Status.Success:
return err("Incorrect base64 string")

buffer.setLen(bufferLen)
ok(buffer)

proc decode*(t: Base64String): Result[seq[byte], string] =
try:
ok(base64.decode(Base64, string(t)))
except:
err("decoding failed: " & getCurrentExceptionMsg())
decode(Base64Pad, string(t))


proc `$`*(t: Base64String): string {.inline.}=
Expand Down
2 changes: 1 addition & 1 deletion waku/v2/node/jsonrpc/message.nim
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ type

func toWakuMessageRPC*(msg: WakuMessage): WakuMessageRPC =
WakuMessageRPC(
payload: Base64String.encode(msg.payload),
payload: base64.encode(msg.payload),
contentTopic: some(msg.contentTopic),
version: some(msg.version),
timestamp: some(msg.timestamp),
Expand Down
2 changes: 1 addition & 1 deletion waku/v2/node/jsonrpc/relay/handlers.nim
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ proc toWakuMessageRPC(message: WakuMessage,
keyInfo = keyInfo(symkey, privateKey)
decoded = decodePayload(message, keyInfo)

WakuMessageRPC(payload: Base64String.encode(decoded.get().payload),
WakuMessageRPC(payload: base64.encode(decoded.get().payload),
contentTopic: some(message.contentTopic),
version: some(message.version),
timestamp: some(message.timestamp))
Expand Down
5 changes: 0 additions & 5 deletions waku/v2/node/rest/base64.nim

This file was deleted.

6 changes: 3 additions & 3 deletions waku/v2/node/rest/relay/types.nim
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,9 @@ import
json_serialization/std/options,
presto/[route, client, common]
import
../../../../common/base64,
../../../protocol/waku_message,
../serdes,
../base64
../serdes


#### Types
Expand All @@ -37,7 +37,7 @@ type

proc toRelayWakuMessage*(msg: WakuMessage): RelayWakuMessage =
RelayWakuMessage(
payload: base64.encode(Base64String, msg.payload),
payload: base64.encode(msg.payload),
contentTopic: some(msg.contentTopic),
version: some(Natural(msg.version)),
timestamp: some(msg.timestamp)
Expand Down