crypto.js 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. var Buffer = require('buffer').Buffer;
  2. var sha = require('./sha');
  3. var md5 = require('./md5');
  4. var algorithms = {
  5. sha1: sha,
  6. md5: md5
  7. };
  8. var blocksize = 64;
  9. var zeroBuffer = Buffer.alloc(blocksize);
  10. zeroBuffer.fill(0);
  11. function hmac(fn, key, data) {
  12. if(!Buffer.isBuffer(key)) key = Buffer.from(key);
  13. if(!Buffer.isBuffer(data)) data = Buffer.from(data);
  14. if(key.length > blocksize) {
  15. key = fn(key)
  16. } else if(key.length < blocksize) {
  17. key = Buffer.concat([key, zeroBuffer], blocksize)
  18. }
  19. var ipad = Buffer.alloc(blocksize), opad = Buffer.alloc(blocksize);
  20. for(var i = 0; i < blocksize; i++) {
  21. ipad[i] = key[i] ^ 0x36
  22. opad[i] = key[i] ^ 0x5C
  23. }
  24. var hash = fn(Buffer.concat([ipad, data]))
  25. return fn(Buffer.concat([opad, hash]))
  26. }
  27. function hash(alg, key) {
  28. alg = alg || 'sha1';
  29. var fn = algorithms[alg];
  30. var bufs = [];
  31. var length = 0;
  32. if(!fn) error('algorithm:', alg, 'is not yet supported');
  33. return {
  34. update: function (data) {
  35. if(!Buffer.isBuffer(data)) data = Buffer.from(data);
  36. bufs.push(data);
  37. length += data.length;
  38. return this
  39. },
  40. digest: function (enc) {
  41. var buf = Buffer.concat(bufs);
  42. var r = key ? hmac(fn, key, buf) : fn(buf);
  43. bufs = null;
  44. return enc ? r.toString(enc) : r
  45. }
  46. }
  47. }
  48. function error () {
  49. var m = [].slice.call(arguments).join(' ')
  50. throw new Error([
  51. m,
  52. 'we accept pull requests',
  53. 'http://github.com/dominictarr/crypto-browserify'
  54. ].join('\n'))
  55. }
  56. exports.createHash = function (alg) { return hash(alg) };
  57. exports.createHmac = function (alg, key) { return hash(alg, key) };
  58. exports.createCredentials = () => {
  59. error('sorry,createCredentials is not implemented yet');
  60. };
  61. exports.createCipher = () => {
  62. error('sorry,createCipher is not implemented yet');
  63. };
  64. exports.createCipheriv = () => {
  65. error('sorry,createCipheriv is not implemented yet');
  66. };
  67. exports.createDecipher = () => {
  68. error('sorry,createDecipher is not implemented yet');
  69. };
  70. exports.createDecipheriv = () => {
  71. error('sorry,createDecipheriv is not implemented yet');
  72. };
  73. exports.createSign = () => {
  74. error('sorry,createSign is not implemented yet');
  75. };
  76. exports.createVerify = () => {
  77. error('sorry,createVerify is not implemented yet');
  78. };
  79. exports.createDiffieHellman = () => {
  80. error('sorry,createDiffieHellman is not implemented yet');
  81. };
  82. exports.pbkdf2 = () => {
  83. error('sorry,pbkdf2 is not implemented yet');
  84. };