2022-02-04 14:12:00 +11:00
|
|
|
import { expect } from "chai";
|
|
|
|
|
import debug from "debug";
|
2021-07-09 10:07:39 +10:00
|
|
|
|
|
|
|
|
import {
|
|
|
|
|
makeLogFileName,
|
|
|
|
|
NOISE_KEY_1,
|
2022-04-01 12:19:51 +11:00
|
|
|
Nwaku,
|
2021-07-09 10:07:39 +10:00
|
|
|
WakuRelayMessage,
|
2022-02-04 14:12:00 +11:00
|
|
|
} from "../../test_utils";
|
2022-02-11 17:27:15 +11:00
|
|
|
import { delay } from "../../test_utils/delay";
|
2022-03-25 16:20:14 +11:00
|
|
|
import { bytesToHex, bytesToUtf8, hexToBytes, utf8ToBytes } from "../utils";
|
2022-02-04 14:12:00 +11:00
|
|
|
import { Protocols, Waku } from "../waku";
|
2021-03-12 14:23:21 +11:00
|
|
|
|
2021-08-30 20:41:18 +10:00
|
|
|
import {
|
|
|
|
|
generatePrivateKey,
|
|
|
|
|
generateSymmetricKey,
|
|
|
|
|
getPublicKey,
|
2022-02-04 14:12:00 +11:00
|
|
|
} from "./version_1";
|
2021-07-07 11:23:56 +10:00
|
|
|
|
2022-03-06 23:20:59 +11:00
|
|
|
import { DecryptionMethod, WakuMessage } from "./index";
|
2021-07-09 10:07:39 +10:00
|
|
|
|
2022-02-04 14:12:00 +11:00
|
|
|
const dbg = debug("waku:test:message");
|
2021-03-10 16:22:49 +11:00
|
|
|
|
2022-02-04 14:12:00 +11:00
|
|
|
const TestContentTopic = "/test/1/waku-message/utf8";
|
2021-07-28 11:19:24 +10:00
|
|
|
|
2022-02-04 14:12:00 +11:00
|
|
|
describe("Waku Message [node only]", function () {
|
2022-04-01 12:19:51 +11:00
|
|
|
describe("Interop: nwaku", function () {
|
2021-07-14 21:25:13 +10:00
|
|
|
let waku: Waku;
|
2022-04-01 12:19:51 +11:00
|
|
|
let nwaku: Nwaku;
|
2021-07-14 21:25:13 +10:00
|
|
|
|
|
|
|
|
beforeEach(async function () {
|
|
|
|
|
this.timeout(30_000);
|
|
|
|
|
waku = await Waku.create({
|
|
|
|
|
staticNoiseKey: NOISE_KEY_1,
|
|
|
|
|
});
|
|
|
|
|
|
2022-04-01 12:19:51 +11:00
|
|
|
nwaku = new Nwaku(makeLogFileName(this));
|
|
|
|
|
dbg("Starting nwaku node");
|
|
|
|
|
await nwaku.start({ rpcPrivate: true });
|
2022-01-20 13:00:58 +11:00
|
|
|
|
2022-04-01 12:19:51 +11:00
|
|
|
dbg("Dialing to nwaku node");
|
|
|
|
|
await waku.dial(await nwaku.getMultiaddrWithId());
|
2022-02-04 14:12:00 +11:00
|
|
|
dbg("Wait for remote peer");
|
2022-02-01 12:54:54 +11:00
|
|
|
await waku.waitForRemotePeer([Protocols.Relay]);
|
2022-02-04 14:12:00 +11:00
|
|
|
dbg("Remote peer ready");
|
2022-04-01 12:19:51 +11:00
|
|
|
// As this test uses the nwaku RPC API, we somehow often face
|
|
|
|
|
// Race conditions where the nwaku node does not have the js-waku
|
2022-02-01 12:54:54 +11:00
|
|
|
// Node in its relay mesh just yet.
|
|
|
|
|
await delay(500);
|
2021-07-14 21:25:13 +10:00
|
|
|
});
|
2021-07-07 11:23:56 +10:00
|
|
|
|
2021-07-14 21:25:13 +10:00
|
|
|
afterEach(async function () {
|
2022-04-01 12:19:51 +11:00
|
|
|
!!nwaku && nwaku.stop();
|
2022-02-04 14:12:00 +11:00
|
|
|
!!waku && waku.stop().catch((e) => console.log("Waku failed to stop", e));
|
2021-07-14 21:25:13 +10:00
|
|
|
});
|
2021-07-07 11:23:56 +10:00
|
|
|
|
2022-04-01 12:19:51 +11:00
|
|
|
it("Decrypts nwaku message [asymmetric, no signature]", async function () {
|
2022-01-24 14:41:45 +11:00
|
|
|
this.timeout(5000);
|
2021-07-14 17:06:23 +10:00
|
|
|
|
2022-02-04 14:12:00 +11:00
|
|
|
const messageText = "Here is an encrypted message.";
|
2021-07-14 21:25:13 +10:00
|
|
|
const message: WakuRelayMessage = {
|
2021-07-28 11:19:24 +10:00
|
|
|
contentTopic: TestContentTopic,
|
2022-02-16 14:08:48 +11:00
|
|
|
payload: bytesToHex(utf8ToBytes(messageText)),
|
2021-07-14 21:25:13 +10:00
|
|
|
};
|
2021-07-14 17:06:23 +10:00
|
|
|
|
2021-07-14 21:25:13 +10:00
|
|
|
const privateKey = generatePrivateKey();
|
2021-07-14 17:06:23 +10:00
|
|
|
|
2022-03-06 23:20:59 +11:00
|
|
|
waku.relay.addDecryptionKey(privateKey, {
|
|
|
|
|
method: DecryptionMethod.Asymmetric,
|
|
|
|
|
});
|
2021-07-14 17:06:23 +10:00
|
|
|
|
2021-07-14 21:25:13 +10:00
|
|
|
const receivedMsgPromise: Promise<WakuMessage> = new Promise(
|
|
|
|
|
(resolve) => {
|
|
|
|
|
waku.relay.addObserver(resolve);
|
2021-07-14 17:06:23 +10:00
|
|
|
}
|
2021-07-14 21:25:13 +10:00
|
|
|
);
|
2021-07-09 10:07:39 +10:00
|
|
|
|
2021-07-14 21:25:13 +10:00
|
|
|
const publicKey = getPublicKey(privateKey);
|
2022-02-04 14:12:00 +11:00
|
|
|
dbg("Post message");
|
2022-04-01 12:19:51 +11:00
|
|
|
const res = await nwaku.postAsymmetricMessage(message, publicKey);
|
2022-01-20 13:00:58 +11:00
|
|
|
expect(res).to.be.true;
|
2021-07-09 10:07:39 +10:00
|
|
|
|
2021-07-14 21:25:13 +10:00
|
|
|
const receivedMsg = await receivedMsgPromise;
|
2021-07-09 10:07:39 +10:00
|
|
|
|
2021-07-14 21:25:13 +10:00
|
|
|
expect(receivedMsg.contentTopic).to.eq(message.contentTopic);
|
|
|
|
|
expect(receivedMsg.version).to.eq(1);
|
|
|
|
|
expect(receivedMsg.payloadAsUtf8).to.eq(messageText);
|
2021-07-09 10:07:39 +10:00
|
|
|
});
|
|
|
|
|
|
2022-04-01 12:19:51 +11:00
|
|
|
it("Encrypts message for nwaku [asymmetric, no signature]", async function () {
|
2021-07-14 21:25:13 +10:00
|
|
|
this.timeout(5000);
|
2021-07-09 10:07:39 +10:00
|
|
|
|
2022-04-01 12:19:51 +11:00
|
|
|
dbg("Ask nwaku to generate asymmetric key pair");
|
|
|
|
|
const keyPair = await nwaku.getAsymmetricKeyPair();
|
2022-02-14 10:50:02 +11:00
|
|
|
const privateKey = hexToBytes(keyPair.privateKey);
|
|
|
|
|
const publicKey = hexToBytes(keyPair.publicKey);
|
2021-07-09 10:07:39 +10:00
|
|
|
|
2022-02-04 14:12:00 +11:00
|
|
|
const messageText = "This is a message I am going to encrypt";
|
|
|
|
|
dbg("Encrypt message");
|
2021-07-28 11:19:24 +10:00
|
|
|
const message = await WakuMessage.fromUtf8String(
|
|
|
|
|
messageText,
|
|
|
|
|
TestContentTopic,
|
|
|
|
|
{
|
|
|
|
|
encPublicKey: publicKey,
|
|
|
|
|
}
|
|
|
|
|
);
|
2021-07-09 10:07:39 +10:00
|
|
|
|
2022-02-04 14:12:00 +11:00
|
|
|
dbg("Send message over relay");
|
2021-07-14 21:25:13 +10:00
|
|
|
await waku.relay.send(message);
|
2021-07-09 10:07:39 +10:00
|
|
|
|
2021-07-14 21:25:13 +10:00
|
|
|
let msgs: WakuRelayMessage[] = [];
|
2021-07-09 10:07:39 +10:00
|
|
|
|
2021-07-14 21:25:13 +10:00
|
|
|
while (msgs.length === 0) {
|
2022-04-01 12:19:51 +11:00
|
|
|
dbg("Wait for message to be seen by nwaku");
|
2021-07-14 21:25:13 +10:00
|
|
|
await delay(200);
|
2022-04-01 12:19:51 +11:00
|
|
|
msgs = await nwaku.getAsymmetricMessages(privateKey);
|
2021-07-14 21:25:13 +10:00
|
|
|
}
|
2021-07-09 10:07:39 +10:00
|
|
|
|
2022-02-04 14:12:00 +11:00
|
|
|
dbg("Check message content");
|
2021-07-14 21:25:13 +10:00
|
|
|
expect(msgs[0].contentTopic).to.equal(message.contentTopic);
|
2022-02-14 10:50:02 +11:00
|
|
|
expect(bytesToUtf8(hexToBytes(msgs[0].payload))).to.equal(messageText);
|
2021-07-09 10:07:39 +10:00
|
|
|
});
|
2021-07-15 12:12:43 +10:00
|
|
|
|
2022-04-01 12:19:51 +11:00
|
|
|
it("Decrypts nwaku message [symmetric, no signature]", async function () {
|
2022-01-24 14:41:45 +11:00
|
|
|
this.timeout(5000);
|
2021-07-15 12:12:43 +10:00
|
|
|
|
2022-02-04 14:12:00 +11:00
|
|
|
const messageText = "Here is a message encrypted in a symmetric manner.";
|
2021-07-15 12:12:43 +10:00
|
|
|
const message: WakuRelayMessage = {
|
2021-07-28 11:19:24 +10:00
|
|
|
contentTopic: TestContentTopic,
|
2022-02-16 14:08:48 +11:00
|
|
|
payload: bytesToHex(utf8ToBytes(messageText)),
|
2021-07-15 12:12:43 +10:00
|
|
|
};
|
|
|
|
|
|
2022-02-04 14:12:00 +11:00
|
|
|
dbg("Generate symmetric key");
|
2021-08-30 20:41:18 +10:00
|
|
|
const symKey = generateSymmetricKey();
|
2021-07-15 12:12:43 +10:00
|
|
|
|
2022-03-06 23:20:59 +11:00
|
|
|
waku.relay.addDecryptionKey(symKey, {
|
|
|
|
|
method: DecryptionMethod.Symmetric,
|
|
|
|
|
});
|
2021-07-15 12:12:43 +10:00
|
|
|
|
|
|
|
|
const receivedMsgPromise: Promise<WakuMessage> = new Promise(
|
|
|
|
|
(resolve) => {
|
|
|
|
|
waku.relay.addObserver(resolve);
|
|
|
|
|
}
|
|
|
|
|
);
|
|
|
|
|
|
2022-04-01 12:19:51 +11:00
|
|
|
dbg("Post message using nwaku");
|
|
|
|
|
await nwaku.postSymmetricMessage(message, symKey);
|
2022-02-04 14:12:00 +11:00
|
|
|
dbg("Wait for message to be received by js-waku");
|
2021-07-15 12:12:43 +10:00
|
|
|
const receivedMsg = await receivedMsgPromise;
|
2022-02-04 14:12:00 +11:00
|
|
|
dbg("Message received by js-waku");
|
2021-07-15 12:12:43 +10:00
|
|
|
|
|
|
|
|
expect(receivedMsg.contentTopic).to.eq(message.contentTopic);
|
|
|
|
|
expect(receivedMsg.version).to.eq(1);
|
|
|
|
|
expect(receivedMsg.payloadAsUtf8).to.eq(messageText);
|
|
|
|
|
});
|
|
|
|
|
|
2022-04-01 12:19:51 +11:00
|
|
|
it("Encrypts message for nwaku [symmetric, no signature]", async function () {
|
2021-07-15 12:12:43 +10:00
|
|
|
this.timeout(5000);
|
|
|
|
|
|
2022-04-01 12:19:51 +11:00
|
|
|
dbg("Getting symmetric key from nwaku");
|
|
|
|
|
const symKey = await nwaku.getSymmetricKey();
|
2022-02-04 14:12:00 +11:00
|
|
|
dbg("Encrypting message with js-waku");
|
2021-07-15 12:12:43 +10:00
|
|
|
const messageText =
|
2022-02-04 14:12:00 +11:00
|
|
|
"This is a message I am going to encrypt with a symmetric key";
|
2021-07-28 11:19:24 +10:00
|
|
|
const message = await WakuMessage.fromUtf8String(
|
|
|
|
|
messageText,
|
|
|
|
|
TestContentTopic,
|
|
|
|
|
{
|
|
|
|
|
symKey: symKey,
|
|
|
|
|
}
|
|
|
|
|
);
|
2022-02-04 14:12:00 +11:00
|
|
|
dbg("Sending message over relay");
|
2021-07-15 12:12:43 +10:00
|
|
|
await waku.relay.send(message);
|
|
|
|
|
|
|
|
|
|
let msgs: WakuRelayMessage[] = [];
|
|
|
|
|
|
|
|
|
|
while (msgs.length === 0) {
|
|
|
|
|
await delay(200);
|
2022-04-01 12:19:51 +11:00
|
|
|
dbg("Getting messages from nwaku");
|
|
|
|
|
msgs = await nwaku.getSymmetricMessages(symKey);
|
2021-07-15 12:12:43 +10:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
expect(msgs[0].contentTopic).to.equal(message.contentTopic);
|
2022-02-14 10:50:02 +11:00
|
|
|
expect(bytesToUtf8(hexToBytes(msgs[0].payload))).to.equal(messageText);
|
2021-07-15 12:12:43 +10:00
|
|
|
});
|
2021-07-09 10:37:29 +10:00
|
|
|
});
|
2021-07-09 10:07:39 +10:00
|
|
|
});
|