Skip to content

Commit 12fa716

Browse files
panvaRafaelGSS
authored andcommitted
benchmark: refactor crypto oneshot
PR-URL: #48267 Reviewed-By: Tobias Nießen <tniessen@tnie.de> Reviewed-By: Yagiz Nizipli <yagiz@nizipli.com>
1 parent f60205c commit 12fa716

3 files changed

Lines changed: 282 additions & 141 deletions

File tree

‎benchmark/crypto/oneshot-sign-verify.js‎

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

‎benchmark/crypto/oneshot-sign.js‎

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

0 commit comments

Comments
 (0)