Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nodejs/node.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJames M Snell <jasnell@gmail.com>2020-08-25 20:05:51 +0300
committerJames M Snell <jasnell@gmail.com>2020-10-08 03:27:05 +0300
commitdae283d96fd31ad0f30840a7e55ac97294f505ac (patch)
tree8f7f87e50411e8965cb83d9b280035f36d355fbc /benchmark
parentba77dc8597cbcf42feea59f1381512d421ec9cc5 (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.js44
-rw-r--r--benchmark/crypto/keygen.js71
-rw-r--r--benchmark/crypto/webcrypto-digest.js58
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);
+ }
+}