@@ -3206,27 +3206,24 @@ EVP_PKEY* ManagedEVPPKey::get() const {
3206
3206
return pkey_.get ();
3207
3207
}
3208
3208
3209
- KeyObjectData* KeyObjectData::CreateSecret (v8::Local<v8::ArrayBufferView> abv) {
3209
+ std::shared_ptr<KeyObjectData> KeyObjectData::CreateSecret (
3210
+ Local<ArrayBufferView> abv) {
3210
3211
size_t key_len = abv->ByteLength ();
3211
3212
char * mem = MallocOpenSSL<char >(key_len);
3212
3213
abv->CopyContents (mem, key_len);
3213
- KeyObjectData* data = new KeyObjectData ();
3214
- data->key_type_ = kKeyTypeSecret ;
3215
- data->symmetric_key_ = std::unique_ptr<char , std::function<void (char *)>>(mem,
3214
+ return std::shared_ptr<KeyObjectData>(new KeyObjectData (
3215
+ std::unique_ptr<char , std::function<void (char *)>>(mem,
3216
3216
[key_len](char * p) {
3217
3217
OPENSSL_clear_free (p, key_len);
3218
- });
3219
- data->symmetric_key_len_ = key_len;
3220
- return data;
3218
+ }),
3219
+ key_len));
3221
3220
}
3222
3221
3223
- KeyObjectData* KeyObjectData::CreateAsymmetric (KeyType key_type,
3224
- const ManagedEVPPKey& pkey) {
3222
+ std::shared_ptr<KeyObjectData> KeyObjectData::CreateAsymmetric (
3223
+ KeyType key_type,
3224
+ const ManagedEVPPKey& pkey) {
3225
3225
CHECK (pkey);
3226
- KeyObjectData* data = new KeyObjectData ();
3227
- data->key_type_ = key_type;
3228
- data->asymmetric_key_ = pkey;
3229
- return data;
3226
+ return std::shared_ptr<KeyObjectData>(new KeyObjectData (key_type, pkey));
3230
3227
}
3231
3228
3232
3229
KeyType KeyObjectData::GetKeyType () const {
@@ -3270,26 +3267,24 @@ Local<Function> KeyObjectHandle::Initialize(Environment* env,
3270
3267
return function;
3271
3268
}
3272
3269
3273
- MaybeLocal<Object> KeyObjectHandle::Create (Environment* env,
3274
- KeyType key_type,
3275
- const ManagedEVPPKey& pkey) {
3276
- CHECK_NE (key_type, kKeyTypeSecret );
3277
- Local<Value> type = Integer::New (env->isolate (), key_type);
3270
+ MaybeLocal<Object> KeyObjectHandle::Create (
3271
+ Environment* env,
3272
+ std::shared_ptr<KeyObjectData> data) {
3278
3273
Local<Object> obj;
3279
3274
if (!env->crypto_key_object_handle_constructor ()
3280
- ->NewInstance (env->context (), 1 , &type )
3275
+ ->NewInstance (env->context (), 0 , nullptr )
3281
3276
.ToLocal (&obj)) {
3282
3277
return MaybeLocal<Object>();
3283
3278
}
3284
3279
3285
3280
KeyObjectHandle* key = Unwrap<KeyObjectHandle>(obj);
3286
3281
CHECK_NOT_NULL (key);
3287
- key->data_ . reset ( KeyObjectData::CreateAsymmetric (key_type, pkey)) ;
3282
+ key->data_ = data ;
3288
3283
return obj;
3289
3284
}
3290
3285
3291
- const KeyObjectData* KeyObjectHandle::Data () {
3292
- return data_. get () ;
3286
+ const std::shared_ptr< KeyObjectData>& KeyObjectHandle::Data () {
3287
+ return data_;
3293
3288
}
3294
3289
3295
3290
void KeyObjectHandle::New (const FunctionCallbackInfo<Value>& args) {
@@ -3319,8 +3314,7 @@ void KeyObjectHandle::Init(const FunctionCallbackInfo<Value>& args) {
3319
3314
case kKeyTypeSecret :
3320
3315
CHECK_EQ (args.Length (), 2 );
3321
3316
CHECK (args[1 ]->IsArrayBufferView ());
3322
- key->data_ .reset (
3323
- KeyObjectData::CreateSecret (args[1 ].As <ArrayBufferView>()));
3317
+ key->data_ = KeyObjectData::CreateSecret (args[1 ].As <ArrayBufferView>());
3324
3318
break ;
3325
3319
case kKeyTypePublic :
3326
3320
CHECK_EQ (args.Length (), 4 );
@@ -3329,7 +3323,7 @@ void KeyObjectHandle::Init(const FunctionCallbackInfo<Value>& args) {
3329
3323
pkey = GetPublicOrPrivateKeyFromJs (args, &offset);
3330
3324
if (!pkey)
3331
3325
return ;
3332
- key->data_ . reset ( KeyObjectData::CreateAsymmetric (type, pkey) );
3326
+ key->data_ = KeyObjectData::CreateAsymmetric (type, pkey);
3333
3327
break ;
3334
3328
case kKeyTypePrivate :
3335
3329
CHECK_EQ (args.Length (), 5 );
@@ -3338,7 +3332,7 @@ void KeyObjectHandle::Init(const FunctionCallbackInfo<Value>& args) {
3338
3332
pkey = GetPrivateKeyFromJs (args, &offset, false );
3339
3333
if (!pkey)
3340
3334
return ;
3341
- key->data_ . reset ( KeyObjectData::CreateAsymmetric (type, pkey) );
3335
+ key->data_ = KeyObjectData::CreateAsymmetric (type, pkey);
3342
3336
break ;
3343
3337
default :
3344
3338
CHECK (false );
@@ -3434,7 +3428,50 @@ MaybeLocal<Value> KeyObjectHandle::ExportPrivateKey(
3434
3428
}
3435
3429
3436
3430
void NativeKeyObject::New (const FunctionCallbackInfo<Value>& args) {
3437
- CHECK_EQ (args.Length (), 0 );
3431
+ Environment* env = Environment::GetCurrent (args);
3432
+ CHECK_EQ (args.Length (), 1 );
3433
+ CHECK (args[0 ]->IsObject ());
3434
+ KeyObjectHandle* handle = Unwrap<KeyObjectHandle>(args[0 ].As <Object>());
3435
+ new NativeKeyObject (env, args.This (), handle->Data ());
3436
+ }
3437
+
3438
+ BaseObjectPtr<BaseObject> NativeKeyObject::KeyObjectTransferData::Deserialize (
3439
+ Environment* env,
3440
+ Local<Context> context,
3441
+ std::unique_ptr<worker::TransferData> self) {
3442
+ if (context != env->context ()) {
3443
+ THROW_ERR_MESSAGE_TARGET_CONTEXT_UNAVAILABLE (env);
3444
+ return {};
3445
+ }
3446
+
3447
+ Local<Value> handle = KeyObjectHandle::Create (env, data_).ToLocalChecked ();
3448
+ Local<Function> key_ctor;
3449
+ switch (data_->GetKeyType ()) {
3450
+ case kKeyTypeSecret :
3451
+ key_ctor = env->crypto_key_object_secret_constructor ();
3452
+ break ;
3453
+ case kKeyTypePublic :
3454
+ key_ctor = env->crypto_key_object_public_constructor ();
3455
+ break ;
3456
+ case kKeyTypePrivate :
3457
+ key_ctor = env->crypto_key_object_private_constructor ();
3458
+ break ;
3459
+ default :
3460
+ CHECK (false );
3461
+ }
3462
+
3463
+ Local<Value> key =
3464
+ key_ctor->NewInstance (context, 1 , &handle).ToLocalChecked ();
3465
+ return BaseObjectPtr<BaseObject>(Unwrap<KeyObjectHandle>(key.As <Object>()));
3466
+ }
3467
+
3468
+ BaseObject::TransferMode NativeKeyObject::GetTransferMode () const {
3469
+ return BaseObject::TransferMode::kCloneable ;
3470
+ }
3471
+
3472
+ std::unique_ptr<worker::TransferData> NativeKeyObject::CloneForMessaging ()
3473
+ const {
3474
+ return std::make_unique<KeyObjectTransferData>(handle_data_);
3438
3475
}
3439
3476
3440
3477
static void CreateNativeKeyObjectClass (
@@ -3448,13 +3485,23 @@ static void CreateNativeKeyObjectClass(
3448
3485
Local<FunctionTemplate> t = env->NewFunctionTemplate (NativeKeyObject::New);
3449
3486
t->InstanceTemplate ()->SetInternalFieldCount (
3450
3487
KeyObjectHandle::kInternalFieldCount );
3488
+ t->Inherit (BaseObject::GetConstructorTemplate (env));
3451
3489
3452
3490
Local<Value> ctor = t->GetFunction (env->context ()).ToLocalChecked ();
3453
3491
3454
3492
Local<Value> recv = Undefined (env->isolate ());
3455
- Local<Value> ret =
3456
- callback.As <Function>()->Call (env->context (), recv, 1 , &ctor)
3457
- .ToLocalChecked ();
3493
+ Local<Value> ret_v;
3494
+ if (!callback.As <Function>()->Call (
3495
+ env->context (), recv, 1 , &ctor).ToLocal (&ret_v)) {
3496
+ return ;
3497
+ }
3498
+ Local<Array> ret = ret_v.As <Array>();
3499
+ if (!ret->Get (env->context (), 1 ).ToLocal (&ctor)) return ;
3500
+ env->set_crypto_key_object_secret_constructor (ctor.As <Function>());
3501
+ if (!ret->Get (env->context (), 2 ).ToLocal (&ctor)) return ;
3502
+ env->set_crypto_key_object_public_constructor (ctor.As <Function>());
3503
+ if (!ret->Get (env->context (), 3 ).ToLocal (&ctor)) return ;
3504
+ env->set_crypto_key_object_private_constructor (ctor.As <Function>());
3458
3505
args.GetReturnValue ().Set (ret);
3459
3506
}
3460
3507
@@ -6318,8 +6365,9 @@ class GenerateKeyPairJob : public CryptoJob {
6318
6365
if (public_key_encoding_.output_key_object_ ) {
6319
6366
// Note that this has the downside of containing sensitive data of the
6320
6367
// private key.
6321
- if (!KeyObjectHandle::Create (env (), kKeyTypePublic , pkey_)
6322
- .ToLocal (pubkey))
6368
+ std::shared_ptr<KeyObjectData> data =
6369
+ KeyObjectData::CreateAsymmetric (kKeyTypePublic , pkey_);
6370
+ if (!KeyObjectHandle::Create (env (), data).ToLocal (pubkey))
6323
6371
return false ;
6324
6372
} else {
6325
6373
if (!WritePublicKey (env (), pkey_.get (), public_key_encoding_)
@@ -6329,8 +6377,9 @@ class GenerateKeyPairJob : public CryptoJob {
6329
6377
6330
6378
// Now do the same for the private key.
6331
6379
if (private_key_encoding_.output_key_object_ ) {
6332
- if (!KeyObjectHandle::Create (env (), kKeyTypePrivate , pkey_)
6333
- .ToLocal (privkey))
6380
+ std::shared_ptr<KeyObjectData> data =
6381
+ KeyObjectData::CreateAsymmetric (kKeyTypePrivate , pkey_);
6382
+ if (!KeyObjectHandle::Create (env (), data).ToLocal (privkey))
6334
6383
return false ;
6335
6384
} else {
6336
6385
if (!WritePrivateKey (env (), pkey_.get (), private_key_encoding_)
0 commit comments