summaryrefslogtreecommitdiff
path: root/ext/node/polyfills/internal/crypto/hkdf.ts
diff options
context:
space:
mode:
Diffstat (limited to 'ext/node/polyfills/internal/crypto/hkdf.ts')
-rw-r--r--ext/node/polyfills/internal/crypto/hkdf.ts28
1 files changed, 20 insertions, 8 deletions
diff --git a/ext/node/polyfills/internal/crypto/hkdf.ts b/ext/node/polyfills/internal/crypto/hkdf.ts
index deeba102f..fb26053df 100644
--- a/ext/node/polyfills/internal/crypto/hkdf.ts
+++ b/ext/node/polyfills/internal/crypto/hkdf.ts
@@ -7,6 +7,7 @@ import {
validateString,
} from "ext:deno_node/internal/validators.mjs";
import {
+ ERR_CRYPTO_INVALID_DIGEST,
ERR_INVALID_ARG_TYPE,
ERR_OUT_OF_RANGE,
hideStackFrames,
@@ -26,17 +27,19 @@ import {
isAnyArrayBuffer,
isArrayBufferView,
} from "ext:deno_node/internal/util/types.ts";
-import { notImplemented } from "ext:deno_node/_utils.ts";
-const validateParameters = hideStackFrames((hash, key, salt, info, length) => {
- key = prepareKey(key);
- salt = toBuf(salt);
- info = toBuf(info);
+const { core } = globalThis.__bootstrap;
+const { ops } = core;
+const validateParameters = hideStackFrames((hash, key, salt, info, length) => {
validateString(hash, "digest");
+ key = new Uint8Array(prepareKey(key));
validateByteSource(salt, "salt");
validateByteSource(info, "info");
+ salt = new Uint8Array(toBuf(salt));
+ info = new Uint8Array(toBuf(info));
+
validateInteger(length, "length", 0, kMaxLength);
if (info.byteLength > 1024) {
@@ -91,7 +94,7 @@ export function hkdf(
salt: BinaryLike,
info: BinaryLike,
length: number,
- callback: (err: Error | null, derivedKey: ArrayBuffer) => void,
+ callback: (err: Error | null, derivedKey: ArrayBuffer | undefined) => void,
) {
({ hash, key, salt, info, length } = validateParameters(
hash,
@@ -103,7 +106,9 @@ export function hkdf(
validateFunction(callback, "callback");
- notImplemented("crypto.hkdf");
+ core.opAsync("op_node_hkdf_async", hash, key, salt, info, length)
+ .then((okm) => callback(null, okm.buffer))
+ .catch((err) => callback(new ERR_CRYPTO_INVALID_DIGEST(err), undefined));
}
export function hkdfSync(
@@ -121,7 +126,14 @@ export function hkdfSync(
length,
));
- notImplemented("crypto.hkdfSync");
+ const okm = new Uint8Array(length);
+ try {
+ ops.op_node_hkdf(hash, key, salt, info, okm);
+ } catch (e) {
+ throw new ERR_CRYPTO_INVALID_DIGEST(e);
+ }
+
+ return okm.buffer;
}
export default {