@@ -70,42 +70,42 @@ std::shared_ptr<ArrayBuffer> XChaCha20Poly1305Cipher::final() {
7070 throw std::runtime_error (" XChaCha20Poly1305Cipher: libsodium must be enabled (BLSALLOC_SODIUM)" );
7171#else
7272 if (is_cipher) {
73- uint8_t * ciphertext = new uint8_t [data_buffer_.size ()] ;
73+ auto ciphertext = std::make_unique< uint8_t []>( data_buffer_.size ()) ;
7474
7575 int result =
76- crypto_aead_xchacha20poly1305_ietf_encrypt_detached (ciphertext, auth_tag_, nullptr , data_buffer_.data (), data_buffer_.size (),
76+ crypto_aead_xchacha20poly1305_ietf_encrypt_detached (ciphertext. get () , auth_tag_, nullptr , data_buffer_.data (), data_buffer_.size (),
7777 aad_.empty () ? nullptr : aad_.data (), aad_.size (), nullptr , nonce_, key_);
7878
7979 if (result != 0 ) {
80- sodium_memzero (ciphertext, data_buffer_.size ());
81- delete[] ciphertext;
80+ sodium_memzero (ciphertext.get (), data_buffer_.size ());
8281 throw std::runtime_error (" XChaCha20Poly1305Cipher: encryption failed" );
8382 }
8483
8584 is_finalized = true ;
8685 size_t ct_len = data_buffer_.size ();
87- return std::make_shared<NativeArrayBuffer>(ciphertext, ct_len, [=]() { delete[] ciphertext; });
86+ uint8_t * raw_ptr = ciphertext.get ();
87+ return std::make_shared<NativeArrayBuffer>(ciphertext.release (), ct_len, [raw_ptr]() { delete[] raw_ptr; });
8888 } else {
8989 if (data_buffer_.empty ()) {
9090 is_finalized = true ;
9191 return std::make_shared<NativeArrayBuffer>(nullptr , 0 , nullptr );
9292 }
9393
94- uint8_t * plaintext = new uint8_t [data_buffer_.size ()] ;
94+ auto plaintext = std::make_unique< uint8_t []>( data_buffer_.size ()) ;
9595
9696 int result =
97- crypto_aead_xchacha20poly1305_ietf_decrypt_detached (plaintext, nullptr , data_buffer_.data (), data_buffer_.size (), auth_tag_,
97+ crypto_aead_xchacha20poly1305_ietf_decrypt_detached (plaintext. get () , nullptr , data_buffer_.data (), data_buffer_.size (), auth_tag_,
9898 aad_.empty () ? nullptr : aad_.data (), aad_.size (), nonce_, key_);
9999
100100 if (result != 0 ) {
101- sodium_memzero (plaintext, data_buffer_.size ());
102- delete[] plaintext;
101+ sodium_memzero (plaintext.get (), data_buffer_.size ());
103102 throw std::runtime_error (" XChaCha20Poly1305Cipher: decryption failed - authentication tag mismatch" );
104103 }
105104
106105 is_finalized = true ;
107106 size_t pt_len = data_buffer_.size ();
108- return std::make_shared<NativeArrayBuffer>(plaintext, pt_len, [=]() { delete[] plaintext; });
107+ uint8_t * raw_ptr = plaintext.get ();
108+ return std::make_shared<NativeArrayBuffer>(plaintext.release (), pt_len, [raw_ptr]() { delete[] raw_ptr; });
109109 }
110110#endif
111111}
@@ -132,9 +132,10 @@ std::shared_ptr<ArrayBuffer> XChaCha20Poly1305Cipher::getAuthTag() {
132132 throw std::runtime_error (" getAuthTag must be called after final()" );
133133 }
134134
135- uint8_t * tag_copy = new uint8_t [kTagSize ];
136- std::memcpy (tag_copy, auth_tag_, kTagSize );
137- return std::make_shared<NativeArrayBuffer>(tag_copy, kTagSize , [=]() { delete[] tag_copy; });
135+ auto tag_copy = std::make_unique<uint8_t []>(kTagSize );
136+ std::memcpy (tag_copy.get (), auth_tag_, kTagSize );
137+ uint8_t * raw_ptr = tag_copy.get ();
138+ return std::make_shared<NativeArrayBuffer>(tag_copy.release (), kTagSize , [raw_ptr]() { delete[] raw_ptr; });
138139#endif
139140}
140141
0 commit comments