1 package civitas.crypto.petdecommitment;
2
3 import org.springframework.beans.factory.annotation.Autowired;
4 import org.springframework.stereotype.Controller;
5
6 import civitas.crypto.ciphertext.ElGamalCiphertext;
7 import civitas.crypto.messagedigest.CryptoHash;
8 import civitas.crypto.parameters.ElGamalParameters;
9 import civitas.crypto.petcommitment.PETCommitment;
10 import civitas.crypto.proofdisclog.ElGamalProofDiscLogEquality;
11 import civitas.crypto.proofdisclog.VerifyElGamalProofDiscLogEquality;
12 import civitas.util.CivitasBigInteger;
13
14 @Controller
15 public class VerifyPETDecommitment {
16
17 @Autowired
18 CryptoHash cryptoHash;
19
20 @Autowired
21 VerifyElGamalProofDiscLogEquality verifyElGamalProofDiscLogEquality;
22
23 public boolean apply(
24 final PETDecommitment self,
25 final PETCommitment c,
26 final ElGamalParameters params,
27 final ElGamalCiphertext ciphertext1,
28 final ElGamalCiphertext ciphertext2) {
29 ElGamalProofDiscLogEquality prf = self.proof();
30 ElGamalParameters ps = params;
31 PETCommitment com = c;
32 ElGamalCiphertext m1 = ciphertext1;
33 ElGamalCiphertext m2 = ciphertext2;
34
35 CivitasBigInteger d = m1.a.modDivide(m2.a, ps.p);
36 CivitasBigInteger e = m1.b.modDivide(m2.b, ps.p);
37
38 if (!d.equals(prf.g1()) || !e.equals(prf.g2())) {
39 return false;
40 }
41 return com.hash().equals(cryptoHash.apply(self.di(), self.ei(), null, null))
42 && verifyElGamalProofDiscLogEquality.apply(prf, params);
43 }
44 }