package blabla.bla;
import java.io.Serializable;
import java.util.ArrayList;
final public class DHPrivateKeySet implements Serializable {
// private final static int MIN_PRIME = 17;
// private final static int MAX_PRIME = 32003;
private final static int [] INT_PRIMES =
{
103, 107, 109, 113, 127, 131, 137, 139, 149, 151,
157, 163, 167, 173, 179, 181, 191, 193, 197, 199,
211, 223, 227, 229, 233, 239, 241, 251, 257, 263,
269, 271, 277, 281, 283, 293, 307, 311, 313, 317,
331, 337, 347, 349, 353, 359, 367, 373, 379, 383,
389, 397, 401, 409, 419, 421, 431, 433, 439, 443,
449, 457, 461, 463, 467, 479, 487, 491, 499, 503,
509, 521, 523, 541, 547, 557, 563, 569, 571, 577,
587, 593, 599, 601, 607, 613, 617, 619, 631, 641,
643, 647, 653, 659, 661, 673, 677, 683, 691, 701,
709, 719, 727, 733, 739, 743, 751, 757, 761, 769,
773, 787, 797, 809, 811, 821, 823, 827, 829, 839,
853, 857, 859, 863, 877, 881, 883, 887, 907, 911,
919, 929, 937, 941, 947, 953, 967, 971, 977, 983,
991, 997, 1009, 1013, 1019, 1021, 1031, 1033, 1039, 1049,
1051, 1061, 1063, 1069, 1087, 1091, 1093, 1097, 1103, 1109,
1117, 1123, 1129, 1151, 1153, 1163, 1171, 1181, 1187, 1193,
1201, 1213, 1217, 1223, 1229, 1231, 1237, 1249, 1259, 1277,
1279, 1283, 1289, 1291, 1297, 1301, 1303, 1307, 1319, 1321,
1327, 1361, 1367, 1373, 1381, 1399, 1409, 1423, 1427, 1429,
1433, 1439, 1447, 1451, 1453, 1459, 1471, 1481, 1483, 1487,
1489, 1493, 1499, 1511, 1523, 1531, 1543, 1549, 1553, 1559,
1567, 1571, 1579, 1583, 1597, 1601, 1607, 1609, 1613, 1619,
1621, 1627, 1637, 1657, 1663, 1667, 1669, 1693, 1697, 1699,
1709, 1721, 1723, 1733, 1741, 1747, 1753, 1759, 1777, 1783,
1787, 1789, 1801, 1811, 1823, 1831, 1847, 1861, 1867, 1871,
1873, 1877, 1879, 1889, 1901, 1907, 1913, 1931, 1933, 1949,
1951, 1973, 1979, 1987, 1993, 1997, 1999
};
private static final long serialVersionUID = 1234656760897983;
private final int DH_MIN = 2; /* minimum number, for random */
// --> p
private int primeModule = -1;
// --> g
private int primeRootOfP = -1;
// own public Key B
private int ownPublicKey = -1;
// own secret random x
private int ownPrivateKey = -1;
// current secretGroupKey
private int groupPrivateKey = -1;
// current public GroupKey
private int groupPublicKey = -1;
// einfacher Konstruktor 1
public DHPrivateKeySet(long id) {
this.setPrimeRootOfP((int) (id / 10000));
this.setPrimeModule((int) (id % 10000));
this.setOwnPrivateKey(((int) (Math.random() * (this.getPrimeModule() - DH_MIN + 1) ) + DH_MIN));
this.calcOwnPublicKey();
}
// komplexer Kontruktor 2
public DHPrivateKeySet(long idRegion, long utcTime) {
int indxP = (int) idRegion % INT_PRIMES.length;
this.setPrimeModule(INT_PRIMES[indxP]);
ArrayList<Integer> z = calcPrimeRoots(this.getPrimeModule());
int indxPR =(int) (utcTime % 8);
this.setPrimeRootOfP(z.get(indxPR));
this.setOwnPrivateKey(((int) (Math.random() * (this.getPrimeModule() - DH_MIN + 1) ) + DH_MIN));
this.calcOwnPublicKey();
}
public int getPrimeModule() {
return primeModule;
}
public void setPrimeModule(int primeModule) {
this.primeModule = primeModule;
}
public int getPrimeRootOfP() {
return primeRootOfP;
}
public void setPrimeRootOfP(int primeRootOfP) {
this.primeRootOfP = primeRootOfP;
}
public int getOwnPublicKey() {
return ownPublicKey;
}
public void calcOwnPublicKey() {
this.ownPublicKey = modPow(this.getPrimeRootOfP(), this.getOwnPrivateKey(), this.getPrimeModule());
}
public void setOwnPublicKey(int ownPrivateKey2) {
this.ownPublicKey = ownPrivateKey2;
}
public void setOwnPrivateKey(int ownPrivateKey) {
this.ownPrivateKey = ownPrivateKey;
}
public int getOwnPrivateKey() {
return ownPrivateKey;
}
public int getGroupPrivateKey() {
return groupPrivateKey;
}
public void calcGroupPrivateKey(int receivedGrpPK) {
// int thisPK = (myDHPrivateKeySet.getGroupPrivateKey() > 0)? this.getGroupPrivateKey():this.getOwnPublicKey();
this.groupPrivateKey = modPow(receivedGrpPK, this.getGroupPrivateKey(), this.getPrimeModule());
}
public void setGroupPrivateKey(int groupPrivateKey) {
this.groupPrivateKey = groupPrivateKey;
}
public int getGroupPublicKey() {
return this.groupPublicKey;
}
public void setGroupPublicKey(int groupPublicKey) {
this.groupPublicKey = groupPublicKey;
}
public void calcGroupPublicKey(int grpPrivKey) {
int i = modPow(this.getPrimeRootOfP(), grpPrivKey, this.getPrimeModule());
this.setGroupPublicKey( i );
}
public int modPow(int param_base, int param_exp, int param_mod) {
long result = 1;
for(int e = 0; e < param_exp; e++) {
result = ((result * param_base) % param_mod);
}
return (int) result;
}
public int modPow(int param_exp) {
long result = 1;
for(int e = 0; e < param_exp; e++) {
result = ((result * this.getPrimeRootOfP()) % this.getPrimeModule());
}
return (int) result;
}
public static int modPower(int param_base, int param_exp, int param_mod) {
long result = 1;
for(int e = 0; e < param_exp; e++) {
result = ((result * param_base) % param_mod);
}
return (int) result;
}
public static ArrayList<Integer> calcPrimeRoots(int p){
ArrayList<Integer> g = new ArrayList<Integer>();
for(int z = 1; z < p; z++){
// 1. Condition : 0 konkruent to (z^(M-1)-1)(mod M)
if( 0 == (modPower(z, p-1, p) - (1% p))){
// 2. Condition: For all m < M-1 it holds that 0 not konkruent to (z^m-1)(mod M)
for(int m = 1; m< p-1; m++){
if( 0 == (modPower(z, m, p) - (1% p))) m = p; // quite loop
if(m == p-2){
g.add(z);
}
}
}
}
return g;
}
} // end class