@@ -4762,99 +4762,49 @@ void DiffieHellman::GenerateKeys(const FunctionCallbackInfo<Value>& args) {
47624762    return  ThrowCryptoError (env, ERR_get_error (), " Key generation failed" 
47634763  }
47644764
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 ());
47724769}
47734770
47744771
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) {
47764774  Environment* env = Environment::GetCurrent (args);
47774775
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" 
47804779
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);
47844782
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+ }
47884788
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 " ) ;
47914791}
47924792
47934793
47944794void  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" 
48104796}
48114797
48124798
48134799void  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?" 
48344802}
48354803
48364804
48374805void  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?" 
48584808}
48594809
48604810
@@ -4882,7 +4832,7 @@ void DiffieHellman::ComputeSecret(const FunctionCallbackInfo<Value>& args) {
48824832  }
48834833
48844834  int  dataSize = DH_size (diffieHellman->dh );
4885-   char * data = new   char [ dataSize] ;
4835+   char * data = Malloc ( dataSize) ;
48864836
48874837  int  size = DH_compute_key (reinterpret_cast <unsigned  char *>(data),
48884838                            key,
@@ -4894,7 +4844,7 @@ void DiffieHellman::ComputeSecret(const FunctionCallbackInfo<Value>& args) {
48944844
48954845    checked = DH_check_pub_key (diffieHellman->dh , key, &checkResult);
48964846    BN_free (key);
4897-     delete[]   data;
4847+     free ( data) ;
48984848
48994849    if  (!checked) {
49004850      return  ThrowCryptoError (env, ERR_get_error (), " Invalid Key" 
@@ -4909,6 +4859,8 @@ void DiffieHellman::ComputeSecret(const FunctionCallbackInfo<Value>& args) {
49094859    } else  {
49104860      return  env->ThrowError (" Invalid key" 
49114861    }
4862+ 
4863+     UNREACHABLE ();
49124864  }
49134865
49144866  BN_free (key);
@@ -4924,8 +4876,8 @@ void DiffieHellman::ComputeSecret(const FunctionCallbackInfo<Value>& args) {
49244876    memset (data, 0 , dataSize - size);
49254877  }
49264878
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) ;
49294881}
49304882
49314883
0 commit comments