Skip to content

Commit f227d31

Browse files
committed
crypto: add KMAC Web Cryptography algorithms
1 parent ec8c73d commit f227d31

22 files changed

+1316
-70
lines changed

deps/ncrypto/ncrypto.cc

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4413,6 +4413,96 @@ HMACCtxPointer HMACCtxPointer::New() {
44134413
return HMACCtxPointer(HMAC_CTX_new());
44144414
}
44154415

4416+
#if OPENSSL_VERSION_NUMBER >= 0x30100000L
4417+
EVPMacPointer::EVPMacPointer(EVP_MAC* mac) : mac_(mac) {}
4418+
4419+
EVPMacPointer::EVPMacPointer(EVPMacPointer&& other) noexcept
4420+
: mac_(std::move(other.mac_)) {}
4421+
4422+
EVPMacPointer& EVPMacPointer::operator=(EVPMacPointer&& other) noexcept {
4423+
if (this == &other) return *this;
4424+
mac_ = std::move(other.mac_);
4425+
return *this;
4426+
}
4427+
4428+
EVPMacPointer::~EVPMacPointer() {
4429+
mac_.reset();
4430+
}
4431+
4432+
void EVPMacPointer::reset(EVP_MAC* mac) {
4433+
mac_.reset(mac);
4434+
}
4435+
4436+
EVP_MAC* EVPMacPointer::release() {
4437+
return mac_.release();
4438+
}
4439+
4440+
EVPMacPointer EVPMacPointer::Fetch(const char* algorithm) {
4441+
return EVPMacPointer(EVP_MAC_fetch(nullptr, algorithm, nullptr));
4442+
}
4443+
4444+
EVPMacCtxPointer::EVPMacCtxPointer(EVP_MAC_CTX* ctx) : ctx_(ctx) {}
4445+
4446+
EVPMacCtxPointer::EVPMacCtxPointer(EVPMacCtxPointer&& other) noexcept
4447+
: ctx_(std::move(other.ctx_)) {}
4448+
4449+
EVPMacCtxPointer& EVPMacCtxPointer::operator=(
4450+
EVPMacCtxPointer&& other) noexcept {
4451+
if (this == &other) return *this;
4452+
ctx_ = std::move(other.ctx_);
4453+
return *this;
4454+
}
4455+
4456+
EVPMacCtxPointer::~EVPMacCtxPointer() {
4457+
ctx_.reset();
4458+
}
4459+
4460+
void EVPMacCtxPointer::reset(EVP_MAC_CTX* ctx) {
4461+
ctx_.reset(ctx);
4462+
}
4463+
4464+
EVP_MAC_CTX* EVPMacCtxPointer::release() {
4465+
return ctx_.release();
4466+
}
4467+
4468+
bool EVPMacCtxPointer::init(const Buffer<const void>& key,
4469+
const OSSL_PARAM* params) {
4470+
if (!ctx_) return false;
4471+
return EVP_MAC_init(ctx_.get(),
4472+
static_cast<const unsigned char*>(key.data),
4473+
key.len,
4474+
params) == 1;
4475+
}
4476+
4477+
bool EVPMacCtxPointer::update(const Buffer<const void>& data) {
4478+
if (!ctx_) return false;
4479+
return EVP_MAC_update(ctx_.get(),
4480+
static_cast<const unsigned char*>(data.data),
4481+
data.len) == 1;
4482+
}
4483+
4484+
DataPointer EVPMacCtxPointer::final(size_t length) {
4485+
if (!ctx_) return {};
4486+
auto buf = DataPointer::Alloc(length);
4487+
if (!buf) return {};
4488+
4489+
size_t result_len = length;
4490+
if (EVP_MAC_final(ctx_.get(),
4491+
static_cast<unsigned char*>(buf.get()),
4492+
&result_len,
4493+
length) != 1) {
4494+
return {};
4495+
}
4496+
4497+
return buf;
4498+
}
4499+
4500+
EVPMacCtxPointer EVPMacCtxPointer::New(EVP_MAC* mac) {
4501+
if (!mac) return EVPMacCtxPointer();
4502+
return EVPMacCtxPointer(EVP_MAC_CTX_new(mac));
4503+
}
4504+
#endif // OPENSSL_VERSION_NUMBER >= 0x30100000L
4505+
44164506
DataPointer hashDigest(const Buffer<const unsigned char>& buf,
44174507
const EVP_MD* md) {
44184508
if (md == nullptr) return {};

deps/ncrypto/ncrypto.h

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,8 @@ class DataPointer;
229229
class DHPointer;
230230
class ECKeyPointer;
231231
class EVPKeyPointer;
232+
class EVPMacCtxPointer;
233+
class EVPMacPointer;
232234
class EVPMDCtxPointer;
233235
class SSLCtxPointer;
234236
class SSLPointer;
@@ -1451,6 +1453,56 @@ class HMACCtxPointer final {
14511453
DeleteFnPtr<HMAC_CTX, HMAC_CTX_free> ctx_;
14521454
};
14531455

1456+
#if OPENSSL_VERSION_NUMBER >= 0x30100000L
1457+
class EVPMacPointer final {
1458+
public:
1459+
EVPMacPointer() = default;
1460+
explicit EVPMacPointer(EVP_MAC* mac);
1461+
EVPMacPointer(EVPMacPointer&& other) noexcept;
1462+
EVPMacPointer& operator=(EVPMacPointer&& other) noexcept;
1463+
NCRYPTO_DISALLOW_COPY(EVPMacPointer)
1464+
~EVPMacPointer();
1465+
1466+
inline bool operator==(std::nullptr_t) noexcept { return mac_ == nullptr; }
1467+
inline operator bool() const { return mac_ != nullptr; }
1468+
inline EVP_MAC* get() const { return mac_.get(); }
1469+
inline operator EVP_MAC*() const { return mac_.get(); }
1470+
void reset(EVP_MAC* mac = nullptr);
1471+
EVP_MAC* release();
1472+
1473+
static EVPMacPointer Fetch(const char* algorithm);
1474+
1475+
private:
1476+
DeleteFnPtr<EVP_MAC, EVP_MAC_free> mac_;
1477+
};
1478+
1479+
class EVPMacCtxPointer final {
1480+
public:
1481+
EVPMacCtxPointer() = default;
1482+
explicit EVPMacCtxPointer(EVP_MAC_CTX* ctx);
1483+
EVPMacCtxPointer(EVPMacCtxPointer&& other) noexcept;
1484+
EVPMacCtxPointer& operator=(EVPMacCtxPointer&& other) noexcept;
1485+
NCRYPTO_DISALLOW_COPY(EVPMacCtxPointer)
1486+
~EVPMacCtxPointer();
1487+
1488+
inline bool operator==(std::nullptr_t) noexcept { return ctx_ == nullptr; }
1489+
inline operator bool() const { return ctx_ != nullptr; }
1490+
inline EVP_MAC_CTX* get() const { return ctx_.get(); }
1491+
inline operator EVP_MAC_CTX*() const { return ctx_.get(); }
1492+
void reset(EVP_MAC_CTX* ctx = nullptr);
1493+
EVP_MAC_CTX* release();
1494+
1495+
bool init(const Buffer<const void>& key, const OSSL_PARAM* params = nullptr);
1496+
bool update(const Buffer<const void>& data);
1497+
DataPointer final(size_t length);
1498+
1499+
static EVPMacCtxPointer New(EVP_MAC* mac);
1500+
1501+
private:
1502+
DeleteFnPtr<EVP_MAC_CTX, EVP_MAC_CTX_free> ctx_;
1503+
};
1504+
#endif // OPENSSL_VERSION_NUMBER >= 0x30100000L
1505+
14541506
#ifndef OPENSSL_NO_ENGINE
14551507
class EnginePointer final {
14561508
public:

0 commit comments

Comments
 (0)