/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package Protocole; import Bean.Jdbc_MySQL; import Securite.KeyExchange; import java.beans.Beans; import java.io.IOException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.security.NoSuchProviderException; import java.util.logging.Level; import java.util.logging.Logger; import Securite.MyCertificate; import Securite.SignatureWithCertificate; import Utils.Cryptage; import java.security.InvalidKeyException; import java.security.PublicKey; import java.security.Signature; import java.security.SignatureException; import java.sql.ResultSet; import java.util.LinkedList; import java.util.Random; import javax.crypto.SecretKey; public class RLP { MyCertificate myCertificateClient; MyCertificate myCertificateServer; Cryptage cryptageServer; SecretKey cleSession; int number1 = 0; String ou = null; public static String LOGIN = "LOGIN"; public static String LOGIN_OUI = "LOGIN_OUI"; public static String LOGIN_NON = "LOGIN_NON"; public static String NONCE = "NONCE"; public static String LOGIN_NEXT_STEP = "LOGIN_NEXT_STEP"; public static String KEY_EXCHANGE = "KEY_EXCHANGE"; public static String SESSION_KEY = "SESSION_KEY"; public static String BDROOM = "BDROOM"; public static String BDROOM_OUI = "BDROOM_OUI"; public static String BDROOM_NON = "BDROOM_NON"; public static String ARROOM = "ARROOM"; public static String ARROOM_OUI = "ARROOM_OUI"; public static String ARROOM_NON = "ARROOM_NON"; public static String MISROOM = "MISROOM"; public static String MISROOM_OUI = "ARROOM_OUI"; public static String MISROOM_NON = "MISROOM_NON"; public static String ERROR = "ERROR"; public RLP(){ } public RLP(MyCertificate myCertificateClient){ this.myCertificateClient = myCertificateClient; this.ou = "client"; } public RLP(MyCertificate myCertificateServer, int bidon){ this.myCertificateServer = myCertificateServer; this.cryptageServer = new Cryptage(myCertificateServer); this.ou = "server"; } PacketCom messageFromClient(Object objet) { PacketCom packet = (PacketCom) objet; PacketCom messageToClient = traiterPacketServerSide(packet); return messageToClient; } PacketCom messageFromServer(Object objet) { PacketCom packet = (PacketCom) objet; PacketCom message = traiterPacketClientSide(packet); return message; } private PacketCom traiterPacketServerSide(PacketCom packet) { String type = packet.getType(); System.out.println("type reçu: " + type); Object contenu = packet.getObjet(); System.out.println("Reçu: " + type); if (type.equals(RLP.LOGIN)) { number1 = new Random().nextInt(10000); return new PacketCom(RLP.NONCE, (Object)number1); }else if(type.equals(RLP.LOGIN_NEXT_STEP)){ Object[] infos = (Object[]) contenu; String login = (String) infos[0]; byte[] digest = (byte[]) infos[1]; int number2 = (Integer) infos[2]; String password = getPassword(login); if(password == null){ return new PacketCom(RLP.LOGIN_NON, "LOGIN_NON"); } byte[] digest2 = generateDigest(login, password, number1, number2); if(digestCorrect(digest, digest2)){ return new PacketCom(RLP.LOGIN_OUI, "LOGIN_OUI"); }else{ return new PacketCom(RLP.LOGIN_NON, "LOGIN_NON"); } }else if(type.equals(RLP.KEY_EXCHANGE)){ SignatureWithCertificate swc = (SignatureWithCertificate) contenu; if(!signatureCorrect(swc)){ return new PacketCom(RLP.ERROR, "La signature est incorecte"); } myCertificateClient = new MyCertificate(swc.getCertificate()); KeyExchange keyExchange = new KeyExchange(); keyExchange.setCertificatServeur(myCertificateServer.getCertificate()); keyExchange.setCertificatClient(swc.getCertificate()); PublicKey clePublic = swc.getCertificate().getPublicKey(); cleSession = cryptageServer.getSessionKey("DES"); byte[] cleSessionByte = cryptageServer.cleSessionToByte(cleSession); byte[] messageCrypter = cryptageServer.crypt(Cryptage.RSA, cleSessionByte, clePublic); keyExchange.setCleSession(messageCrypter); return new PacketCom(RLP.SESSION_KEY, (Object)keyExchange); }else if(type.equals(RLP.BDROOM)){ Object[] infos = (Object[]) contenu; String date = (String) infos[0]; byte[] signature = (byte[]) infos[1]; if(!signatureCorrect(new SignatureWithCertificate(myCertificateClient.getCertificate(), signature))){ return new PacketCom(RLP.BDROOM_NON, "La signature du responsable est incorecte"); } return listeReservations(date); }else if(type.equals(RLP.ARROOM)){ Object[] infos = (Object[]) contenu; String numChambre = (String)infos[0]; String nomClient = (String)infos[1]; String date = (String)infos[2]; byte[] signature = (byte[]) infos[3]; if(!signatureCorrect(new SignatureWithCertificate(myCertificateClient.getCertificate(), signature))){ return new PacketCom(RLP.ARROOM_NON, "La signature du responsable est incorecte"); } return titulaireArrive(numChambre, nomClient, date); }else if(type.equals(RLP.MISROOM)){ Object[] infos = (Object[]) contenu; String numChambre = (String)infos[0]; String nomClient = (String)infos[1]; String date = (String)infos[2]; byte[] signature = (byte[]) infos[3]; if(!signatureCorrect(new SignatureWithCertificate(myCertificateClient.getCertificate(), signature))){ return new PacketCom(RLP.MISROOM_NON, "La signature du responsable est incorecte"); } return titulaireRetard(numChambre, nomClient, date); }else{ return new PacketCom(RLP.ERROR, "ERROR"); } } private PacketCom traiterPacketClientSide(PacketCom packet) { String type = packet.getType(); Object contenu = packet.getObjet(); System.out.println("Reçu: " + type); if (type.equals(RLP.LOGIN_OUI)) { return packet; }else if (type.equals(RLP.LOGIN_NON)) { return packet; }else if (type.equals(RLP.NONCE)) { return packet; }else if (type.equals(RLP.SESSION_KEY)) { return packet; }else if (type.equals(RLP.BDROOM_OUI)) { return packet; }else if (type.equals(RLP.BDROOM_NON)) { return packet; }else if (type.equals(RLP.ARROOM_OUI)) { return packet; }else if (type.equals(RLP.ARROOM_NON)) { return packet; }else if (type.equals(RLP.MISROOM_OUI)) { return packet; }else if (type.equals(RLP.MISROOM_NON)) { return packet; }else { PacketCom packetReponse = new PacketCom(RLP.ERROR, "ERROR"); return packetReponse; } } private String getPassword(String login) { String password = null; try{ Jdbc_MySQL dbsql = (Jdbc_MySQL) Beans.instantiate(null, "Bean.Jdbc_MySQL"); dbsql.init(); String request = "SELECT password FROM gestionnaires where login = '"+ login +"'"; Object tuples = dbsql.select(request); String userFound = dbsql.extract(tuples, 1, "password"); if(userFound != null){ password = userFound; } dbsql.endExtract(); dbsql.Disconnect(); } catch (IOException ex) { Logger.getLogger(RLP.class.getName()).log(Level.SEVERE, null, ex); } catch (ClassNotFoundException ex) { Logger.getLogger(RLP.class.getName()).log(Level.SEVERE, null, ex); } catch (Exception ex) { Logger.getLogger(RLP.class.getName()).log(Level.SEVERE, null, ex); } return password; } private byte[] generateDigest(String login, String password, int number1, int number2) { try { MessageDigest md = MessageDigest.getInstance("SHA-1", "BC"); md.update(String.valueOf(number1).getBytes()); md.update(login.getBytes()); md.update(password.getBytes()); md.update(String.valueOf(number2).getBytes()); byte[] digest = md.digest(); return digest; } catch (NoSuchAlgorithmException ex) { Logger.getLogger(RLP.class.getName()).log(Level.SEVERE, null, ex); } catch (NoSuchProviderException ex) { Logger.getLogger(RLP.class.getName()).log(Level.SEVERE, null, ex); } return null; } private boolean digestCorrect(byte[] digest, byte[] digest2) { boolean retour = false; retour = MessageDigest.isEqual(digest, digest2); return retour; } private boolean signatureCorrect(SignatureWithCertificate swc) { byte[] signatureAvant = swc.getSignature(); boolean verif = false; Signature signature; try { signature = Signature.getInstance("SHA1WithRSA", "BC"); signature.initVerify(swc.getCertificate().getPublicKey()); verif = signature.verify(signatureAvant); } catch (NoSuchAlgorithmException ex) { Logger.getLogger(RLP.class.getName()).log(Level.SEVERE, null, ex); } catch (NoSuchProviderException ex) { Logger.getLogger(RLP.class.getName()).log(Level.SEVERE, null, ex); } catch (InvalidKeyException ex) { Logger.getLogger(RLP.class.getName()).log(Level.SEVERE, null, ex); } catch (SignatureException ex) { Logger.getLogger(RLP.class.getName()).log(Level.SEVERE, null, ex); } return verif; } private synchronized PacketCom listeReservations(String date) { LinkedList<String> listeReservation = getListeReservation(date); return new PacketCom(RLP.BDROOM_OUI, (Object)listeReservation); } private synchronized PacketCom titulaireArrive(String numChambre, String nomClient, String date) { int numeroClient = -1; numeroClient = getNumeroClient(nomClient); if(numeroClient == -1){ return new PacketCom(RLP.ARROOM_NON, "Le client n'existe pas."); } int idReservation = -1; idReservation = getIdReservationWithDate(numChambre, numeroClient, date); if(idReservation == -1){ return new PacketCom(RLP.ARROOM_NON, "la réservation n'existe pas."); } return new PacketCom(RLP.ARROOM_OUI, "ARROOM_OUI"); } private synchronized PacketCom titulaireRetard(String numChambre, String nomClient, String date) { int numeroClient = -1; numeroClient = getNumeroClient(nomClient); if(numeroClient == -1){ return new PacketCom(RLP.MISROOM_NON, "Le client n'existe pas."); } int idReservation = -1; idReservation = getIdReservationWithDate(numChambre, numeroClient, date); if(idReservation == -1){ return new PacketCom(RLP.MISROOM_NON, "la réservation n'existe pas."); } return new PacketCom(RLP.MISROOM_OUI, "MISROOM_OUI"); } private LinkedList<String> getListeReservation(String date) { LinkedList<String> listeReservation = new LinkedList<>(); try{ Jdbc_MySQL dbsql = (Jdbc_MySQL) Beans.instantiate(null, "Bean.Jdbc_MySQL"); dbsql.init(); String request = "SELECT numeroChambre, dateArrivee, client FROM reservationschambre where dateArrivee = '"+date+"'"; ResultSet tuples = (ResultSet) dbsql.select(request); while(tuples.next()){ int numeroChambre = tuples.getInt("numeroChambre"); String dateArrivee = tuples.getString("dateArrivee"); int client = tuples.getInt("client"); String nomClient = getNomClient(client); String details = getDetails(numeroChambre); String message = "[" + details + "]" + dateArrivee + " => " + numeroChambre + " => " + nomClient; listeReservation.add(message); } dbsql.endExtract(); dbsql.Disconnect(); } catch (IOException ex) { Logger.getLogger(RLP.class.getName()).log(Level.SEVERE, null, ex); } catch (ClassNotFoundException ex) { Logger.getLogger(RLP.class.getName()).log(Level.SEVERE, null, ex); } catch (Exception ex) { Logger.getLogger(RLP.class.getName()).log(Level.SEVERE, null, ex); } return listeReservation; } private String getNomClient(int numeroClient) { String nomClient = null; try{ Jdbc_MySQL dbsql = (Jdbc_MySQL) Beans.instantiate(null, "Bean.Jdbc_MySQL"); dbsql.init(); String request = "SELECT nom from voyageurs where id = '"+numeroClient+"'"; Object tuples = dbsql.select(request); nomClient = dbsql.extract(tuples, 1, "nom"); dbsql.endExtract(); dbsql.Disconnect(); } catch (IOException ex) { Logger.getLogger(RLP.class.getName()).log(Level.SEVERE, null, ex); } catch (ClassNotFoundException ex) { Logger.getLogger(RLP.class.getName()).log(Level.SEVERE, null, ex); } catch (Exception ex) { Logger.getLogger(RLP.class.getName()).log(Level.SEVERE, null, ex); } return nomClient; } private String getDetails(int numeroChambre) { String categorie = null; String type = null; String retour = null; try{ Jdbc_MySQL dbsql = (Jdbc_MySQL) Beans.instantiate(null, "Bean.Jdbc_MySQL"); dbsql.init(); String request = "SELECT catégorie, type from detailschambre where numeroChambre = '"+numeroChambre+"'"; Object tuples = dbsql.select(request); categorie = dbsql.extract(tuples, 1, "catégorie"); type = dbsql.extract(tuples, 1, "type"); retour = categorie + "-" + type; dbsql.endExtract(); dbsql.Disconnect(); } catch (IOException ex) { Logger.getLogger(RLP.class.getName()).log(Level.SEVERE, null, ex); } catch (ClassNotFoundException ex) { Logger.getLogger(RLP.class.getName()).log(Level.SEVERE, null, ex); } catch (Exception ex) { Logger.getLogger(RLP.class.getName()).log(Level.SEVERE, null, ex); } return retour; } private int getNumeroClient(String nomClient) { int numeroClient = -1; try{ Jdbc_MySQL dbsql = (Jdbc_MySQL) Beans.instantiate(null, "Bean.Jdbc_MySQL"); dbsql.init(); String request = "SELECT id FROM voyageurs where nom = '"+ nomClient +"'"; Object tuples = dbsql.select(request); String userFound = dbsql.extract(tuples, 1, "id"); if(userFound != null){ numeroClient = Integer.parseInt(userFound); } dbsql.endExtract(); dbsql.Disconnect(); } catch (IOException ex) { Logger.getLogger(RLP.class.getName()).log(Level.SEVERE, null, ex); } catch (ClassNotFoundException ex) { Logger.getLogger(RLP.class.getName()).log(Level.SEVERE, null, ex); } catch (Exception ex) { Logger.getLogger(RLP.class.getName()).log(Level.SEVERE, null, ex); } return numeroClient; } private int getIdReservationWithDate(String numChambre, int numeroClient, String dateReservaton) { int idReservation = -1; try{ Jdbc_MySQL dbsql = (Jdbc_MySQL) Beans.instantiate(null, "Bean.Jdbc_MySQL"); dbsql.init(); String request = "SELECT numeroReservation FROM reservationschambre where numeroChambre = '"+ numChambre +"' and client = '"+ numeroClient +"' and dateArrivee = '"+dateReservaton+"'"; Object tuples = dbsql.select(request); String reservationFound = dbsql.extract(tuples, 1, "numeroReservation"); if(reservationFound != null){ idReservation = Integer.parseInt(reservationFound); } dbsql.endExtract(); dbsql.Disconnect(); } catch (IOException ex) { Logger.getLogger(RLP.class.getName()).log(Level.SEVERE, null, ex); } catch (ClassNotFoundException ex) { Logger.getLogger(RLP.class.getName()).log(Level.SEVERE, null, ex); } catch (Exception ex) { Logger.getLogger(RLP.class.getName()).log(Level.SEVERE, null, ex); } return idReservation; } }