Develop and Download Open Source Software

Browse Subversion Repository

Diff of /branches/ssh_chacha20poly1305/ttssh2/ttxssh/ssh.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 2777 by yutakakn, Thu Jan 6 12:29:07 2005 UTC revision 2782 by yutakakn, Mon Jan 24 14:07:07 2005 UTC
# Line 68  static BOOL handle_SSH2_authrequest(PTIn Line 68  static BOOL handle_SSH2_authrequest(PTIn
68  static BOOL handle_SSH2_userauth_success(PTInstVar pvar);  static BOOL handle_SSH2_userauth_success(PTInstVar pvar);
69  static BOOL handle_SSH2_userauth_failure(PTInstVar pvar);  static BOOL handle_SSH2_userauth_failure(PTInstVar pvar);
70  static BOOL handle_SSH2_userauth_banner(PTInstVar pvar);  static BOOL handle_SSH2_userauth_banner(PTInstVar pvar);
71    static BOOL handle_SSH2_userauth_inforeq(PTInstVar pvar);
72  static BOOL handle_SSH2_open_confirm(PTInstVar pvar);  static BOOL handle_SSH2_open_confirm(PTInstVar pvar);
73  static BOOL handle_SSH2_request_success(PTInstVar pvar);  static BOOL handle_SSH2_request_success(PTInstVar pvar);
74  static BOOL handle_SSH2_channel_success(PTInstVar pvar);  static BOOL handle_SSH2_channel_success(PTInstVar pvar);
# Line 957  static void init_protocol(PTInstVar pvar Line 958  static void init_protocol(PTInstVar pvar
958                  enque_handler(pvar, SSH2_MSG_USERAUTH_SUCCESS, handle_SSH2_userauth_success);                  enque_handler(pvar, SSH2_MSG_USERAUTH_SUCCESS, handle_SSH2_userauth_success);
959                  enque_handler(pvar, SSH2_MSG_USERAUTH_FAILURE, handle_SSH2_userauth_failure);                  enque_handler(pvar, SSH2_MSG_USERAUTH_FAILURE, handle_SSH2_userauth_failure);
960                  enque_handler(pvar, SSH2_MSG_USERAUTH_BANNER, handle_SSH2_userauth_banner);                  enque_handler(pvar, SSH2_MSG_USERAUTH_BANNER, handle_SSH2_userauth_banner);
961                    enque_handler(pvar, SSH2_MSG_USERAUTH_INFO_REQUEST, handle_SSH2_userauth_inforeq);
962    
963                  enque_handler(pvar, SSH2_MSG_UNIMPLEMENTED, handle_unimplemented);                  enque_handler(pvar, SSH2_MSG_UNIMPLEMENTED, handle_unimplemented);
964    
# Line 4227  BOOL do_SSH2_userauth(PTInstVar pvar) Line 4229  BOOL do_SSH2_userauth(PTInstVar pvar)
4229                  pvar->ssh2_keys[mode].mac.enabled = 1;                  pvar->ssh2_keys[mode].mac.enabled = 1;
4230          }          }
4231    
4232            // SSH2 keyboard-interactive methodの初期化 (2005.1.22 yutaka)
4233            pvar->keyboard_interactive_done = 0;
4234    
4235          // start user authentication          // start user authentication
4236          msg = buffer_init();          msg = buffer_init();
4237          if (msg == NULL) {          if (msg == NULL) {
# Line 4435  static BOOL handle_SSH2_authrequest(PTIn Line 4440  static BOOL handle_SSH2_authrequest(PTIn
4440          unsigned char *outmsg;          unsigned char *outmsg;
4441          int len;          int len;
4442          char *connect_id = "ssh-connection";          char *connect_id = "ssh-connection";
4443            int kbdint = 0;
4444    
         //              pvar->auth_state.cur_cred.password = password;  
         //              pvar->auth_state.user =  
4445          msg = buffer_init();          msg = buffer_init();
4446          if (msg == NULL) {          if (msg == NULL) {
4447                  // TODO: error check                  // TODO: error check
# Line 4453  static BOOL handle_SSH2_authrequest(PTIn Line 4457  static BOOL handle_SSH2_authrequest(PTIn
4457          buffer_put_string(msg, s, strlen(s));          buffer_put_string(msg, s, strlen(s));
4458    
4459          if (pvar->auth_state.cur_cred.method == SSH_AUTH_PASSWORD) { // パスワード認証          if (pvar->auth_state.cur_cred.method == SSH_AUTH_PASSWORD) { // パスワード認証
4460                  s = connect_id;                  // 初回は keyboard-interactive メソッドでトライする (2005.1.22 yutaka)
4461                  buffer_put_string(msg, s, strlen(s));                  // cf. http://www.openssh.com/txt/draft-ietf-secsh-auth-kbdinteract-02.txt
4462                  s = "password";  
4463                  buffer_put_string(msg, s, strlen(s));                  if (pvar->settings.ssh2_keyboard_interactive == 1 &&
4464                  buffer_put_char(msg, 0); // 0                          pvar->keyboard_interactive_done == 0) { // keyboard-interactive method
4465                            pvar->keyboard_interactive_done = 1;
4466                            kbdint = 1;
4467    
4468                            //s = "ssh-userauth";  // service name
4469                            s = connect_id;
4470                            buffer_put_string(msg, s, strlen(s));
4471                            s = "keyboard-interactive";  // method name
4472                            buffer_put_string(msg, s, strlen(s));
4473                            s = "";  // language tag
4474                            buffer_put_string(msg, s, strlen(s));
4475                            s = "";  // submethods
4476                            buffer_put_string(msg, s, strlen(s));
4477    
4478    
                 if (pvar->ssh2_autologin == 1) { // SSH2自動ログイン  
                         s = pvar->ssh2_password;  
4479                  } else {                  } else {
4480                          s = pvar->auth_state.cur_cred.password;  // パスワード                          // password authentication method
4481                            s = connect_id;
4482                            buffer_put_string(msg, s, strlen(s));
4483                            s = "password";
4484                            buffer_put_string(msg, s, strlen(s));
4485                            buffer_put_char(msg, 0); // 0
4486    
4487                            if (pvar->ssh2_autologin == 1) { // SSH2自動ログイン
4488                                    s = pvar->ssh2_password;
4489                            } else {
4490                                    s = pvar->auth_state.cur_cred.password;  // パスワード
4491                            }
4492                            buffer_put_string(msg, s, strlen(s));
4493    
4494                  }                  }
                 buffer_put_string(msg, s, strlen(s));  
4495    
4496    
4497          } else if (pvar->auth_state.cur_cred.method == SSH_AUTH_RSA) { // 公開鍵認証          } else if (pvar->auth_state.cur_cred.method == SSH_AUTH_RSA) { // 公開鍵認証
# Line 4538  static BOOL handle_SSH2_authrequest(PTIn Line 4565  static BOOL handle_SSH2_authrequest(PTIn
4565          buffer_free(msg);          buffer_free(msg);
4566    
4567          SSH2_dispatch_init(5);          SSH2_dispatch_init(5);
4568            if (kbdint == 1) { // keyboard-interactive method
4569                    SSH2_dispatch_add_message(SSH2_MSG_USERAUTH_INFO_REQUEST);
4570            }
4571          SSH2_dispatch_add_message(SSH2_MSG_USERAUTH_SUCCESS);          SSH2_dispatch_add_message(SSH2_MSG_USERAUTH_SUCCESS);
4572          SSH2_dispatch_add_message(SSH2_MSG_USERAUTH_FAILURE);          SSH2_dispatch_add_message(SSH2_MSG_USERAUTH_FAILURE);
4573          SSH2_dispatch_add_message(SSH2_MSG_USERAUTH_BANNER);          SSH2_dispatch_add_message(SSH2_MSG_USERAUTH_BANNER);
# Line 4691  static BOOL handle_SSH2_userauth_failure Line 4721  static BOOL handle_SSH2_userauth_failure
4721          // TCP connection closed          // TCP connection closed
4722          //notify_closed_connection(pvar);          //notify_closed_connection(pvar);
4723    
4724            // keyboard-interactive methodでトライして失敗した場合、次にpassword authentication method
4725            // で無条件にトライしてみる。(2005.1.22 yutaka)
4726            if (pvar->keyboard_interactive_done == 1) {
4727                    handle_SSH2_authrequest(pvar);
4728                    pvar->keyboard_interactive_done = 0; // clear flag
4729                    return TRUE;
4730            }
4731    
4732          if (pvar->ssh2_autologin == 1) {          if (pvar->ssh2_autologin == 1) {
4733                  // SSH2自動ログインが有効の場合は、リトライは行わない。(2004.12.4 yutaka)                  // SSH2自動ログインが有効の場合は、リトライは行わない。(2004.12.4 yutaka)
4734                  notify_fatal_error(pvar,                  notify_fatal_error(pvar,
# Line 4716  static BOOL handle_SSH2_userauth_banner( Line 4754  static BOOL handle_SSH2_userauth_banner(
4754  }  }
4755    
4756    
4757    // SSH2 keyboard-interactive methodの SSH2_MSG_USERAUTH_INFO_REQUEST 処理関数
4758    //
4759    // ※メモ:OpenSSHでPAMを有効にする方法
4760    //・ビルド
4761    //# ./configure --with-pam
4762    //# make
4763    //
4764    //・/etc/ssh/sshd_config に下記のように書く。
4765    //PasswordAuthentication no
4766    //PermitEmptyPasswords no
4767    //ChallengeResponseAuthentication yes
4768    //UsePAM yes
4769    //
4770    // (2005.1.23 yutaka)
4771    static BOOL handle_SSH2_userauth_inforeq(PTInstVar pvar)
4772    {
4773            int len;
4774            char *data;
4775            int slen, num, echo;
4776            char *s, *prompt;
4777            buffer_t *msg;
4778            unsigned char *outmsg;
4779            int i;
4780    
4781    
4782            // 6byte(サイズ+パディング+タイプ)を取り除いた以降のペイロード
4783            data = pvar->ssh_state.payload;
4784            // パケットサイズ - (パディングサイズ+1);真のパケットサイズ
4785            len = pvar->ssh_state.payloadlen;
4786    
4787            //debug_print(10, data, len);
4788    
4789            ///////// step1
4790            // get string
4791            slen = get_uint32_MSBfirst(data);
4792            data += 4;
4793            s = data;  // name
4794            data += slen;
4795    
4796            // get string
4797            slen = get_uint32_MSBfirst(data);
4798            data += 4;
4799            s = data;  // instruction
4800            data += slen;
4801    
4802            // get string
4803            slen = get_uint32_MSBfirst(data);
4804            data += 4;
4805            s = data;  // language tag
4806            data += slen;
4807    
4808            // num-prompts
4809            num = get_uint32_MSBfirst(data);
4810            data += 4;
4811    
4812            ///////// step2
4813            // サーバへパスフレーズを送る
4814            msg = buffer_init();
4815            if (msg == NULL) {
4816                    // TODO: error check
4817                    return FALSE;
4818            }
4819            buffer_put_int(msg, num);
4820    
4821            // プロンプトの数だけ prompt & echo が繰り返される。
4822            for (i = 0 ; i < num ; i++) {
4823                    // get string
4824                    slen = get_uint32_MSBfirst(data);
4825                    data += 4;
4826                    prompt = data;  // prompt
4827                    data += slen;
4828    
4829                    // get boolean
4830                    echo = data[0];
4831                    data += 1;
4832    
4833                    // TODO: ここでプロンプトを表示してユーザから入力させるのが正解。
4834                    s = pvar->auth_state.cur_cred.password;
4835                    buffer_put_string(msg, s, strlen(s));  
4836            }
4837    
4838            len = buffer_len(msg);
4839            outmsg = begin_send_packet(pvar, SSH2_MSG_USERAUTH_INFO_RESPONSE, len);
4840            memcpy(outmsg, buffer_ptr(msg), len);
4841            finish_send_packet(pvar);
4842            buffer_free(msg);
4843    
4844            return TRUE;
4845    }
4846    
4847    
4848  static BOOL handle_SSH2_open_confirm(PTInstVar pvar)  static BOOL handle_SSH2_open_confirm(PTInstVar pvar)
4849  {        {      
4850          buffer_t *msg;          buffer_t *msg;
# Line 5007  static BOOL handle_SSH2_window_adjust(PT Line 5136  static BOOL handle_SSH2_window_adjust(PT
5136    
5137  /*  /*
5138   * $Log: not supported by cvs2svn $   * $Log: not supported by cvs2svn $
5139     * Revision 1.14  2005/01/06 12:29:07  yutakakn
5140     * telnet接続時にターミナルサイズ変更を行うと、アプリケーションエラーとなるバグを修正。
5141     *
5142   * Revision 1.13  2005/01/04 16:09:45  yutakakn   * Revision 1.13  2005/01/04 16:09:45  yutakakn
5143   * キー再作成時にMAC corruptとなるバグを修正(メモリの二重フリーが原因)。   * キー再作成時にMAC corruptとなるバグを修正(メモリの二重フリーが原因)。
5144   *   *

Legend:
Removed from v.2777  
changed lines
  Added in v.2782

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26