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

feat!: add pubsub topic as parameter #60

Merged
merged 6 commits into from
Apr 18, 2024
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
27 changes: 10 additions & 17 deletions src/codec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import {
type IProtoMessage,
} from "@waku/interfaces";
import { WakuMessage } from "@waku/proto";
import { contentTopicToPubsubTopic } from "@waku/utils";
import debug from "debug";

import { HandshakeResult, HandshakeStepResult } from "./handshake.js";
Expand Down Expand Up @@ -37,19 +36,18 @@ export class NoiseHandshakeMessage extends DecodedMessage implements IDecodedMes
*/
export class NoiseHandshakeEncoder implements IEncoder {
/**
* @param pubsubTopic pubsub topic on which handshake happens
* @param contentTopic content topic on which the encoded WakuMessages will be sent
* @param hsStepResult the result of a step executed while performing the handshake process
* @param ephemeral makes messages ephemeral in the Waku network
*/
pubsubTopic: string;

constructor(
public contentTopic: string,
public pubsubTopic: string,
private hsStepResult: HandshakeStepResult,
public ephemeral: boolean = true
) {
this.pubsubTopic = contentTopicToPubsubTopic(contentTopic);
}
) {}

async toWire(message: IMessage): Promise<Uint8Array | undefined> {
const protoMessage = await this.toProtoObj(message);
Expand Down Expand Up @@ -77,13 +75,11 @@ export class NoiseHandshakeEncoder implements IEncoder {
*/
export class NoiseHandshakeDecoder implements IDecoder<NoiseHandshakeMessage> {
/**
* @param pubsubTopic pubsub topic on which handshake happens
* @param contentTopic content topic on which the encoded WakuMessages were sent
*/
pubsubTopic: string;

constructor(public contentTopic: string) {
this.pubsubTopic = contentTopicToPubsubTopic(contentTopic);
}
constructor(public contentTopic: string, public pubsubTopic: string) {}

fromWireToProtoObj(bytes: Uint8Array): Promise<IProtoMessage | undefined> {
const protoMessage = WakuMessage.decode(bytes);
Expand Down Expand Up @@ -139,20 +135,19 @@ export class NoiseSecureMessage extends DecodedMessage implements IDecodedMessag
export class NoiseSecureTransferEncoder implements IEncoder {
/**
* @param contentTopic content topic on which the encoded WakuMessages were sent.
* @param pubsubTopic pubsub topic on which handshake happens
* @param hsResult handshake result obtained after the handshake is successful.
* @param ephemeral whether messages should be tagged as ephemeral defaults to true.
* @param metaSetter callback function that set the `meta` field.
*/
pubsubTopic: string;

constructor(
public contentTopic: string,
public pubsubTopic: string,
private hsResult: HandshakeResult,
public ephemeral: boolean = true,
public metaSetter?: IMetaSetter
) {
this.pubsubTopic = contentTopicToPubsubTopic(contentTopic);
}
) {}

async toWire(message: IMessage): Promise<Uint8Array | undefined> {
const protoMessage = await this.toProtoObj(message);
Expand Down Expand Up @@ -199,13 +194,11 @@ export class NoiseSecureTransferEncoder implements IEncoder {
export class NoiseSecureTransferDecoder implements IDecoder<NoiseSecureMessage> {
/**
* @param contentTopic content topic on which the encoded WakuMessages were sent
* @param pubsubTopic pubsub topic on which handshake happens
* @param hsResult handshake result obtained after the handshake is successful
*/
pubsubTopic: string;

constructor(public contentTopic: string, private hsResult: HandshakeResult) {
this.pubsubTopic = contentTopicToPubsubTopic(contentTopic);
}
constructor(public contentTopic: string, public pubsubTopic: string, private hsResult: HandshakeResult) {}

fromWireToProtoObj(bytes: Uint8Array): Promise<IProtoMessage | undefined> {
const protoMessage = WakuMessage.decode(bytes);
Expand Down
40 changes: 31 additions & 9 deletions src/pairing.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
import { MessageNametagBufferSize } from "./messagenametag";
import { ResponderParameters, WakuPairing } from "./pairing";

const PUBSUB_TOPIC = "default";
const PUBSUB_TOPIC = "/waku/2/default-waku/proto";

const EMPTY_PROTOMESSAGE = {
timestamp: undefined,
Expand Down Expand Up @@ -62,7 +62,7 @@
},
};
},
} as any as IReceiver;

Check warning on line 65 in src/pairing.spec.ts

View workflow job for this annotation

GitHub Actions / check

Unexpected any. Specify a different type
// =================

it("should pair", async function () {
Expand All @@ -72,14 +72,14 @@
const aliceStaticKey = dhKey.generateKeyPair();

const recvParameters = new ResponderParameters();
const bobPairingObj = new WakuPairing(sender, responder, bobStaticKey, recvParameters);
const bobPairingObj = new WakuPairing(PUBSUB_TOPIC, sender, responder, bobStaticKey, recvParameters);
const bobExecP1 = bobPairingObj.execute();

// Confirmation is done by manually
confirmAuthCodeFlow(bobPairingObj, true);

const initParameters = bobPairingObj.getPairingInfo();
const alicePairingObj = new WakuPairing(sender, responder, aliceStaticKey, initParameters);
const alicePairingObj = new WakuPairing(PUBSUB_TOPIC, sender, responder, aliceStaticKey, initParameters);
const aliceExecP1 = alicePairingObj.execute();

// Confirmation is done manually
Expand Down Expand Up @@ -115,8 +115,20 @@

it("should timeout", async function () {
const dhKey = new DH25519();
const bobPairingObj = new WakuPairing(sender, responder, dhKey.generateKeyPair(), new ResponderParameters());
const alicePairingObj = new WakuPairing(sender, responder, dhKey.generateKeyPair(), bobPairingObj.getPairingInfo());
const bobPairingObj = new WakuPairing(
PUBSUB_TOPIC,
sender,
responder,
dhKey.generateKeyPair(),
new ResponderParameters()
);
const alicePairingObj = new WakuPairing(
PUBSUB_TOPIC,
sender,
responder,
dhKey.generateKeyPair(),
bobPairingObj.getPairingInfo()
);

const bobExecP1 = bobPairingObj.execute(1000);
const aliceExecP1 = alicePairingObj.execute(1000);
Expand Down Expand Up @@ -147,16 +159,26 @@
};

const recvParameters = new ResponderParameters();
const bobPairingObj = new WakuPairing(sender, responder, bobStaticKey, recvParameters, undefined, { metaSetter });
const bobPairingObj = new WakuPairing(PUBSUB_TOPIC, sender, responder, bobStaticKey, recvParameters, undefined, {
metaSetter,
});
const bobExecP1 = bobPairingObj.execute();

// Confirmation is done by manually
confirmAuthCodeFlow(bobPairingObj, true);

const initParameters = bobPairingObj.getPairingInfo();
const alicePairingObj = new WakuPairing(sender, responder, aliceStaticKey, initParameters, undefined, {
metaSetter,
});
const alicePairingObj = new WakuPairing(
PUBSUB_TOPIC,
sender,
responder,
aliceStaticKey,
initParameters,
undefined,
{
metaSetter,
}
);
const aliceExecP1 = alicePairingObj.execute();

// Confirmation is done manually
Expand Down
30 changes: 22 additions & 8 deletions src/pairing.ts
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@ export class WakuPairing {
}

/**
* @param pubsubTopic pubsubTopic to be used for handshake
* @param sender object that implements Sender interface to publish waku messages
* @param responder object that implements Responder interface to subscribe and receive waku messages
* @param myStaticKey x25519 keypair
Expand All @@ -90,6 +91,7 @@ export class WakuPairing {
* @param encoderParameters optional parameters for the resulting encoders
*/
constructor(
private pubsubTopic: string,
private sender: ISender,
private responder: IReceiver,
private myStaticKey: KeyPair,
Expand Down Expand Up @@ -223,7 +225,7 @@ export class WakuPairing {

private async initiatorHandshake(): Promise<[NoiseSecureTransferEncoder, NoiseSecureTransferDecoder]> {
// Subscribe to the contact content topic
const decoder = new NoiseHandshakeDecoder(this.contentTopic);
const decoder = new NoiseHandshakeDecoder(this.contentTopic, this.pubsubTopic);
const subscriptionIterator = await this.responder.toSubscriptionIterator(decoder);

// The handshake initiator writes a Waku2 payload v2 containing the handshake message
Expand All @@ -236,7 +238,7 @@ export class WakuPairing {

// We prepare a message from initiator's payload2
// At this point wakuMsg is sent over the Waku network to responder content topic
let encoder = new NoiseHandshakeEncoder(this.contentTopic, hsStep);
let encoder = new NoiseHandshakeEncoder(this.contentTopic, this.pubsubTopic, hsStep);
await this.sender.send(encoder, {
payload: new Uint8Array(),
});
Expand Down Expand Up @@ -281,7 +283,7 @@ export class WakuPairing {
messageNametag: this.handshake.hs.toMessageNametag(),
});

encoder = new NoiseHandshakeEncoder(this.contentTopic, hsStep);
encoder = new NoiseHandshakeEncoder(this.contentTopic, this.pubsubTopic, hsStep);
await this.sender.send(encoder, {
payload: new Uint8Array(),
});
Expand All @@ -291,12 +293,17 @@ export class WakuPairing {

this.eventEmitter.emit("pairingComplete");

return WakuPairing.getSecureCodec(this.contentTopic, this.handshakeResult, this.encoderParameters);
return WakuPairing.getSecureCodec(
this.contentTopic,
this.pubsubTopic,
this.handshakeResult,
this.encoderParameters
);
}

private async responderHandshake(): Promise<[NoiseSecureTransferEncoder, NoiseSecureTransferDecoder]> {
// Subscribe to the contact content topic
const decoder = new NoiseHandshakeDecoder(this.contentTopic);
const decoder = new NoiseHandshakeDecoder(this.contentTopic, this.pubsubTopic);
const subscriptionIterator = await this.responder.toSubscriptionIterator(decoder);

// the received reads the initiator's payloads, and returns the (decrypted) transport message the initiator sent
Expand All @@ -322,7 +329,7 @@ export class WakuPairing {
});

// We prepare a Waku message from responder's payload2
const encoder = new NoiseHandshakeEncoder(this.contentTopic, hsStep);
const encoder = new NoiseHandshakeEncoder(this.contentTopic, this.pubsubTopic, hsStep);
await this.sender.send(encoder, {
payload: new Uint8Array(),
});
Expand Down Expand Up @@ -355,7 +362,12 @@ export class WakuPairing {

this.eventEmitter.emit("pairingComplete");

return WakuPairing.getSecureCodec(this.contentTopic, this.handshakeResult, this.encoderParameters);
return WakuPairing.getSecureCodec(
this.contentTopic,
this.pubsubTopic,
this.handshakeResult,
this.encoderParameters
);
}

/**
Expand All @@ -368,16 +380,18 @@ export class WakuPairing {
*/
static getSecureCodec(
contentTopic: string,
pubsubTopic: string,
hsResult: HandshakeResult,
encoderParameters: EncoderParameters
): [NoiseSecureTransferEncoder, NoiseSecureTransferDecoder] {
const secureEncoder = new NoiseSecureTransferEncoder(
contentTopic,
pubsubTopic,
hsResult,
encoderParameters.ephemeral,
encoderParameters.metaSetter
);
const secureDecoder = new NoiseSecureTransferDecoder(contentTopic, hsResult);
const secureDecoder = new NoiseSecureTransferDecoder(contentTopic, pubsubTopic, hsResult);

return [secureEncoder, secureDecoder];
}
Expand Down
22 changes: 11 additions & 11 deletions src/waku-noise-pairing.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import { NoiseHandshakePatterns } from "./patterns.js";
import { NoisePublicKey } from "./publickey.js";
import { QR } from "./qr.js";

const PUBSUB_TOPIC = "default";
const PUBSUB_TOPIC = "/waku/2/default-waku/proto";

describe("Waku Noise Sessions", () => {
const rng = new HMACDRBG();
Expand Down Expand Up @@ -114,15 +114,15 @@ describe("Waku Noise Sessions", () => {
messageNametag: qrMessageNameTag,
});

let encoder = new NoiseHandshakeEncoder(contentTopic, aliceStep);
let encoder = new NoiseHandshakeEncoder(contentTopic, PUBSUB_TOPIC, aliceStep);

// We prepare a Waku message from Alice's payload2
// At this point wakuMsg is sent over the Waku network and is received
// We simulate this by creating the ProtoBuffer from wakuMsg
let wakuMsgBytes = await encoder.toWire({ payload: new Uint8Array() });

// We decode the WakuMessage from the ProtoBuffer
let decoder = new NoiseHandshakeDecoder(contentTopic);
let decoder = new NoiseHandshakeDecoder(contentTopic, PUBSUB_TOPIC);
let wakuMsgProto = await decoder.fromWireToProtoObj(wakuMsgBytes!);
let v2Msg = await decoder.fromProtoObj(PUBSUB_TOPIC, wakuMsgProto!);

Expand Down Expand Up @@ -157,14 +157,14 @@ describe("Waku Noise Sessions", () => {
bobStep = bobHS.stepHandshake({ transportMessage: sentTransportMessage, messageNametag: bobMessageNametag });

// We prepare a Waku message from Bob's payload2
encoder = new NoiseHandshakeEncoder(contentTopic, bobStep);
encoder = new NoiseHandshakeEncoder(contentTopic, PUBSUB_TOPIC, bobStep);

// At this point wakuMsg is sent over the Waku network and is received
// We simulate this by creating the ProtoBuffer from wakuMsg
wakuMsgBytes = await encoder.toWire({ payload: new Uint8Array() });

// We decode the WakuMessage from the ProtoBuffer
decoder = new NoiseHandshakeDecoder(contentTopic);
decoder = new NoiseHandshakeDecoder(contentTopic, PUBSUB_TOPIC);
wakuMsgProto = await decoder.fromWireToProtoObj(wakuMsgBytes!);
v2Msg = await decoder.fromProtoObj(PUBSUB_TOPIC, wakuMsgProto!);

Expand Down Expand Up @@ -194,14 +194,14 @@ describe("Waku Noise Sessions", () => {
aliceStep = aliceHS.stepHandshake({ transportMessage: sentTransportMessage, messageNametag: aliceMessageNametag });

// We prepare a Waku message from Alice's payload2
encoder = new NoiseHandshakeEncoder(contentTopic, aliceStep);
encoder = new NoiseHandshakeEncoder(contentTopic, PUBSUB_TOPIC, aliceStep);

// At this point wakuMsg is sent over the Waku network and is received
// We simulate this by creating the ProtoBuffer from wakuMsg
wakuMsgBytes = await encoder.toWire({ payload: new Uint8Array() });

// We decode the WakuMessage from the ProtoBuffer
decoder = new NoiseHandshakeDecoder(contentTopic);
decoder = new NoiseHandshakeDecoder(contentTopic, PUBSUB_TOPIC);
wakuMsgProto = await decoder.fromWireToProtoObj(wakuMsgBytes!);
v2Msg = await decoder.fromProtoObj(PUBSUB_TOPIC, wakuMsgProto!);

Expand All @@ -224,11 +224,11 @@ describe("Waku Noise Sessions", () => {
const aliceHSResult = aliceHS.finalizeHandshake();
const bobHSResult = bobHS.finalizeHandshake();

const aliceEncoder = new NoiseSecureTransferEncoder(contentTopic, aliceHSResult);
const bobEncoder = new NoiseSecureTransferEncoder(contentTopic, bobHSResult);
const aliceEncoder = new NoiseSecureTransferEncoder(contentTopic, PUBSUB_TOPIC, aliceHSResult);
const bobEncoder = new NoiseSecureTransferEncoder(contentTopic, PUBSUB_TOPIC, bobHSResult);

const aliceDecoder = new NoiseSecureTransferDecoder(contentTopic, aliceHSResult);
const bobDecoder = new NoiseSecureTransferDecoder(contentTopic, bobHSResult);
const aliceDecoder = new NoiseSecureTransferDecoder(contentTopic, PUBSUB_TOPIC, aliceHSResult);
const bobDecoder = new NoiseSecureTransferDecoder(contentTopic, PUBSUB_TOPIC, bobHSResult);

// We test read/write of random messages exchanged between Alice and Bob
// Note that we exchange more than the number of messages contained in the nametag buffer to test if they are filled correctly as the communication proceeds
Expand Down
Loading