Graviola Benchmarking Results

At the moment benchmarking is non-automated, and is run on two of my laptops. See below.

Headlines

These categories are chosen because they are typically used for TLS traffic on the web.

aarch64

Signing

RSA2048 signing

🥇 aws-lc-rs

2,220.8 sigs/sec

🥈 ring

2,043.2 sigs/sec

🥉 graviola

1,262.8 sigs/sec

golang

1,102.7 sigs/sec

rustcrypto

577.65 sigs/sec
ECDSA-P256 signing

🥇 graviola

88,482 sigs/sec

🥈 ring

66,245 sigs/sec

🥉 aws-lc-rs

65,272 sigs/sec

golang

47,587 sigs/sec

rustcrypto

10,215 sigs/sec
ECDSA-P384 signing

🥇 aws-lc-rs

15,899 sigs/sec

🥈 graviola

9,004.7 sigs/sec

🥉 golang

6,827.9 sigs/sec

rustcrypto

3,714 sigs/sec

ring

3,451.4 sigs/sec

Signature verification

RSA2048 signature verification

🥇 aws-lc-rs

69,692 sigs/sec

🥈 ring

60,963 sigs/sec

🥉 graviola

47,270 sigs/sec

golang

35,772 sigs/sec

rustcrypto

10,280 sigs/sec
ECDSA-P256 signature verification

🥇 graviola

27,321 sigs/sec

🥈 aws-lc-rs

25,663 sigs/sec

🥉 ring

23,857 sigs/sec

golang

19,094 sigs/sec

rustcrypto

2,526.8 sigs/sec
ECDSA-P384 signature verification

🥇 aws-lc-rs

6,757.8 sigs/sec

🥈 graviola

5,027.1 sigs/sec

🥉 golang

2,298 sigs/sec

ring

1,933.1 sigs/sec

rustcrypto

843.39 sigs/sec

Key exchange

X25519 key agreement

🥇 graviola

43,554 kx/sec

🥈 aws-lc-rs

41,330 kx/sec

🥉 ring

26,564 kx/sec

dalek

24,530 kx/sec

golang

14,478 kx/sec
P256 key agreement

🥇 aws-lc-rs

24,742 kx/sec

🥈 graviola

24,010 kx/sec

🥉 ring

21,679 kx/sec

golang

19,885 kx/sec

rustcrypto

2,204.1 kx/sec
P384 key agreement

🥇 aws-lc-rs

7,033.7 kx/sec

🥈 graviola

4,727.3 kx/sec

🥉 golang

2,451.2 kx/sec

ring

1,867.7 kx/sec

rustcrypto

743.87 kx/sec
ML-KEM-768

🥇 graviola

49,328 KEM/sec

🥈 aws-lc-rs

35,843 KEM/sec

🥉 libcrux-ml-kem

21,886 KEM/sec

rustcrypto

15,609 KEM/sec

golang

9,500.8 KEM/sec

Bulk encryption

AES256-GCM encryption (8KB wide)

🥇 aws-lc-rs

6.56 GiB/sec

🥈 golang

5.75 GiB/sec

🥉 ring

5.5 GiB/sec

graviola

5.33 GiB/sec

rustcrypto

3.53 GiB/sec

