UserAuthPublicKey.java
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 package com.jcraft.jsch;
00031
00032 import java.util.Vector;
00033
00034 class UserAuthPublicKey extends UserAuth{
00035
00036 public boolean start(Session session) throws Exception{
00037 super.start(session);
00038
00039 Vector identities=session.jsch.identities;
00040
00041 byte[] passphrase=null;
00042 byte[] _username=null;
00043
00044 int command;
00045
00046 synchronized(identities){
00047 if(identities.size()<=0){
00048 return false;
00049 }
00050
00051 _username=Util.str2byte(username);
00052
00053 for(int i=0; i<identities.size(); i++){
00054 Identity identity=(Identity)(identities.elementAt(i));
00055 byte[] pubkeyblob=identity.getPublicKeyBlob();
00056
00057
00058
00059 if(pubkeyblob!=null){
00060
00061
00062
00063
00064
00065
00066
00067
00068 packet.reset();
00069 buf.putByte((byte)SSH_MSG_USERAUTH_REQUEST);
00070 buf.putString(_username);
00071 buf.putString(Util.str2byte("ssh-connection"));
00072 buf.putString(Util.str2byte("publickey"));
00073 buf.putByte((byte)0);
00074 buf.putString(Util.str2byte(identity.getAlgName()));
00075 buf.putString(pubkeyblob);
00076 session.write(packet);
00077
00078 loop1:
00079 while(true){
00080 buf=session.read(buf);
00081 command=buf.getCommand()&0xff;
00082
00083 if(command==SSH_MSG_USERAUTH_PK_OK){
00084 break;
00085 }
00086 else if(command==SSH_MSG_USERAUTH_FAILURE){
00087 break;
00088 }
00089 else if(command==SSH_MSG_USERAUTH_BANNER){
00090 buf.getInt(); buf.getByte(); buf.getByte();
00091 byte[] _message=buf.getString();
00092 byte[] lang=buf.getString();
00093 String message=Util.byte2str(_message);
00094 if(userinfo!=null){
00095 userinfo.showMessage(message);
00096 }
00097 continue loop1;
00098 }
00099 else{
00100
00101
00102 break;
00103 }
00104 }
00105
00106 if(command!=SSH_MSG_USERAUTH_PK_OK){
00107 continue;
00108 }
00109 }
00110
00111
00112
00113 int count=5;
00114 while(true){
00115 if((identity.isEncrypted() && passphrase==null)){
00116 if(userinfo==null) throw new JSchException("USERAUTH fail");
00117 if(identity.isEncrypted() &&
00118 !userinfo.promptPassphrase("Passphrase for "+identity.getName())){
00119 throw new JSchAuthCancelException("publickey");
00120
00121
00122 }
00123 String _passphrase=userinfo.getPassphrase();
00124 if(_passphrase!=null){
00125 passphrase=Util.str2byte(_passphrase);
00126 }
00127 }
00128
00129 if(!identity.isEncrypted() || passphrase!=null){
00130 if(identity.setPassphrase(passphrase))
00131 break;
00132 }
00133 Util.bzero(passphrase);
00134 passphrase=null;
00135 count--;
00136 if(count==0)break;
00137 }
00138
00139 Util.bzero(passphrase);
00140 passphrase=null;
00141
00142
00143 if(identity.isEncrypted()) continue;
00144 if(pubkeyblob==null) pubkeyblob=identity.getPublicKeyBlob();
00145
00146
00147
00148 if(pubkeyblob==null) continue;
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159 packet.reset();
00160 buf.putByte((byte)SSH_MSG_USERAUTH_REQUEST);
00161 buf.putString(_username);
00162 buf.putString(Util.str2byte("ssh-connection"));
00163 buf.putString(Util.str2byte("publickey"));
00164 buf.putByte((byte)1);
00165 buf.putString(Util.str2byte(identity.getAlgName()));
00166 buf.putString(pubkeyblob);
00167
00168
00169
00170
00171
00172 byte[] sid=session.getSessionId();
00173 int sidlen=sid.length;
00174 byte[] tmp=new byte[4+sidlen+buf.index-5];
00175 tmp[0]=(byte)(sidlen>>>24);
00176 tmp[1]=(byte)(sidlen>>>16);
00177 tmp[2]=(byte)(sidlen>>>8);
00178 tmp[3]=(byte)(sidlen);
00179 System.arraycopy(sid, 0, tmp, 4, sidlen);
00180 System.arraycopy(buf.buffer, 5, tmp, 4+sidlen, buf.index-5);
00181 byte[] signature=identity.getSignature(tmp);
00182 if(signature==null){
00183 break;
00184 }
00185 buf.putString(signature);
00186 session.write(packet);
00187
00188 loop2:
00189 while(true){
00190 buf=session.read(buf);
00191 command=buf.getCommand()&0xff;
00192
00193 if(command==SSH_MSG_USERAUTH_SUCCESS){
00194 return true;
00195 }
00196 else if(command==SSH_MSG_USERAUTH_BANNER){
00197 buf.getInt(); buf.getByte(); buf.getByte();
00198 byte[] _message=buf.getString();
00199 byte[] lang=buf.getString();
00200 String message=Util.byte2str(_message);
00201 if(userinfo!=null){
00202 userinfo.showMessage(message);
00203 }
00204 continue loop2;
00205 }
00206 else if(command==SSH_MSG_USERAUTH_FAILURE){
00207 buf.getInt(); buf.getByte(); buf.getByte();
00208 byte[] foo=buf.getString();
00209 int partial_success=buf.getByte();
00210
00211
00212 if(partial_success!=0){
00213 throw new JSchPartialAuthException(Util.byte2str(foo));
00214 }
00215 break;
00216 }
00217
00218
00219 break;
00220 }
00221 }
00222 }
00223 return false;
00224 }
00225 }