100 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			100 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| var Buffer = require('safe-buffer').Buffer
 | |
| var Transform = require('stream').Transform
 | |
| var StringDecoder = require('string_decoder').StringDecoder
 | |
| var inherits = require('inherits')
 | |
| 
 | |
| function CipherBase (hashMode) {
 | |
|   Transform.call(this)
 | |
|   this.hashMode = typeof hashMode === 'string'
 | |
|   if (this.hashMode) {
 | |
|     this[hashMode] = this._finalOrDigest
 | |
|   } else {
 | |
|     this.final = this._finalOrDigest
 | |
|   }
 | |
|   if (this._final) {
 | |
|     this.__final = this._final
 | |
|     this._final = null
 | |
|   }
 | |
|   this._decoder = null
 | |
|   this._encoding = null
 | |
| }
 | |
| inherits(CipherBase, Transform)
 | |
| 
 | |
| CipherBase.prototype.update = function (data, inputEnc, outputEnc) {
 | |
|   if (typeof data === 'string') {
 | |
|     data = Buffer.from(data, inputEnc)
 | |
|   }
 | |
| 
 | |
|   var outData = this._update(data)
 | |
|   if (this.hashMode) return this
 | |
| 
 | |
|   if (outputEnc) {
 | |
|     outData = this._toString(outData, outputEnc)
 | |
|   }
 | |
| 
 | |
|   return outData
 | |
| }
 | |
| 
 | |
| CipherBase.prototype.setAutoPadding = function () {}
 | |
| CipherBase.prototype.getAuthTag = function () {
 | |
|   throw new Error('trying to get auth tag in unsupported state')
 | |
| }
 | |
| 
 | |
| CipherBase.prototype.setAuthTag = function () {
 | |
|   throw new Error('trying to set auth tag in unsupported state')
 | |
| }
 | |
| 
 | |
| CipherBase.prototype.setAAD = function () {
 | |
|   throw new Error('trying to set aad in unsupported state')
 | |
| }
 | |
| 
 | |
| CipherBase.prototype._transform = function (data, _, next) {
 | |
|   var err
 | |
|   try {
 | |
|     if (this.hashMode) {
 | |
|       this._update(data)
 | |
|     } else {
 | |
|       this.push(this._update(data))
 | |
|     }
 | |
|   } catch (e) {
 | |
|     err = e
 | |
|   } finally {
 | |
|     next(err)
 | |
|   }
 | |
| }
 | |
| CipherBase.prototype._flush = function (done) {
 | |
|   var err
 | |
|   try {
 | |
|     this.push(this.__final())
 | |
|   } catch (e) {
 | |
|     err = e
 | |
|   }
 | |
| 
 | |
|   done(err)
 | |
| }
 | |
| CipherBase.prototype._finalOrDigest = function (outputEnc) {
 | |
|   var outData = this.__final() || Buffer.alloc(0)
 | |
|   if (outputEnc) {
 | |
|     outData = this._toString(outData, outputEnc, true)
 | |
|   }
 | |
|   return outData
 | |
| }
 | |
| 
 | |
| CipherBase.prototype._toString = function (value, enc, fin) {
 | |
|   if (!this._decoder) {
 | |
|     this._decoder = new StringDecoder(enc)
 | |
|     this._encoding = enc
 | |
|   }
 | |
| 
 | |
|   if (this._encoding !== enc) throw new Error('can\'t switch encodings')
 | |
| 
 | |
|   var out = this._decoder.write(value)
 | |
|   if (fin) {
 | |
|     out += this._decoder.end()
 | |
|   }
 | |
| 
 | |
|   return out
 | |
| }
 | |
| 
 | |
| module.exports = CipherBase
 |