@@ -4762,99 +4762,49 @@ void DiffieHellman::GenerateKeys(const FunctionCallbackInfo<Value>& args) {
4762
4762
return ThrowCryptoError (env, ERR_get_error (), " Key generation failed" );
4763
4763
}
4764
4764
4765
- int dataSize = BN_num_bytes (diffieHellman->dh ->pub_key );
4766
- char * data = new char [dataSize];
4767
- BN_bn2bin (diffieHellman->dh ->pub_key ,
4768
- reinterpret_cast <unsigned char *>(data));
4769
-
4770
- args.GetReturnValue ().Set (Encode (env->isolate (), data, dataSize, BUFFER));
4771
- delete[] data;
4765
+ size_t size = BN_num_bytes (diffieHellman->dh ->pub_key );
4766
+ char * data = Malloc (size);
4767
+ BN_bn2bin (diffieHellman->dh ->pub_key , reinterpret_cast <unsigned char *>(data));
4768
+ args.GetReturnValue ().Set (Buffer::New (env, data, size).ToLocalChecked ());
4772
4769
}
4773
4770
4774
4771
4775
- void DiffieHellman::GetPrime (const FunctionCallbackInfo<Value>& args) {
4772
+ void DiffieHellman::GetField (const FunctionCallbackInfo<Value>& args,
4773
+ BIGNUM* (DH::*field), const char* err_if_null) {
4776
4774
Environment* env = Environment::GetCurrent (args);
4777
4775
4778
- DiffieHellman* diffieHellman;
4779
- ASSIGN_OR_RETURN_UNWRAP (&diffieHellman, args.Holder ());
4776
+ DiffieHellman* dh;
4777
+ ASSIGN_OR_RETURN_UNWRAP (&dh, args.Holder ());
4778
+ if (!dh->initialised_ ) return env->ThrowError (" Not initialized" );
4780
4779
4781
- if (!diffieHellman->initialised_ ) {
4782
- return ThrowCryptoError (env, ERR_get_error (), " Not initialized" );
4783
- }
4780
+ const BIGNUM* num = (dh->dh )->*field;
4781
+ if (num == nullptr ) return env->ThrowError (err_if_null);
4784
4782
4785
- int dataSize = BN_num_bytes (diffieHellman->dh ->p );
4786
- char * data = new char [dataSize];
4787
- BN_bn2bin (diffieHellman->dh ->p , reinterpret_cast <unsigned char *>(data));
4783
+ size_t size = BN_num_bytes (num);
4784
+ char * data = Malloc (size);
4785
+ BN_bn2bin (num, reinterpret_cast <unsigned char *>(data));
4786
+ args.GetReturnValue ().Set (Buffer::New (env, data, size).ToLocalChecked ());
4787
+ }
4788
4788
4789
- args. GetReturnValue (). Set ( Encode (env-> isolate (), data, dataSize, BUFFER));
4790
- delete[] data ;
4789
+ void DiffieHellman::GetPrime ( const FunctionCallbackInfo<Value>& args) {
4790
+ GetField (args, &DH::p, " p is null " ) ;
4791
4791
}
4792
4792
4793
4793
4794
4794
void DiffieHellman::GetGenerator (const FunctionCallbackInfo<Value>& args) {
4795
- Environment* env = Environment::GetCurrent (args);
4796
-
4797
- DiffieHellman* diffieHellman;
4798
- ASSIGN_OR_RETURN_UNWRAP (&diffieHellman, args.Holder ());
4799
-
4800
- if (!diffieHellman->initialised_ ) {
4801
- return ThrowCryptoError (env, ERR_get_error (), " Not initialized" );
4802
- }
4803
-
4804
- int dataSize = BN_num_bytes (diffieHellman->dh ->g );
4805
- char * data = new char [dataSize];
4806
- BN_bn2bin (diffieHellman->dh ->g , reinterpret_cast <unsigned char *>(data));
4807
-
4808
- args.GetReturnValue ().Set (Encode (env->isolate (), data, dataSize, BUFFER));
4809
- delete[] data;
4795
+ GetField (args, &DH::g, " g is null" );
4810
4796
}
4811
4797
4812
4798
4813
4799
void DiffieHellman::GetPublicKey (const FunctionCallbackInfo<Value>& args) {
4814
- Environment* env = Environment::GetCurrent (args);
4815
-
4816
- DiffieHellman* diffieHellman;
4817
- ASSIGN_OR_RETURN_UNWRAP (&diffieHellman, args.Holder ());
4818
-
4819
- if (!diffieHellman->initialised_ ) {
4820
- return ThrowCryptoError (env, ERR_get_error (), " Not initialized" );
4821
- }
4822
-
4823
- if (diffieHellman->dh ->pub_key == nullptr ) {
4824
- return env->ThrowError (" No public key - did you forget to generate one?" );
4825
- }
4826
-
4827
- int dataSize = BN_num_bytes (diffieHellman->dh ->pub_key );
4828
- char * data = new char [dataSize];
4829
- BN_bn2bin (diffieHellman->dh ->pub_key ,
4830
- reinterpret_cast <unsigned char *>(data));
4831
-
4832
- args.GetReturnValue ().Set (Encode (env->isolate (), data, dataSize, BUFFER));
4833
- delete[] data;
4800
+ GetField (args, &DH::pub_key,
4801
+ " No public key - did you forget to generate one?" );
4834
4802
}
4835
4803
4836
4804
4837
4805
void DiffieHellman::GetPrivateKey (const FunctionCallbackInfo<Value>& args) {
4838
- Environment* env = Environment::GetCurrent (args);
4839
-
4840
- DiffieHellman* diffieHellman;
4841
- ASSIGN_OR_RETURN_UNWRAP (&diffieHellman, args.Holder ());
4842
-
4843
- if (!diffieHellman->initialised_ ) {
4844
- return ThrowCryptoError (env, ERR_get_error (), " Not initialized" );
4845
- }
4846
-
4847
- if (diffieHellman->dh ->priv_key == nullptr ) {
4848
- return env->ThrowError (" No private key - did you forget to generate one?" );
4849
- }
4850
-
4851
- int dataSize = BN_num_bytes (diffieHellman->dh ->priv_key );
4852
- char * data = new char [dataSize];
4853
- BN_bn2bin (diffieHellman->dh ->priv_key ,
4854
- reinterpret_cast <unsigned char *>(data));
4855
-
4856
- args.GetReturnValue ().Set (Encode (env->isolate (), data, dataSize, BUFFER));
4857
- delete[] data;
4806
+ GetField (args, &DH::priv_key,
4807
+ " No private key - did you forget to generate one?" );
4858
4808
}
4859
4809
4860
4810
@@ -4882,7 +4832,7 @@ void DiffieHellman::ComputeSecret(const FunctionCallbackInfo<Value>& args) {
4882
4832
}
4883
4833
4884
4834
int dataSize = DH_size (diffieHellman->dh );
4885
- char * data = new char [ dataSize] ;
4835
+ char * data = Malloc ( dataSize) ;
4886
4836
4887
4837
int size = DH_compute_key (reinterpret_cast <unsigned char *>(data),
4888
4838
key,
@@ -4894,7 +4844,7 @@ void DiffieHellman::ComputeSecret(const FunctionCallbackInfo<Value>& args) {
4894
4844
4895
4845
checked = DH_check_pub_key (diffieHellman->dh , key, &checkResult);
4896
4846
BN_free (key);
4897
- delete[] data;
4847
+ free ( data) ;
4898
4848
4899
4849
if (!checked) {
4900
4850
return ThrowCryptoError (env, ERR_get_error (), " Invalid Key" );
@@ -4909,6 +4859,8 @@ void DiffieHellman::ComputeSecret(const FunctionCallbackInfo<Value>& args) {
4909
4859
} else {
4910
4860
return env->ThrowError (" Invalid key" );
4911
4861
}
4862
+
4863
+ UNREACHABLE ();
4912
4864
}
4913
4865
4914
4866
BN_free (key);
@@ -4924,8 +4876,8 @@ void DiffieHellman::ComputeSecret(const FunctionCallbackInfo<Value>& args) {
4924
4876
memset (data, 0 , dataSize - size);
4925
4877
}
4926
4878
4927
- args. GetReturnValue (). Set ( Encode ( env->isolate (), data, dataSize, BUFFER) );
4928
- delete[] data ;
4879
+ auto rc = Buffer::New ( env->isolate (), data, dataSize). ToLocalChecked ( );
4880
+ args. GetReturnValue (). Set (rc) ;
4929
4881
}
4930
4882
4931
4883
0 commit comments