Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions doc/api/crypto.md
Original file line number Diff line number Diff line change
Expand Up @@ -6132,7 +6132,7 @@ changes:
<!--lint disable maximum-line-length remark-lint-->

* `algorithm` {string | null | undefined}
* `data` {ArrayBuffer|Buffer|TypedArray|DataView}
* `data` {ArrayBuffer|Buffer|SharedArrayBuffer|TypedArray|DataView|string}
* `key` {Object|string|ArrayBuffer|Buffer|TypedArray|DataView|KeyObject|CryptoKey}
* `callback` {Function}
* `err` {Error}
Expand Down Expand Up @@ -6264,9 +6264,9 @@ changes:
<!--lint disable maximum-line-length remark-lint-->

* `algorithm` {string|null|undefined}
* `data` {ArrayBuffer| Buffer|TypedArray|DataView}
* `data` {ArrayBuffer|Buffer|SharedArrayBuffer|TypedArray|DataView|string}
* `key` {Object|string|ArrayBuffer|Buffer|TypedArray|DataView|KeyObject|CryptoKey}
* `signature` {ArrayBuffer|Buffer|TypedArray|DataView}
* `signature` {ArrayBuffer|Buffer|SharedArrayBuffer|TypedArray|DataView}
* `callback` {Function}
* `err` {Error}
* `result` {boolean}
Expand Down
16 changes: 1 addition & 15 deletions lib/internal/crypto/sig.js
Original file line number Diff line number Diff line change
Expand Up @@ -265,14 +265,6 @@ function verifyOneShot(algorithm, data, key, signature, callback) {

data = getArrayBufferOrView(data, 'data');

if (!isArrayBufferView(data)) {
throw new ERR_INVALID_ARG_TYPE(
'data',
['Buffer', 'TypedArray', 'DataView'],
data,
);
}

// Options specific to RSA
const rsaPadding = getPadding(key);
const pssSaltLength = getSaltLength(key);
Expand All @@ -283,13 +275,7 @@ function verifyOneShot(algorithm, data, key, signature, callback) {
// Options specific to Ed448 and ML-DSA
const context = getContext(key);

if (!isArrayBufferView(signature)) {
throw new ERR_INVALID_ARG_TYPE(
'signature',
['Buffer', 'TypedArray', 'DataView'],
signature,
);
}
signature = getArrayBufferOrView(signature, 'signature');

const {
data: keyData,
Expand Down
40 changes: 38 additions & 2 deletions test/parallel/test-crypto-sign-verify.js
Original file line number Diff line number Diff line change
Expand Up @@ -619,8 +619,8 @@ if (hasOpenSSL(3, 2)) {
assert.throws(() => crypto.sign(null, data, input), errObj);
assert.throws(() => crypto.verify(null, data, input, sig), errObj);

errObj.message = 'The "signature" argument must be an instance of ' +
'Buffer, TypedArray, or DataView.' +
errObj.message = 'The "signature" argument must be of type string or an instance of ' +
'ArrayBuffer, Buffer, TypedArray, or DataView.' +
common.invalidArgTypeHelper(input);
assert.throws(() => crypto.verify(null, data, 'test', input), errObj);
});
Expand Down Expand Up @@ -1019,3 +1019,39 @@ if (!process.features.openssl_is_boringssl) {
message: /key\.format/,
});
}

// crypto.verify accepts ArrayBuffer and SharedArrayBuffer for data and signature
{
const { privateKey, publicKey } = crypto.generateKeyPairSync('rsa', { modulusLength: 2048 });
const dataBuffer = Buffer.from('Hello world');

// Data as ArrayBuffer
{
const ab = dataBuffer.buffer.slice(dataBuffer.byteOffset, dataBuffer.byteOffset + dataBuffer.byteLength);
const sig = crypto.sign('SHA256', dataBuffer, privateKey);
assert.strictEqual(crypto.verify('SHA256', ab, publicKey, sig), true);
}

// Data as SharedArrayBuffer
{
const sab = new SharedArrayBuffer(dataBuffer.length);
new Uint8Array(sab).set(dataBuffer);
const sig = crypto.sign('SHA256', dataBuffer, privateKey);
assert.strictEqual(crypto.verify('SHA256', sab, publicKey, sig), true);
}

// Signature as ArrayBuffer
{
const sig = crypto.sign('SHA256', dataBuffer, privateKey);
const sigAB = sig.buffer.slice(sig.byteOffset, sig.byteOffset + sig.byteLength);
assert.strictEqual(crypto.verify('SHA256', dataBuffer, publicKey, sigAB), true);
}

// Signature as SharedArrayBuffer
{
const sig = crypto.sign('SHA256', dataBuffer, privateKey);
const sigSAB = new SharedArrayBuffer(sig.length);
new Uint8Array(sigSAB).set(sig);
assert.strictEqual(crypto.verify('SHA256', dataBuffer, publicKey, sigSAB), true);
}
}
Loading