Skip to content
This repository has been archived by the owner on Dec 8, 2022. It is now read-only.

Commit

Permalink
prepared write for writeback, servers now write their own state file,…
Browse files Browse the repository at this point in the history
… client credentials now re-asked upon access denied
  • Loading branch information
duartegithub committed May 5, 2020
1 parent 0d14e6c commit 6b4d1a7
Show file tree
Hide file tree
Showing 9 changed files with 73 additions and 51 deletions.
Binary file removed Client/data/keys/client1_public_key.der
Binary file not shown.
52 changes: 35 additions & 17 deletions Client/src/main/java/sec/project/client/Client.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import sec.project.library.ReadView;

import java.io.*;
import java.rmi.ConnectException;
import java.security.*;
import java.util.*;

Expand Down Expand Up @@ -38,28 +39,37 @@ public Client (Map<Integer, ClientAPI> stubs) {
this.scanner = new Scanner(System.in);
System.out.println("\nInsert the client number:");
this.clientNumber = scanner.nextLine();
System.out.println("\nInsert your KeyStore's password:");
this.keyStorePassword = new String(System.console().readPassword());
System.out.println("\nInsert your Private Key's password:");
this.privateKeyPassword = new String(System.console().readPassword());
this.serverPublicKeys = new HashMap<>();

try {
while (true){
System.out.println("\nInsert your KeyStore's password:");
this.keyStorePassword = new String(System.console().readPassword());
System.out.println("\nInsert your Private Key's password:");
this.privateKeyPassword = new String(System.console().readPassword());
this.serverPublicKeys = new HashMap<>();

this.clientKeyStore = AsymmetricCrypto.getKeyStore("data/keys/client" + this.clientNumber + "_keystore.jks", this.keyStorePassword);
this.clientPrivateKey = AsymmetricCrypto.getPrivateKey(this.clientKeyStore, this.privateKeyPassword, "client" + this.clientNumber);
this.clientPublicKey = AsymmetricCrypto.getPublicKeyFromCert("data/keys/client" + this.clientNumber + "_certificate.crt");

for(Map.Entry<Integer, ClientAPI> entry : stubs.entrySet()){
PublicKey serverPublicKey = AsymmetricCrypto.getPublicKeyFromCert("data/keys/server" + entry.getKey().intValue() + "_certificate.crt");
serverPublicKeys.put(serverPublicKey, entry.getValue());
}
try {

} catch (Exception e) {
this.clientKeyStore = AsymmetricCrypto.getKeyStore("data/keys/client" + this.clientNumber + "_keystore.jks", this.keyStorePassword);
this.clientPrivateKey = AsymmetricCrypto.getPrivateKey(this.clientKeyStore, this.privateKeyPassword, "client" + this.clientNumber);
this.clientPublicKey = AsymmetricCrypto.getPublicKeyFromCert("data/keys/client" + this.clientNumber + "_certificate.crt");

e.printStackTrace();
for (Map.Entry<Integer, ClientAPI> entry : stubs.entrySet()) {
PublicKey serverPublicKey = AsymmetricCrypto.getPublicKeyFromCert("data/keys/server" + entry.getKey().intValue() + "_certificate.crt");
serverPublicKeys.put(serverPublicKey, entry.getValue());
}

} catch (IOException e) {
System.out.println("\n-------------------------------------------------------------\n" + "Wrong credentials. Access Denied.");
continue;
} catch (UnrecoverableKeyException e){
System.out.println("\n-------------------------------------------------------------\n" + "Wrong credentials. Access Denied.");
continue;
} catch (Exception e) {
e.printStackTrace();
}
break;
}

}

public void execute() {
Expand All @@ -84,7 +94,15 @@ public void execute() {
for (Map.Entry<PublicKey, ClientAPI> entry : serverPublicKeys.entrySet()) {
response = entry.getValue().login(this.clientPublicKey);
if (AsymmetricCrypto.validateDigitalSignature(response.getSignature(), entry.getKey(), response.getMessage())) {
this.postWts = Integer.parseInt(response.getMessage());
String[] responses = response.getMessage().split("|");
if(responses.length >= 3){
if (Integer.parseInt(responses[0]) > this.postWts){
this.postWts = Integer.parseInt(responses[0]);
}
if (Integer.parseInt(responses[2]) > this.postGeneralWts){
this.postGeneralWts = Integer.parseInt(responses[2]);
}
}
}
}

Expand Down
4 changes: 4 additions & 0 deletions Client/src/main/java/sec/project/client/ClientInit.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import sec.project.library.ClientAPI;

import java.rmi.ConnectException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.security.*;
Expand Down Expand Up @@ -45,6 +46,9 @@ public ClientInit(String[] portsArray){
System.err.println( "\nClient ready." );
client.execute();

} catch (ConnectException e){
System.out.println("\nServers aren't listening in one or more of the inserted ports.");

} catch (Exception e) {

System.err.println("\nClient exception: " + e.toString());
Expand Down
16 changes: 6 additions & 10 deletions Server/src/main/java/sec/project/server/Announcement.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,9 @@ public Announcement(int number, Triplet<Integer, String, byte[]> triplet, ArrayL
String message = triplet.getValue1();
String [] ref = message.substring(message.indexOf("|")+1, message.length()).split(" ");

if(existingReferences != null){
for(int i=1; i<ref.length; i++){
if(existingReferences.contains(Integer.valueOf(ref[i]))){
this.references.add(Integer.valueOf(ref[i]));
}
for(int i=1; i<ref.length; i++){
if(existingReferences.contains(Integer.valueOf(ref[i]))){
this.references.add(Integer.valueOf(ref[i]));
}
}
}
Expand All @@ -40,11 +38,9 @@ public Announcement(int number, Quartet<Integer, String, String, byte[]> quartet
String message = quartet.getValue1();
String [] ref = message.substring(message.indexOf("|")+1, message.length()).split(" ");

if(existingReferences != null){
for(int i=1; i<ref.length; i++){
if(existingReferences.contains(Integer.valueOf(ref[i]))){
this.references.add(Integer.valueOf(ref[i]));
}
for(int i=1; i<ref.length; i++){
if(existingReferences.contains(Integer.valueOf(ref[i]))){
this.references.add(Integer.valueOf(ref[i]));
}
}
}
Expand Down
8 changes: 3 additions & 5 deletions Server/src/main/java/sec/project/server/ClientLibrary.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,28 +22,26 @@ public class ClientLibrary implements Serializable {
private Map<Integer, Announcement> announcements;
private OneNAtomicRegister oneNAtomicRegister;
private PublicKey clientPublicKey;
private int maxWts;

public ClientLibrary(String clientNumber, PublicKey clientPublicKey){
this.clientNumber = clientNumber;
this.clientPublicKey = clientPublicKey;
this.maxWts = 0;
this.announcements = new HashMap<>();
this.oneNAtomicRegister = new OneNAtomicRegister(this);
}

public synchronized void addAnnouncement(Triplet<Integer, String, byte[]> triplet){
Announcement announcement = new Announcement(announcements.size() + 1, triplet, getExistingReferences());
this.announcements.put(triplet.getValue0(), announcement);
if (maxWts < triplet.getValue0()) {
maxWts = triplet.getValue0();
}
System.out.println("\nOn client" + clientNumber + "'s board:"+ announcement.printAnnouncement());
}

public ArrayList<Quartet<Integer, String, byte[], ArrayList<Integer>>> getAnnouncementsTriplets(int number){
ArrayList<Quartet<Integer, String, byte[], ArrayList<Integer>>> result = new ArrayList<>();

//this must be in the beginning of the method to avoid concurrent changes in the maxWts during this method.
int maxWts = this.oneNAtomicRegister.getWts();

int aux;
if(announcements.size() < number){
aux = announcements.size();
Expand Down
16 changes: 11 additions & 5 deletions Server/src/main/java/sec/project/server/GeneralBoard.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ public class GeneralBoard implements Serializable {

private Map<Integer, Announcement> announcements;
private NNRegularRegister nNRegularRegister;
int maxWts;

public GeneralBoard(){
this.announcements = new HashMap<>();
Expand All @@ -32,15 +31,15 @@ public GeneralBoard(){
public synchronized void addAnnouncement(Quartet<Integer, String, String, byte[]> quartet){
Announcement announcement = new Announcement(announcements.size()+1, quartet, getExistingReferences());
this.announcements.put(quartet.getValue0(), announcement);
if (maxWts < quartet.getValue0()) {
maxWts = quartet.getValue0();
}
System.out.println("\nOn the General Board:"+ announcement.printAnnouncement());
}

public ArrayList<Quintet<Integer, String, String, byte[], ArrayList<Integer>>> getAnnouncementsQuartets(int number){
ArrayList<Quintet<Integer, String, String, byte[], ArrayList<Integer>>> result = new ArrayList<>();

//this must be in the beginning of the method to avoid concurrent changes in the maxWts during this method.
int maxWts = this.nNRegularRegister.getWts();

int aux;
if(announcements.size() < number){
aux = announcements.size();
Expand All @@ -56,9 +55,16 @@ public ArrayList<Quintet<Integer, String, String, byte[], ArrayList<Integer>>> g
}

public ArrayList<Integer> getExistingReferences(){
return new ArrayList<>(this.announcements.keySet());
ArrayList<Integer> result = new ArrayList<>(this.announcements.keySet());
if (result == null){
return new ArrayList<>();
}

return result;
}

public NNRegularRegister getnNRegularRegister() { return this.nNRegularRegister; }

public String write(int wts, String message, String clientNumber, byte[] signature, PublicKey clientPublicKey) throws NoSuchPaddingException,
UnsupportedEncodingException, IllegalBlockSizeException, BadPaddingException, NoSuchAlgorithmException, InvalidKeyException {

Expand Down
10 changes: 4 additions & 6 deletions Server/src/main/java/sec/project/server/NNRegularRegister.java
Original file line number Diff line number Diff line change
Expand Up @@ -36,16 +36,14 @@ public String write(int wts, String value, String clientNumber, byte[] signature
UnsupportedEncodingException, NoSuchAlgorithmException, IllegalBlockSizeException, BadPaddingException,
InvalidKeyException {

System.out.println(AsymmetricCrypto.validateDigitalSignature(signature, clientPublicKey,
value + wts + clientNumber) && wts > this.wts);

if (AsymmetricCrypto.validateDigitalSignature(signature, clientPublicKey,
value + wts + clientNumber) && wts > this.wts){
value + wts + clientNumber) && !this.generalBoard.getExistingReferences().contains(wts)){

this.valueQuartet = new Quartet<>(wts, value, clientNumber, signature);
this.generalBoard.addAnnouncement(this.valueQuartet);
this.wts = wts;
System.out.println("DEBUG2: " + value + "|" + wts + "|" + clientNumber + "|" + this.wts);
if(wts > this.wts){
this.wts = wts;
}
}

//merely representative, the method never returns this.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,11 +37,13 @@ public String write(int wts, String value, byte[] signature) throws NoSuchPaddin
InvalidKeyException {

if (AsymmetricCrypto.validateDigitalSignature(signature, this.clientLibrary.getClientPublicKey(),
value + wts) && wts > this.wts){
value + wts) && !this.clientLibrary.getExistingReferences().contains(wts)){

this.valueTriplet = new Triplet<>(wts, value, signature);
this.clientLibrary.addAnnouncement(this.valueTriplet);
this.wts = wts;
if (wts > this.wts){
this.wts = wts;
}
return "ACK";
}

Expand Down
12 changes: 6 additions & 6 deletions Server/src/main/java/sec/project/server/Server.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
public class Server implements ClientAPI {

private int nServers;
private int serverPort;
private KeyStore serverKeyStore;
private PrivateKey serverPrivateKey;
private PublicKey serverPublicKey;
Expand All @@ -28,6 +29,7 @@ public class Server implements ClientAPI {
public Server (int serverPort, int nServers){

this.nServers = nServers;
this.serverPort = serverPort;

try {

Expand All @@ -48,7 +50,7 @@ public Server (int serverPort, int nServers){
public void saveState() throws IOException {

State state = new State(this.clientList, this.generalBoard);
FileOutputStream f = new FileOutputStream(new File("data/state.txt"));
FileOutputStream f = new FileOutputStream(new File("data/state" + this.serverPort + ".txt"));
ObjectOutputStream o = new ObjectOutputStream(f);

o.writeObject(state);
Expand All @@ -59,7 +61,7 @@ public void saveState() throws IOException {

public void loadState() throws IOException, ClassNotFoundException {

File stateFile = new File("data/state.txt");
File stateFile = new File("data/state" + this.serverPort + ".txt");

if (!(stateFile.exists())) {

Expand Down Expand Up @@ -160,9 +162,7 @@ public Acknowledge postGeneral(PublicKey clientPublicKey, String message, int wt
System.out.println("\n-------------------------------------------------------------\n" +
"client" + clientList.get(clientPublicKey).getClientNumber() + " called postGeneral() method.");

System.out.println(message + wts);
String ack = this.generalBoard.write(wts, message, clientList.get(clientPublicKey).getClientNumber(), signature, clientPublicKey);
System.out.println(message + wts);
saveState();
return new Acknowledge(wts, ack, AsymmetricCrypto.wrapDigitalSignature(ack + wts, this.serverPrivateKey));

Expand Down Expand Up @@ -204,7 +204,7 @@ public ReadView read(PublicKey toReadClientPublicKey, int number, int rid , byte

try{
System.out.println("\n-------------------------------------------------------------\n" +
"A client called the read() method to read client" + clientList.get(toReadClientPublicKey).getClientNumber() + "'s announcements.");
"client called the read() method to read client" + clientList.get(toReadClientPublicKey).getClientNumber() + "'s announcements.");

ArrayList<Quartet<Integer, String, byte[], ArrayList<Integer>>> triplets = this.clientList.get(toReadClientPublicKey).read(number, rid, signature, clientPublicKey);
return new ReadView(triplets, rid, AsymmetricCrypto.wrapDigitalSignature(AsymmetricCrypto.transformTripletToString(triplets) + rid, this.serverPrivateKey));
Expand Down Expand Up @@ -280,7 +280,7 @@ public ReadView readGeneral(int number, int rid, byte[] signature, PublicKey cli
public Acknowledge login(PublicKey clientPublicKey) throws RemoteException {

try {
String message = "" + this.clientList.get(clientPublicKey).getOneNRegularRegister().getWts();
String message = "" + this.clientList.get(clientPublicKey).getOneNRegularRegister().getWts() + "|" + this.generalBoard.getnNRegularRegister().getRid();
return new Acknowledge(message, AsymmetricCrypto.wrapDigitalSignature(message, this.serverPrivateKey));
} catch (Exception e) {
e.printStackTrace();
Expand Down

0 comments on commit 6b4d1a7

Please sign in to comment.