js-libp2p-noise/test/ik-handshake.test.ts

81 lines
3.1 KiB
TypeScript
Raw Normal View History

2020-01-15 11:32:40 +01:00
import Wrap from "it-pb-rpc";
import Duplex from 'it-pair/duplex';
import {Buffer} from "buffer";
2020-01-15 11:40:32 +01:00
import {assert, expect} from "chai";
2020-01-15 11:32:40 +01:00
import {createPeerIdsFromFixtures} from "./fixtures/peer";
import {generateKeypair, getPayload} from "../src/utils";
import {IKHandshake} from "../src/handshake-ik";
describe("IK Handshake", () => {
let peerA, peerB, fakePeer;
before(async () => {
[peerA, peerB, fakePeer] = await createPeerIdsFromFixtures(3);
});
it("should finish both stages as initiator and responder", async() => {
try {
const duplex = Duplex();
const connectionFrom = Wrap(duplex[0]);
const connectionTo = Wrap(duplex[1]);
2020-01-29 19:48:14 +01:00
const prologue = Buffer.alloc(0);
2020-01-15 11:32:40 +01:00
const staticKeysInitiator = generateKeypair();
const staticKeysResponder = generateKeypair();
const initPayload = await getPayload(peerA, staticKeysInitiator.publicKey);
2020-02-07 20:21:27 +01:00
const handshakeInit = new IKHandshake(true, initPayload, prologue, staticKeysInitiator, connectionFrom, staticKeysResponder.publicKey, peerB);
2020-01-15 11:32:40 +01:00
const respPayload = await getPayload(peerB, staticKeysResponder.publicKey);
2020-02-07 20:21:27 +01:00
const handshakeResp = new IKHandshake(false, respPayload, prologue, staticKeysResponder, connectionTo, staticKeysInitiator.publicKey);
2020-01-15 11:32:40 +01:00
await handshakeInit.stage0();
await handshakeResp.stage0();
await handshakeResp.stage1();
await handshakeInit.stage1();
// Test shared key
if (handshakeInit.session.cs1 && handshakeResp.session.cs1 && handshakeInit.session.cs2 && handshakeResp.session.cs2) {
assert(handshakeInit.session.cs1.k.equals(handshakeResp.session.cs1.k));
assert(handshakeInit.session.cs2.k.equals(handshakeResp.session.cs2.k));
} else {
assert(false);
}
// Test encryption and decryption
const encrypted = handshakeInit.encrypt(Buffer.from("encryptthis"), handshakeInit.session);
const decrypted = handshakeResp.decrypt(encrypted, handshakeResp.session);
assert(decrypted.equals(Buffer.from("encryptthis")));
} catch (e) {
console.error(e);
assert(false, e.message);
}
});
2020-01-15 11:40:32 +01:00
it("should throw error if responder's static key changed", async() => {
try {
const duplex = Duplex();
const connectionFrom = Wrap(duplex[0]);
const connectionTo = Wrap(duplex[1]);
2020-01-29 19:48:14 +01:00
const prologue = Buffer.alloc(0);
2020-01-15 11:40:32 +01:00
const staticKeysInitiator = generateKeypair();
const staticKeysResponder = generateKeypair();
const oldScammyKeys = generateKeypair();
const initPayload = await getPayload(peerA, staticKeysInitiator.publicKey);
2020-02-07 20:21:27 +01:00
const handshakeInit = new IKHandshake(true, initPayload, prologue, staticKeysInitiator, connectionFrom, oldScammyKeys.publicKey, peerB);
2020-01-15 11:40:32 +01:00
const respPayload = await getPayload(peerB, staticKeysResponder.publicKey);
2020-02-07 20:21:27 +01:00
const handshakeResp = new IKHandshake(false, respPayload, prologue, staticKeysResponder, connectionTo, staticKeysInitiator.publicKey);
2020-01-15 11:40:32 +01:00
await handshakeInit.stage0();
await handshakeResp.stage0();
} catch (e) {
expect(e.message).to.include("Error occurred while verifying initiator's signed payload");
}
});
2020-01-15 11:32:40 +01:00
});