Skip to content

Commit 6b1fa58

Browse files
committed
fixup! crypto: add raw key formats support to the KeyObject APIs
1 parent 5a84bc9 commit 6b1fa58

File tree

3 files changed

+37
-51
lines changed

3 files changed

+37
-51
lines changed

lib/internal/crypto/keys.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -395,6 +395,10 @@ const {
395395
return this[kHandle].rawPrivateKey();
396396
}
397397
case 'raw-seed':
398+
if (!hasPqcSupport) {
399+
throw new ERR_CRYPTO_INCOMPATIBLE_KEY_OPTIONS(
400+
'raw-seed', 'is not supported');
401+
}
398402
return this[kHandle].rawSeed();
399403
default: {
400404
const {

src/crypto/crypto_keys.cc

Lines changed: 32 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -279,57 +279,39 @@ bool ExportJWKInner(Environment* env,
279279
}
280280

281281
int GetNidFromName(const char* name) {
282-
int nid;
283-
if (OPENSSL_strcasecmp(name, "Ed25519") == 0) {
284-
nid = EVP_PKEY_ED25519;
285-
} else if (OPENSSL_strcasecmp(name, "Ed448") == 0) {
286-
nid = EVP_PKEY_ED448;
287-
} else if (OPENSSL_strcasecmp(name, "X25519") == 0) {
288-
nid = EVP_PKEY_X25519;
289-
} else if (OPENSSL_strcasecmp(name, "X448") == 0) {
290-
nid = EVP_PKEY_X448;
282+
static constexpr struct {
283+
const char* name;
284+
int nid;
285+
} kNameToNid[] = {
286+
{"Ed25519", EVP_PKEY_ED25519},
287+
{"Ed448", EVP_PKEY_ED448},
288+
{"X25519", EVP_PKEY_X25519},
289+
{"X448", EVP_PKEY_X448},
291290
#if OPENSSL_WITH_PQC
292-
} else if (OPENSSL_strcasecmp(name, "ML-DSA-44") == 0) {
293-
nid = EVP_PKEY_ML_DSA_44;
294-
} else if (OPENSSL_strcasecmp(name, "ML-DSA-65") == 0) {
295-
nid = EVP_PKEY_ML_DSA_65;
296-
} else if (OPENSSL_strcasecmp(name, "ML-DSA-87") == 0) {
297-
nid = EVP_PKEY_ML_DSA_87;
298-
} else if (OPENSSL_strcasecmp(name, "ML-KEM-512") == 0) {
299-
nid = EVP_PKEY_ML_KEM_512;
300-
} else if (OPENSSL_strcasecmp(name, "ML-KEM-768") == 0) {
301-
nid = EVP_PKEY_ML_KEM_768;
302-
} else if (OPENSSL_strcasecmp(name, "ML-KEM-1024") == 0) {
303-
nid = EVP_PKEY_ML_KEM_1024;
304-
} else if (OPENSSL_strcasecmp(name, "SLH-DSA-SHA2-128f") == 0) {
305-
nid = EVP_PKEY_SLH_DSA_SHA2_128F;
306-
} else if (OPENSSL_strcasecmp(name, "SLH-DSA-SHA2-128s") == 0) {
307-
nid = EVP_PKEY_SLH_DSA_SHA2_128S;
308-
} else if (OPENSSL_strcasecmp(name, "SLH-DSA-SHA2-192f") == 0) {
309-
nid = EVP_PKEY_SLH_DSA_SHA2_192F;
310-
} else if (OPENSSL_strcasecmp(name, "SLH-DSA-SHA2-192s") == 0) {
311-
nid = EVP_PKEY_SLH_DSA_SHA2_192S;
312-
} else if (OPENSSL_strcasecmp(name, "SLH-DSA-SHA2-256f") == 0) {
313-
nid = EVP_PKEY_SLH_DSA_SHA2_256F;
314-
} else if (OPENSSL_strcasecmp(name, "SLH-DSA-SHA2-256s") == 0) {
315-
nid = EVP_PKEY_SLH_DSA_SHA2_256S;
316-
} else if (OPENSSL_strcasecmp(name, "SLH-DSA-SHAKE-128f") == 0) {
317-
nid = EVP_PKEY_SLH_DSA_SHAKE_128F;
318-
} else if (OPENSSL_strcasecmp(name, "SLH-DSA-SHAKE-128s") == 0) {
319-
nid = EVP_PKEY_SLH_DSA_SHAKE_128S;
320-
} else if (OPENSSL_strcasecmp(name, "SLH-DSA-SHAKE-192f") == 0) {
321-
nid = EVP_PKEY_SLH_DSA_SHAKE_192F;
322-
} else if (OPENSSL_strcasecmp(name, "SLH-DSA-SHAKE-192s") == 0) {
323-
nid = EVP_PKEY_SLH_DSA_SHAKE_192S;
324-
} else if (OPENSSL_strcasecmp(name, "SLH-DSA-SHAKE-256f") == 0) {
325-
nid = EVP_PKEY_SLH_DSA_SHAKE_256F;
326-
} else if (OPENSSL_strcasecmp(name, "SLH-DSA-SHAKE-256s") == 0) {
327-
nid = EVP_PKEY_SLH_DSA_SHAKE_256S;
291+
{"ML-DSA-44", EVP_PKEY_ML_DSA_44},
292+
{"ML-DSA-65", EVP_PKEY_ML_DSA_65},
293+
{"ML-DSA-87", EVP_PKEY_ML_DSA_87},
294+
{"ML-KEM-512", EVP_PKEY_ML_KEM_512},
295+
{"ML-KEM-768", EVP_PKEY_ML_KEM_768},
296+
{"ML-KEM-1024", EVP_PKEY_ML_KEM_1024},
297+
{"SLH-DSA-SHA2-128f", EVP_PKEY_SLH_DSA_SHA2_128F},
298+
{"SLH-DSA-SHA2-128s", EVP_PKEY_SLH_DSA_SHA2_128S},
299+
{"SLH-DSA-SHA2-192f", EVP_PKEY_SLH_DSA_SHA2_192F},
300+
{"SLH-DSA-SHA2-192s", EVP_PKEY_SLH_DSA_SHA2_192S},
301+
{"SLH-DSA-SHA2-256f", EVP_PKEY_SLH_DSA_SHA2_256F},
302+
{"SLH-DSA-SHA2-256s", EVP_PKEY_SLH_DSA_SHA2_256S},
303+
{"SLH-DSA-SHAKE-128f", EVP_PKEY_SLH_DSA_SHAKE_128F},
304+
{"SLH-DSA-SHAKE-128s", EVP_PKEY_SLH_DSA_SHAKE_128S},
305+
{"SLH-DSA-SHAKE-192f", EVP_PKEY_SLH_DSA_SHAKE_192F},
306+
{"SLH-DSA-SHAKE-192s", EVP_PKEY_SLH_DSA_SHAKE_192S},
307+
{"SLH-DSA-SHAKE-256f", EVP_PKEY_SLH_DSA_SHAKE_256F},
308+
{"SLH-DSA-SHAKE-256s", EVP_PKEY_SLH_DSA_SHAKE_256S},
328309
#endif
329-
} else {
330-
nid = NID_undef;
310+
};
311+
for (const auto& entry : kNameToNid) {
312+
if (StringEqualNoCase(name, entry.name)) return entry.nid;
331313
}
332-
return nid;
314+
return NID_undef;
333315
}
334316
} // namespace
335317

@@ -885,7 +867,7 @@ void KeyObjectHandle::InitEDRaw(const FunctionCallbackInfo<Value>& args) {
885867
break;
886868
}
887869
default:
888-
UNREACHABLE();
870+
return args.GetReturnValue().Set(false);
889871
}
890872

891873
args.GetReturnValue().Set(true);
@@ -936,7 +918,7 @@ void KeyObjectHandle::InitPqcRaw(const FunctionCallbackInfo<Value>& args) {
936918
: EVPKeyPointer::NewRawPublic;
937919
break;
938920
default:
939-
UNREACHABLE();
921+
return args.GetReturnValue().Set(false);
940922
}
941923

942924
auto pkey = fn(id,

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,7 @@ if (hasOpenSSL(3, 5)) {
217217
}), { code: 'ERR_CRYPTO_INCOMPATIBLE_KEY_OPTIONS' });
218218
}
219219

220-
// raw-seed cannot be used for slh-dsa, ec, and the montgomery curves
220+
// raw-seed export is rejected for key types that do not support seeds
221221
{
222222
const ecPriv = crypto.createPrivateKey(
223223
fixtures.readKey('ec_p256_private.pem', 'ascii'));

0 commit comments

Comments
 (0)