@@ -2890,7 +2890,8 @@ ByteSource ByteSource::FromSymmetricKeyObjectHandle(Local<Value> handle) {
2890
2890
CHECK (handle->IsObject ());
2891
2891
KeyObjectHandle* key = Unwrap<KeyObjectHandle>(handle.As <Object>());
2892
2892
CHECK_NOT_NULL (key);
2893
- return Foreign (key->GetSymmetricKey (), key->GetSymmetricKeySize ());
2893
+ return Foreign (key->Data ()->GetSymmetricKey (),
2894
+ key->Data ()->GetSymmetricKeySize ());
2894
2895
}
2895
2896
2896
2897
ByteSource::ByteSource (const char * data, char * allocated_data, size_t size)
@@ -3036,9 +3037,9 @@ static ManagedEVPPKey GetPrivateKeyFromJs(
3036
3037
CHECK (args[*offset]->IsObject () && allow_key_object);
3037
3038
KeyObjectHandle* key;
3038
3039
ASSIGN_OR_RETURN_UNWRAP (&key, args[*offset].As <Object>(), ManagedEVPPKey ());
3039
- CHECK_EQ (key->GetKeyType (), kKeyTypePrivate );
3040
+ CHECK_EQ (key->Data ()-> GetKeyType (), kKeyTypePrivate );
3040
3041
(*offset) += 4 ;
3041
- return key->GetAsymmetricKey ();
3042
+ return key->Data ()-> GetAsymmetricKey ();
3042
3043
}
3043
3044
}
3044
3045
@@ -3096,9 +3097,9 @@ static ManagedEVPPKey GetPublicOrPrivateKeyFromJs(
3096
3097
CHECK (args[*offset]->IsObject ());
3097
3098
KeyObjectHandle* key = Unwrap<KeyObjectHandle>(args[*offset].As <Object>());
3098
3099
CHECK_NOT_NULL (key);
3099
- CHECK_NE (key->GetKeyType (), kKeyTypeSecret );
3100
+ CHECK_NE (key->Data ()-> GetKeyType (), kKeyTypeSecret );
3100
3101
(*offset) += 4 ;
3101
- return key->GetAsymmetricKey ();
3102
+ return key->Data ()-> GetAsymmetricKey ();
3102
3103
}
3103
3104
}
3104
3105
@@ -3205,6 +3206,48 @@ EVP_PKEY* ManagedEVPPKey::get() const {
3205
3206
return pkey_.get ();
3206
3207
}
3207
3208
3209
+ KeyObjectData* KeyObjectData::CreateSecret (v8::Local<v8::ArrayBufferView> abv) {
3210
+ size_t key_len = abv->ByteLength ();
3211
+ char * mem = MallocOpenSSL<char >(key_len);
3212
+ 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,
3216
+ [key_len](char * p) {
3217
+ OPENSSL_clear_free (p, key_len);
3218
+ });
3219
+ data->symmetric_key_len_ = key_len;
3220
+ return data;
3221
+ }
3222
+
3223
+ KeyObjectData* KeyObjectData::CreateAsymmetric (KeyType key_type,
3224
+ const ManagedEVPPKey& pkey) {
3225
+ CHECK (pkey);
3226
+ KeyObjectData* data = new KeyObjectData ();
3227
+ data->key_type_ = key_type;
3228
+ data->asymmetric_key_ = pkey;
3229
+ return data;
3230
+ }
3231
+
3232
+ KeyType KeyObjectData::GetKeyType () const {
3233
+ return key_type_;
3234
+ }
3235
+
3236
+ ManagedEVPPKey KeyObjectData::GetAsymmetricKey () const {
3237
+ CHECK_NE (key_type_, kKeyTypeSecret );
3238
+ return asymmetric_key_;
3239
+ }
3240
+
3241
+ const char * KeyObjectData::GetSymmetricKey () const {
3242
+ CHECK_EQ (key_type_, kKeyTypeSecret );
3243
+ return symmetric_key_.get ();
3244
+ }
3245
+
3246
+ size_t KeyObjectData::GetSymmetricKeySize () const {
3247
+ CHECK_EQ (key_type_, kKeyTypeSecret );
3248
+ return symmetric_key_len_;
3249
+ }
3250
+
3208
3251
Local<Function> KeyObjectHandle::Initialize (Environment* env,
3209
3252
Local<Object> target) {
3210
3253
Local<FunctionTemplate> t = env->NewFunctionTemplate (New);
@@ -3241,46 +3284,23 @@ MaybeLocal<Object> KeyObjectHandle::Create(Environment* env,
3241
3284
3242
3285
KeyObjectHandle* key = Unwrap<KeyObjectHandle>(obj);
3243
3286
CHECK_NOT_NULL (key);
3244
- if (key_type == kKeyTypePublic )
3245
- key->InitPublic (pkey);
3246
- else
3247
- key->InitPrivate (pkey);
3287
+ key->data_ .reset (KeyObjectData::CreateAsymmetric (key_type, pkey));
3248
3288
return obj;
3249
3289
}
3250
3290
3251
- ManagedEVPPKey KeyObjectHandle::GetAsymmetricKey () const {
3252
- CHECK_NE (key_type_, kKeyTypeSecret );
3253
- return this ->asymmetric_key_ ;
3254
- }
3255
-
3256
- const char * KeyObjectHandle::GetSymmetricKey () const {
3257
- CHECK_EQ (key_type_, kKeyTypeSecret );
3258
- return this ->symmetric_key_ .get ();
3259
- }
3260
-
3261
- size_t KeyObjectHandle::GetSymmetricKeySize () const {
3262
- CHECK_EQ (key_type_, kKeyTypeSecret );
3263
- return this ->symmetric_key_len_ ;
3291
+ const KeyObjectData* KeyObjectHandle::Data () {
3292
+ return data_.get ();
3264
3293
}
3265
3294
3266
3295
void KeyObjectHandle::New (const FunctionCallbackInfo<Value>& args) {
3267
3296
CHECK (args.IsConstructCall ());
3268
- CHECK (args[0 ]->IsInt32 ());
3269
- KeyType key_type = static_cast <KeyType>(args[0 ].As <Uint32>()->Value ());
3270
3297
Environment* env = Environment::GetCurrent (args);
3271
- new KeyObjectHandle (env, args.This (), key_type);
3272
- }
3273
-
3274
- KeyType KeyObjectHandle::GetKeyType () const {
3275
- return this ->key_type_ ;
3298
+ new KeyObjectHandle (env, args.This ());
3276
3299
}
3277
3300
3278
3301
KeyObjectHandle::KeyObjectHandle (Environment* env,
3279
- Local<Object> wrap,
3280
- KeyType key_type)
3281
- : BaseObject(env, wrap),
3282
- key_type_ (key_type),
3283
- symmetric_key_(nullptr , nullptr ) {
3302
+ Local<Object> wrap)
3303
+ : BaseObject(env, wrap) {
3284
3304
MakeWeak ();
3285
3305
}
3286
3306
@@ -3289,66 +3309,45 @@ void KeyObjectHandle::Init(const FunctionCallbackInfo<Value>& args) {
3289
3309
ASSIGN_OR_RETURN_UNWRAP (&key, args.Holder ());
3290
3310
MarkPopErrorOnReturn mark_pop_error_on_return;
3291
3311
3312
+ CHECK (args[0 ]->IsInt32 ());
3313
+ KeyType type = static_cast <KeyType>(args[0 ].As <Uint32>()->Value ());
3314
+
3292
3315
unsigned int offset;
3293
3316
ManagedEVPPKey pkey;
3294
3317
3295
- switch (key-> key_type_ ) {
3318
+ switch (type ) {
3296
3319
case kKeyTypeSecret :
3297
- CHECK_EQ (args.Length (), 1 );
3298
- CHECK (args[0 ]->IsArrayBufferView ());
3299
- key->InitSecret (args[0 ].As <ArrayBufferView>());
3320
+ CHECK_EQ (args.Length (), 2 );
3321
+ CHECK (args[1 ]->IsArrayBufferView ());
3322
+ key->data_ .reset (
3323
+ KeyObjectData::CreateSecret (args[1 ].As <ArrayBufferView>()));
3300
3324
break ;
3301
3325
case kKeyTypePublic :
3302
- CHECK_EQ (args.Length (), 3 );
3326
+ CHECK_EQ (args.Length (), 4 );
3303
3327
3304
- offset = 0 ;
3328
+ offset = 1 ;
3305
3329
pkey = GetPublicOrPrivateKeyFromJs (args, &offset);
3306
3330
if (!pkey)
3307
3331
return ;
3308
- key->InitPublic ( pkey);
3332
+ key->data_ . reset ( KeyObjectData::CreateAsymmetric (type, pkey) );
3309
3333
break ;
3310
3334
case kKeyTypePrivate :
3311
- CHECK_EQ (args.Length (), 4 );
3335
+ CHECK_EQ (args.Length (), 5 );
3312
3336
3313
- offset = 0 ;
3337
+ offset = 1 ;
3314
3338
pkey = GetPrivateKeyFromJs (args, &offset, false );
3315
3339
if (!pkey)
3316
3340
return ;
3317
- key->InitPrivate ( pkey);
3341
+ key->data_ . reset ( KeyObjectData::CreateAsymmetric (type, pkey) );
3318
3342
break ;
3319
3343
default :
3320
3344
CHECK (false );
3321
3345
}
3322
3346
}
3323
3347
3324
- void KeyObjectHandle::InitSecret (Local<ArrayBufferView> abv) {
3325
- CHECK_EQ (this ->key_type_ , kKeyTypeSecret );
3326
-
3327
- size_t key_len = abv->ByteLength ();
3328
- char * mem = MallocOpenSSL<char >(key_len);
3329
- abv->CopyContents (mem, key_len);
3330
- this ->symmetric_key_ = std::unique_ptr<char , std::function<void (char *)>>(mem,
3331
- [key_len](char * p) {
3332
- OPENSSL_clear_free (p, key_len);
3333
- });
3334
- this ->symmetric_key_len_ = key_len;
3335
- }
3336
-
3337
- void KeyObjectHandle::InitPublic (const ManagedEVPPKey& pkey) {
3338
- CHECK_EQ (this ->key_type_ , kKeyTypePublic );
3339
- CHECK (pkey);
3340
- this ->asymmetric_key_ = pkey;
3341
- }
3342
-
3343
- void KeyObjectHandle::InitPrivate (const ManagedEVPPKey& pkey) {
3344
- CHECK_EQ (this ->key_type_ , kKeyTypePrivate );
3345
- CHECK (pkey);
3346
- this ->asymmetric_key_ = pkey;
3347
- }
3348
-
3349
3348
Local<Value> KeyObjectHandle::GetAsymmetricKeyType () const {
3350
- CHECK_NE ( this -> key_type_ , kKeyTypeSecret );
3351
- switch (EVP_PKEY_id (this -> asymmetric_key_ .get ())) {
3349
+ const ManagedEVPPKey& key = data_-> GetAsymmetricKey ( );
3350
+ switch (EVP_PKEY_id (key .get ())) {
3352
3351
case EVP_PKEY_RSA:
3353
3352
return env ()->crypto_rsa_string ();
3354
3353
case EVP_PKEY_RSA_PSS:
@@ -3384,24 +3383,27 @@ void KeyObjectHandle::GetSymmetricKeySize(
3384
3383
const FunctionCallbackInfo<Value>& args) {
3385
3384
KeyObjectHandle* key;
3386
3385
ASSIGN_OR_RETURN_UNWRAP (&key, args.Holder ());
3387
- args.GetReturnValue ().Set (static_cast <uint32_t >(key->GetSymmetricKeySize ()));
3386
+ args.GetReturnValue ().Set (
3387
+ static_cast <uint32_t >(key->Data ()->GetSymmetricKeySize ()));
3388
3388
}
3389
3389
3390
3390
void KeyObjectHandle::Export (const FunctionCallbackInfo<Value>& args) {
3391
3391
KeyObjectHandle* key;
3392
3392
ASSIGN_OR_RETURN_UNWRAP (&key, args.Holder ());
3393
3393
3394
+ KeyType type = key->Data ()->GetKeyType ();
3395
+
3394
3396
MaybeLocal<Value> result;
3395
- if (key-> key_type_ == kKeyTypeSecret ) {
3397
+ if (type == kKeyTypeSecret ) {
3396
3398
result = key->ExportSecretKey ();
3397
- } else if (key-> key_type_ == kKeyTypePublic ) {
3399
+ } else if (type == kKeyTypePublic ) {
3398
3400
unsigned int offset = 0 ;
3399
3401
PublicKeyEncodingConfig config =
3400
3402
GetPublicKeyEncodingFromJs (args, &offset, kKeyContextExport );
3401
3403
CHECK_EQ (offset, static_cast <unsigned int >(args.Length ()));
3402
3404
result = key->ExportPublicKey (config);
3403
3405
} else {
3404
- CHECK_EQ (key-> key_type_ , kKeyTypePrivate );
3406
+ CHECK_EQ (type , kKeyTypePrivate );
3405
3407
unsigned int offset = 0 ;
3406
3408
NonCopyableMaybe<PrivateKeyEncodingConfig> config =
3407
3409
GetPrivateKeyEncodingFromJs (args, &offset, kKeyContextExport );
@@ -3416,18 +3418,19 @@ void KeyObjectHandle::Export(const FunctionCallbackInfo<Value>& args) {
3416
3418
}
3417
3419
3418
3420
Local<Value> KeyObjectHandle::ExportSecretKey () const {
3419
- return Buffer::Copy (env (), symmetric_key_.get (), symmetric_key_len_)
3420
- .ToLocalChecked ();
3421
+ const char * buf = data_->GetSymmetricKey ();
3422
+ unsigned int len = data_->GetSymmetricKeySize ();
3423
+ return Buffer::Copy (env (), buf, len).ToLocalChecked ();
3421
3424
}
3422
3425
3423
3426
MaybeLocal<Value> KeyObjectHandle::ExportPublicKey (
3424
3427
const PublicKeyEncodingConfig& config) const {
3425
- return WritePublicKey (env (), asymmetric_key_ .get (), config);
3428
+ return WritePublicKey (env (), data_-> GetAsymmetricKey () .get (), config);
3426
3429
}
3427
3430
3428
3431
MaybeLocal<Value> KeyObjectHandle::ExportPrivateKey (
3429
3432
const PrivateKeyEncodingConfig& config) const {
3430
- return WritePrivateKey (env (), asymmetric_key_ .get (), config);
3433
+ return WritePrivateKey (env (), data_-> GetAsymmetricKey () .get (), config);
3431
3434
}
3432
3435
3433
3436
void NativeKeyObject::New (const FunctionCallbackInfo<Value>& args) {
@@ -6772,13 +6775,13 @@ void StatelessDiffieHellman(const FunctionCallbackInfo<Value>& args) {
6772
6775
CHECK (args[0 ]->IsObject () && args[1 ]->IsObject ());
6773
6776
KeyObjectHandle* our_key_object;
6774
6777
ASSIGN_OR_RETURN_UNWRAP (&our_key_object, args[0 ].As <Object>());
6775
- CHECK_EQ (our_key_object->GetKeyType (), kKeyTypePrivate );
6778
+ CHECK_EQ (our_key_object->Data ()-> GetKeyType (), kKeyTypePrivate );
6776
6779
KeyObjectHandle* their_key_object;
6777
6780
ASSIGN_OR_RETURN_UNWRAP (&their_key_object, args[1 ].As <Object>());
6778
- CHECK_NE (their_key_object->GetKeyType (), kKeyTypeSecret );
6781
+ CHECK_NE (their_key_object->Data ()-> GetKeyType (), kKeyTypeSecret );
6779
6782
6780
- ManagedEVPPKey our_key = our_key_object->GetAsymmetricKey ();
6781
- ManagedEVPPKey their_key = their_key_object->GetAsymmetricKey ();
6783
+ ManagedEVPPKey our_key = our_key_object->Data ()-> GetAsymmetricKey ();
6784
+ ManagedEVPPKey their_key = their_key_object->Data ()-> GetAsymmetricKey ();
6782
6785
6783
6786
AllocatedBuffer out = StatelessDiffieHellman (env, our_key, their_key);
6784
6787
if (out.size () == 0 )
0 commit comments