From 756aa3b7539c2abe7d4f7f32fa0864e409b682ca Mon Sep 17 00:00:00 2001 From: Kenny Root Date: Sat, 20 Dec 2025 16:21:53 +0000 Subject: [PATCH] Optimize BlockCipher throughput This allows just a single JCE call for multiple blocks which should help with optimizing AES throughput. There might still be gains to be had with window optimization. On the desktop benchmark test, this increases the throughput by 5x with 32KiB blocks. --- src/main/java/com/trilead/ssh2/crypto/cipher/AES.java | 9 +++++++++ .../java/com/trilead/ssh2/crypto/cipher/BlockCipher.java | 7 +++++++ 2 files changed, 16 insertions(+) diff --git a/src/main/java/com/trilead/ssh2/crypto/cipher/AES.java b/src/main/java/com/trilead/ssh2/crypto/cipher/AES.java index 3340a311..b8a9fbdb 100644 --- a/src/main/java/com/trilead/ssh2/crypto/cipher/AES.java +++ b/src/main/java/com/trilead/ssh2/crypto/cipher/AES.java @@ -44,6 +44,15 @@ public void transformBlock(byte[] src, int srcoff, byte[] dst, int dstoff) { } } + @Override + public void transformBlocks(byte[] src, int srcoff, byte[] dst, int dstoff, int numBlocks) { + try { + cipher.update(src, srcoff, numBlocks * AES_BLOCK_SIZE, dst, dstoff); + } catch (ShortBufferException e) { + throw new AssertionError(e); + } + } + /** * AES in CBC (Cipher Block Chaining) mode for SSH. */ diff --git a/src/main/java/com/trilead/ssh2/crypto/cipher/BlockCipher.java b/src/main/java/com/trilead/ssh2/crypto/cipher/BlockCipher.java index 7c1abd41..b331943d 100644 --- a/src/main/java/com/trilead/ssh2/crypto/cipher/BlockCipher.java +++ b/src/main/java/com/trilead/ssh2/crypto/cipher/BlockCipher.java @@ -13,4 +13,11 @@ public interface BlockCipher int getBlockSize(); void transformBlock(byte[] src, int srcoff, byte[] dst, int dstoff); + + default void transformBlocks(byte[] src, int srcoff, byte[] dst, int dstoff, int numBlocks) { + int blockSize = getBlockSize(); + for (int i = 0; i < numBlocks; i++) { + transformBlock(src, srcoff + i * blockSize, dst, dstoff + i * blockSize); + } + } }