From c54ea206f0160c73403e9fdc6b7d7f0517f5beb9 Mon Sep 17 00:00:00 2001 From: Jacob Heun Date: Thu, 3 Jan 2019 08:13:07 -0800 Subject: [PATCH] feat: nextTick instead of setImmediate, and fix sync in async (#136) * fix: avoid sync callback in async function * chore: fix linting * chore: remove non jenkins ci * refactor: use nextTick over setImmediate * refactor: async/nextTick for better browser support --- .travis.yml | 32 -------------------------------- appveyor.yml | 29 ----------------------------- benchmarks/ephemeral-keys.js | 2 +- benchmarks/key-stretcher.js | 2 +- benchmarks/rsa.js | 2 +- circle.yml | 15 --------------- package.json | 2 +- src/aes/index-browser.js | 8 ++++---- src/hmac/index-browser.js | 4 ++-- src/hmac/index.js | 5 ++++- src/keys/ecdh.js | 6 +++--- src/keys/ed25519.js | 10 +++++----- src/keys/rsa-browser.js | 14 +++++++------- src/keys/rsa-class.js | 4 ++-- src/keys/rsa.js | 13 +++++++------ 15 files changed, 38 insertions(+), 110 deletions(-) delete mode 100644 .travis.yml delete mode 100644 appveyor.yml delete mode 100644 circle.yml diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 5102ee5..0000000 --- a/.travis.yml +++ /dev/null @@ -1,32 +0,0 @@ -# Warning: This file is automatically synced from https://github.com/ipfs/ci-sync so if you want to change it, please change it there and ask someone to sync all repositories. -sudo: false -language: node_js - -matrix: - include: - - node_js: 6 - env: CXX=g++-4.8 - - node_js: 8 - env: CXX=g++-4.8 - # - node_js: stable - # env: CXX=g++-4.8 - -script: - - npm run lint - - npm run test - - npm run coverage - -before_script: - - export DISPLAY=:99.0 - - sh -e /etc/init.d/xvfb start - -after_success: - - npm run coverage-publish - -addons: - firefox: 'latest' - apt: - sources: - - ubuntu-toolchain-r-test - packages: - - g++-4.8 diff --git a/appveyor.yml b/appveyor.yml deleted file mode 100644 index 046bf91..0000000 --- a/appveyor.yml +++ /dev/null @@ -1,29 +0,0 @@ -# Warning: This file is automatically synced from https://github.com/ipfs/ci-sync so if you want to change it, please change it there and ask someone to sync all repositories. -version: "{build}" - -environment: - matrix: - - nodejs_version: "6" - - nodejs_version: "8" - -matrix: - fast_finish: true - -install: - # Install Node.js - - ps: Install-Product node $env:nodejs_version - - # Upgrade npm - - npm install -g npm - - # Output our current versions for debugging - - node --version - - npm --version - - # Install our package dependencies - - npm install - -test_script: - - npm run test:node - -build: off diff --git a/benchmarks/ephemeral-keys.js b/benchmarks/ephemeral-keys.js index 7058abe..45bea89 100644 --- a/benchmarks/ephemeral-keys.js +++ b/benchmarks/ephemeral-keys.js @@ -25,4 +25,4 @@ curves.forEach((curve) => { suite .on('cycle', (event) => console.log(String(event.target))) - .run({async: true}) + .run({ async: true }) diff --git a/benchmarks/key-stretcher.js b/benchmarks/key-stretcher.js index af4efcb..067369b 100644 --- a/benchmarks/key-stretcher.js +++ b/benchmarks/key-stretcher.js @@ -25,7 +25,7 @@ async.waterfall([ suite .on('cycle', (event) => console.log(String(event.target))) - .run({async: true}) + .run({ async: true }) }) function setup (cipher, hash, secret) { diff --git a/benchmarks/rsa.js b/benchmarks/rsa.js index 5a93990..172f17f 100644 --- a/benchmarks/rsa.js +++ b/benchmarks/rsa.js @@ -40,4 +40,4 @@ suite.add('sign and verify', (d) => { suite .on('cycle', (event) => console.log(String(event.target))) - .run({async: true}) + .run({ async: true }) diff --git a/circle.yml b/circle.yml deleted file mode 100644 index 0009693..0000000 --- a/circle.yml +++ /dev/null @@ -1,15 +0,0 @@ -# Warning: This file is automatically synced from https://github.com/ipfs/ci-sync so if you want to change it, please change it there and ask someone to sync all repositories. -machine: - node: - version: stable - -dependencies: - pre: - - google-chrome --version - - curl -L -o google-chrome.deb https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb - - sudo dpkg -i google-chrome.deb || true - - sudo apt-get update - - sudo apt-get install -f - - sudo apt-get install --only-upgrade lsb-base - - sudo dpkg -i google-chrome.deb - - google-chrome --version diff --git a/package.json b/package.json index 839758a..8f09afb 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,7 @@ "webcrypto-shim": "github:dignifiedquire/webcrypto-shim#master" }, "devDependencies": { - "aegir": "^17.0.1", + "aegir": "^17.1.1", "benchmark": "^2.1.4", "chai": "^4.2.0", "chai-string": "^1.5.0", diff --git a/src/aes/index-browser.js b/src/aes/index-browser.js index 6640524..ee3af5d 100644 --- a/src/aes/index-browser.js +++ b/src/aes/index-browser.js @@ -1,10 +1,10 @@ 'use strict' const asm = require('asmcrypto.js') -const setImmediate = require('async/setImmediate') +const nextTick = require('async/nextTick') exports.create = function (key, iv, callback) { - const done = (err, res) => setImmediate(() => callback(err, res)) + const done = (err, res) => nextTick(() => callback(err, res)) if (key.length !== 16 && key.length !== 32) { return done(new Error('Invalid key length')) @@ -21,7 +21,7 @@ exports.create = function (key, iv, callback) { const res = { encrypt (data, cb) { - const done = (err, res) => setImmediate(() => cb(err, res)) + const done = (err, res) => nextTick(() => cb(err, res)) let res try { @@ -36,7 +36,7 @@ exports.create = function (key, iv, callback) { }, decrypt (data, cb) { - const done = (err, res) => setImmediate(() => cb(err, res)) + const done = (err, res) => nextTick(() => cb(err, res)) let res try { diff --git a/src/hmac/index-browser.js b/src/hmac/index-browser.js index 70676a9..610e8ca 100644 --- a/src/hmac/index-browser.js +++ b/src/hmac/index-browser.js @@ -12,7 +12,7 @@ const hashTypes = { } const sign = (key, data, cb) => { - nodeify(crypto.subtle.sign({name: 'HMAC'}, key, data) + nodeify(crypto.subtle.sign({ name: 'HMAC' }, key, data) .then((raw) => Buffer.from(raw)), cb) } @@ -24,7 +24,7 @@ exports.create = function (hashType, secret, callback) { secret, { name: 'HMAC', - hash: {name: hash} + hash: { name: hash } }, false, ['sign'] diff --git a/src/hmac/index.js b/src/hmac/index.js index 095222c..61b61b1 100644 --- a/src/hmac/index.js +++ b/src/hmac/index.js @@ -2,6 +2,7 @@ const crypto = require('crypto') const lengths = require('./lengths') +const nextTick = require('async/nextTick') exports.create = function (hash, secret, callback) { const res = { @@ -10,7 +11,9 @@ exports.create = function (hash, secret, callback) { hmac.update(data) - cb(null, hmac.digest()) + nextTick(() => { + cb(null, hmac.digest()) + }) }, length: lengths[hash] } diff --git a/src/keys/ecdh.js b/src/keys/ecdh.js index 5a779ed..b0fda09 100644 --- a/src/keys/ecdh.js +++ b/src/keys/ecdh.js @@ -1,7 +1,7 @@ 'use strict' const crypto = require('crypto') -const setImmediate = require('async/setImmediate') +const nextTick = require('async/nextTick') const curves = { 'P-256': 'prime256v1', @@ -16,7 +16,7 @@ exports.generateEphmeralKeyPair = function (curve, callback) { const ecdh = crypto.createECDH(curves[curve]) ecdh.generateKeys() - setImmediate(() => callback(null, { + nextTick(() => callback(null, { key: ecdh.getPublicKey(), genSharedKey (theirPub, forcePrivate, cb) { if (typeof forcePrivate === 'function') { @@ -35,7 +35,7 @@ exports.generateEphmeralKeyPair = function (curve, callback) { return cb(err) } - setImmediate(() => cb(null, secret)) + nextTick(() => cb(null, secret)) } })) } diff --git a/src/keys/ed25519.js b/src/keys/ed25519.js index e197730..a01f157 100644 --- a/src/keys/ed25519.js +++ b/src/keys/ed25519.js @@ -1,13 +1,13 @@ 'use strict' const nacl = require('tweetnacl') -const setImmediate = require('async/setImmediate') +const nextTick = require('async/nextTick') exports.publicKeyLength = nacl.sign.publicKeyLength exports.privateKeyLength = nacl.sign.secretKeyLength exports.generateKey = function (callback) { - setImmediate(() => { + nextTick(() => { let result try { result = nacl.sign.keyPair() @@ -20,7 +20,7 @@ exports.generateKey = function (callback) { // seed should be a 32 byte uint8array exports.generateKeyFromSeed = function (seed, callback) { - setImmediate(() => { + nextTick(() => { let result try { result = nacl.sign.keyPair.fromSeed(seed) @@ -32,13 +32,13 @@ exports.generateKeyFromSeed = function (seed, callback) { } exports.hashAndSign = function (key, msg, callback) { - setImmediate(() => { + nextTick(() => { callback(null, Buffer.from(nacl.sign.detached(msg, key))) }) } exports.hashAndVerify = function (key, sig, msg, callback) { - setImmediate(() => { + nextTick(() => { let result try { result = nacl.sign.detached.verify(msg, sig, key) diff --git a/src/keys/rsa-browser.js b/src/keys/rsa-browser.js index d23bd0b..e14ea96 100644 --- a/src/keys/rsa-browser.js +++ b/src/keys/rsa-browser.js @@ -12,7 +12,7 @@ exports.generateKey = function (bits, callback) { name: 'RSASSA-PKCS1-v1_5', modulusLength: bits, publicExponent: new Uint8Array([0x01, 0x00, 0x01]), - hash: {name: 'SHA-256'} + hash: { name: 'SHA-256' } }, true, ['sign', 'verify'] @@ -31,7 +31,7 @@ exports.unmarshalPrivateKey = function (key, callback) { key, { name: 'RSASSA-PKCS1-v1_5', - hash: {name: 'SHA-256'} + hash: { name: 'SHA-256' } }, true, ['sign'] @@ -59,13 +59,13 @@ exports.hashAndSign = function (key, msg, callback) { key, { name: 'RSASSA-PKCS1-v1_5', - hash: {name: 'SHA-256'} + hash: { name: 'SHA-256' } }, false, ['sign'] ).then((privateKey) => { return webcrypto.subtle.sign( - {name: 'RSASSA-PKCS1-v1_5'}, + { name: 'RSASSA-PKCS1-v1_5' }, privateKey, Uint8Array.from(msg) ) @@ -78,13 +78,13 @@ exports.hashAndVerify = function (key, sig, msg, callback) { key, { name: 'RSASSA-PKCS1-v1_5', - hash: {name: 'SHA-256'} + hash: { name: 'SHA-256' } }, false, ['verify'] ).then((publicKey) => { return webcrypto.subtle.verify( - {name: 'RSASSA-PKCS1-v1_5'}, + { name: 'RSASSA-PKCS1-v1_5' }, publicKey, sig, msg @@ -109,7 +109,7 @@ function derivePublicFromPrivate (jwKey) { }, { name: 'RSASSA-PKCS1-v1_5', - hash: {name: 'SHA-256'} + hash: { name: 'SHA-256' } }, true, ['verify'] diff --git a/src/keys/rsa-class.js b/src/keys/rsa-class.js index afaea88..46c245e 100644 --- a/src/keys/rsa-class.js +++ b/src/keys/rsa-class.js @@ -3,11 +3,11 @@ const multihashing = require('multihashing-async') const protobuf = require('protons') const bs58 = require('bs58') +const nextTick = require('async/nextTick') const crypto = require('./rsa') const pbm = protobuf(require('./keys.proto')) const forge = require('node-forge') -const setImmediate = require('async/setImmediate') class RsaPublicKey { constructor (key) { @@ -129,7 +129,7 @@ class RsaPrivateKey { ensure(callback) - setImmediate(() => { + nextTick(() => { let err = null let pem = null try { diff --git a/src/keys/rsa.js b/src/keys/rsa.js index d8bd9bc..0137135 100644 --- a/src/keys/rsa.js +++ b/src/keys/rsa.js @@ -1,6 +1,8 @@ 'use strict' const crypto = require('crypto') +const nextTick = require('async/nextTick') + let keypair try { if (process.env.LP2P_FORCE_CRYPTO_LIB === 'keypair') { @@ -8,7 +10,7 @@ try { } const ursa = require('ursa-optional') // throws if not compiled - keypair = ({bits}) => { + keypair = ({ bits }) => { const key = ursa.generatePrivateKey(bits) return { private: key.toPrivatePem(), @@ -22,14 +24,13 @@ try { keypair = require('keypair') } -const setImmediate = require('async/setImmediate') const pemToJwk = require('pem-jwk').pem2jwk const jwkToPem = require('pem-jwk').jwk2pem exports.utils = require('./rsa-utils') exports.generateKey = function (bits, callback) { - setImmediate(() => { + nextTick(() => { let result try { const key = keypair({ bits: bits }) @@ -47,7 +48,7 @@ exports.generateKey = function (bits, callback) { // Takes a jwk key exports.unmarshalPrivateKey = function (key, callback) { - setImmediate(() => { + nextTick(() => { if (!key) { return callback(new Error('Key is invalid')) } @@ -67,7 +68,7 @@ exports.getRandomValues = function (arr) { } exports.hashAndSign = function (key, msg, callback) { - setImmediate(() => { + nextTick(() => { let result try { const sign = crypto.createSign('RSA-SHA256') @@ -83,7 +84,7 @@ exports.hashAndSign = function (key, msg, callback) { } exports.hashAndVerify = function (key, sig, msg, callback) { - setImmediate(() => { + nextTick(() => { let result try { const verify = crypto.createVerify('RSA-SHA256')