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 6656 by doda, Thu Mar 23 12:54:58 2017 UTC revision 6657 by doda, Thu Mar 23 12:55:00 2017 UTC
# Line 1704  static void init_protocol(PTInstVar pvar Line 1704  static void init_protocol(PTInstVar pvar
1704                  enque_handler(pvar, SSH2_MSG_USERAUTH_SUCCESS, handle_SSH2_userauth_success);                  enque_handler(pvar, SSH2_MSG_USERAUTH_SUCCESS, handle_SSH2_userauth_success);
1705                  enque_handler(pvar, SSH2_MSG_USERAUTH_FAILURE, handle_SSH2_userauth_failure);                  enque_handler(pvar, SSH2_MSG_USERAUTH_FAILURE, handle_SSH2_userauth_failure);
1706                  enque_handler(pvar, SSH2_MSG_USERAUTH_BANNER, handle_SSH2_userauth_banner);                  enque_handler(pvar, SSH2_MSG_USERAUTH_BANNER, handle_SSH2_userauth_banner);
1707                  enque_handler(pvar, SSH2_MSG_USERAUTH_INFO_REQUEST, handle_SSH2_userauth_inforeq);                  enque_handler(pvar, SSH2_MSG_USERAUTH_INFO_REQUEST, handle_SSH2_userauth_msg60);
                 enque_handler(pvar, SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ, handle_SSH2_userauth_passwd_changereq);  
1708    
1709                  enque_handler(pvar, SSH2_MSG_UNIMPLEMENTED, handle_unimplemented);                  enque_handler(pvar, SSH2_MSG_UNIMPLEMENTED, handle_unimplemented);
1710    
# Line 6989  static BOOL handle_SSH2_userauth_banner( Line 6988  static BOOL handle_SSH2_userauth_banner(
6988  }  }
6989    
6990    
6991  // SSH2 keyboard-interactive methodの SSH2_MSG_USERAUTH_INFO_REQUEST 処理関数  // SSH2 メッセージ 60 番の処理関数
6992    //
6993    // SSH2 では以下のメッセージが 60 番へ重複して割り当てられている。
6994  //  //
6995    // * SSH2_MSG_USERAUTH_INFO_REQUEST (keyboard-interactive)
6996    // * SSH2_MSG_USERAUTH_PK_OK (publickey / Tera Term では Pageant 認証のみ)
6997    // * SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ (password)
6998    //
6999  // 現状の実装では同じメッセージ番号が存在できないので、  // 現状の実装では同じメッセージ番号が存在できないので、
7000  // SSH2 publickey で Pageant を使っているときの  // 60 番はこの関数で受け、method によって対応するハンドラ関数に振り分ける。
 // SSH2_MSG_USERAUTH_PK_OK もこの関数で処理する。(2007.2.12 maya)  
7001  //  //
7002  //  BOOL handle_SSH2_userauth_msg60(PTInstVar pvar)
 // ※メモ:OpenSSHでPAMを有効にする方法  
 //・ビルド  
 //# ./configure --with-pam  
 //# make  
 //  
 //・/etc/ssh/sshd_config に下記のように書く。  
 //PasswordAuthentication no  
 //PermitEmptyPasswords no  
 //ChallengeResponseAuthentication yes  
 //UsePAM yes  
 //  
 // (2005.1.23 yutaka)  
 BOOL handle_SSH2_userauth_inforeq(PTInstVar pvar)  
