View Javadoc
1   package civitas.crypto.proof1ofl;
2   
3   import java.util.ArrayList;
4   import java.util.List;
5   
6   import org.springframework.beans.factory.annotation.Autowired;
7   import org.springframework.stereotype.Controller;
8   
9   import civitas.crypto.Constants;
10  import civitas.crypto.algorithms.ConvertHashToBigInt;
11  import civitas.crypto.ciphertext.ElGamalCiphertext;
12  import civitas.crypto.ciphertext.ElGamalCiphertextish;
13  import civitas.crypto.ciphertextlist.CiphertextList;
14  import civitas.crypto.messagedigest.CryptoHash;
15  import civitas.crypto.parameters.ElGamalParameters;
16  import civitas.crypto.publickey.ElGamalPublicKey;
17  import civitas.util.CivitasBigInteger;
18  
19  @Controller
20  public class VerifyElGamalProof1OfL {
21  	@Autowired
22  	CryptoHash cryptoHash;
23  
24  	@Autowired
25  	ConvertHashToBigInt convertHashToBigInt;
26  
27  	public boolean apply(
28  			final ElGamalProof1OfL self,
29  			final ElGamalPublicKey pubKey,
30  			final CiphertextList ciphertexts,
31  			final int l,
32  			final ElGamalCiphertextish msg) {
33  		if (self.L != l) {
34  			return false;
35  		}
36  		ElGamalCiphertextish m = msg;
37  		CivitasBigInteger u = m.getA();
38  		CivitasBigInteger v = m.getB();
39  		ElGamalPublicKey key = pubKey;
40  		ElGamalParameters ps = key.params;
41  		ElGamalCiphertextish[] ms = new ElGamalCiphertext[l];
42  
43  		for (int i = 0; i < l; i++) {
44  			ms[i] = ciphertexts.get(i);
45  		}
46  
47  		CivitasBigInteger[] as = new CivitasBigInteger[l];
48  		CivitasBigInteger[] bs = new CivitasBigInteger[l];
49  		CivitasBigInteger sum = Constants.ZERO;
50  		for (int i = 0; i < l; i++) {
51  			as[i] = ms[i].getA()
52  					.modDivide(u, ps.p)
53  					.modPow(self.dvs[i], ps.p)
54  					.modMultiply(ps.g.modPow(self.rvs[i], ps.p), ps.p);
55  			bs[i] = ms[i].getB()
56  					.modDivide(v, ps.p)
57  					.modPow(self.dvs[i], ps.p)
58  					.modMultiply(key.y.modPow(self.rvs[i], ps.p), ps.p);
59  			sum = sum.modAdd(self.dvs[i], ps.q);
60  		}
61  
62  		// construct the hash of the environment
63  		List<CivitasBigInteger> env = new ArrayList<>();
64  		env.add(u);
65  		env.add(v);
66  		for (int i = 0; i < l; i++) {
67  			env.add(ms[i].getA());
68  			env.add(ms[i].getB());
69  			env.add(as[i]);
70  			env.add(bs[i]);
71  		}
72  
73  		byte[] hashBytes = cryptoHash.apply(env);
74  		CivitasBigInteger c = convertHashToBigInt.apply(hashBytes).mod(ps.q);
75  		return sum.equals(c);
76  	}
77  }