@@ -4606,6 +4606,96 @@ HMACCtxPointer HMACCtxPointer::New() {
4606
4606
return HMACCtxPointer (HMAC_CTX_new ());
4607
4607
}
4608
4608
4609
+ #if OPENSSL_VERSION_MAJOR >= 3
4610
+ EVPMacPointer::EVPMacPointer (EVP_MAC* mac) : mac_ (mac) {}
4611
+
4612
+ EVPMacPointer::EVPMacPointer (EVPMacPointer&& other) noexcept
4613
+ : mac_ (std::move (other.mac_ )) {}
4614
+
4615
+ EVPMacPointer& EVPMacPointer::operator =(EVPMacPointer&& other) noexcept {
4616
+ if (this == &other) return *this ;
4617
+ mac_ = std::move (other.mac_ );
4618
+ return *this ;
4619
+ }
4620
+
4621
+ EVPMacPointer::~EVPMacPointer () {
4622
+ mac_.reset ();
4623
+ }
4624
+
4625
+ void EVPMacPointer::reset (EVP_MAC* mac) {
4626
+ mac_.reset (mac);
4627
+ }
4628
+
4629
+ EVP_MAC* EVPMacPointer::release () {
4630
+ return mac_.release ();
4631
+ }
4632
+
4633
+ EVPMacPointer EVPMacPointer::Fetch (const char * algorithm) {
4634
+ return EVPMacPointer (EVP_MAC_fetch (nullptr , algorithm, nullptr ));
4635
+ }
4636
+
4637
+ EVPMacCtxPointer::EVPMacCtxPointer (EVP_MAC_CTX* ctx) : ctx_ (ctx) {}
4638
+
4639
+ EVPMacCtxPointer::EVPMacCtxPointer (EVPMacCtxPointer&& other) noexcept
4640
+ : ctx_ (std::move (other.ctx_ )) {}
4641
+
4642
+ EVPMacCtxPointer& EVPMacCtxPointer::operator =(
4643
+ EVPMacCtxPointer&& other) noexcept {
4644
+ if (this == &other) return *this ;
4645
+ ctx_ = std::move (other.ctx_ );
4646
+ return *this ;
4647
+ }
4648
+
4649
+ EVPMacCtxPointer::~EVPMacCtxPointer () {
4650
+ ctx_.reset ();
4651
+ }
4652
+
4653
+ void EVPMacCtxPointer::reset (EVP_MAC_CTX* ctx) {
4654
+ ctx_.reset (ctx);
4655
+ }
4656
+
4657
+ EVP_MAC_CTX* EVPMacCtxPointer::release () {
4658
+ return ctx_.release ();
4659
+ }
4660
+
4661
+ bool EVPMacCtxPointer::init (const Buffer<const void >& key,
4662
+ const OSSL_PARAM* params) {
4663
+ if (!ctx_) return false ;
4664
+ return EVP_MAC_init (ctx_.get (),
4665
+ static_cast <const unsigned char *>(key.data ),
4666
+ key.len ,
4667
+ params) == 1 ;
4668
+ }
4669
+
4670
+ bool EVPMacCtxPointer::update (const Buffer<const void >& data) {
4671
+ if (!ctx_) return false ;
4672
+ return EVP_MAC_update (ctx_.get (),
4673
+ static_cast <const unsigned char *>(data.data ),
4674
+ data.len ) == 1 ;
4675
+ }
4676
+
4677
+ DataPointer EVPMacCtxPointer::final (size_t length) {
4678
+ if (!ctx_) return {};
4679
+ auto buf = DataPointer::Alloc (length);
4680
+ if (!buf) return {};
4681
+
4682
+ size_t result_len = length;
4683
+ if (EVP_MAC_final (ctx_.get (),
4684
+ static_cast <unsigned char *>(buf.get ()),
4685
+ &result_len,
4686
+ length) != 1 ) {
4687
+ return {};
4688
+ }
4689
+
4690
+ return buf;
4691
+ }
4692
+
4693
+ EVPMacCtxPointer EVPMacCtxPointer::New (EVP_MAC* mac) {
4694
+ if (!mac) return EVPMacCtxPointer ();
4695
+ return EVPMacCtxPointer (EVP_MAC_CTX_new (mac));
4696
+ }
4697
+ #endif // OPENSSL_VERSION_MAJOR >= 3
4698
+
4609
4699
DataPointer hashDigest (const Buffer<const unsigned char >& buf,
4610
4700
const EVP_MD* md) {
4611
4701
if (md == nullptr ) return {};
0 commit comments