Versions tested

  • aws-lc-rs version: aws-lc-rs 1.18.2, aws-lc-sys 0.46.0
  • dalek version: curve25519-dalek 5.0.0, x25519-dalek 3.0.0
  • golang version: go version go1.26.4 darwin/arm64
  • graviola version: 0.4.4
  • libcrux-ml-kem version: libcrux-ml-kem 0.0.11
  • ring version: ring 0.17.14
  • rustcrypto version: aes-gcm 0.11.1, p256 0.14.0, p384 0.14.0, rsa 0.10.0-rc.19, sha2 0.11.1
  • x86_64

    Signing

    RSA2048 signing ⓘ

    🥇 aws-lc-rs

    5,523.3 sigs/sec

    🥈 graviola

    2,519.2 sigs/sec

    🥉 ring

    2,426.6 sigs/sec

    golang

    1,297.7 sigs/sec

    rustcrypto

    497.21 sigs/sec
    ECDSA-P256 signing

    🥇 graviola

    92,734 sigs/sec

    🥈 aws-lc-rs

    88,499 sigs/sec

    🥉 ring

    81,322 sigs/sec

    golang

    44,277 sigs/sec

    rustcrypto

    9,340.6 sigs/sec
    ECDSA-P384 signing

    🥇 aws-lc-rs

    16,648 sigs/sec

    🥈 graviola

    9,438.4 sigs/sec

    🥉 golang

    6,322.1 sigs/sec

    rustcrypto

    3,657.7 sigs/sec

    ring

    3,423.2 sigs/sec

    Signature verification

    RSA2048 signature verification

    🥇 graviola

    84,685 sigs/sec

    🥈 aws-lc-rs

    77,108 sigs/sec

    🥉 ring

    66,367 sigs/sec

    golang

    43,890 sigs/sec

    rustcrypto

    9,935.7 sigs/sec
    ECDSA-P256 signature verification

    🥇 aws-lc-rs

    27,247 sigs/sec

    🥈 graviola

    26,530 sigs/sec

    🥉 ring

    26,272 sigs/sec

    golang

    19,455 sigs/sec

    rustcrypto

    2,454.6 sigs/sec
    ECDSA-P384 signature verification

    🥇 aws-lc-rs

    7,040.8 sigs/sec

    🥈 graviola

    5,172.2 sigs/sec

    🥉 golang

    2,215.9 sigs/sec

    ring

    1,903.6 sigs/sec

    rustcrypto

    921.15 sigs/sec

    Key exchange

    X25519 key agreement

    🥇 graviola

    43,084 kx/sec

    🥈 aws-lc-rs

    42,906 kx/sec

    🥉 ring

    22,866 kx/sec

    dalek

    19,580 kx/sec

    golang

    14,522 kx/sec
    P256 key agreement

    🥇 aws-lc-rs

    25,746 kx/sec

    🥈 graviola

    24,469 kx/sec

    🥉 ring

    24,444 kx/sec

    golang

    20,417 kx/sec

    rustcrypto

    2,096.6 kx/sec
    P384 key agreement

    🥇 aws-lc-rs

    7,440.2 kx/sec

    🥈 graviola

    4,974.1 kx/sec

    🥉 golang

    2,432.9 kx/sec

    ring

    1,845.1 kx/sec

    rustcrypto

    788.77 kx/sec
    ML-KEM-768 ⓘ

    🥇 graviola

    59,081 KEM/sec

    🥈 aws-lc-rs

    31,845 KEM/sec

    🥉 libcrux-ml-kem

    21,711 KEM/sec

    rustcrypto

    12,676 KEM/sec

    golang

    7,614.1 KEM/sec

    Bulk encryption

    AES256-GCM encryption (8KB wide) ⓘ

    🥇 aws-lc-rs

    10.3 GiB/sec
    ⓘ

    🥈 ring

    9.51 GiB/sec
    ⓘ

    🥉 graviola

    9.23 GiB/sec

    golang

    6.12 GiB/sec

    rustcrypto

    2.98 GiB/sec

    Versions tested

  • aws-lc-rs version: aws-lc-rs 1.18.2, aws-lc-sys 0.46.0
  • dalek version: curve25519-dalek 5.0.0, x25519-dalek 3.0.0
  • golang version: go version go1.26.4 linux/amd64
  • graviola version: 0.4.4
  • libcrux-ml-kem version: libcrux-ml-kem 0.0.11
  • ring version: ring 0.17.14
  • rustcrypto version: aes-gcm 0.11.1, p256 0.14.0, p384 0.14.0, rsa 0.10.0-rc.19, sha2 0.11.1
  • Full reports