aboutsummaryrefslogtreecommitdiff
path: root/libssh/packet1.c
diff options
context:
space:
mode:
Diffstat (limited to 'libssh/packet1.c')
-rw-r--r--libssh/packet1.c95
1 files changed, 39 insertions, 56 deletions
diff --git a/libssh/packet1.c b/libssh/packet1.c
index 5c404378..7afab191 100644
--- a/libssh/packet1.c
+++ b/libssh/packet1.c
@@ -26,13 +26,13 @@
#include "libssh/session.h"
#include "libssh/buffer.h"
#include "libssh/socket.h"
-
+#include "libssh/kex.h"
#ifdef WITH_SSH1
ssh_packet_callback default_packet_handlers1[]= {
NULL, //SSH_MSG_NONE 0
- NULL, //SSH_MSG_DISCONNECT 1
- NULL, //SSH_SMSG_PUBLIC_KEY 2
+ ssh_packet_disconnect1, //SSH_MSG_DISCONNECT 1
+ ssh_packet_publickey1, //SSH_SMSG_PUBLIC_KEY 2
NULL, //SSH_CMSG_SESSION_KEY 3
NULL, //SSH_CMSG_USER 4
NULL, //SSH_CMSG_AUTH_RHOSTS 5
@@ -44,17 +44,17 @@ ssh_packet_callback default_packet_handlers1[]= {
NULL, //SSH_CMSG_WINDOW_SIZE 11
NULL, //SSH_CMSG_EXEC_SHELL 12
NULL, //SSH_CMSG_EXEC_CMD 13
- NULL, //SSH_SMSG_SUCCESS 14
- NULL, //SSH_SMSG_FAILURE 15
+ ssh_packet_smsg_success1, //SSH_SMSG_SUCCESS 14
+ ssh_packet_smsg_failure1, //SSH_SMSG_FAILURE 15
NULL, //SSH_CMSG_STDIN_DATA 16
- NULL, //SSH_SMSG_STDOUT_DATA 17
- NULL, //SSH_SMSG_STDERR_DATA 18
+ ssh_packet_data1, //SSH_SMSG_STDOUT_DATA 17
+ ssh_packet_data1, //SSH_SMSG_STDERR_DATA 18
NULL, //SSH_CMSG_EOF 19
NULL, //SSH_SMSG_EXITSTATUS 20
NULL, //SSH_MSG_CHANNEL_OPEN_CONFIRMATION 21
NULL, //SSH_MSG_CHANNEL_OPEN_FAILURE 22
NULL, //SSH_MSG_CHANNEL_DATA 23
- NULL, //SSH_MSG_CHANNEL_CLOSE 24
+ ssh_packet_close1, //SSH_MSG_CHANNEL_CLOSE 24
NULL, //SSH_MSG_CHANNEL_CLOSE_CONFIRMATION 25
NULL, //SSH_CMSG_X11_REQUEST_FORWARDING 26
NULL, //SSH_SMSG_X11_OPEN 27
@@ -62,19 +62,11 @@ ssh_packet_callback default_packet_handlers1[]= {
NULL, //SSH_MSG_PORT_OPEN 29
NULL, //SSH_CMSG_AGENT_REQUEST_FORWARDING 30
NULL, //SSH_SMSG_AGENT_OPEN 31
- NULL, //SSH_MSG_IGNORE 32
+ ssh_packet_ignore_callback, //SSH_MSG_IGNORE 32
NULL, //SSH_CMSG_EXIT_CONFIRMATION 33
NULL, //SSH_CMSG_X11_REQUEST_FORWARDING 34
NULL, //SSH_CMSG_AUTH_RHOSTS_RSA 35
- NULL, //SSH_MSG_DEBUG 36
- NULL, //SSH_CMSG_REQUEST_COMPRESSION 37
- NULL, //SSH_CMSG_MAX_PACKET_SIZE 38
- NULL, //SSH_CMSG_AUTH_TIS 39
- NULL, //SSH_SMSG_AUTH_TIS_CHALLENGE 40
- NULL, //SSH_CMSG_AUTH_TIS_RESPONSE 41
- NULL, //SSH_CMSG_AUTH_KERBEROS 42
- NULL, //SSH_SMSG_AUTH_KERBEROS_RESPONSE 43
- NULL, //SSH_CMSG_HAVE_KERBEROS_TGT 44
+ ssh_packet_ignore_callback, //SSH_MSG_DEBUG 36
};
/** @internal
@@ -316,37 +308,37 @@ error:
return rc; /* SSH_OK, AGAIN or ERROR */
}
+SSH_PACKET_CALLBACK(ssh_packet_disconnect1){
+ (void)packet;
+ (void)user;
+ (void)type;
+ ssh_log(session, SSH_LOG_PACKET, "Received SSH_MSG_DISCONNECT");
+ ssh_set_error(session, SSH_FATAL, "Received SSH_MSG_DISCONNECT");
+ ssh_socket_close(session->socket);
+ session->alive = 0;
+ return SSH_PACKET_USED;
+}
-static void packet_parse(ssh_session session) {
- uint8_t type = session->in_packet.type;
-
- if (session->version == 1) {
- /* SSH-1 */
- switch(type) {
- case SSH_MSG_DISCONNECT:
- ssh_log(session, SSH_LOG_PACKET, "Received SSH_MSG_DISCONNECT");
- ssh_set_error(session, SSH_FATAL, "Received SSH_MSG_DISCONNECT");
+SSH_PACKET_CALLBACK(ssh_packet_smsg_success1){
+ if(session->session_state==SSH_SESSION_STATE_KEXINIT_RECEIVED){
+ session->session_state=SSH_SESSION_STATE_AUTHENTICATING;
+ return SSH_PACKET_USED;
+ } else {
+ return ssh_packet_channel_success(session,type,packet,user);
+ }
+}
- ssh_socket_close(session->socket);
- session->alive = 0;
- return;
- case SSH_SMSG_STDOUT_DATA:
- case SSH_SMSG_STDERR_DATA:
- case SSH_SMSG_EXITSTATUS:
- channel_handle1(session,type);
- return;
- case SSH_MSG_DEBUG:
- case SSH_MSG_IGNORE:
- break;
- default:
- ssh_log(session, SSH_LOG_PACKET,
- "Unexpected message code %d", type);
- }
- return;
+SSH_PACKET_CALLBACK(ssh_packet_smsg_failure1){
+ if(session->session_state==SSH_SESSION_STATE_KEXINIT_RECEIVED){
+ session->session_state=SSH_SESSION_STATE_ERROR;
+ ssh_set_error(session,SSH_FATAL,"Key exchange failed: received SSH_SMSG_FAILURE");
+ return SSH_PACKET_USED;
} else {
+ return ssh_packet_channel_failure(session,type,packet,user);
}
}
+
int packet_wait(ssh_session session, int type, int blocking) {
enter_function();
@@ -363,24 +355,15 @@ int packet_wait(ssh_session session, int type, int blocking) {
session->in_packet.type);
switch (session->in_packet.type) {
case SSH_MSG_DISCONNECT:
- packet_parse(session);
- leave_function();
- return SSH_ERROR;
case SSH_SMSG_STDOUT_DATA:
case SSH_SMSG_STDERR_DATA:
- case SSH_SMSG_EXITSTATUS:
- if (channel_handle1(session,type) < 0) {
- leave_function();
- return SSH_ERROR;
- }
- break;
case SSH_MSG_DEBUG:
case SSH_MSG_IGNORE:
+ ssh_packet_process(session,type);
+ break;
+ case SSH_SMSG_EXITSTATUS:
+ //This packet must be parsed too
break;
- /* case SSH2_MSG_CHANNEL_CLOSE:
- packet_parse(session);
- break;;
- */
default:
if (type && (type != session->in_packet.type)) {
ssh_set_error(session, SSH_FATAL,