Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
fixup! crypto: add KMAC Web Cryptography algorithms
  • Loading branch information
panva committed Sep 5, 2025
commit 5f767652a32e863dda78d229af65035adfb7ad1b
24 changes: 13 additions & 11 deletions lib/internal/crypto/mac.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

const {
ArrayFrom,
NumberParseInt,
SafeSet,
StringPrototypeSubstring,
} = primordials;
Expand Down Expand Up @@ -52,11 +51,11 @@ const {
const generateKey = promisify(_generateKey);

async function hmacGenerateKey(algorithm, extractable, keyUsages) {
const { hash, name } = algorithm;
let { length } = algorithm;

if (length === undefined)
length = getBlockSize(hash.name);
const {
hash,
name,
length = getBlockSize(hash.name),
} = algorithm;

const usageSet = new SafeSet(keyUsages);
if (hasAnyNotIn(usageSet, ['sign', 'verify'])) {
Expand All @@ -79,11 +78,14 @@ async function hmacGenerateKey(algorithm, extractable, keyUsages) {
}

async function kmacGenerateKey(algorithm, extractable, keyUsages) {
const { name } = algorithm;
let { length } = algorithm;

if (length === undefined)
length = NumberParseInt(StringPrototypeSubstring(name, 4), 10);
const {
name,
length = {
__proto__: null,
KMAC128: 128,
KMAC256: 256,
}[name],
} = algorithm;

const usageSet = new SafeSet(keyUsages);
if (hasAnyNotIn(usageSet, ['sign', 'verify'])) {
Expand Down
25 changes: 14 additions & 11 deletions src/crypto/crypto_kmac.cc
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ KmacConfig::KmacConfig(KmacConfig&& other) noexcept
data(std::move(other.data)),
signature(std::move(other.signature)),
customization(std::move(other.customization)),
algorithm_name(std::move(other.algorithm_name)),
variant(other.variant),
length(other.length) {}

KmacConfig& KmacConfig::operator=(KmacConfig&& other) noexcept {
Expand Down Expand Up @@ -72,11 +72,16 @@ Maybe<void> KmacTraits::AdditionalConfig(

CHECK(args[offset + 2]->IsString()); // Algorithm name
Utf8Value algorithm_name(env->isolate(), args[offset + 2]);
params->algorithm_name = std::string(*algorithm_name);

// Validate algorithm name.
CHECK(params->algorithm_name == "KMAC128" ||
params->algorithm_name == "KMAC256");
std::string algorithm_str = algorithm_name.ToString();

// Convert string to enum and validate
if (algorithm_str == OSSL_MAC_NAME_KMAC128) {
params->variant = KmacVariant::KMAC128;
} else if (algorithm_str == OSSL_MAC_NAME_KMAC256) {
params->variant = KmacVariant::KMAC256;
} else {
UNREACHABLE();
}

// Customization string (may be empty or undefined).
if (!args[offset + 3]->IsUndefined()) {
Expand Down Expand Up @@ -131,12 +136,10 @@ bool KmacTraits::DeriveBits(Environment* env,
return false;
}

const char* algorithm = params.algorithm_name.c_str();
CHECK(params.algorithm_name == "KMAC128" ||
params.algorithm_name == "KMAC256");

// Fetch the KMAC algorithm
auto mac = EVPMacPointer::Fetch(algorithm);
auto mac = EVPMacPointer::Fetch((params.variant == KmacVariant::KMAC128)
? OSSL_MAC_NAME_KMAC128
: OSSL_MAC_NAME_KMAC256);
if (!mac) {
return false;
}
Expand Down
16 changes: 9 additions & 7 deletions src/crypto/crypto_kmac.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,17 @@ namespace node::crypto {
// KMAC (Keccak Message Authentication Code) is available since OpenSSL 3.0.
#if OPENSSL_VERSION_MAJOR >= 3

enum class KmacVariant { KMAC128, KMAC256 };

struct KmacConfig final : public MemoryRetainer {
CryptoJobMode job_mode;
SignConfiguration::Mode mode;
KeyObjectData key;
ByteSource data;
ByteSource signature;
ByteSource customization;
std::string algorithm_name; // "KMAC128" or "KMAC256"
uint32_t length; // Output length in bytes
KmacVariant variant;
uint32_t length; // Output length in bytes

KmacConfig() = default;

Expand Down Expand Up @@ -64,11 +66,11 @@ void RegisterExternalReferences(ExternalReferenceRegistry* registry);
} // namespace Kmac

#else
// If there is no KMAC support, KmacJob becomes a non-op.
struct KmacJob {
static void Initialize(Environment* env, v8::Local<v8::Object> target) {}
static void RegisterExternalReferences(ExternalReferenceRegistry* registry) {}
};
// If there is no KMAC support, provide empty namespace functions.
namespace Kmac {
void Initialize(Environment* env, v8::Local<v8::Object> target) {}
void RegisterExternalReferences(ExternalReferenceRegistry* registry) {}
} // namespace Kmac
#endif

} // namespace node::crypto
Expand Down
Loading