diff --git a/src/main/java/fr/istic/chiffrement/Client.java b/src/main/java/fr/istic/chiffrement/Client.java index 7b2d954..23bf912 100644 --- a/src/main/java/fr/istic/chiffrement/Client.java +++ b/src/main/java/fr/istic/chiffrement/Client.java @@ -1,14 +1,24 @@ package fr.istic.chiffrement; +import javax.net.ssl.SSLSocket; +import javax.net.ssl.SSLSocketFactory; + public class Client { private static char[] PASSWORD = "654321".toCharArray(); public static void main(String[] args) throws Exception { - // Création d'un SSLContext comme pour le serveur - // avec les caractéristiques suivantes : - // + protocole utilisé : TLS - // + format de clef PKCS12 + try{ + // Création d'un SSLContext comme pour le serveur + // avec les caractéristiques suivantes : + // + protocole utilisé : TLS + // + format de clef PKCS12 + SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault(); + SSLSocket sslsocket = (SSLSocket) sslsocketfactory.createSocket("www.google.fr", 443); + }catch (Exception e){ + e.printStackTrace(); + } + // + mot de passe store et clef : variable PASSWORD plus haut (ou null) // + keystore : clientstore.keys diff --git a/src/main/java/fr/istic/chiffrement/TestSite.java b/src/main/java/fr/istic/chiffrement/TestSite.java index 071ffc5..dbd814f 100644 --- a/src/main/java/fr/istic/chiffrement/TestSite.java +++ b/src/main/java/fr/istic/chiffrement/TestSite.java @@ -1,17 +1,50 @@ package fr.istic.chiffrement; +import javax.net.ssl.SSLSession; +import javax.net.ssl.SSLSocket; +import javax.net.ssl.SSLSocketFactory; +import java.io.IOException; +import java.security.cert.Certificate; + public class TestSite { public static void main(String[] args) { - + // connecteEtAffiche("www.google.fr",443); + // connecteEtAffiche("nextinpact.com",443); + connecteEtAffiche("istic.univ-rennes1.fr", 443); } public static void connecteEtAffiche(String host, int port) { - // Creation de la socket - // Choix de la cipher suite si nécessaire (sinon laisser defaut). - // Connexion - - // Affichage des infos demandées : + SSLSocket sslsocket = null; + try { + // Creation de la socket + SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault(); + sslsocket = (SSLSocket) sslsocketfactory.createSocket(host, port); + // Choix de la cipher suite si nécessaire (sinon laisser defaut). + // Vous pouvez changer les suites autorisées ici dans exercice 2. + sslsocket.setEnabledCipherSuites(sslsocket.getSupportedCipherSuites()); + // Connexion + SSLSession ss = sslsocket.getSession(); + // Affichage des infos demandées : + System.out.println("session creation = " + ss.getCreationTime()); + System.out.println("protocol utilisé = " + ss.getProtocol()); + System.out.println("cypher suite = " + ss.getCipherSuite()); + System.out.println("identité serveur = " + ss.getPeerHost()); + System.out.println("Certificat "); + for (Certificate certificate : ss.getPeerCertificates()) { + System.out.println(certificate.toString()); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (sslsocket != null) { + try { + sslsocket.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } } } diff --git a/src/main/java/fr/istic/nio/PingPong.java b/src/main/java/fr/istic/nio/PingPong.java index d68bf3e..535f771 100644 --- a/src/main/java/fr/istic/nio/PingPong.java +++ b/src/main/java/fr/istic/nio/PingPong.java @@ -1,8 +1,97 @@ package fr.istic.nio; +import java.io.IOException; +import java.net.InetSocketAddress; +import java.nio.ByteBuffer; +import java.nio.channels.SelectionKey; +import java.nio.channels.Selector; +import java.nio.channels.ServerSocketChannel; +import java.nio.channels.SocketChannel; +import java.util.Set; +import java.util.Iterator; + public class PingPong { - public static void main(String[] args) { + private static final int PORT_NUMBER = 6969; + // Phrase ACCEPT + private static void accept(SocketChannel sc, SelectionKey key) throws IOException { + sc.configureBlocking(false); + ByteBuffer buffer = ByteBuffer.allocate(64); + sc.register(key.selector(), SelectionKey.OP_READ, buffer); + } + + // Phrase READ + private static void read(SelectionKey key) throws IOException { + SocketChannel client = (SocketChannel) key.channel(); + ByteBuffer buffer = (ByteBuffer) key.attachment(); + if (client.read(buffer) < 0) { + client.close(); + return; + } else { + buffer.flip(); + byte[] bytes = new byte[buffer.remaining()]; + buffer.get(bytes, 0, buffer.remaining()); + String message = new String(bytes); + String[] splited = message.split("\\s+"); + if (splited[0].equals("PING") && splited.length == 2) { + // On récupère le nombre pour bien le traiter sinon + // message.remplace est plus vite que ça mais c'est ptet un PING STRING + int number = Integer.parseInt(splited[1]); + buffer.clear(); + // C'est plus facile quand on a déjà le nombre ici que le transferer + // dans la partie write, donc on le fait buffer write ici + String pong = "PONG " + number; + buffer.put(pong.getBytes()); + // flip pour envoyer le buffer + buffer.flip(); + key.interestOps(SelectionKey.OP_WRITE); + + } + } + } + + // Phrase WRITE + private static void write(SelectionKey key) throws IOException { + SocketChannel client = (SocketChannel) key.channel(); + ByteBuffer buffer = (ByteBuffer) key.attachment(); + client.write(buffer); + buffer.clear(); + key.interestOps(SelectionKey.OP_READ); + } + + public static void main(String[] args) throws IOException { + ServerSocketChannel server = ServerSocketChannel.open(); + server.socket().bind(new InetSocketAddress(PORT_NUMBER)); + server.socket().setReuseAddress(true); + // Mode non bloquant + server.configureBlocking(false); + + // Création du sélecteur + Selector selector = Selector.open(); + server.register(selector, SelectionKey.OP_ACCEPT); + + while (true) { + int channelcount = selector.select(); + if (channelcount > 0) { + Set keys = selector.selectedKeys(); + Iterator iterator = keys.iterator(); + while (iterator.hasNext()) { + SelectionKey key = iterator.next(); + iterator.remove(); + if (!key.isValid()) { + continue; + } + if (key.isAcceptable()) { + SocketChannel client = server.accept(); + accept(client, key); + } else if (key.isReadable()) { + read(key); + } else if (key.isWritable()) { + write(key); + } + } + } + } } }