75 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			75 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
'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');
 | 
						|
};
 |