ripemd.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. 'use strict';
  2. var utils = require('./utils');
  3. var common = require('./common');
  4. var rotl32 = utils.rotl32;
  5. var sum32 = utils.sum32;
  6. var sum32_3 = utils.sum32_3;
  7. var sum32_4 = utils.sum32_4;
  8. var BlockHash = common.BlockHash;
  9. function RIPEMD160() {
  10. if (!(this instanceof RIPEMD160))
  11. return new RIPEMD160();
  12. BlockHash.call(this);
  13. this.h = [ 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0 ];
  14. this.endian = 'little';
  15. }
  16. utils.inherits(RIPEMD160, BlockHash);
  17. exports.ripemd160 = RIPEMD160;
  18. RIPEMD160.blockSize = 512;
  19. RIPEMD160.outSize = 160;
  20. RIPEMD160.hmacStrength = 192;
  21. RIPEMD160.padLength = 64;
  22. RIPEMD160.prototype._update = function update(msg, start) {
  23. var A = this.h[0];
  24. var B = this.h[1];
  25. var C = this.h[2];
  26. var D = this.h[3];
  27. var E = this.h[4];
  28. var Ah = A;
  29. var Bh = B;
  30. var Ch = C;
  31. var Dh = D;
  32. var Eh = E;
  33. for (var j = 0; j < 80; j++) {
  34. var T = sum32(
  35. rotl32(
  36. sum32_4(A, f(j, B, C, D), msg[r[j] + start], K(j)),
  37. s[j]),
  38. E);
  39. A = E;
  40. E = D;
  41. D = rotl32(C, 10);
  42. C = B;
  43. B = T;
  44. T = sum32(
  45. rotl32(
  46. sum32_4(Ah, f(79 - j, Bh, Ch, Dh), msg[rh[j] + start], Kh(j)),
  47. sh[j]),
  48. Eh);
  49. Ah = Eh;
  50. Eh = Dh;
  51. Dh = rotl32(Ch, 10);
  52. Ch = Bh;
  53. Bh = T;
  54. }
  55. T = sum32_3(this.h[1], C, Dh);
  56. this.h[1] = sum32_3(this.h[2], D, Eh);
  57. this.h[2] = sum32_3(this.h[3], E, Ah);
  58. this.h[3] = sum32_3(this.h[4], A, Bh);
  59. this.h[4] = sum32_3(this.h[0], B, Ch);
  60. this.h[0] = T;
  61. };
  62. RIPEMD160.prototype._digest = function digest(enc) {
  63. if (enc === 'hex')
  64. return utils.toHex32(this.h, 'little');
  65. else
  66. return utils.split32(this.h, 'little');
  67. };
  68. function f(j, x, y, z) {
  69. if (j <= 15)
  70. return x ^ y ^ z;
  71. else if (j <= 31)
  72. return (x & y) | ((~x) & z);
  73. else if (j <= 47)
  74. return (x | (~y)) ^ z;
  75. else if (j <= 63)
  76. return (x & z) | (y & (~z));
  77. else
  78. return x ^ (y | (~z));
  79. }
  80. function K(j) {
  81. if (j <= 15)
  82. return 0x00000000;
  83. else if (j <= 31)
  84. return 0x5a827999;
  85. else if (j <= 47)
  86. return 0x6ed9eba1;
  87. else if (j <= 63)
  88. return 0x8f1bbcdc;
  89. else
  90. return 0xa953fd4e;
  91. }
  92. function Kh(j) {
  93. if (j <= 15)
  94. return 0x50a28be6;
  95. else if (j <= 31)
  96. return 0x5c4dd124;
  97. else if (j <= 47)
  98. return 0x6d703ef3;
  99. else if (j <= 63)
  100. return 0x7a6d76e9;
  101. else
  102. return 0x00000000;
  103. }
  104. var r = [
  105. 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
  106. 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8,
  107. 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12,
  108. 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2,
  109. 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13
  110. ];
  111. var rh = [
  112. 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12,
  113. 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2,
  114. 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13,
  115. 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14,
  116. 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11
  117. ];
  118. var s = [
  119. 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8,
  120. 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12,
  121. 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5,
  122. 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12,
  123. 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6
  124. ];
  125. var sh = [
  126. 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6,
  127. 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11,
  128. 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5,
  129. 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8,
  130. 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11
  131. ];