@@ -605,6 +605,21 @@ static inline Maybe<bool> Tristate(bool b) {
605
605
return b ? Just (true ) : Nothing<bool >();
606
606
}
607
607
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
+
608
623
Maybe<bool > ManagedEVPPKey::ToEncodedPublicKey (
609
624
Environment* env,
610
625
ManagedEVPPKey key,
@@ -617,6 +632,11 @@ Maybe<bool> ManagedEVPPKey::ToEncodedPublicKey(
617
632
std::shared_ptr<KeyObjectData> data =
618
633
KeyObjectData::CreateAsymmetric (kKeyTypePublic , std::move (key));
619
634
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);
620
640
}
621
641
622
642
return Tristate (WritePublicKey (env, key.get (), config).ToLocal (out));
@@ -632,6 +652,11 @@ Maybe<bool> ManagedEVPPKey::ToEncodedPrivateKey(
632
652
std::shared_ptr<KeyObjectData> data =
633
653
KeyObjectData::CreateAsymmetric (kKeyTypePrivate , std::move (key));
634
654
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);
635
660
}
636
661
637
662
return Tristate (WritePrivateKey (env, key.get (), config).ToLocal (out));
@@ -1211,24 +1236,7 @@ void KeyObjectHandle::ExportJWK(
1211
1236
1212
1237
CHECK (args[0 ]->IsObject ());
1213
1238
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 ]);
1232
1240
1233
1241
args.GetReturnValue ().Set (args[0 ]);
1234
1242
}
@@ -1380,6 +1388,7 @@ void Initialize(Environment* env, Local<Object> target) {
1380
1388
NODE_DEFINE_CONSTANT (target, kKeyEncodingSEC1 );
1381
1389
NODE_DEFINE_CONSTANT (target, kKeyFormatDER );
1382
1390
NODE_DEFINE_CONSTANT (target, kKeyFormatPEM );
1391
+ NODE_DEFINE_CONSTANT (target, kKeyFormatJWK );
1383
1392
NODE_DEFINE_CONSTANT (target, kKeyTypeSecret );
1384
1393
NODE_DEFINE_CONSTANT (target, kKeyTypePublic );
1385
1394
NODE_DEFINE_CONSTANT (target, kKeyTypePrivate );
0 commit comments