code for proof system
This commit is contained in:
parent
2d72cdd87b
commit
6b001d9f2c
@ -38,4 +38,18 @@ export function mod_inv(a, n) {
|
|||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function gcd(a, b) {
|
||||||
|
// check a, b are correct types.
|
||||||
|
a *= 1n;
|
||||||
|
b *= 1n;
|
||||||
|
while (b !== 0n) {
|
||||||
|
let temp = b;
|
||||||
|
b = a % b;
|
||||||
|
a = temp;
|
||||||
|
}
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
|
||||||
window.mod_exp = mod_exp;
|
window.mod_exp = mod_exp;
|
||||||
|
window.mod_inv = mod_inv;
|
||||||
|
window.gcd = gcd;
|
||||||
|
@ -17,10 +17,12 @@ class Cyphertext {
|
|||||||
// Compute g^m r^n from crt
|
// Compute g^m r^n from crt
|
||||||
this.cyphertext = (gm * mod_exp(r, key.n, key.n ** 2n)) % key.n ** 2n;
|
this.cyphertext = (gm * mod_exp(r, key.n, key.n ** 2n)) % key.n ** 2n;
|
||||||
this.r = r;
|
this.r = r;
|
||||||
this.key = key;
|
this.pubKey = key;
|
||||||
this.plainText = plainText;
|
this.plainText = plainText;
|
||||||
|
|
||||||
this.readOnly = false;
|
this.readOnly = false;
|
||||||
|
|
||||||
|
this.rp = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
update(c) {
|
update(c) {
|
||||||
@ -32,21 +34,92 @@ class Cyphertext {
|
|||||||
toString() {
|
toString() {
|
||||||
return "0x" + this.cyphertext.toString(16);
|
return "0x" + this.cyphertext.toString(16);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
prove() {
|
||||||
|
return new ProofSessionProver(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
asReadOnlyCyphertext() {
|
||||||
|
return new ReadOnlyCyphertext(this.pubKey, this.cyphertext);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class ProofSessionProver {
|
||||||
|
constructor(cipherText) {
|
||||||
|
this.cipherText = cipherText;
|
||||||
|
|
||||||
|
this.rp = random2048();
|
||||||
|
while (this.rp >= this.cipherText.pubKey.n) {
|
||||||
|
this.rp = random2048();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
noise() {
|
||||||
|
return mod_exp(this.rp, this.cipherText.pubKey.n, this.cipherText.pubKey.n ** 2n);
|
||||||
|
}
|
||||||
|
|
||||||
|
prove(challenge) {
|
||||||
|
return {
|
||||||
|
proof:
|
||||||
|
((this.rp % this.cipherText.pubKey.n) *
|
||||||
|
mod_exp(this.cipherText.r, challenge, this.cipherText.pubKey.n)) %
|
||||||
|
this.cipherText.pubKey.n,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
window.Cyphertext = Cyphertext;
|
||||||
|
|
||||||
export class ReadOnlyCyphertext {
|
export class ReadOnlyCyphertext {
|
||||||
constructor(key, cyphertext) {
|
constructor(key, cyphertext) {
|
||||||
this.cyphertext = cyphertext;
|
this.cyphertext = cyphertext;
|
||||||
this.key = key;
|
this.pubKey = key;
|
||||||
|
|
||||||
this.readOnly = true;
|
this.readOnly = true;
|
||||||
|
|
||||||
|
this.proofPromise = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
update(c) {
|
update(c) {
|
||||||
this.cyphertext *= c.cyphertext;
|
this.cyphertext *= c.cyphertext;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async prove() {
|
||||||
|
// request a proof
|
||||||
|
let promise = new Promise((res) => (this.proofPromise = res));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class ProofSessionVerifier {
|
||||||
|
constructor(cipherText, a) {
|
||||||
|
this.cipherText = cipherText;
|
||||||
|
this.challenge = random2048();
|
||||||
|
this.a = a;
|
||||||
|
}
|
||||||
|
|
||||||
|
verify(proof) {
|
||||||
|
// check coprimality
|
||||||
|
if (gcd(proof, this.cipherText.pubKey.n) !== 1n) return false;
|
||||||
|
if (gcd(this.cipherText.cyphertext, this.cipherText.pubKey.n) !== 1n)
|
||||||
|
return false;
|
||||||
|
if (gcd(this.a, this.cipherText.pubKey.n) !== 1n) return false;
|
||||||
|
|
||||||
|
// check exp
|
||||||
|
return (
|
||||||
|
mod_exp(proof, this.cipherText.pubKey.n, this.cipherText.pubKey.n ** 2n) ===
|
||||||
|
(this.a *
|
||||||
|
mod_exp(
|
||||||
|
this.cipherText.cyphertext,
|
||||||
|
this.challenge,
|
||||||
|
this.cipherText.pubKey.n ** 2n
|
||||||
|
)) %
|
||||||
|
this.cipherText.pubKey.n ** 2n
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
window.ReadOnlyCyphertext = ReadOnlyCyphertext;
|
||||||
|
|
||||||
export class PaillierPubKey {
|
export class PaillierPubKey {
|
||||||
constructor(n) {
|
constructor(n) {
|
||||||
this.n = n;
|
this.n = n;
|
||||||
|
@ -146,10 +146,6 @@ document.addEventListener("ACT", async (ev) => {
|
|||||||
game.currentPlayer().endTurn();
|
game.currentPlayer().endTurn();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (game.allReinforcementsPlaced()) {
|
|
||||||
game.incrementState();
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
if (await game.currentPlayer().act(data)) {
|
if (await game.currentPlayer().act(data)) {
|
||||||
game.currentPlayer().endTurn();
|
game.currentPlayer().endTurn();
|
||||||
@ -161,6 +157,12 @@ document.addEventListener("ACT", async (ev) => {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
document.addEventListener("endTurn", () => {
|
||||||
|
if (game.isPregame() && game.allReinforcementsPlaced()) {
|
||||||
|
game.incrementState();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
document.addEventListener("gameStateUpdate", async () => {
|
document.addEventListener("gameStateUpdate", async () => {
|
||||||
if (game.isPregame()) {
|
if (game.isPregame()) {
|
||||||
let firstPlayerIndex = await random.get(
|
let firstPlayerIndex = await random.get(
|
||||||
|
Binary file not shown.
@ -364,9 +364,9 @@ Then, a proof for the following homologous problem can be trivially constructed:
|
|||||||
|
|
||||||
% Furthermore, the above protocol can be made non-interactive using the Fiat-Shamir heuristic \citep{fiatshamir}. (this contradicts the lit review)
|
% Furthermore, the above protocol can be made non-interactive using the Fiat-Shamir heuristic \citep{fiatshamir}. (this contradicts the lit review)
|
||||||
|
|
||||||
\subsection{Recovering $r$ given $c$}
|
\subsection{Implementation details}
|
||||||
|
|
||||||
|
|
||||||
The proof requires that the prover can perform new calculations with $r$ given a cyphertext $c = g^mr^n \mod n^2$. For ease of programming,
|
|
||||||
|
|
||||||
\subsection{Application to domain}
|
\subsection{Application to domain}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user