meerkat-java/mixer/src/test/java/profiling/ZeroKnowledgeProof.java

90 lines
3.1 KiB
Java
Raw Normal View History

2016-01-20 05:14:15 -05:00
package profiling;
import com.google.protobuf.ByteString;
import com.google.protobuf.InvalidProtocolBufferException;
import meerkat.crypto.concrete.ECElGamalEncryption;
import meerkat.crypto.mixnet.Mix2ZeroKnowledgeProver;
import meerkat.crypto.mixnet.Mix2ZeroKnowledgeVerifier;
import meerkat.protobuf.ConcreteCrypto;
import meerkat.protobuf.Crypto;
import meerkat.protobuf.Voting;
import mixer.Utiles;
import org.bouncycastle.math.ec.ECPoint;
import org.junit.Before;
import org.junit.Test;
import prover.Prover;
import qilin.primitives.RandomOracle;
import qilin.primitives.concrete.DigestOracle;
import qilin.primitives.concrete.ECElGamal;
import qilin.primitives.concrete.ECGroup;
import java.math.BigInteger;
import java.util.Random;
/**
* Created by Tzlil on 1/20/2016.
*/
2016-01-25 09:48:36 -05:00
public class ZeroKnowledgeProof {
2016-01-20 05:14:15 -05:00
Random rand;
ECElGamal.SK key;
ECGroup group;
ECElGamalEncryption enc;
ConcreteCrypto.ElGamalPublicKey serializedPk;
Mix2ZeroKnowledgeProver prover ;
int n;
Crypto.EncryptionRandomness[] randomnesses;
Crypto.RerandomizableEncryptedMessage[] encryptedMessage;
Crypto.RerandomizableEncryptedMessage[] reencryptedMessage;
2016-03-20 13:18:23 -04:00
2016-01-20 05:14:15 -05:00
public void setup() throws Exception {
rand = new Random();
group = new ECGroup("secp256k1");
BigInteger sk = ECElGamal.generateSecretKey(group, rand);
key = new ECElGamal.SK(group, sk);
serializedPk = Utiles.serializePk(group, key);
enc = new ECElGamalEncryption();
enc.init(serializedPk);
RandomOracle randomOracle = new DigestOracle();
prover = new Prover(new Random(),enc,randomOracle);
2016-01-25 09:48:36 -05:00
int LogVotes = 12;
int layers = 2*LogVotes - 1;
n = layers * (1<<LogVotes) / 2;
2016-01-20 05:14:15 -05:00
randomnesses = new Crypto.EncryptionRandomness[n*2];
encryptedMessage = new Crypto.RerandomizableEncryptedMessage[n*2];
reencryptedMessage = new Crypto.RerandomizableEncryptedMessage[n*2];
Voting.PlaintextBallot msg;
2016-01-25 09:48:36 -05:00
2016-01-20 05:14:15 -05:00
for (int i = 0; i < n*2 ; i ++){
msg = Utiles.genRandomBallot(2,3,16);
randomnesses[i] = enc.generateRandomness(rand);
encryptedMessage[i] = enc.encrypt(msg, enc.generateRandomness(rand));
reencryptedMessage[i] = enc.rerandomize(encryptedMessage[i], randomnesses[i]);
}
}
private ECPoint convert2ECPoint(ByteString bs){
return group.decode(bs.toByteArray());
}
public void zeroKnowledgeProofTest() throws InvalidProtocolBufferException {
System.out.println("Prove");
System.out.println("n is : " + n);
System.out.println("start n proves");
long startTime = System.currentTimeMillis();
for (int i = 0; i < n*2 ; i +=2){
prover.prove(encryptedMessage[i],encryptedMessage[i+1],reencryptedMessage[i],reencryptedMessage[i+1],
false,0,0,0,randomnesses[i],randomnesses[i+1]);
}
long finishTime = System.currentTimeMillis();
System.out.println(" that took: "+(finishTime-startTime)+ " ms");
System.out.println(" avg of"+((double)(finishTime-startTime))/n + " ms");
}
}