package SecureDistributedKeyGeneration; import Communication.Network; import FeldmanVerifiableSecretSharing.VerifiableSecretSharing; import JointFeldmanProtocol.DistributedKeyGeneration; import com.google.protobuf.ByteString; import meerkat.protobuf.DKGMessages; import org.factcenter.qilin.primitives.concrete.Zpstar; import java.math.BigInteger; import java.util.Random; /** * Created by Tzlil on 2/17/2016. */ public class SecureDistributedKeyGeneration extends DistributedKeyGeneration { VerifiableSecretSharing verifiableSecretSharing; public SecureDistributedKeyGeneration(int t, int n, BigInteger zi, Random random, BigInteger p, BigInteger q, BigInteger g ,BigInteger h, Network network) { super(t, n, zi, random, p, q, g, network.connect(new SecureDistributedKeyGenerationMessageHandler(t,n,g,new Zpstar(p)))); this.verifiableSecretSharing = new VerifiableSecretSharing(t,n,new BigInteger(q.bitLength(), random).mod(q),random,p,q,h,user); } @Override protected void computeAndSendSecrets() { DKGMessages.SecretMessage[] secretMessages1 = prepareSecretMessages(); DKGMessages.SecretMessage[] secretMessages2 = verifiableSecretSharing.prepareSecretMessages(); DKGMessages.DoubleSecretMessage doubleSecretMessage; for (int j = 1; j <= n ; j++ ){ doubleSecretMessage = DKGMessages.DoubleSecretMessage.newBuilder() .setS1(secretMessages1[j - 1]) .setS1(secretMessages2[j - 1]) .build(); user.send(j, DKGMessages.Mail.Type.SECRET,doubleSecretMessage); } } @Override public DKGMessages.CommitmentMessage[] prepareCommitmentMessages() { DKGMessages.CommitmentMessage[] commitmentMessages = new DKGMessages.CommitmentMessage[t + 1]; BigInteger[] commitments2 = verifiableSecretSharing.getCommitments(); for (int k = 0; k <= t ; k ++) { commitmentMessages[k] = DKGMessages.CommitmentMessage.newBuilder() .setK(k) .setCommitment(ByteString.copyFrom(zpstar.add(commitments[k],commitments2[k]).toByteArray())) .build(); } return commitmentMessages; } @Override protected void answerComplaint(int j) { DKGMessages.SecretMessage secretMessage1 = DKGMessages.SecretMessage.newBuilder() .setSecret(getShare(j).asMessage()) .build(); DKGMessages.SecretMessage secretMessage2 = DKGMessages.SecretMessage.newBuilder() .setSecret(verifiableSecretSharing.getShare(j).asMessage()) .build(); user.broadcast(DKGMessages.Mail.Type.SECRET, DKGMessages.DoubleSecretMessage.newBuilder() .setS1(secretMessage1) .setS2(secretMessage2) .build()); } }