Skip to content

Commit 4df1cd8

Browse files
panvanpaun
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 8db21e4 commit 4df1cd8

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;
@@ -1341,6 +1343,56 @@ class HMACCtxPointer final {
13411343
DeleteFnPtr<HMAC_CTX, HMAC_CTX_free> ctx_;
13421344
};
13431345

1346+
#if OPENSSL_VERSION_MAJOR >= 3
1347+
class EVPMacPointer final {
1348+
public:
1349+
EVPMacPointer() = default;
1350+
explicit EVPMacPointer(EVP_MAC* mac);
1351+
EVPMacPointer(EVPMacPointer&& other) noexcept;
1352+
EVPMacPointer& operator=(EVPMacPointer&& other) noexcept;
1353+
NCRYPTO_DISALLOW_COPY(EVPMacPointer)
1354+
~EVPMacPointer();
1355+
1356+
inline bool operator==(std::nullptr_t) noexcept { return mac_ == nullptr; }
1357+
inline operator bool() const { return mac_ != nullptr; }
1358+
inline EVP_MAC* get() const { return mac_.get(); }
1359+
inline operator EVP_MAC*() const { return mac_.get(); }
1360+
void reset(EVP_MAC* mac = nullptr);
1361+
EVP_MAC* release();
1362+
1363+
static EVPMacPointer Fetch(const char* algorithm);
1364+
1365+
private:
1366+
DeleteFnPtr<EVP_MAC, EVP_MAC_free> mac_;
1367+
};
1368+
1369+
class EVPMacCtxPointer final {
1370+
public:
1371+
EVPMacCtxPointer() = default;
1372+
explicit EVPMacCtxPointer(EVP_MAC_CTX* ctx);
1373+
EVPMacCtxPointer(EVPMacCtxPointer&& other) noexcept;
1374+
EVPMacCtxPointer& operator=(EVPMacCtxPointer&& other) noexcept;
1375+
NCRYPTO_DISALLOW_COPY(EVPMacCtxPointer)
1376+
~EVPMacCtxPointer();
1377+
1378+
inline bool operator==(std::nullptr_t) noexcept { return ctx_ == nullptr; }
1379+
inline operator bool() const { return ctx_ != nullptr; }
1380+
inline EVP_MAC_CTX* get() const { return ctx_.get(); }
1381+
inline operator EVP_MAC_CTX*() const { return ctx_.get(); }
1382+
void reset(EVP_MAC_CTX* ctx = nullptr);
1383+
EVP_MAC_CTX* release();
1384+
1385+
bool init(const Buffer<const void>& key, const OSSL_PARAM* params = nullptr);
1386+
bool update(const Buffer<const void>& data);
1387+
DataPointer final(size_t length);
1388+
1389+
static EVPMacCtxPointer New(EVP_MAC* mac);
1390+
1391+
private:
1392+
DeleteFnPtr<EVP_MAC_CTX, EVP_MAC_CTX_free> ctx_;
1393+
};
1394+
#endif // OPENSSL_VERSION_MAJOR >= 3
1395+
13441396
#ifndef OPENSSL_NO_ENGINE
13451397
class EnginePointer final {
13461398
public:

src/ncrypto.cpp

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
43474437
DataPointer hashDigest(const Buffer<const unsigned char>& buf,
43484438
const EVP_MD* md) {
43494439
if (md == nullptr) return {};

0 commit comments

Comments
 (0)