templateGen/js/9.9.3/xorc.js
maru21 92bbebd2a1 Bugfixes and feature improvements new ver 9.9.3
fixed bug with sidebar click event not being cleared after accessing files and then pressing edit
some cosmetic changes animations
reimplemented bookshelfexport in localonly mode
added logout functionality
2023-10-07 20:42:58 +02:00

187 lines
4.3 KiB
JavaScript

var XORCipher = {
encode: function (key, data, seed) {
data = xor_encrypt(key, data, seed);
return b64_encode(data);
},
decode: function (key, data) {
data = b64_decode(data);
return xor_decrypt(key, data);
},
seed: function (n) {
return randString(n);
},
};
function stringToUtf8ByteArray(str) {
var out = [],
p = 0;
for (var i = 0; i < str.length; i++) {
var c = str.charCodeAt(i);
if (c < 128) {
out[p++] = c;
} else if (c < 2048) {
out[p++] = (c >> 6) | 192;
out[p++] = (c & 63) | 128;
} else if (
(c & 0xfc00) == 0xd800 &&
i + 1 < str.length &&
(str.charCodeAt(i + 1) & 0xfc00) == 0xdc00
) {
// Surrogate Pair
c = 0x10000 + ((c & 0x03ff) << 10) + (str.charCodeAt(++i) & 0x03ff);
out[p++] = (c >> 18) | 240;
out[p++] = ((c >> 12) & 63) | 128;
out[p++] = ((c >> 6) & 63) | 128;
out[p++] = (c & 63) | 128;
} else {
out[p++] = (c >> 12) | 224;
out[p++] = ((c >> 6) & 63) | 128;
out[p++] = (c & 63) | 128;
}
}
return out;
}
function utf8ByteArrayToString(bytes) {
// array of bytes
var out = [],
pos = 0,
c = 0;
while (pos < bytes.length) {
var c1 = bytes[pos++];
if (c1 < 128) {
out[c++] = String.fromCharCode(c1);
} else if (c1 > 191 && c1 < 224) {
var c2 = bytes[pos++];
out[c++] = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63));
} else if (c1 > 239 && c1 < 365) {
// Surrogate Pair
var c2 = bytes[pos++];
var c3 = bytes[pos++];
var c4 = bytes[pos++];
var u =
(((c1 & 7) << 18) | ((c2 & 63) << 12) | ((c3 & 63) << 6) | (c4 & 63)) -
0x10000;
out[c++] = String.fromCharCode(0xd800 + (u >> 10));
out[c++] = String.fromCharCode(0xdc00 + (u & 1023));
} else {
var c2 = bytes[pos++];
var c3 = bytes[pos++];
out[c++] = String.fromCharCode(
((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)
);
}
}
return out.join("");
}
var b64_table =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
function b64_encode(data) {
var o1,
o2,
o3,
h1,
h2,
h3,
h4,
bits,
r,
i = 0,
enc = "";
if (!data) {
return data;
}
do {
o1 = data[i++];
o2 = data[i++];
o3 = data[i++];
bits = (o1 << 16) | (o2 << 8) | o3;
h1 = (bits >> 18) & 0x3f;
h2 = (bits >> 12) & 0x3f;
h3 = (bits >> 6) & 0x3f;
h4 = bits & 0x3f;
enc +=
b64_table.charAt(h1) +
b64_table.charAt(h2) +
b64_table.charAt(h3) +
b64_table.charAt(h4);
} while (i < data.length);
r = data.length % 3;
return (r ? enc.slice(0, r - 3) : enc) + "===".slice(r || 3);
}
function b64_decode(data) {
var o1,
o2,
o3,
h1,
h2,
h3,
h4,
bits,
i = 0,
result = [];
if (!data) {
return data;
}
data += "";
do {
h1 = b64_table.indexOf(data.charAt(i++));
h2 = b64_table.indexOf(data.charAt(i++));
h3 = b64_table.indexOf(data.charAt(i++));
h4 = b64_table.indexOf(data.charAt(i++));
bits = (h1 << 18) | (h2 << 12) | (h3 << 6) | h4;
o1 = (bits >> 16) & 0xff;
o2 = (bits >> 8) & 0xff;
o3 = bits & 0xff;
result.push(o1);
if (h3 !== 64) {
result.push(o2);
if (h4 !== 64) {
result.push(o3);
}
}
} while (i < data.length);
return result;
}
function rand(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
function randString(n) {
var r = "";
for (var i = 0; i < n; i++) r += String.fromCharCode(rand(1, 65535));
return r;
}
function xor_encrypt(key, data, seed) {
if (typeof seed == "undefined") seed = randString(32);
var d = stringToUtf8ByteArray(seed + String.fromCharCode(0) + data),
k = stringToUtf8ByteArray(key),
r = [];
for (var i = 0; i < d.length; i++)
r[i] = r[i - 1] ^ d[i] ^ k[Math.floor(i % k.length)];
return r;
}
function xor_decrypt(key, data) {
var d = data,
k = stringToUtf8ByteArray(key),
r = [];
for (var i = 0; i < d.length; i++)
r[i] = d[i - 1] ^ d[i] ^ k[Math.floor(i % k.length)];
r.splice(0, r.indexOf(0) + 1);
return utf8ByteArrayToString(r);
}
export default XORCipher;