Skip to content

Instantly share code, notes, and snippets.

@ruslandoga
Created June 29, 2024 15:57
Show Gist options
  • Select an option

  • Save ruslandoga/54693d4e37f21e40efaec29abb7f34e3 to your computer and use it in GitHub Desktop.

Select an option

Save ruslandoga/54693d4e37f21e40efaec29abb7f34e3 to your computer and use it in GitHub Desktop.
$ openssl speed rsa2048 rsa3072 rsa4096 ecdsap256 ecdsap384
Doing 2048 bits private rsa sign ops for 10s: 10842 2048 bits private RSA sign ops in 9.98s
Doing 2048 bits public rsa verify ops for 10s: 433164 2048 bits public RSA verify ops in 9.97s
Doing 2048 bits private rsa encrypt ops for 10s: 418370 2048 bits public RSA encrypt ops in 9.98s
Doing 2048 bits private rsa decrypt ops for 10s: 10720 2048 bits private RSA decrypt ops in 9.96s
Doing 3072 bits private rsa sign ops for 10s: 3742 3072 bits private RSA sign ops in 9.98s
Doing 3072 bits public rsa verify ops for 10s: 202568 3072 bits public RSA verify ops in 9.97s
Doing 3072 bits private rsa encrypt ops for 10s: 195322 3072 bits public RSA encrypt ops in 9.90s
Doing 3072 bits private rsa decrypt ops for 10s: 3707 3072 bits private RSA decrypt ops in 9.93s
Doing 4096 bits private rsa sign ops for 10s: 1696 4096 bits private RSA sign ops in 9.94s
Doing 4096 bits public rsa verify ops for 10s: 117148 4096 bits public RSA verify ops in 9.95s
Doing 4096 bits private rsa encrypt ops for 10s: 115077 4096 bits public RSA encrypt ops in 9.96s
Doing 4096 bits private rsa decrypt ops for 10s: 1660 4096 bits private RSA decrypt ops in 9.80s
Doing 256 bits sign ecdsa ops for 10s: 351686 256 bits ECDSA sign ops in 9.85s
Doing 256 bits verify ecdsa ops for 10s: 117923 256 bits ECDSA verify ops in 9.97s
Doing 384 bits sign ecdsa ops for 10s: 42965 384 bits ECDSA sign ops in 9.84s
Doing 384 bits verify ecdsa ops for 10s: 20176 384 bits ECDSA verify ops in 9.84s
Doing rsa2048 keygen ops for 10s: 156 rsa2048 KEM keygen ops in 9.99s
Doing rsa2048 encaps ops for 10s: 363224 rsa2048 KEM encaps ops in 9.66s
Doing rsa2048 decaps ops for 10s: 10573 rsa2048 KEM decaps ops in 9.82s
Doing rsa3072 keygen ops for 10s: 41 rsa3072 KEM keygen ops in 9.98s
Doing rsa3072 encaps ops for 10s: 187035 rsa3072 KEM encaps ops in 9.86s
Doing rsa3072 decaps ops for 10s: 3636 rsa3072 KEM decaps ops in 9.79s
Doing rsa4096 keygen ops for 10s: 13 rsa4096 KEM keygen ops in 9.99s
Doing rsa4096 encaps ops for 10s: 112268 rsa4096 KEM encaps ops in 9.94s
Doing rsa4096 decaps ops for 10s: 1701 rsa4096 KEM decaps ops in 9.97s
Doing rsa2048 keygen ops for 10s: 149 rsa2048 signature keygen ops in 9.97s
Doing rsa2048 signs ops for 10s: 10781 rsa2048 signature sign ops in 9.93s
Doing rsa2048 verify ops for 10s: 432363 rsa2048 signature verify ops in 9.95s
Doing rsa3072 keygen ops for 10s: 46 rsa3072 signature keygen ops in 10.06s
Doing rsa3072 signs ops for 10s: 3728 rsa3072 signature sign ops in 9.95s
Doing rsa3072 verify ops for 10s: 202118 rsa3072 signature verify ops in 9.96s
Doing rsa4096 keygen ops for 10s: 18 rsa4096 signature keygen ops in 11.06s
Doing rsa4096 signs ops for 10s: 1675 rsa4096 signature sign ops in 9.85s
Doing rsa4096 verify ops for 10s: 117467 rsa4096 signature verify ops in 9.97s
version: 3.3.1
built on: Tue Jun  4 12:53:04 2024 UTC
options: bn(64,64)
compiler: clang -fPIC -arch arm64 -O3 -Wall -DL_ENDIAN -DOPENSSL_PIC -D_REENTRANT -DOPENSSL_BUILDING_OPENSSL -DNDEBUG
CPUINFO: OPENSSL_armcap=0x987d
                   sign    verify    encrypt   decrypt   sign/s verify/s  encr./s  decr./s
