Update encoder functions

This commit is contained in:
Belma Gutlic 2020-01-07 10:29:40 +01:00
parent fc818c746c
commit dff2450b18
6 changed files with 42 additions and 46 deletions

View File

@ -14,14 +14,34 @@ export const uint16BEDecode = data => {
}; };
uint16BEDecode.bytes = 2; uint16BEDecode.bytes = 2;
export function encodeMessageBuffer(message: MessageBuffer): bytes { export function encode0(message: MessageBuffer): bytes {
return Buffer.concat([message.ne, message.ciphertext]);
}
export function encode1(message: MessageBuffer): bytes {
return Buffer.concat([message.ne, message.ns, message.ciphertext]); return Buffer.concat([message.ne, message.ns, message.ciphertext]);
} }
export function decodeMessageBuffer(message: bytes): MessageBuffer { export function decode0(input: bytes): MessageBuffer {
if (input.length < 32) {
throw new Error("Cannot decode stage 0 MessageBuffer: length less than 32 bytes.");
}
return { return {
ne: message.slice(0, 32), ne: input.slice(0, 32),
ns: message.slice(32, 64), ciphertext: input.slice(32, input.length),
ciphertext: message.slice(64, message.length), ns: Buffer.alloc(0),
}
}
export function decode1(input: bytes): MessageBuffer {
if (input.length < 96) {
throw new Error("Cannot decode stage 0 MessageBuffer: length less than 96 bytes.");
}
return {
ne: input.slice(0, 32),
ns: input.slice(32, 64),
ciphertext: input.slice(64, input.length),
} }
} }

View File

