Skip to content

Commit 9f939f5

Browse files
authored
crypto: reject Ed25519/Ed448 in Sign/Verify prototypes
fixes: #52097 PR-URL: #52340 Fixes: #52097 Reviewed-By: Tobias Nießen <[email protected]> Reviewed-By: Antoine du Hamel <[email protected]> Reviewed-By: Luigi Pinca <[email protected]>
1 parent 128c60d commit 9f939f5

File tree

2 files changed

+30
-0
lines changed

2 files changed

+30
-0
lines changed

src/crypto/crypto_sig.cc

+10
Original file line numberDiff line numberDiff line change
@@ -423,6 +423,11 @@ void Sign::SignFinal(const FunctionCallbackInfo<Value>& args) {
423423
if (!key)
424424
return;
425425

426+
if (IsOneShot(key)) {
427+
THROW_ERR_CRYPTO_UNSUPPORTED_OPERATION(env);
428+
return;
429+
}
430+
426431
int padding = GetDefaultSignPadding(key);
427432
if (!args[offset]->IsUndefined()) {
428433
CHECK(args[offset]->IsInt32());
@@ -548,6 +553,11 @@ void Verify::VerifyFinal(const FunctionCallbackInfo<Value>& args) {
548553
if (!pkey)
549554
return;
550555

556+
if (IsOneShot(pkey)) {
557+
THROW_ERR_CRYPTO_UNSUPPORTED_OPERATION(env);
558+
return;
559+
}
560+
551561
ArrayBufferOrViewContents<char> hbuf(args[offset]);
552562
if (UNLIKELY(!hbuf.CheckSizeInt32()))
553563
return THROW_ERR_OUT_OF_RANGE(env, "buffer is too big");

test/parallel/test-crypto-sign-verify.js

+20
Original file line numberDiff line numberDiff line change
@@ -773,3 +773,23 @@ assert.throws(
773773
}, { code: 'ERR_INVALID_ARG_TYPE', message: /The "key\.key" property must be of type object/ });
774774
}
775775
}
776+
777+
{
778+
// Ed25519 and Ed448 must use the one-shot methods
779+
const keys = [{ privateKey: fixtures.readKey('ed25519_private.pem', 'ascii'),
780+
publicKey: fixtures.readKey('ed25519_public.pem', 'ascii') },
781+
{ privateKey: fixtures.readKey('ed448_private.pem', 'ascii'),
782+
publicKey: fixtures.readKey('ed448_public.pem', 'ascii') }];
783+
784+
for (const { publicKey, privateKey } of keys) {
785+
assert.throws(() => {
786+
crypto.createSign('SHA256').update('Test123').sign(privateKey);
787+
}, { code: 'ERR_CRYPTO_UNSUPPORTED_OPERATION', message: 'Unsupported crypto operation' });
788+
assert.throws(() => {
789+
crypto.createVerify('SHA256').update('Test123').verify(privateKey, 'sig');
790+
}, { code: 'ERR_CRYPTO_UNSUPPORTED_OPERATION', message: 'Unsupported crypto operation' });
791+
assert.throws(() => {
792+
crypto.createVerify('SHA256').update('Test123').verify(publicKey, 'sig');
793+
}, { code: 'ERR_CRYPTO_UNSUPPORTED_OPERATION', message: 'Unsupported crypto operation' });
794+
}
795+
}

0 commit comments

Comments
 (0)