| 'use strict'; |
| |
| var utils = require('../utils'); |
| var common = require('../common'); |
| var shaCommon = require('./common'); |
| |
| var rotl32 = utils.rotl32; |
| var sum32 = utils.sum32; |
| var sum32_5 = utils.sum32_5; |
| var ft_1 = shaCommon.ft_1; |
| var BlockHash = common.BlockHash; |
| |
| var sha1_K = [ |
| 0x5A827999, 0x6ED9EBA1, |
| 0x8F1BBCDC, 0xCA62C1D6 |
| ]; |
| |
| function SHA1() { |
| if (!(this instanceof SHA1)) |
| return new SHA1(); |
| |
| BlockHash.call(this); |
| this.h = [ |
| 0x67452301, 0xefcdab89, 0x98badcfe, |
| 0x10325476, 0xc3d2e1f0 ]; |
| this.W = new Array(80); |
| } |
| |
| utils.inherits(SHA1, BlockHash); |
| module.exports = SHA1; |
| |
| SHA1.blockSize = 512; |
| SHA1.outSize = 160; |
| SHA1.hmacStrength = 80; |
| SHA1.padLength = 64; |
| |
| SHA1.prototype._update = function _update(msg, start) { |
| var W = this.W; |
| |
| for (var i = 0; i < 16; i++) |
| W[i] = msg[start + i]; |
| |
| for(; i < W.length; i++) |
| W[i] = rotl32(W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16], 1); |
| |
| 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]; |
| |
| for (i = 0; i < W.length; i++) { |
| var s = ~~(i / 20); |
| var t = sum32_5(rotl32(a, 5), ft_1(s, b, c, d), e, W[i], sha1_K[s]); |
| e = d; |
| d = c; |
| c = rotl32(b, 30); |
| b = a; |
| a = t; |
| } |
| |
| this.h[0] = sum32(this.h[0], a); |
| this.h[1] = sum32(this.h[1], b); |
| this.h[2] = sum32(this.h[2], c); |
| this.h[3] = sum32(this.h[3], d); |
| this.h[4] = sum32(this.h[4], e); |
| }; |
| |
| SHA1.prototype._digest = function digest(enc) { |
| if (enc === 'hex') |
| return utils.toHex32(this.h, 'big'); |
| else |
| return utils.split32(this.h, 'big'); |
| }; |