1 package civitas.crypto.signature;
2
3 import org.springframework.beans.factory.annotation.Autowired;
4 import org.springframework.stereotype.Controller;
5
6 import civitas.crypto.messagedigest.CryptoHash;
7 import civitas.crypto.parameters.ElGamalParameters;
8 import civitas.crypto.signedciphertext.ElGamalSignedCiphertext;
9 import civitas.util.CivitasBigInteger;
10
11 @Controller
12 public class VerifyElGamalSignature {
13 @Autowired
14 CryptoHash cryptoHash;
15
16 public boolean apply(
17 final ElGamalParameters params, final ElGamalSignedCiphertext ciphertext, final byte[] additionalEnv) {
18 CivitasBigInteger x = params.g
19 .modPow(ciphertext.d.mod(params.q), params.p)
20 .modMultiply(ciphertext.a.modPow(ciphertext.c.modNegate(params.q), params.p), params.p);
21 CivitasBigInteger v =
22 cryptoHash.apply(x, ciphertext.a, ciphertext.b, additionalEnv).mod(params.q);
23 return ciphertext.c.equals(v);
24 }
25
26 public boolean apply(final ElGamalParameters params, final ElGamalSignedCiphertext ciphertext) {
27 return apply(params, ciphertext, null);
28 }
29 }