@@ -336,6 +336,85 @@ int GetNidFromName(const char* name) {
336336 }
337337 return NID_undef;
338338}
339+
340+ bool IsUnavailablePqcKeyType (Environment* env, Local<String> key_type) {
341+ return key_type->StringEquals (env->crypto_ml_dsa_44_string ()) ||
342+ key_type->StringEquals (env->crypto_ml_dsa_65_string ()) ||
343+ key_type->StringEquals (env->crypto_ml_dsa_87_string ()) ||
344+ key_type->StringEquals (env->crypto_ml_kem_512_string ()) ||
345+ key_type->StringEquals (env->crypto_ml_kem_768_string ()) ||
346+ key_type->StringEquals (env->crypto_ml_kem_1024_string ()) ||
347+ key_type->StringEquals (env->crypto_slh_dsa_sha2_128f_string ()) ||
348+ key_type->StringEquals (env->crypto_slh_dsa_sha2_128s_string ()) ||
349+ key_type->StringEquals (env->crypto_slh_dsa_sha2_192f_string ()) ||
350+ key_type->StringEquals (env->crypto_slh_dsa_sha2_192s_string ()) ||
351+ key_type->StringEquals (env->crypto_slh_dsa_sha2_256f_string ()) ||
352+ key_type->StringEquals (env->crypto_slh_dsa_sha2_256s_string ()) ||
353+ key_type->StringEquals (env->crypto_slh_dsa_shake_128f_string ()) ||
354+ key_type->StringEquals (env->crypto_slh_dsa_shake_128s_string ()) ||
355+ key_type->StringEquals (env->crypto_slh_dsa_shake_192f_string ()) ||
356+ key_type->StringEquals (env->crypto_slh_dsa_shake_192s_string ()) ||
357+ key_type->StringEquals (env->crypto_slh_dsa_shake_256f_string ()) ||
358+ key_type->StringEquals (env->crypto_slh_dsa_shake_256s_string ());
359+ }
360+
361+ bool IsUnsupportedRawKeyType (Environment* env, Local<String> key_type) {
362+ return key_type->StringEquals (env->crypto_rsa_string ()) ||
363+ key_type->StringEquals (env->crypto_rsa_pss_string ()) ||
364+ key_type->StringEquals (env->crypto_dsa_string ()) ||
365+ key_type->StringEquals (env->crypto_dh_string ());
366+ }
367+
368+ void ValidateRawKeyImportFormat (Environment* env,
369+ Local<String> key_type,
370+ const char * key_type_name,
371+ int id,
372+ EVPKeyPointer::PKFormatType format) {
373+ auto validate_raw_format =
374+ [&](EVPKeyPointer::PKFormatType expected_private_format) {
375+ if (format == EVPKeyPointer::PKFormatType::RAW_PUBLIC ||
376+ format == expected_private_format) {
377+ return ;
378+ }
379+ THROW_ERR_CRYPTO_INCOMPATIBLE_KEY_OPTIONS (env);
380+ };
381+
382+ if (key_type->StringEquals (env->crypto_ec_string ())) {
383+ return validate_raw_format (EVPKeyPointer::PKFormatType::RAW_PRIVATE);
384+ }
385+
386+ switch (id) {
387+ case EVP_PKEY_X25519:
388+ case EVP_PKEY_X448:
389+ case EVP_PKEY_ED25519:
390+ case EVP_PKEY_ED448:
391+ return validate_raw_format (EVPKeyPointer::PKFormatType::RAW_PRIVATE);
392+ default :
393+ break ;
394+ }
395+
396+ #if OPENSSL_WITH_PQC
397+ if (IsPqcSeedKeyId (id)) {
398+ return validate_raw_format (EVPKeyPointer::PKFormatType::RAW_SEED);
399+ }
400+ if (IsPqcRawPrivateKeyId (id)) {
401+ return validate_raw_format (EVPKeyPointer::PKFormatType::RAW_PRIVATE);
402+ }
403+ #endif
404+
405+ if (IsUnavailablePqcKeyType (env, key_type)) {
406+ THROW_ERR_INVALID_ARG_VALUE (env, " Unsupported key type" );
407+ return ;
408+ }
409+
410+ if (IsUnsupportedRawKeyType (env, key_type)) {
411+ THROW_ERR_CRYPTO_INCOMPATIBLE_KEY_OPTIONS (env);
412+ return ;
413+ }
414+
415+ THROW_ERR_INVALID_ARG_VALUE (
416+ env, " Invalid asymmetricKeyType: %s" , key_type_name);
417+ }
339418} // namespace
340419
341420bool KeyObjectData::ToEncodedPublicKey (
@@ -585,6 +664,12 @@ static KeyObjectData ImportRawKey(Environment* env,
585664 }
586665 };
587666
667+ const int id = GetNidFromName (key_type_name);
668+ ValidateRawKeyImportFormat (env, key_type, key_type_name, id, format);
669+ if (env->isolate ()->HasPendingException ()) {
670+ return {};
671+ }
672+
588673 // EC keys
589674 if (key_type->StringEquals (env->crypto_ec_string ())) {
590675 int curve_nid = ncrypto::Ec::GetCurveIdFromName (named_curve);
@@ -642,8 +727,6 @@ static KeyObjectData ImportRawKey(Environment* env,
642727 return KeyObjectData::CreateAsymmetric (target_type, std::move (pkey));
643728 }
644729
645- int id = GetNidFromName (key_type_name);
646-
647730 typedef EVPKeyPointer (*new_key_fn)(
648731 int , const ncrypto::Buffer<const unsigned char >&);
649732 new_key_fn fn = nullptr ;
@@ -698,40 +781,6 @@ static KeyObjectData ImportRawKey(Environment* env,
698781 return KeyObjectData::CreateAsymmetric (target_type, std::move (pkey));
699782 }
700783
701- if (key_type->StringEquals (env->crypto_rsa_string ()) ||
702- key_type->StringEquals (env->crypto_rsa_pss_string ()) ||
703- key_type->StringEquals (env->crypto_dsa_string ()) ||
704- key_type->StringEquals (env->crypto_dh_string ())) {
705- THROW_ERR_CRYPTO_INCOMPATIBLE_KEY_OPTIONS (env);
706- return {};
707- }
708-
709- #if !OPENSSL_WITH_PQC
710- if (key_type->StringEquals (env->crypto_ml_dsa_44_string ()) ||
711- key_type->StringEquals (env->crypto_ml_dsa_65_string ()) ||
712- key_type->StringEquals (env->crypto_ml_dsa_87_string ()) ||
713- key_type->StringEquals (env->crypto_ml_kem_512_string ()) ||
714- key_type->StringEquals (env->crypto_ml_kem_768_string ()) ||
715- key_type->StringEquals (env->crypto_ml_kem_1024_string ()) ||
716- key_type->StringEquals (env->crypto_slh_dsa_sha2_128f_string ()) ||
717- key_type->StringEquals (env->crypto_slh_dsa_sha2_128s_string ()) ||
718- key_type->StringEquals (env->crypto_slh_dsa_sha2_192f_string ()) ||
719- key_type->StringEquals (env->crypto_slh_dsa_sha2_192s_string ()) ||
720- key_type->StringEquals (env->crypto_slh_dsa_sha2_256f_string ()) ||
721- key_type->StringEquals (env->crypto_slh_dsa_sha2_256s_string ()) ||
722- key_type->StringEquals (env->crypto_slh_dsa_shake_128f_string ()) ||
723- key_type->StringEquals (env->crypto_slh_dsa_shake_128s_string ()) ||
724- key_type->StringEquals (env->crypto_slh_dsa_shake_192f_string ()) ||
725- key_type->StringEquals (env->crypto_slh_dsa_shake_192s_string ()) ||
726- key_type->StringEquals (env->crypto_slh_dsa_shake_256f_string ()) ||
727- key_type->StringEquals (env->crypto_slh_dsa_shake_256s_string ())) {
728- THROW_ERR_INVALID_ARG_VALUE (env, " Unsupported key type" );
729- return {};
730- }
731- #endif
732-
733- THROW_ERR_INVALID_ARG_VALUE (
734- env, " Invalid asymmetricKeyType: %s" , key_type_name);
735784 return {};
736785}
737786
0 commit comments