Skip to content

Commit ac260a8

Browse files
committed
benchmark: refactor crypto oneshot
1 parent 847b9e0 commit ac260a8

File tree

3 files changed

+280
-141
lines changed

3 files changed

+280
-141
lines changed

benchmark/crypto/oneshot-sign-verify.js

Lines changed: 0 additions & 141 deletions
This file was deleted.

benchmark/crypto/oneshot-sign.js

Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
'use strict';
2+
3+
const common = require('../common.js');
4+
const crypto = require('crypto');
5+
const fs = require('fs');
6+
const path = require('path');
7+
const fixtures_keydir = path.resolve(__dirname, '../../test/fixtures/keys/');
8+
9+
const keyFixtures = {
10+
ec: fs.readFileSync(`${fixtures_keydir}/ec_p256_private.pem`).toString(),
11+
rsa: fs.readFileSync(`${fixtures_keydir}/rsa_private_2048.pem`).toString(),
12+
ed25519: fs.readFileSync(`${fixtures_keydir}/ed25519_private.pem`).toString(),
13+
};
14+
15+
const data = crypto.randomBytes(256);
16+
17+
let pems;
18+
let keyObjects;
19+
20+
const bench = common.createBenchmark(main, {
21+
keyType: ['rsa', 'ec', 'ed25519'],
22+
mode: ['sync', 'async', 'async-parallel'],
23+
keyFormat: ['pem', 'der', 'jwk', 'keyObject', 'keyObject.unique'],
24+
n: [1e3],
25+
});
26+
27+
function measureSync(n, digest, privateKey, keys) {
28+
bench.start();
29+
for (let i = 0; i < n; ++i) {
30+
crypto.sign(
31+
digest,
32+
data,
33+
privateKey || keys[i]);
34+
}
35+
bench.end(n);
36+
}
37+
38+
function measureAsync(n, digest, privateKey, keys) {
39+
let remaining = n;
40+
function done() {
41+
if (--remaining === 0)
42+
bench.end(n);
43+
else
44+
one();
45+
}
46+
47+
function one() {
48+
crypto.sign(
49+
digest,
50+
data,
51+
privateKey || keys[n - remaining],
52+
done);
53+
}
54+
bench.start();
55+
one();
56+
}
57+
58+
function measureAsyncParallel(n, digest, privateKey, keys) {
59+
let remaining = n;
60+
function done() {
61+
if (--remaining === 0)
62+
bench.end(n);
63+
}
64+
bench.start();
65+
for (let i = 0; i < n; ++i) {
66+
crypto.sign(
67+
digest,
68+
data,
69+
privateKey || keys[i],
70+
done);
71+
}
72+
}
73+
74+
function main({ n, mode, keyFormat, keyType }) {
75+
// "keyObject.unique" allow to compare the result with "keyObject" to
76+
// assess whether mutexes over the key material impact the operation
77+
if (keyFormat === 'keyObject.unique' && mode !== 'async-parallel') {
78+
return;
79+
}
80+
81+
pems ||= [...Buffer.alloc(n)].map(() => keyFixtures[keyType]);
82+
keyObjects ||= pems.map(crypto.createPrivateKey);
83+
84+
let privateKey, keys, digest;
85+
86+
switch (keyType) {
87+
case 'rsa':
88+
case 'ec':
89+
digest = 'sha256';
90+
break;
91+
case 'ed25519':
92+
break;
93+
default:
94+
throw new Error('not implemented');
95+
}
96+
97+
switch (keyFormat) {
98+
case 'keyObject':
99+
privateKey = keyObjects[0];
100+
break;
101+
case 'pem':
102+
privateKey = pems[0];
103+
break;
104+
case 'jwk': {
105+
privateKey = { key: keyObjects[0].export({ format: 'jwk' }), format: 'jwk' };
106+
break;
107+
}
108+
case 'der': {
109+
privateKey = { key: keyObjects[0].export({ format: 'der', type: 'pkcs8' }), format: 'der', type: 'pkcs8' };
110+
break;
111+
}
112+
case 'keyObject.unique':
113+
keys = keyObjects;
114+
break;
115+
default:
116+
throw new Error('not implemented');
117+
}
118+
119+
switch (mode) {
120+
case 'sync':
121+
measureSync(n, digest, privateKey, keys);
122+
break;
123+
case 'async':
124+
measureAsync(n, digest, privateKey, keys);
125+
break;
126+
case 'async-parallel':
127+
measureAsyncParallel(n, digest, privateKey, keys);
128+
break;
129+
}
130+
}

0 commit comments

Comments
 (0)