@@ -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