From ead50cfbb310feaaf6dfc7da6b59165428e4833a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Magdalena=20Grodzi=C5=84ska?= <mag.grodzinska@gmail.com>
Date: Sun, 12 Jan 2020 17:11:19 +0100
Subject: Create QuerySigner class

---
 src/main/java/pl/edu/mimuw/cloudatlas/querysigner/QuerySigner.java | 4 ++++
 1 file changed, 4 insertions(+)
 create mode 100644 src/main/java/pl/edu/mimuw/cloudatlas/querysigner/QuerySigner.java

(limited to 'src/main/java/pl/edu/mimuw/cloudatlas/querysigner')

diff --git a/src/main/java/pl/edu/mimuw/cloudatlas/querysigner/QuerySigner.java b/src/main/java/pl/edu/mimuw/cloudatlas/querysigner/QuerySigner.java
new file mode 100644
index 0000000..e5e561d
--- /dev/null
+++ b/src/main/java/pl/edu/mimuw/cloudatlas/querysigner/QuerySigner.java
@@ -0,0 +1,4 @@
+package pl.edu.mimuw.cloudatlas.querysigner;
+
+public class QuerySigner {
+}
-- 
cgit v1.2.3


From da5df3957ba41d28256ab8183aae0dd3b6e0dcba Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Magdalena=20Grodzi=C5=84ska?= <mag.grodzinska@gmail.com>
Date: Sun, 12 Jan 2020 21:05:28 +0100
Subject: Add query signer architecture

---
 .../mimuw/cloudatlas/querysigner/QuerySigner.java  |  26 +++++
 .../querysigner/QuerySignerApiImplementation.java  | 112 +++++++++++++++++++++
 2 files changed, 138 insertions(+)
 create mode 100644 src/main/java/pl/edu/mimuw/cloudatlas/querysigner/QuerySignerApiImplementation.java

(limited to 'src/main/java/pl/edu/mimuw/cloudatlas/querysigner')

diff --git a/src/main/java/pl/edu/mimuw/cloudatlas/querysigner/QuerySigner.java b/src/main/java/pl/edu/mimuw/cloudatlas/querysigner/QuerySigner.java
index e5e561d..69a25d7 100644
--- a/src/main/java/pl/edu/mimuw/cloudatlas/querysigner/QuerySigner.java
+++ b/src/main/java/pl/edu/mimuw/cloudatlas/querysigner/QuerySigner.java
@@ -1,4 +1,30 @@
 package pl.edu.mimuw.cloudatlas.querysigner;
 
+import pl.edu.mimuw.cloudatlas.agent.EventBus;
+import pl.edu.mimuw.cloudatlas.api.Api;
+import pl.edu.mimuw.cloudatlas.querysignerapi.QuerySignerApi;
+
+import java.rmi.registry.LocateRegistry;
+import java.rmi.registry.Registry;
+import java.rmi.server.UnicastRemoteObject;
+
 public class QuerySigner {
+
+    public static void runRegistry() {
+        try {
+            QuerySignerApiImplementation api = new QuerySignerApiImplementation();
+            QuerySignerApi apiStub =
+                    (QuerySignerApi) UnicastRemoteObject.exportObject(api, 0);
+            Registry registry = LocateRegistry.getRegistry();
+            registry.rebind("QuerySignerApi", apiStub);
+            System.out.println("QuerySigner: api bound");
+        } catch (Exception e) {
+            System.err.println("QuerySigner registry initialization exception:");
+            e.printStackTrace();
+        }
+    }
+
+    public static void main(String[] args) {
+        runRegistry();
+    }
 }
