@@ -287,6 +287,85 @@ int GetNidFromName(const char* name) {
287287 return NID_undef;
288288#endif
289289}
290+
291+ bool IsUnavailablePqcKeyType (Environment* env, Local<String> key_type) {
292+ return key_type->StringEquals (env->crypto_ml_dsa_44_string ()) ||
293+ key_type->StringEquals (env->crypto_ml_dsa_65_string ()) ||
294+ key_type->StringEquals (env->crypto_ml_dsa_87_string ()) ||
295+ key_type->StringEquals (env->crypto_ml_kem_512_string ()) ||
296+ key_type->StringEquals (env->crypto_ml_kem_768_string ()) ||
297+ key_type->StringEquals (env->crypto_ml_kem_1024_string ()) ||
298+ key_type->StringEquals (env->crypto_slh_dsa_sha2_128f_string ()) ||
299+ key_type->StringEquals (env->crypto_slh_dsa_sha2_128s_string ()) ||
300+ key_type->StringEquals (env->crypto_slh_dsa_sha2_192f_string ()) ||
301+ key_type->StringEquals (env->crypto_slh_dsa_sha2_192s_string ()) ||
302+ key_type->StringEquals (env->crypto_slh_dsa_sha2_256f_string ()) ||
303+ key_type->StringEquals (env->crypto_slh_dsa_sha2_256s_string ()) ||
304+ key_type->StringEquals (env->crypto_slh_dsa_shake_128f_string ()) ||
305+ key_type->StringEquals (env->crypto_slh_dsa_shake_128s_string ()) ||
306+ key_type->StringEquals (env->crypto_slh_dsa_shake_192f_string ()) ||
307+ key_type->StringEquals (env->crypto_slh_dsa_shake_192s_string ()) ||
308+ key_type->StringEquals (env->crypto_slh_dsa_shake_256f_string ()) ||
309+ key_type->StringEquals (env->crypto_slh_dsa_shake_256s_string ());
310+ }
311+
312+ bool IsUnsupportedRawKeyType (Environment* env, Local<String> key_type) {
313+ return key_type->StringEquals (env->crypto_rsa_string ()) ||
314+ key_type->StringEquals (env->crypto_rsa_pss_string ()) ||
315+ key_type->StringEquals (env->crypto_dsa_string ()) ||
316+ key_type->StringEquals (env->crypto_dh_string ());
317+ }
318+
319+ void ValidateRawKeyImportFormat (Environment* env,
320+ Local<String> key_type,
321+ const char * key_type_name,
322+ int id,
323+ EVPKeyPointer::PKFormatType format) {
324+ auto validate_raw_format =
325+ [&](EVPKeyPointer::PKFormatType expected_private_format) {
326+ if (format == EVPKeyPointer::PKFormatType::RAW_PUBLIC ||
327+ format == expected_private_format) {
328+ return ;
329+ }
330+ THROW_ERR_CRYPTO_INCOMPATIBLE_KEY_OPTIONS (env);
331+ };
332+
333+ if (key_type->StringEquals (env->crypto_ec_string ())) {
334+ return validate_raw_format (EVPKeyPointer::PKFormatType::RAW_PRIVATE );
335+ }
336+
337+ switch (id) {
338+ case EVP_PKEY_X25519 :
339+ case EVP_PKEY_X448 :
340+ case EVP_PKEY_ED25519 :
341+ case EVP_PKEY_ED448 :
342+ return validate_raw_format (EVPKeyPointer::PKFormatType::RAW_PRIVATE );
343+ default :
344+ break ;
345+ }
346+
347+ #if OPENSSL_WITH_PQC
348+ if (IsPqcSeedKeyId (id)) {
349+ return validate_raw_format (EVPKeyPointer::PKFormatType::RAW_SEED );
350+ }
351+ if (IsPqcRawPrivateKeyId (id)) {
352+ return validate_raw_format (EVPKeyPointer::PKFormatType::RAW_PRIVATE );
353+ }
354+ #endif
355+
356+ if (IsUnavailablePqcKeyType (env, key_type)) {
357+ THROW_ERR_INVALID_ARG_VALUE (env, " Unsupported key type" );
358+ return ;
359+ }
360+
361+ if (IsUnsupportedRawKeyType (env, key_type)) {
362+ THROW_ERR_CRYPTO_INCOMPATIBLE_KEY_OPTIONS (env);
363+ return ;
364+ }
365+
366+ THROW_ERR_INVALID_ARG_VALUE (
367+ env, " Invalid asymmetricKeyType: %s" , key_type_name);
368+ }
290369} // namespace
291370
292371bool KeyObjectData::ToEncodedPublicKey (
@@ -492,6 +571,12 @@ static KeyObjectData ImportRawKey(Environment* env,
492571 }
493572 };
494573
574+ const int id = GetNidFromName (key_type_name);
575+ ValidateRawKeyImportFormat (env, key_type, key_type_name, id, format);
576+ if (env->isolate ()->HasPendingException ()) {
577+ return {};
578+ }
579+
495580 // EC keys
496581 if (key_type->StringEquals (env->crypto_ec_string ())) {
497582 int curve_nid = ncrypto::Ec::GetCurveIdFromName (named_curve);
@@ -549,8 +634,6 @@ static KeyObjectData ImportRawKey(Environment* env,
549634 return KeyObjectData::CreateAsymmetric (target_type, std::move (pkey));
550635 }
551636
552- int id = GetNidFromName (key_type_name);
553-
554637 typedef EVPKeyPointer (*new_key_fn)(
555638 int , const ncrypto::Buffer<const unsigned char >&);
556639 new_key_fn fn = nullptr ;
@@ -589,40 +672,6 @@ static KeyObjectData ImportRawKey(Environment* env,
589672 return KeyObjectData::CreateAsymmetric (target_type, std::move (pkey));
590673 }
591674
592- if (key_type->StringEquals (env->crypto_rsa_string ()) ||
593- key_type->StringEquals (env->crypto_rsa_pss_string ()) ||
594- key_type->StringEquals (env->crypto_dsa_string ()) ||
595- key_type->StringEquals (env->crypto_dh_string ())) {
596- THROW_ERR_CRYPTO_INCOMPATIBLE_KEY_OPTIONS (env);
597- return {};
598- }
599-
600- #if !OPENSSL_WITH_PQC
601- if (key_type->StringEquals (env->crypto_ml_dsa_44_string ()) ||
602- key_type->StringEquals (env->crypto_ml_dsa_65_string ()) ||
603- key_type->StringEquals (env->crypto_ml_dsa_87_string ()) ||
604- key_type->StringEquals (env->crypto_ml_kem_512_string ()) ||
605- key_type->StringEquals (env->crypto_ml_kem_768_string ()) ||
606- key_type->StringEquals (env->crypto_ml_kem_1024_string ()) ||
607- key_type->StringEquals (env->crypto_slh_dsa_sha2_128f_string ()) ||
608- key_type->StringEquals (env->crypto_slh_dsa_sha2_128s_string ()) ||
609- key_type->StringEquals (env->crypto_slh_dsa_sha2_192f_string ()) ||
610- key_type->StringEquals (env->crypto_slh_dsa_sha2_192s_string ()) ||
611- key_type->StringEquals (env->crypto_slh_dsa_sha2_256f_string ()) ||
612- key_type->StringEquals (env->crypto_slh_dsa_sha2_256s_string ()) ||
613- key_type->StringEquals (env->crypto_slh_dsa_shake_128f_string ()) ||
614- key_type->StringEquals (env->crypto_slh_dsa_shake_128s_string ()) ||
615- key_type->StringEquals (env->crypto_slh_dsa_shake_192f_string ()) ||
616- key_type->StringEquals (env->crypto_slh_dsa_shake_192s_string ()) ||
617- key_type->StringEquals (env->crypto_slh_dsa_shake_256f_string ()) ||
618- key_type->StringEquals (env->crypto_slh_dsa_shake_256s_string ())) {
619- THROW_ERR_INVALID_ARG_VALUE (env, " Unsupported key type" );
620- return {};
621- }
622- #endif
623-
624- THROW_ERR_INVALID_ARG_VALUE (
625- env, " Invalid asymmetricKeyType: %s" , key_type_name);
626675 return {};
627676}
628677
0 commit comments