> Hi,
> 
> May I have this update reviewed?
> 
> The EC point multiplication for secp256r1 could be improved for better 
> performance, by using more efficient algorithm and pre-computation.  
> Improvement for other curves are similar, but will be addressed in separated 
> PRs.
> 
> The basic idea is using pre-computed tables and safe table select in order to 
> speed up the point multiplication and keep is safe.  Before this patch 
> applied, a secp256r1 point multiplication operation needs 256 double 
> operations and 78 addition operations.  With this patch, it is reduced to 16 
> double operations and 64 addition operations.  **If assuming the performance 
> for double and addition operations is about the same (double operation is a 
> little bit faster actually), the new point multiplication implementation 
> performance is about 4 times ((256+78)/(16+64)) of the current 
> implementation.**
> 
> ## SSLHandshake.java benchmark
> ### Use secp256r1 as the named group
> The following are TLS benchmarking 
> (test/micro/org/openjdk/bench/java/security/SSLHandshake.java) results by 
> using secp256r1 (Set the System property, "jdk.tls.namedGroups" to 
> "secp256r1") as the key exchange algorithm in TLS connections:
> 
> Benchmark with this patch:
> 
> Benchmark                 (resume)  (tlsVersion)   Mode  Cnt     Score    
> Error  Units
> SSLHandshake.doHandshake      true       TLSv1.2  thrpt   15  7976.334 ± 
> 96.877  ops/s
> SSLHandshake.doHandshake      true           TLS  thrpt   15   315.783 ±  
> 1.208  ops/s
> SSLHandshake.doHandshake     false       TLSv1.2  thrpt   15   235.646 ±  
> 1.356  ops/s
> SSLHandshake.doHandshake     false           TLS  thrpt   15   230.759 ±  
> 1.789  ops/s
> 
> 
> Benchmark before this patch applied:
> 
> Benchmark                 (resume)  (tlsVersion)   Mode  Cnt     Score    
> Error  Units
> SSLHandshake.doHandshake      true       TLSv1.2  thrpt   15  7830.289 ± 
> 58.584  ops/s
> SSLHandshake.doHandshake      true           TLS  thrpt   15   253.827 ±  
> 0.690  ops/s
> SSLHandshake.doHandshake     false       TLSv1.2  thrpt   15   171.944 ±  
> 0.667  ops/s
> SSLHandshake.doHandshake     false           TLS  thrpt   15   169.383 ±  
> 0.593  ops/s
> 
> 
> Per the result, the session resumption performance for TLS 1.2 is about the 
> same.  It is the expected result as there is no EC point multiplication 
> involved for TLS 1.2 session resumption.  TLS 1.3 is different as EC key 
> generation is involved in either initial handshake and session resumption.
> 
> **When EC key generation get involved (TLS 1.3 connections and TLS 1.2 
> initial handshake), the performance improvement is about 35% for named group 
> secp256r1 based TLS connections..**
> 
> ### Use default TLS named groups
> The following are TLS benchmarking 
> (test/micro/org/openjdk/bench/java/security/SSLHandshake.java) results by 
> using key exchange algorithms in TLS connections.  In the current JDK 
> implementation, the EC keys are generated for both secp256r1 and x25519 
> curves, and x25519 is the preferred curves. 
> 
> Benchmark with this patch:
> 
> Benchmark                 (resume)  (tlsVersion)   Mode  Cnt     Score    
> Error  Units
> SSLHandshake.doHandshake      true       TLSv1.2  thrpt   15  7620.615 ± 
> 62.459  ops/s
> SSLHandshake.doHandshake      true           TLS  thrpt   15   746.924 ±  
> 6.549  ops/s
> SSLHandshake.doHandshake     false       TLSv1.2  thrpt   15   456.066 ±  
> 1.440  ops/s
> SSLHandshake.doHandshake     false           TLS  thrpt   15   396.189 ±  
> 2.275  ops/s
> 
> 
> Benchmark before this patch applied:
> 
> Benchmark                 (resume)  (tlsVersion)   Mode  Cnt     Score    
> Error  Units
> SSLHandshake.doHandshake      true       TLSv1.2  thrpt   15  7605.177 ± 
> 55.961  ops/s
> SSLHandshake.doHandshake      true           TLS  thrpt   15   544.333 ± 
> 23.431  ops/s
> SSLHandshake.doHandshake     false       TLSv1.2  thrpt   15   335.259 ±  
> 1.926  ops/s
> SSLHandshake.doHandshake     false           TLS  thrpt   15   269.422 ±  
> 1.531  ops/s
> 
> 
> Per the result, the session resumption performance for TLS 1.2 is about the 
> same. It is the expected result as there is no EC point multiplication 
> involved for TLS 1.2 session resumption. TLS 1.3 is different as EC key 
> generation is involved in either initial handshake and session resumption.
> 
> **When EC key generation get involved (TLS 1.3 connections and TLS 1.2 
> initial handshake), the performance improvement is about  36%~47% for default 
> configuration based TLS connections.**
> 
> ## KeyPairGenerators.java benchmark
> The following are EC key pair generation benchmark 
> (test/micro/org/openjdk/bench/java/security/KeyPairGenerators.java) results.
> 
> Benchmark with this patch:
> 
> Benchmark                     (curveName)   Mode  Cnt     Score    Error  
> Units
> KeyPairGenerators.keyPairGen    secp256r1  thrpt   15  4638.623 ± 93.320  
> ops/s
> KeyPairGenerators.keyPairGen    secp384r1  thrpt   15   710.643 ±  6.404  
> ops/s
> KeyPairGenerators.keyPairGen    secp521r1  thrpt   15   371.417 ±  1.302  
> ops/s
> KeyPairGenerators.keyPairGen      Ed25519  thrpt   15  2355.491 ± 69.584  
> ops/s
> KeyPairGenerators.keyPairGen        Ed448  thrpt   15   682.144 ±  6.671  
> ops/s
> 
> 
> Benchmark before this patch applied:
> 
> Benchmark                     (curveName)   Mode  Cnt     Score    Error  
> Units
> KeyPairGenerators.keyPairGen    secp256r1  thrpt   15  1642.312 ± 52.155  
> ops/s
> KeyPairGenerators.keyPairGen    secp384r1  thrpt   15   687.669 ± 30.576  
> ops/s
> KeyPairGenerators.keyPairGen    secp521r1  thrpt   15   371.854 ±  1.736  
> ops/s
> KeyPairGenerators.keyPairGen      Ed25519  thrpt   15  2448.139 ±  7.788  
> ops/s
> KeyPairGenerators.keyPairGen        Ed448  thrpt   15   685.195 ±  4.994  
> ops/s
> 
> 
> **Per the result, the performance improvement is about 180% for key pair 
> generation performance for secp256r1.**  Other curves should not be impacted 
> as the point multiplication implementation for them is not updated yet.
> 
> ## Signatures.java benchmark
> The following are EC key pair generation benchmark 
> (test/micro/org/openjdk/bench/java/security/Signatures.java) results.
> 
> Benchmark with this patch:
> 
> Benchmark        (curveName)  (messageLength)   Mode  Cnt     Score    Error  
> Units
> Signatures.sign    secp256r1               64  thrpt   15  3646.764 ± 28.633  
> ops/s
> Signatures.sign    secp256r1              512  thrpt   15  3595.674 ± 69.761  
> ops/s
> Signatures.sign    secp256r1             2048  thrpt   15  3633.184 ± 22.236  
> ops/s
> Signatures.sign    secp256r1            16384  thrpt   15  3481.104 ± 21.043  
> ops/s
> Signatures.sign    secp384r1               64  thrpt   15   631.036 ±  6.154  
> ops/s
> Signatures.sign    secp384r1              512  thrpt   15   633.485 ± 18.700  
> ops/s
> Signatures.sign    secp384r1             2048  thrpt   15   615.955 ±  4.598  
> ops/s
> Signatures.sign    secp384r1            16384  thrpt   15   627.193 ±  6.551  
> ops/s
> Signatures.sign    secp521r1               64  thrpt   15   303.849 ± 19.569  
> ops/s
> Signatures.sign    secp521r1              512  thrpt   15   308.676 ±  7.002  
> ops/s
> Signatures.sign    secp521r1             2048  thrpt   15   317.306 ±  0.327  
> ops/s
> Signatures.sign    secp521r1            16384  thrpt   15   312.579 ±  1.753  
> ops/s
> Signatures.sign      Ed25519               64  thrpt   15  1192.428 ± 10.424  
> ops/s
> Signatures.sign      Ed25519              512  thrpt   15  1185.397 ±  1.993  
> ops/s
> Signatures.sign      Ed25519             2048  thrpt   15  1181.980 ±  2.963  
> ops/s
> Signatures.sign      Ed25519            16384  thrpt   15  1105.737 ±  4.339  
> ops/s
> Signatures.sign        Ed448               64  thrpt   15   332.501 ±  1.471  
> ops/s
> Signatures.sign        Ed448              512  thrpt   15   324.770 ±  9.631  
> ops/s
> Signatures.sign        Ed448             2048  thrpt   15   325.833 ±  1.602  
> ops/s
> Signatures.sign        Ed448            16384  thrpt   15   313.231 ±  1.440  
> ops/s
> 
> 
> 
> Benchmark before this patch applied:
> 
> Benchmark        (curveName)  (messageLength)   Mode  Cnt     Score    Error  
> Units
> Signatures.sign    secp256r1               64  thrpt   15  1515.924 ±  8.489  
> ops/s
> Signatures.sign    secp256r1              512  thrpt   15  1521.586 ±  7.726  
> ops/s
> Signatures.sign    secp256r1             2048  thrpt   15  1499.704 ±  9.704  
> ops/s
> Signatures.sign    secp256r1            16384  thrpt   15  1499.392 ±  8.832  
> ops/s
> Signatures.sign    secp384r1               64  thrpt   15   634.406 ±  8.328  
> ops/s
> Signatures.sign    secp384r1              512  thrpt   15   633.766 ± 11.965  
> ops/s
> Signatures.sign    secp384r1             2048  thrpt   15   634.608 ±  5.526  
> ops/s
> Signatures.sign    secp384r1            16384  thrpt   15   628.815 ±  3.756  
> ops/s
> Signatures.sign    secp521r1               64  thrpt   15   313.390 ±  9.728  
> ops/s
> Signatures.sign    secp521r1              512  thrpt   15   316.420 ±  2.817  
> ops/s
> Signatures.sign    secp521r1             2048  thrpt   15   307.386 ±  3.966  
> ops/s
> Signatures.sign    secp521r1            16384  thrpt   15   315.384 ±  2.243  
> ops/s
> Signatures.sign      Ed25519               64  thrpt   15  1187.227 ±  5.758  
> ops/s
> Signatures.sign      Ed25519              512  thrpt   15  1189.044 ±  5.370  
> ops/s
> Signatures.sign      Ed25519             2048  thrpt   15  1182.833 ± 13.186  
> ops/s
> Signatures.sign      Ed25519            16384  thrpt   15  1099.599 ±  3.932  
> ops/s
> Signatures.sign        Ed448               64  thrpt   15   331.810 ±  3.786  
> ops/s
> Signatures.sign        Ed448              512  thrpt   15   332.885 ±  4.926  
> ops/s
> Signatures.sign        Ed448             2048  thrpt   15   332.941 ±  4.292  
> ops/s
> Signatures.sign        Ed448            16384  thrpt   15   318.226 ±  4.141  
> ops/s
> 
> 
> **Per the result, the performance improvement is about 140% for signature 
> performance for secp256r1.**  Other curves should not be impacted as the 
> point multiplication implementation for them is not updated yet.

Xue-Lei Andrew Fan has updated the pull request incrementally with one 
additional commit since the last revision:

  remove duplicated bench cases

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

Changes:
  - all: https://git.openjdk.org/jdk/pull/10893/files
  - new: https://git.openjdk.org/jdk/pull/10893/files/2999562e..618aeda3

Webrevs:
 - full: https://webrevs.openjdk.org/?repo=jdk&pr=10893&range=05
 - incr: https://webrevs.openjdk.org/?repo=jdk&pr=10893&range=04-05

  Stats: 167 lines in 2 files changed: 0 ins; 167 del; 0 mod
  Patch: https://git.openjdk.org/jdk/pull/10893.diff
  Fetch: git fetch https://git.openjdk.org/jdk pull/10893/head:pull/10893

PR: https://git.openjdk.org/jdk/pull/10893

Reply via email to