@ -12,8 +12,8 @@ import {
verifySignedPayload, verifySignedPayload,
} from "./utils"; } from "./utils";
import { logger } from "./logger"; import { logger } from "./logger";
import { decodeMessageBuffer, encodeMessageBuffer } from "./encoder";
import { WrappedConnection } from "./noise"; import { WrappedConnection } from "./noise";
import {decode0, decode1, encode1} from "./encoder";
export class Handshake extends XXHandshake { export class Handshake extends XXHandshake {
private ephemeralKeys: KeyPair; private ephemeralKeys: KeyPair;
@ -43,7 +43,7 @@ export class Handshake extends XXHandshake {
logger("XX Fallback Stage 0 - Initialized state as the first message was sent by initiator."); logger("XX Fallback Stage 0 - Initialized state as the first message was sent by initiator.");
} else { } else {
logger("XX Fallback Stage 0 - Responder waiting to receive first message..."); logger("XX Fallback Stage 0 - Responder waiting to receive first message...");
const receivedMessageBuffer = decodeMessageBuffer(this.initialMsg); const receivedMessageBuffer = decode0(this.initialMsg);
console.log("receivedMessageBuffer: ", receivedMessageBuffer) console.log("receivedMessageBuffer: ", receivedMessageBuffer)
this.xx.recvMessage(this.session, { this.xx.recvMessage(this.session, {
ne: receivedMessageBuffer.ne, ne: receivedMessageBuffer.ne,
@ -58,7 +58,7 @@ export class Handshake extends XXHandshake {
public async exchange(): Promise<void> { public async exchange(): Promise<void> {
if (this.isInitiator) { if (this.isInitiator) {
logger('XX Fallback Stage 1 - Initiator waiting to receive first message from responder...'); logger('XX Fallback Stage 1 - Initiator waiting to receive first message from responder...');
const receivedMessageBuffer = decodeMessageBuffer(this.initialMsg); const receivedMessageBuffer = decode1(this.initialMsg);
const plaintext = this.xx.recvMessage(this.session, receivedMessageBuffer); const plaintext = this.xx.recvMessage(this.session, receivedMessageBuffer);
logger('XX Fallback Stage 1 - Initiator received the message. Got remote\'s static key.'); logger('XX Fallback Stage 1 - Initiator received the message. Got remote\'s static key.');
@ -81,7 +81,7 @@ export class Handshake extends XXHandshake {
); );
const messageBuffer = this.xx.sendMessage(this.session, handshakePayload); const messageBuffer = this.xx.sendMessage(this.session, handshakePayload);
this.connection.writeLP(encodeMessageBuffer(messageBuffer)); this.connection.writeLP(encode1(messageBuffer));
logger('Stage 1 - Responder sent the second handshake message with signed payload.') logger('Stage 1 - Responder sent the second handshake message with signed payload.')
} }
} }

View File

@ -13,7 +13,7 @@ import {
verifySignedPayload, verifySignedPayload,
} from "./utils"; } from "./utils";
import { logger } from "./logger"; import { logger } from "./logger";
import { decodeMessageBuffer, encodeMessageBuffer } from "./encoder"; import { decode0, decode1, encode0, encode1 } from "./encoder";
import { WrappedConnection } from "./noise"; import { WrappedConnection } from "./noise";
export class Handshake implements HandshakeInterface { export class Handshake implements HandshakeInterface {
@ -56,11 +56,11 @@ export class Handshake implements HandshakeInterface {
if (this.isInitiator) { if (this.isInitiator) {
logger("Stage 0 - Initiator starting to send first message."); logger("Stage 0 - Initiator starting to send first message.");
const messageBuffer = this.xx.sendMessage(this.session, Buffer.alloc(0)); const messageBuffer = this.xx.sendMessage(this.session, Buffer.alloc(0));
this.connection.writeLP(encodeMessageBuffer(messageBuffer)); this.connection.writeLP(encode0(messageBuffer));
logger("Stage 0 - Initiator finished sending first message."); logger("Stage 0 - Initiator finished sending first message.");
} else { } else {
logger("Stage 0 - Responder waiting to receive first message..."); logger("Stage 0 - Responder waiting to receive first message...");
const receivedMessageBuffer = decodeMessageBuffer((await this.connection.readLP()).slice()); const receivedMessageBuffer = decode0((await this.connection.readLP()).slice());
this.xx.recvMessage(this.session, receivedMessageBuffer); this.xx.recvMessage(this.session, receivedMessageBuffer);
logger("Stage 0 - Responder received first message."); logger("Stage 0 - Responder received first message.");
} }
@ -70,7 +70,7 @@ export class Handshake implements HandshakeInterface {
public async exchange(): Promise<void> { public async exchange(): Promise<void> {
if (this.isInitiator) { if (this.isInitiator) {
logger('Stage 1 - Initiator waiting to receive first message from responder...'); logger('Stage 1 - Initiator waiting to receive first message from responder...');
const receivedMessageBuffer = decodeMessageBuffer((await this.connection.readLP()).slice()); const receivedMessageBuffer = decode1((await this.connection.readLP()).slice());
const plaintext = this.xx.recvMessage(this.session, receivedMessageBuffer); const plaintext = this.xx.recvMessage(this.session, receivedMessageBuffer);
logger('Stage 1 - Initiator received the message. Got remote\'s static key.'); logger('Stage 1 - Initiator received the message. Got remote\'s static key.');
@ -93,7 +93,7 @@ export class Handshake implements HandshakeInterface {
); );
const messageBuffer = this.xx.sendMessage(this.session, handshakePayload); const messageBuffer = this.xx.sendMessage(this.session, handshakePayload);
this.connection.writeLP(encodeMessageBuffer(messageBuffer)); this.connection.writeLP(encode1(messageBuffer));
logger('Stage 1 - Responder sent the second handshake message with signed payload.') logger('Stage 1 - Responder sent the second handshake message with signed payload.')
} }
} }
@ -111,11 +111,11 @@ export class Handshake implements HandshakeInterface {
signedEarlyDataPayload signedEarlyDataPayload
); );
const messageBuffer = this.xx.sendMessage(this.session, handshakePayload); const messageBuffer = this.xx.sendMessage(this.session, handshakePayload);
this.connection.writeLP(encodeMessageBuffer(messageBuffer)); this.connection.writeLP(encode1(messageBuffer));
logger('Stage 2 - Initiator sent message with signed payload.'); logger('Stage 2 - Initiator sent message with signed payload.');
} else { } else {
logger('Stage 2 - Responder waiting for third handshake message...'); logger('Stage 2 - Responder waiting for third handshake message...');
const receivedMessageBuffer = decodeMessageBuffer((await this.connection.readLP()).slice()); const receivedMessageBuffer = decode1((await this.connection.readLP()).slice());
const plaintext = this.xx.recvMessage(this.session, receivedMessageBuffer); const plaintext = this.xx.recvMessage(this.session, receivedMessageBuffer);
logger('Stage 2 - Responder received the message, finished handshake. Got remote\'s static key.'); logger('Stage 2 - Responder received the message, finished handshake. Got remote\'s static key.');

View File

@ -199,28 +199,4 @@ export class XX extends AbstractHandshake {
session.mc = session.mc.add(new BN(1)); session.mc = session.mc.add(new BN(1));
return plaintext; return plaintext;
} }
public decode0(input: bytes): MessageBuffer {
if (input.length < 32) {
throw new Error("Cannot decode stage 0 MessageBuffer: length less than 32 bytes.");
}
return {
ne: input.slice(0, 32),
ciphertext: input.slice(32, input.length),
ns: Buffer.alloc(0),
}
}
public decode1(input: bytes): MessageBuffer {
if (input.length < 96) {
throw new Error("Cannot decode stage 0 MessageBuffer: length less than 96 bytes.");
}
return {
ne: input.slice(0, 32),
ns: input.slice(32, 80),
ciphertext: input.slice(80, input.length),
}
}
} }

View File

@ -12,7 +12,7 @@ import {
getHandshakePayload, getHandshakePayload,
signPayload signPayload
} from "../src/utils"; } from "../src/utils";
import { decodeMessageBuffer, encodeMessageBuffer } from "../src/encoder"; import {decode0, decode1, encode1} from "../src/encoder";
import {XX} from "../src/handshakes/xx"; import {XX} from "../src/handshakes/xx";
import {Buffer} from "buffer"; import {Buffer} from "buffer";
import {getKeyPairFromPeerId} from "./utils"; import {getKeyPairFromPeerId} from "./utils";
@ -63,7 +63,7 @@ describe("Noise", () => {
const handshake = new Handshake(false, libp2pPrivKey, libp2pPubKey, prologue, staticKeys, wrapped, localPeer, xx); const handshake = new Handshake(false, libp2pPrivKey, libp2pPubKey, prologue, staticKeys, wrapped, localPeer, xx);
let receivedMessageBuffer = decodeMessageBuffer((await wrapped.readLP()).slice()); let receivedMessageBuffer = decode0((await wrapped.readLP()).slice());
// The first handshake message contains the initiator's ephemeral public key // The first handshake message contains the initiator's ephemeral public key
expect(receivedMessageBuffer.ne.length).equal(32); expect(receivedMessageBuffer.ne.length).equal(32);
xx.recvMessage(handshake.session, receivedMessageBuffer); xx.recvMessage(handshake.session, receivedMessageBuffer);
@ -73,10 +73,10 @@ describe("Noise", () => {
const handshakePayload = await createHandshakePayload(libp2pPubKey, libp2pPrivKey, signedPayload); const handshakePayload = await createHandshakePayload(libp2pPubKey, libp2pPrivKey, signedPayload);
const messageBuffer = xx.sendMessage(handshake.session, handshakePayload); const messageBuffer = xx.sendMessage(handshake.session, handshakePayload);
wrapped.writeLP(encodeMessageBuffer(messageBuffer)); wrapped.writeLP(encode1(messageBuffer));
// Stage 2 - finish handshake // Stage 2 - finish handshake
receivedMessageBuffer = decodeMessageBuffer((await wrapped.readLP()).slice()); receivedMessageBuffer = decode1((await wrapped.readLP()).slice());
xx.recvMessage(handshake.session, receivedMessageBuffer); xx.recvMessage(handshake.session, receivedMessageBuffer);
return {wrapped, handshake}; return {wrapped, handshake};
})(), })(),

View File

@ -13,7 +13,7 @@ import {generateEd25519Keys, getKeyPairFromPeerId} from "./utils";
import {Handshake} from "../src/handshake-xx-fallback"; import {Handshake} from "../src/handshake-xx-fallback";
import {createPeerIdsFromFixtures} from "./fixtures/peer"; import {createPeerIdsFromFixtures} from "./fixtures/peer";
import {assert} from "chai"; import {assert} from "chai";
import {encodeMessageBuffer} from "../src/encoder"; import {encode0} from "../src/encoder";
describe("XX Fallback Handshake", () => { describe("XX Fallback Handshake", () => {
let peerA, peerB, fakePeer; let peerA, peerB, fakePeer;
@ -43,7 +43,7 @@ describe("XX Fallback Handshake", () => {
signedPayload, signedPayload,
signedEarlyDataPayload, signedEarlyDataPayload,
); );
const initialMsg = encodeMessageBuffer({ const initialMsg = encode0({
ne: staticKeysInitiator.publicKey, ne: staticKeysInitiator.publicKey,
ns: Buffer.alloc(32), ns: Buffer.alloc(32),
ciphertext: handshakePayload, ciphertext: handshakePayload,