1
0
mirror of https://git.libssh.org/projects/libssh.git synced 2025-08-10 06:23:01 +03:00

Reformat ssh_packet_socket_callback

Signed-off-by: Jakub Jelen <jjelen@redhat.com>
Reviewed-by: Andreas Schneider <asn@cryptomilk.org>
(cherry picked from commit 19c4de7350)
This commit is contained in:
Jakub Jelen
2023-03-01 10:25:33 +01:00
parent 44ceeb4d53
commit 298155da71

View File

@@ -1052,9 +1052,11 @@ static bool ssh_packet_need_rekey(ssh_session session,
* @param user pointer to current ssh_session
* @param data pointer to the data received
* @len length of data received. It might not be enough for a complete packet
* @returns number of bytes read and processed.
* @returns number of bytes read and processed. Zero means only partial packet
* received and negative value means error.
*/
size_t ssh_packet_socket_callback(const void *data, size_t receivedlen, void *user)
size_t
ssh_packet_socket_callback(const void *data, size_t receivedlen, void *user)
{
ssh_session session = (ssh_session)user;
uint32_t blocksize = 8;
@@ -1066,7 +1068,7 @@ size_t ssh_packet_socket_callback(const void *data, size_t receivedlen, void *us
uint8_t *cleartext_packet = NULL;
uint8_t *packet_second_block = NULL;
uint8_t *mac = NULL;
size_t packet_remaining;
size_t packet_remaining, packet_offset;
uint32_t packet_len, compsize, payloadsize;
uint8_t padding;
size_t processed = 0; /* number of bytes processed from the callback */
@@ -1112,7 +1114,7 @@ size_t ssh_packet_socket_callback(const void *data, size_t receivedlen, void *us
session->packet_state == PACKET_STATE_PROCESSING ?
"PROCESSING" : "unknown");
#endif
switch(session->packet_state) {
switch (session->packet_state) {
case PACKET_STATE_INIT:
if (receivedlen < lenfield_blocksize + etm_packet_offset) {
/*
@@ -1145,11 +1147,13 @@ size_t ssh_packet_socket_callback(const void *data, size_t receivedlen, void *us
}
if (!etm) {
ptr = ssh_buffer_allocate(session->in_buffer, lenfield_blocksize);
ptr = ssh_buffer_allocate(session->in_buffer,
lenfield_blocksize);
if (ptr == NULL) {
goto error;
}
packet_len = ssh_packet_decrypt_len(session, ptr, (uint8_t *)data);
packet_len = ssh_packet_decrypt_len(session, ptr,
(uint8_t *)data);
to_be_read = packet_len - lenfield_blocksize + sizeof(uint32_t);
} else {
/* Length is unencrypted in case of Encrypt-then-MAC */
@@ -1179,11 +1183,11 @@ size_t ssh_packet_socket_callback(const void *data, size_t receivedlen, void *us
FALL_THROUGH;
case PACKET_STATE_SIZEREAD:
packet_len = session->in_packet.len;
processed = lenfield_blocksize + etm_packet_offset;
packet_offset = processed = lenfield_blocksize + etm_packet_offset;
to_be_read = packet_len + sizeof(uint32_t) + current_macsize;
/* if to_be_read is zero, the whole packet was blocksize bytes. */
if (to_be_read != 0) {
if (receivedlen < (unsigned long)to_be_read) {
if (receivedlen < (unsigned long)to_be_read) {
/* give up, not enough data in buffer */
SSH_LOG(SSH_LOG_PACKET,
"packet: partial packet (read len) "
@@ -1194,13 +1198,12 @@ size_t ssh_packet_socket_callback(const void *data, size_t receivedlen, void *us
return 0;
}
packet_second_block = (uint8_t*)data + lenfield_blocksize + etm_packet_offset;
packet_second_block = (uint8_t*)data + packet_offset;
processed = to_be_read - current_macsize;
}
/* remaining encrypted bytes from the packet, MAC not included */
packet_remaining =
packet_len - (lenfield_blocksize - sizeof(uint32_t) + etm_packet_offset);
packet_remaining = packet_len - (packet_offset - sizeof(uint32_t));
cleartext_packet = ssh_buffer_allocate(session->in_buffer,
packet_remaining);
if (cleartext_packet == NULL) {
@@ -1223,16 +1226,16 @@ size_t ssh_packet_socket_callback(const void *data, size_t receivedlen, void *us
}
}
/*
* Decrypt the packet. In case of EtM mode, the length is already
* known as it's unencrypted. In the other case, lenfield_blocksize bytes
* already have been decrypted.
* Decrypt the packet. In case of EtM mode, the length is
* already known as it's unencrypted. In the other case,
* lenfield_blocksize bytes already have been decrypted.
*/
if (packet_remaining > 0) {
rc = ssh_packet_decrypt(session,
cleartext_packet,
(uint8_t *)data,
lenfield_blocksize + etm_packet_offset,
processed - (lenfield_blocksize + etm_packet_offset));
packet_offset,
processed - packet_offset);
if (rc < 0) {
ssh_set_error(session,
SSH_FATAL,
@@ -1242,9 +1245,10 @@ size_t ssh_packet_socket_callback(const void *data, size_t receivedlen, void *us
}
if (crypto->in_hmac != SSH_HMAC_NONE && !etm) {
ssh_buffer in = session->in_buffer;
rc = ssh_packet_hmac_verify(session,
ssh_buffer_get(session->in_buffer),
ssh_buffer_get_len(session->in_buffer),
ssh_buffer_get(in),
ssh_buffer_get_len(in),
mac,
crypto->in_hmac);
if (rc < 0) {
@@ -1295,9 +1299,10 @@ size_t ssh_packet_socket_callback(const void *data, size_t receivedlen, void *us
compsize = ssh_buffer_get_len(session->in_buffer);
#ifdef WITH_ZLIB
if (crypto && crypto->do_compress_in
&& ssh_buffer_get_len(session->in_buffer) > 0) {
rc = decompress_buffer(session, session->in_buffer,MAX_PACKET_LEN);
if (crypto && crypto->do_compress_in &&
ssh_buffer_get_len(session->in_buffer) > 0) {
rc = decompress_buffer(session, session->in_buffer,
MAX_PACKET_LEN);
if (rc < 0) {
goto error;
}
@@ -1324,13 +1329,15 @@ size_t ssh_packet_socket_callback(const void *data, size_t receivedlen, void *us
session->packet_state = PACKET_STATE_PROCESSING;
ssh_packet_parse_type(session);
SSH_LOG(SSH_LOG_PACKET,
"packet: read type %hhd [len=%d,padding=%hhd,comp=%d,payload=%d]",
session->in_packet.type, packet_len, padding, compsize, payloadsize);
"packet: read type %hhd [len=%" PRIu32 ",padding=%hhd,"
"comp=%" PRIu32 ",payload=%" PRIu32 "]",
session->in_packet.type, packet_len, padding, compsize,
payloadsize);
/* Check if the packet is expected */
filter_result = ssh_packet_incoming_filter(session);
switch(filter_result) {
switch (filter_result) {
case SSH_PACKET_ALLOWED:
/* Execute callbacks */
ssh_packet_process(session, session->in_packet.type);
@@ -1355,7 +1362,8 @@ size_t ssh_packet_socket_callback(const void *data, size_t receivedlen, void *us
ptr = ((uint8_t*)data) + processed;
rc = ssh_packet_socket_callback(ptr, receivedlen - processed,user);
rc = ssh_packet_socket_callback(ptr, receivedlen - processed,
user);
processed += rc;
}
@@ -1381,8 +1389,8 @@ size_t ssh_packet_socket_callback(const void *data, size_t receivedlen, void *us
session->packet_state);
error:
session->session_state= SSH_SESSION_STATE_ERROR;
SSH_LOG(SSH_LOG_PACKET,"Packet: processed %zu bytes", processed);
session->session_state = SSH_SESSION_STATE_ERROR;
SSH_LOG(SSH_LOG_PACKET, "Packet: processed %zu bytes", processed);
return processed;
}