1f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* 2f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * Dropbear SSH 3f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * 4f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * Copyright (c) 2005 Matt Johnston 5f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * All rights reserved. 6f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * 7f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * Permission is hereby granted, free of charge, to any person obtaining a copy 8f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * of this software and associated documentation files (the "Software"), to deal 9f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * in the Software without restriction, including without limitation the rights 10f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 11f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * copies of the Software, and to permit persons to whom the Software is 12f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * furnished to do so, subject to the following conditions: 13f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * 14f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * The above copyright notice and this permission notice shall be included in 15f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * all copies or substantial portions of the Software. 16f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * 17f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 20f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 21f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 22f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 23f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * SOFTWARE. */ 24f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 25f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include "includes.h" 26f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include "buffer.h" 27f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include "dbutil.h" 28f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include "session.h" 29f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include "ssh.h" 30f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include "runopts.h" 31f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 32f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef ENABLE_CLI_INTERACT_AUTH 33f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 34f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic unsigned char* get_response(unsigned char* prompt) 35f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{ 36f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project FILE* tty = NULL; 37f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project unsigned char* response = NULL; 38f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* not a password, but a reasonable limit */ 39f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project char buf[DROPBEAR_MAX_CLI_PASS]; 40f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project char* ret = NULL; 41f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 42f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project fprintf(stderr, "%s", prompt); 43f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 44f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project tty = fopen(_PATH_TTY, "r"); 45f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (tty) { 46f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project ret = fgets(buf, sizeof(buf), tty); 47f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project fclose(tty); 48f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } else { 49f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project ret = fgets(buf, sizeof(buf), stdin); 50f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 51f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 52f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (ret == NULL) { 53f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project response = (unsigned char*)m_strdup(""); 54f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } else { 55f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project unsigned int buflen = strlen(buf); 56f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* fgets includes newlines */ 57f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (buflen > 0 && buf[buflen-1] == '\n') 58f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project buf[buflen-1] = '\0'; 59f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project response = (unsigned char*)m_strdup(buf); 60f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 61f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 62f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project m_burn(buf, sizeof(buf)); 63f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 64f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return response; 65f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project} 66f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 67f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectvoid recv_msg_userauth_info_request() { 68f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 69f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project unsigned char *name = NULL; 70f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project unsigned char *instruction = NULL; 71f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project unsigned int num_prompts = 0; 72f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project unsigned int i; 73f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 74f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project unsigned char *prompt = NULL; 75f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project unsigned int echo = 0; 76f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project unsigned char *response = NULL; 77f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 78f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project TRACE(("enter recv_msg_recv_userauth_info_request")) 79f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 80f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project cli_ses.interact_request_received = 1; 81f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 82f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project name = buf_getstring(ses.payload, NULL); 83f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project instruction = buf_getstring(ses.payload, NULL); 84f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 85f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* language tag */ 86f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project buf_eatstring(ses.payload); 87f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 88f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project num_prompts = buf_getint(ses.payload); 89f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 90f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (num_prompts >= DROPBEAR_MAX_CLI_INTERACT_PROMPTS) { 91f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project dropbear_exit("Too many prompts received for keyboard-interactive"); 92f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 93f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 94f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* we'll build the response as we go */ 95f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project CHECKCLEARTOWRITE(); 96f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project buf_putbyte(ses.writepayload, SSH_MSG_USERAUTH_INFO_RESPONSE); 97f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project buf_putint(ses.writepayload, num_prompts); 98f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 99f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (strlen(name) > 0) { 100f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project cleantext(name); 101f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project fprintf(stderr, "%s", name); 102f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 103f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project m_free(name); 104f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 105f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (strlen(instruction) > 0) { 106f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project cleantext(instruction); 107f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project fprintf(stderr, "%s", instruction); 108f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 109f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project m_free(instruction); 110f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 111f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project for (i = 0; i < num_prompts; i++) { 112f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project unsigned int response_len = 0; 113f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project prompt = buf_getstring(ses.payload, NULL); 114f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project cleantext(prompt); 115f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 116f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project echo = buf_getbool(ses.payload); 117f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 118f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (!echo) { 119f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project unsigned char* p = getpass_or_cancel(prompt); 120f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project response = m_strdup(p); 121f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project m_burn(p, strlen(p)); 122f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } else { 123f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project response = get_response(prompt); 124f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 125f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 126f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project response_len = strlen(response); 127f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project buf_putstring(ses.writepayload, response, response_len); 128f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project m_burn(response, response_len); 129f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project m_free(response); 130f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 131f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 132f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project encrypt_packet(); 133f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 134f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 135f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project TRACE(("leave recv_msg_recv_userauth_info_request")) 136f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project} 137f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 138f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectvoid cli_auth_interactive() { 139f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 140f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project TRACE(("enter cli_auth_interactive")) 141f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project CHECKCLEARTOWRITE(); 142f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 143f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project buf_putbyte(ses.writepayload, SSH_MSG_USERAUTH_REQUEST); 144f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 145f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* username */ 146f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project buf_putstring(ses.writepayload, cli_opts.username, 147f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project strlen(cli_opts.username)); 148f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 149f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* service name */ 150f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project buf_putstring(ses.writepayload, SSH_SERVICE_CONNECTION, 151f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project SSH_SERVICE_CONNECTION_LEN); 152f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 153f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* method */ 154f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project buf_putstring(ses.writepayload, AUTH_METHOD_INTERACT, 155f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project AUTH_METHOD_INTERACT_LEN); 156f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 157f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* empty language tag */ 158f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project buf_putstring(ses.writepayload, "", 0); 159f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 160f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* empty submethods */ 161f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project buf_putstring(ses.writepayload, "", 0); 162f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 163f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project encrypt_packet(); 164f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project cli_ses.interact_request_received = 0; 165f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 166f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project TRACE(("leave cli_auth_interactive")) 167f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 168f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project} 169f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif /* ENABLE_CLI_INTERACT_AUTH */ 170