diff --git a/src/main/java/pl/edu/mimuw/cloudatlas/querysigner/QuerySignerApiImplementation.java b/src/main/java/pl/edu/mimuw/cloudatlas/querysigner/QuerySignerApiImplementation.java
new file mode 100644
index 0000000..38a86c6
--- /dev/null
+++ b/src/main/java/pl/edu/mimuw/cloudatlas/querysigner/QuerySignerApiImplementation.java
@@ -0,0 +1,112 @@
+package pl.edu.mimuw.cloudatlas.querysigner;
+
+import pl.edu.mimuw.cloudatlas.model.ValueQuery;
+import pl.edu.mimuw.cloudatlas.querysignerapi.QuerySignerApi;
+
+import javax.crypto.BadPaddingException;
+import javax.crypto.Cipher;
+import javax.crypto.IllegalBlockSizeException;
+import javax.crypto.NoSuchPaddingException;
+import java.rmi.RemoteException;
+import java.security.*;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+public class QuerySignerApiImplementation implements QuerySignerApi {
+    private PublicKey publicKey;
+    private PrivateKey privateKey;
+    private final static String ENCRYPTION_ALGORITHM = "RSA";
+    private final static int NUM_KEY_BITS = 1024;
+    private Map<String, ValueQuery> queries;
+    private Set<String> attribsSetByQueries;
+
+    QuerySignerApiImplementation() {
+        this.queries = new HashMap<>();
+        this.attribsSetByQueries = new HashSet<>();
+        try {
+            generateKeys();
+        } catch (NoSuchAlgorithmException e) {
+            e.printStackTrace();
+        }
+    }
+
+    private String byteArrayToString(byte[] arr, int offset, int len) {
+        StringBuffer sb = new StringBuffer();
+        for (int i = offset, n = Math.min(arr.length, offset + len); i < n; ++i) {
+            String hex = Integer.toHexString(0xFF & arr[i]);
+            if (hex.length() < 2) {
+                sb.append('0');
+            }
+            sb.append(hex);
+        }
+        return sb.toString();
+    }
+
+    private void generateKeys() throws NoSuchAlgorithmException {
+        KeyPairGenerator keyGenerator =
+                KeyPairGenerator.getInstance(ENCRYPTION_ALGORITHM);
+        keyGenerator.initialize(NUM_KEY_BITS);
+        KeyPair keyPair = keyGenerator.generateKeyPair();
+        this.privateKey = keyPair.getPrivate();
+        this.publicKey = keyPair.getPublic();
+    }
+
+    private byte[] encryptQuery(String query) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
+        Cipher signCipher = Cipher.getInstance(ENCRYPTION_ALGORITHM);
+        signCipher.init(Cipher.ENCRYPT_MODE, privateKey);
+        byte[] encryptedBytes = signCipher.doFinal(query.getBytes());
+        System.out.println(
+                "Bytes encrypted with " + ENCRYPTION_ALGORITHM +
+                        ": " + byteArrayToString(
+                        encryptedBytes, 0, encryptedBytes.length));
+        return encryptedBytes;
+    }
+
+    private String decryptQuery(byte[] encryptedQuery) throws NoSuchPaddingException, NoSuchAlgorithmException, BadPaddingException, IllegalBlockSizeException, InvalidKeyException {
+        Cipher verifyCipher = Cipher.getInstance(ENCRYPTION_ALGORITHM);
+        verifyCipher.init(Cipher.DECRYPT_MODE, publicKey);
+        byte[] decryptedBytes = verifyCipher.doFinal(encryptedQuery);
+        System.out.println(
+                "Bytes decrypted with " + ENCRYPTION_ALGORITHM +
+                        ": " + byteArrayToString(
+                        decryptedBytes, 0, decryptedBytes.length));
+        return new String(decryptedBytes);
+    }
+
+    @Override
+    public byte[] signQuery(String queryName, String queryCode) throws RemoteException {
+        try {
+            return encryptQuery(queryName + queryCode);
+        } catch (NoSuchPaddingException | NoSuchAlgorithmException | InvalidKeyException | BadPaddingException | IllegalBlockSizeException e) {
+            e.printStackTrace();
+            throw new RemoteException(e.getLocalizedMessage());
+        }
+    }
+
+    @Override
+    public String checkQuery(byte[] encryptedQuery, String queryName, String queryCode) throws RemoteException {
+        try {
+            return decryptQuery(encryptedQuery);
+        } catch (NoSuchPaddingException | NoSuchAlgorithmException | BadPaddingException | IllegalBlockSizeException | InvalidKeyException e) {
+            e.printStackTrace();
+            throw new RemoteException(e.getLocalizedMessage());
+        }
+    }
+
+    @Override
+    public PublicKey getPublicKey() throws RemoteException {
+        return publicKey;
+    }
+
+    @Override
+    public void setPublicKey(PublicKey publicKey) throws RemoteException {
+        this.publicKey = publicKey;
+    }
+
+    @Override
+    public byte[] getQuerySignature(String queryName) throws RemoteException {
+        return queries.get(queryName).getSignature();
+    }
+}
-- 
cgit v1.2.3


From f6ada2aae355781e5e16534d3d2e7959cbac69c4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Magdalena=20Grodzi=C5=84ska?= <mag.grodzinska@gmail.com>
Date: Sun, 12 Jan 2020 22:56:51 +0100
Subject: Separate query utils

