| 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 |