RFR: 8318756 Create better internal buffer for AEADs

Anthony Scarpino ascarpino at openjdk.org
Thu Nov 23 01:11:27 UTC 2023


On Fri, 3 Nov 2023 04:08:27 GMT, Anthony Scarpino <ascarpino at openjdk.org> wrote:

> Hi,
> 
> I need a review for a new internal buffer class called AEADBufferStream.  AEADBufferStream extends ByteArrayOutputStream, but eliminates some data checking and copying that are not necessary for what GaloisCounterMode.java and ChaCha20Cipher.java need.  
> 
> The changes greatest benefit is with decryption operations.  ChaCha20-Poly1305 had larger performance gains by adopting similar techniques that AES/GCM already uses. 
> 
> The new buffer shows up to 21% bytes/sec performance increase for decryption for ChaCha20-Poly1305 and 12% for AES/GCM.  16K data sizes saw a memory usage reduction of 46% with and 83% with ChaCha20-Poly1305.  These results come from the JMH tests updated in this request and memory usage using the JMH gc profile gc.alloc.rate.norm entry
> 
> thanks
> 
> Tony

Noteworthy perf data (ops/sec)
<html xmlns:v="urn:schemas-microsoft-com:vml"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns="http://www.w3.org/TR/REC-html40">

<head>

<meta name=ProgId content=Excel.Sheet>
<meta name=Generator content="Microsoft Excel 15">
<link id=Main-File rel=Main-File
href="file:////Users/ascarpin/Library/Group%20Containers/UBF8T346G9.Office/TemporaryItems/msohtmlclip/clip.htm">
<link rel=File-List
href="file:////Users/ascarpin/Library/Group%20Containers/UBF8T346G9.Office/TemporaryItems/msohtmlclip/clip_filelist.xml">



</head>

<body link="#0563C1" vlink="#954F72">


Benchmark | dataMethod | dataSize | AEADBuffer | jdk-dev |  Diff
-- | -- | -- | -- | -- | --
CC20P1305ByteBuffer.decrypt | direct | 1024 | 577804.81 | 549630.383 | 105.13%
CC20P1305ByteBuffer.decrypt | direct | 1500 | 424441.663 | 401452.037 | 105.73%
CC20P1305ByteBuffer.decrypt | direct | 4096 | 186333.196 | 152909.993 | 121.86%
CC20P1305ByteBuffer.decrypt | direct | 16384 | 49698.562 | 41966.387 | 118.42%
CC20P1305ByteBuffer.decrypt | heap | 1024 | 586145.31 | 514277.384 | 113.97%
CC20P1305ByteBuffer.decrypt | heap | 1500 | 429055.718 | 380859.773 | 112.65%
CC20P1305ByteBuffer.decrypt | heap | 4096 | 179807.069 | 179241.327 | 100.32%
CC20P1305ByteBuffer.decrypt | heap | 16384 | 51096.478 | 51097.68 | 100.00%
CC20P1305ByteBuffer.decryptMultiPart | direct | 1024 | 553804.884 | 506750.657 | 109.29%
CC20P1305ByteBuffer.decryptMultiPart | direct | 1500 | 399307.809 | 365691.011 | 109.19%
CC20P1305ByteBuffer.decryptMultiPart | direct | 4096 | 180940.646 | 165152.892 | 109.56%
CC20P1305ByteBuffer.decryptMultiPart | direct | 16384 | 49117.754 | 40808.57 | 120.36%
CC20P1305ByteBuffer.decryptMultiPart | heap | 1024 | 567976.828 | 539087.765 | 105.36%
CC20P1305ByteBuffer.decryptMultiPart | heap | 1500 | 415070.529 | 400061.343 | 103.75%
CC20P1305ByteBuffer.decryptMultiPart | heap | 4096 | 180878.684 | 178758.204 | 101.19%
CC20P1305ByteBuffer.decryptMultiPart | heap | 16384 | 48541.737 | 46645.72 | 104.06%
AESGCMByteBuffer.decrypt | heap | 1024 | 1826361.53 | 1796033.97 | 101.69%
AESGCMByteBuffer.decrypt | heap | 1500 | 1245406.42 | 1109318.44 | 112.27%
AESGCMByteBuffer.decrypt | heap | 4096 | 641359.437 | 617315.646 | 103.89%
AESGCMByteBuffer.decrypt | heap | 16384 | 247719.061 | 238448.044 | 103.89%
AESGCMByteBuffer.decryptMultiPart | direct | 1024 | 1574668.85 | 1483599.15 | 106.14%
AESGCMByteBuffer.decryptMultiPart | direct | 1500 | 1172906.6 | 1100561.62 | 106.57%
AESGCMByteBuffer.decryptMultiPart | direct | 4096 | 545868.754 | 513626.344 | 106.28%
AESGCMByteBuffer.decryptMultiPart | direct | 16384 | 170901.637 | 152173.375 | 112.31%
AESGCMByteBuffer.decryptMultiPart | heap | 1024 | 1889488.77 | 1759824.14 | 107.37%
AESGCMByteBuffer.decryptMultiPart | heap | 1500 | 1355897.08 | 1289243.83 | 105.17%
AESGCMByteBuffer.decryptMultiPart | heap | 4096 | 650425.638 | 622200.295 | 104.54%
AESGCMByteBuffer.decryptMultiPart | heap | 16384 | 235059.195 | 226745.378 | 103.67%

