You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					72 lines
				
				1.6 KiB
			
		
		
			
		
	
	
					72 lines
				
				1.6 KiB
			| 
											2 years ago
										 | var bigInt = require('big-integer'); | ||
|  | var Stream = require('stream'); | ||
|  | 
 | ||
|  | // Backwards compatibility for node versions < 8
 | ||
|  | if (!Stream.Writable || !Stream.Writable.prototype.destroy) | ||
|  |   Stream = require('readable-stream'); | ||
|  | 
 | ||
|  | var table; | ||
|  | 
 | ||
|  | function generateTable() { | ||
|  |   var poly = 0xEDB88320,c,n,k; | ||
|  |   table = []; | ||
|  |   for (n = 0; n < 256; n++) { | ||
|  |     c = n; | ||
|  |     for (k = 0; k < 8; k++) | ||
|  |       c = (c & 1) ? poly ^ (c >>> 1) :  c = c >>> 1; | ||
|  |     table[n] = c >>> 0; | ||
|  |   } | ||
|  | } | ||
|  | 
 | ||
|  | function crc(ch,crc) { | ||
|  |   if (!table) | ||
|  |     generateTable(); | ||
|  | 
 | ||
|  |   if (ch.charCodeAt) | ||
|  |     ch = ch.charCodeAt(0);         | ||
|  | 
 | ||
|  |   return (bigInt(crc).shiftRight(8).and(0xffffff)).xor(table[bigInt(crc).xor(ch).and(0xff)]).value; | ||
|  | } | ||
|  | 
 | ||
|  | function Decrypt() { | ||
|  |   if (!(this instanceof Decrypt)) | ||
|  |     return new Decrypt(); | ||
|  | 
 | ||
|  |   this.key0 = 305419896; | ||
|  |   this.key1 = 591751049; | ||
|  |   this.key2 = 878082192; | ||
|  | } | ||
|  | 
 | ||
|  | Decrypt.prototype.update = function(h) {             | ||
|  |   this.key0 = crc(h,this.key0); | ||
|  |   this.key1 = bigInt(this.key0).and(255).and(4294967295).add(this.key1) | ||
|  |   this.key1 = bigInt(this.key1).multiply(134775813).add(1).and(4294967295).value; | ||
|  |   this.key2 = crc(bigInt(this.key1).shiftRight(24).and(255), this.key2); | ||
|  | } | ||
|  | 
 | ||
|  | 
 | ||
|  | Decrypt.prototype.decryptByte = function(c) { | ||
|  |   var k = bigInt(this.key2).or(2); | ||
|  |   c = c ^ bigInt(k).multiply(bigInt(k^1)).shiftRight(8).and(255); | ||
|  |   this.update(c); | ||
|  |   return c; | ||
|  | }; | ||
|  | 
 | ||
|  |  Decrypt.prototype.stream = function() { | ||
|  |   var stream = Stream.Transform(), | ||
|  |       self = this; | ||
|  | 
 | ||
|  |   stream._transform = function(d,e,cb) { | ||
|  |     for (var i = 0; i<d.length;i++) { | ||
|  |       d[i] = self.decryptByte(d[i]); | ||
|  |     } | ||
|  |     this.push(d); | ||
|  |     cb(); | ||
|  |   }; | ||
|  |   return stream; | ||
|  | }; | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | module.exports = Decrypt; |