| 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'); | |
| };
 |