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