diff options
author | James M Snell <jasnell@gmail.com> | 2020-08-25 20:05:51 +0300 |
---|---|---|
committer | James M Snell <jasnell@gmail.com> | 2020-10-08 03:27:05 +0300 |
commit | dae283d96fd31ad0f30840a7e55ac97294f505ac (patch) | |
tree | 8f7f87e50411e8965cb83d9b280035f36d355fbc /benchmark | |
parent | ba77dc8597cbcf42feea59f1381512d421ec9cc5 (diff) |
crypto: refactoring internals, add WebCrypto
Fixes: https://github.com/nodejs/node/issues/678
Refs: https://github.com/nodejs/node/issues/26854
Signed-off-by: James M Snell <jasnell@gmail.com>
PR-URL: https://github.com/nodejs/node/pull/35093
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: Michaƫl Zasso <targos@protonmail.com>
Reviewed-By: Rich Trott <rtrott@gmail.com>
Diffstat (limited to 'benchmark')
-rw-r--r-- | benchmark/crypto/hkdf.js | 44 | ||||
-rw-r--r-- | benchmark/crypto/keygen.js | 71 | ||||
-rw-r--r-- | benchmark/crypto/webcrypto-digest.js | 58 |
3 files changed, 173 insertions, 0 deletions
diff --git a/benchmark/crypto/hkdf.js b/benchmark/crypto/hkdf.js new file mode 100644 index 00000000000..4be15ab5907 --- /dev/null +++ b/benchmark/crypto/hkdf.js @@ -0,0 +1,44 @@ +'use strict'; + +const common = require('../common.js'); +const assert = require('assert'); +const { + hkdf, + hkdfSync +} = require('crypto'); + +const bench = common.createBenchmark(main, { + sync: [0, 1], + size: [10, 64, 1024], + key: ['a', 'secret', 'this-is-a-much-longer-secret'], + salt: ['', 'salt'], + info: ['', 'info'], + hash: ['sha256', 'sha512'], + n: [1e3], +}); + +function measureSync(n, size, salt, info, hash, key) { + bench.start(); + for (let i = 0; i < n; ++i) + hkdfSync(hash, key, salt, info, size); + bench.end(n); +} + +function measureAsync(n, size, salt, info, hash, key) { + let remaining = n; + function done(err) { + assert.ifError(err); + if (--remaining === 0) + bench.end(n); + } + bench.start(); + for (let i = 0; i < n; ++i) + hkdf(hash, key, salt, info, size, done); +} + +function main({ n, sync, size, salt, info, hash, key }) { + if (sync) + measureSync(n, size, salt, info, hash, key); + else + measureAsync(n, size, salt, info, hash, key); +} diff --git a/benchmark/crypto/keygen.js b/benchmark/crypto/keygen.js new file mode 100644 index 00000000000..e055a02cd2b --- /dev/null +++ b/benchmark/crypto/keygen.js @@ -0,0 +1,71 @@ +'use strict'; + +const common = require('../common.js'); +const assert = require('assert'); +const { + generateKeyPair, + generateKeyPairSync +} = require('crypto'); + +const bench = common.createBenchmark(main, { + method: ['rsaSync', 'rsaAsync', 'dsaSync', 'dsaAsync'], + n: [1e2], +}); + +const methods = { + rsaSync(n) { + bench.start(); + for (let i = 0; i < n; ++i) { + generateKeyPairSync('rsa', { + modulusLength: 1024, + publicExponent: 0x10001 + }); + } + bench.end(n); + }, + + rsaAsync(n) { + let remaining = n; + function done(err) { + assert.ifError(err); + if (--remaining === 0) + bench.end(n); + } + bench.start(); + for (let i = 0; i < n; ++i) + generateKeyPair('rsa', { + modulusLength: 512, + publicExponent: 0x10001 + }, done); + }, + + dsaSync(n) { + bench.start(); + for (let i = 0; i < n; ++i) { + generateKeyPairSync('dsa', { + modulusLength: 512, + divisorLength: 256, + }); + } + bench.end(n); + }, + + dsaAsync(n) { + let remaining = n; + function done(err) { + assert.ifError(err); + if (--remaining === 0) + bench.end(n); + } + bench.start(); + for (let i = 0; i < n; ++i) + generateKeyPair('dsa', { + modulusLength: 512, + divisorLength: 256, + }, done); + }, +}; + +function main({ n, method }) { + methods[method](n); +} diff --git a/benchmark/crypto/webcrypto-digest.js b/benchmark/crypto/webcrypto-digest.js new file mode 100644 index 00000000000..2d95f868f66 --- /dev/null +++ b/benchmark/crypto/webcrypto-digest.js @@ -0,0 +1,58 @@ +'use strict'; + +const common = require('../common.js'); +const { + createHash, + webcrypto: { + subtle, + getRandomValues + } +} = require('crypto'); + +const bench = common.createBenchmark(main, { + sync: ['createHash', 'subtle'], + data: [10, 20, 50, 100], + method: ['SHA-1', 'SHA-256', 'SHA-384', 'SHA-512'], + n: [1e3], +}); + +const kMethods = { + 'SHA-1': 'sha1', + 'SHA-256': 'sha256', + 'SHA-384': 'sha384', + 'SHA-512': 'sha512' +}; + +// This benchmark only looks at clock time and ignores factors +// such as event loop delay, event loop utilization, and memory. +// As such, it is expected that the synchronous legacy method +// will always be faster in clock time. + +function measureLegacy(n, data, method) { + method = kMethods[method]; + bench.start(); + for (let i = 0; i < n; ++i) { + createHash(method).update(data).digest(); + } + bench.end(n); +} + +function measureSubtle(n, data, method) { + const ec = new TextEncoder(); + data = ec.encode(data); + const jobs = new Array(n); + bench.start(); + for (let i = 0; i < n; i++) + jobs[i] = subtle.digest(method, data); + Promise.all(jobs).then(() => bench.end(n)).catch((err) => { + process.nextTick(() => { throw err; }); + }); +} + +function main({ n, sync, data, method }) { + data = getRandomValues(Buffer.alloc(data)); + switch (sync) { + case 'createHash': return measureLegacy(n, data, method); + case 'subtle': return measureSubtle(n, data, method); + } +} |