Changeset 126


Ignore:
Timestamp:
Nov 18, 2012 8:35:34 PM (5 years ago)
Author:
psaiteja
Message:

added signature verification while sending hash entries to users.

Location:
VSNServer/src
Files:
1 added
1 edited

Legend:

Unmodified
Added
Removed
  • VSNServer/src/ServerProxy.java

    r124 r126  
    44import java.util.*; 
    55import java.security.*; 
     6import java.security.spec.*; 
    67import java.sql.Connection; 
    78import java.sql.DatabaseMetaData; 
     
    3132        private int m_threshold = (int)((hashentrysize*max_users+1.206*(alpha*RTTlatency+hashentrysize))/(1.4004*alpha*RTTlatency+hashentrysize*2.4004)); 
    3233         
     34        KeyPair keypair = null; 
     35         
    3336        private int UDPport = DEFAULT_UDP_PORT; 
    3437        private UDPServerThread udpthread; 
     
    6063                System.err.println("  **  Starting Server on port " + port + ". Press CTRL-C to end.  **\n"); 
    6164                ServerProxy sp = new ServerProxy(port,udp_port, 5, alpha_main, maxusers_main); 
     65                try{ 
     66                        String path = ServerProxy.class.getProtectionDomain().getCodeSource().getLocation().getPath(); 
     67                        path = URLDecoder.decode(path, "UTF-8"); 
     68                        System.out.println(path); 
     69                        sp.keypair = sp.LoadKeyPair(path,"DSA"); 
     70                        System.out.println("Got the Key pair"); 
     71                }catch(Exception e){ 
     72                        System.out.println("Unable to read the public and private keys"); 
     73                        return; 
     74                } 
    6275                //sp.setDebug(1, System.out);            
    6376                sp.start(); 
     
    120133        public void setMThreshold(){ 
    121134                m_threshold = (int)((hashentrysize*max_users+1.206*(alpha*RTTlatency+hashentrysize))/(1.4004*alpha*RTTlatency+hashentrysize*2.4004)); 
     135        } 
     136         
     137        public KeyPair LoadKeyPair(String path, String algorithm) 
     138                        throws IOException, NoSuchAlgorithmException, 
     139                        InvalidKeySpecException { 
     140                // Read Public Key. 
     141                File filePublicKey = new File(path + "/public.key"); 
     142                FileInputStream in = new FileInputStream(path + "/public.key"); 
     143                byte[] encodedPublicKey = new byte[(int) filePublicKey.length()]; 
     144                in.read(encodedPublicKey); 
     145                in.close(); 
     146  
     147                // Read Private Key. 
     148                File filePrivateKey = new File(path + "/private.key"); 
     149                in = new FileInputStream(path + "/private.key"); 
     150                byte[] encodedPrivateKey = new byte[(int) filePrivateKey.length()]; 
     151                in.read(encodedPrivateKey); 
     152                in.close(); 
     153  
     154                // Generate KeyPair. 
     155                KeyFactory keyFactory = KeyFactory.getInstance(algorithm); 
     156                X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec( 
     157                                encodedPublicKey); 
     158                PublicKey publicKey = keyFactory.generatePublic(publicKeySpec); 
     159  
     160                PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec( 
     161                                encodedPrivateKey); 
     162                PrivateKey privateKey = keyFactory.generatePrivate(privateKeySpec); 
     163  
     164                return new KeyPair(publicKey, privateKey); 
    122165        } 
    123166         
     
    263306                         
    264307                        try{ 
    265                                 udpthread = new UDPServerThread(UDPport,conn,m_threshold, debugOut); 
     308                                udpthread = new UDPServerThread(UDPport,conn,m_threshold, debugOut, keypair); 
    266309                                udpthread.start(); 
    267310                        } 
     
    327370        private PrintStream debugOut; 
    328371        private Connection database_conn; 
    329          
    330         public UDPServerThread(int port, Connection conn, int m, PrintStream debug) throws SocketException{ 
     372        KeyPair keypair = null; 
     373         
     374        public UDPServerThread(int port, Connection conn, int m, PrintStream debug, KeyPair keypair_arg) throws SocketException{ 
    331375                UDPport = port; 
    332376                database_conn = conn; 
     
    334378                debugOut = debug; 
    335379                UDPserver = new DatagramSocket(UDPport); 
     380                KeyPair keypair = keypair_arg; 
    336381        } 
    337382         
     
    421466                        //considering 75 bytes (2 sha1 digests (40 bytes) + timestamp (30 bytes) +3 tabs (3 bytes)+ 1 newline (1 byte) ) per hash entry, and max 1400 MTU for the UDP packet 
    422467                        //UPDATE Oct 6th 2012: We dont need to send timestamps. Considering 42 bytes (2 sha1 digests (40 bytes))+1 tabs (1 byte)+ 1 newline (1 byte) ) per hash entry, and max 1400 MTU for the UDP packet 
    423                         int MAX_per_packet = 32;  
     468                        //UPDATE Oct 6th 2012: sending signature at the beginning of the hashes 
     469                        int MAX_per_packet = 30;  
    424470                        String sendhashdata = ""; 
    425471                        while (rs.next()) { 
     
    431477                                if(num==MAX_per_packet){ 
    432478                                        byte [] sendData = sendhashdata.getBytes(); 
     479                                        Signature signer = Signature.getInstance("SHA1withDSA"); 
     480                                    signer.initSign(keypair.getPrivate()); 
     481                                    signer.update(sendData); 
     482                                    byte [] signature = signer.sign(); 
     483                                     
     484                                    StringBuffer sigdigest = new StringBuffer(); 
     485                                        for (int i=0;i<signature.length;i++) { 
     486                                                String t = Integer.toHexString(0xFF & signature[i]); 
     487                                                t = (t.length()>1)?t:("0"+t); 
     488                                                sigdigest.append(t); 
     489                                        } 
     490                                         
     491                                        sendhashdata = sigdigest+"\n"+ sendhashdata; 
     492                                        sendData = sendhashdata.getBytes(); 
    433493                                        DatagramPacket sendPacket = new DatagramPacket(sendData,sendData.length,InetAddress.getByName(ip),port); 
    434494                                        UDPserver.send(sendPacket); 
     
    440500                        if(num>0){ 
    441501                                byte [] sendData = sendhashdata.getBytes(); 
     502                                Signature signer = Signature.getInstance("SHA1withDSA"); 
     503                            signer.initSign(keypair.getPrivate()); 
     504                            signer.update(sendData); 
     505                            byte [] signature = signer.sign(); 
     506                             
     507                            StringBuffer sigdigest = new StringBuffer(); 
     508                                for (int i=0;i<signature.length;i++) { 
     509                                        String t = Integer.toHexString(0xFF & signature[i]); 
     510                                        t = (t.length()>1)?t:("0"+t); 
     511                                        sigdigest.append(t); 
     512                                } 
     513                                 
     514                                sendhashdata = sigdigest+"\n"+ sendhashdata; 
     515                                sendData = sendhashdata.getBytes(); 
    442516                                DatagramPacket sendPacket = new DatagramPacket(sendData,sendData.length,InetAddress.getByName(ip),port); 
    443517                                UDPserver.send(sendPacket); 
     
    471545                        } 
    472546                         
     547                        String one = new String(hexStringToByteArray(urlhash)); 
     548                        String two = new String(hexStringToByteArray(objhash)); 
     549                        String sendhashdata = one+"\t"+two; 
     550                        byte [] sendData = sendhashdata.getBytes(); 
     551                        Signature signer; 
     552                        byte [] signature = null; 
     553                        try{ 
     554                                signer = Signature.getInstance("SHA1withDSA"); 
     555                                signer.initSign(keypair.getPrivate()); 
     556                                signer.update(sendData); 
     557                                signature = signer.sign(); 
     558                        }catch(Exception e){System.out.println("NoSuchAlgorithm/invalidkey/Signature Exception");} 
     559                         
     560                     
     561                    StringBuffer sigdigest = new StringBuffer(); 
     562                        for (int i=0;i<signature.length;i++) { 
     563                                String t = Integer.toHexString(0xFF & signature[i]); 
     564                                t = (t.length()>1)?t:("0"+t); 
     565                                sigdigest.append(t); 
     566                        } 
     567                         
     568                        sendhashdata = sigdigest+"\n"+ one+"\t"+two; 
     569                        sendData = sendhashdata.getBytes(); 
     570                         
    473571                        Statement stmt2 = database_conn.createStatement(); 
    474572                        ResultSet rs = stmt2.executeQuery("select * from ClientDatabase"); 
     
    477575                                port = rs.getInt(2); 
    478576                                 
    479                                 if(!Arrays.asList(ip).contains(clientip)){ 
    480                                         String one = new String(hexStringToByteArray(urlhash)); 
    481                                         String two = new String(hexStringToByteArray(objhash)); 
    482                                         String senddata = one+"\t"+two; 
    483                                         byte [] sendData = senddata.getBytes(); 
     577                                if(!Arrays.asList(ip).contains(clientip)){                                       
    484578                                        try{ 
    485579                                                DatagramPacket sendPacket = new DatagramPacket(sendData,sendData.length,InetAddress.getByName(clientip),port); 
Note: See TracChangeset for help on using the changeset viewer.