Skip to content

Commit ce3e203

Browse files
committed
crypto: reject unintended raw key format string input
Signed-off-by: Filip Skokan <[email protected]>
1 parent 21436f0 commit ce3e203

2 files changed

Lines changed: 45 additions & 1 deletion

File tree

lib/internal/crypto/keys.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -659,7 +659,7 @@ function prepareAsymmetricKey(key, ctx, name = 'key') {
659659
return { data, format: kKeyFormatJWK };
660660
} else if (format === 'raw-public' || format === 'raw-private' ||
661661
format === 'raw-seed') {
662-
if (!isStringOrBuffer(data)) {
662+
if (!isArrayBufferView(data) && !isAnyArrayBuffer(data)) {
663663
throw new ERR_INVALID_ARG_TYPE(
664664
`${name}.key`,
665665
['ArrayBuffer', 'Buffer', 'TypedArray', 'DataView'],

test/parallel/test-crypto-key-objects-raw.js

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,50 @@ const { hasOpenSSL } = require('../common/crypto');
3232
}
3333
}
3434

35+
// Raw key imports do not support strings.
36+
{
37+
const pubKeyObj = crypto.createPublicKey(
38+
fixtures.readKey('ed25519_public.pem', 'ascii'));
39+
const privKeyObj = crypto.createPrivateKey(
40+
fixtures.readKey('ed25519_private.pem', 'ascii'));
41+
42+
const rawPub = pubKeyObj.export({ format: 'raw-public' });
43+
const rawPriv = privKeyObj.export({ format: 'raw-private' });
44+
45+
for (const encoding of ['hex', 'base64']) {
46+
assert.throws(() => crypto.createPublicKey({
47+
key: rawPub.toString(encoding),
48+
encoding,
49+
format: 'raw-public',
50+
asymmetricKeyType: 'ed25519',
51+
}), { code: 'ERR_INVALID_ARG_TYPE' });
52+
53+
assert.throws(() => crypto.createPrivateKey({
54+
key: rawPriv.toString(encoding),
55+
encoding,
56+
format: 'raw-private',
57+
asymmetricKeyType: 'ed25519',
58+
}), { code: 'ERR_INVALID_ARG_TYPE' });
59+
}
60+
}
61+
62+
// Raw seed imports do not support strings.
63+
if (hasOpenSSL(3, 5)) {
64+
const privKeyObj = crypto.createPrivateKey(
65+
fixtures.readKey('ml_dsa_44_private.pem', 'ascii'));
66+
67+
const rawSeed = privKeyObj.export({ format: 'raw-seed' });
68+
69+
for (const encoding of ['hex', 'base64']) {
70+
assert.throws(() => crypto.createPrivateKey({
71+
key: rawSeed.toString(encoding),
72+
encoding,
73+
format: 'raw-seed',
74+
asymmetricKeyType: 'ml-dsa-44',
75+
}), { code: 'ERR_INVALID_ARG_TYPE' });
76+
}
77+
}
78+
3579
// Key types that don't support raw-* formats
3680
{
3781
for (const [type, pub, priv] of [

0 commit comments

Comments
 (0)