diff options
Diffstat (limited to 'src/main')
4 files changed, 23 insertions, 37 deletions
| diff --git a/src/main/java/pl/edu/mimuw/cloudatlas/agent/NewApiImplementation.java b/src/main/java/pl/edu/mimuw/cloudatlas/agent/NewApiImplementation.java index 0bf4338..a2ac358 100644 --- a/src/main/java/pl/edu/mimuw/cloudatlas/agent/NewApiImplementation.java +++ b/src/main/java/pl/edu/mimuw/cloudatlas/agent/NewApiImplementation.java @@ -1,9 +1,8 @@  package pl.edu.mimuw.cloudatlas.agent; -import java.io.PrintStream; -  import java.rmi.RemoteException; +import java.security.PublicKey;  import java.util.concurrent.CompletableFuture;  import java.util.List;  import java.util.AbstractMap.SimpleImmutableEntry; @@ -12,24 +11,20 @@ import java.util.HashSet;  import java.util.Map;  import java.util.Map.Entry;  import java.util.Set; -import java.util.regex.Pattern; -import java.util.regex.Matcher;  import pl.edu.mimuw.cloudatlas.agent.messages.*; -import pl.edu.mimuw.cloudatlas.interpreter.Interpreter; -import pl.edu.mimuw.cloudatlas.interpreter.InterpreterException; -import pl.edu.mimuw.cloudatlas.interpreter.Main; -import pl.edu.mimuw.cloudatlas.interpreter.QueryResult;  import pl.edu.mimuw.cloudatlas.model.*;  import pl.edu.mimuw.cloudatlas.api.Api; -import pl.edu.mimuw.cloudatlas.querysigner.QueryData; -import pl.edu.mimuw.cloudatlas.querysigner.QueryUtils; +import pl.edu.mimuw.cloudatlas.querysigner.*;  public class NewApiImplementation implements Api {      private EventBus eventBus; +    private PublicKey publicKey;      public NewApiImplementation(EventBus eventBus) {          this.eventBus = eventBus; +        String publicKeyFile = System.getProperty("public_key_file"); +        publicKey = KeyUtils.getPublicKey(publicKeyFile);      }      public Set<String> getZoneSet() throws RemoteException { @@ -82,8 +77,9 @@ public class NewApiImplementation implements Api {      }      public void installQuery(String name, QueryData query) throws RemoteException { -        QueryUtils.validateQueryName(name);          try { +            QueryUtils.validateQueryName(name); +            QuerySignerApiImplementation.validateInstallQuery(name, query, this.publicKey);              Attribute attributeName = new Attribute(name);              ValueTime timestamp = new ValueTime(System.currentTimeMillis());              Map<Attribute, Entry<ValueQuery, ValueTime>> queries = new HashMap(); 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 735601d..b2f426e 100644 --- a/src/main/java/pl/edu/mimuw/cloudatlas/querysigner/QuerySigner.java +++ b/src/main/java/pl/edu/mimuw/cloudatlas/querysigner/QuerySigner.java @@ -16,7 +16,7 @@ public class QuerySigner {          }      } -    private static QuerySignerApiImplementation initApi() throws IOException { +    public static QuerySignerApiImplementation initApi() throws IOException {          String publicKeyFile = System.getProperty("public_key_file");          String privateKeyFile = System.getProperty("private_key_file");          PublicKey publicKey = KeyUtils.getPublicKey(publicKeyFile); 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 37264bf..3acaacf 100644 --- a/src/main/java/pl/edu/mimuw/cloudatlas/querysigner/QuerySignerApiImplementation.java +++ b/src/main/java/pl/edu/mimuw/cloudatlas/querysigner/QuerySignerApiImplementation.java @@ -22,17 +22,15 @@ public class QuerySignerApiImplementation implements QuerySignerApi {      private PrivateKey privateKey;      private Map<String, ValueQuery> queries;      private Set<String> attribsSetByQueries; -    private ByteSerializer byteSerializer; -    QuerySignerApiImplementation(PublicKey publicKey, PrivateKey privateKey) { -        this.byteSerializer = new ByteSerializer(); +    public QuerySignerApiImplementation(PublicKey publicKey, PrivateKey privateKey) {          this.publicKey = publicKey;          this.privateKey = privateKey;          this.queries = new HashMap<>();          this.attribsSetByQueries = new HashSet<>();      } -    private String byteArrayToString(byte[] arr, int offset, int len) { +    private static 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]); @@ -55,7 +53,7 @@ public class QuerySignerApiImplementation implements QuerySignerApi {          return encryptedBytes;      } -    private byte[] decryptQuery(byte[] encryptedQuery) throws NoSuchPaddingException, NoSuchAlgorithmException, BadPaddingException, IllegalBlockSizeException, InvalidKeyException { +    private static byte[] decryptQuery(byte[] encryptedQuery, PublicKey publicKey) throws NoSuchPaddingException, NoSuchAlgorithmException, BadPaddingException, IllegalBlockSizeException, InvalidKeyException {          Cipher verifyCipher = Cipher.getInstance(ENCRYPTION_ALGORITHM);          verifyCipher.init(Cipher.DECRYPT_MODE, publicKey);          byte[] decryptedBytes = verifyCipher.doFinal(encryptedQuery); @@ -66,7 +64,7 @@ public class QuerySignerApiImplementation implements QuerySignerApi {          return decryptedBytes;      } -    private byte[] cryptographicHash(byte[] serializedQuery) throws NoSuchAlgorithmException { +    private static byte[] cryptographicHash(byte[] serializedQuery) throws NoSuchAlgorithmException {          MessageDigest digestGenerator =                  MessageDigest.getInstance(DIGEST_ALGORITHM);          byte[] digest = digestGenerator.digest(serializedQuery); @@ -77,7 +75,8 @@ public class QuerySignerApiImplementation implements QuerySignerApi {          return digest;      } -    private byte[] serializeQuery(String queryName, String queryCode) { +    private static byte[] serializeQuery(String queryName, String queryCode) { +        ByteSerializer byteSerializer = new ByteSerializer();          return byteSerializer.serialize(queryName + queryCode);      } @@ -95,19 +94,15 @@ public class QuerySignerApiImplementation implements QuerySignerApi {          }      } -    @Override -    public void validateInstallQuery(String queryName, QueryData query) throws RemoteException { +    public static void validateInstallQuery(String queryName, QueryData query, PublicKey publicKey) throws RemoteException,IllegalBlockSizeException, InvalidKeyException, BadPaddingException, NoSuchAlgorithmException, NoSuchPaddingException, QuerySigner.InvalidQueryException {          QueryUtils.validateQueryName(queryName); -        try { -            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()); +        byte[] decryptedQuery = decryptQuery(query.getSignature(), publicKey); +        byte[] serializedQuery = serializeQuery(queryName, query.getCode()); +        byte[] hashedSerializedQuery = cryptographicHash(serializedQuery); +        String decryptedQueryString = byteArrayToString(decryptedQuery, 0, decryptedQuery.length); +        String hashedSerializedQueryString = byteArrayToString(hashedSerializedQuery, 0, hashedSerializedQuery.length); +        if (!decryptedQueryString.equals(hashedSerializedQueryString)) { +            throw new QuerySigner.InvalidQueryException();          }      } @@ -118,8 +113,7 @@ public class QuerySignerApiImplementation implements QuerySignerApi {      }      // TODO -    @Override -    public void validateUninstallQuery(String queryName, QueryData query) throws RemoteException { +    public static void validateUninstallQuery(String queryName, QueryData query, PublicKey publicKey) throws RemoteException {      }  } diff --git a/src/main/java/pl/edu/mimuw/cloudatlas/querysignerapi/QuerySignerApi.java b/src/main/java/pl/edu/mimuw/cloudatlas/querysignerapi/QuerySignerApi.java index 6b42d32..55f4d04 100644 --- a/src/main/java/pl/edu/mimuw/cloudatlas/querysignerapi/QuerySignerApi.java +++ b/src/main/java/pl/edu/mimuw/cloudatlas/querysignerapi/QuerySignerApi.java @@ -9,8 +9,4 @@ public interface QuerySignerApi extends Remote {      public QueryData signInstallQuery(String queryName, String queryCode) throws RemoteException;      public QueryData signUninstallQuery(String queryName) throws RemoteException; - -    public void validateInstallQuery(String queryName, QueryData query) throws RemoteException; - -    public void validateUninstallQuery(String queryName, QueryData query) throws RemoteException;  } |