readme, benchmarks, fix verification
This commit is contained in:
309
static/js/lz-string.js
Normal file
309
static/js/lz-string.js
Normal file
@ -0,0 +1,309 @@
|
||||
var LZString = (function () {
|
||||
var r = String.fromCharCode,
|
||||
o = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
|
||||
n = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-$",
|
||||
e = {};
|
||||
function t(r, o) {
|
||||
if (!e[r]) {
|
||||
e[r] = {};
|
||||
for (var n = 0; n < r.length; n++) e[r][r.charAt(n)] = n;
|
||||
}
|
||||
return e[r][o];
|
||||
}
|
||||
var i = {
|
||||
compressToBase64: function (r) {
|
||||
if (null == r) return "";
|
||||
var n = i._compress(r, 6, function (r) {
|
||||
return o.charAt(r);
|
||||
});
|
||||
switch (n.length % 4) {
|
||||
default:
|
||||
case 0:
|
||||
return n;
|
||||
case 1:
|
||||
return n + "===";
|
||||
case 2:
|
||||
return n + "==";
|
||||
case 3:
|
||||
return n + "=";
|
||||
}
|
||||
},
|
||||
decompressFromBase64: function (r) {
|
||||
return null == r
|
||||
? ""
|
||||
: "" == r
|
||||
? null
|
||||
: i._decompress(r.length, 32, function (n) {
|
||||
return t(o, r.charAt(n));
|
||||
});
|
||||
},
|
||||
compressToUTF16: function (o) {
|
||||
return null == o
|
||||
? ""
|
||||
: i._compress(o, 15, function (o) {
|
||||
return r(o + 32);
|
||||
}) + " ";
|
||||
},
|
||||
decompressFromUTF16: function (r) {
|
||||
return null == r
|
||||
? ""
|
||||
: "" == r
|
||||
? null
|
||||
: i._decompress(r.length, 16384, function (o) {
|
||||
return r.charCodeAt(o) - 32;
|
||||
});
|
||||
},
|
||||
compressToUint8Array: function (r) {
|
||||
for (
|
||||
var o = i.compress(r),
|
||||
n = new Uint8Array(2 * o.length),
|
||||
e = 0,
|
||||
t = o.length;
|
||||
e < t;
|
||||
e++
|
||||
) {
|
||||
var s = o.charCodeAt(e);
|
||||
(n[2 * e] = s >>> 8), (n[2 * e + 1] = s % 256);
|
||||
}
|
||||
return n;
|
||||
},
|
||||
decompressFromUint8Array: function (o) {
|
||||
if (null == o) return i.decompress(o);
|
||||
for (var n = new Array(o.length / 2), e = 0, t = n.length; e < t; e++)
|
||||
n[e] = 256 * o[2 * e] + o[2 * e + 1];
|
||||
var s = [];
|
||||
return (
|
||||
n.forEach(function (o) {
|
||||
s.push(r(o));
|
||||
}),
|
||||
i.decompress(s.join(""))
|
||||
);
|
||||
},
|
||||
compressToEncodedURIComponent: function (r) {
|
||||
return null == r
|
||||
? ""
|
||||
: i._compress(r, 6, function (r) {
|
||||
return n.charAt(r);
|
||||
});
|
||||
},
|
||||
decompressFromEncodedURIComponent: function (r) {
|
||||
return null == r
|
||||
? ""
|
||||
: "" == r
|
||||
? null
|
||||
: ((r = r.replace(/ /g, "+")),
|
||||
i._decompress(r.length, 32, function (o) {
|
||||
return t(n, r.charAt(o));
|
||||
}));
|
||||
},
|
||||
compress: function (o) {
|
||||
return i._compress(o, 16, function (o) {
|
||||
return r(o);
|
||||
});
|
||||
},
|
||||
_compress: function (r, o, n) {
|
||||
if (null == r) return "";
|
||||
var e,
|
||||
t,
|
||||
i,
|
||||
s = {},
|
||||
u = {},
|
||||
a = "",
|
||||
p = "",
|
||||
c = "",
|
||||
l = 2,
|
||||
f = 3,
|
||||
h = 2,
|
||||
d = [],
|
||||
m = 0,
|
||||
v = 0;
|
||||
for (i = 0; i < r.length; i += 1)
|
||||
if (
|
||||
((a = r.charAt(i)),
|
||||
Object.prototype.hasOwnProperty.call(s, a) ||
|
||||
((s[a] = f++), (u[a] = !0)),
|
||||
(p = c + a),
|
||||
Object.prototype.hasOwnProperty.call(s, p))
|
||||
)
|
||||
c = p;
|
||||
else {
|
||||
if (Object.prototype.hasOwnProperty.call(u, c)) {
|
||||
if (c.charCodeAt(0) < 256) {
|
||||
for (e = 0; e < h; e++)
|
||||
(m <<= 1),
|
||||
v == o - 1 ? ((v = 0), d.push(n(m)), (m = 0)) : v++;
|
||||
for (t = c.charCodeAt(0), e = 0; e < 8; e++)
|
||||
(m = (m << 1) | (1 & t)),
|
||||
v == o - 1 ? ((v = 0), d.push(n(m)), (m = 0)) : v++,
|
||||
(t >>= 1);
|
||||
} else {
|
||||
for (t = 1, e = 0; e < h; e++)
|
||||
(m = (m << 1) | t),
|
||||
v == o - 1 ? ((v = 0), d.push(n(m)), (m = 0)) : v++,
|
||||
(t = 0);
|
||||
for (t = c.charCodeAt(0), e = 0; e < 16; e++)
|
||||
(m = (m << 1) | (1 & t)),
|
||||
v == o - 1 ? ((v = 0), d.push(n(m)), (m = 0)) : v++,
|
||||
(t >>= 1);
|
||||
}
|
||||
0 == --l && ((l = Math.pow(2, h)), h++), delete u[c];
|
||||
} else
|
||||
for (t = s[c], e = 0; e < h; e++)
|
||||
(m = (m << 1) | (1 & t)),
|
||||
v == o - 1 ? ((v = 0), d.push(n(m)), (m = 0)) : v++,
|
||||
(t >>= 1);
|
||||
0 == --l && ((l = Math.pow(2, h)), h++),
|
||||
(s[p] = f++),
|
||||
(c = String(a));
|
||||
}
|
||||
if ("" !== c) {
|
||||
if (Object.prototype.hasOwnProperty.call(u, c)) {
|
||||
if (c.charCodeAt(0) < 256) {
|
||||
for (e = 0; e < h; e++)
|
||||
(m <<= 1),
|
||||
v == o - 1 ? ((v = 0), d.push(n(m)), (m = 0)) : v++;
|
||||
for (t = c.charCodeAt(0), e = 0; e < 8; e++)
|
||||
(m = (m << 1) | (1 & t)),
|
||||
v == o - 1 ? ((v = 0), d.push(n(m)), (m = 0)) : v++,
|
||||
(t >>= 1);
|
||||
} else {
|
||||
for (t = 1, e = 0; e < h; e++)
|
||||
(m = (m << 1) | t),
|
||||
v == o - 1 ? ((v = 0), d.push(n(m)), (m = 0)) : v++,
|
||||
(t = 0);
|
||||
for (t = c.charCodeAt(0), e = 0; e < 16; e++)
|
||||
(m = (m << 1) | (1 & t)),
|
||||
v == o - 1 ? ((v = 0), d.push(n(m)), (m = 0)) : v++,
|
||||
(t >>= 1);
|
||||
}
|
||||
0 == --l && ((l = Math.pow(2, h)), h++), delete u[c];
|
||||
} else
|
||||
for (t = s[c], e = 0; e < h; e++)
|
||||
(m = (m << 1) | (1 & t)),
|
||||
v == o - 1 ? ((v = 0), d.push(n(m)), (m = 0)) : v++,
|
||||
(t >>= 1);
|
||||
0 == --l && ((l = Math.pow(2, h)), h++);
|
||||
}
|
||||
for (t = 2, e = 0; e < h; e++)
|
||||
(m = (m << 1) | (1 & t)),
|
||||
v == o - 1 ? ((v = 0), d.push(n(m)), (m = 0)) : v++,
|
||||
(t >>= 1);
|
||||
for (;;) {
|
||||
if (((m <<= 1), v == o - 1)) {
|
||||
d.push(n(m));
|
||||
break;
|
||||
}
|
||||
v++;
|
||||
}
|
||||
return d.join("");
|
||||
},
|
||||
decompress: function (r) {
|
||||
return null == r
|
||||
? ""
|
||||
: "" == r
|
||||
? null
|
||||
: i._decompress(r.length, 32768, function (o) {
|
||||
return r.charCodeAt(o);
|
||||
});
|
||||
},
|
||||
_decompress: function (o, n, e) {
|
||||
var t,
|
||||
i,
|
||||
s,
|
||||
u,
|
||||
a,
|
||||
p,
|
||||
c,
|
||||
l = [],
|
||||
f = 4,
|
||||
h = 4,
|
||||
d = 3,
|
||||
m = "",
|
||||
v = [],
|
||||
g = { val: e(0), position: n, index: 1 };
|
||||
for (t = 0; t < 3; t += 1) l[t] = t;
|
||||
for (s = 0, a = Math.pow(2, 2), p = 1; p != a; )
|
||||
(u = g.val & g.position),
|
||||
(g.position >>= 1),
|
||||
0 == g.position && ((g.position = n), (g.val = e(g.index++))),
|
||||
(s |= (u > 0 ? 1 : 0) * p),
|
||||
(p <<= 1);
|
||||
switch (s) {
|
||||
case 0:
|
||||
for (s = 0, a = Math.pow(2, 8), p = 1; p != a; )
|
||||
(u = g.val & g.position),
|
||||
(g.position >>= 1),
|
||||
0 == g.position && ((g.position = n), (g.val = e(g.index++))),
|
||||
(s |= (u > 0 ? 1 : 0) * p),
|
||||
(p <<= 1);
|
||||
c = r(s);
|
||||
break;
|
||||
case 1:
|
||||
for (s = 0, a = Math.pow(2, 16), p = 1; p != a; )
|
||||
(u = g.val & g.position),
|
||||
(g.position >>= 1),
|
||||
0 == g.position && ((g.position = n), (g.val = e(g.index++))),
|
||||
(s |= (u > 0 ? 1 : 0) * p),
|
||||
(p <<= 1);
|
||||
c = r(s);
|
||||
break;
|
||||
case 2:
|
||||
return "";
|
||||
}
|
||||
for (l[3] = c, i = c, v.push(c); ; ) {
|
||||
if (g.index > o) return "";
|
||||
for (s = 0, a = Math.pow(2, d), p = 1; p != a; )
|
||||
(u = g.val & g.position),
|
||||
(g.position >>= 1),
|
||||
0 == g.position && ((g.position = n), (g.val = e(g.index++))),
|
||||
(s |= (u > 0 ? 1 : 0) * p),
|
||||
(p <<= 1);
|
||||
switch ((c = s)) {
|
||||
case 0:
|
||||
for (s = 0, a = Math.pow(2, 8), p = 1; p != a; )
|
||||
(u = g.val & g.position),
|
||||
(g.position >>= 1),
|
||||
0 == g.position &&
|
||||
((g.position = n), (g.val = e(g.index++))),
|
||||
(s |= (u > 0 ? 1 : 0) * p),
|
||||
(p <<= 1);
|
||||
(l[h++] = r(s)), (c = h - 1), f--;
|
||||
break;
|
||||
case 1:
|
||||
for (s = 0, a = Math.pow(2, 16), p = 1; p != a; )
|
||||
(u = g.val & g.position),
|
||||
(g.position >>= 1),
|
||||
0 == g.position &&
|
||||
((g.position = n), (g.val = e(g.index++))),
|
||||
(s |= (u > 0 ? 1 : 0) * p),
|
||||
(p <<= 1);
|
||||
(l[h++] = r(s)), (c = h - 1), f--;
|
||||
break;
|
||||
case 2:
|
||||
return v.join("");
|
||||
}
|
||||
if ((0 == f && ((f = Math.pow(2, d)), d++), l[c])) m = l[c];
|
||||
else {
|
||||
if (c !== h) return null;
|
||||
m = i + i.charAt(0);
|
||||
}
|
||||
v.push(m),
|
||||
(l[h++] = i + m.charAt(0)),
|
||||
(i = m),
|
||||
0 == --f && ((f = Math.pow(2, d)), d++);
|
||||
}
|
||||
},
|
||||
};
|
||||
return i;
|
||||
})();
|
||||
"function" == typeof define && define.amd
|
||||
? define(function () {
|
||||
return LZString;
|
||||
})
|
||||
: "undefined" != typeof module && null != module
|
||||
? (module.exports = LZString)
|
||||
: "undefined" != typeof angular &&
|
||||
null != angular &&
|
||||
angular.module("LZString", []).factory("LZString", function () {
|
||||
return LZString;
|
||||
});
|
@ -4,6 +4,25 @@ import { gcd, mod_exp } from "./math.js";
|
||||
const PAILLIER = 0;
|
||||
const JURIK = 1;
|
||||
|
||||
function RSTransform(g, a, p) {
|
||||
let plainText = p.toString(16);
|
||||
if (plainText.length % 2 !== 0) {
|
||||
plainText = "0" + plainText;
|
||||
}
|
||||
|
||||
let aStr = a.toString(16);
|
||||
if (aStr.length % 2 !== 0) {
|
||||
aStr = "0" + aStr;
|
||||
}
|
||||
|
||||
let hasher = new jsSHA("SHAKE256", "HEX");
|
||||
hasher.update(g.toString(16));
|
||||
hasher.update(plainText);
|
||||
hasher.update(aStr);
|
||||
|
||||
return BigInt("0x" + hasher.getHash("HEX", { outputLen: 2048 }));
|
||||
}
|
||||
|
||||
class Ciphertext {
|
||||
constructor(key, plainText, r, set) {
|
||||
if (set !== undefined) {
|
||||
@ -93,28 +112,12 @@ class Ciphertext {
|
||||
}
|
||||
|
||||
let a = mod_exp(rp, this.pubKey.n, this.pubKey.n2);
|
||||
let hasher = new jsSHA("SHAKE256", "HEX");
|
||||
|
||||
let plainText = this.plainText.toString(16);
|
||||
if (plainText.length % 2 !== 0) {
|
||||
plainText = "0" + plainText;
|
||||
}
|
||||
|
||||
let aStr = a.toString(16);
|
||||
if (aStr.length % 2 !== 0) {
|
||||
aStr = "0" + aStr;
|
||||
}
|
||||
|
||||
hasher.update(this.pubKey.g.toString(16));
|
||||
hasher.update(plainText);
|
||||
hasher.update(aStr);
|
||||
|
||||
let challenge = BigInt("0x" + hasher.getHash("HEX", { outputLen: 2048 }));
|
||||
let challenge = RSTransform(this.pubKey.g, a, this.plainText);
|
||||
|
||||
return {
|
||||
plainText: "0x" + this.plainText.toString(16),
|
||||
a: "0x" + a.toString(16),
|
||||
challenge: "0x" + challenge.toString(16),
|
||||
proof:
|
||||
"0x" +
|
||||
(
|
||||
@ -195,11 +198,17 @@ export class ReadOnlyCiphertext {
|
||||
}
|
||||
|
||||
verifyNI(statement) {
|
||||
let challenge = RSTransform(
|
||||
this.pubKey.g,
|
||||
BigInt(statement.a),
|
||||
BigInt(statement.plainText)
|
||||
);
|
||||
|
||||
let verifier = new ValueProofSessionVerifier(
|
||||
this,
|
||||
BigInt(statement.plainText),
|
||||
BigInt(statement.a),
|
||||
BigInt(statement.challenge)
|
||||
challenge
|
||||
);
|
||||
|
||||
if (verifier.verify(BigInt(statement.proof))) {
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { mod_exp } from "./math.js";
|
||||
|
||||
export const KEY_SIZE = 512;
|
||||
export const KEY_SIZE = 2048;
|
||||
|
||||
export function cryptoRandom(bits) {
|
||||
if (bits === undefined) {
|
||||
|
@ -135,7 +135,6 @@ export function verifyRegions(obj, key) {
|
||||
let plaintext = c.verifyNI(verification.zeroProofs[regionName]);
|
||||
|
||||
if (plaintext !== 0n) {
|
||||
console.log(plaintext);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user