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
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 }