@@ -3244,27 +3244,24 @@ EVP_PKEY* ManagedEVPPKey::get() const {
3244
3244
return pkey_.get ();
3245
3245
}
3246
3246
3247
- KeyObjectData* KeyObjectData::CreateSecret (v8::Local<v8::ArrayBufferView> abv) {
3247
+ std::shared_ptr<KeyObjectData> KeyObjectData::CreateSecret (
3248
+ Local<ArrayBufferView> abv) {
3248
3249
size_t key_len = abv->ByteLength ();
3249
3250
char * mem = MallocOpenSSL<char >(key_len);
3250
3251
abv->CopyContents (mem, key_len);
3251
- KeyObjectData* data = new KeyObjectData ();
3252
- data->key_type_ = kKeyTypeSecret ;
3253
- data->symmetric_key_ = std::unique_ptr<char , std::function<void (char *)>>(mem,
3252
+ return std::shared_ptr<KeyObjectData>(new KeyObjectData (
3253
+ std::unique_ptr<char , std::function<void (char *)>>(mem,
3254
3254
[key_len](char * p) {
3255
3255
OPENSSL_clear_free (p, key_len);
3256
- });
3257
- data->symmetric_key_len_ = key_len;
3258
- return data;
3256
+ }),
3257
+ key_len));
3259
3258
}
3260
3259
3261
- KeyObjectData* KeyObjectData::CreateAsymmetric (KeyType key_type,
3262
- const ManagedEVPPKey& pkey) {
3260
+ std::shared_ptr<KeyObjectData> KeyObjectData::CreateAsymmetric (
3261
+ KeyType key_type,
3262
+ const ManagedEVPPKey& pkey) {
3263
3263
CHECK (pkey);
3264
- KeyObjectData* data = new KeyObjectData ();
3265
- data->key_type_ = key_type;
3266
- data->asymmetric_key_ = pkey;
3267
- return data;
3264
+ return std::shared_ptr<KeyObjectData>(new KeyObjectData (key_type, pkey));
3268
3265
}
3269
3266
3270
3267
KeyType KeyObjectData::GetKeyType () const {
@@ -3308,26 +3305,24 @@ Local<Function> KeyObjectHandle::Initialize(Environment* env,
3308
3305
return function;
3309
3306
}
3310
3307
3311
- MaybeLocal<Object> KeyObjectHandle::Create (Environment* env,
3312
- KeyType key_type,
3313
- const ManagedEVPPKey& pkey) {
3314
- CHECK_NE (key_type, kKeyTypeSecret );
3315
- Local<Value> type = Integer::New (env->isolate (), key_type);
3308
+ MaybeLocal<Object> KeyObjectHandle::Create (
3309
+ Environment* env,
3310
+ std::shared_ptr<KeyObjectData> data) {
3316
3311
Local<Object> obj;
3317
3312
if (!env->crypto_key_object_handle_constructor ()
3318
- ->NewInstance (env->context (), 1 , &type )
3313
+ ->NewInstance (env->context (), 0 , nullptr )
3319
3314
.ToLocal (&obj)) {
3320
3315
return MaybeLocal<Object>();
3321
3316
}
3322
3317
3323
3318
KeyObjectHandle* key = Unwrap<KeyObjectHandle>(obj);
3324
3319
CHECK_NOT_NULL (key);
3325
- key->data_ . reset ( KeyObjectData::CreateAsymmetric (key_type, pkey)) ;
3320
+ key->data_ = data ;
3326
3321
return obj;
3327
3322
}
3328
3323
3329
- const KeyObjectData* KeyObjectHandle::Data () {
3330
- return data_. get () ;
3324
+ const std::shared_ptr< KeyObjectData>& KeyObjectHandle::Data () {
3325
+ return data_;
3331
3326
}
3332
3327
3333
3328
void KeyObjectHandle::New (const FunctionCallbackInfo<Value>& args) {
@@ -3357,8 +3352,7 @@ void KeyObjectHandle::Init(const FunctionCallbackInfo<Value>& args) {
3357
3352
case kKeyTypeSecret :
3358
3353
CHECK_EQ (args.Length (), 2 );
3359
3354
CHECK (args[1 ]->IsArrayBufferView ());
3360
- key->data_ .reset (
3361
- KeyObjectData::CreateSecret (args[1 ].As <ArrayBufferView>()));
3355
+ key->data_ = KeyObjectData::CreateSecret (args[1 ].As <ArrayBufferView>());
3362
3356
break ;
3363
3357
case kKeyTypePublic :
3364
3358
CHECK_EQ (args.Length (), 4 );
@@ -3367,7 +3361,7 @@ void KeyObjectHandle::Init(const FunctionCallbackInfo<Value>& args) {
3367
3361
pkey = GetPublicOrPrivateKeyFromJs (args, &offset);
3368
3362
if (!pkey)
3369
3363
return ;
3370
- key->data_ . reset ( KeyObjectData::CreateAsymmetric (type, pkey) );
3364
+ key->data_ = KeyObjectData::CreateAsymmetric (type, pkey);
3371
3365
break ;
3372
3366
case kKeyTypePrivate :
3373
3367
CHECK_EQ (args.Length (), 5 );
@@ -3376,7 +3370,7 @@ void KeyObjectHandle::Init(const FunctionCallbackInfo<Value>& args) {
3376
3370
pkey = GetPrivateKeyFromJs (args, &offset, false );
3377
3371
if (!pkey)
3378
3372
return ;
3379
- key->data_ . reset ( KeyObjectData::CreateAsymmetric (type, pkey) );
3373
+ key->data_ = KeyObjectData::CreateAsymmetric (type, pkey);
3380
3374
break ;
3381
3375
default :
3382
3376
CHECK (false );
@@ -3472,7 +3466,50 @@ MaybeLocal<Value> KeyObjectHandle::ExportPrivateKey(
3472
3466
}
3473
3467
3474
3468
void NativeKeyObject::New (const FunctionCallbackInfo<Value>& args) {
3475
- CHECK_EQ (args.Length (), 0 );
3469
+ Environment* env = Environment::GetCurrent (args);
3470
+ CHECK_EQ (args.Length (), 1 );
3471
+ CHECK (args[0 ]->IsObject ());
3472
+ KeyObjectHandle* handle = Unwrap<KeyObjectHandle>(args[0 ].As <Object>());
3473
+ new NativeKeyObject (env, args.This (), handle->Data ());
3474
+ }
3475
+
3476
+ BaseObjectPtr<BaseObject> NativeKeyObject::KeyObjectTransferData::Deserialize (
3477
+ Environment* env,
3478
+ Local<Context> context,
3479
+ std::unique_ptr<worker::TransferData> self) {
3480
+ if (context != env->context ()) {
3481
+ THROW_ERR_MESSAGE_TARGET_CONTEXT_UNAVAILABLE (env);
3482
+ return {};
3483
+ }
3484
+
3485
+ Local<Value> handle = KeyObjectHandle::Create (env, data_).ToLocalChecked ();
3486
+ Local<Function> key_ctor;
3487
+ switch (data_->GetKeyType ()) {
3488
+ case kKeyTypeSecret :
3489
+ key_ctor = env->crypto_key_object_secret_constructor ();
3490
+ break ;
3491
+ case kKeyTypePublic :
3492
+ key_ctor = env->crypto_key_object_public_constructor ();
3493
+ break ;
3494
+ case kKeyTypePrivate :
3495
+ key_ctor = env->crypto_key_object_private_constructor ();
3496
+ break ;
3497
+ default :
3498
+ CHECK (false );
3499
+ }
3500
+
3501
+ Local<Value> key =
3502
+ key_ctor->NewInstance (context, 1 , &handle).ToLocalChecked ();
3503
+ return BaseObjectPtr<BaseObject>(Unwrap<KeyObjectHandle>(key.As <Object>()));
3504
+ }
3505
+
3506
+ BaseObject::TransferMode NativeKeyObject::GetTransferMode () const {
3507
+ return BaseObject::TransferMode::kCloneable ;
3508
+ }
3509
+
3510
+ std::unique_ptr<worker::TransferData> NativeKeyObject::CloneForMessaging ()
3511
+ const {
3512
+ return std::make_unique<KeyObjectTransferData>(handle_data_);
3476
3513
}
3477
3514
3478
3515
static void CreateNativeKeyObjectClass (
@@ -3486,13 +3523,23 @@ static void CreateNativeKeyObjectClass(
3486
3523
Local<FunctionTemplate> t = env->NewFunctionTemplate (NativeKeyObject::New);
3487
3524
t->InstanceTemplate ()->SetInternalFieldCount (
3488
3525
KeyObjectHandle::kInternalFieldCount );
3526
+ t->Inherit (BaseObject::GetConstructorTemplate (env));
3489
3527
3490
3528
Local<Value> ctor = t->GetFunction (env->context ()).ToLocalChecked ();
3491
3529
3492
3530
Local<Value> recv = Undefined (env->isolate ());
3493
- Local<Value> ret =
3494
- callback.As <Function>()->Call (env->context (), recv, 1 , &ctor)
3495
- .ToLocalChecked ();
3531
+ Local<Value> ret_v;
3532
+ if (!callback.As <Function>()->Call (
3533
+ env->context (), recv, 1 , &ctor).ToLocal (&ret_v)) {
3534
+ return ;
3535
+ }
3536
+ Local<Array> ret = ret_v.As <Array>();
3537
+ if (!ret->Get (env->context (), 1 ).ToLocal (&ctor)) return ;
3538
+ env->set_crypto_key_object_secret_constructor (ctor.As <Function>());
3539
+ if (!ret->Get (env->context (), 2 ).ToLocal (&ctor)) return ;
3540
+ env->set_crypto_key_object_public_constructor (ctor.As <Function>());
3541
+ if (!ret->Get (env->context (), 3 ).ToLocal (&ctor)) return ;
3542
+ env->set_crypto_key_object_private_constructor (ctor.As <Function>());
3496
3543
args.GetReturnValue ().Set (ret);
3497
3544
}
3498
3545
@@ -6308,8 +6355,9 @@ class GenerateKeyPairJob : public CryptoJob {
6308
6355
if (public_key_encoding_.output_key_object_ ) {
6309
6356
// Note that this has the downside of containing sensitive data of the
6310
6357
// private key.
6311
- if (!KeyObjectHandle::Create (env (), kKeyTypePublic , pkey_)
6312
- .ToLocal (pubkey))
6358
+ std::shared_ptr<KeyObjectData> data =
6359
+ KeyObjectData::CreateAsymmetric (kKeyTypePublic , pkey_);
6360
+ if (!KeyObjectHandle::Create (env (), data).ToLocal (pubkey))
6313
6361
return false ;
6314
6362
} else {
6315
6363
if (!WritePublicKey (env (), pkey_.get (), public_key_encoding_)
@@ -6319,8 +6367,9 @@ class GenerateKeyPairJob : public CryptoJob {
6319
6367
6320
6368
// Now do the same for the private key.
6321
6369
if (private_key_encoding_.output_key_object_ ) {
6322
- if (!KeyObjectHandle::Create (env (), kKeyTypePrivate , pkey_)
6323
- .ToLocal (privkey))
6370
+ std::shared_ptr<KeyObjectData> data =
6371
+ KeyObjectData::CreateAsymmetric (kKeyTypePrivate , pkey_);
6372
+ if (!KeyObjectHandle::Create (env (), data).ToLocal (privkey))
6324
6373
return false ;
6325
6374
} else {
6326
6375
if (!WritePrivateKey (env (), pkey_.get (), private_key_encoding_)
0 commit comments