Merge branch 'morrigan/fix-interop' into revert-51-remove-bcrypto-dependency

# Conflicts:
#	package.json
#	src/@types/basic.ts
#	src/handshakes/ik.ts
#	src/handshakes/xx.ts
#	yarn.lock
This commit is contained in:
morrigan 2020-04-22 19:07:03 +02:00
commit f5f4b9f344
11 changed files with 90 additions and 81 deletions

View File

@ -19,6 +19,9 @@ Stable version, interobable with go-libp2p-noise!
- fix types to be compatible with rest of libp2p typescript projects
- update it-pb-rpc to 0.1.8 (contains proper typescript types)
### Bugfixes
- changed bcrypto imports to use pure js versions (web bundle size reduction)
## [1.0.0-rc.9] - 2019-03-11
### Bugfixes

View File

@ -1,6 +1,6 @@
{
"name": "libp2p-noise",
"version": "1.1.0-rc1",
"version": "1.0.0",
"main": "dist/index.js",
"types": "dist/index.d.ts",
"module": "lib/index.js",
@ -20,6 +20,7 @@
"scripts": {
"prebuild": "rm -rf lib && rm -rf dist",
"build": "yarn run build:node && yarn run build:web && yarn run build:types",
"bundle": "webpack --config webpack.bundle.config.js",
"build:node": "babel --no-babelrc --config-file ./babel.config.json src --copy-files -x .ts -d dist --source-maps",
"build:web": "babel --no-babelrc --config-file ./babel.web.config.json src --copy-files -x .ts -d lib --source-maps",
"build:types": "tsc --declaration --outDir dist --emitDeclarationOnly",
@ -47,6 +48,7 @@
"@types/mocha": "^5.2.7",
"@typescript-eslint/eslint-plugin": "^2.6.0",
"@typescript-eslint/parser": "^2.6.0",
"babel-loader": "^8.1.0",
"chai": "^4.2.0",
"eslint": "^6.6.0",
"karma": "^4.4.1",
@ -60,10 +62,11 @@
"sinon": "^8.1.0",
"ts-loader": "^6.2.1",
"typescript": "^3.6.4",
"webpack": "^4.41.5"
"webpack": "^4.41.5",
"webpack-bundle-analyzer": "^3.6.1",
"webpack-cli": "^3.3.11"
},
"dependencies": {
"@types/bn.js": "^4.11.6",
"bcrypto": "5.1.0",
"bn.js": "^5.0.0",
"buffer": "^5.4.3",

View File

@ -1,9 +1,8 @@
import BN from 'bn.js';
import { Buffer } from 'buffer';
import {Buffer} from 'buffer';
export type bytes = Buffer;
export type bytes32 = Buffer;
export type bytes16 = Buffer;
export type uint32 = number;
export type uint64 = BN;
export type uint64 = number;

View File

@ -1,5 +1,7 @@
import {Buffer} from "buffer";
import { AEAD, x25519, SHA256 } from 'bcrypto';
import AEAD from 'bcrypto/lib/js/aead';
import x25519 from 'bcrypto/lib/js/x25519';
import SHA256 from 'bcrypto/lib/js/sha256';
import {bytes, bytes32, uint32} from "../@types/basic";
import {CipherState, MessageBuffer, SymmetricState} from "../@types/handshake";

View File

@ -1,6 +1,4 @@
import {Buffer} from "buffer";
import BN from "bn.js";
import {CipherState, HandshakeState, MessageBuffer, NoiseSession} from "../@types/handshake";
import {bytes, bytes32} from "../@types/basic";
import {generateKeypair, isValidPublicKey} from "../utils";
@ -22,21 +20,21 @@ export class IK extends AbstractHandshake {
return {
hs,
i: initiator,
mc: new BN(0),
mc: 0,
};
}
public sendMessage(session: NoiseSession, message: bytes): MessageBuffer {
let messageBuffer: MessageBuffer;
if (session.mc.eqn(0)) {
if (session.mc === 0) {
messageBuffer = this.writeMessageA(session.hs, message);
} else if (session.mc.eqn(1)) {
} else if (session.mc === 1) {
const { messageBuffer: mb, h, cs1, cs2 } = this.writeMessageB(session.hs, message);
messageBuffer = mb;
session.h = h;
session.cs1 = cs1;
session.cs2 = cs2;
} else if (session.mc.gtn(1)) {
} else if (session.mc > 1) {
if (session.i) {
if (!session.cs1) {
throw new Error("CS1 (cipher state) is not defined")
@ -54,16 +52,16 @@ export class IK extends AbstractHandshake {
throw new Error("Session invalid.")
}
session.mc = session.mc.add(new BN(1));
session.mc++;
return messageBuffer;
}
public recvMessage(session: NoiseSession, message: MessageBuffer): {plaintext: bytes; valid: boolean} {
let plaintext = Buffer.alloc(0), valid = false;
if (session.mc.eqn(0)) {
if (session.mc === 0) {
({plaintext, valid} = this.readMessageA(session.hs, message));
}
if (session.mc.eqn(1)) {
if (session.mc === 1) {
const { plaintext: pt, valid: v, h, cs1, cs2 } = this.readMessageB(session.hs, message);
plaintext = pt;
valid = v;
@ -71,7 +69,7 @@ export class IK extends AbstractHandshake {
session.cs1 = cs1;
session.cs2 = cs2;
}
session.mc = session.mc.add(new BN(1));
session.mc++;
return {plaintext, valid};
}

View File

@ -1,6 +1,4 @@
import { Buffer } from 'buffer';
import BN from 'bn.js';
import { bytes32, bytes } from '../@types/basic'
import { KeyPair } from '../@types/libp2p'
import {generateKeypair, isValidPublicKey} from '../utils';
@ -129,23 +127,23 @@ export class XX extends AbstractHandshake {
return {
hs,
i: initiator,
mc: new BN(0),
mc: 0,
};
}
public sendMessage(session: NoiseSession, message: bytes, ephemeral?: KeyPair): MessageBuffer {
let messageBuffer: MessageBuffer;
if (session.mc.eqn(0)) {
if (session.mc === 0) {
messageBuffer = this.writeMessageA(session.hs, message, ephemeral);
} else if (session.mc.eqn(1)) {
} else if (session.mc === 1) {
messageBuffer = this.writeMessageB(session.hs, message);
} else if (session.mc.eqn(2)) {
} else if (session.mc === 2) {
const { h, messageBuffer: resultingBuffer, cs1, cs2 } = this.writeMessageC(session.hs, message);
messageBuffer = resultingBuffer;
session.h = h;
session.cs1 = cs1;
session.cs2 = cs2;
} else if (session.mc.gtn(2)) {
} else if (session.mc > 2) {
if (session.i) {
if (!session.cs1) {
throw new Error("CS1 (cipher state) is not defined")
@ -163,18 +161,18 @@ export class XX extends AbstractHandshake {
throw new Error("Session invalid.")
}
session.mc = session.mc.add(new BN(1));
session.mc++;
return messageBuffer;
}
public recvMessage(session: NoiseSession, message: MessageBuffer): {plaintext: bytes; valid: boolean} {
let plaintext: bytes = Buffer.alloc(0);
let valid = false;
if (session.mc.eqn(0)) {
if (session.mc === 0) {
({plaintext, valid} = this.readMessageA(session.hs, message));
} else if (session.mc.eqn(1)) {
} else if (session.mc === 1) {
({plaintext, valid} = this.readMessageB(session.hs, message));
} else if (session.mc.eqn(2)) {
} else if (session.mc === 2) {
const { h, plaintext: resultingPlaintext, valid: resultingValid, cs1, cs2 } = this.readMessageC(session.hs, message);
plaintext = resultingPlaintext;
valid = resultingValid;
@ -182,7 +180,7 @@ export class XX extends AbstractHandshake {
session.cs1 = cs1;
session.cs2 = cs2;
}
session.mc = session.mc.add(new BN(1));
session.mc++;
return {plaintext, valid};
}
}

View File

@ -1,4 +1,4 @@
import {x25519} from 'bcrypto';
import x25519 from 'bcrypto/lib/js/x25519';
import {Buffer} from "buffer";
import Wrap from 'it-pb-rpc';
import DuplexPair from 'it-pair/duplex';

View File

@ -1,7 +1,9 @@
import {HKDF, SHA256, x25519} from 'bcrypto';
import HKDF from 'bcrypto/lib/hkdf';
import x25519 from 'bcrypto/lib/js/x25519';
import SHA256 from 'bcrypto/lib/js/sha256';
import {Buffer} from "buffer";
import PeerId from "peer-id";
import * as crypto from 'libp2p-crypto';
import {keys} from 'libp2p-crypto';
import {KeyPair} from "./@types/libp2p";
import {bytes, bytes32} from "./@types/basic";
import {Hkdf, INoisePayload} from "./@types/handshake";
@ -91,7 +93,7 @@ export async function verifySignedPayload(
}
const generatedPayload = getHandshakePayload(noiseStaticKey);
// Unmarshaling from PublicKey protobuf
const publicKey = crypto.keys.unmarshalPublicKey(identityKey);
const publicKey = keys.unmarshalPublicKey(identityKey);
if (!publicKey.verify(generatedPayload, payload.identitySig)) {
throw new Error("Static key doesn't match to peer that signed payload!");
}

View File

@ -1,8 +1,9 @@
import * as crypto from 'libp2p-crypto';
import {KeyPair, PeerId} from "../src/@types/libp2p";
import {keys} from 'libp2p-crypto';
import {KeyPair} from "../src/@types/libp2p";
import PeerId from "peer-id";
export async function generateEd25519Keys() {
return await crypto.keys.generateKeyPair('ed25519');
return await keys.generateKeyPair('ed25519');
}
export function getKeyPairFromPeerId(peerId: PeerId): KeyPair {

24
webpack.bundle.config.js Normal file
View File

@ -0,0 +1,24 @@
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
module.exports = {
entry: "./src/index.ts",
mode: "production",
output: {
filename: "../bundle/bundle.js"
},
node: {
fs: "empty"
},
resolve: {
extensions: [".ts", ".js"],
},
module: {
rules: [
{test: /\.ts$/, exclude: [/node_modules/], use: {loader: "babel-loader", options: require("./babel.web.config")}}
],
},
plugins: [
new BundleAnalyzerPlugin()
]
};

View File

@ -1056,13 +1056,6 @@
dependencies:
"@types/node" "*"
"@types/bn.js@^4.11.6":
version "4.11.6"
resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c"
integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==
dependencies:
"@types/node" "*"
"@types/chai@^4.2.4":
version "4.2.4"
resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.2.4.tgz#8936cffad3c96ec470a2dc26a38c3ba8b9b6f619"
@ -1098,6 +1091,11 @@
resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.3.tgz#65a8d9a6a0f6af55595a2d0020617959130d6495"
integrity sha512-QZ9CjUB3QoA3f2afw3utKlfRPhpmufB7jC2+oDhLWnXqoyx333fhKSQDLQu2EK7OE0a15X67eYiRAaJsHXrpMA==
"@types/node@^10.12.12":
version "10.17.2"
resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.2.tgz#41b5afbcde1a5a805302a4da3cf399499f1bbf64"
integrity sha512-sAh60KDol+MpwOr1RTK0+HgBEYejKsxdpmrOS1Wts5bI03dLzq8F7T0sRXDKeaEK8iWDlGfdzxrzg6vx/c5pNA==
"@typescript-eslint/eslint-plugin@^2.6.0":
version "2.6.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.6.0.tgz#e82ed43fc4527b21bfe35c20a2d6e4ed49fc7957"
@ -1585,13 +1583,14 @@ base@^0.11.1:
mixin-deep "^1.2.0"
pascalcase "^0.1.1"
bcrypto@5.1.0:
version "5.1.0"
resolved "https://registry.yarnpkg.com/bcrypto/-/bcrypto-5.1.0.tgz#1ca3d0b1bd1ffe6bb18cfcf2a7d7fc19423b68e6"
integrity sha512-WEs5g7WHdEdLLcsvhE7Z1AXv0G+hb+bJhSUYM7samFNrH051XhcFVWxAbAZDmIU1HWjpjhmQ+HqBar7UC/qrzQ==
bcrypto@5.0.3:
version "5.0.3"
resolved "https://registry.yarnpkg.com/bcrypto/-/bcrypto-5.0.3.tgz#086b62d660e545c34ddf980fd4a5fc0001d4708b"
integrity sha512-wqATA9cenjBLDjih4Pey6H47G4RIpDzX4V3gvPTxsQkvVovYoERKyHR/BuUuxYllw5Xpi7novrogb/F/wN7xjA==
dependencies:
bufio "~1.0.6"
loady "~0.0.1"
nan "^2.14.0"
better-assert@~1.0.0:
version "1.0.2"
@ -1636,15 +1635,6 @@ bl@^4.0.0:
dependencies:
readable-stream "^3.4.0"
bl@^4.0.2:
version "4.0.2"
resolved "https://registry.yarnpkg.com/bl/-/bl-4.0.2.tgz#52b71e9088515d0606d9dd9cc7aa48dc1f98e73a"
integrity sha512-j4OH8f6Qg2bGuWfRiltT2HYGx0e1QcBTrK9KAHNMwMZdQnDZFk0ZSYIpADjYCB3U12nicC5tVJwSIhwOWjb4RQ==
dependencies:
buffer "^5.5.0"
inherits "^2.0.4"
readable-stream "^3.4.0"
blakejs@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.1.0.tgz#69df92ef953aa88ca51a32df6ab1c54a155fc7a5"
@ -1660,6 +1650,13 @@ bluebird@^3.3.0, bluebird@^3.5.5:
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f"
integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==
bn.js-typings@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/bn.js-typings/-/bn.js-typings-1.0.1.tgz#00faef56401850b763cee041c0728a9aaf091e7e"
integrity sha512-PdV3AEpI5A8mHCt3KgBobIJ+3rhoxxkRl8b0dCGDgGtJNYmN4KTPLHYq7xOSmKF1Kv06aZ5k8QhXbyG73IyhdQ==
dependencies:
"@types/node" "^10.12.12"
bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.11.8, bn.js@^4.4.0:
version "4.11.8"
resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f"
@ -1847,14 +1844,6 @@ buffer@^5.2.1, buffer@^5.4.3:
base64-js "^1.0.2"
ieee754 "^1.1.4"
buffer@^5.5.0:
version "5.5.0"
resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.5.0.tgz#9c3caa3d623c33dd1c7ef584b89b88bf9c9bc1ce"
integrity sha512-9FTEDjLjwoAkEwyMGDjYJQN2gfRgOKBKRfiglhvibGbpeeU/pQn1bJxQqm32OD/AIeEuHxU9roxXxg34Byp/Ww==
dependencies:
base64-js "^1.0.2"
ieee754 "^1.1.4"
bufio@~1.0.6:
version "1.0.6"
resolved "https://registry.yarnpkg.com/bufio/-/bufio-1.0.6.tgz#e0eb6d70b2efcc997b6f8872173540967f90fa4d"
@ -3306,7 +3295,7 @@ inflight@^1.0.4:
once "^1.3.0"
wrappy "1"
inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3:
inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3:
version "2.0.4"
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
@ -3385,7 +3374,7 @@ is-buffer@^1.1.5:
resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
is-buffer@^2.0.4, is-buffer@~2.0.3:
is-buffer@~2.0.3:
version "2.0.4"
resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.4.tgz#3e572f23c8411a5cfd9557c849e3665e0b290623"
integrity sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==
@ -3610,15 +3599,6 @@ it-length-prefixed@^3.0.0:
buffer "^5.4.3"
varint "^5.0.0"
it-length-prefixed@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/it-length-prefixed/-/it-length-prefixed-3.0.1.tgz#8c4d829576f941eb17b94bc83ed0c3c78bf0a05a"
integrity sha512-QnfnFkpklDhWpyPQ2al6pdqmsQbwZAUpa7066e8S9RQxXo0s4o21ceqCG0n/0wdmvgfRSYsW5g2dYgchqtLZYw==
dependencies:
bl "^4.0.2"
buffer "^5.5.0"
varint "^5.0.0"
it-pair@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/it-pair/-/it-pair-1.0.0.tgz#b1add81f49af16a10b2939dbef7b1974fae87d6a"
@ -3626,14 +3606,13 @@ it-pair@^1.0.0:
dependencies:
get-iterator "^1.0.2"
it-pb-rpc@^0.1.8:
version "0.1.8"
resolved "https://registry.yarnpkg.com/it-pb-rpc/-/it-pb-rpc-0.1.8.tgz#eed8ffdcba2a322a20a45c9db9ec5644499ccaf2"
integrity sha512-YePzUUonithCTIdVKcOeQEn5mpipCg7ZoWsq7jfjXXtAS6gm6R7KzCe6YBV97i6bljU8hGllTG67FiGfweKNKg==
it-pb-rpc@^0.1.6:
version "0.1.6"
resolved "https://registry.yarnpkg.com/it-pb-rpc/-/it-pb-rpc-0.1.6.tgz#f6dba92f44a6ce5df8fc71ca08aefe472b552a02"
integrity sha512-4srJH8iK976tlAEv0wBnud78hxjQsDvrl71lPG7zquNiaqZ3409oqzukC05f6z0UeYwi4M80Bm+gHy/642lJ/g==
dependencies:
is-buffer "^2.0.4"
it-handshake "^1.0.1"
it-length-prefixed "^3.0.1"
it-length-prefixed "^3.0.0"
it-pipe@^1.1.0:
version "1.1.0"