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); + } + } }