var Buffer = require('buffer').Buffer; var sha = require('./sha'); var sha256 = require('./sha256'); var md5 = require('./md5'); var algorithms = { sha1: sha, sha256: sha256, md5: md5 }; var blocksize = 64; var zeroBuffer = Buffer.alloc(blocksize); zeroBuffer.fill(0); function hmac(fn, key, data) { if (!Buffer.isBuffer(key)) key = Buffer.from(key); if (!Buffer.isBuffer(data)) data = Buffer.from(data); if (key.length > blocksize) { key = fn(key); } else if (key.length < blocksize) { key = Buffer.concat([key, zeroBuffer], blocksize); } var ipad = Buffer.alloc(blocksize), opad = Buffer.alloc(blocksize); for (var i = 0; i < blocksize; i++) { ipad[i] = key[i] ^ 0x36; opad[i] = key[i] ^ 0x5c; } var hash = fn(Buffer.concat([ipad, data])); return fn(Buffer.concat([opad, hash])); } function hash(alg, key) { alg = alg || 'sha1'; var fn = algorithms[alg]; var bufs = []; var length = 0; if (!fn) error('algorithm:', alg, 'is not yet supported'); return { update: function (data) { if (!Buffer.isBuffer(data)) data = Buffer.from(data); bufs.push(data); length += data.length; return this; }, digest: function (enc) { var buf = Buffer.concat(bufs); var r = key ? hmac(fn, key, buf) : fn(buf); bufs = null; return enc ? r.toString(enc) : r; } }; } function error() { var m = [].slice.call(arguments).join(' '); throw new Error([m, 'we accept pull requests', 'http://github.com/dominictarr/crypto-browserify'].join('\n')); } exports.createHash = function (alg) { return hash(alg); }; exports.createHmac = function (alg, key) { return hash(alg, key); }; exports.createCredentials = () => { error('sorry,createCredentials is not implemented yet'); }; exports.createCipher = () => { error('sorry,createCipher is not implemented yet'); }; exports.createCipheriv = () => { error('sorry,createCipheriv is not implemented yet'); }; exports.createDecipher = () => { error('sorry,createDecipher is not implemented yet'); }; exports.createDecipheriv = () => { error('sorry,createDecipheriv is not implemented yet'); }; exports.createSign = () => { error('sorry,createSign is not implemented yet'); }; exports.createVerify = () => { error('sorry,createVerify is not implemented yet'); }; exports.createDiffieHellman = () => { error('sorry,createDiffieHellman is not implemented yet'); }; exports.pbkdf2 = () => { error('sorry,pbkdf2 is not implemented yet'); };