ibctminer
Version:
```js const IntMiner = require('./src'); const Debug = require('./src/log')(); const fs = require('fs'); const COMP = '[SIPC]';
119 lines (91 loc) • 2.32 kB
JavaScript
/*!
* hmac.js - hmac for bcrypto
* Copyright (c) 2016-2019, Christopher Jeffrey (MIT License).
* https://github.com/bcoin-org/bcrypto
*
* Parts of this software are based on indutny/hash.js:
* Copyright (c) 2014, Fedor Indutny (MIT License).
* https://github.com/indutny/hash.js
*
* Resources:
* https://en.wikipedia.org/wiki/HMAC
* https://tools.ietf.org/html/rfc2104
* https://github.com/indutny/hash.js/blob/master/lib/hash/hmac.js
*/
'use strict';
const assert = require('./assert');
/**
* HMAC
*/
class HMAC {
/**
* Create an HMAC.
* @param {Function} Hash
* @param {Number} size
* @param {Array} [x=[]]
* @param {Array} [y=[]]
*/
constructor(Hash, size, x = [], y = []) {
assert(typeof Hash === 'function');
assert((size >>> 0) === size);
assert(Array.isArray(x));
assert(Array.isArray(y));
this.hash = Hash;
this.size = size;
this.x = x;
this.y = y;
this.inner = new Hash();
this.outer = new Hash();
}
/**
* Initialize HMAC context.
* @param {Buffer} data
*/
init(key) {
assert(Buffer.isBuffer(key));
// Shorten key
if (key.length > this.size) {
const Hash = this.hash;
const h = new Hash();
h.init(...this.x);
h.update(key);
key = h.final(...this.y);
assert(key.length <= this.size);
}
// Pad key
const pad = Buffer.allocUnsafe(this.size);
for (let i = 0; i < key.length; i++)
pad[i] = key[i] ^ 0x36;
for (let i = key.length; i < pad.length; i++)
pad[i] = 0x36;
this.inner.init(...this.x);
this.inner.update(pad);
for (let i = 0; i < key.length; i++)
pad[i] = key[i] ^ 0x5c;
for (let i = key.length; i < pad.length; i++)
pad[i] = 0x5c;
this.outer.init(...this.x);
this.outer.update(pad);
return this;
}
/**
* Update HMAC context.
* @param {Buffer} data
*/
update(data) {
this.inner.update(data);
return this;
}
/**
* Finalize HMAC context.
* @returns {Buffer}
*/
final() {
this.outer.update(this.inner.final(...this.y));
return this.outer.final(...this.y);
}
}
/*
* Expose
*/
module.exports = HMAC;