| 'use strict'; |
| |
| var utils = require('./utils'); |
| var common = require('./common'); |
| |
| var rotl32 = utils.rotl32; |
| var sum32 = utils.sum32; |
| var sum32_3 = utils.sum32_3; |
| var sum32_4 = utils.sum32_4; |
| var BlockHash = common.BlockHash; |
| |
| function RIPEMD160() { |
| if (!(this instanceof RIPEMD160)) |
| return new RIPEMD160(); |
| |
| BlockHash.call(this); |
| |
| this.h = [ 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0 ]; |
| this.endian = 'little'; |
| } |
| utils.inherits(RIPEMD160, BlockHash); |
| exports.ripemd160 = RIPEMD160; |
| |
| RIPEMD160.blockSize = 512; |
| RIPEMD160.outSize = 160; |
| RIPEMD160.hmacStrength = 192; |
| RIPEMD160.padLength = 64; |
| |
| RIPEMD160.prototype._update = function update(msg, start) { |
| var A = this.h[0]; |
| var B = this.h[1]; |
| var C = this.h[2]; |
| var D = this.h[3]; |
| var E = this.h[4]; |
| var Ah = A; |
| var Bh = B; |
| var Ch = C; |
| var Dh = D; |
| var Eh = E; |
| for (var j = 0; j < 80; j++) { |
| var T = sum32( |
| rotl32( |
| sum32_4(A, f(j, B, C, D), msg[r[j] + start], K(j)), |
| s[j]), |
| E); |
| A = E; |
| E = D; |
| D = rotl32(C, 10); |
| C = B; |
| B = T; |
| T = sum32( |
| rotl32( |
| sum32_4(Ah, f(79 - j, Bh, Ch, Dh), msg[rh[j] + start], Kh(j)), |
| sh[j]), |
| Eh); |
| Ah = Eh; |
| Eh = Dh; |
| Dh = rotl32(Ch, 10); |
| Ch = Bh; |
| Bh = T; |
| } |
| T = sum32_3(this.h[1], C, Dh); |
| this.h[1] = sum32_3(this.h[2], D, Eh); |
| this.h[2] = sum32_3(this.h[3], E, Ah); |
| this.h[3] = sum32_3(this.h[4], A, Bh); |
| this.h[4] = sum32_3(this.h[0], B, Ch); |
| this.h[0] = T; |
| }; |
| |
| RIPEMD160.prototype._digest = function digest(enc) { |
| if (enc === 'hex') |
| return utils.toHex32(this.h, 'little'); |
| else |
| return utils.split32(this.h, 'little'); |
| }; |
| |
| function f(j, x, y, z) { |
| if (j <= 15) |
| return x ^ y ^ z; |
| else if (j <= 31) |
| return (x & y) | ((~x) & z); |
| else if (j <= 47) |
| return (x | (~y)) ^ z; |
| else if (j <= 63) |
| return (x & z) | (y & (~z)); |
| else |
| return x ^ (y | (~z)); |
| } |
| |
| function K(j) { |
| if (j <= 15) |
| return 0x00000000; |
| else if (j <= 31) |
| return 0x5a827999; |
| else if (j <= 47) |
| return 0x6ed9eba1; |
| else if (j <= 63) |
| return 0x8f1bbcdc; |
| else |
| return 0xa953fd4e; |
| } |
| |
| function Kh(j) { |
| if (j <= 15) |
| return 0x50a28be6; |
| else if (j <= 31) |
| return 0x5c4dd124; |
| else if (j <= 47) |
| return 0x6d703ef3; |
| else if (j <= 63) |
| return 0x7a6d76e9; |
| else |
| return 0x00000000; |
| } |
| |
| var r = [ |
| 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, |
| 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8, |
| 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12, |
| 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2, |
| 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13 |
| ]; |
| |
| var rh = [ |
| 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12, |
| 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2, |
| 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13, |
| 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14, |
| 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11 |
| ]; |
| |
| var s = [ |
| 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8, |
| 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12, |
| 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5, |
| 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12, |
| 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6 |
| ]; |
| |
| var sh = [ |
| 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6, |
| 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11, |
| 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5, |
| 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8, |
| 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11 |
| ]; |