7003  {  {
7004          if (pvar->auth_state.cur_cred.method == SSH_AUTH_TIS) {          if (pvar->auth_state.cur_cred.method == SSH_AUTH_TIS) {
7005                  // SSH2_MSG_USERAUTH_INFO_REQUEST                  return handle_SSH2_userauth_inforeq(pvar);
7006                  int len;          }
7007                  char *data;          else if (pvar->auth_state.cur_cred.method == SSH_AUTH_PAGEANT) {
7008                  int slen = 0, num, echo;                  return handle_SSH2_userauth_pkok(pvar);
7009                  char *s, *prompt = NULL;          }
7010                  buffer_t *msg;          else if (pvar->auth_state.cur_cred.method == SSH_AUTH_PASSWORD) {
7011                  unsigned char *outmsg;                  // TODO
7012                  int i;                  // return handle_SSH2_userauth_passwd_changereq(pvar) {
7013                  char *name, *inst, *lang;                  return FALSE;
7014                  char lprompt[512];          }
7015            else {
7016                    return FALSE;
7017            }
7018    
7019                  notify_verbose_message(pvar, "SSH2_MSG_USERAUTH_INFO_REQUEST was received.", LOG_LEVEL_VERBOSE);          return TRUE; // not reached
7020    }
7021    
7022                  // 6byte(サイズ+パディング+タイプ)を取り除いた以降のペイロード  BOOL handle_SSH2_userauth_inforeq(PTInstVar pvar)
7023                  data = pvar->ssh_state.payload;  {
7024                  // パケットサイズ - (パディングサイズ+1);真のパケットサイズ          // SSH2_MSG_USERAUTH_INFO_REQUEST
7025                  len = pvar->ssh_state.payloadlen;          int len;
7026            char *data;
7027            int slen = 0, num, echo;
7028            char *s, *prompt = NULL;
7029            buffer_t *msg;
7030            unsigned char *outmsg;
7031            int i;
7032            char *name, *inst, *lang;
7033            char lprompt[512];
7034    
7035                  //debug_print(10, data, len);          notify_verbose_message(pvar, "SSH2_MSG_USERAUTH_INFO_REQUEST was received.", LOG_LEVEL_VERBOSE);
7036    
7037                  ///////// step1          // 6byte(サイズ+パディング+タイプ)を取り除いた以降のペイロード
7038                  // get string          data = pvar->ssh_state.payload;
7039                  name = buffer_get_string(&data, NULL);          // パケットサイズ - (パディングサイズ+1);真のパケットサイズ
7040                  inst = buffer_get_string(&data, NULL);          len = pvar->ssh_state.payloadlen;
                 lang = buffer_get_string(&data, NULL);  
                 lprompt[0] = 0;  
                 if (strlen(inst) > 0) {  
                         strncat_s(lprompt, sizeof(lprompt), inst, _TRUNCATE);  
                         strncat_s(lprompt, sizeof(lprompt), "\r\n", _TRUNCATE);  
                 }  
                 if (strlen(lang) > 0) {  
                         strncat_s(lprompt, sizeof(lprompt), lang, _TRUNCATE);  
                         strncat_s(lprompt, sizeof(lprompt), "\r\n", _TRUNCATE);  
                 }  
                 free(name);  
                 free(inst);  
                 free(lang);  
7041    
7042                  // num-prompts          //debug_print(10, data, len);
                 num = get_uint32_MSBfirst(data);  
                 data += 4;  
7043    
7044                  ///////// step2          ///////// step1
7045                  // サーバへパスフレーズを送る          // get string
7046                  msg = buffer_init();          name = buffer_get_string(&data, NULL);
7047                  if (msg == NULL) {          inst = buffer_get_string(&data, NULL);
7048                          // TODO: error check          lang = buffer_get_string(&data, NULL);
7049                          return FALSE;          lprompt[0] = 0;
7050                  }          if (strlen(inst) > 0) {
7051                  buffer_put_int(msg, num);                  strncat_s(lprompt, sizeof(lprompt), inst, _TRUNCATE);
7052                    strncat_s(lprompt, sizeof(lprompt), "\r\n", _TRUNCATE);
7053            }
7054            if (strlen(lang) > 0) {
7055                    strncat_s(lprompt, sizeof(lprompt), lang, _TRUNCATE);
7056                    strncat_s(lprompt, sizeof(lprompt), "\r\n", _TRUNCATE);
7057            }
7058            free(name);
7059            free(inst);
7060            free(lang);
7061    
7062                  // パスワード変更の場合、メッセージがあれば、表示する。(2010.11.11 yutaka)          // num-prompts
7063                  if (num == 0) {          num = get_uint32_MSBfirst(data);
7064                          if (strlen(lprompt) > 0)          data += 4;
                                 MessageBox(pvar->cv->HWin, lprompt, "USERAUTH INFO_REQUEST", MB_OK | MB_ICONINFORMATION);  
                 }  
   
                 // プロンプトの数だけ prompt & echo が繰り返される。  
                 for (i = 0 ; i < num ; i++) {  
                         // get string  
                         slen = get_uint32_MSBfirst(data);  
                         data += 4;  
                         prompt = data;  // prompt  
                         data += slen;  
   
                         // get boolean  
                         echo = data[0];  
                         data += 1;  
   
                         // keyboard-interactive method (2005.3.12 yutaka)  
                         if (pvar->keyboard_interactive_password_input == 0 &&  
                                 pvar->auth_state.cur_cred.method == SSH_AUTH_TIS) {  
                                 AUTH_set_TIS_mode(pvar, prompt, slen);  
                                 AUTH_advance_to_next_cred(pvar);  
                                 pvar->ssh_state.status_flags &= ~STATUS_DONT_SEND_CREDENTIALS;  
                                 //try_send_credentials(pvar);  
                                 buffer_free(msg);  
                                 return TRUE;  
                         }  
7065    
7066                          // TODO: ここでプロンプトを表示してユーザから入力させるのが正解。          ///////// step2
7067                          s = pvar->auth_state.cur_cred.password;          // サーバへパスフレーズを送る
7068                          buffer_put_string(msg, s, strlen(s));          msg = buffer_init();
7069            if (msg == NULL) {
7070                    // TODO: error check
7071                    return FALSE;
7072            }
7073            buffer_put_int(msg, num);
7074    
7075                          // リトライに対応できるよう、フラグをクリアする。(2010.11.11 yutaka)          // パスワード変更の場合、メッセージがあれば、表示する。(2010.11.11 yutaka)
7076                          pvar->keyboard_interactive_password_input = 0;          if (num == 0) {
7077                    if (strlen(lprompt) > 0)
7078                            MessageBox(pvar->cv->HWin, lprompt, "USERAUTH INFO_REQUEST", MB_OK | MB_ICONINFORMATION);
7079            }
7080    
7081            // プロンプトの数だけ prompt & echo が繰り返される。
7082            for (i = 0 ; i < num ; i++) {
7083                    // get string
7084                    slen = get_uint32_MSBfirst(data);
7085                    data += 4;
7086                    prompt = data;  // prompt
7087                    data += slen;
7088    
7089                    // get boolean
7090                    echo = data[0];
7091                    data += 1;
7092    
7093                    // keyboard-interactive method (2005.3.12 yutaka)
7094                    if (pvar->keyboard_interactive_password_input == 0 &&
7095                            pvar->auth_state.cur_cred.method == SSH_AUTH_TIS) {
7096                            AUTH_set_TIS_mode(pvar, prompt, slen);
7097                            AUTH_advance_to_next_cred(pvar);
7098                            pvar->ssh_state.status_flags &= ~STATUS_DONT_SEND_CREDENTIALS;
7099                            //try_send_credentials(pvar);
7100                            buffer_free(msg);
7101                            return TRUE;
7102                  }                  }
7103    
7104                  len = buffer_len(msg);                  // TODO: ここでプロンプトを表示してユーザから入力させるのが正解。
7105                  outmsg = begin_send_packet(pvar, SSH2_MSG_USERAUTH_INFO_RESPONSE, len);                  s = pvar->auth_state.cur_cred.password;
7106                  memcpy(outmsg, buffer_ptr(msg), len);                  buffer_put_string(msg, s, strlen(s));
                 finish_send_packet(pvar);  
                 buffer_free(msg);  
7107    
7108                  notify_verbose_message(pvar, "SSH2_MSG_USERAUTH_INFO_RESPONSE was sent at handle_SSH2_userauth_inforeq().", LOG_LEVEL_VERBOSE);                  // リトライに対応できるよう、フラグをクリアする。(2010.11.11 yutaka)
7109                    pvar->keyboard_interactive_password_input = 0;
7110          }          }
7111          else { // SSH_AUTH_PAGEANT  
7112            len = buffer_len(msg);
7113            outmsg = begin_send_packet(pvar, SSH2_MSG_USERAUTH_INFO_RESPONSE, len);
7114            memcpy(outmsg, buffer_ptr(msg), len);
7115            finish_send_packet(pvar);
7116            buffer_free(msg);
7117    
7118            notify_verbose_message(pvar, "SSH2_MSG_USERAUTH_INFO_RESPONSE was sent at handle_SSH2_userauth_inforeq().", LOG_LEVEL_VERBOSE);
7119            return TRUE;
7120    }
7121    
7122    BOOL handle_SSH2_userauth_pkok(PTInstVar pvar)
7123    {
7124                  // SSH2_MSG_USERAUTH_PK_OK                  // SSH2_MSG_USERAUTH_PK_OK
7125                  buffer_t *msg = NULL;                  buffer_t *msg = NULL;
7126                  char *s, *username;                  char *s, *username;
# Line 7208  BOOL handle_SSH2_userauth_inforeq(PTInst Line 7221  BOOL handle_SSH2_userauth_inforeq(PTInst
7221                  notify_verbose_message(pvar, "SSH2_MSG_USERAUTH_REQUEST was sent at handle_SSH2_userauth_inforeq().", LOG_LEVEL_VERBOSE);                  notify_verbose_message(pvar, "SSH2_MSG_USERAUTH_REQUEST was sent at handle_SSH2_userauth_inforeq().", LOG_LEVEL_VERBOSE);
7222    
7223                  pvar->pageant_keyfinal = TRUE;                  pvar->pageant_keyfinal = TRUE;
         }  
7224    
7225          return TRUE;                  return TRUE;
7226  }          }
7227    
7228  #define PASSWD_MAXLEN 150  #define PASSWD_MAXLEN 150
7229    

Legend:
Removed from v.6656  
changed lines
  Added in v.6657

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