mirror of
https://github.com/logos-messaging/js-noise.git
synced 2026-01-06 15:43:07 +00:00
fix: pairing code confirmation
This commit is contained in:
parent
4c219c031a
commit
2cce40a6b3
@ -31,8 +31,11 @@ describe("js-noise: pairing object", () => {
|
|||||||
};
|
};
|
||||||
const decoderMap: { [key: string]: Decoder<NoiseHandshakeMessage> } = {};
|
const decoderMap: { [key: string]: Decoder<NoiseHandshakeMessage> } = {};
|
||||||
const receiver = {
|
const receiver = {
|
||||||
subscribe(decoder: Decoder<NoiseHandshakeMessage>): void {
|
subscribe(decoder: Decoder<NoiseHandshakeMessage>): Promise<void> {
|
||||||
decoderMap[decoder.contentTopic] = decoder;
|
return new Promise((resolve) => {
|
||||||
|
decoderMap[decoder.contentTopic] = decoder;
|
||||||
|
resolve();
|
||||||
|
});
|
||||||
},
|
},
|
||||||
async nextMessage(contentTopic: string): Promise<NoiseHandshakeMessage> {
|
async nextMessage(contentTopic: string): Promise<NoiseHandshakeMessage> {
|
||||||
const msg = await pEvent(msgEmitter, contentTopic);
|
const msg = await pEvent(msgEmitter, contentTopic);
|
||||||
|
|||||||
@ -12,20 +12,20 @@ import {
|
|||||||
NoiseHandshakeMessage,
|
NoiseHandshakeMessage,
|
||||||
NoiseSecureTransferDecoder,
|
NoiseSecureTransferDecoder,
|
||||||
NoiseSecureTransferEncoder,
|
NoiseSecureTransferEncoder,
|
||||||
} from "./codec";
|
} from "./codec.js";
|
||||||
import { commitPublicKey, generateX25519KeyPair } from "./crypto";
|
import { commitPublicKey, generateX25519KeyPair } from "./crypto.js";
|
||||||
import { Handshake, HandshakeResult, HandshakeStepResult, MessageNametagError } from "./handshake";
|
import { Handshake, HandshakeResult, HandshakeStepResult, MessageNametagError } from "./handshake.js";
|
||||||
import { NoiseHandshakePatterns } from "./patterns";
|
import { NoiseHandshakePatterns } from "./patterns.js";
|
||||||
import { MessageNametagLength } from "./payload";
|
import { MessageNametagLength } from "./payload.js";
|
||||||
import { NoisePublicKey } from "./publickey";
|
import { NoisePublicKey } from "./publickey.js";
|
||||||
import { QR } from "./qr";
|
import { QR } from "./qr.js";
|
||||||
|
|
||||||
export interface Sender {
|
export interface Sender {
|
||||||
publish(encoder: Encoder, msg: Message): Promise<void>;
|
publish(encoder: Encoder, msg: Message): Promise<void>;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface Receiver {
|
export interface Receiver {
|
||||||
subscribe(decoder: Decoder<NoiseHandshakeMessage>): void;
|
subscribe(decoder: Decoder<NoiseHandshakeMessage>): Promise<void>;
|
||||||
|
|
||||||
// next message should return messages received in a content topic
|
// next message should return messages received in a content topic
|
||||||
// messages should be kept in a queue, meaning that nextMessage
|
// messages should be kept in a queue, meaning that nextMessage
|
||||||
@ -34,6 +34,10 @@ export interface Receiver {
|
|||||||
nextMessage(contentTopic: string): Promise<NoiseHandshakeMessage>;
|
nextMessage(contentTopic: string): Promise<NoiseHandshakeMessage>;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function delay(ms: number): Promise<void> {
|
||||||
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
||||||
|
}
|
||||||
|
|
||||||
const rng = new HMACDRBG();
|
const rng = new HMACDRBG();
|
||||||
|
|
||||||
export class InitiatorParameters {
|
export class InitiatorParameters {
|
||||||
@ -163,7 +167,9 @@ export class WakuPairing {
|
|||||||
return step;
|
return step;
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
if (err instanceof MessageNametagError) {
|
if (err instanceof MessageNametagError) {
|
||||||
console.error("Unexpected message nametag", err.expectedNametag, err.actualNametag);
|
console.debug("Unexpected message nametag", err.expectedNametag, err.actualNametag);
|
||||||
|
} else {
|
||||||
|
throw err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -172,6 +178,10 @@ export class WakuPairing {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private async initiatorHandshake(): Promise<[NoiseSecureTransferEncoder, NoiseSecureTransferDecoder]> {
|
private async initiatorHandshake(): Promise<[NoiseSecureTransferEncoder, NoiseSecureTransferDecoder]> {
|
||||||
|
// Subscribe to the contact content topic
|
||||||
|
const decoder = new NoiseHandshakeDecoder(this.contentTopic);
|
||||||
|
await this.receiver.subscribe(decoder);
|
||||||
|
|
||||||
// The handshake initiator writes a Waku2 payload v2 containing the handshake message
|
// The handshake initiator writes a Waku2 payload v2 containing the handshake message
|
||||||
// and the (encrypted) transport message
|
// and the (encrypted) transport message
|
||||||
// The message is sent with a messageNametag equal to the one received through the QR code
|
// The message is sent with a messageNametag equal to the one received through the QR code
|
||||||
@ -187,9 +197,11 @@ export class WakuPairing {
|
|||||||
|
|
||||||
// We generate an authorization code using the handshake state
|
// We generate an authorization code using the handshake state
|
||||||
// this check has to be confirmed with a user interaction, comparing auth codes in both ends
|
// this check has to be confirmed with a user interaction, comparing auth codes in both ends
|
||||||
|
const confirmationPromise = this.isAuthCodeConfirmed();
|
||||||
|
await delay(100);
|
||||||
this.eventEmitter.emit("authCodeGenerated", this.handshake.genAuthcode());
|
this.eventEmitter.emit("authCodeGenerated", this.handshake.genAuthcode());
|
||||||
|
console.log("Waiting for authcode confirmation...");
|
||||||
const confirmed = await this.isAuthCodeConfirmed();
|
const confirmed = await confirmationPromise;
|
||||||
if (!confirmed) {
|
if (!confirmed) {
|
||||||
throw new Error("authcode is not confirmed");
|
throw new Error("authcode is not confirmed");
|
||||||
}
|
}
|
||||||
@ -228,7 +240,7 @@ export class WakuPairing {
|
|||||||
private async receiverHandshake(): Promise<[NoiseSecureTransferEncoder, NoiseSecureTransferDecoder]> {
|
private async receiverHandshake(): Promise<[NoiseSecureTransferEncoder, NoiseSecureTransferDecoder]> {
|
||||||
// Subscribe to the contact content topic
|
// Subscribe to the contact content topic
|
||||||
const decoder = new NoiseHandshakeDecoder(this.contentTopic);
|
const decoder = new NoiseHandshakeDecoder(this.contentTopic);
|
||||||
this.receiver.subscribe(decoder);
|
await this.receiver.subscribe(decoder);
|
||||||
|
|
||||||
// the received reads the initiator's payloads, and returns the (decrypted) transport message the initiator sent
|
// the received reads the initiator's payloads, and returns the (decrypted) transport message the initiator sent
|
||||||
// Note that the received verifies if the received payloadV2 has the expected messageNametag set
|
// Note that the received verifies if the received payloadV2 has the expected messageNametag set
|
||||||
@ -236,13 +248,14 @@ export class WakuPairing {
|
|||||||
|
|
||||||
const initiatorCommittedStaticKey = new Uint8Array(hsStep.transportMessage);
|
const initiatorCommittedStaticKey = new Uint8Array(hsStep.transportMessage);
|
||||||
|
|
||||||
|
const confirmationPromise = this.isAuthCodeConfirmed();
|
||||||
|
await delay(100);
|
||||||
this.eventEmitter.emit("authCodeGenerated", this.handshake.genAuthcode());
|
this.eventEmitter.emit("authCodeGenerated", this.handshake.genAuthcode());
|
||||||
|
console.log("Waiting for authcode confirmation...");
|
||||||
const confirmed = await this.isAuthCodeConfirmed();
|
const confirmed = await confirmationPromise;
|
||||||
if (!confirmed) {
|
if (!confirmed) {
|
||||||
throw new Error("authcode is not confirmed");
|
throw new Error("authcode is not confirmed");
|
||||||
}
|
}
|
||||||
|
|
||||||
// 2nd step
|
// 2nd step
|
||||||
// <- sB, eAsB {r}
|
// <- sB, eAsB {r}
|
||||||
// Receiver writes and returns a payload
|
// Receiver writes and returns a payload
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user