Refactoring

mixer
Tal Moran 2017-01-19 16:00:01 +02:00
parent deeed4f20f
commit b9abd847c7
38 changed files with 239 additions and 525 deletions

View File

@ -123,7 +123,7 @@ message ElectionParams {
// Verification keys for valid mixers. // Verification keys for valid mixers.
repeated SignatureVerificationKey mixerVerificationKeys = 4; repeated SignatureVerificationKey mixerVerificationKeys = 4;
// How many mixers must participate for the mixing to be considered valid // How many mixers must participate for the network to be considered valid
uint32 mixerThreshold = 5; uint32 mixerThreshold = 5;
// questions to first indicate the voter's channel // questions to first indicate the voter's channel

View File

@ -1,7 +0,0 @@
package meerkat.crypto.mixnet;
/**
* Created by talm on 25/10/15.
*/
public class Trustee {
}

View File

@ -1,7 +0,0 @@
package meerkat.crypto.mixnet;
/**
* Created by talm on 25/10/15.
*/
public class Verifier {
}

View File

@ -1,9 +1,12 @@
package meerkat.mixer.mixing; package meerkat.mixer;
import com.google.protobuf.InvalidProtocolBufferException; import com.google.protobuf.InvalidProtocolBufferException;
import meerkat.crypto.Encryption; import meerkat.crypto.Encryption;
import meerkat.crypto.mixnet.Mix2ZeroKnowledgeProver; import meerkat.crypto.mixnet.Mix2ZeroKnowledgeProver;
import meerkat.crypto.mixnet.MixerOutput; import meerkat.crypto.mixnet.MixerOutput;
import meerkat.mixer.network.BenesNetwork;
import meerkat.mixer.network.PermutationNetwork;
import meerkat.mixer.network.RandomPermutation;
import meerkat.protobuf.Crypto.EncryptionRandomness; import meerkat.protobuf.Crypto.EncryptionRandomness;
import meerkat.protobuf.Crypto.RerandomizableEncryptedMessage; import meerkat.protobuf.Crypto.RerandomizableEncryptedMessage;
import meerkat.protobuf.Mixing.Mix2Proof; import meerkat.protobuf.Mixing.Mix2Proof;
@ -13,7 +16,7 @@ import java.util.Random;
/** /**
* an implementation of meerkat.crypto.mixnet.Mixer * an implementation of meerkat.crypto.mixnet.Mixer
* meerkat.mixer.mixing algorithm on set of n encrypted votes: * meerkat.mixer.network algorithm on set of n encrypted votes:
* 0. asset n is power of two * 0. asset n is power of two
* 1. set switches according to benes network on random permutation * 1. set switches according to benes network on random permutation
* 2. re encrypt and mix with respect to switches values (encryptor.rerandomize) * 2. re encrypt and mix with respect to switches values (encryptor.rerandomize)
@ -21,7 +24,7 @@ import java.util.Random;
* 4. return proofs table + encryption table * 4. return proofs table + encryption table
* *
*/ */
public class Mixer implements meerkat.crypto.mixnet.Mixer { public class MixGenerator implements meerkat.crypto.mixnet.Mixer {
private final Mix2ZeroKnowledgeProver prover; private final Mix2ZeroKnowledgeProver prover;
private final Encryption encryptor; private final Encryption encryptor;
@ -31,7 +34,7 @@ public class Mixer implements meerkat.crypto.mixnet.Mixer {
* @param prover * @param prover
* @param encryptor * @param encryptor
*/ */
public Mixer(Mix2ZeroKnowledgeProver prover, Encryption encryptor) { public MixGenerator(Mix2ZeroKnowledgeProver prover, Encryption encryptor) {
this.prover = prover; this.prover = prover;
this.encryptor = encryptor; this.encryptor = encryptor;
} }
@ -99,10 +102,9 @@ public class Mixer implements meerkat.crypto.mixnet.Mixer {
* @param randomnesses an initialized randomness table of size layers * n, use for rerandomize operations * @param randomnesses an initialized randomness table of size layers * n, use for rerandomize operations
* @throws InvalidProtocolBufferException * @throws InvalidProtocolBufferException
*/ */
private void rerandomize(PermutationNetwork mixNetwork, RerandomizableEncryptedMessage[][] encryptionTable private void rerandomize(PermutationNetwork mixNetwork,
,EncryptionRandomness[][] randomnesses) throws InvalidProtocolBufferException { RerandomizableEncryptedMessage[][] encryptionTable,
Switch[] switchesLayer; EncryptionRandomness[][] randomnesses) throws InvalidProtocolBufferException {
int index1,index2;
RerandomizableEncryptedMessage a,b; RerandomizableEncryptedMessage a,b;
EncryptionRandomness r1,r2; EncryptionRandomness r1,r2;
int layers = mixNetwork.getNumLayers(); int layers = mixNetwork.getNumLayers();
@ -176,7 +178,7 @@ public class Mixer implements meerkat.crypto.mixnet.Mixer {
* mix given encrypted votes using random * mix given encrypted votes using random
* @param ciphertexts encrypted votes * @param ciphertexts encrypted votes
* @param random * @param random
* @return meerkat.mixer.mixing result * @return meerkat.mixer.network result
* @throws InvalidProtocolBufferException * @throws InvalidProtocolBufferException
*/ */
public MixerOutput mix(List<RerandomizableEncryptedMessage> ciphertexts,Random random) throws InvalidProtocolBufferException { public MixerOutput mix(List<RerandomizableEncryptedMessage> ciphertexts,Random random) throws InvalidProtocolBufferException {
@ -195,7 +197,7 @@ public class Mixer implements meerkat.crypto.mixnet.Mixer {
rerandomize(net,encryptionTable,randomnesses); rerandomize(net,encryptionTable,randomnesses);
Mix2Proof[][] proofsTable = generateMix2ProofTable(net,encryptionTable,randomnesses); Mix2Proof[][] proofsTable = generateMix2ProofTable(net,encryptionTable,randomnesses);
return new meerkat.mixer.mixing.MixerOutput(logN, proofsTable, encryptionTable); return new meerkat.mixer.MixerOutput(logN, proofsTable, encryptionTable);
} }
} }

View File

@ -1,4 +1,4 @@
package meerkat.mixer.proofs; package meerkat.mixer;
import com.google.protobuf.InvalidProtocolBufferException; import com.google.protobuf.InvalidProtocolBufferException;
import meerkat.crypto.mixnet.Mix2ZeroKnowledgeVerifier; import meerkat.crypto.mixnet.Mix2ZeroKnowledgeVerifier;
@ -10,14 +10,14 @@ import java.util.Arrays;
/** /**
* Created by Tzlil on 12/30/2015. * Created by Tzlil on 12/30/2015.
* provide one operation - verify meerkat.mixer.mixing output * provide one operation - verify meerkat.mixer.network output
*/ */
public final class VerifyTable { public final class MixVerifier {
/** /**
* constructor * constructor
* @param verifier * @param verifier
* @param mixerOutput * @param mixerOutput
* @return true iff the meerkat.mixer.mixing output is valid * @return true iff the meerkat.mixer.network output is valid
* @throws InvalidProtocolBufferException * @throws InvalidProtocolBufferException
*/ */
public static boolean verifyTable(Mix2ZeroKnowledgeVerifier verifier, MixerOutput mixerOutput) public static boolean verifyTable(Mix2ZeroKnowledgeVerifier verifier, MixerOutput mixerOutput)

View File

@ -0,0 +1,52 @@
package meerkat.mixer;
import meerkat.protobuf.Crypto;
import meerkat.protobuf.Mixing;
import java.io.OutputStream;
/**
* Created by Tzlil on 1/18/2016.
* implements meerkat.crypto.mixnet.MixerOutput interface
* container for meerkat.mixer.network.mix result.
*/
public class MixerOutput implements meerkat.crypto.mixnet.MixerOutput {
private final Mixing.Mix2Proof[][] proofs;
private final Crypto.RerandomizableEncryptedMessage[][] encryptedMessages;
private final int logN;
/**
* constructor
* @param logN log (base 2) of the number of votes
* @param encryptedMessages at level 0 , contains the original encrypted votes
* at each other level contains the re encrypted votes
* @param proofs in each cell (level,switch) contains the match zero knowledge proof
*/
public MixerOutput(int logN, Mixing.Mix2Proof[][] proofs,
Crypto.RerandomizableEncryptedMessage[][] encryptedMessages) {
this.proofs = proofs;
this.encryptedMessages = encryptedMessages;
this.logN = logN;
}
@Override
public Mixing.Mix2Proof[][] getProofs() {
return proofs;
}
@Override
public Crypto.RerandomizableEncryptedMessage[][] getEncryptedMessages() {
return encryptedMessages;
}
@Override
public int getLogN() {
return logN;
}
@Override
public int getNumLayers() {
return 2 * logN - 1;
}
}

View File

@ -1,24 +1,22 @@
package meerkat.mixer.main; package meerkat.mixer.main;
import com.google.protobuf.ByteString;
import meerkat.crypto.mixnet.MixerOutput; import meerkat.crypto.mixnet.MixerOutput;
import meerkat.protobuf.BulletinBoardAPI; import meerkat.protobuf.BulletinBoardAPI;
import meerkat.protobuf.Crypto; import meerkat.protobuf.Crypto;
import meerkat.protobuf.Mixing; import meerkat.protobuf.Mixing;
import java.math.BigInteger;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
/** /**
* Created by Tzlil on 12/17/2015. * Created by Tzlil on 12/17/2015.
* provide convert operation from batch data to meerkat.mixer.mixing output and backwards * provide convert operation from batch data to meerkat.mixer.network output and backwards
*/ */
public class BatchConverter { public class BatchConverter {
/** /**
* convert meerkat.mixer.mixing output to batch data * convert meerkat.mixer.network output to batch data
* @param mixerOutput * @param mixerOutput
* @return meerkat.mixer.mixing output as list of batch data * @return meerkat.mixer.network output as list of batch data
*/ */
public List<BulletinBoardAPI.BatchChunk> MixerOutput2BatchChunk(MixerOutput mixerOutput) { public List<BulletinBoardAPI.BatchChunk> MixerOutput2BatchChunk(MixerOutput mixerOutput) {
@ -51,7 +49,7 @@ public class BatchConverter {
} }
/** /**
* convert batch data list to meerkat.mixer.mixing output * convert batch data list to meerkat.mixer.network output
* @param batchChunkList * @param batchChunkList
* @return batch data list as MixerOutput * @return batch data list as MixerOutput
* @throws Exception * @throws Exception
@ -85,7 +83,7 @@ public class BatchConverter {
} }
} }
return new meerkat.mixer.mixing.MixerOutput(logN, proofs,encryptions); return new meerkat.mixer.MixerOutput(logN, proofs,encryptions);
} }

View File

@ -5,7 +5,7 @@ import meerkat.crypto.mixnet.MixerOutput;
import meerkat.protobuf.Crypto; import meerkat.protobuf.Crypto;
import meerkat.mixer.necessary.AsyncBulletinBoardClient; import meerkat.mixer.necessary.AsyncBulletinBoardClient;
import meerkat.mixer.necessary.CompleteBatch; import meerkat.mixer.necessary.CompleteBatch;
import meerkat.mixer.proofs.VerifyTable; import meerkat.mixer.MixVerifier;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
@ -61,7 +61,7 @@ public class BatchHandler implements AsyncBulletinBoardClient.ClientCallback<Com
} }
/** /**
* convert batch data to meerkat.mixer.mixing output * convert batch data to meerkat.mixer.network output
* @throws Exception * @throws Exception
*/ */
private void convertMessage() throws Exception { private void convertMessage() throws Exception {
@ -71,18 +71,18 @@ public class BatchHandler implements AsyncBulletinBoardClient.ClientCallback<Com
/** /**
* call convert message, and if succeed verify the table * call convert message, and if succeed verify the table
* @return return true iff the given batch message is valid meerkat.mixer.mixing output * @return return true iff the given batch message is valid meerkat.mixer.network output
* @throws Exception * @throws Exception
*/ */
public boolean verifyTable() throws Exception { public boolean verifyTable() throws Exception {
if (mixerOutput == null) { if (mixerOutput == null) {
convertMessage(); convertMessage();
} }
return VerifyTable.verifyTable(verifier, mixerOutput); return MixVerifier.verifyTable(verifier, mixerOutput);
} }
/** /**
* extract input for meerkat.mixer.mixing from previous mixers output * extract input for meerkat.mixer.network from previous mixers output
* @return last layer of encrypted votes as list * @return last layer of encrypted votes as list
* @throws Throwable in case if failure * @throws Throwable in case if failure
*/ */

View File

@ -15,11 +15,11 @@ import java.util.Random;
/** /**
* Created by Tzlil on 12/17/2015. * Created by Tzlil on 12/17/2015.
* this class define all the operation meerkat.mixer.mixing party should do: * this class define all the operation meerkat.mixer.network party should do:
* 1. receive previous mixers output (re encrypted votes + proofs) * 1. receive previous mixers output (re encrypted votes + proofs)
* 2. verify its input * 2. verify its input
* 3. mix * 3. mix
* 4. send the meerkat.mixer.mixing output * 4. send the meerkat.mixer.network output
*/ */
public class MainMixing { public class MainMixing {
@ -86,7 +86,7 @@ public class MainMixing {
} }
/** /**
* send meerkat.mixer.mixing output to BB * send meerkat.mixer.network output to BB
* @param mixerOutput * @param mixerOutput
* @param batchId * @param batchId
* @param callback * @param callback

View File

@ -1,132 +0,0 @@
package meerkat.mixer.mixing;
import meerkat.protobuf.Crypto;
import meerkat.protobuf.Mixing;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* Created by Tzlil on 1/18/2016.
* implements meerkat.crypto.mixnet.MixerOutput interface
* container for meerkat.mixer.mixing.mix result.
*/
public class MixerOutput implements meerkat.crypto.mixnet.MixerOutput {
private final Mixing.Mix2Proof[][] proofs;
private final Crypto.RerandomizableEncryptedMessage[][] encryptedMessages;
private final int logN;
/**
* constructor
* @param logN log (base 2) of the number of votes
* @param encryptedMessages at level 0 , contains the original encrypted votes
* at each other level contains the re encrypted votes
* @param proofs in each cell (level,switch) contains the match zero knowledge proof
*/
public MixerOutput(int logN, Mixing.Mix2Proof[][] proofs
, Crypto.RerandomizableEncryptedMessage[][] encryptedMessages) {
this.proofs = proofs;
this.encryptedMessages = encryptedMessages;
this.logN = logN;
}
@Override
public Mixing.Mix2Proof[][] getProofs() {
return proofs;
}
@Override
public Crypto.RerandomizableEncryptedMessage[][] getEncryptedMessages() {
return encryptedMessages;
}
@Override
public int getLogN() {
return logN;
}
@Override
public int getNumLayers() {
return 2 * logN - 1;
}
/**
* print the output, encrypted messages and proofs, to folder
* @param dir - directory
* @throws IOException
*/
// public void outToFolder(String dir) throws IOException {
//
// (new File(dir)).mkdirs();
// //create files
// String proofsDir = dir + "/Proofs";
// String encDir = dir + "/EncryptedMessages";
// (new File(proofsDir)).mkdir();
// (new File(encDir)).mkdir();
// for (int layer = 0; layer < layers; layer++){
// (new File(proofsDir +"/layer" + layer )).mkdir();
// (new File(encDir +"/layer" + layer )).mkdir();
// }
// (new File(encDir +"/input")).mkdir();
//
//
// for (int layer = 0; layer < layers; layer++){
// for(int i = 0; i < proofs[layer].length; i ++){
// writeProofToFile(proofsDir,proofs[layer][i]);
// }
// }
//
// for (int layer = 0; layer <= layers; layer++){
// for(int i = 0; i < encryptedMessages[layer].length; i ++){
// writeEncToFile(encDir,layer - 1, i,encryptedMessages[layer][i]);
// }
// }
// }
/**
* create new file contains single proof
* @param proofsDir
* @param proof
* @throws IOException
*/
// private void writeProofToFile(String proofsDir, Mixing.Mix2Proof proof) throws IOException {
// Mixing.Mix2Proof.Location location = proof.getLocation();
// int layer = location.getLayer();
// int i = location.getI();
// int j = location.getJ();
// String fileName = proofsDir+"/layer" + layer +"/" + i +"_" + j;
//
// File file = new File(fileName);
// file.createNewFile();
// FileOutputStream fos = new FileOutputStream(file);
// fos.write(proof.toByteArray());
// fos.close();
// }
/**
* create new file contains single encrypted message
* @param encDir
* @param layer
* @param i
* @param enc
* @throws IOException
*/
private void writeEncToFile(String encDir,int layer,int i, Crypto.RerandomizableEncryptedMessage enc) throws IOException {
String fileName;
if(layer >= 0)
fileName = encDir+"/layer" + layer +"/" + i;
else
fileName = encDir+"/input/" + i;
File file = new File(fileName);
file.createNewFile();
FileOutputStream fos = new FileOutputStream(file);
fos.write(enc.toByteArray());
fos.close();
}
}

View File

@ -1,36 +0,0 @@
package meerkat.mixer.mixing;
/**
* Created by Tzlil on 12/15/2015.
* container for switch
*/
public class Switch{
public final int i, j, layer;
public final boolean value;
/**
* constructor
* @param i
* @param j
* @param layer
* @param value the switch is on or off
*/
public Switch(int i, int j, int layer, boolean value) {
this.i = i;
this.j = j;
this.layer = layer;
this.value = value;
}
@Override
public String toString() {
return "Switch{" +
"i=" + i +
", j=" + j +
", layer=" + layer +
", value=" + value +
'}';
}
}

View File

@ -1,4 +1,4 @@
package meerkat.mixer.mixing; package meerkat.mixer.network;
import java.util.*; import java.util.*;

View File

@ -1,6 +1,4 @@
package meerkat.mixer.mixing; package meerkat.mixer.network;
import java.util.ArrayList;
/** /**
* A generic permutation network composed of 2-input switches. * A generic permutation network composed of 2-input switches.

View File

@ -1,7 +1,5 @@
package meerkat.mixer.mixing; package meerkat.mixer.network;
import java.util.ArrayList;
import java.util.List;
import java.util.Random; import java.util.Random;
/** /**

View File

@ -1,6 +1,4 @@
package meerkat.mixer.mixing; package meerkat.mixer.network;
import java.util.ArrayList;
/** /**
* Generic utilities * Generic utilities

View File

@ -1,67 +0,0 @@
package meerkat.mixer.proofs;
import com.google.protobuf.InvalidProtocolBufferException;
import meerkat.crypto.concrete.ECElGamalEncryption;
import meerkat.crypto.mixnet.Mix2ZeroKnowledgeVerifier;
import meerkat.protobuf.Crypto;
import meerkat.protobuf.Mixing;
import org.bouncycastle.math.ec.ECPoint;
import org.factcenter.qilin.primitives.RandomOracle;
import org.factcenter.qilin.primitives.concrete.ECGroup;
/**
* implements Mix2ZeroKnowledgeVerifier
*/
public class Verifier implements Mix2ZeroKnowledgeVerifier {
private final ECElGamalEncryption encryptor;
private final ECGroup group;
private final RandomOracle randomOracle;
private final ECPoint g,h;
private final ECElGamalMixStatementGenerator mixParams;
final SigmaFiatShamir mix2NIZK;
// private final ZeroKnowledgeOrProofParser parser;
/**
* constructor
* @param encryptor should be as the encryptor used by meerkat.mixer.proofs
* @param randomOracle should be as the random oracle used by meerkat.mixer.proofs
*/
public Verifier(ECElGamalEncryption encryptor, RandomOracle randomOracle) {
this.encryptor = encryptor;
this.group = encryptor.getGroup();
this.g = group.getGenerator();
this.h = encryptor.getElGamalPK().getPK();
this.randomOracle = randomOracle;
this.mixParams = new ECElGamalMixStatementGenerator(encryptor);
this.mix2NIZK = new SigmaFiatShamir(ProtobufConcatenators.concatNIZK, randomOracle);
// this.parser = new ZeroKnowledgeOrProofParser(group);
}
/**
* verify zero knowledge proof
* @param in1
* @param in2
* @param out1
* @param out2
* @param proof out1 = rerandomize(in1) && out2 = rerandomize(in2)
* ||
* out1 = rerandomize(in2) && out2 = rerandomize(in1)
* @return true iff all 4 or proofs are valid
* @throws InvalidProtocolBufferException
*/
public boolean verify(Crypto.RerandomizableEncryptedMessage in1,
Crypto.RerandomizableEncryptedMessage in2,
Crypto.RerandomizableEncryptedMessage out1,
Crypto.RerandomizableEncryptedMessage out2,
Mixing.Mix2Proof proof) throws InvalidProtocolBufferException {
ECElGamalMixStatementGenerator.Mix2Statement statement = mixParams.createStatement(in1,in2,out1,out2);
Mix2.Verifier verifier = new Mix2.Verifier(encryptor, statement);
return mix2NIZK.verifyNizk(proof, verifier);
}
}

View File

@ -1,87 +0,0 @@
package meerkat.mixer.proofs;
import meerkat.crypto.concrete.ECElGamalEncryption;
import meerkat.crypto.concrete.Util;
import meerkat.protobuf.Mixing;
import org.bouncycastle.math.ec.ECPoint;
import org.factcenter.qilin.primitives.concrete.ECGroup;
import java.math.BigInteger;
/**
* Created by Tzlil on 1/25/2016.
* zero knowledge proof parser
*/
public class ZeroKnowledgeOrProofParser {
//
// private final ECGroup group;
//
// /**
// * parse or proof message and return the result in zero knowledge or proof container
// * @param orProof
// * @return zero knowledge or proof container
// */
// public ZeroKnowledgeOrProofContainer parseOrProof(Mixing.Mix2Proof.OrProof orProof){
// return new ZeroKnowledgeOrProofContainer(orProof);
// }
//
// /**
// * getter
// * @param group
// */
// public ZeroKnowledgeOrProofParser(ECGroup group) {
// this.group = group;
// }
//
//
// /**
// * inner class
// * container for parsed zero knowledge or proof
// * constructor is private, can be construct using ZeroKnowledgeOrProofParser.parseOrProof
// */
// public class ZeroKnowledgeOrProofContainer{
// public final ECPoint g1,g2,h1,h2;
// public final ECPoint g1Tag,g2Tag,h1Tag,h2Tag;
// public final ECPoint u,v,uTag,vTag;
// public final BigInteger c1,c2,z,zTag;
// public final Mixing.Mix2Proof.OrProof.FirstMessage firstMessage;
//
// /**
// * constructor
// * @param orProof
// */
// private ZeroKnowledgeOrProofContainer(Mixing.Mix2Proof.OrProof orProof){
// this.firstMessage =
// Mixing.Mix2Proof.OrProof.FirstMessage.newBuilder()
// .setG1(orProof.getG1())
// .setH1(orProof.getH1())
// .setG2(orProof.getG2())
// .setH2(orProof.getH2())
// .setG1Tag(orProof.getG1Tag())
// .setH1Tag(orProof.getH1Tag())
// .setG2Tag(orProof.getG2Tag())
// .setH2Tag(orProof.getH2Tag())
// .setU(orProof.getU())
// .setV(orProof.getV())
// .setUTag(orProof.getUTag())
// .setVTag(orProof.getVTag())
// .build();
// this.g1 = ECElGamalEncryption.decodeElement(group, orProof.getG1());
// this.g2 = ECElGamalEncryption.decodeElement(group, orProof.getG2());
// this.h1 = ECElGamalEncryption.decodeElement(group, orProof.getH1());
// this.h2 = ECElGamalEncryption.decodeElement(group, orProof.getH2());
// this.g1Tag = ECElGamalEncryption.decodeElement(group, orProof.getG1Tag());
// this.g2Tag = ECElGamalEncryption.decodeElement(group, orProof.getG2Tag());
// this.h1Tag = ECElGamalEncryption.decodeElement(group, orProof.getH1Tag());
// this.h2Tag = ECElGamalEncryption.decodeElement(group, orProof.getH2Tag());
// this.u = ECElGamalEncryption.decodeElement(group, orProof.getU());
// this.v = ECElGamalEncryption.decodeElement(group, orProof.getV());
// this.uTag = ECElGamalEncryption.decodeElement(group, orProof.getUTag());
// this.vTag = ECElGamalEncryption.decodeElement(group, orProof.getVTag());
// this.c1 = Util.decodeBigInteger(orProof.getC1());
// this.c2 = Util.decodeBigInteger(orProof.getC2());
// this.z = Util.decodeBigInteger(orProof.getZ());
// this.zTag = Util.decodeBigInteger(orProof.getZTag());
// }
// }
}

View File

@ -1,6 +1,7 @@
package meerkat.mixer.proofs; package meerkat.mixer.proofs.concrete;
import meerkat.crypto.concrete.ECElGamalEncryption; import meerkat.crypto.concrete.ECElGamalEncryption;
import meerkat.mixer.proofs.generic.SigmaProtocolAnd2;
import meerkat.protobuf.Mixing; import meerkat.protobuf.Mixing;
import java.util.Random; import java.util.Random;
@ -13,8 +14,8 @@ public class DlogConjunction {
public static class Prover public static class Prover
extends SigmaProtocolAnd2.Prover<Mixing.Mix2Proof.AndProof.FirstMessage, Mixing.Mix2Proof.DlogProof.FirstMessage, Mixing.Mix2Proof.AndProof.FinalMessage, Mixing.Mix2Proof.DlogProof.FinalMessage> { extends SigmaProtocolAnd2.Prover<Mixing.Mix2Proof.AndProof.FirstMessage, Mixing.Mix2Proof.DlogProof.FirstMessage, Mixing.Mix2Proof.AndProof.FinalMessage, Mixing.Mix2Proof.DlogProof.FinalMessage> {
public Prover(ECElGamalEncryption encryptor, Random rand, ECElGamalMixStatementGenerator.AndStatement statement, public Prover(ECElGamalEncryption encryptor, Random rand, Statements.AndStatement statement,
ECElGamalMixStatementGenerator.AndStatementWitness witness) { Statements.AndStatementWitness witness) {
super(ProtobufConcatenators.concatAnd1, ProtobufConcatenators.concatAnd2, new SchnorrDlogEquivalence.Prover(encryptor, rand, statement.clauses[0], witness.witnesses[0]), super(ProtobufConcatenators.concatAnd1, ProtobufConcatenators.concatAnd2, new SchnorrDlogEquivalence.Prover(encryptor, rand, statement.clauses[0], witness.witnesses[0]),
new SchnorrDlogEquivalence.Prover(encryptor, rand, statement.clauses[1], witness.witnesses[1])); new SchnorrDlogEquivalence.Prover(encryptor, rand, statement.clauses[1], witness.witnesses[1]));
@ -22,7 +23,7 @@ public class DlogConjunction {
} }
public static class Simulator extends SigmaProtocolAnd2.Simulator { public static class Simulator extends SigmaProtocolAnd2.Simulator {
public Simulator(ECElGamalEncryption encryptor, Random rand, ECElGamalMixStatementGenerator.AndStatement statement) { public Simulator(ECElGamalEncryption encryptor, Random rand, Statements.AndStatement statement) {
super(ProtobufConcatenators.concatAnd1, ProtobufConcatenators.concatAnd2, super(ProtobufConcatenators.concatAnd1, ProtobufConcatenators.concatAnd2,
new SchnorrDlogEquivalence.Simulator(encryptor, rand, statement.clauses[0]), new SchnorrDlogEquivalence.Simulator(encryptor, rand, statement.clauses[1])); new SchnorrDlogEquivalence.Simulator(encryptor, rand, statement.clauses[0]), new SchnorrDlogEquivalence.Simulator(encryptor, rand, statement.clauses[1]));
} }
@ -31,7 +32,7 @@ public class DlogConjunction {
public static class Verifier public static class Verifier
extends SigmaProtocolAnd2.Verifier<Mixing.Mix2Proof.AndProof.FirstMessage, Mixing.Mix2Proof.DlogProof.FirstMessage, Mixing.Mix2Proof.AndProof.FinalMessage, Mixing.Mix2Proof.DlogProof.FinalMessage> { extends SigmaProtocolAnd2.Verifier<Mixing.Mix2Proof.AndProof.FirstMessage, Mixing.Mix2Proof.DlogProof.FirstMessage, Mixing.Mix2Proof.AndProof.FinalMessage, Mixing.Mix2Proof.DlogProof.FinalMessage> {
public Verifier(ECElGamalEncryption encryptor, ECElGamalMixStatementGenerator.AndStatement statement) { public Verifier(ECElGamalEncryption encryptor, Statements.AndStatement statement) {
super(ProtobufConcatenators.concatAnd1, ProtobufConcatenators.concatAnd2, super(ProtobufConcatenators.concatAnd1, ProtobufConcatenators.concatAnd2,
new SchnorrDlogEquivalence.Verifier(encryptor, statement.clauses[0]), new SchnorrDlogEquivalence.Verifier(encryptor, statement.clauses[1])); new SchnorrDlogEquivalence.Verifier(encryptor, statement.clauses[0]), new SchnorrDlogEquivalence.Verifier(encryptor, statement.clauses[1]));
} }

View File

@ -1,6 +1,7 @@
package meerkat.mixer.proofs; package meerkat.mixer.proofs.concrete;
import meerkat.crypto.concrete.ECElGamalEncryption; import meerkat.crypto.concrete.ECElGamalEncryption;
import meerkat.mixer.proofs.generic.SigmaProtocolOr2;
import meerkat.protobuf.Mixing; import meerkat.protobuf.Mixing;
import org.factcenter.qilin.primitives.concrete.ECGroup; import org.factcenter.qilin.primitives.concrete.ECGroup;
@ -30,7 +31,7 @@ public class Mix2 {
} }
public static class Prover extends SigmaProtocolOr2.Prover<Mixing.Mix2Proof.FirstMessage, Mixing.Mix2Proof.AndProof.FirstMessage, Mixing.Mix2Proof.FinalMessage, Mixing.Mix2Proof.AndProof.FinalMessage> { public static class Prover extends SigmaProtocolOr2.Prover<Mixing.Mix2Proof.FirstMessage, Mixing.Mix2Proof.AndProof.FirstMessage, Mixing.Mix2Proof.FinalMessage, Mixing.Mix2Proof.AndProof.FinalMessage> {
public Prover(ECElGamalEncryption encryptor, Random rand, ECElGamalMixStatementGenerator.Mix2Statement statement, ECElGamalMixStatementGenerator.Mix2StatementWitness witness) { public Prover(ECElGamalEncryption encryptor, Random rand, Statements.Mix2Statement statement, Statements.Mix2StatementWitness witness) {
super(ProtobufConcatenators.concatMix1, ProtobufConcatenators.concatMix2, new ChallengeGenerator(encryptor, rand), super(ProtobufConcatenators.concatMix1, ProtobufConcatenators.concatMix2, new ChallengeGenerator(encryptor, rand),
new DlogConjunction.Prover(encryptor, rand, statement.clauses[witness.trueClauseIndex], witness.witness), new DlogConjunction.Prover(encryptor, rand, statement.clauses[witness.trueClauseIndex], witness.witness),
new DlogConjunction.Simulator(encryptor, rand, statement.clauses[1 - witness.trueClauseIndex]), new DlogConjunction.Simulator(encryptor, rand, statement.clauses[1 - witness.trueClauseIndex]),
@ -39,7 +40,7 @@ public class Mix2 {
} }
public static class Verifier extends SigmaProtocolOr2.Verifier<Mixing.Mix2Proof.FirstMessage, Mixing.Mix2Proof.AndProof.FirstMessage, Mixing.Mix2Proof.FinalMessage, Mixing.Mix2Proof.AndProof.FinalMessage> { public static class Verifier extends SigmaProtocolOr2.Verifier<Mixing.Mix2Proof.FirstMessage, Mixing.Mix2Proof.AndProof.FirstMessage, Mixing.Mix2Proof.FinalMessage, Mixing.Mix2Proof.AndProof.FinalMessage> {
public Verifier(ECElGamalEncryption encryptor, ECElGamalMixStatementGenerator.Mix2Statement statement) { public Verifier(ECElGamalEncryption encryptor, Statements.Mix2Statement statement) {
super(ProtobufConcatenators.concatMix1, ProtobufConcatenators.concatMix2, new ChallengeGenerator(encryptor, null), super(ProtobufConcatenators.concatMix1, ProtobufConcatenators.concatMix2, new ChallengeGenerator(encryptor, null),
new DlogConjunction.Verifier(encryptor, statement.clauses[0]), new DlogConjunction.Verifier(encryptor, statement.clauses[1])); new DlogConjunction.Verifier(encryptor, statement.clauses[0]), new DlogConjunction.Verifier(encryptor, statement.clauses[1]));
} }

View File

@ -1,31 +1,28 @@
package meerkat.mixer.proofs; package meerkat.mixer.proofs.concrete;
import com.google.protobuf.InvalidProtocolBufferException; import com.google.protobuf.InvalidProtocolBufferException;
import meerkat.crypto.concrete.ECElGamalEncryption; import meerkat.crypto.concrete.ECElGamalEncryption;
import meerkat.crypto.mixnet.Mix2ZeroKnowledgeProver; import meerkat.crypto.mixnet.Mix2ZeroKnowledgeProver;
import meerkat.crypto.mixnet.Mix2ZeroKnowledgeVerifier;
import meerkat.mixer.proofs.generic.SigmaFiatShamir;
import meerkat.protobuf.Crypto; import meerkat.protobuf.Crypto;
import meerkat.protobuf.Mixing; import meerkat.protobuf.Mixing;
import org.bouncycastle.math.ec.ECPoint;
import org.factcenter.qilin.primitives.RandomOracle; import org.factcenter.qilin.primitives.RandomOracle;
import org.factcenter.qilin.primitives.concrete.ECGroup; import org.factcenter.qilin.primitives.concrete.ECGroup;
import java.math.BigInteger;
import java.util.Random; import java.util.Random;
/** /**
* implements of Mix2ZeroKnowledgeProver interface * implements of Mix2ZeroKnowledgeProver and Mix2ZeroKnowledgeVerifier interfaces
* this implementation assumes that each RerandomizableEncryptedMessage is ElGamalCiphertext * this implementation assumes that each RerandomizableEncryptedMessage is an ElGamalCiphertext
*/ */
public class Prover implements Mix2ZeroKnowledgeProver { public class Mix2nizk implements Mix2ZeroKnowledgeProver, Mix2ZeroKnowledgeVerifier {
// //
private final ECGroup group; private final ECGroup group;
private final RandomOracle randomOracle;
private final Random rand; private final Random rand;
private final ECElGamalEncryption encryptor; private final ECElGamalEncryption encryptor;
private final ECPoint g,h; private final Statements mixParams;
private final BigInteger groupOrderUpperBound;
private final ECElGamalMixStatementGenerator mixParams;
final SigmaFiatShamir<Mixing.Mix2Proof, Mixing.Mix2Proof.FirstMessage, Mixing.Mix2Proof.FinalMessage> mix2NIZK; final SigmaFiatShamir<Mixing.Mix2Proof, Mixing.Mix2Proof.FirstMessage, Mixing.Mix2Proof.FinalMessage> mix2NIZK;
/** /**
@ -33,16 +30,12 @@ public class Prover implements Mix2ZeroKnowledgeProver {
* @param encryptor * @param encryptor
* @param randomOracle - use for FiatShamir heuristic * @param randomOracle - use for FiatShamir heuristic
*/ */
public Prover(Random rand, ECElGamalEncryption encryptor, RandomOracle randomOracle) { public Mix2nizk(Random rand, ECElGamalEncryption encryptor, RandomOracle randomOracle) {
this.rand = rand; this.rand = rand;
this.encryptor = encryptor; this.encryptor = encryptor;
this.randomOracle = randomOracle;
this.group = this.encryptor.getGroup(); this.group = this.encryptor.getGroup();
this.g = group.getGenerator(); this.mixParams = new Statements(encryptor);
this.h = this.encryptor.getElGamalPK().getPK();
this.mixParams = new ECElGamalMixStatementGenerator(encryptor);
this.groupOrderUpperBound = group.orderUpperBound();
this.mix2NIZK = new SigmaFiatShamir(ProtobufConcatenators.concatNIZK, randomOracle); this.mix2NIZK = new SigmaFiatShamir(ProtobufConcatenators.concatNIZK, randomOracle);
} }
@ -68,8 +61,8 @@ public class Prover implements Mix2ZeroKnowledgeProver {
Crypto.EncryptionRandomness r2) throws InvalidProtocolBufferException { Crypto.EncryptionRandomness r2) throws InvalidProtocolBufferException {
ECElGamalMixStatementGenerator.Mix2Statement statement = mixParams.createStatement(a, b, c, d); Statements.Mix2Statement statement = mixParams.createStatement(a, b, c, d);
ECElGamalMixStatementGenerator.Mix2StatementWitness witness = mixParams.createMix2Witness(r1, r2, switched); Statements.Mix2StatementWitness witness = mixParams.createMix2Witness(r1, r2, switched);
Mix2.Prover prover = new Mix2.Prover(encryptor, rand, statement, witness); Mix2.Prover prover = new Mix2.Prover(encryptor, rand, statement, witness);
@ -82,5 +75,28 @@ public class Prover implements Mix2ZeroKnowledgeProver {
return mix2NIZK.generateNizk(prover).toBuilder().setLocation(location).build(); return mix2NIZK.generateNizk(prover).toBuilder().setLocation(location).build();
} }
/**
* verify zero knowledge proof
* @param in1
* @param in2
* @param out1
* @param out2
* @param proof out1 = rerandomize(in1) && out2 = rerandomize(in2)
* ||
* out1 = rerandomize(in2) && out2 = rerandomize(in1)
* @return true iff all 4 or proofs are valid
* @throws InvalidProtocolBufferException
*/
public boolean verify(Crypto.RerandomizableEncryptedMessage in1,
Crypto.RerandomizableEncryptedMessage in2,
Crypto.RerandomizableEncryptedMessage out1,
Crypto.RerandomizableEncryptedMessage out2,
Mixing.Mix2Proof proof) throws InvalidProtocolBufferException {
Statements.Mix2Statement statement = mixParams.createStatement(in1,in2,out1,out2);
Mix2.Verifier verifier = new Mix2.Verifier(encryptor, statement);
return mix2NIZK.verifyNizk(proof, verifier);
}
} }

View File

@ -1,6 +1,7 @@
package meerkat.mixer.proofs; package meerkat.mixer.proofs.concrete;
import meerkat.crypto.concrete.Util; import meerkat.crypto.concrete.Util;
import meerkat.mixer.proofs.Concatenator;
import meerkat.protobuf.Mixing; import meerkat.protobuf.Mixing;
import java.math.BigInteger; import java.math.BigInteger;

View File

@ -1,7 +1,8 @@
package meerkat.mixer.proofs; package meerkat.mixer.proofs.concrete;
import meerkat.crypto.concrete.ECElGamalEncryption; import meerkat.crypto.concrete.ECElGamalEncryption;
import meerkat.crypto.concrete.Util; import meerkat.crypto.concrete.Util;
import meerkat.mixer.proofs.SigmaProtocol;
import meerkat.protobuf.ConcreteCrypto; import meerkat.protobuf.ConcreteCrypto;
import meerkat.protobuf.Mixing; import meerkat.protobuf.Mixing;
import org.bouncycastle.math.ec.ECPoint; import org.bouncycastle.math.ec.ECPoint;
@ -18,9 +19,9 @@ public class SchnorrDlogEquivalence {
public static class Verifier implements SigmaProtocol.Verifier<Mixing.Mix2Proof.DlogProof.FirstMessage, Mixing.Mix2Proof.DlogProof.FinalMessage> { public static class Verifier implements SigmaProtocol.Verifier<Mixing.Mix2Proof.DlogProof.FirstMessage, Mixing.Mix2Proof.DlogProof.FinalMessage> {
ECElGamalEncryption encryptor; ECElGamalEncryption encryptor;
ECGroup group; ECGroup group;
final ECElGamalMixStatementGenerator.DlogStatement statement; final Statements.DlogStatement statement;
public Verifier(ECElGamalEncryption encryptor, ECElGamalMixStatementGenerator.DlogStatement statement) { public Verifier(ECElGamalEncryption encryptor, Statements.DlogStatement statement) {
this.encryptor = encryptor; this.encryptor = encryptor;
group = encryptor.getGroup(); group = encryptor.getGroup();
this.statement = statement; this.statement = statement;
@ -49,10 +50,10 @@ public class SchnorrDlogEquivalence {
ECGroup group; ECGroup group;
Random rand; Random rand;
ECElGamalMixStatementGenerator.DlogStatement statement; Statements.DlogStatement statement;
BigInteger response = null; BigInteger response = null;
public Simulator(ECElGamalEncryption encryptor, Random rand, ECElGamalMixStatementGenerator.DlogStatement statement) { public Simulator(ECElGamalEncryption encryptor, Random rand, Statements.DlogStatement statement) {
this.encryptor = encryptor; this.encryptor = encryptor;
group = encryptor.getGroup(); group = encryptor.getGroup();
this.rand = rand; this.rand = rand;
@ -84,13 +85,13 @@ public class SchnorrDlogEquivalence {
ECElGamalEncryption encryptor; ECElGamalEncryption encryptor;
ECGroup group; ECGroup group;
Random rand; Random rand;
ECElGamalMixStatementGenerator.DlogStatement statement; Statements.DlogStatement statement;
ECElGamalMixStatementGenerator.DlogStatementWitness witness; Statements.DlogStatementWitness witness;
BigInteger r = null; BigInteger r = null;
public Prover(ECElGamalEncryption encryptor, Random rand, public Prover(ECElGamalEncryption encryptor, Random rand,
ECElGamalMixStatementGenerator.DlogStatement statement, ECElGamalMixStatementGenerator.DlogStatementWitness witness) { Statements.DlogStatement statement, Statements.DlogStatementWitness witness) {
this.encryptor = encryptor; this.encryptor = encryptor;
group = encryptor.getGroup(); group = encryptor.getGroup();
this.rand = rand; this.rand = rand;

View File

@ -1,9 +1,8 @@
package meerkat.mixer.proofs; package meerkat.mixer.proofs.concrete;
import com.google.protobuf.InvalidProtocolBufferException; import com.google.protobuf.InvalidProtocolBufferException;
import meerkat.crypto.concrete.ECElGamalEncryption; import meerkat.crypto.concrete.ECElGamalEncryption;
import meerkat.protobuf.ConcreteCrypto.ElGamalCiphertext; import meerkat.protobuf.ConcreteCrypto.ElGamalCiphertext;
import meerkat.protobuf.ConcreteCrypto.GroupElement;
import meerkat.protobuf.Crypto; import meerkat.protobuf.Crypto;
import meerkat.protobuf.Crypto.EncryptionRandomness; import meerkat.protobuf.Crypto.EncryptionRandomness;
import org.bouncycastle.math.ec.ECPoint; import org.bouncycastle.math.ec.ECPoint;
@ -16,28 +15,22 @@ import java.math.BigInteger;
* *
* both meerkat.mixer.proofs and meerkat.mixer.verifier implementation use it * both meerkat.mixer.proofs and meerkat.mixer.verifier implementation use it
*/ */
public class ECElGamalMixStatementGenerator { public class Statements {
final ECElGamalEncryption encryptor; final public ECElGamalEncryption encryptor;
final ECGroup group; final public ECGroup group;
final ECPoint g; final public ECPoint g;
final ECPoint h; final public ECPoint h;
// Cache encoded formats to save multiple re-encodings
private final GroupElement gEncoded;
private final GroupElement hEncoded;
/** /**
* @param encryptor encryptor used for encoding/decoding serialized ciphertexts. The group, default generator and * @param encryptor encryptor used for encoding/decoding serialized ciphertexts. The group, default generator and
* second base (h) are taken from the encryptor (second base is the public key) * second base (h) are taken from the encryptor (second base is the public key)
*/ */
public ECElGamalMixStatementGenerator(ECElGamalEncryption encryptor){ public Statements(ECElGamalEncryption encryptor){
this.encryptor = encryptor; this.encryptor = encryptor;
this.group = encryptor.getGroup(); this.group = encryptor.getGroup();
this.g = group.getGenerator(); this.g = group.getGenerator();
this.h = encryptor.getElGamalPK().getPK(); this.h = encryptor.getElGamalPK().getPK();
this.gEncoded = encryptor.encodeElement(g);
this.hEncoded = encryptor.encodeElement(h);
} }
/** /**
@ -175,9 +168,9 @@ public class ECElGamalMixStatementGenerator {
DlogStatement(ECPoint a, ECPoint b) { DlogStatement(ECPoint a, ECPoint b) {
this.g = ECElGamalMixStatementGenerator.this.g; this.g = Statements.this.g;
this.a = a; this.a = a;
this.h = ECElGamalMixStatementGenerator.this.h; this.h = Statements.this.h;
this.b = b; this.b = b;
} }
} }

View File

@ -1,6 +1,8 @@
package meerkat.mixer.proofs; package meerkat.mixer.proofs.generic;
import com.google.protobuf.Message; import com.google.protobuf.Message;
import meerkat.mixer.proofs.Concatenator;
import meerkat.mixer.proofs.SigmaProtocol;
import org.factcenter.qilin.primitives.RandomOracle; import org.factcenter.qilin.primitives.RandomOracle;
import java.math.BigInteger; import java.math.BigInteger;

View File

@ -1,4 +1,7 @@
package meerkat.mixer.proofs; package meerkat.mixer.proofs.generic;
import meerkat.mixer.proofs.Concatenator;
import meerkat.mixer.proofs.SigmaProtocol;
import java.math.BigInteger; import java.math.BigInteger;

View File

@ -1,4 +1,7 @@
package meerkat.mixer.proofs; package meerkat.mixer.proofs.generic;
import meerkat.mixer.proofs.Concatenator;
import meerkat.mixer.proofs.SigmaProtocol;
import java.math.BigInteger; import java.math.BigInteger;

View File

@ -3,11 +3,11 @@
//import meerkat.crypto.concrete.ECElGamalEncryption; //import meerkat.crypto.concrete.ECElGamalEncryption;
//import meerkat.crypto.mixnet.Mix2ZeroKnowledgeProver; //import meerkat.crypto.mixnet.Mix2ZeroKnowledgeProver;
//import meerkat.crypto.mixnet.Mix2ZeroKnowledgeVerifier; //import meerkat.crypto.mixnet.Mix2ZeroKnowledgeVerifier;
//import meerkat.mixer.mixing.Mixer; //import meerkat.mixer.Mixer;
//import meerkat.mixer.mixing.MixerOutput; //import meerkat.mixer.MixerOutput;
//import meerkat.mixer.proofs.Prover; //import meerkat.mixer.proofs.Prover;
//import meerkat.mixer.proofs.Verifier; //import meerkat.mixer.proofs.Verifier;
//import meerkat.mixer.proofs.VerifyTable; //import meerkat.mixer.VerifyTable;
//import meerkat.protobuf.Crypto; //import meerkat.protobuf.Crypto;
//import meerkat.protobuf.Voting; //import meerkat.protobuf.Voting;
//import org.factcenter.qilin.primitives.RandomOracle; //import org.factcenter.qilin.primitives.RandomOracle;
@ -72,9 +72,9 @@
// public void createValidTest() throws IOException { // public void createValidTest() throws IOException {
// //
// List<Crypto.RerandomizableEncryptedMessage> mixerInput = generateMixerInput(); // List<Crypto.RerandomizableEncryptedMessage> mixerInput = generateMixerInput();
// System.out.println("start mixing"); // System.out.println("start network");
// MixerOutput mixerOutput = (MixerOutput)mixer.mix(mixerInput,randomMixer); // MixerOutput mixerOutput = (MixerOutput)mixer.mix(mixerInput,randomMixer);
// System.out.println("mixing ended, start verification"); // System.out.println("network ended, start verification");
// assert (VerifyTable.verifyTable(verifier,n,mixerOutput)); // assert (VerifyTable.verifyTable(verifier,n,mixerOutput));
// System.out.println("verification ended, start printing"); // System.out.println("verification ended, start printing");
// mixerOutput.outToFolder("C:\\Users\\Tzlil\\Desktop\\TestVector\\Test3"); // mixerOutput.outToFolder("C:\\Users\\Tzlil\\Desktop\\TestVector\\Test3");
@ -89,9 +89,9 @@
// //mixer = new Mixer(randomMixer,corruptedProver,enc,corruptedVerifier); // //mixer = new Mixer(randomMixer,corruptedProver,enc,corruptedVerifier);
// //
// List<Crypto.RerandomizableEncryptedMessage> mixerInput = generateMixerInput(); // List<Crypto.RerandomizableEncryptedMessage> mixerInput = generateMixerInput();
// System.out.println("start mixing"); // System.out.println("start network");
// MixerOutput mixerOutput = (MixerOutput)mixer.mix(mixerInput,random); // MixerOutput mixerOutput = (MixerOutput)mixer.mix(mixerInput,random);
// System.out.println("mixing ended, start negative verification"); // System.out.println("network ended, start negative verification");
// assert (!VerifyTable.verifyTable(verifier,n,mixerOutput)); // assert (!VerifyTable.verifyTable(verifier,n,mixerOutput));
// System.out.println("verification ended, start printing"); // System.out.println("verification ended, start printing");
// mixerOutput.outToFolder("C:\\Users\\Tzlil\\Desktop\\TestVector\\Test5"); // mixerOutput.outToFolder("C:\\Users\\Tzlil\\Desktop\\TestVector\\Test5");

View File

@ -1,10 +1,6 @@
package meerkat.mixer; package meerkat.mixer;
import meerkat.crypto.concrete.ECElGamalEncryption; import meerkat.crypto.concrete.ECElGamalEncryption;
import meerkat.crypto.mixnet.Mix2ZeroKnowledgeProver;
import meerkat.crypto.mixnet.Mix2ZeroKnowledgeVerifier;
import meerkat.mixer.proofs.Prover;
import meerkat.mixer.proofs.Verifier;
import meerkat.protobuf.ConcreteCrypto; import meerkat.protobuf.ConcreteCrypto;
import org.factcenter.qilin.primitives.RandomOracle; import org.factcenter.qilin.primitives.RandomOracle;
import org.factcenter.qilin.primitives.concrete.DigestOracle; import org.factcenter.qilin.primitives.concrete.DigestOracle;

View File

@ -5,18 +5,9 @@ package meerkat.mixer;
*/ */
import com.google.protobuf.InvalidProtocolBufferException; import com.google.protobuf.InvalidProtocolBufferException;
import meerkat.crypto.concrete.ECElGamalEncryption; import meerkat.mixer.proofs.concrete.Mix2nizk;
import meerkat.crypto.mixnet.Mix2ZeroKnowledgeVerifier;
import meerkat.mixer.mixing.Mixer;
import meerkat.mixer.proofs.Prover;
import meerkat.mixer.proofs.Verifier;
import meerkat.mixer.proofs.VerifyTable;
import meerkat.protobuf.Crypto; import meerkat.protobuf.Crypto;
import meerkat.protobuf.Voting; import meerkat.protobuf.Voting;
import org.factcenter.qilin.primitives.RandomOracle;
import org.factcenter.qilin.primitives.concrete.DigestOracle;
import org.factcenter.qilin.primitives.concrete.ECElGamal;
import org.factcenter.qilin.primitives.concrete.ECGroup;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
@ -27,8 +18,7 @@ import java.util.Random;
public class MixingTest extends ECParamTestBase { public class MixingTest extends ECParamTestBase {
Random random,randomMixer,randomProver; Random random,randomMixer,randomProver;
Mix2ZeroKnowledgeVerifier verifier; Mix2nizk mix2nizk;
Prover prover;
meerkat.crypto.mixnet.Mixer mixer; meerkat.crypto.mixnet.Mixer mixer;
private int layers; private int layers;
private int n; private int n;
@ -40,9 +30,8 @@ public class MixingTest extends ECParamTestBase {
random = new Random(1); random = new Random(1);
randomMixer = new Random(2); randomMixer = new Random(2);
randomProver = new Random(3); randomProver = new Random(3);
verifier = new Verifier(enc,randomOracle); mix2nizk = new Mix2nizk(randomProver, enc,randomOracle);
prover = new Prover(randomProver, enc,randomOracle); mixer = new MixGenerator(mix2nizk, enc);
mixer = new Mixer(prover, enc);
// generate n // generate n
int logN = 5; // + random.nextInt(8) int logN = 5; // + random.nextInt(8)
@ -65,7 +54,7 @@ public class MixingTest extends ECParamTestBase {
System.out.println("n is : " + n); System.out.println("n is : " + n);
System.out.println(" generating input"); System.out.println(" generating input");
List<Crypto.RerandomizableEncryptedMessage> mixerInput = generateMixerInput(); List<Crypto.RerandomizableEncryptedMessage> mixerInput = generateMixerInput();
System.out.println(" start mixing"); System.out.println(" start network");
long startTime = System.currentTimeMillis(); long startTime = System.currentTimeMillis();
meerkat.crypto.mixnet.MixerOutput mixerOutput = mixer.mix(mixerInput,randomMixer); meerkat.crypto.mixnet.MixerOutput mixerOutput = mixer.mix(mixerInput,randomMixer);
@ -76,7 +65,7 @@ public class MixingTest extends ECParamTestBase {
System.out.println("start verification"); System.out.println("start verification");
startTime = System.currentTimeMillis(); startTime = System.currentTimeMillis();
assert (VerifyTable.verifyTable(verifier,mixerOutput)); assert (MixVerifier.verifyTable(mix2nizk, mixerOutput));
finishTime = System.currentTimeMillis(); finishTime = System.currentTimeMillis();
System.out.println(" that took: "+(finishTime-startTime)+ " ms"); System.out.println(" that took: "+(finishTime-startTime)+ " ms");

View File

@ -1,11 +1,4 @@
package meerkat.mixer.mixing; package meerkat.mixer.network;
import org.junit.Test;
import java.util.Set;
import java.util.TreeSet;
import static org.junit.Assert.*;
/** /**
* Tests for Benes Network topology * Tests for Benes Network topology

View File

@ -1,4 +1,4 @@
package meerkat.mixer.mixing; package meerkat.mixer.network;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;

View File

@ -1,11 +1,8 @@
package meerkat.mixer.proofs; package meerkat.mixer.proofs;
import meerkat.protobuf.Crypto; import meerkat.protobuf.Crypto;
import org.factcenter.qilin.primitives.RandomOracle;
import org.factcenter.qilin.primitives.concrete.DigestOracle;
import java.math.BigInteger; import java.math.BigInteger;
import java.util.Random;
/** /**
* Created by talm on 14/01/17. * Created by talm on 14/01/17.
@ -15,12 +12,12 @@ public class DummySigmaTest extends SigmaProtocolTest<Crypto.BigInteger, BigInte
BigInteger x,y,z; BigInteger x,y,z;
@Override @Override
void generateRandomTrueStatement() { protected void generateRandomTrueStatement() {
x = new BigInteger(100, rand); y = new BigInteger(100, rand); z = x.add(y); x = new BigInteger(100, rand); y = new BigInteger(100, rand); z = x.add(y);
} }
@Override @Override
void generateRandomFalseStatement() { protected void generateRandomFalseStatement() {
x = new BigInteger(100, rand); x = new BigInteger(100, rand);
y = new BigInteger(100, rand); y = new BigInteger(100, rand);
z = new BigInteger(100, rand); z = new BigInteger(100, rand);

View File

@ -1,6 +1,7 @@
package meerkat.mixer.proofs; package meerkat.mixer.proofs;
import com.google.protobuf.Message; import com.google.protobuf.Message;
import meerkat.mixer.proofs.generic.SigmaFiatShamir;
import org.factcenter.qilin.primitives.RandomOracle; import org.factcenter.qilin.primitives.RandomOracle;
import org.factcenter.qilin.primitives.concrete.DigestOracle; import org.factcenter.qilin.primitives.concrete.DigestOracle;
import org.factcenter.qilin.util.Pair; import org.factcenter.qilin.util.Pair;
@ -18,17 +19,17 @@ import static org.junit.Assert.*;
abstract public class SigmaProtocolTest<M1 extends Message, M2> { abstract public class SigmaProtocolTest<M1 extends Message, M2> {
public final int NUM_REPEAT = 10; public final int NUM_REPEAT = 10;
final RandomOracle randomOracle = new DigestOracle(); final protected RandomOracle randomOracle = new DigestOracle();
abstract void generateRandomTrueStatement(); abstract protected void generateRandomTrueStatement();
abstract void generateRandomFalseStatement(); abstract protected void generateRandomFalseStatement();
abstract protected SigmaProtocol.Prover<M1, M2> getNewProver(); abstract protected SigmaProtocol.Prover<M1, M2> getNewProver();
abstract protected SigmaProtocol.Verifier<M1, M2> getNewVerifier(); abstract protected SigmaProtocol.Verifier<M1, M2> getNewVerifier();
abstract protected SigmaProtocol.Simulator<M1, M2> getNewSimulator(); abstract protected SigmaProtocol.Simulator<M1, M2> getNewSimulator();
class NIZKConcat implements Concatenator.Pair<Pair<M1,M2>, M1, M2> { public class NIZKConcat implements Concatenator.Pair<Pair<M1,M2>, M1, M2> {
@Override @Override
public Pair<M1, M2> concatenate(M1 msg1, M2 msg2) { return new Pair<M1, M2>(msg1, msg2); } public Pair<M1, M2> concatenate(M1 msg1, M2 msg2) { return new Pair<M1, M2>(msg1, msg2); }
@ -39,7 +40,7 @@ abstract public class SigmaProtocolTest<M1 extends Message, M2> {
public M2 getMsg2(Pair<M1,M2> msg) { return msg.b; } public M2 getMsg2(Pair<M1,M2> msg) { return msg.b; }
} }
final NIZKConcat nizkConcat = new NIZKConcat(); final protected NIZKConcat nizkConcat = new NIZKConcat();
abstract protected BigInteger getChallengeModulus(); abstract protected BigInteger getChallengeModulus();
@ -49,7 +50,7 @@ abstract public class SigmaProtocolTest<M1 extends Message, M2> {
BigInteger challengeModulus; BigInteger challengeModulus;
int challengeBits; int challengeBits;
Random rand = new Random(1);; protected Random rand = new Random(1);;
@Before @Before
public void setup() { public void setup() {

View File

@ -1,5 +1,8 @@
package meerkat.mixer.proofs; package meerkat.mixer.proofs.concrete;
import meerkat.mixer.proofs.SigmaProtocol;
import meerkat.mixer.proofs.SigmaProtocolTest;
import meerkat.mixer.proofs.generic.SigmaProtocolAnd2;
import meerkat.protobuf.Mixing; import meerkat.protobuf.Mixing;
import org.factcenter.qilin.util.Pair; import org.factcenter.qilin.util.Pair;
@ -11,24 +14,24 @@ import java.math.BigInteger;
public class DlogAndStatementSigmaTest extends SigmaProtocolTest<Mixing.Mix2Proof.AndProof.FirstMessage, Mixing.Mix2Proof.AndProof.FinalMessage> { public class DlogAndStatementSigmaTest extends SigmaProtocolTest<Mixing.Mix2Proof.AndProof.FirstMessage, Mixing.Mix2Proof.AndProof.FinalMessage> {
final DlogStatementSchnorrSigmaTest dlogtest; final DlogStatementSchnorrSigmaTest dlogtest;
ECElGamalMixStatementGenerator.DlogStatement s1, s2; Statements.DlogStatement s1, s2;
ECElGamalMixStatementGenerator.DlogStatementWitness w1, w2; Statements.DlogStatementWitness w1, w2;
public DlogAndStatementSigmaTest() { public DlogAndStatementSigmaTest() {
this.dlogtest = new DlogStatementSchnorrSigmaTest(); this.dlogtest = new DlogStatementSchnorrSigmaTest();
} }
@Override @Override
void generateRandomTrueStatement() { protected void generateRandomTrueStatement() {
Pair<ECElGamalMixStatementGenerator.DlogStatement, ECElGamalMixStatementGenerator.DlogStatementWitness> s1w1 = dlogtest.returnRandomTrueStatement(); Pair<Statements.DlogStatement, Statements.DlogStatementWitness> s1w1 = dlogtest.returnRandomTrueStatement();
s1 = s1w1.a; w1 = s1w1.b; s1 = s1w1.a; w1 = s1w1.b;
Pair<ECElGamalMixStatementGenerator.DlogStatement, ECElGamalMixStatementGenerator.DlogStatementWitness> s2w2 = dlogtest.returnRandomTrueStatement(); Pair<Statements.DlogStatement, Statements.DlogStatementWitness> s2w2 = dlogtest.returnRandomTrueStatement();
s2 = s2w2.a; w2 = s2w2.b; s2 = s2w2.a; w2 = s2w2.b;
} }
@Override @Override
void generateRandomFalseStatement() { protected void generateRandomFalseStatement() {
s1 = dlogtest.returnRandomFalseStatement(); s1 = dlogtest.returnRandomFalseStatement();
s2 = dlogtest.returnRandomFalseStatement(); s2 = dlogtest.returnRandomFalseStatement();
} }

View File

@ -1,5 +1,8 @@
package meerkat.mixer.proofs; package meerkat.mixer.proofs.concrete;
import meerkat.mixer.proofs.SigmaProtocol;
import meerkat.mixer.proofs.SigmaProtocolTest;
import meerkat.mixer.proofs.generic.SigmaProtocolOr2;
import meerkat.protobuf.Mixing; import meerkat.protobuf.Mixing;
import org.factcenter.qilin.util.Pair; import org.factcenter.qilin.util.Pair;
@ -11,8 +14,8 @@ import java.math.BigInteger;
public class DlogOrStatementSigmaTest extends SigmaProtocolTest<Mixing.Mix2Proof.FirstMessage, Mixing.Mix2Proof.FinalMessage> { public class DlogOrStatementSigmaTest extends SigmaProtocolTest<Mixing.Mix2Proof.FirstMessage, Mixing.Mix2Proof.FinalMessage> {
final DlogStatementSchnorrSigmaTest dlogtest; final DlogStatementSchnorrSigmaTest dlogtest;
final ECElGamalMixStatementGenerator.AndStatement[] statements = new ECElGamalMixStatementGenerator.AndStatement[2]; final Statements.AndStatement[] statements = new Statements.AndStatement[2];
ECElGamalMixStatementGenerator.AndStatementWitness w; Statements.AndStatementWitness w;
int trueStatementIndex; int trueStatementIndex;
@ -21,26 +24,26 @@ public class DlogOrStatementSigmaTest extends SigmaProtocolTest<Mixing.Mix2Proof
} }
@Override @Override
void generateRandomTrueStatement() { protected void generateRandomTrueStatement() {
trueStatementIndex = rand.nextInt(2); trueStatementIndex = rand.nextInt(2);
Pair<ECElGamalMixStatementGenerator.DlogStatement, ECElGamalMixStatementGenerator.DlogStatementWitness> s1w1 = dlogtest.returnRandomTrueStatement(); Pair<Statements.DlogStatement, Statements.DlogStatementWitness> s1w1 = dlogtest.returnRandomTrueStatement();
Pair<ECElGamalMixStatementGenerator.DlogStatement, ECElGamalMixStatementGenerator.DlogStatementWitness> s2w2 = dlogtest.returnRandomTrueStatement(); Pair<Statements.DlogStatement, Statements.DlogStatementWitness> s2w2 = dlogtest.returnRandomTrueStatement();
ECElGamalMixStatementGenerator.AndStatement trueStatement = dlogtest.statementGenerator.new AndStatement(s1w1.a, s2w2.a); Statements.AndStatement trueStatement = dlogtest.statementGenerator.new AndStatement(s1w1.a, s2w2.a);
w = dlogtest.statementGenerator.new AndStatementWitness(s1w1.b, s2w2.b); w = dlogtest.statementGenerator.new AndStatementWitness(s1w1.b, s2w2.b);
statements[trueStatementIndex] = trueStatement; statements[trueStatementIndex] = trueStatement;
ECElGamalMixStatementGenerator.DlogStatement f1 = dlogtest.returnRandomFalseStatement(); Statements.DlogStatement f1 = dlogtest.returnRandomFalseStatement();
ECElGamalMixStatementGenerator.DlogStatement f2 = dlogtest.returnRandomFalseStatement(); Statements.DlogStatement f2 = dlogtest.returnRandomFalseStatement();
ECElGamalMixStatementGenerator.AndStatement falseStatement = dlogtest.statementGenerator.new AndStatement(f1, f2); Statements.AndStatement falseStatement = dlogtest.statementGenerator.new AndStatement(f1, f2);
statements[1 - trueStatementIndex] = falseStatement; statements[1 - trueStatementIndex] = falseStatement;
} }
@Override @Override
void generateRandomFalseStatement() { protected void generateRandomFalseStatement() {
ECElGamalMixStatementGenerator.DlogStatement f1 = dlogtest.returnRandomFalseStatement(); Statements.DlogStatement f1 = dlogtest.returnRandomFalseStatement();
ECElGamalMixStatementGenerator.DlogStatement f2 = dlogtest.returnRandomFalseStatement(); Statements.DlogStatement f2 = dlogtest.returnRandomFalseStatement();
statements[0] = dlogtest.statementGenerator.new AndStatement(f1, f2); statements[0] = dlogtest.statementGenerator.new AndStatement(f1, f2);

View File

@ -1,7 +1,11 @@
package meerkat.mixer.proofs; package meerkat.mixer.proofs.concrete;
import meerkat.crypto.concrete.ECElGamalEncryption; import meerkat.crypto.concrete.ECElGamalEncryption;
import meerkat.mixer.ECParamTestBase; import meerkat.mixer.ECParamTestBase;
import meerkat.mixer.proofs.SigmaProtocol;
import meerkat.mixer.proofs.SigmaProtocolTest;
import meerkat.mixer.proofs.concrete.SchnorrDlogEquivalence;
import meerkat.mixer.proofs.concrete.Statements;
import meerkat.protobuf.Mixing; import meerkat.protobuf.Mixing;
import org.bouncycastle.math.ec.ECPoint; import org.bouncycastle.math.ec.ECPoint;
import org.factcenter.qilin.primitives.concrete.ECGroup; import org.factcenter.qilin.primitives.concrete.ECGroup;
@ -16,12 +20,12 @@ public class DlogStatementSchnorrSigmaTest extends
SigmaProtocolTest<Mixing.Mix2Proof.DlogProof.FirstMessage, Mixing.Mix2Proof.DlogProof.FinalMessage> { SigmaProtocolTest<Mixing.Mix2Proof.DlogProof.FirstMessage, Mixing.Mix2Proof.DlogProof.FinalMessage> {
ECParamTestBase ecParams; ECParamTestBase ecParams;
ECElGamalMixStatementGenerator statementGenerator; Statements statementGenerator;
ECElGamalEncryption encryptor; ECElGamalEncryption encryptor;
ECGroup group; ECGroup group;
ECElGamalMixStatementGenerator.DlogStatement statement; Statements.DlogStatement statement;
ECElGamalMixStatementGenerator.DlogStatementWitness witness; Statements.DlogStatementWitness witness;
SchnorrDlogEquivalence.Prover prover; SchnorrDlogEquivalence.Prover prover;
SchnorrDlogEquivalence.Verifier verifier; SchnorrDlogEquivalence.Verifier verifier;
SchnorrDlogEquivalence.Simulator simulator; SchnorrDlogEquivalence.Simulator simulator;
@ -30,34 +34,36 @@ public class DlogStatementSchnorrSigmaTest extends
ecParams = new ECParamTestBase(); ecParams = new ECParamTestBase();
encryptor = ecParams.enc; encryptor = ecParams.enc;
group = encryptor.getGroup(); group = encryptor.getGroup();
this.statementGenerator = new ECElGamalMixStatementGenerator(ecParams.enc); this.statementGenerator = new Statements(ecParams.enc);
} }
Pair<ECElGamalMixStatementGenerator.DlogStatement, ECElGamalMixStatementGenerator.DlogStatementWitness> returnRandomTrueStatement() { Pair<Statements.DlogStatement, Statements.DlogStatementWitness> returnRandomTrueStatement() {
BigInteger x = encryptor.generateRandomExponent(rand); BigInteger x = encryptor.generateRandomExponent(rand);
ECPoint a = group.multiply(statementGenerator.g, x); ECPoint a = group.multiply(statementGenerator.g, x);
ECPoint b = group.multiply(statementGenerator.h, x); ECPoint b = group.multiply(statementGenerator.h, x);
ECElGamalMixStatementGenerator.DlogStatement statement = statementGenerator.new DlogStatement(a, b); Statements.DlogStatement statement = statementGenerator.new DlogStatement(a, b);
ECElGamalMixStatementGenerator.DlogStatementWitness witness = statementGenerator.new DlogStatementWitness(x); Statements.DlogStatementWitness witness = statementGenerator.new DlogStatementWitness(x);
return new Pair<>(statement, witness); return new Pair<>(statement, witness);
} }
ECElGamalMixStatementGenerator.DlogStatement returnRandomFalseStatement() { Statements.DlogStatement returnRandomFalseStatement() {
ECPoint a = group.sample(rand); ECPoint a = group.sample(rand);
ECPoint b = group.sample(rand); ECPoint b = group.sample(rand);
return statementGenerator.new DlogStatement(a, b); return statementGenerator.new DlogStatement(a, b);
} }
void generateRandomTrueStatement() { @Override
Pair<ECElGamalMixStatementGenerator.DlogStatement, ECElGamalMixStatementGenerator.DlogStatementWitness> sw = returnRandomTrueStatement(); protected void generateRandomTrueStatement() {
Pair<Statements.DlogStatement, Statements.DlogStatementWitness> sw = returnRandomTrueStatement();
this.statement = sw.a; this.statement = sw.a;
this.witness = sw.b; this.witness = sw.b;
} }
void generateRandomFalseStatement() { @Override
protected void generateRandomFalseStatement() {
witness = null; witness = null;
statement = returnRandomFalseStatement(); statement = returnRandomFalseStatement();
} }

View File

@ -1,41 +1,36 @@
package meerkat.mixer; package meerkat.mixer.proofs.concrete;
import com.google.protobuf.ByteString;
import com.google.protobuf.InvalidProtocolBufferException; import com.google.protobuf.InvalidProtocolBufferException;
import meerkat.crypto.concrete.ECElGamalEncryption; import meerkat.crypto.concrete.ECElGamalEncryption;
import meerkat.crypto.mixnet.Mix2ZeroKnowledgeProver; import meerkat.crypto.mixnet.Mix2ZeroKnowledgeProver;
import meerkat.crypto.mixnet.Mix2ZeroKnowledgeVerifier; import meerkat.crypto.mixnet.Mix2ZeroKnowledgeVerifier;
import meerkat.mixer.proofs.Prover; import meerkat.mixer.ECParamTestBase;
import meerkat.mixer.proofs.Verifier; import meerkat.mixer.Utils;
import meerkat.mixer.proofs.concrete.Mix2nizk;
import meerkat.protobuf.ConcreteCrypto; import meerkat.protobuf.ConcreteCrypto;
import meerkat.protobuf.Crypto; import meerkat.protobuf.Crypto;
import meerkat.protobuf.Mixing; import meerkat.protobuf.Mixing;
import meerkat.protobuf.Voting; import meerkat.protobuf.Voting;
//import meerkat.protobuf.Voting.PlaintextBallot; //import meerkat.protobuf.Voting.PlaintextBallot;
import org.bouncycastle.math.ec.ECPoint; import org.bouncycastle.math.ec.ECPoint;
import org.factcenter.qilin.primitives.RandomOracle;
import org.factcenter.qilin.primitives.concrete.DigestOracle;
import org.factcenter.qilin.primitives.concrete.ECElGamal;
import org.factcenter.qilin.primitives.concrete.ECGroup;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
import java.math.BigInteger;
import java.util.Random;
/** /**
* Created by Tzlil on 12/31/2015. * Created by Tzlil on 12/31/2015.
*/ */
public class Mix2ProofTest extends ECParamTestBase { public class Mix2ProofTest extends ECParamTestBase {
Mix2nizk nizk;
Mix2ZeroKnowledgeVerifier verifier ; Mix2ZeroKnowledgeVerifier verifier ;
Mix2ZeroKnowledgeProver prover ; Mix2ZeroKnowledgeProver prover ;
@Before @Before
public void setup() throws Exception { public void setup() throws Exception {
verifier = new Verifier(enc,randomOracle); nizk = new Mix2nizk(rand, enc, randomOracle);
prover = new Prover(new Random(),enc,randomOracle); verifier = nizk;
prover = nizk;
} }
private ECPoint convert2ECPoint(ConcreteCrypto.GroupElement bs){ private ECPoint convert2ECPoint(ConcreteCrypto.GroupElement bs){

View File

@ -4,7 +4,7 @@ import com.google.protobuf.ByteString;
import com.google.protobuf.InvalidProtocolBufferException; import com.google.protobuf.InvalidProtocolBufferException;
import meerkat.crypto.concrete.ECElGamalEncryption; import meerkat.crypto.concrete.ECElGamalEncryption;
import meerkat.crypto.mixnet.Mix2ZeroKnowledgeProver; import meerkat.crypto.mixnet.Mix2ZeroKnowledgeProver;
import meerkat.mixer.proofs.Prover; import meerkat.mixer.proofs.concrete.Mix2nizk;
import meerkat.protobuf.ConcreteCrypto; import meerkat.protobuf.ConcreteCrypto;
import meerkat.protobuf.Crypto; import meerkat.protobuf.Crypto;
import meerkat.protobuf.Voting; import meerkat.protobuf.Voting;
@ -43,7 +43,7 @@ public class ZeroKnowledgeProof {
enc = new ECElGamalEncryption(); enc = new ECElGamalEncryption();
enc.init(serializedPk); enc.init(serializedPk);
RandomOracle randomOracle = new DigestOracle(); RandomOracle randomOracle = new DigestOracle();
prover = new Prover(new Random(),enc,randomOracle); prover = new Mix2nizk(new Random(),enc,randomOracle);
int LogVotes = 12; int LogVotes = 12;
int layers = 2*LogVotes - 1; int layers = 2*LogVotes - 1;
n = layers * (1<<LogVotes) / 2; n = layers * (1<<LogVotes) / 2;