Well, I'm slightly pissed.
Why does OpenSSL do stupid shit like this?
type = packet_read();
if (type != SSH2_MSG_SERVICE_ACCEPT)
fatal("Server denied authentication request: %d", type);
if (packet_remaining() > 0) {
char *reply = packet_get_string(NULL);
debug2("service_accept: %s", reply);
free(reply);
} else {
debug2("buggy server: service_accept w/o service");
}
packet_check_eom();
debug("SSH2_MSG_SERVICE_ACCEPT received");
Note the genius inclusion of packet_check_eom() after decoding SERVICE_ACCEPT. Guess what this line does?
#define ssh_packet_check_eom(ssh) \
do { \
int _len = ssh_packet_remaining(ssh); \
if (_len > 0) { \
logit("Packet integrity error (%d bytes remaining) at %s:%d", \
_len ,__FILE__, __LINE__); \
ssh_packet_disconnect(ssh, \
"Packet integrity error."); \
} \
} while (0)
#define packet_check_eom() \
ssh_packet_check_eom(active_state)
Yes. It disconnects if there's any extra data after the recognized field in SERVICE_ACCEPT.
What possible purpose does this serve?
What possible purpose at all, other than to sabotage future extension?
Thanks to this, we cannot add a field to SERVICE_ACCEPT so that the server could advertise what signature algorithms it accepts for user authentication.
Thank you, OpenSSH. /s
Again.