</body></html>

Memory reduction (bytes / op)
<html xmlns:v="urn:schemas-microsoft-com:vml"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns="http://www.w3.org/TR/REC-html40">

<head>
<meta name=ProgId content=Excel.Sheet>
<meta name=Generator content="Microsoft Excel 15">
<link id=Main-File rel=Main-File
href="file:////Users/ascarpin/Library/Group%20Containers/UBF8T346G9.Office/TemporaryItems/msohtmlclip/clip.htm">
<link rel=File-List
href="file:////Users/ascarpin/Library/Group%20Containers/UBF8T346G9.Office/TemporaryItems/msohtmlclip/clip_filelist.xml">

</head>

<body link="#0563C1" vlink="#954F72">

Benchmark | (dataMethod) | (dataSize) | AEADBuffer | jdk-dev |  Reduction
-- | -- | -- | -- | -- | --
CC20P1305ByteBuffer.decrypt:gc.alloc.rate.norm | direct | 1024 | 3600.006 | 5704.006 | 36.89%
CC20P1305ByteBuffer.decrypt:gc.alloc.rate.norm | direct | 1500 | 4080.008 | 6664.008 | 38.78%
CC20P1305ByteBuffer.decrypt:gc.alloc.rate.norm | direct | 4096 | 6672.018 | 28280.022 | 76.41%
CC20P1305ByteBuffer.decrypt:gc.alloc.rate.norm | direct | 16384 | 18960.069 | 102040.082 | 81.42%
CC20P1305ByteBuffer.decrypt:gc.alloc.rate.norm | heap | 1024 | 2544.006 | 3608.007 | 29.49%
CC20P1305ByteBuffer.decrypt:gc.alloc.rate.norm | heap | 1500 | 2544.008 | 3608.009 | 29.49%
CC20P1305ByteBuffer.decrypt:gc.alloc.rate.norm | heap | 4096 | 2544.019 | 3608.019 | 29.49%
CC20P1305ByteBuffer.decrypt:gc.alloc.rate.norm | heap | 16384 | 2544.068 | 3608.068 | 29.49%
CC20P1305ByteBuffer.decryptMultiPart:gc.alloc.rate.norm | direct | 1024 | 3688.006 | 9352.007 | 60.56%
CC20P1305ByteBuffer.decryptMultiPart:gc.alloc.rate.norm | direct | 1500 | 4168.009 | 11032.009 | 62.22%
CC20P1305ByteBuffer.decryptMultiPart:gc.alloc.rate.norm | direct | 4096 | 6760.019 | 24232.021 | 72.10%
CC20P1305ByteBuffer.decryptMultiPart:gc.alloc.rate.norm | direct | 16384 | 19048.07 | 114344.084 | 83.34%
CC20P1305ByteBuffer.decryptMultiPart:gc.alloc.rate.norm | heap | 1024 | 4200.006 | 6728.006 | 37.57%
CC20P1305ByteBuffer.decryptMultiPart:gc.alloc.rate.norm | heap | 1500 | 4920.008 | 7208.008 | 31.74%
CC20P1305ByteBuffer.decryptMultiPart:gc.alloc.rate.norm | heap | 4096 | 8808.019 | 13928.019 | 36.76%
CC20P1305ByteBuffer.decryptMultiPart:gc.alloc.rate.norm | heap | 16384 | 27240.071 | 44648.074 | 38.99%
CC20P1305Bench.decrypt:gc.alloc.rate.norm |   | 1024 | 2544.006 | 3608.007 | 29.49%
CC20P1305Bench.decrypt:gc.alloc.rate.norm |   | 1500 | 2544.008 | 3608.009 | 29.49%
CC20P1305Bench.decrypt:gc.alloc.rate.norm |   | 4096 | 2544.02 | 3608.019 | 29.49%
CC20P1305Bench.decrypt:gc.alloc.rate.norm |   | 16384 | 2544.067 | 3608.068 | 29.49%
CC20P1305Bench.decryptMultiPart:gc.alloc.rate.norm |   | 1024 | 4200.006 | 6728.006 | 37.57%
CC20P1305Bench.decryptMultiPart:gc.alloc.rate.norm |   | 1500 | 4920.008 | 7208.008 | 31.74%
CC20P1305Bench.decryptMultiPart:gc.alloc.rate.norm |   | 4096 | 8808.019 | 13928.019 | 36.76%
CC20P1305Bench.decryptMultiPart:gc.alloc.rate.norm |   | 16384 | 27240.07 | 44648.073 | 38.99%
AESGCMByteBuffer.decryptMultiPart:gc.alloc.rate.norm | direct | 1024 | 3240.002 | 4248.002 | 23.73%
AESGCMByteBuffer.decryptMultiPart:gc.alloc.rate.norm | direct | 1500 | 4344.003 | 5832.003 | 25.51%
AESGCMByteBuffer.decryptMultiPart:gc.alloc.rate.norm | direct | 4096 | 6312.006 | 10392.007 | 39.26%
AESGCMByteBuffer.decryptMultiPart:gc.alloc.rate.norm | direct | 16384 | 41704.021 | 58072.023 | 28.19%
AESGCMByteBuffer.decryptMultiPart:gc.alloc.rate.norm | heap | 1024 | 1704.002 | 2184.002 | 21.98%
AESGCMByteBuffer.decryptMultiPart:gc.alloc.rate.norm | heap | 1500 | 2040.003 | 2760.003 | 26.09%
AESGCMByteBuffer.decryptMultiPart:gc.alloc.rate.norm | heap | 4096 | 3240.005 | 5256.006 | 38.36%
AESGCMByteBuffer.decryptMultiPart:gc.alloc.rate.norm | heap | 16384 | 9328.015 | 17488.016 | 46.66%
AESGCMBench.decryptMultiPart:gc.alloc.rate.norm |   | 1024 | 1736.002 | 2216.002 | 21.66%
AESGCMBench.decryptMultiPart:gc.alloc.rate.norm |   | 1500 | 2016.002 | 2848.002 | 29.21%
AESGCMBench.decryptMultiPart:gc.alloc.rate.norm |   | 4096 | 3272.005 | 5288.005 | 38.12%
AESGCMBench.decryptMultiPart:gc.alloc.rate.norm |   | 16384 | 9304.014 | 17464.015 | 46.72%

</body>

</html>

-------------

PR Comment: https://git.openjdk.org/jdk/pull/16487#issuecomment-1823710452



More information about the security-dev mailing list