@@ -3517,36 +3517,38 @@ void Sign::SignUpdate(const FunctionCallbackInfo<Value>& args) {
3517
3517
sign->CheckThrow (err);
3518
3518
}
3519
3519
3520
- static int Node_SignFinal (EVPMDPointer&& mdctx, unsigned char * md ,
3521
- unsigned int * sig_len ,
3522
- const EVPKeyPointer& pkey, int padding,
3523
- int pss_salt_len) {
3520
+ static MallocedBuffer< unsigned char > Node_SignFinal (EVPMDPointer&& mdctx,
3521
+ const EVPKeyPointer& pkey ,
3522
+ int padding,
3523
+ int pss_salt_len) {
3524
3524
unsigned char m[EVP_MAX_MD_SIZE];
3525
3525
unsigned int m_len;
3526
3526
3527
- *sig_len = 0 ;
3528
3527
if (!EVP_DigestFinal_ex (mdctx.get (), m, &m_len))
3529
- return 0 ;
3528
+ return MallocedBuffer<unsigned char >();
3529
+
3530
+ int signed_sig_len = EVP_PKEY_size (pkey.get ());
3531
+ CHECK_GE (signed_sig_len, 0 );
3532
+ size_t sig_len = static_cast <size_t >(signed_sig_len);
3533
+ MallocedBuffer<unsigned char > sig (sig_len);
3530
3534
3531
- size_t sltmp = static_cast <size_t >(EVP_PKEY_size (pkey.get ()));
3532
3535
EVPKeyCtxPointer pkctx (EVP_PKEY_CTX_new (pkey.get (), nullptr ));
3533
3536
if (pkctx &&
3534
3537
EVP_PKEY_sign_init (pkctx.get ()) > 0 &&
3535
3538
ApplyRSAOptions (pkey, pkctx.get (), padding, pss_salt_len) &&
3536
3539
EVP_PKEY_CTX_set_signature_md (pkctx.get (),
3537
3540
EVP_MD_CTX_md (mdctx.get ())) > 0 &&
3538
- EVP_PKEY_sign (pkctx.get (), md, &sltmp, m, m_len) > 0 ) {
3539
- *sig_len = sltmp;
3540
- return 1 ;
3541
+ EVP_PKEY_sign (pkctx.get (), sig.data , &sig_len, m, m_len) > 0 ) {
3542
+ return MallocedBuffer<unsigned char >(sig.release (), sig_len);
3541
3543
}
3542
- return 0 ;
3544
+
3545
+ return MallocedBuffer<unsigned char >();
3543
3546
}
3544
3547
3545
3548
SignBase::Error Sign::SignFinal (const char * key_pem,
3546
3549
int key_pem_len,
3547
3550
const char * passphrase,
3548
- unsigned char * sig,
3549
- unsigned int * sig_len,
3551
+ MallocedBuffer<unsigned char >* buffer,
3550
3552
int padding,
3551
3553
int salt_len) {
3552
3554
if (!mdctx_)
@@ -3591,10 +3593,8 @@ SignBase::Error Sign::SignFinal(const char* key_pem,
3591
3593
}
3592
3594
#endif // NODE_FIPS_MODE
3593
3595
3594
- if (Node_SignFinal (std::move (mdctx), sig, sig_len, pkey, padding, salt_len))
3595
- return kSignOk ;
3596
- else
3597
- return kSignPrivateKey ;
3596
+ *buffer = Node_SignFinal (std::move (mdctx), pkey, padding, salt_len);
3597
+ return buffer->is_empty () ? kSignPrivateKey : kSignOk ;
3598
3598
}
3599
3599
3600
3600
@@ -3618,22 +3618,20 @@ void Sign::SignFinal(const FunctionCallbackInfo<Value>& args) {
3618
3618
int salt_len = args[3 ].As <Int32>()->Value ();
3619
3619
3620
3620
ClearErrorOnReturn clear_error_on_return;
3621
- unsigned char md_value[8192 ];
3622
- unsigned int md_len = sizeof (md_value);
3621
+ MallocedBuffer<unsigned char > sig;
3623
3622
3624
3623
Error err = sign->SignFinal (
3625
3624
buf,
3626
3625
buf_len,
3627
3626
len >= 2 && !args[1 ]->IsNull () ? *passphrase : nullptr ,
3628
- md_value,
3629
- &md_len,
3627
+ &sig,
3630
3628
padding,
3631
3629
salt_len);
3632
3630
if (err != kSignOk )
3633
3631
return sign->CheckThrow (err);
3634
3632
3635
3633
Local<Object> rc =
3636
- Buffer::Copy (env, reinterpret_cast <char *>(md_value ), md_len )
3634
+ Buffer::New (env, reinterpret_cast <char *>(sig. data ), sig. size )
3637
3635
.ToLocalChecked ();
3638
3636
args.GetReturnValue ().Set (rc);
3639
3637
}
0 commit comments