Skip to content

Commit 00122c0

Browse files
panvaanonrig
authored andcommitted
crypto: add KMAC Web Cryptography algorithms
PR-URL: nodejs/node#59647 Reviewed-By: Anna Henningsen <[email protected]> Reviewed-By: James M Snell <[email protected]>
1 parent 591028d commit 00122c0

File tree

2 files changed

+142
-0
lines changed

2 files changed

+142
-0
lines changed

include/ncrypto.h

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,8 @@ class DataPointer;
235235
class DHPointer;
236236
class ECKeyPointer;
237237
class EVPKeyPointer;
238+
class EVPMacCtxPointer;
239+
class EVPMacPointer;
238240
class EVPMDCtxPointer;
239241
class SSLCtxPointer;
240242
class SSLPointer;
@@ -1471,6 +1473,56 @@ class HMACCtxPointer final {
14711473
DeleteFnPtr<HMAC_CTX, HMAC_CTX_free> ctx_;
14721474
};
14731475

1476+
#if OPENSSL_VERSION_MAJOR >= 3
1477+
class EVPMacPointer final {
1478+
public:
1479+
EVPMacPointer() = default;
1480+
explicit EVPMacPointer(EVP_MAC* mac);
1481+
EVPMacPointer(EVPMacPointer&& other) noexcept;
1482+
EVPMacPointer& operator=(EVPMacPointer&& other) noexcept;
1483+
NCRYPTO_DISALLOW_COPY(EVPMacPointer)
1484+
~EVPMacPointer();
1485+
1486+
inline bool operator==(std::nullptr_t) noexcept { return mac_ == nullptr; }
1487+
inline operator bool() const { return mac_ != nullptr; }
1488+
inline EVP_MAC* get() const { return mac_.get(); }
1489+
inline operator EVP_MAC*() const { return mac_.get(); }
1490+
void reset(EVP_MAC* mac = nullptr);
1491+
EVP_MAC* release();
1492+
1493+
static EVPMacPointer Fetch(const char* algorithm);
1494+
1495+
private:
1496+
DeleteFnPtr<EVP_MAC, EVP_MAC_free> mac_;
1497+
};
1498+
1499+
class EVPMacCtxPointer final {
1500+
public:
1501+
EVPMacCtxPointer() = default;
1502+
explicit EVPMacCtxPointer(EVP_MAC_CTX* ctx);
1503+
EVPMacCtxPointer(EVPMacCtxPointer&& other) noexcept;
1504+
EVPMacCtxPointer& operator=(EVPMacCtxPointer&& other) noexcept;
1505+
NCRYPTO_DISALLOW_COPY(EVPMacCtxPointer)
1506+
~EVPMacCtxPointer();
1507+
1508+
inline bool operator==(std::nullptr_t) noexcept { return ctx_ == nullptr; }
1509+
inline operator bool() const { return ctx_ != nullptr; }
1510+
inline EVP_MAC_CTX* get() const { return ctx_.get(); }
1511+
inline operator EVP_MAC_CTX*() const { return ctx_.get(); }
1512+
void reset(EVP_MAC_CTX* ctx = nullptr);
1513+
EVP_MAC_CTX* release();
1514+
1515+
bool init(const Buffer<const void>& key, const OSSL_PARAM* params = nullptr);
1516+
bool update(const Buffer<const void>& data);
1517+
DataPointer final(size_t length);
1518+
1519+
static EVPMacCtxPointer New(EVP_MAC* mac);
1520+
1521+
private:
1522+
DeleteFnPtr<EVP_MAC_CTX, EVP_MAC_CTX_free> ctx_;
1523+
};
1524+
#endif // OPENSSL_VERSION_MAJOR >= 3
1525+
14741526
#ifndef OPENSSL_NO_ENGINE
14751527
class EnginePointer final {
14761528
public:

src/ncrypto.cpp

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4606,6 +4606,96 @@ HMACCtxPointer HMACCtxPointer::New() {
46064606
return HMACCtxPointer(HMAC_CTX_new());
46074607
}
46084608

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+
46094699
DataPointer hashDigest(const Buffer<const unsigned char>& buf,
46104700
const EVP_MD* md) {
46114701
if (md == nullptr) return {};

0 commit comments

Comments
 (0)