1 package civitas.crypto.proofdvr;
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.algorithms.ConvertHashToBigInt;
10 import civitas.crypto.messagedigest.CryptoHash;
11 import civitas.crypto.parameters.ElGamalParameters;
12 import civitas.crypto.publickey.ElGamalPublicKey;
13 import civitas.util.CivitasBigInteger;
14
15 @Controller
16 public class VerifyElGamalProofDVR {
17
18 @Autowired
19 CryptoHash cryptoHash;
20
21 @Autowired
22 ConvertHashToBigInt convertHashToBigInt;
23
24 public boolean apply(final ElGamalProofDVR that, final ElGamalPublicKey key, final ElGamalPublicKey verifierKey) {
25
26 ElGamalParameters ps = key.params;
27
28 CivitasBigInteger hv = verifierKey.y;
29 CivitasBigInteger h = key.y;
30 CivitasBigInteger x = that.e().getA();
31 CivitasBigInteger y = that.e().getB();
32 CivitasBigInteger xp = that.eprime().getA();
33 CivitasBigInteger yp = that.eprime().getB();
34
35
36
37
38
39
40 CivitasBigInteger ap = ps.g.modPow(that.u(), ps.p)
41 .modDivide(xp.modDivide(x, ps.p).modPow(that.c().modAdd(that.w(), ps.q), ps.p), ps.p);
42 CivitasBigInteger bp = h.modPow(that.u(), ps.p)
43 .modDivide(yp.modDivide(y, ps.p).modPow(that.c().modAdd(that.w(), ps.q), ps.p), ps.p);
44 CivitasBigInteger sp = ps.g.modPow(that.w(), ps.p).modMultiply(hv.modPow(that.r(), ps.p), ps.p);
45
46 List<CivitasBigInteger> l = new ArrayList<>();
47 l.add(that.e().getA());
48 l.add(that.e().getB());
49 l.add(that.eprime().getA());
50 l.add(that.eprime().getB());
51 l.add(ap);
52 l.add(bp);
53 l.add(sp);
54 CivitasBigInteger cp = convertHashToBigInt.apply(cryptoHash.apply(l)).mod(ps.q);
55
56 return cp.equals(that.c());
57 }
58 }