diff --git a/src/handshake-xx-fallback.ts b/src/handshake-xx-fallback.ts index 8f9a7d6..1db6f2b 100644 --- a/src/handshake-xx-fallback.ts +++ b/src/handshake-xx-fallback.ts @@ -59,8 +59,7 @@ export class XXFallbackHandshake extends XXHandshake { public async exchange(): Promise { if (this.isInitiator) { logger('XX Fallback Stage 1 - Initiator waiting to receive first message from responder...'); - const receivedMessageBuffer = decode1((await this.connection.readLP())); - // const receivedMessageBuffer = decode1(this.initialMsg); + const receivedMessageBuffer = decode1(this.initialMsg); logger("Initiator receivedMessageBuffer in stage 1", receivedMessageBuffer); const plaintext = this.xx.recvMessage(this.session, receivedMessageBuffer); logger('XX Fallback Stage 1 - Initiator received the message. Got remote\'s static key.'); diff --git a/test/xx-fallback-handshake.test.ts b/test/xx-fallback-handshake.test.ts index 78bea5f..028f425 100644 --- a/test/xx-fallback-handshake.test.ts +++ b/test/xx-fallback-handshake.test.ts @@ -12,7 +12,8 @@ import {generateEd25519Keys, getKeyPairFromPeerId} from "./utils"; import {XXFallbackHandshake} from "../src/handshake-xx-fallback"; import {createPeerIdsFromFixtures} from "./fixtures/peer"; import {assert} from "chai"; -import {encode0, encode1} from "../src/encoder"; +import {decode1, encode0, encode1} from "../src/encoder"; +import {XX} from "../src/handshakes/xx"; describe("XX Fallback Handshake", () => { let peerA, peerB, fakePeer; @@ -21,7 +22,7 @@ describe("XX Fallback Handshake", () => { [peerA, peerB] = await createPeerIdsFromFixtures(2); }); - it("should make handshake with received ephemeral key (from initial IK message)", async () => { + it("should test that both parties can fallback to XX and finish handshake", async () => { try { const duplex = Duplex(); const connectionFrom = Wrap(duplex[0]); @@ -35,29 +36,32 @@ describe("XX Fallback Handshake", () => { const {privateKey: initiatorPrivKey, publicKey: initiatorPubKey} = getKeyPairFromPeerId(peerA); const {privateKey: responderPrivKey, publicKey: responderPubKey} = getKeyPairFromPeerId(peerB); + // Initial msg for responder is IK first message from initiator const signedPayload = signPayload(initiatorPrivKey, getHandshakePayload(staticKeysInitiator.publicKey)); const handshakePayload = await createHandshakePayload( initiatorPubKey, initiatorPrivKey, signedPayload, ); - const initialMsg = encode0({ + const initialMsgR = encode0({ ne: ephemeralKeys.publicKey, ns: Buffer.alloc(0), ciphertext: handshakePayload, }); - const handshakeInit = - new XXFallbackHandshake(true, initiatorPrivKey, initiatorPubKey, prologue, staticKeysInitiator, connectionFrom, peerB, initialMsg, ephemeralKeys); - const handshakeResp = - new XXFallbackHandshake(false, responderPrivKey, responderPubKey, prologue, staticKeysResponder, connectionTo, peerA, initialMsg); + new XXFallbackHandshake(false, responderPrivKey, responderPubKey, prologue, staticKeysResponder, connectionTo, peerA, initialMsgR); + await handshakeResp.propose(); + await handshakeResp.exchange(); + + // Initial message for initiator is XX Message B from responder + // This is the point where initiator falls back from IK + const initialMsgI = await connectionFrom.readLP(); + const handshakeInit = + new XXFallbackHandshake(true, initiatorPrivKey, initiatorPubKey, prologue, staticKeysInitiator, connectionFrom, peerB, initialMsgI, ephemeralKeys); await handshakeInit.propose(); - await handshakeResp.propose(); - - await handshakeResp.exchange(); await handshakeInit.exchange(); await handshakeInit.finish();