1 package civitas.crypto.parameters;
2
3 import java.util.AbstractMap;
4 import java.util.Base64;
5 import java.util.List;
6 import java.util.Map;
7 import java.util.stream.Collectors;
8
9 import civitas.common.CommonUtil;
10 import civitas.common.VoteChoice;
11 import civitas.util.BasicValuesTestData;
12 import civitas.util.CivitasBigInteger;
13 import civitas.util.CivitasBigIntegerFactory;
14
15 public interface ElGamalParametersTestData extends BasicValuesTestData {
16
17 String BIGINT_P_BASE64 =
18 "AIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQ0gWk4zQiy9p87hS+sgNkxYr5okLM6HhXFTu2eUFgf5BQjju2YsvFhOXce4yJ00rsGSGeZAg5bT1Z45SdexGMevXEdCZrADRdikYU0ZLFTN7UWopWgLXd3DBfu3CY2fzwYzq0YWS0bzJ3cQA4fSAyFdU+Tekcd3vwQlkthh7WJW0VCYF1hGFdiGt9/aDQ7cDrW+fqbg4xrUN+wKoFbEHNHomUkGMaXsGyM9vyLCjtp9Jf/UXQSU9X+jAJS+Y7VXyEa9/ifHxsjAExE5RYpNWzqgjJRoiADVL1XeoqvdL/ltcEhAeq3TnhHNIi7cEGQZSGCvSVMiDPn2JBUeY8AswihwZhI7IiqroysQy6UcsZ45oACaVH0ZYSMSIvuGimPhqv0OVbR95lXipxaoHlygq8pLWJWlgVj9KIQQG1wTnD80liudqIdQ+/yuo10YxtGacmC7YxB/atrTgbJ8V/wRDRQw==";
19 CivitasBigInteger BIGINT_P =
20 CivitasBigIntegerFactory.obtain(Base64.getDecoder().decode(BIGINT_P_BASE64));
21 String BIGINT_Q_BASE64 = "ALEbdrNCujCQI0Y4f38yusJkfR1nVqT95/P/H2z28zIH";
22 CivitasBigInteger BIGINT_Q =
23 CivitasBigIntegerFactory.obtain(Base64.getDecoder().decode(BIGINT_Q_BASE64));
24 String BIGINT_G_BASE64 =
25 "az5EMeordK3a0VbjoUsKeo/++OHFs5WaRLw6hW8Ezu7D1Egid0U3Obtzpn0GG8UHQjJnHINqwK6bX6RXBlVfsDmiKS2lgvWrL53vSPXtZfFIC/307vWLV2RymA9TQaGZ5d4q7O7l2KHNUx+ecK6QVqKqj46IXjwaYzKQXNg2NfwQGfj7dBTaoGHE401pdoHfyLfluAF3k4ZT6imEoIbe4Ar7ybYdI5eJYn96/hoyLouux8jI1LE+Oe7+eI1M5WK30TPbGKVaon4KPnfLYp8+HTloYb/jlNFLckqdZchKa765pBRjvNu+7MmYpHmqBlLuCLd4sBbD//Sy/aHPnxyccZM0MMwRPSSM0NKO8UuXkCEmRSI6gvdwyIk6FwsB8bF4ksvBAMSfN8gJd7rv1t9B46OByCs8YNuL1eJH1wJThwpUf1iAXPjFCkvrR4fm+lOeIYCGhBkEO1pB2sRzTulRVEadM6bFwo2N5eZb3ymPfERXogTVmljtdzxlAao9vBgk";
26 CivitasBigInteger BIGINT_G =
27 CivitasBigIntegerFactory.obtain(Base64.getDecoder().decode(BIGINT_G_BASE64));
28 CivitasBigInteger G_EXP_A = BIGINT_G.modPow(BIGINT_A, BIGINT_P);
29 String G_EXP_A_BASE64 = CommonUtil.fromBigInt(G_EXP_A);
30 CivitasBigInteger G_EXP_B = BIGINT_G.modPow(BIGINT_B, BIGINT_P);
31 String G_EXP_B_BASE64 = CommonUtil.fromBigInt(G_EXP_B);
32 CivitasBigInteger G_EXP_C = BIGINT_G.modPow(BIGINT_C, BIGINT_P);
33 String G_EXP_C_BASE64 = CommonUtil.fromBigInt(G_EXP_C);
34 CivitasBigInteger G_EXP_D = BIGINT_G.modPow(BIGINT_D, BIGINT_P);
35 String G_EXP_D_BASE64 = CommonUtil.fromBigInt(G_EXP_D);
36
37 String P_OTHER_BASE64 =
38 "AIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf8tZIaH63gtefkwkLYnCdtF2sMI5MRddL3IgM7SZK+auYCtQitiTHGI0TF8xu5lDM7bV4GvZA6tTBEaKS9EMxD34H+5xFtBtRqWuCI6XMPEMJg71eqhVT3M5yEqwA1wJXXvD/oKs6nlx+MxcEzb9kQweaVE6aOa/9hPMFdU0wL2ZatNOJfN2+CmsweXdC/gnZSX4ySmWAGP4JTHq4abv1SN4JwkUzgsrWownWy2Pzm5fiCeQBc0yn70GTSdIxuDnfX9em+ORiSXhlh7+ddNcgvC35wkHmfjWELTBhUDUh1L8gQWWEQsq2m56u2cv6sdY6FYo2GuxzASJ9vIWQBDS1Et9AJzs3dVN4PjdKWt2peAKGb1Gl5rcBEmM5b3oYhWzSLSu8axcU2dqP0FNvPpkrD98hEAvWyW2sU/xdk4wwGSw==";
39
40 String G_OTHER_BASE64 =
41 "UVvkQGS9ULYLZfgomIk1JPAkhBjF3FJJf2v/BESOIa0GSawzuu8+UJ3AhsmgF+bb8jhqfUq/UTqyBTR2IFKyItkUrb/B1UoK/wvaw0kbKyfjUrCGXnXOHnIE8bu/6Drjj2QzDy69kKJP37PGhd/jaRxdqGiSoEy1TAD1a/mjkjhmJmUSk4FZdtXUW6rwlq40C63dlKW2pWru+B6XRjtURM1RP4w7joKvcV2N4x3OAQs3/skjmUXyRQoU1k23eoNCee4wYadG+fne2+4MTvr/Qb6JIG4TOEmGmWO3ADHdwOHQxy515OTMP+DoffBMHFZKy7OZnC4G7q/+qHzVbVAJc8iwLVy73zDt21g7PgvEUB+ndESkhWUmVTNBtWANLGgDswoyvZXX8wu1JC5lI485dm8ux8VP5k/4j9TYIA9PzDRxs8M6ykF5ej4XAaa80Yuzpbxw7Eex2rZHiys79Hn3jiM5vhOTND8hdb4Qexhqu5jQw4rwj0j094M921WrScq6";
42 String P2_BASE64 =
43 "AIbUeE2FqsTt9fCnfKQj4Gfi0E9YJs3T8CQeXlHdvFghFLqEvqG+0i9FSS6KCPuIrvJTQpP0UK7jmz9ho0nV2kuB8CDK8X0B8OzgIzCMwy5LpEEzZsKhy9G1jV3YyehkqfxZdKkupPZ1M5HI+BNZOR8ohWm/6k7aRon9Z2zs6RfJKD3h9QV8pLJdtX+cFs0hMfv4u8O57H2+W/J2QKd06knDmx05NIXUPzNAJ6ocl4ndjzXxUKwgC0H6191uDei3qJukuW+ZDVEZYmfLUPieeUIPo1HTljnKfqEv+mdyMcEfJrOEzzXB7jRTT3QohtFzZXa6/KmcZ9FdWh54+H2//6ryNyE2oNypfTKWvxxicmUJTeKJDR+lpaBiDzSfs9XM6rcEWVkkWD33YjHb+5M2gkMgJEXx3WrYiIEyyKav7I+ezSlllEk3pwgMBmJW+jgiI+I9ByU87PWNGzKys5rUvFBaF9RCz21zzw2LEvXDYvlkk+QaPPIKj7AM4M+7wKeuSw==";
44 String Q2_BASE64 = "APDDzsMTbD5LgggjvzFDfoK3x1BphByXkZqg7zBlHyvj";
45 String G2_BASE64 =
46 "FYuXPQPEApf/JDV2CPbfQGF11k1P3RZ3PRn7uH0eRQBSyCttyrEeVeDWMSSj8aDe8jSFBz/AmwOoZ8nMeLVvHoA58egzaej80FNFwF2K6+59hikJ5Wvf0VCKrq4ULv2TCdUnQ/7+XastFN8IEBzMwKXWX0l9xw9JVRNd98jAktkUjIFBjf1Vuoie5Niw3zJ8ySgbOzCymeamN1FxBZcWA29G561RicA0KryOG3BGH8rqWvnHIPyL5PCB6KILyXoKZfjqyrb12SMVcEXO+/y5+6HBu630e5SSFhfxu/5+ejHABwnuRwcdy2rSBIwqp0xKwwhllzTeWvSBWsf22MYwYCgFm8WpG8ZqAZeeXcSqmMeRVL8MPFKscxz6htkp8nB/lGysCvMiPnfAe5yUgOtmpRLAxfNiWdLdLSdRJ2q5aDXwp9GwVKSafmelv3qMs4hPERHpgGoQmMme7XDLrd2z4UxOquIvXUtcpYvp5FC11C5RgeXzYbU6bbPljzwx3vqf";
47 CivitasBigInteger P2 = CommonUtil.asBigint(P2_BASE64);
48 CivitasBigInteger Q2 = CommonUtil.asBigint(Q2_BASE64);
49 CivitasBigInteger G2 = CommonUtil.asBigint(G2_BASE64);
50
51 CivitasBigInteger BIGINT_P_OTHER = CommonUtil.asBigint(P_OTHER_BASE64);
52 CivitasBigInteger BIGINT_G_OTHER = CommonUtil.asBigint(G_OTHER_BASE64);
53 String GENERATOR_OTHER_BASE64 =
54 "B8Ewf1Z2BaJYadh/hzQ2kjNGPmYWBIvA6ZxHSpVpB/Sw4m40L8qWkwsNrfUh87L8GIJM0QZ4tHgYCdduHUjiWmcStRTh+2RvNoinIrK5QnxaW3g6Y2G32rxutDlOKwaoMMbrut50O8XN12mD4wR15inhh4+QVyzeobFVSPnpgheb2gt9i5pTKJY6JQkpcZnD4bHF+i7MGelqeoyGmLGqZu98ODsSxn2HfmMniV+p+aaTYJV8niINbYlvvz2BSwf86YdlQOa5WfzzPGSltmt5v5ACs135JCIw3kRzepRzjWGAINHv+SgPcBVSVTwtuBoykYhxzT03CWWo5WwZ+NzdmgDih7RheaQpMlIfSxP/5ZJVukgDxJv4v70F3KRwJ5V5jY26sjETz2Kayn6y38EfDuQjeOAUOamGYcHpdqKdPySJWTK0o6sfKIQ2etMZG0fUFEEt3CdsoGOUi31saXFDK4pkHqu+jQMzCg2Z5EsXwVgZ6J0SD1Nq/DDGvAU2lQdU";
55 CivitasBigInteger GENERATOR_OTHER = CommonUtil.asBigint(GENERATOR_OTHER_BASE64);
56 CivitasBigInteger GENERATOR_OTHER_POW_R1 = GENERATOR_OTHER.modPow(RANDOMS_1, BIGINT_P);
57 String GENERATOR_OTHER__POW_R1_BASE64 = CommonUtil.fromBigInt(GENERATOR_OTHER_POW_R1);
58
59 CivitasBigInteger GENERATOR_FOR_UNPRIME_P = CommonUtil.asBigint("APPuKv0SXyLaZklKlEiPMfeSkEfsEfdN24AXL3NrYBKG");
60 CivitasBigInteger GENERATOR_FOR_UNPRIME_Q = CommonUtil.asBigint("SlVGgqFXxlg=");
61
62 ElGamalParameters EL_GAMAL_PARAMETERS = new ElGamalParameters(BIGINT_P, BIGINT_Q, BIGINT_G);
63
64 ElGamalParameters EL_GAMAL_PARAMETERS_NEGATIVE_P =
65 new ElGamalParameters(BIGINT_P.multiply(CivitasBigIntegerFactory.obtain(-1)), BIGINT_Q, BIGINT_G);
66 ElGamalParameters EL_GAMAL_PARAMETERS_OTHER = new ElGamalParameters(P2, Q2, G2);
67
68 ElGamalParameters EL_GAMAL_PARAMETERS_Q_SAME = new ElGamalParameters(BIGINT_P_OTHER, BIGINT_Q, BIGINT_G_OTHER);
69
70 ElGamalParameters EL_GAMAL_PARAMETERS_GENERATOR_OTHER = new ElGamalParameters(BIGINT_P, BIGINT_Q, GENERATOR_OTHER);
71
72 CivitasBigInteger RANDOMS_0_PUBLISHED = BIGINT_G.modPow(RANDOMS_0, BIGINT_P);
73 int SAFE_KEY_LENGTH = 512;
74 String SAFE_P_BASE64 = "ASvIFyEHZA21reK32LTtYEwJG4GSW8Xzrl83llQSdjcztgsIJeyQm0ZZ36vG4aTVYjtADzV9J6xJ5RJ2U9QDfV8=";
75 String SAFE_Q_BASE64 = "AJXkC5CDsgba1vFb7Fp2sCYEjcDJLeL51y+byyoJOxuZ2wWEEvZITaMs79XjcNJqsR2gB5q+k9Yk8ok7KeoBvq8=";
76 String SAFE_G_BASE64 = "AKhY5FkyO989WVWT54UIYi29aZjUfx1XD0xlcF13Y7nGa7itniOZIj36m+m8XHW9VN0bzCgLh4btlHBQ8AY3dMo=";
77 CivitasBigInteger SAFE_P =
78 CivitasBigIntegerFactory.obtain(Base64.getDecoder().decode(SAFE_P_BASE64));
79 CivitasBigInteger SAFE_Q =
80 CivitasBigIntegerFactory.obtain(Base64.getDecoder().decode(SAFE_Q_BASE64));
81 CivitasBigInteger SAFE_G =
82 CivitasBigIntegerFactory.obtain(Base64.getDecoder().decode(SAFE_G_BASE64));
83
84 PrimePair SAFE_PRIMES = new PrimePair(SAFE_P, SAFE_Q);
85 PrimePair SCHNORR_PRIMES = new PrimePair(BIGINT_P, BIGINT_Q);
86 ElGamalParameters EL_GAMAL_PARAMETERS_SAFE = new ElGamalParameters(SAFE_P, SAFE_Q, SAFE_G);
87 CivitasBigInteger PLAINTEXT_WITH_LEGENDRE_MINUS_ONE = CivitasBigIntegerFactory.obtain(251_121);
88 CivitasBigInteger PUBLICIZED_SAFE_LEGENDRE = SAFE_P.subtract(PLAINTEXT_WITH_LEGENDRE_MINUS_ONE);
89 CivitasBigInteger D_EXP_TWOK_FROMP = BIGINT_D.modPow(BIGINT_P.subtract(ONE).divide(BIGINT_Q), BIGINT_P);
90
91 List<VoteChoice> CHOICES = List.of(VoteChoice.values());
92 Map<CivitasBigInteger, VoteChoice> DECODEMAP = CHOICES.stream()
93 .map(x -> new AbstractMap.SimpleEntry<>(
94 CivitasBigIntegerFactory.obtain(x.ordinal()).modMultiply(BIGINT_G, BIGINT_P), x))
95 .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
96
97 CivitasBigInteger I_BEATS_J_ENCODED =
98 CivitasBigIntegerFactory.obtain(VoteChoice.I_BEATS_J.ordinal()).modMultiply(BIGINT_G, BIGINT_P);
99
100 CivitasBigInteger J_BEATS_I_ENCODED =
101 CivitasBigIntegerFactory.obtain(VoteChoice.J_BEATS_I.ordinal()).modMultiply(BIGINT_G, BIGINT_P);
102
103 Integer TWO_INT = 2;
104 CivitasBigInteger TWO_EXP_GROUP_LENGTH = TWO.pow(EL_GAMAL_GROUP_LENGTH);
105 CivitasBigInteger TWO_EXP_KEY_LENGTH = TWO.pow(EL_GAMAL_KEY_LENGTH);
106 String BIGINT_NO_PRIME_OF_GROUPLENGTH_BASE64 =
107 "AJzqQEe12aps6eODiQVPjfuBv2XCZ3zXJqNgJWBndSevG1TaxCQ6uE0Qo77OGE9uNOTIpYqDm0RVpW8+o5ILWI/s9CqZe2XKzsv2KzQBeaemnMxPgJ59BJ+TJ5yZSrowzR012Yic6fwUdn2a11AFfHRpHX9mw0dPjbpNIImzULSbEXU5ZNuWUx2RVNE2VMtcaGmj9P2FkOAwjU9zGDfenkc2WhywT0SP2qDXnaBwc3U4ucAmr/9URAggOIbbQv0fH2v6uVmIG9vaPLhUiZCfygm6j4VqFe936iHUD4cLV+pB68l9Ajh5qpBw1xceNZJBW6dOuUzSB1V/qcsMbvgyA3JylX5dBQTNpFaps95rcGKOAh4QyB9xuPI9Bmza0f3rMBK7zcRTrbD1OlkssrZhk1xB+0vKCIGzMEBy6QAwOv/Ymi8CgsHBpDamD4A9xmoMXGKnrQKzv4yPccARLtAyr8unzYKJcrgc2r6bLxgodbRTpCQnqUOhR936mfWzFRl62Q==";
108 String BIGINT_NO_PRIME_OF_KEYLENGTH_BASE64 = "AJew5gc10pHDbzKQUm2+rIFj7hYrP7aHqAfLkHdwDlnQ";
109 CivitasBigInteger BIGINT_NO_PRIME_OF_GROUPLENGTH = CommonUtil.asBigint(BIGINT_NO_PRIME_OF_GROUPLENGTH_BASE64);
110 CivitasBigInteger BIGINT_NO_PRIME_OF_KEYLENGTH = CommonUtil.asBigint(BIGINT_NO_PRIME_OF_KEYLENGTH_BASE64);
111
112 String EL_GAMAL_PARAMETERS_XML =
113 "<p>" + BIGINT_P_BASE64 + "</p><q>" + BIGINT_Q_BASE64 + "</q><g>" + BIGINT_G_BASE64 + "</g>";
114 }