84 lines
3.2 KiB
Java
84 lines
3.2 KiB
Java
|
package verifier;
|
||
|
|
||
|
import com.google.protobuf.InvalidProtocolBufferException;
|
||
|
import meerkat.crypto.mixnet.Mix2ZeroKnowledgeVerifier;
|
||
|
import meerkat.protobuf.Crypto;
|
||
|
import meerkat.protobuf.Mixing;
|
||
|
import qilin.util.Pair;
|
||
|
|
||
|
import java.util.Arrays;
|
||
|
|
||
|
/**
|
||
|
* Created by Tzlil on 12/30/2015.
|
||
|
*/
|
||
|
public final class VerifyTable {
|
||
|
|
||
|
public static boolean verifyTable(Mix2ZeroKnowledgeVerifier verifier,int n,Pair<Mixing.ZeroKnowledgeProof[][]
|
||
|
,Crypto.RerandomizableEncryptedMessage[][]> mixerOutput) throws InvalidProtocolBufferException {
|
||
|
int index1,index2,layer;
|
||
|
|
||
|
//assert n = 2^k
|
||
|
if ( (n &(n-1)) != 0)
|
||
|
throw new IllegalArgumentException("n");
|
||
|
|
||
|
int layers = 2*(int)(Math.log(n) / Math.log(2)) - 1;
|
||
|
//initialize locationChecksum table
|
||
|
// use for check BeneshNet validity
|
||
|
boolean[][] locationChecksum = new boolean[layers][n];
|
||
|
for (boolean[] locationChecksumLayer: locationChecksum) {
|
||
|
Arrays.fill(locationChecksumLayer,false);
|
||
|
}
|
||
|
|
||
|
Mixing.ZeroKnowledgeProof[][] zeroKnowledgeProofs = mixerOutput.a;
|
||
|
Crypto.RerandomizableEncryptedMessage[][] rerandomizableEncryptedMessages = mixerOutput.b;
|
||
|
|
||
|
for (Mixing.ZeroKnowledgeProof[] zkpLayer: zeroKnowledgeProofs) {
|
||
|
for (Mixing.ZeroKnowledgeProof zkp: zkpLayer) {
|
||
|
Mixing.ZeroKnowledgeProof.Location location = zkp.getLocation();
|
||
|
index1 = location.getI();
|
||
|
index2 = location.getJ();
|
||
|
layer = location.getLayer();
|
||
|
|
||
|
// check location validity
|
||
|
if (layer > layers >> 1) {
|
||
|
if (index2 - index1 != n >> (layers - layer))
|
||
|
return false;
|
||
|
}
|
||
|
else{
|
||
|
if (index2 - index1 != n >> (layer + 1))
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
// mark location in table
|
||
|
locationChecksum[layer][index1] = true;
|
||
|
locationChecksum[layer][index2] = true;
|
||
|
|
||
|
// verify proof
|
||
|
if(!verifier.verify(rerandomizableEncryptedMessages[layer][index1],
|
||
|
rerandomizableEncryptedMessages[layer][index2],
|
||
|
rerandomizableEncryptedMessages[layer + 1][index1],
|
||
|
rerandomizableEncryptedMessages[layer + 1][index2],
|
||
|
zkp)) {
|
||
|
|
||
|
verifier.verify(rerandomizableEncryptedMessages[layer][index1],
|
||
|
rerandomizableEncryptedMessages[layer][index2],
|
||
|
rerandomizableEncryptedMessages[layer + 1][index1],
|
||
|
rerandomizableEncryptedMessages[layer + 1][index2],
|
||
|
zkp);
|
||
|
System.out.print("\n\n\nlayer " + layer + " i , j " + index1 + " , " + index2 + "\n\n\n");
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// verify all necessary locations for BeneshNet were proved
|
||
|
for (boolean[] checksumLayer: locationChecksum) {
|
||
|
for (boolean locationBoolean: checksumLayer) {
|
||
|
if (!locationBoolean)
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
}
|