@@ -605,6 +605,21 @@ static inline Maybe<bool> Tristate(bool b) {
605605 return b ? Just (true ) : Nothing<bool >();
606606}
607607
608+ Maybe<bool > ExportJWKInner (Environment* env,
609+ std::shared_ptr<KeyObjectData> key,
610+ Local<Value> result) {
611+ switch (key->GetKeyType ()) {
612+ case kKeyTypeSecret :
613+ return ExportJWKSecretKey (env, key, result.As <Object>());
614+ case kKeyTypePublic :
615+ // Fall through
616+ case kKeyTypePrivate :
617+ return ExportJWKAsymmetricKey (env, key, result.As <Object>());
618+ default :
619+ UNREACHABLE ();
620+ }
621+ }
622+
608623Maybe<bool > ManagedEVPPKey::ToEncodedPublicKey (
609624 Environment* env,
610625 ManagedEVPPKey key,
@@ -617,6 +632,11 @@ Maybe<bool> ManagedEVPPKey::ToEncodedPublicKey(
617632 std::shared_ptr<KeyObjectData> data =
618633 KeyObjectData::CreateAsymmetric (kKeyTypePublic , std::move (key));
619634 return Tristate (KeyObjectHandle::Create (env, data).ToLocal (out));
635+ } else if (config.format_ == kKeyFormatJWK ) {
636+ std::shared_ptr<KeyObjectData> data =
637+ KeyObjectData::CreateAsymmetric (kKeyTypePublic , std::move (key));
638+ *out = Object::New (env->isolate ());
639+ return ExportJWKInner (env, data, *out);
620640 }
621641
622642 return Tristate (WritePublicKey (env, key.get (), config).ToLocal (out));
@@ -632,6 +652,11 @@ Maybe<bool> ManagedEVPPKey::ToEncodedPrivateKey(
632652 std::shared_ptr<KeyObjectData> data =
633653 KeyObjectData::CreateAsymmetric (kKeyTypePrivate , std::move (key));
634654 return Tristate (KeyObjectHandle::Create (env, data).ToLocal (out));
655+ } else if (config.format_ == kKeyFormatJWK ) {
656+ std::shared_ptr<KeyObjectData> data =
657+ KeyObjectData::CreateAsymmetric (kKeyTypePrivate , std::move (key));
658+ *out = Object::New (env->isolate ());
659+ return ExportJWKInner (env, data, *out);
635660 }
636661
637662 return Tristate (WritePrivateKey (env, key.get (), config).ToLocal (out));
@@ -1211,24 +1236,7 @@ void KeyObjectHandle::ExportJWK(
12111236
12121237 CHECK (args[0 ]->IsObject ());
12131238
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- }
1239+ ExportJWKInner (env, key->Data (), args[0 ]);
12321240
12331241 args.GetReturnValue ().Set (args[0 ]);
12341242}
@@ -1380,6 +1388,7 @@ void Initialize(Environment* env, Local<Object> target) {
13801388 NODE_DEFINE_CONSTANT (target, kKeyEncodingSEC1 );
13811389 NODE_DEFINE_CONSTANT (target, kKeyFormatDER );
13821390 NODE_DEFINE_CONSTANT (target, kKeyFormatPEM );
1391+ NODE_DEFINE_CONSTANT (target, kKeyFormatJWK );
13831392 NODE_DEFINE_CONSTANT (target, kKeyTypeSecret );
13841393 NODE_DEFINE_CONSTANT (target, kKeyTypePublic );
13851394 NODE_DEFINE_CONSTANT (target, kKeyTypePrivate );
0 commit comments