View Javadoc
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  		 * a' = (g^u) / ((x'/x)^(c+w)) b' = (h^u) / ((y'/y)^(c+w)) s' =
37  		 * (g^w)*((h_v)^r) c' = hash(E||a'||b'||s')
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  }