package FeldmanVerifiableSecretSharing; import ShamirSecretSharing.SecretSharing; import org.bouncycastle.util.Arrays; import org.factcenter.qilin.primitives.CyclicGroup; import org.factcenter.qilin.primitives.concrete.Zpstar; import java.math.BigInteger; import java.util.Random; /** * Created by Tzlil on 1/27/2016. */ public class VerifiableSecretSharing extends SecretSharing { private final CyclicGroup group; private final BigInteger g; // public generator of group private final BigInteger[] commitments; /** * @param group a cyclic group of prime order p. * it must be chosen such that computing discrete logarithms is hard in this group. */ public VerifiableSecretSharing(CyclicGroup group, int t, int n, BigInteger s, Random random) { super(group.orderUpperBound(), t, n, s, random); this.group = group; this.g = group.getGenerator(); this.commitments = generateCommitments(); } /** * @return commitments[i] = g ^ polynomial.coefficients[i] */ private BigInteger[] generateCommitments() { BigInteger[] coefficients = polynomial.getCoefficients(); BigInteger[] commitments = new BigInteger[coefficients.length]; for (int i = 0 ; i < commitments.length;i++){ commitments[i] = group.multiply(g,coefficients[i]); } return commitments; } /** * @param i share holder id * @param commitments * @param group * * @return product of commitments[j] ^ (i ^ j) == g ^ polynomial(i) */ public static BigInteger verify(int i,BigInteger[] commitments,CyclicGroup group) { BigInteger v = group.zero(); int power = 1; for (int j = 0 ; j < commitments.length ; j ++){ v = group.add(v,commitments[i].pow(power)); power *=i; } return v; } /** * getter * @return generator of group */ public BigInteger getGenerator() { return g; } /** * getter * @return copy of commitments */ public BigInteger[] getCommitments() { return Arrays.clone(commitments); } }