Reading bigger blocks from network before decryption.
Significantly increases performance.
This commit is contained in:
18
src/packet.c
18
src/packet.c
@@ -745,7 +745,7 @@ int libssh2_packet_read(LIBSSH2_SESSION *session, int should_block)
|
|||||||
/* Temporary Buffer
|
/* Temporary Buffer
|
||||||
* The largest blocksize (currently) is 32, the largest MAC (currently) is 20
|
* The largest blocksize (currently) is 32, the largest MAC (currently) is 20
|
||||||
*/
|
*/
|
||||||
unsigned char block[2 * 32], *payload, *s, tmp[6];
|
unsigned char block[2 * 32], *payload, *s, *p, tmp[6];
|
||||||
ssize_t read_len;
|
ssize_t read_len;
|
||||||
unsigned long blocksize = session->remote.crypt->blocksize;
|
unsigned long blocksize = session->remote.crypt->blocksize;
|
||||||
unsigned long packet_len, payload_len;
|
unsigned long packet_len, payload_len;
|
||||||
@@ -822,12 +822,21 @@ int libssh2_packet_read(LIBSSH2_SESSION *session, int should_block)
|
|||||||
memcpy(s, block + 5, blocksize - 5);
|
memcpy(s, block + 5, blocksize - 5);
|
||||||
s += blocksize - 5;
|
s += blocksize - 5;
|
||||||
|
|
||||||
while ((s - payload) < payload_len) {
|
p = s;
|
||||||
read_len = libssh2_blocking_read(session, block, blocksize);
|
while (p - payload < payload_len) {
|
||||||
if (read_len < blocksize) {
|
read_len = payload_len - (p - payload);
|
||||||
|
if (read_len > 4096) read_len = 4096;
|
||||||
|
|
||||||
|
if (libssh2_blocking_read(session, p, read_len) < read_len) {
|
||||||
LIBSSH2_FREE(session, payload);
|
LIBSSH2_FREE(session, payload);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
p += read_len;
|
||||||
|
|
||||||
|
while (s < p) {
|
||||||
|
memcpy(block, s, blocksize);
|
||||||
|
|
||||||
if (session->remote.crypt->flags & LIBSSH2_CRYPT_METHOD_FLAG_EVP) {
|
if (session->remote.crypt->flags & LIBSSH2_CRYPT_METHOD_FLAG_EVP) {
|
||||||
EVP_Cipher(ctx, block + blocksize, block, blocksize);
|
EVP_Cipher(ctx, block + blocksize, block, blocksize);
|
||||||
memcpy(s, block + blocksize, blocksize);
|
memcpy(s, block + blocksize, blocksize);
|
||||||
@@ -842,6 +851,7 @@ int libssh2_packet_read(LIBSSH2_SESSION *session, int should_block)
|
|||||||
|
|
||||||
s += blocksize;
|
s += blocksize;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
read_len = libssh2_blocking_read(session, block, session->remote.mac->mac_len);
|
read_len = libssh2_blocking_read(session, block, session->remote.mac->mac_len);
|
||||||
if (read_len < session->remote.mac->mac_len) {
|
if (read_len < session->remote.mac->mac_len) {
|
||||||
|
Reference in New Issue
Block a user