---
 .../pl/edu/mimuw/cloudatlas/querysigner/QueryUtils.java  | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)
 create mode 100644 src/main/java/pl/edu/mimuw/cloudatlas/querysigner/QueryUtils.java

(limited to 'src/main/java/pl/edu/mimuw/cloudatlas/querysigner')

diff --git a/src/main/java/pl/edu/mimuw/cloudatlas/querysigner/QueryUtils.java b/src/main/java/pl/edu/mimuw/cloudatlas/querysigner/QueryUtils.java
new file mode 100644
index 0000000..6ec62f4
--- /dev/null
+++ b/src/main/java/pl/edu/mimuw/cloudatlas/querysigner/QueryUtils.java
@@ -0,0 +1,16 @@
+package pl.edu.mimuw.cloudatlas.querysigner;
+
+import java.rmi.RemoteException;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class QueryUtils {
+
+    public static void validateQueryName(String queryName) throws RemoteException {
+        Pattern queryNamePattern = Pattern.compile("&[a-zA-Z][\\w_]*");
+        Matcher matcher = queryNamePattern.matcher(queryName);
+        if (!matcher.matches()) {
+            throw new RemoteException("Invalid query identifier");
+        }
+    }
+}
-- 
cgit v1.2.3


From c48ec1604744ab330d18af1f55256c35dc5c34c6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Magdalena=20Grodzi=C5=84ska?= <mag.grodzinska@gmail.com>
Date: Sun, 12 Jan 2020 22:58:08 +0100
Subject: Improve query signer and its api

---
 .../mimuw/cloudatlas/querysigner/QuerySigner.java  | 12 +++-
 .../querysigner/QuerySignerApiImplementation.java  | 84 +++++++++++++++-------
 2 files changed, 66 insertions(+), 30 deletions(-)

(limited to 'src/main/java/pl/edu/mimuw/cloudatlas/querysigner')

diff --git a/src/main/java/pl/edu/mimuw/cloudatlas/querysigner/QuerySigner.java b/src/main/java/pl/edu/mimuw/cloudatlas/querysigner/QuerySigner.java
index 69a25d7..90a86b7 100644
--- a/src/main/java/pl/edu/mimuw/cloudatlas/querysigner/QuerySigner.java
+++ b/src/main/java/pl/edu/mimuw/cloudatlas/querysigner/QuerySigner.java
@@ -1,7 +1,5 @@
 package pl.edu.mimuw.cloudatlas.querysigner;
 
-import pl.edu.mimuw.cloudatlas.agent.EventBus;
-import pl.edu.mimuw.cloudatlas.api.Api;
 import pl.edu.mimuw.cloudatlas.querysignerapi.QuerySignerApi;
 
 import java.rmi.registry.LocateRegistry;
