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.parameters.ElGamalParameters;
8 import civitas.crypto.proofdisclog.ConstructElGamalDiscLogEqualityProof;
9 import civitas.crypto.proofdisclog.ElGamalProofDiscLogEquality;
10 import civitas.util.CivitasBigInteger;
11
12 @Controller
13 public class ConstructPETDecommitment {
14
15 @Autowired
16 ConstructElGamalDiscLogEqualityProof constructElGamalDiscLogEqualityProof;
17
18 public PETDecommitment apply(
19 final ElGamalParameters params,
20 final CivitasBigInteger exponent,
21 final ElGamalCiphertext ciphertext1,
22 final ElGamalCiphertext ciphertext2) {
23
24 CivitasBigInteger zi = exponent;
25 CivitasBigInteger d = ciphertext1.a.modDivide(ciphertext2.a, params.p);
26 CivitasBigInteger e = ciphertext1.b.modDivide(ciphertext2.b, params.p);
27
28 CivitasBigInteger di = d.modPow(zi, params.p);
29 CivitasBigInteger ei = e.modPow(zi, params.p);
30
31 ElGamalProofDiscLogEquality proof = constructElGamalDiscLogEqualityProof.apply(params, d, e, zi);
32 return new PETDecommitment(di, ei, proof);
33 }
34 }