-
Notifications
You must be signed in to change notification settings - Fork 29.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
crypto: refactoring internals, add WebCrypto
Fixes: #678 Refs: #26854 Signed-off-by: James M Snell <[email protected]> PR-URL: #35093 Reviewed-By: Matteo Collina <[email protected]> Reviewed-By: Anna Henningsen <[email protected]> Reviewed-By: Michaël Zasso <[email protected]> Reviewed-By: Rich Trott <[email protected]>
- Loading branch information
Showing
149 changed files
with
28,390 additions
and
8,575 deletions.
There are no files selected for viewing
Validating CODEOWNERS rules …
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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); | ||
} | ||
} |
Oops, something went wrong.