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