UNPKG

@nfen/webcrypto-ts

Version:
106 lines 2.91 kB
/** * Code related to HMAC * @module */ import { getKeyUsagePairsByAlg } from "../key_usages.js"; import * as proxy from "../proxy.js"; import { Alg as SHA } from "../sha/shared.js"; import * as WebCrypto from "../webcrypto.js"; /** @hidden */ export const handler = { get(target, prop) { switch (prop) { case "self": return target; case "sign": return (data) => sign(target, data); case "verify": return (signature, data) => verify(target, signature, data); case "exportKey": return (format) => exportKey(format, target); } return Reflect.get(target, prop); }, }; export var Alg; (function (Alg) { let Code; (function (Code) { Code["HMAC"] = "HMAC"; })(Code = Alg.Code || (Alg.Code = {})); })(Alg || (Alg = {})); /** * Generate a new HMAC key * @example * ```ts * const key = await HMAC.generateKey(); * ``` */ export const generateKey = async (algorithm = { hash: SHA.Variant.SHA_512, }, extractable = true, keyUsages) => { const key = await WebCrypto.generateKey({ ...algorithm, name: Alg.Code.HMAC, }, extractable, keyUsages ?? getKeyUsagePairsByAlg(Alg.Code.HMAC)); return proxy.proxifyKey(handler)(key); }; /** * Import an HMAC key from the specified format * @example * ```ts * const key = await HMAC.importKey("jwk", jwk, {hash: "SHA-512"}); * ``` */ export const importKey = async (format, key, algorithm, extractable = true, keyUsages) => { const importedKey = await WebCrypto.importKey(format, key, { ...algorithm, name: Alg.Code.HMAC }, extractable, keyUsages ?? getKeyUsagePairsByAlg(Alg.Code.HMAC)); return proxy.proxifyKey(handler)(importedKey); }; /** * Export an HMAC key into the specified format * @example * ```ts * const jwk = await HMAC.exportKey("jwk", key.self); * ``` * @example * ```ts * const jwk = await key.exportKey("jwk"); * ``` */ export async function exportKey(format, key) { return await WebCrypto.exportKey(format, key); } /** * Sign a given payload * @example * ```ts * const message = new TextEncoder().encode("a message"); * const signature = await HMAC.sign(key.self, message); * ``` * ```ts * const message = new TextEncoder().encode("a message"); * const signature = await key.sign(message); * ``` */ export async function sign(key, data) { return await WebCrypto.sign({ name: Alg.Code.HMAC, }, key, data); } /** * Verify a given signature * @example * ```ts * const isVerified = await HMAC.verify(key, signature, message); * ``` * @example * ```ts * const isVerified = await key.verify(signature, message); * ``` */ export async function verify(key, signature, data) { return await WebCrypto.verify({ name: Alg.Code.HMAC, }, key, signature, data); } //# sourceMappingURL=index.js.map