rsa  2048 bits 0.000920s 0.000023s 0.000024s 0.000929s   1086.4  43446.7  41920.8   1076.3
rsa  3072 bits 0.002667s 0.000049s 0.000051s 0.002679s    374.9  20317.8  19729.5    373.3
rsa  4096 bits 0.005861s 0.000085s 0.000087s 0.005904s    170.6  11773.7  11553.9    169.4
                              sign    verify    sign/s verify/s
 256 bits ecdsa (nistp256)   0.0000s   0.0001s  35704.2  11827.8
 384 bits ecdsa (nistp384)   0.0002s   0.0005s   4366.4   2050.4
                               keygen    encaps    decaps keygens/s  encaps/s  decaps/s
                    rsa2048 0.064038s 0.000027s 0.000929s      15.6   37600.8    1076.7
                    rsa3072 0.243415s 0.000053s 0.002693s       4.1   18969.1     371.4
                    rsa4096 0.768462s 0.000089s 0.005861s       1.3   11294.6     170.6
                               keygen     signs    verify keygens/s    sign/s  verify/s
                    rsa2048 0.066913s 0.000921s 0.000023s      14.9    1085.7   43453.6
                    rsa3072 0.218696s 0.002669s 0.000049s       4.6     374.7   20293.0
                    rsa4096 0.614444s 0.005881s 0.000085s       1.6     170.1   11782.0

need to repeat it with erlang crypto

@ruslandoga
Copy link
Author

ruslandoga commented Jun 30, 2024

iex> Mix.install([:benchee])

iex> defmodule Bench do
  def run do
    rsa2048 = :public_key.generate_key({:rsa, 2048, 65537})
    rsa3072 = :public_key.generate_key({:rsa, 3072, 65537})
    rsa4096 = :public_key.generate_key({:rsa, 4096, 65537})
    signed_rsa2048 = :public_key.sign("data", :sha256, rsa2048)
    signed_rsa3072 = :public_key.sign("data", :sha256, rsa3072)
    signed_rsa4096 = :public_key.sign("data", :sha256, rsa4096)

    Benchee.run(
      %{"rsa sign" => fn key -> :public_key.sign("data", :sha256, key) end},
      inputs: %{"2048" => rsa2048, "3072" => rsa3072, "4096" => rsa4096}
    )

    Benchee.run(
      %{
        "rsa verify" => fn {data, key} -> :public_key.verify("data", :sha256, data, key) end
      },
      inputs: %{
        "2048" => {signed_rsa2048, rsa2048},
        "3072" => {signed_rsa3072, rsa3072},
        "4096" => {signed_rsa4096, rsa4096}
      }
    )

    secp256r1 = :public_key.generate_key({:namedCurve, :secp256r1})
    secp384r1 = :public_key.generate_key({:namedCurve, :secp384r1})
    signed_secp256r1 = :public_key.sign("data", :sha256, secp256r1)
    signed_secp384r1 = :public_key.sign("data", :sha384, secp384r1)

    Benchee.run(
      %{"ecdsa sign" => fn {sha, key} -> :public_key.sign("data", sha, key) end},
      inputs: %{"secp256r1" => {:sha256, secp256r1}, "secp384r1" => {:sha384, secp384r1}}
    )

    Benchee.run(
      %{"ecdsa verify" => fn {sha, data, key} -> :public_key.verify("data", sha, data, key) end},
      inputs: %{
        "secp256r1" => {:sha256, signed_secp256r1, secp256r1},
        "secp384r1" => {:sha384, signed_secp384r1, secp384r1}
      }
    )

    :ok
  end
end

iex> Bench.run()

@ruslandoga
Copy link
Author

ruslandoga commented Jun 30, 2024

Operating System: macOS
CPU Information: Apple M2
Number of Available Cores: 8
Available memory: 8 GB
Elixir 1.17.1
Erlang 27.0
JIT enabled: true

##### With input 2048 #####
Name               ips        average  deviation         median         99th %
rsa sign        703.67        1.42 ms     ±1.04%        1.42 ms        1.48 ms

##### With input 3072 #####
Name               ips        average  deviation         median         99th %
rsa sign        275.38        3.63 ms     ±0.63%        3.63 ms        3.71 ms

##### With input 4096 #####
Name               ips        average  deviation         median         99th %
rsa sign        134.26        7.45 ms     ±0.42%        7.44 ms        7.55 ms

##### With input 2048 #####
Name                 ips        average  deviation         median         99th %
rsa verify       17.50 K       57.15 μs     ±6.02%       56.04 μs       70.08 μs

##### With input 3072 #####
Name                 ips        average  deviation         median         99th %
rsa verify        9.84 K      101.63 μs    ±20.89%         100 μs      123.60 μs

##### With input 4096 #####
Name                 ips        average  deviation         median         99th %
rsa verify        6.26 K      159.64 μs     ±3.64%      158.71 μs      188.64 μs

##### With input secp256r1 #####
Name                 ips        average  deviation         median         99th %
ecdsa sign       19.89 K       50.29 μs     ±4.88%       50.12 μs       58.03 μs

##### With input secp384r1 #####
Name                 ips        average  deviation         median         99th %
ecdsa sign        4.03 K      248.00 μs     ±1.94%      246.83 μs      269.29 μs

##### With input secp256r1 #####
Name                   ips        average  deviation         median         99th %
ecdsa verify        9.23 K      108.30 μs     ±3.07%      107.87 μs      122.86 μs

##### With input secp384r1 #####
Name                   ips        average  deviation         median         99th %
ecdsa verify        1.97 K      507.86 μs     ±1.21%      506.12 μs      540.26 μs

@ruslandoga
Copy link
Author

ruslandoga commented Jun 30, 2024

Or as a table

Algorithm Sign Verify
rsa2048 703.67 op/s 17.50 K op/s
rsa3072 275.38 op/s 9.84 K op/s
rsa4096 134.26 op/s 6.26 K op/s
secp256r1 19.89 K op/s 9.23 K op/s
secp384r1 4.03 K op/s 1.97 K op/s

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment