Beispiel #1
0
 private void receive_newkeys(Buffer buf, KeyExchange kex)
 {
     //    send_newkeys();
     updateKeys(kex);
     in_kex=false;
 }
Beispiel #2
0
        private void updateKeys(KeyExchange kex)
        {
            byte[] K=kex.getK();
            byte[] H=kex.getH();
            HASH hash=kex.getHash();

            String[] guess=kex._guess;

            if(session_id==null)
            {
                session_id=new byte[H.Length];
                Fireball.Ssh.java.System.arraycopy(H, 0, session_id, 0, H.Length);
            }

            /*
              Initial IV client to server:     HASH (K || H || "A" || session_id)
              Initial IV server to client:     HASH (K || H || "B" || session_id)
              Encryption key client to server: HASH (K || H || "C" || session_id)
              Encryption key server to client: HASH (K || H || "D" || session_id)
              Integrity key client to server:  HASH (K || H || "E" || session_id)
              Integrity key server to client:  HASH (K || H || "F" || session_id)
            */

            buf.reset();
            buf.putMPInt(K);
            buf.putByte(H);
            buf.putByte((byte)0x41);
            buf.putByte(session_id);
            hash.update(buf.buffer, 0, buf.index);
            IVc2s=hash.digest();

            int j=buf.index-session_id.Length-1;

            buf.buffer[j]++;
            hash.update(buf.buffer, 0, buf.index);
            IVs2c=hash.digest();

            buf.buffer[j]++;
            hash.update(buf.buffer, 0, buf.index);
            Ec2s=hash.digest();

            buf.buffer[j]++;
            hash.update(buf.buffer, 0, buf.index);
            Es2c=hash.digest();

            buf.buffer[j]++;
            hash.update(buf.buffer, 0, buf.index);
            MACc2s=hash.digest();

            buf.buffer[j]++;
            hash.update(buf.buffer, 0, buf.index);
            MACs2c=hash.digest();

            try
            {
                Class c;

                c=Class.forName(getConfig(guess[KeyExchange.PROPOSAL_ENC_ALGS_STOC]));
                s2ccipher=(Cipher)(c.newInstance());
                while(s2ccipher.getBlockSize()>Es2c.Length)
                {
                    buf.reset();
                    buf.putMPInt(K);
                    buf.putByte(H);
                    buf.putByte(Es2c);
                    hash.update(buf.buffer, 0, buf.index);
                    byte[] foo=hash.digest();
                    byte[] bar=new byte[Es2c.Length+foo.Length];
                    Fireball.Ssh.java.System.arraycopy(Es2c, 0, bar, 0, Es2c.Length);
                    Fireball.Ssh.java.System.arraycopy(foo, 0, bar, Es2c.Length, foo.Length);
                    Es2c=bar;
                }
                s2ccipher.init(Cipher.DECRYPT_MODE, Es2c, IVs2c);
                cipher_size=s2ccipher.getIVSize();
                c=Class.forName(getConfig(guess[KeyExchange.PROPOSAL_MAC_ALGS_STOC]));
                s2cmac=(MAC)(c.newInstance());
                s2cmac.init(MACs2c);
                mac_buf=new byte[s2cmac.getBlockSize()];

                c=Class.forName(getConfig(guess[KeyExchange.PROPOSAL_ENC_ALGS_CTOS]));
                c2scipher=(Cipher)(c.newInstance());
                while(c2scipher.getBlockSize()>Ec2s.Length)
                {
                    buf.reset();
                    buf.putMPInt(K);
                    buf.putByte(H);
                    buf.putByte(Ec2s);
                    hash.update(buf.buffer, 0, buf.index);
                    byte[] foo=hash.digest();
                    byte[] bar=new byte[Ec2s.Length+foo.Length];
                    Fireball.Ssh.java.System.arraycopy(Ec2s, 0, bar, 0, Ec2s.Length);
                    Fireball.Ssh.java.System.arraycopy(foo, 0, bar, Ec2s.Length, foo.Length);
                    Ec2s=bar;
                }
                c2scipher.init(Cipher.ENCRYPT_MODE, Ec2s, IVc2s);

                c=Class.forName(getConfig(guess[KeyExchange.PROPOSAL_MAC_ALGS_CTOS]));
                c2smac=(MAC)(c.newInstance());
                c2smac.init(MACc2s);

                if(!guess[KeyExchange.PROPOSAL_COMP_ALGS_CTOS].equals("none"))
                {
                    String foo=getConfig(guess[KeyExchange.PROPOSAL_COMP_ALGS_CTOS]);
                    if(foo!=null)
                    {
                        try
                        {
                            c=Class.forName(foo);
                            deflater=(Compression)(c.newInstance());
                            int level=6;
                            try{ level=Integer.parseInt(getConfig("compression_level"));}
                            catch(Exception ee){ }
                            deflater.init(Compression.DEFLATER, level);
                        }
                        catch(Exception ee)
                        {
                            System.Console.Error.WriteLine(foo+" isn't accessible.");
                        }
                    }
                }
                else
                {
                    if(deflater!=null)
                    {
                        deflater=null;
                    }
                }
                if(!guess[KeyExchange.PROPOSAL_COMP_ALGS_STOC].equals("none"))
                {
                    String foo=getConfig(guess[KeyExchange.PROPOSAL_COMP_ALGS_STOC]);
                    if(foo!=null)
                    {
                        try
                        {
                            c=Class.forName(foo);
                            inflater=(Compression)(c.newInstance());
                            inflater.init(Compression.INFLATER, 0);
                        }
                        catch(Exception ee)
                        {
                            System.Console.Error.WriteLine(foo+" isn't accessible.");
                        }
                    }
                }
                else
                {
                    if(inflater!=null)
                    {
                        inflater=null;
                    }
                }
            }
            catch(Exception e){ System.Console.Error.WriteLine("updatekeys: "+e); }
        }
Beispiel #3
0
        private void checkHost(String host, KeyExchange kex)
        {
            String shkc=getConfig("StrictHostKeyChecking");

            //System.Console.WriteLine("shkc: "+shkc);

            byte[] K_S=kex.getHostKey();
            String key_type=kex.getKeyType();
            String key_fprint=kex.getFingerPrint();

            hostkey=new HostKey(host, K_S);

            HostKeyRepository hkr=jsch.getHostKeyRepository();
            int i=0;
            lock(hkr)
            {
                i=hkr.check(host, K_S);
            }

            bool insert=false;

            if((shkc.equals("ask") || shkc.equals("yes")) &&
                i==HostKeyRepository.CHANGED)
            {
                String file=null;
                lock(hkr)
                {
                    file=hkr.getKnownHostsRepositoryID();
                }
                if(file==null){file="known_hosts";}
                String message=
                    "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n"+
                    "@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @\n"+
                    "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n"+
                    "IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!      \n"+
                    "Someone could be eavesdropping on you right now (man-in-the-middle attack)!\n"+
                    "It is also possible that the "+key_type+" host key has just been changed.\n"+
                    "The fingerprint for the "+key_type+" key sent by the remote host is\n"+
                    key_fprint+".\n"+
                    "Please contact your system administrator.\n"+
                    "Add correct host key in "+file+" to get rid of this message.";

                bool b=false;

                if(userinfo!=null)
                {
                    //userinfo.showMessage(message);
                    b=userinfo.promptYesNo(message+
                        "\nDo you want to delete the old key and insert the new key?");
                }
                //throw new JSchException("HostKey has been changed: "+host);
                if(!b)
                {
                    throw new JSchException("HostKey has been changed: "+host);
                }
                else
                {
                    lock(hkr)
                    {
                        hkr.remove(host, null);
                        insert=true;
                    }
                }
            }

            //    bool insert=false;

            if((shkc.equals("ask") || shkc.equals("yes")) &&
                (i!=HostKeyRepository.OK) && !insert)
            {
                if(shkc.equals("yes"))
                {
                    throw new JSchException("reject HostKey: "+host);
                }
                //System.Console.WriteLine("finger-print: "+key_fprint);
                if(userinfo!=null)
                {
                    bool foo=userinfo.promptYesNo(
                        "The authenticity of host '"+host+"' can't be established.\n"+
                        key_type+" key fingerprint is "+key_fprint+".\n"+
                        "Are you sure you want to continue connecting?"
                        );
                    if(!foo)
                    {
                        throw new JSchException("reject HostKey: "+host);
                    }
                    insert=true;
                }
                else
                {
                    if(i==HostKeyRepository.NOT_INCLUDED)
                        throw new JSchException("UnknownHostKey: "+host);
                    else throw new JSchException("HostKey has been changed: "+host);
                }
            }

            if(shkc.equals("no") &&
                HostKeyRepository.NOT_INCLUDED==i)
            {
                insert=true;
            }

            if(insert)
            {
                lock(hkr)
                {
                    hkr.add(host, K_S, userinfo);
                }
            }
        }