Skip to content

Commit

Permalink
Improve speed of cipher operations for large inputs
Browse files Browse the repository at this point in the history
  • Loading branch information
KostasTsiounis committed Jun 26, 2023
1 parent 8790a2e commit 04711e8
Showing 1 changed file with 46 additions and 13 deletions.
59 changes: 46 additions & 13 deletions src/java.base/share/classes/com/sun/crypto/provider/CipherCore.java
Original file line number Diff line number Diff line change
Expand Up @@ -749,12 +749,26 @@ byte[] doFinal(byte[] input, int inputOffset, int inputLen)
throws IllegalBlockSizeException, BadPaddingException {
try {
byte[] output = new byte[getOutputSizeByOperation(inputLen, true)];
byte[] finalBuf = prepareInputBuffer(input, inputOffset,
inputLen, output, 0);
int outputOffset = 0;
int outLen = 0;

if (inputLen > 0) {
/*
* Call the update() method to get rid of as many bytes as
* possible before potentially copying array.
*/
int updateOutLen = update(input, inputOffset, inputLen, output, outputOffset);
inputOffset = inputLen;
inputLen = 0;
outputOffset += updateOutLen;
outLen = updateOutLen;
}

byte[] finalBuf = prepareInputBuffer(input, inputOffset, inputLen, output, outputOffset);
int finalOffset = (finalBuf == input) ? inputOffset : 0;
int finalBufLen = (finalBuf == input) ? inputLen : finalBuf.length;

int outLen = fillOutputBuffer(finalBuf, finalOffset, output, 0,
outLen += fillOutputBuffer(finalBuf, finalOffset, output, outputOffset,
finalBufLen, input);

endDoFinal();
Expand Down Expand Up @@ -818,13 +832,6 @@ int doFinal(byte[] input, int inputOffset, int inputLen, byte[] output,
int estOutSize = getOutputSizeByOperation(inputLen, true);
int outputCapacity = checkOutputCapacity(output, outputOffset,
estOutSize);
int offset = outputOffset;
byte[] finalBuf = prepareInputBuffer(input, inputOffset,
inputLen, output, outputOffset);
byte[] internalOutput = null; // for decrypting only

int finalOffset = (finalBuf == input) ? inputOffset : 0;
int finalBufLen = (finalBuf == input) ? inputLen : finalBuf.length;

if (decrypting) {
// if the size of specified output buffer is less than
Expand All @@ -835,18 +842,44 @@ int doFinal(byte[] input, int inputOffset, int inputLen, byte[] output,
if (outputCapacity < estOutSize) {
cipher.save();
}
}

int outLen = 0;
int estFinalBuffSize = estOutSize;
if (inputLen > 0) {
/*
* Call the update() method to get rid of as many bytes as
* possible before potentially copying array.
*/
int updateOutLen = update(input, inputOffset, inputLen, output, outputOffset);
inputOffset = inputLen;
inputLen = 0;
outputOffset += updateOutLen;
outLen += updateOutLen;
estFinalBuffSize -= updateOutLen;
}

int offset = outputOffset;
byte[] finalBuf = prepareInputBuffer(input, inputOffset, inputLen, output, outputOffset);
byte[] internalOutput = null; // for decrypting only

int finalOffset = (finalBuf == input) ? inputOffset : 0;
int finalBufLen = (finalBuf == input) ? inputLen : finalBuf.length;

if (decrypting) {
if (outputCapacity < estOutSize || padding != null) {
// create temporary output buffer if the estimated size is larger
// than the user-provided buffer or a padding needs to be removed
// before copying the unpadded result to the output buffer
internalOutput = new byte[estOutSize];
internalOutput = new byte[estFinalBuffSize];
offset = 0;
}
}

byte[] outBuffer = (internalOutput != null) ? internalOutput : output;
int outLen = fillOutputBuffer(finalBuf, finalOffset, outBuffer,
int outBuffLen = fillOutputBuffer(finalBuf, finalOffset, outBuffer,
offset, finalBufLen, input);
outLen += outBuffLen;

if (decrypting) {

Expand All @@ -860,7 +893,7 @@ int doFinal(byte[] input, int inputOffset, int inputLen, byte[] output,
// copy the result into user-supplied output buffer
if (internalOutput != null) {
System.arraycopy(internalOutput, 0, output, outputOffset,
outLen);
outBuffLen);
// decrypt mode. Zero out output data that's not required
Arrays.fill(internalOutput, (byte) 0x00);
}
Expand Down

0 comments on commit 04711e8

Please sign in to comment.