| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 | "use strict";Object.defineProperty(exports, "__esModule", { value: true });exports.hmac = exports.HMAC = void 0;const _assert_js_1 = require("./_assert.js");const utils_js_1 = require("./utils.js");// HMAC (RFC 2104)class HMAC extends utils_js_1.Hash {    constructor(hash, _key) {        super();        this.finished = false;        this.destroyed = false;        (0, _assert_js_1.hash)(hash);        const key = (0, utils_js_1.toBytes)(_key);        this.iHash = hash.create();        if (typeof this.iHash.update !== 'function')            throw new Error('Expected instance of class which extends utils.Hash');        this.blockLen = this.iHash.blockLen;        this.outputLen = this.iHash.outputLen;        const blockLen = this.blockLen;        const pad = new Uint8Array(blockLen);        // blockLen can be bigger than outputLen        pad.set(key.length > blockLen ? hash.create().update(key).digest() : key);        for (let i = 0; i < pad.length; i++)            pad[i] ^= 0x36;        this.iHash.update(pad);        // By doing update (processing of first block) of outer hash here we can re-use it between multiple calls via clone        this.oHash = hash.create();        // Undo internal XOR && apply outer XOR        for (let i = 0; i < pad.length; i++)            pad[i] ^= 0x36 ^ 0x5c;        this.oHash.update(pad);        pad.fill(0);    }    update(buf) {        (0, _assert_js_1.exists)(this);        this.iHash.update(buf);        return this;    }    digestInto(out) {        (0, _assert_js_1.exists)(this);        (0, _assert_js_1.bytes)(out, this.outputLen);        this.finished = true;        this.iHash.digestInto(out);        this.oHash.update(out);        this.oHash.digestInto(out);        this.destroy();    }    digest() {        const out = new Uint8Array(this.oHash.outputLen);        this.digestInto(out);        return out;    }    _cloneInto(to) {        // Create new instance without calling constructor since key already in state and we don't know it.        to || (to = Object.create(Object.getPrototypeOf(this), {}));        const { oHash, iHash, finished, destroyed, blockLen, outputLen } = this;        to = to;        to.finished = finished;        to.destroyed = destroyed;        to.blockLen = blockLen;        to.outputLen = outputLen;        to.oHash = oHash._cloneInto(to.oHash);        to.iHash = iHash._cloneInto(to.iHash);        return to;    }    destroy() {        this.destroyed = true;        this.oHash.destroy();        this.iHash.destroy();    }}exports.HMAC = HMAC;/** * HMAC: RFC2104 message authentication code. * @param hash - function that would be used e.g. sha256 * @param key - message key * @param message - message data */const hmac = (hash, key, message) => new HMAC(hash, key).update(message).digest();exports.hmac = hmac;exports.hmac.create = (hash, key) => new HMAC(hash, key);//# sourceMappingURL=hmac.js.map
 |