A lot of bullshit
This commit is contained in:
parent
82cfc32f93
commit
1dd308df42
|
@ -1,5 +1,8 @@
|
||||||
package dk.au.pir;
|
package dk.au.pir;
|
||||||
|
|
||||||
|
import dk.au.pir.utils.FieldElement;
|
||||||
|
|
||||||
|
import java.lang.reflect.Field;
|
||||||
import java.math.BigInteger;
|
import java.math.BigInteger;
|
||||||
import java.security.SecureRandom;
|
import java.security.SecureRandom;
|
||||||
|
|
||||||
|
@ -16,11 +19,11 @@ public class BigIntegerField {
|
||||||
this.rand = new SecureRandom();
|
this.rand = new SecureRandom();
|
||||||
}
|
}
|
||||||
|
|
||||||
public BigInteger getElement(){
|
public FieldElement getElement(){
|
||||||
// TODO: Consider how to make random BigIntegers
|
// TODO: Consider how to make random BigIntegers
|
||||||
byte bytes[] = new byte[20];
|
byte bytes[] = new byte[20];
|
||||||
rand.nextBytes(bytes);
|
rand.nextBytes(bytes);
|
||||||
return new BigInteger(bytes).mod(groupOrder);
|
return new FieldElement(new BigInteger(bytes).mod(groupOrder), groupOrder);
|
||||||
}
|
}
|
||||||
|
|
||||||
public BigInteger multiply(BigInteger elem1, BigInteger elem2){
|
public BigInteger multiply(BigInteger elem1, BigInteger elem2){
|
||||||
|
|
|
@ -4,13 +4,19 @@ import dk.alexandra.fresco.framework.builder.numeric.field.FieldElement;
|
||||||
import dk.au.pir.protocols.interpoly.InterPolyClient;
|
import dk.au.pir.protocols.interpoly.InterPolyClient;
|
||||||
import dk.au.pir.protocols.interpoly.InterPolyServer;
|
import dk.au.pir.protocols.interpoly.InterPolyServer;
|
||||||
import dk.au.pir.settings.PIRSettings;
|
import dk.au.pir.settings.PIRSettings;
|
||||||
|
import dk.au.pir.utils.ComparableIntList;
|
||||||
|
import dk.au.pir.utils.ProtocolUtils;
|
||||||
|
import org.w3c.dom.ls.LSOutput;
|
||||||
|
|
||||||
import java.math.BigInteger;
|
import java.math.BigInteger;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
public class Driver {
|
public class Driver {
|
||||||
public static void main(String[] args) {
|
public static void interPolyTest() {
|
||||||
InterPolyClient client = new InterPolyClient(5);
|
InterPolyClient client = new InterPolyClient(0);
|
||||||
InterPolyServer[] servers = new InterPolyServer[PIRSettings.MOD_BIT_LENGTH + 1];
|
InterPolyServer[] servers = new InterPolyServer[PIRSettings.MOD_BIT_LENGTH + 1];
|
||||||
|
|
||||||
client.generateSRandomFieldElements();
|
client.generateSRandomFieldElements();
|
||||||
|
@ -19,7 +25,7 @@ public class Driver {
|
||||||
BigInteger[] results = new BigInteger[PIRSettings.MOD_BIT_LENGTH + 1];
|
BigInteger[] results = new BigInteger[PIRSettings.MOD_BIT_LENGTH + 1];
|
||||||
|
|
||||||
int[] database = new int[PIRSettings.DATABASE_SIZE];
|
int[] database = new int[PIRSettings.DATABASE_SIZE];
|
||||||
database[5] = 1;
|
database[0] = 1;
|
||||||
|
|
||||||
for (int z = 0; z < PIRSettings.MOD_BIT_LENGTH+1; z++) {
|
for (int z = 0; z < PIRSettings.MOD_BIT_LENGTH+1; z++) {
|
||||||
servers[z] = new InterPolyServer(database);
|
servers[z] = new InterPolyServer(database);
|
||||||
|
@ -29,4 +35,32 @@ public class Driver {
|
||||||
BigInteger res = client.receiveResults(results);
|
BigInteger res = client.receiveResults(results);
|
||||||
System.out.println(res);
|
System.out.println(res);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void generalInterPolyTest() {
|
||||||
|
ProtocolUtils utils = new ProtocolUtils();
|
||||||
|
int s = utils.findSizeOfS(2, PIRSettings.DATABASE_SIZE);
|
||||||
|
|
||||||
|
int[][] database = new int[PIRSettings.DATABASE_SIZE][s];
|
||||||
|
|
||||||
|
Set<ComparableIntList> candidates = new HashSet<ComparableIntList>();
|
||||||
|
|
||||||
|
while (candidates.size() < PIRSettings.DATABASE_SIZE) {
|
||||||
|
ComparableIntList candidate = utils.insertOnes(new ComparableIntList(s), 2);
|
||||||
|
candidates.add(candidate);
|
||||||
|
}
|
||||||
|
|
||||||
|
ArrayList<ComparableIntList> listCandidates = new ArrayList<ComparableIntList>();
|
||||||
|
listCandidates.addAll(candidates);
|
||||||
|
Collections.sort(listCandidates);
|
||||||
|
|
||||||
|
for (ComparableIntList elem : listCandidates) {
|
||||||
|
System.out.println(elem);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
|
||||||
|
generalInterPolyTest();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,63 @@
|
||||||
|
package dk.au.pir.protocols.general.interpoly;
|
||||||
|
|
||||||
|
import dk.au.pir.BigIntegerField;
|
||||||
|
import dk.au.pir.settings.PIRSettings;
|
||||||
|
import dk.au.pir.utils.BigIntegerLagrangeInterpolation;
|
||||||
|
import dk.au.pir.utils.FieldElement;
|
||||||
|
|
||||||
|
import java.math.BigInteger;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
|
public class GeneralInterPolyClient {
|
||||||
|
|
||||||
|
private final int i;
|
||||||
|
private Random random = new Random();
|
||||||
|
private BigIntegerField field;
|
||||||
|
|
||||||
|
|
||||||
|
private FieldElement[] fieldElements = new FieldElement[PIRSettings.MOD_BIT_LENGTH];
|
||||||
|
|
||||||
|
public GeneralInterPolyClient(int i) {
|
||||||
|
this.i = i;
|
||||||
|
this.field = new BigIntegerField();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void generateSRandomFieldElements() {
|
||||||
|
for (int i = 0; i < fieldElements.length; i++) {
|
||||||
|
this.fieldElements[i] = field.getElement();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public BigInteger g(int l, int z) {
|
||||||
|
String iString = Integer.toBinaryString(i);
|
||||||
|
String pads = new String(new char[PIRSettings.MOD_BIT_LENGTH - iString.length()]).replace("\0", "0");
|
||||||
|
iString = pads + iString;
|
||||||
|
char lChar = iString.charAt(iString.length() - 1 - l); // lol
|
||||||
|
String ilString = Character.toString(lChar);
|
||||||
|
BigInteger il = new BigInteger(ilString).mod(field.getGroupOrder());
|
||||||
|
return field.add(field.multiply(fieldElements[l].getValue(), (BigInteger.valueOf(z))), il);
|
||||||
|
}
|
||||||
|
|
||||||
|
public BigInteger[] sendGs(int z){
|
||||||
|
BigInteger[] gs = new BigInteger[PIRSettings.MOD_BIT_LENGTH];
|
||||||
|
for (int l = 0; l < PIRSettings.MOD_BIT_LENGTH; l++) {
|
||||||
|
gs[l] = g(l, z);
|
||||||
|
}
|
||||||
|
return gs;
|
||||||
|
}
|
||||||
|
|
||||||
|
public FieldElement[] getFieldElements() {
|
||||||
|
return fieldElements;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public BigInteger receiveResults(BigInteger[] results) {
|
||||||
|
BigInteger[] fuckingXs = new BigInteger[PIRSettings.MOD_BIT_LENGTH + 1];
|
||||||
|
for (int i = 0; i < PIRSettings.MOD_BIT_LENGTH + 1; i++) {
|
||||||
|
fuckingXs[i] = BigInteger.valueOf(i);
|
||||||
|
}
|
||||||
|
return BigIntegerLagrangeInterpolation.doIt(fuckingXs, results);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -3,11 +3,11 @@ package dk.au.pir.protocols.interpoly;
|
||||||
import dk.au.pir.BigIntegerField;
|
import dk.au.pir.BigIntegerField;
|
||||||
import dk.au.pir.settings.PIRSettings;
|
import dk.au.pir.settings.PIRSettings;
|
||||||
import dk.au.pir.utils.BigIntegerLagrangeInterpolation;
|
import dk.au.pir.utils.BigIntegerLagrangeInterpolation;
|
||||||
|
import dk.au.pir.utils.FieldElement;
|
||||||
|
|
||||||
import java.math.BigInteger;
|
import java.math.BigInteger;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
import java.util.concurrent.ThreadLocalRandom;
|
|
||||||
|
|
||||||
public class InterPolyClient {
|
public class InterPolyClient {
|
||||||
|
|
||||||
|
@ -16,7 +16,7 @@ public class InterPolyClient {
|
||||||
private BigIntegerField field;
|
private BigIntegerField field;
|
||||||
|
|
||||||
|
|
||||||
private BigInteger[] fieldElements = new BigInteger[PIRSettings.MOD_BIT_LENGTH];
|
private FieldElement[] fieldElements = new FieldElement[PIRSettings.MOD_BIT_LENGTH];
|
||||||
|
|
||||||
public InterPolyClient(int i) {
|
public InterPolyClient(int i) {
|
||||||
this.i = i;
|
this.i = i;
|
||||||
|
@ -36,7 +36,7 @@ public class InterPolyClient {
|
||||||
char lChar = iString.charAt(iString.length() - 1 - l); // lol
|
char lChar = iString.charAt(iString.length() - 1 - l); // lol
|
||||||
String ilString = Character.toString(lChar);
|
String ilString = Character.toString(lChar);
|
||||||
BigInteger il = new BigInteger(ilString).mod(field.getGroupOrder());
|
BigInteger il = new BigInteger(ilString).mod(field.getGroupOrder());
|
||||||
return field.add(field.multiply(fieldElements[l], (BigInteger.valueOf(z))), il);
|
return field.add(field.multiply(fieldElements[l].getValue(), (BigInteger.valueOf(z))), il);
|
||||||
}
|
}
|
||||||
|
|
||||||
public BigInteger[] sendGs(int z){
|
public BigInteger[] sendGs(int z){
|
||||||
|
@ -47,7 +47,7 @@ public class InterPolyClient {
|
||||||
return gs;
|
return gs;
|
||||||
}
|
}
|
||||||
|
|
||||||
public BigInteger[] getFieldElements() {
|
public FieldElement[] getFieldElements() {
|
||||||
return fieldElements;
|
return fieldElements;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,7 @@ import dk.alexandra.fresco.framework.util.ModulusFinder;
|
||||||
import java.math.BigInteger;
|
import java.math.BigInteger;
|
||||||
|
|
||||||
public class PIRSettings {
|
public class PIRSettings {
|
||||||
public static final int MOD_BIT_LENGTH = 16; // s
|
public static final int MOD_BIT_LENGTH = 8; // s
|
||||||
public static final int DATABASE_SIZE = (int) Math.pow(2, MOD_BIT_LENGTH); // n
|
public static final int DATABASE_SIZE = (int) Math.pow(2, MOD_BIT_LENGTH); // n
|
||||||
public static final int MAX_BIT_LENGTH = 512;
|
public static final int MAX_BIT_LENGTH = 512;
|
||||||
|
|
||||||
|
|
64
pir/src/main/java/dk/au/pir/utils/ComparableIntList.java
Normal file
64
pir/src/main/java/dk/au/pir/utils/ComparableIntList.java
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
package dk.au.pir.utils;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
public class ComparableIntList implements Comparable<ComparableIntList> {
|
||||||
|
|
||||||
|
private int[] list;
|
||||||
|
|
||||||
|
public ComparableIntList(int size) {
|
||||||
|
list = new int[size];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public int[] getList() {
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int length() {
|
||||||
|
return list.length;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String toString() {
|
||||||
|
StringBuilder tmp = new StringBuilder();
|
||||||
|
for (int i : list) {
|
||||||
|
tmp.append(i);
|
||||||
|
}
|
||||||
|
return tmp.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
// TODO: Only works for k=1 atm
|
||||||
|
for (int i = 0; i < list.length; i++) {
|
||||||
|
if (list[i] == 1) {
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object other) {
|
||||||
|
ComparableIntList cit = (ComparableIntList) other;
|
||||||
|
for (int i = 0; i < list.length; i++) {
|
||||||
|
if (list[i] != cit.list[i]) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public int compareTo(ComparableIntList o) {
|
||||||
|
for (int i = 0; i < list.length; i++) {
|
||||||
|
int diff = this.list[i] - o.list[i];
|
||||||
|
if (diff == 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
return diff;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
22
pir/src/main/java/dk/au/pir/utils/FieldElement.java
Normal file
22
pir/src/main/java/dk/au/pir/utils/FieldElement.java
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
package dk.au.pir.utils;
|
||||||
|
|
||||||
|
import java.math.BigInteger;
|
||||||
|
|
||||||
|
public class FieldElement {
|
||||||
|
private BigInteger value;
|
||||||
|
private BigInteger modulus;
|
||||||
|
|
||||||
|
public FieldElement(BigInteger value, BigInteger modulus) {
|
||||||
|
this.value = value;
|
||||||
|
this.modulus = modulus;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public BigInteger getValue() {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BigInteger getModulus() {
|
||||||
|
return modulus;
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,10 +1,63 @@
|
||||||
package dk.au.pir.utils;
|
package dk.au.pir.utils;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
public class ProtocolUtils {
|
public class ProtocolUtils {
|
||||||
|
|
||||||
|
private Random rand;
|
||||||
|
|
||||||
|
public ProtocolUtils() {
|
||||||
|
this.rand = new Random();
|
||||||
|
}
|
||||||
|
|
||||||
public static int kronecker(int i, int j) {
|
public static int kronecker(int i, int j) {
|
||||||
if (i == j) {
|
if (i == j) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public int binop(int n, int k) {
|
||||||
|
if (k < 0 || k > n)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (k == 0 || k == n)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
k = Math.min(k, n-k);
|
||||||
|
int c = 1;
|
||||||
|
|
||||||
|
for (int i = 0; i < k; i++)
|
||||||
|
c = c * (n-i) / (i+1);
|
||||||
|
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int findSizeOfS(int k, int n) {
|
||||||
|
int s = 0;
|
||||||
|
while ((binop(s, k-1))< n) {
|
||||||
|
s++;
|
||||||
|
}
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ComparableIntList insertOnes(ComparableIntList sequence, int k) {
|
||||||
|
|
||||||
|
ArrayList<Integer> picked = new ArrayList<Integer>();
|
||||||
|
int i = 0;
|
||||||
|
while (i < k-1) {
|
||||||
|
int randomI = rand.nextInt(sequence.length());
|
||||||
|
if (picked.contains(randomI)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
picked.add(randomI);
|
||||||
|
sequence.getList()[randomI] = 1;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return sequence;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue