50 lines
1 KiB
JavaScript
50 lines
1 KiB
JavaScript
|
/*
|
||
|
MIT License http://www.opensource.org/licenses/mit-license.php
|
||
|
Author Tobias Koppers @sokra
|
||
|
*/
|
||
|
|
||
|
"use strict";
|
||
|
|
||
|
class StringXor {
|
||
|
constructor() {
|
||
|
this._value = undefined;
|
||
|
this._buffer = undefined;
|
||
|
}
|
||
|
|
||
|
add(str) {
|
||
|
let buf = this._buffer;
|
||
|
let value;
|
||
|
if (buf === undefined) {
|
||
|
buf = this._buffer = Buffer.from(str, "latin1");
|
||
|
this._value = Buffer.from(buf);
|
||
|
return;
|
||
|
} else if (buf.length !== str.length) {
|
||
|
value = this._value;
|
||
|
buf = this._buffer = Buffer.from(str, "latin1");
|
||
|
if (value.length < buf.length) {
|
||
|
this._value = Buffer.allocUnsafe(buf.length);
|
||
|
value.copy(this._value);
|
||
|
this._value.fill(0, value.length);
|
||
|
value = this._value;
|
||
|
}
|
||
|
} else {
|
||
|
value = this._value;
|
||
|
buf.write(str, "latin1");
|
||
|
}
|
||
|
const len = buf.length;
|
||
|
for (let i = 0; i < len; i++) {
|
||
|
value[i] = value[i] ^ buf[i];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
toString() {
|
||
|
return this._value === undefined ? "" : this._value.toString("latin1");
|
||
|
}
|
||
|
|
||
|
updateHash(hash) {
|
||
|
if (this._value !== undefined) hash.update(this._value);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
module.exports = StringXor;
|