1 package civitas.crypto.proof1ofl.tests;
2
3 import static org.mockito.Mockito.mock;
4
5 import java.util.ArrayList;
6 import java.util.List;
7 import java.util.Map;
8 import java.util.function.Supplier;
9 import java.util.stream.IntStream;
10
11 import civitas.common.CommonUtil;
12 import civitas.common.VoteChoice;
13 import civitas.common.tests.ConstructTestData;
14 import civitas.crypto.ciphertext.ElGamalCiphertext;
15 import civitas.crypto.ciphertextlist.tests.ElGamalCiphertextListTestData;
16 import civitas.crypto.proof1ofl.ElGamalProof1OfL;
17 import civitas.util.CivitasBigInteger;
18
19 public interface ElGamalProof1OfLTestData extends ElGamalCiphertextListTestData {
20
21 CivitasBigInteger REENCRYPTED_WELL_KNOWN_CHOICE_A =
22 CIPHERTEXT_LIST.get(MY_CHOICE.ordinal()).getA().modMultiply(BIGINT_G.modPow(FACTOR_E, BIGINT_P), BIGINT_P);
23 CivitasBigInteger REENCRYPTED_WELL_KNOWN_CHOICE_B =
24 CIPHERTEXT_LIST.get(MY_CHOICE.ordinal()).getB().modMultiply(PUBKEY_E.modPow(FACTOR_E, BIGINT_P), BIGINT_P);
25
26 ElGamalCiphertext REENCRYPTED_WELL_KNOWN_CHOICE =
27 new ElGamalCiphertext(REENCRYPTED_WELL_KNOWN_CHOICE_A, REENCRYPTED_WELL_KNOWN_CHOICE_B);
28
29 CivitasBigInteger w = FACTOR_E.modNegate(BIGINT_Q)
30 .modMultiply(DS.get(MY_CHOICE.ordinal()), BIGINT_Q)
31 .modAdd(RS.get(MY_CHOICE.ordinal()), BIGINT_Q);
32
33 List<CivitasBigInteger> EL_GAMAL_PROOF_1_OF_L_AS = IntStream.range(0, NO_OF_WELL_KNOWN_CIPHERTEXTS)
34 .mapToObj(i -> CIPHERTEXT_LIST
35 .get(i)
36 .getA()
37 .modDivide(REENCRYPTED_WELL_KNOWN_CHOICE_A, BIGINT_P)
38 .modPow(DS.get(i), BIGINT_P)
39 .modMultiply(BIGINT_G.modPow(RS.get(i), BIGINT_P), BIGINT_P)
40 .mod(BIGINT_P))
41 .toList();
42 List<CivitasBigInteger> EL_GAMAL_PROOF_1_OF_L_BS = IntStream.range(0, NO_OF_WELL_KNOWN_CIPHERTEXTS)
43 .mapToObj(i -> CIPHERTEXT_LIST
44 .get(i)
45 .getB()
46 .modDivide(REENCRYPTED_WELL_KNOWN_CHOICE_B, BIGINT_P)
47 .modPow(DS.get(i), BIGINT_P)
48 .modMultiply(PUBKEY_E.modPow(RS.get(i), BIGINT_P), BIGINT_P)
49 .mod(BIGINT_P))
50 .toList();
51
52 List<CivitasBigInteger> EL_GAMAL_PROOF_1_OF_L_ENV = ((Supplier<List<CivitasBigInteger>>) () -> {
53 ArrayList<CivitasBigInteger> d = new ArrayList<>(2 + 4 * NO_OF_WELL_KNOWN_CIPHERTEXTS);
54 d.add(REENCRYPTED_WELL_KNOWN_CHOICE_A);
55 d.add(REENCRYPTED_WELL_KNOWN_CHOICE_B);
56 for (int i = 0; i < NO_OF_WELL_KNOWN_CIPHERTEXTS; i++) {
57 d.add(CIPHERTEXT_LIST.get(i).getA());
58 d.add(CIPHERTEXT_LIST.get(i).getB());
59 d.add(EL_GAMAL_PROOF_1_OF_L_AS.get(i));
60 d.add(EL_GAMAL_PROOF_1_OF_L_BS.get(i));
61 }
62 return d;
63 })
64 .get();
65
66 String EL_GAMAL_PROOF_1_OF_L_HASH_BASE64 = "TqT++ODFynAUZo5awzSUsEXBXCS6HlC2CkKk6WEG1e4=";
67 CivitasBigInteger EL_GAMAL_PROOF_1_OF_L_HASH = CommonUtil.asBigint(EL_GAMAL_PROOF_1_OF_L_HASH_BASE64);
68
69 CivitasBigInteger EL_GAMAL_PROOF_1_OF_L_DV = EL_GAMAL_PROOF_1_OF_L_HASH.modSubtract(SUM, BIGINT_Q);
70 CivitasBigInteger EL_GAMAL_PROOF_1_OF_L_RV =
71 w.modAdd(FACTOR_E.modMultiply(EL_GAMAL_PROOF_1_OF_L_DV, BIGINT_Q), BIGINT_Q);
72
73 List<CivitasBigInteger> DVS = ((Supplier<List<CivitasBigInteger>>) () -> {
74 List<CivitasBigInteger> d = new ArrayList<>(DS);
75 d.set(MY_CHOICE.ordinal(), EL_GAMAL_PROOF_1_OF_L_DV);
76 return d;
77 })
78 .get();
79
80 List<CivitasBigInteger> RVS = ((Supplier<List<CivitasBigInteger>>) () -> {
81 List<CivitasBigInteger> r = new ArrayList<>(RS);
82 r.set(MY_CHOICE.ordinal(), EL_GAMAL_PROOF_1_OF_L_RV);
83 return r;
84 })
85 .get();
86
87 List<CivitasBigInteger> DVS_BAD = ((Supplier<List<CivitasBigInteger>>) () -> {
88 List<CivitasBigInteger> d = new ArrayList<>(DVS);
89 d.set(MY_CHOICE.ordinal(), BIGINT_D);
90 return d;
91 })
92 .get();
93
94 ElGamalProof1OfL EL_GAMAL_PROOF_1_OF_L = new ElGamalProof1OfL(
95 NO_OF_WELL_KNOWN_CIPHERTEXTS, DVS.toArray(new CivitasBigInteger[0]), RVS.toArray(new CivitasBigInteger[0]));
96
97 ElGamalProof1OfL EL_GAMAL_PROOF_1_OF_L_BAD = new ElGamalProof1OfL(
98 NO_OF_WELL_KNOWN_CIPHERTEXTS,
99 DVS_BAD.toArray(new CivitasBigInteger[0]),
100 RVS.toArray(new CivitasBigInteger[0]));
101
102 Map<VoteChoice, ElGamalProof1OfL> EL_GAMAL_PROOF_1_OF_L_MAP = ConstructTestData.constructTestData(
103 CHOICES,
104 i -> new ElGamalProof1OfL(
105 NO_OF_WELL_KNOWN_CIPHERTEXTS,
106 DVS.stream()
107 .map(x -> {
108 if (DVS.indexOf(x) == i.ordinal()) {
109 return mock(CivitasBigInteger.class, "dvs" + i);
110 } else {
111 return x;
112 }
113 })
114 .toList()
115 .toArray(new CivitasBigInteger[0]),
116 RVS.stream()
117 .map(x -> {
118 if (RVS.indexOf(x) == i.ordinal()) {
119 return mock(CivitasBigInteger.class, "rvs" + i);
120 } else {
121 return x;
122 }
123 })
124 .toList()
125 .toArray(new CivitasBigInteger[0])));
126 }