@@ -9,10 +7,18 @@ import java.rmi.registry.Registry;
 import java.rmi.server.UnicastRemoteObject;
 
 public class QuerySigner {
+    public static class InvalidQueryException extends Exception {
+        InvalidQueryException() {
+            super("Query invalid");
+        }
+    }
 
     public static void runRegistry() {
         try {
-            QuerySignerApiImplementation api = new QuerySignerApiImplementation();
+            // TODO reading from files
+            String publicKey = System.getProperty("public_key");
+            String privateKey = System.getProperty("private_key");
+            QuerySignerApiImplementation api = new QuerySignerApiImplementation(publicKey.getBytes(), privateKey.getBytes());
             QuerySignerApi apiStub =
                     (QuerySignerApi) UnicastRemoteObject.exportObject(api, 0);
             Registry registry = LocateRegistry.getRegistry();
diff --git a/src/main/java/pl/edu/mimuw/cloudatlas/querysigner/QuerySignerApiImplementation.java b/src/main/java/pl/edu/mimuw/cloudatlas/querysigner/QuerySignerApiImplementation.java
index 38a86c6..d1c0e7c 100644
--- a/src/main/java/pl/edu/mimuw/cloudatlas/querysigner/QuerySignerApiImplementation.java
+++ b/src/main/java/pl/edu/mimuw/cloudatlas/querysigner/QuerySignerApiImplementation.java
@@ -1,5 +1,6 @@
 package pl.edu.mimuw.cloudatlas.querysigner;
 
+import pl.edu.mimuw.cloudatlas.ByteSerializer;
 import pl.edu.mimuw.cloudatlas.model.ValueQuery;
 import pl.edu.mimuw.cloudatlas.querysignerapi.QuerySignerApi;
 
@@ -9,27 +10,27 @@ import javax.crypto.IllegalBlockSizeException;
 import javax.crypto.NoSuchPaddingException;
 import java.rmi.RemoteException;
 import java.security.*;
+import java.security.interfaces.RSAPrivateCrtKey;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
 
 public class QuerySignerApiImplementation implements QuerySignerApi {
+    private final static String ENCRYPTION_ALGORITHM = "RSA";
+    private final static String DIGEST_ALGORITHM = "SHA-256";
     private PublicKey publicKey;
     private PrivateKey privateKey;
-    private final static String ENCRYPTION_ALGORITHM = "RSA";
-    private final static int NUM_KEY_BITS = 1024;
     private Map<String, ValueQuery> queries;
     private Set<String> attribsSetByQueries;
+    private ByteSerializer byteSerializer;
 
-    QuerySignerApiImplementation() {
+    QuerySignerApiImplementation(byte[] serializedPublicKey, byte[] serializedPrivateKey) {
+        this.byteSerializer = new ByteSerializer();
+        this.publicKey = (PublicKey) byteSerializer.deserialize(serializedPublicKey, PublicKey.class);
+        this.privateKey = (PrivateKey) byteSerializer.deserialize(serializedPrivateKey, PrivateKey.class);
         this.queries = new HashMap<>();
         this.attribsSetByQueries = new HashSet<>();
-        try {
-            generateKeys();
-        } catch (NoSuchAlgorithmException e) {
-            e.printStackTrace();
-        }
     }
 
     private String byteArrayToString(byte[] arr, int offset, int len) {
@@ -44,19 +45,10 @@ public class QuerySignerApiImplementation implements QuerySignerApi {
         return sb.toString();
     }
 
-    private void generateKeys() throws NoSuchAlgorithmException {
-        KeyPairGenerator keyGenerator =
-                KeyPairGenerator.getInstance(ENCRYPTION_ALGORITHM);
-        keyGenerator.initialize(NUM_KEY_BITS);
-        KeyPair keyPair = keyGenerator.generateKeyPair();
-        this.privateKey = keyPair.getPrivate();
-        this.publicKey = keyPair.getPublic();
-    }
-
-    private byte[] encryptQuery(String query) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
+    private byte[] encryptQuery(byte[] query) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
         Cipher signCipher = Cipher.getInstance(ENCRYPTION_ALGORITHM);
         signCipher.init(Cipher.ENCRYPT_MODE, privateKey);
-        byte[] encryptedBytes = signCipher.doFinal(query.getBytes());
+        byte[] encryptedBytes = signCipher.doFinal(query);
         System.out.println(
                 "Bytes encrypted with " + ENCRYPTION_ALGORITHM +
                         ": " + byteArrayToString(
@@ -64,7 +56,7 @@ public class QuerySignerApiImplementation implements QuerySignerApi {
         return encryptedBytes;
     }
 
-    private String decryptQuery(byte[] encryptedQuery) throws NoSuchPaddingException, NoSuchAlgorithmException, BadPaddingException, IllegalBlockSizeException, InvalidKeyException {
+    private byte[] decryptQuery(byte[] encryptedQuery) throws NoSuchPaddingException, NoSuchAlgorithmException, BadPaddingException, IllegalBlockSizeException, InvalidKeyException {
         Cipher verifyCipher = Cipher.getInstance(ENCRYPTION_ALGORITHM);
         verifyCipher.init(Cipher.DECRYPT_MODE, publicKey);
         byte[] decryptedBytes = verifyCipher.doFinal(encryptedQuery);
@@ -72,29 +64,67 @@ public class QuerySignerApiImplementation implements QuerySignerApi {
                 "Bytes decrypted with " + ENCRYPTION_ALGORITHM +
                         ": " + byteArrayToString(
                         decryptedBytes, 0, decryptedBytes.length));
-        return new String(decryptedBytes);
+        return decryptedBytes;
+    }
+
+    private byte[] cryptographicHash(byte[] serializedQuery) throws NoSuchAlgorithmException {
+        MessageDigest digestGenerator =
+                MessageDigest.getInstance(DIGEST_ALGORITHM);
+        byte[] digest = digestGenerator.digest(serializedQuery);
+        System.out.println(
+                DIGEST_ALGORITHM + " digest: " +
+                        byteArrayToString(
+                                digest, 0, digest.length));
+        return digest;
+    }
+
+    // TODO
+    private byte[] serializeQuery(String queryName, String queryCode) {
+        return byteSerializer.serialize(queryName + queryCode);
     }
 
     @Override
-    public byte[] signQuery(String queryName, String queryCode) throws RemoteException {
+    public ValueQuery signInstallQuery(String queryName, String queryCode) throws RemoteException {
+        QueryUtils.validateQueryName(queryName);
         try {
-            return encryptQuery(queryName + queryCode);
-        } catch (NoSuchPaddingException | NoSuchAlgorithmException | InvalidKeyException | BadPaddingException | IllegalBlockSizeException e) {
+            byte[] serializedQuery = serializeQuery(queryName, queryCode);
+            byte[] hashedQuery = cryptographicHash(serializedQuery);
+            byte[] querySignature = encryptQuery(hashedQuery);
+            return new ValueQuery(queryCode, querySignature);
+        } catch (Exception e) {
             e.printStackTrace();
             throw new RemoteException(e.getLocalizedMessage());
         }
     }
 
     @Override
-    public String checkQuery(byte[] encryptedQuery, String queryName, String queryCode) throws RemoteException {
+    public void validateInstallQuery(String queryName, ValueQuery query) throws RemoteException {
+        QueryUtils.validateQueryName(queryName);
         try {
-            return decryptQuery(encryptedQuery);
-        } catch (NoSuchPaddingException | NoSuchAlgorithmException | BadPaddingException | IllegalBlockSizeException | InvalidKeyException e) {
+            byte[] decryptedQuery = decryptQuery(query.getSignature());
+            byte[] serializedQuery = serializeQuery(queryName, query.getCode());
+            byte[] hashedSerializedQuery = cryptographicHash(serializedQuery);
+            if (hashedSerializedQuery != decryptedQuery) {
+                throw new QuerySigner.InvalidQueryException();
+            }
+        } catch (NoSuchPaddingException | NoSuchAlgorithmException | BadPaddingException | IllegalBlockSizeException | InvalidKeyException | QuerySigner.InvalidQueryException e) {
             e.printStackTrace();
             throw new RemoteException(e.getLocalizedMessage());
         }
     }
 
+    // TODO
+    @Override
+    public ValueQuery signUninstallQuery(String queryName) throws RemoteException {
+        return null;
+    }
+
+    // TODO
+    @Override
+    public void validateUninstallQuery(String queryName, ValueQuery query) throws RemoteException {
+
+    }
+
     @Override
     public PublicKey getPublicKey() throws RemoteException {
         return publicKey;
-- 
cgit v1.2.3


From 81d1abbbad1f1e9c7774c7162b23fc804f7989a3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Magdalena=20Grodzi=C5=84ska?= <mag.grodzinska@gmail.com>
Date: Mon, 13 Jan 2020 20:56:01 +0100
Subject: Add reading keys from file

---
 src/main/java/pl/edu/mimuw/cloudatlas/querysigner/QueryData.java | 4 ++++
 1 file changed, 4 insertions(+)
 create mode 100644 src/main/java/pl/edu/mimuw/cloudatlas/querysigner/QueryData.java

(limited to 'src/main/java/pl/edu/mimuw/cloudatlas/querysigner')

diff --git a/src/main/java/pl/edu/mimuw/cloudatlas/querysigner/QueryData.java b/src/main/java/pl/edu/mimuw/cloudatlas/querysigner/QueryData.java
new file mode 100644
index 0000000..a09c823
--- /dev/null
+++ b/src/main/java/pl/edu/mimuw/cloudatlas/querysigner/QueryData.java
@@ -0,0 +1,4 @@
+package pl.edu.mimuw.cloudatlas.querysigner;
+
+public class QueryData {
+}
-- 
cgit v1.2.3


From 23b8714b29816b608cb3aa330b6e93610e107126 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Magdalena=20Grodzi=C5=84ska?= <mag.grodzinska@gmail.com>
Date: Mon, 13 Jan 2020 20:56:41 +0100
Subject: Create simple query data structure so that RMI doesn't blow up

---
 .../mimuw/cloudatlas/querysigner/QueryData.java    | 26 +++++++++++++++++
 .../mimuw/cloudatlas/querysigner/QuerySigner.java  | 20 ++++++++++---
 .../querysigner/QuerySignerApiImplementation.java  | 34 +++++++---------------
 3 files changed, 52 insertions(+), 28 deletions(-)

(limited to 'src/main/java/pl/edu/mimuw/cloudatlas/querysigner')

diff --git a/src/main/java/pl/edu/mimuw/cloudatlas/querysigner/QueryData.java b/src/main/java/pl/edu/mimuw/cloudatlas/querysigner/QueryData.java
index a09c823..7a85d7c 100644
--- a/src/main/java/pl/edu/mimuw/cloudatlas/querysigner/QueryData.java
+++ b/src/main/java/pl/edu/mimuw/cloudatlas/querysigner/QueryData.java
@@ -1,4 +1,30 @@
 package pl.edu.mimuw.cloudatlas.querysigner;
 
+import pl.edu.mimuw.cloudatlas.interpreter.query.Absyn.Program;
+
 public class QueryData {
+    // Original source code
+    private String code;
+    // Query signature
+    private byte[] signature;
+    // Query signing timestamp
+    private long timestamp;
+
+    public QueryData(String code, byte[] signature) {
+        this.code = code;
+        this.signature = signature;
+        this.timestamp = System.currentTimeMillis();;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public byte[] getSignature() {
+        return signature;
+    }
+
+    public long getTimestamp() {
+        return timestamp;
+    }
 }
diff --git a/src/main/java/pl/edu/mimuw/cloudatlas/querysigner/QuerySigner.java b/src/main/java/pl/edu/mimuw/cloudatlas/querysigner/QuerySigner.java
index 90a86b7..d60a75d 100644
--- a/src/main/java/pl/edu/mimuw/cloudatlas/querysigner/QuerySigner.java
+++ b/src/main/java/pl/edu/mimuw/cloudatlas/querysigner/QuerySigner.java
@@ -1,10 +1,16 @@
 package pl.edu.mimuw.cloudatlas.querysigner;
 
+import pl.edu.mimuw.cloudatlas.KeyGenerator;
+import pl.edu.mimuw.cloudatlas.agent.NewApiImplementation;
+import pl.edu.mimuw.cloudatlas.api.Api;
 import pl.edu.mimuw.cloudatlas.querysignerapi.QuerySignerApi;
 
+import java.io.IOException;
 import java.rmi.registry.LocateRegistry;
 import java.rmi.registry.Registry;
 import java.rmi.server.UnicastRemoteObject;
+import java.security.PrivateKey;
+import java.security.PublicKey;
 
 public class QuerySigner {
     public static class InvalidQueryException extends Exception {
@@ -13,12 +19,18 @@ public class QuerySigner {
         }
     }
 
+    private static QuerySignerApiImplementation initApi() throws IOException {
+        String publicKeyFile = System.getProperty("public_key_file");
+        String privateKeyFile = System.getProperty("private_key_file");
+        PublicKey publicKey = null; //KeyGenerator.getPublicKey(KeyGenerator.readKeyFromFile(publicKeyFile));
+        PrivateKey privateKey = null; // KeyGenerator.getPrivateKey(KeyGenerator.readKeyFromFile(privateKeyFile));
+        return new QuerySignerApiImplementation(publicKey, privateKey);
+    }
+
     public static void runRegistry() {
         try {
-            // TODO reading from files
-            String publicKey = System.getProperty("public_key");
-            String privateKey = System.getProperty("private_key");
-            QuerySignerApiImplementation api = new QuerySignerApiImplementation(publicKey.getBytes(), privateKey.getBytes());
+            QuerySignerApiImplementation api = initApi();
+//            NewApiImplementation apii = new NewApiImplementation(null);
             QuerySignerApi apiStub =
                     (QuerySignerApi) UnicastRemoteObject.exportObject(api, 0);
             Registry registry = LocateRegistry.getRegistry();
diff --git a/src/main/java/pl/edu/mimuw/cloudatlas/querysigner/QuerySignerApiImplementation.java b/src/main/java/pl/edu/mimuw/cloudatlas/querysigner/QuerySignerApiImplementation.java
index d1c0e7c..32bc634 100644
--- a/src/main/java/pl/edu/mimuw/cloudatlas/querysigner/QuerySignerApiImplementation.java
+++ b/src/main/java/pl/edu/mimuw/cloudatlas/querysigner/QuerySignerApiImplementation.java
@@ -10,7 +10,6 @@ import javax.crypto.IllegalBlockSizeException;
 import javax.crypto.NoSuchPaddingException;
 import java.rmi.RemoteException;
 import java.security.*;
-import java.security.interfaces.RSAPrivateCrtKey;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
@@ -25,10 +24,12 @@ public class QuerySignerApiImplementation implements QuerySignerApi {
     private Set<String> attribsSetByQueries;
     private ByteSerializer byteSerializer;
 
-    QuerySignerApiImplementation(byte[] serializedPublicKey, byte[] serializedPrivateKey) {
+    QuerySignerApiImplementation(PublicKey publicKey, PrivateKey privateKey) {// (byte[] serializedPublicKey, byte[] serializedPrivateKey) {
         this.byteSerializer = new ByteSerializer();
-        this.publicKey = (PublicKey) byteSerializer.deserialize(serializedPublicKey, PublicKey.class);
-        this.privateKey = (PrivateKey) byteSerializer.deserialize(serializedPrivateKey, PrivateKey.class);
+//        this.publicKey = (PublicKey) byteSerializer.deserialize(serializedPublicKey, PublicKey.class);
+//        this.privateKey = (PrivateKey) byteSerializer.deserialize(serializedPrivateKey, PrivateKey.class);
+        this.publicKey = publicKey;
+        this.privateKey = privateKey;
         this.queries = new HashMap<>();
         this.attribsSetByQueries = new HashSet<>();
     }
@@ -84,13 +85,13 @@ public class QuerySignerApiImplementation implements QuerySignerApi {
     }
 
     @Override
-    public ValueQuery signInstallQuery(String queryName, String queryCode) throws RemoteException {
+    public QueryData signInstallQuery(String queryName, String queryCode) throws RemoteException {
         QueryUtils.validateQueryName(queryName);
         try {
             byte[] serializedQuery = serializeQuery(queryName, queryCode);
             byte[] hashedQuery = cryptographicHash(serializedQuery);
             byte[] querySignature = encryptQuery(hashedQuery);
-            return new ValueQuery(queryCode, querySignature);
+            return new QueryData(queryCode, querySignature);
         } catch (Exception e) {
             e.printStackTrace();
             throw new RemoteException(e.getLocalizedMessage());
@@ -98,7 +99,7 @@ public class QuerySignerApiImplementation implements QuerySignerApi {
     }
 
     @Override
-    public void validateInstallQuery(String queryName, ValueQuery query) throws RemoteException {
+    public void validateInstallQuery(String queryName, QueryData query) throws RemoteException {
         QueryUtils.validateQueryName(queryName);
         try {
             byte[] decryptedQuery = decryptQuery(query.getSignature());
@@ -115,28 +116,13 @@ public class QuerySignerApiImplementation implements QuerySignerApi {
 
     // TODO
     @Override
-    public ValueQuery signUninstallQuery(String queryName) throws RemoteException {
+    public QueryData signUninstallQuery(String queryName) throws RemoteException {
         return null;
     }
 
     // TODO
     @Override
-    public void validateUninstallQuery(String queryName, ValueQuery query) throws RemoteException {
-
-    }
-
-    @Override
-    public PublicKey getPublicKey() throws RemoteException {
-        return publicKey;
-    }
+    public void validateUninstallQuery(String queryName, QueryData query) throws RemoteException {
 
-    @Override
-    public void setPublicKey(PublicKey publicKey) throws RemoteException {
-        this.publicKey = publicKey;
-    }
-
-    @Override
-    public byte[] getQuerySignature(String queryName) throws RemoteException {
-        return queries.get(queryName).getSignature();
     }
 }
-- 
cgit v1.2.3


From 8103eb7e174c7c0bb33316ae9499bbc0fbb62ea5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Magdalena=20Grodzi=C5=84ska?= <mag.grodzinska@gmail.com>
Date: Mon, 13 Jan 2020 21:54:45 +0100
Subject: Fix key generation and reading

---
 .../edu/mimuw/cloudatlas/querysigner/KeyUtils.java | 35 ++++++++++++++++++++++
 .../mimuw/cloudatlas/querysigner/QuerySigner.java  |  8 ++---
 2 files changed, 37 insertions(+), 6 deletions(-)
 create mode 100644 src/main/java/pl/edu/mimuw/cloudatlas/querysigner/KeyUtils.java

(limited to 'src/main/java/pl/edu/mimuw/cloudatlas/querysigner')

diff --git a/src/main/java/pl/edu/mimuw/cloudatlas/querysigner/KeyUtils.java b/src/main/java/pl/edu/mimuw/cloudatlas/querysigner/KeyUtils.java
new file mode 100644
index 0000000..7a543ba
--- /dev/null
+++ b/src/main/java/pl/edu/mimuw/cloudatlas/querysigner/KeyUtils.java
@@ -0,0 +1,35 @@
+package pl.edu.mimuw.cloudatlas.querysigner;
+
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.security.*;
+import java.security.spec.PKCS8EncodedKeySpec;
+import java.security.spec.X509EncodedKeySpec;
+
+public class KeyUtils {
+    private final static String ENCRYPTION_ALGORITHM = "RSA";
+
+    public static PublicKey getPublicKey(String filename){
+        try {
+            byte[] byteKey = Files.readAllBytes(Paths.get(filename));
+            X509EncodedKeySpec X509publicKey = new X509EncodedKeySpec(byteKey);
+            KeyFactory kf = KeyFactory.getInstance(ENCRYPTION_ALGORITHM);
+            return kf.generatePublic(X509publicKey);
+        } catch(Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    public static PrivateKey getPrivateKey(String filename){
+        try {
+            byte[] byteKey = Files.readAllBytes(Paths.get(filename));
+            PKCS8EncodedKeySpec PKCS8privateKey = new PKCS8EncodedKeySpec(byteKey);
+            KeyFactory kf = KeyFactory.getInstance(ENCRYPTION_ALGORITHM);
+            return kf.generatePrivate(PKCS8privateKey);
+        } catch(Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+}
diff --git a/src/main/java/pl/edu/mimuw/cloudatlas/querysigner/QuerySigner.java b/src/main/java/pl/edu/mimuw/cloudatlas/querysigner/QuerySigner.java
index d60a75d..735601d 100644
--- a/src/main/java/pl/edu/mimuw/cloudatlas/querysigner/QuerySigner.java
+++ b/src/main/java/pl/edu/mimuw/cloudatlas/querysigner/QuerySigner.java
@@ -1,8 +1,5 @@
 package pl.edu.mimuw.cloudatlas.querysigner;
 
-import pl.edu.mimuw.cloudatlas.KeyGenerator;
-import pl.edu.mimuw.cloudatlas.agent.NewApiImplementation;
-import pl.edu.mimuw.cloudatlas.api.Api;
 import pl.edu.mimuw.cloudatlas.querysignerapi.QuerySignerApi;
 
 import java.io.IOException;
@@ -22,15 +19,14 @@ public class QuerySigner {
     private static QuerySignerApiImplementation initApi() throws IOException {
         String publicKeyFile = System.getProperty("public_key_file");
         String privateKeyFile = System.getProperty("private_key_file");
-        PublicKey publicKey = null; //KeyGenerator.getPublicKey(KeyGenerator.readKeyFromFile(publicKeyFile));
-        PrivateKey privateKey = null; // KeyGenerator.getPrivateKey(KeyGenerator.readKeyFromFile(privateKeyFile));
+        PublicKey publicKey = KeyUtils.getPublicKey(publicKeyFile);
+        PrivateKey privateKey = KeyUtils.getPrivateKey(privateKeyFile);
         return new QuerySignerApiImplementation(publicKey, privateKey);
     }
 
     public static void runRegistry() {
         try {
             QuerySignerApiImplementation api = initApi();
-//            NewApiImplementation apii = new NewApiImplementation(null);
             QuerySignerApi apiStub =
                     (QuerySignerApi) UnicastRemoteObject.exportObject(api, 0);
             Registry registry = LocateRegistry.getRegistry();
-- 
cgit v1.2.3


From 12175874524e19d999880302c66b7242de47e482 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Magdalena=20Grodzi=C5=84ska?= <mag.grodzinska@gmail.com>
Date: Mon, 13 Jan 2020 22:11:22 +0100
Subject: Make query data serializable

---
 src/main/java/pl/edu/mimuw/cloudatlas/querysigner/QueryData.java | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

(limited to 'src/main/java/pl/edu/mimuw/cloudatlas/querysigner')

diff --git a/src/main/java/pl/edu/mimuw/cloudatlas/querysigner/QueryData.java b/src/main/java/pl/edu/mimuw/cloudatlas/querysigner/QueryData.java
index 7a85d7c..7801a28 100644
--- a/src/main/java/pl/edu/mimuw/cloudatlas/querysigner/QueryData.java
+++ b/src/main/java/pl/edu/mimuw/cloudatlas/querysigner/QueryData.java
@@ -1,8 +1,8 @@
 package pl.edu.mimuw.cloudatlas.querysigner;
 
-import pl.edu.mimuw.cloudatlas.interpreter.query.Absyn.Program;
+import java.io.Serializable;
 
-public class QueryData {
+public class QueryData implements Serializable {
     // Original source code
     private String code;
     // Query signature
-- 
cgit v1.2.3