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');
 | |
| };
 |