@@ -61,7 +61,11 @@ void GetKeyFormatAndTypeFromJs(
61
61
config->type_ = Just<PKEncodingType>(static_cast <PKEncodingType>(
62
62
args[*offset + 1 ].As <Int32>()->Value ()));
63
63
} else {
64
- CHECK (context == kKeyContextInput && config->format_ == kKeyFormatPEM );
64
+ CHECK (
65
+ (context == kKeyContextInput &&
66
+ config->format_ == kKeyFormatPEM ) ||
67
+ (context == kKeyContextGenerate &&
68
+ config->format_ == kKeyFormatJWK ));
65
69
CHECK (args[*offset + 1 ]->IsNullOrUndefined ());
66
70
config->type_ = Nothing<PKEncodingType>();
67
71
}
@@ -487,9 +491,7 @@ Maybe<bool> ExportJWKAsymmetricKey(
487
491
std::shared_ptr<KeyObjectData> key,
488
492
Local<Object> target) {
489
493
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);
493
495
case EVP_PKEY_EC: return ExportJWKEcKey (env, key, target);
494
496
case EVP_PKEY_ED25519:
495
497
// Fall through
@@ -499,7 +501,7 @@ Maybe<bool> ExportJWKAsymmetricKey(
499
501
// Fall through
500
502
case EVP_PKEY_X448: return ExportJWKEdKey (env, key, target);
501
503
}
502
- THROW_ERR_CRYPTO_INVALID_KEYTYPE (env);
504
+ THROW_ERR_CRYPTO_JWK_UNSUPPORTED_KEY_TYPE (env);
503
505
return Just (false );
504
506
}
505
507
@@ -605,6 +607,21 @@ static inline Maybe<bool> Tristate(bool b) {
605
607
return b ? Just (true ) : Nothing<bool >();
606
608
}
607
609
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
+
608
625
Maybe<bool > ManagedEVPPKey::ToEncodedPublicKey (
609
626
Environment* env,
610
627
ManagedEVPPKey key,
@@ -617,6 +634,11 @@ Maybe<bool> ManagedEVPPKey::ToEncodedPublicKey(
617
634
std::shared_ptr<KeyObjectData> data =
618
635
KeyObjectData::CreateAsymmetric (kKeyTypePublic , std::move (key));
619
636
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);
620
642
}
621
643
622
644
return Tristate (WritePublicKey (env, key.get (), config).ToLocal (out));
@@ -632,6 +654,11 @@ Maybe<bool> ManagedEVPPKey::ToEncodedPrivateKey(
632
654
std::shared_ptr<KeyObjectData> data =
633
655
KeyObjectData::CreateAsymmetric (kKeyTypePrivate , std::move (key));
634
656
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);
635
662
}
636
663
637
664
return Tristate (WritePrivateKey (env, key.get (), config).ToLocal (out));
@@ -1211,24 +1238,7 @@ void KeyObjectHandle::ExportJWK(
1211
1238
1212
1239
CHECK (args[0 ]->IsObject ());
1213
1240
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 ]);
1232
1242
1233
1243
args.GetReturnValue ().Set (args[0 ]);
1234
1244
}
@@ -1380,6 +1390,7 @@ void Initialize(Environment* env, Local<Object> target) {
1380
1390
NODE_DEFINE_CONSTANT (target, kKeyEncodingSEC1 );
1381
1391
NODE_DEFINE_CONSTANT (target, kKeyFormatDER );
1382
1392
NODE_DEFINE_CONSTANT (target, kKeyFormatPEM );
1393
+ NODE_DEFINE_CONSTANT (target, kKeyFormatJWK );
1383
1394
NODE_DEFINE_CONSTANT (target, kKeyTypeSecret );
1384
1395
NODE_DEFINE_CONSTANT (target, kKeyTypePublic );
1385
1396
NODE_DEFINE_CONSTANT (target, kKeyTypePrivate );
0 commit comments