@@ -61,7 +61,11 @@ void GetKeyFormatAndTypeFromJs(
6161 config->type_ = Just<PKEncodingType>(static_cast <PKEncodingType>(
6262 args[*offset + 1 ].As <Int32>()->Value ()));
6363 } else {
64- CHECK (context == kKeyContextInput && config->format_ == kKeyFormatPEM );
64+ CHECK (
65+ (context == kKeyContextInput &&
66+ config->format_ == kKeyFormatPEM ) ||
67+ (context == kKeyContextGenerate &&
68+ config->format_ == kKeyFormatJWK ));
6569 CHECK (args[*offset + 1 ]->IsNullOrUndefined ());
6670 config->type_ = Nothing<PKEncodingType>();
6771 }
@@ -487,9 +491,7 @@ Maybe<bool> ExportJWKAsymmetricKey(
487491 std::shared_ptr<KeyObjectData> key,
488492 Local<Object> target) {
489493 switch (EVP_PKEY_id (key->GetAsymmetricKey ().get ())) {
490- case EVP_PKEY_RSA:
491- // Fall through
492- case EVP_PKEY_RSA_PSS: return ExportJWKRsaKey (env, key, target);
494+ case EVP_PKEY_RSA: return ExportJWKRsaKey (env, key, target);
493495 case EVP_PKEY_EC: return ExportJWKEcKey (env, key, target);
494496 case EVP_PKEY_ED25519:
495497 // Fall through
@@ -499,7 +501,7 @@ Maybe<bool> ExportJWKAsymmetricKey(
499501 // Fall through
500502 case EVP_PKEY_X448: return ExportJWKEdKey (env, key, target);
501503 }
502- THROW_ERR_CRYPTO_INVALID_KEYTYPE (env);
504+ THROW_ERR_CRYPTO_JWK_UNSUPPORTED_KEY_TYPE (env);
503505 return Just (false );
504506}
505507
@@ -605,6 +607,21 @@ static inline Maybe<bool> Tristate(bool b) {
605607 return b ? Just (true ) : Nothing<bool >();
606608}
607609
610+ Maybe<bool > ExportJWKInner (Environment* env,
611+ std::shared_ptr<KeyObjectData> key,
612+ Local<Value> result) {
613+ switch (key->GetKeyType ()) {
614+ case kKeyTypeSecret :
615+ return ExportJWKSecretKey (env, key, result.As <Object>());
616+ case kKeyTypePublic :
617+ // Fall through
618+ case kKeyTypePrivate :
619+ return ExportJWKAsymmetricKey (env, key, result.As <Object>());
620+ default :
621+ UNREACHABLE ();
622+ }
623+ }
624+
608625Maybe<bool > ManagedEVPPKey::ToEncodedPublicKey (
609626 Environment* env,
610627 ManagedEVPPKey key,
@@ -617,6 +634,11 @@ Maybe<bool> ManagedEVPPKey::ToEncodedPublicKey(
617634 std::shared_ptr<KeyObjectData> data =
618635 KeyObjectData::CreateAsymmetric (kKeyTypePublic , std::move (key));
619636 return Tristate (KeyObjectHandle::Create (env, data).ToLocal (out));
637+ } else if (config.format_ == kKeyFormatJWK ) {
638+ std::shared_ptr<KeyObjectData> data =
639+ KeyObjectData::CreateAsymmetric (kKeyTypePublic , std::move (key));
640+ *out = Object::New (env->isolate ());
641+ return ExportJWKInner (env, data, *out);
620642 }
621643
622644 return Tristate (WritePublicKey (env, key.get (), config).ToLocal (out));
@@ -632,6 +654,11 @@ Maybe<bool> ManagedEVPPKey::ToEncodedPrivateKey(
632654 std::shared_ptr<KeyObjectData> data =
633655 KeyObjectData::CreateAsymmetric (kKeyTypePrivate , std::move (key));
634656 return Tristate (KeyObjectHandle::Create (env, data).ToLocal (out));
657+ } else if (config.format_ == kKeyFormatJWK ) {
658+ std::shared_ptr<KeyObjectData> data =
659+ KeyObjectData::CreateAsymmetric (kKeyTypePrivate , std::move (key));
660+ *out = Object::New (env->isolate ());
661+ return ExportJWKInner (env, data, *out);
635662 }
636663
637664 return Tristate (WritePrivateKey (env, key.get (), config).ToLocal (out));
@@ -1211,24 +1238,7 @@ void KeyObjectHandle::ExportJWK(
12111238
12121239 CHECK (args[0 ]->IsObject ());
12131240
1214- switch (key->Data ()->GetKeyType ()) {
1215- case kKeyTypeSecret :
1216- if (ExportJWKSecretKey (env, key->Data (), args[0 ].As <Object>())
1217- .IsNothing ()) {
1218- return ;
1219- }
1220- break ;
1221- case kKeyTypePublic :
1222- // Fall through
1223- case kKeyTypePrivate :
1224- if (ExportJWKAsymmetricKey (env, key->Data (), args[0 ].As <Object>())
1225- .IsNothing ()) {
1226- return ;
1227- }
1228- break ;
1229- default :
1230- UNREACHABLE ();
1231- }
1241+ ExportJWKInner (env, key->Data (), args[0 ]);
12321242
12331243 args.GetReturnValue ().Set (args[0 ]);
12341244}
@@ -1380,6 +1390,7 @@ void Initialize(Environment* env, Local<Object> target) {
13801390 NODE_DEFINE_CONSTANT (target, kKeyEncodingSEC1 );
13811391 NODE_DEFINE_CONSTANT (target, kKeyFormatDER );
13821392 NODE_DEFINE_CONSTANT (target, kKeyFormatPEM );
1393+ NODE_DEFINE_CONSTANT (target, kKeyFormatJWK );
13831394 NODE_DEFINE_CONSTANT (target, kKeyTypeSecret );
13841395 NODE_DEFINE_CONSTANT (target, kKeyTypePublic );
13851396 NODE_DEFINE_CONSTANT (target, kKeyTypePrivate );
0 commit comments