Reading bigger blocks from network before decryption.

Significantly increases performance.
This commit is contained in:
Mikhail Gusarov
2006-11-27 07:31:28 +00:00
parent 3a33680e14
commit 1c1c74479e

View File

@@ -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) {