@nfen/webcrypto-ts
Version:
Enforced Webcrypto wrapper
106 lines • 2.91 kB
JavaScript
/**
* 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