diff --git a/src/GUI/PaintGUI.java b/src/GUI/PaintGUI.java index 0286c632abeecc16cdcc007106ace87f3d961a06..974a5790579193e4cde68cf0dcd4828f4eefb32f 100644 --- a/src/GUI/PaintGUI.java +++ b/src/GUI/PaintGUI.java @@ -27,8 +27,7 @@ public class PaintGUI extends JPanel { JButton clearBtn, newBtn, openBtn, saveBtn, saveAsBtn; JButton freehandBtn, lineBtn, circleBtn, rectBtn, ovalBtn, eraserBtn, textBtn; JButton colorPaletteBtn, setFontBtn; - JTextField textInput; - JTextField textSize; + JTextField textInput, textSize; JComboBox strokeOptions; JComboBox eraserSizeOptions; @@ -133,12 +132,12 @@ public class PaintGUI extends JPanel { toolbox1.add(circleBtn); toolbox1.add(rectBtn); toolbox1.add(ovalBtn); - toolbox1.add(eraserBtn); - toolbox1.add(textBtn); + toolbox1.add(strokeOptions); + toolbox2.add(textBtn); toolbox2.add(textInput); // toolbox2.add(setFontBtn); toolbox2.add(textSize); - toolbox2.add(strokeOptions); + toolbox2.add(eraserBtn); toolbox2.add(eraserSizeOptions); toolbox2.add(clearBtn); @@ -383,17 +382,4 @@ public class PaintGUI extends JPanel { drawingArea.setModeText(textString, size); } - -// public void showGUI() { -// frame = new JFrame("Shared Whiteboard System"); -// JFrame.setDefaultLookAndFeelDecorated(true); -// frame.setContentPane(global); -// -// frame.setSize(800, 600); -// frame.setLocationRelativeTo( null ); -// frame.setResizable(false); -// frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); -// frame.setVisible(true); -// } - } \ No newline at end of file diff --git a/src/client/Client.java b/src/client/Client.java index 800fac6e8eb9444b5018277491d4e3dc6cec8b47..7397f62de232d8b5184388fe2f95cd134eff63c1 100644 --- a/src/client/Client.java +++ b/src/client/Client.java @@ -11,11 +11,14 @@ import remote.IDrawingController; import java.rmi.RemoteException; import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; +import java.security.NoSuchAlgorithmException; +import java.security.NoSuchProviderException; public class Client { private final String DEFAULT_USERNAME = "Anonymous"; private final String DEFAULT_SERVER_ADDRESS = "localhost"; + private final EncryptionUpdate encryptionUpdate; private String userName; private String serverAddress; @@ -73,7 +76,7 @@ public class Client public IDrawingController getDrawingController() { return drawingController; } - public Client(String username) throws RemoteException + public Client(String username) throws RemoteException, NoSuchProviderException, NoSuchAlgorithmException { this.userName = username; this.clientUpdate = new ClientUpdate(this); @@ -81,6 +84,7 @@ public class Client this.drawingUpdate = new DrawingUpdate(this); this.startScreen = new StartScreen(this); this.applicationMain = new ApplicationMain(this); + this.encryptionUpdate = new EncryptionUpdate(); } public static void main(String[] args) @@ -143,7 +147,7 @@ public class Client if( clientController.checkPassword(password) ) { - if( clientController.join(userName, this.chatUpdate, this.clientUpdate, this.drawingUpdate) ) + if( clientController.join(userName, this.chatUpdate, this.clientUpdate, this.drawingUpdate, this.encryptionUpdate) ) { System.out.println("Connected to server"); diff --git a/src/client/EncryptionUpdate.java b/src/client/EncryptionUpdate.java new file mode 100644 index 0000000000000000000000000000000000000000..001c1295c64d042cba748e108675cbe14f3a4503 --- /dev/null +++ b/src/client/EncryptionUpdate.java @@ -0,0 +1,58 @@ +package client; + +import remote.IDrawingUpdate; +import remote.IEncryptionUpdate; + +import javax.crypto.*; +import javax.crypto.spec.SecretKeySpec; +import java.io.Serializable; +import java.rmi.RemoteException; +import java.rmi.server.UnicastRemoteObject; +import java.security.*; + +public class EncryptionUpdate extends UnicastRemoteObject implements IEncryptionUpdate, Serializable { + + private PrivateKey priv; + private PublicKey pub; + private SecretKey sharedSecretKey; + + public PublicKey getPub() { + return pub; + } + + public void setSharedKey(byte[] encryptedSharedSecretKey){ + try { + Cipher cipher = Cipher.getInstance("RSA", "SunJCE"); + cipher.init(Cipher.DECRYPT_MODE, priv); + sharedSecretKey = new SecretKeySpec(cipher.doFinal(encryptedSharedSecretKey), "AES"); + System.out.println("Client holds this shared key: "+sharedSecretKey); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } catch (NoSuchProviderException e) { + e.printStackTrace(); + } catch (NoSuchPaddingException | InvalidKeyException e) { + e.printStackTrace(); + } catch (BadPaddingException e) { + e.printStackTrace(); + } catch (IllegalBlockSizeException e) { + e.printStackTrace(); + } + + + } + + EncryptionUpdate() throws RemoteException { + try { + KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA", "SunJSSE"); + keyGen.initialize(2048); + KeyPair pair = keyGen.generateKeyPair(); + this.priv = pair.getPrivate(); + this.pub = pair.getPublic(); + + } + catch (Exception e){ + e.printStackTrace(); + } + + } +} diff --git a/src/remote/IClientController.java b/src/remote/IClientController.java index 1dcd165573a381d245924c9966d8a13367439a3f..07f812571e834b2bdf8c87499121d01095064dca 100644 --- a/src/remote/IClientController.java +++ b/src/remote/IClientController.java @@ -7,7 +7,7 @@ public interface IClientController extends Remote { enum Action {KICKOUT, ASSIGNADMIN}; - boolean join(String username, IChatUpdate clientChat, IClientUpdate clientUpdate, IDrawingUpdate clientDrawing) throws RemoteException; + boolean join(String username, IChatUpdate clientChat, IClientUpdate clientUpdate, IDrawingUpdate clientDrawing, IEncryptionUpdate encryptionUpdate) throws RemoteException; void quit(String username) throws RemoteException; diff --git a/src/remote/IEncryptionUpdate.java b/src/remote/IEncryptionUpdate.java new file mode 100644 index 0000000000000000000000000000000000000000..3e8edf3e781713db3d351e740c5a692aab733925 --- /dev/null +++ b/src/remote/IEncryptionUpdate.java @@ -0,0 +1,10 @@ +package remote; + +import java.rmi.Remote; +import java.rmi.RemoteException; +import java.security.PublicKey; + +public interface IEncryptionUpdate extends Remote { + public PublicKey getPub() throws RemoteException; + public void setSharedKey(byte[] encryptedSharedSecretKey) throws RemoteException; +} diff --git a/src/server/ClientController.java b/src/server/ClientController.java index 4c710bbc9d0fa508751c3db651f717aed06798f4..2d40ff1c1bd9ee703f860887713428c4c34619ac 100644 --- a/src/server/ClientController.java +++ b/src/server/ClientController.java @@ -1,9 +1,6 @@ package server; -import remote.IChatUpdate; -import remote.IClientUpdate; -import remote.IDrawingUpdate; -import remote.IClientController; +import remote.*; import java.io.Serializable; import java.rmi.Remote; @@ -20,13 +17,15 @@ public class ClientController extends UnicastRemoteObject implements IClientCont } @Override - public boolean join(String username, IChatUpdate clientChat, IClientUpdate clientUpdate, IDrawingUpdate clientDrawing) throws RemoteException + public boolean join(String username, IChatUpdate clientChat, IClientUpdate clientUpdate, IDrawingUpdate clientDrawing, IEncryptionUpdate encryptionUpdate) throws RemoteException { if( getUserIndex(username) < 0 ) { // user with same username is not connected server.chatController.broadcastMessageUserLogin(username); + new MySharedKey(encryptionUpdate); + User newUser = new User(username, clientChat, clientUpdate, clientDrawing); server.users.add(newUser); diff --git a/src/server/MySharedKey.java b/src/server/MySharedKey.java new file mode 100644 index 0000000000000000000000000000000000000000..e16485e2e87a5ff48c8ea4bd2bfe05757dc7802f --- /dev/null +++ b/src/server/MySharedKey.java @@ -0,0 +1,41 @@ +package server; + +import remote.IEncryptionUpdate; + +import javax.crypto.*; +import javax.crypto.spec.SecretKeySpec; +import java.rmi.RemoteException; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; +import java.security.PublicKey; +import java.util.Base64; + +public class MySharedKey { + private byte[] encryptedSharedSecretKey; + private IEncryptionUpdate encryptionUpdate; + private SecretKey sharedSecretKey; + + + public MySharedKey (IEncryptionUpdate encryptionUpdate) throws RemoteException { + this.encryptionUpdate = encryptionUpdate; + this.sharedSecretKey = new SecretKeySpec(new byte[16], "AES"); + System.out.println(sharedSecretKey); + this.encryptedSharedSecretKey = wrapKey(encryptionUpdate.getPub()); + System.out.println("Shared key on server:" + encryptedSharedSecretKey); + encryptionUpdate.setSharedKey(encryptedSharedSecretKey); + } + + private byte[] wrapKey(PublicKey clientPubKey){ + + try { + Cipher c = Cipher.getInstance("RSA", "SunJCE"); + c.init(Cipher.WRAP_MODE, clientPubKey); + byte[] result2 = c.wrap(sharedSecretKey); + return result2; + } catch (Exception e) { + e.printStackTrace(); + throw new IllegalStateException( + e); + } + } +} diff --git a/src/server/Server.java b/src/server/Server.java index 0160269bb14d69676c82e568f5521ab9d84ae94d..cb1ef67e4d58a8f673777b4324c0fc783792b1ec 100644 --- a/src/server/Server.java +++ b/src/server/Server.java @@ -4,6 +4,8 @@ import remote.IChatController; import remote.IClientController; import remote.IDrawingController; +import java.net.InetAddress; +import java.net.UnknownHostException; import java.rmi.RemoteException; import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; @@ -54,7 +56,6 @@ public class Server public void run() throws RemoteException { - LocateRegistry.createRegistry(1099); Registry registry = LocateRegistry.getRegistry(); @@ -71,5 +72,24 @@ public class Server registry.rebind(drawingControllerName, drawingController); System.out.println("Server is ready"); + + printIP(); + } + + private void printIP() + { + InetAddress inetAddress = null; + + try + { + inetAddress = InetAddress.getLocalHost(); + } + catch (UnknownHostException e) + { + e.printStackTrace(); + } + + System.out.println("IP Address:- " + inetAddress.getHostAddress()); + System.out.println("Host Name:- " + inetAddress.getHostName()); } }