31 lines
		
	
	
		
			908 B
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			31 lines
		
	
	
		
			908 B
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| var xor = require('buffer-xor')
 | |
| var Buffer = require('safe-buffer').Buffer
 | |
| var incr32 = require('../incr32')
 | |
| 
 | |
| function getBlock (self) {
 | |
|   var out = self._cipher.encryptBlockRaw(self._prev)
 | |
|   incr32(self._prev)
 | |
|   return out
 | |
| }
 | |
| 
 | |
| var blockSize = 16
 | |
| exports.encrypt = function (self, chunk) {
 | |
|   var chunkNum = Math.ceil(chunk.length / blockSize)
 | |
|   var start = self._cache.length
 | |
|   self._cache = Buffer.concat([
 | |
|     self._cache,
 | |
|     Buffer.allocUnsafe(chunkNum * blockSize)
 | |
|   ])
 | |
|   for (var i = 0; i < chunkNum; i++) {
 | |
|     var out = getBlock(self)
 | |
|     var offset = start + i * blockSize
 | |
|     self._cache.writeUInt32BE(out[0], offset + 0)
 | |
|     self._cache.writeUInt32BE(out[1], offset + 4)
 | |
|     self._cache.writeUInt32BE(out[2], offset + 8)
 | |
|     self._cache.writeUInt32BE(out[3], offset + 12)
 | |
|   }
 | |
|   var pad = self._cache.slice(0, chunk.length)
 | |
|   self._cache = self._cache.slice(chunk.length)
 | |
|   return xor(chunk, pad)
 | |
| }
 |