@@ -4344,6 +4344,96 @@ HMACCtxPointer HMACCtxPointer::New() {
43444344  return  HMACCtxPointer (HMAC_CTX_new ());
43454345}
43464346
4347+ #if  OPENSSL_VERSION_MAJOR >= 3
4348+ EVPMacPointer::EVPMacPointer (EVP_MAC* mac) : mac_ (mac) {}
4349+ 
4350+ EVPMacPointer::EVPMacPointer (EVPMacPointer&& other) noexcept 
4351+     : mac_ (std::move (other.mac_ )) {}
4352+ 
4353+ EVPMacPointer& EVPMacPointer::operator =(EVPMacPointer&& other) noexcept  {
4354+   if  (this  == &other) return  *this ;
4355+   mac_ = std::move (other.mac_ );
4356+   return  *this ;
4357+ }
4358+ 
4359+ EVPMacPointer::~EVPMacPointer () {
4360+   mac_.reset ();
4361+ }
4362+ 
4363+ void  EVPMacPointer::reset (EVP_MAC* mac) {
4364+   mac_.reset (mac);
4365+ }
4366+ 
4367+ EVP_MAC* EVPMacPointer::release () {
4368+   return  mac_.release ();
4369+ }
4370+ 
4371+ EVPMacPointer EVPMacPointer::Fetch (const  char * algorithm) {
4372+   return  EVPMacPointer (EVP_MAC_fetch (nullptr , algorithm, nullptr ));
4373+ }
4374+ 
4375+ EVPMacCtxPointer::EVPMacCtxPointer (EVP_MAC_CTX* ctx) : ctx_ (ctx) {}
4376+ 
4377+ EVPMacCtxPointer::EVPMacCtxPointer (EVPMacCtxPointer&& other) noexcept 
4378+     : ctx_ (std::move (other.ctx_ )) {}
4379+ 
4380+ EVPMacCtxPointer& EVPMacCtxPointer::operator =(
4381+     EVPMacCtxPointer&& other) noexcept  {
4382+   if  (this  == &other) return  *this ;
4383+   ctx_ = std::move (other.ctx_ );
4384+   return  *this ;
4385+ }
4386+ 
4387+ EVPMacCtxPointer::~EVPMacCtxPointer () {
4388+   ctx_.reset ();
4389+ }
4390+ 
4391+ void  EVPMacCtxPointer::reset (EVP_MAC_CTX* ctx) {
4392+   ctx_.reset (ctx);
4393+ }
4394+ 
4395+ EVP_MAC_CTX* EVPMacCtxPointer::release () {
4396+   return  ctx_.release ();
4397+ }
4398+ 
4399+ bool  EVPMacCtxPointer::init (const  Buffer<const  void >& key,
4400+                             const  OSSL_PARAM* params) {
4401+   if  (!ctx_) return  false ;
4402+   return  EVP_MAC_init (ctx_.get (),
4403+                       static_cast <const  unsigned  char *>(key.data ),
4404+                       key.len ,
4405+                       params) == 1 ;
4406+ }
4407+ 
4408+ bool  EVPMacCtxPointer::update (const  Buffer<const  void >& data) {
4409+   if  (!ctx_) return  false ;
4410+   return  EVP_MAC_update (ctx_.get (),
4411+                         static_cast <const  unsigned  char *>(data.data ),
4412+                         data.len ) == 1 ;
4413+ }
4414+ 
4415+ DataPointer EVPMacCtxPointer::final (size_t  length) {
4416+   if  (!ctx_) return  {};
4417+   auto  buf = DataPointer::Alloc (length);
4418+   if  (!buf) return  {};
4419+ 
4420+   size_t  result_len = length;
4421+   if  (EVP_MAC_final (ctx_.get (),
4422+                     static_cast <unsigned  char *>(buf.get ()),
4423+                     &result_len,
4424+                     length) != 1 ) {
4425+     return  {};
4426+   }
4427+ 
4428+   return  buf;
4429+ }
4430+ 
4431+ EVPMacCtxPointer EVPMacCtxPointer::New (EVP_MAC* mac) {
4432+   if  (!mac) return  EVPMacCtxPointer ();
4433+   return  EVPMacCtxPointer (EVP_MAC_CTX_new (mac));
4434+ }
4435+ #endif   //  OPENSSL_VERSION_MAJOR >= 3
4436+ 
43474437DataPointer hashDigest (const  Buffer<const  unsigned  char >& buf,
43484438                       const  EVP_MD* md) {
43494439  if  (md == nullptr ) return  {};
0 commit comments