View Javadoc
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 }