diff --git a/pir/pom.xml b/pir/pom.xml
index 7a73e86..4fdae28 100644
--- a/pir/pom.xml
+++ b/pir/pom.xml
@@ -7,6 +7,18 @@
dk.au.pir
pir
1.0-SNAPSHOT
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+
+ 8
+
+
+
+
diff --git a/pir/src/main/java/dk/alexandra/fresco/framework/builder/numeric/field/BigIntegerFieldElement.java b/pir/src/main/java/dk/alexandra/fresco/framework/builder/numeric/field/BigIntegerFieldElement.java
new file mode 100644
index 0000000..93b774e
--- /dev/null
+++ b/pir/src/main/java/dk/alexandra/fresco/framework/builder/numeric/field/BigIntegerFieldElement.java
@@ -0,0 +1,86 @@
+package dk.alexandra.fresco.framework.builder.numeric.field;
+
+import dk.alexandra.fresco.framework.util.MathUtils;
+import java.math.BigInteger;
+
+/**
+ * An element in a field defined by a {@link BigIntegerModulus}.
+ */
+final public class BigIntegerFieldElement implements FieldElement {
+
+ private static final long serialVersionUID = -6786266947587799652L;
+
+ private final BigInteger value;
+
+ private final BigIntegerModulus modulus;
+ private BigIntegerFieldElement(BigInteger value, BigIntegerModulus modulus) {
+ this.value = modulus.reduceModThis(value);
+ this.modulus = modulus;
+ }
+
+ private FieldElement create(BigInteger value) {
+ return create(value, this.modulus);
+ }
+
+ static FieldElement create(BigInteger value, BigIntegerModulus modulus) {
+ return new BigIntegerFieldElement(value, modulus);
+ }
+
+ static FieldElement create(long value, BigIntegerModulus modulus) {
+ return create(BigInteger.valueOf(value), modulus);
+ }
+
+ static FieldElement create(String string, BigIntegerModulus modulus) {
+ return create(new BigInteger(string), modulus);
+ }
+
+ @Override
+ public FieldElement add(FieldElement operand) {
+ return create(value.add(extractValue(operand)));
+ }
+
+ @Override
+ public FieldElement subtract(FieldElement operand) {
+ return create(value.subtract(extractValue(operand)));
+ }
+
+ @Override
+ public FieldElement negate() {
+ return create(getModulus().subtract(value));
+ }
+
+ @Override
+ public FieldElement multiply(FieldElement operand) {
+ return create(value.multiply(extractValue(operand)));
+ }
+
+ @Override
+ public FieldElement sqrt() {
+ return create(MathUtils.modularSqrt(value, getModulus()));
+ }
+
+ @Override
+ public FieldElement modInverse() {
+ return create(value.modInverse(getModulus()));
+ }
+
+ static BigInteger extractValue(FieldElement element) {
+ return ((BigIntegerFieldElement) element).value;
+ }
+
+ public BigInteger getValue() {
+ return value;
+ }
+
+ private BigInteger getModulus() {
+ return modulus.getBigInteger();
+ }
+
+ @Override
+ public String toString() {
+ return "BigIntegerFieldElement{"
+ + "value=" + value
+ + ", modulus=" + modulus
+ + '}';
+ }
+}
diff --git a/pir/src/main/java/dk/au/pir/Driver.java b/pir/src/main/java/dk/au/pir/Driver.java
new file mode 100644
index 0000000..2d8f3f1
--- /dev/null
+++ b/pir/src/main/java/dk/au/pir/Driver.java
@@ -0,0 +1,13 @@
+package dk.au.pir;
+
+import dk.alexandra.fresco.framework.builder.numeric.field.FieldElement;
+import dk.au.pir.protocols.interpoly.InterPolyClient;
+
+public class Driver {
+ public static void main(String[] args) {
+ InterPolyClient client = new InterPolyClient();
+ for (FieldElement elem: client.getSRandomFieldElements()) {
+ System.out.println(elem);
+ }
+ }
+}
diff --git a/pir/src/main/java/dk/au/pir/protocols/interpoly/InterPolyClient.java b/pir/src/main/java/dk/au/pir/protocols/interpoly/InterPolyClient.java
index 01b6459..e1febd3 100644
--- a/pir/src/main/java/dk/au/pir/protocols/interpoly/InterPolyClient.java
+++ b/pir/src/main/java/dk/au/pir/protocols/interpoly/InterPolyClient.java
@@ -1,10 +1,35 @@
package dk.au.pir.protocols.interpoly;
+import dk.alexandra.fresco.framework.builder.numeric.field.BigIntegerFieldElement;
+import dk.alexandra.fresco.framework.builder.numeric.field.FieldElement;
import dk.au.pir.settings.PIRSettings;
+import java.math.BigInteger;
+import java.util.Random;
+
public class InterPolyClient {
- public static void main(String[] args) {
- System.out.println("Client!");
- System.out.println(PIRSettings.FIELD_DEFINITION.getBitLength());
+ private final int i;
+ private Random random = new Random();
+ private BigIntegerFieldElement[] fieldElements = new BigIntegerFieldElement[PIRSettings.MOD_BIT_LENGTH];
+
+ public InterPolyClient(int i) {
+ this.i = i;
+ }
+
+ public void generateSRandomFieldElements() {
+ for (int i = 0; i < fieldElements.length; i++) {
+ this.fieldElements[i] = (BigIntegerFieldElement) PIRSettings.FIELD_DEFINITION.createElement(new BigInteger(PIRSettings.MAX_BIT_LENGTH, random));
+ }
+ }
+
+ public FieldElement g(int l, BigIntegerFieldElement z) {
+ String iString = Integer.toBinaryString(i);
+ char lChar = iString.charAt(iString.length() - 1 - l); // lol
+ BigIntegerFieldElement il = (BigIntegerFieldElement) PIRSettings.FIELD_DEFINITION.createElement(Character.toString(lChar));
+ return fieldElements[l].multiply(z).add(il);
+ }
+
+ public FieldElement[] getFieldElements() {
+ return fieldElements;
}
}
diff --git a/pir/src/main/java/dk/au/pir/protocols/interpoly/InterPolyServer.java b/pir/src/main/java/dk/au/pir/protocols/interpoly/InterPolyServer.java
index cfa3018..fa2efa2 100644
--- a/pir/src/main/java/dk/au/pir/protocols/interpoly/InterPolyServer.java
+++ b/pir/src/main/java/dk/au/pir/protocols/interpoly/InterPolyServer.java
@@ -1,4 +1,5 @@
package dk.au.pir.protocols.interpoly;
public class InterPolyServer {
+
}
diff --git a/pir/src/main/java/dk/au/pir/settings/PIRSettings.java b/pir/src/main/java/dk/au/pir/settings/PIRSettings.java
index ebd7738..a0c3b79 100644
--- a/pir/src/main/java/dk/au/pir/settings/PIRSettings.java
+++ b/pir/src/main/java/dk/au/pir/settings/PIRSettings.java
@@ -4,7 +4,12 @@ import dk.alexandra.fresco.framework.builder.numeric.field.BigIntegerFieldDefini
import dk.alexandra.fresco.framework.builder.numeric.field.FieldDefinition;
import dk.alexandra.fresco.framework.util.ModulusFinder;
+import java.math.BigInteger;
+
public class PIRSettings {
- private static final int MOD_BIT_LENGTH = 16;
- public static FieldDefinition FIELD_DEFINITION = new BigIntegerFieldDefinition(ModulusFinder.findSuitableModulus(MOD_BIT_LENGTH));
+ public static final int MOD_BIT_LENGTH = 16; // s
+ public static final int DATABASE_SIZE = (int) Math.pow(2, MOD_BIT_LENGTH); // n
+ public static final int MAX_BIT_LENGTH = 512;
+
+ public static FieldDefinition FIELD_DEFINITION = new BigIntegerFieldDefinition(ModulusFinder.findSuitableModulus(MOD_BIT_LENGTH));
}
diff --git a/pir/src/main/java/dk/au/pir/utils/ProtocolUtils.java b/pir/src/main/java/dk/au/pir/utils/ProtocolUtils.java
new file mode 100644
index 0000000..abb5462
--- /dev/null
+++ b/pir/src/main/java/dk/au/pir/utils/ProtocolUtils.java
@@ -0,0 +1,10 @@
+package dk.au.pir.utils;
+
+public class ProtocolUtils {
+ public static int kronecker(int i, int j) {
+ if (i == j) {
+ return 1;
+ }
+ return 0;
+ }
+}